Neuron Suoratoistovaihe
Tässä esimerkissä vastuut jaetaan selkeästi. Neuron suoratoistaa agentin vastauksen pala palalta, kun taas Queuety tallentaa jokaisen palan pysyvästi kohteen StreamingStep kautta. Näin UI saa luonnoksen reaaliajassa, vaikka työnkulku kestää työntekijän kaatumiset ja uudelleenyritykset.
Milloin tästä toimintamallista on hyötyä
Käytä tätä, kun luonnos tai vastaus on niin pitkä, että haluat suoratoistaa sen reaaliajassa, kun et halua menettää osittaista tulostetta työntekijän kaatuessa ja kun valmiin artefaktin pitää jäädä työnkulun tilaan suoratoiston päätyttyä.
Neuron-agentti
namespace App\Neuron;
use NeuronAI\Agent\Agent;
use NeuronAI\Providers\AIProviderInterface;
use NeuronAI\Providers\OpenAI\Responses\OpenAIResponses;
use NeuronAI\SystemPrompt;
final class DraftMemoAgent extends Agent
{
protected function provider(): AIProviderInterface
{
return new OpenAIResponses(
key: $_ENV['OPENAI_API_KEY'],
model: $_ENV['OPENAI_MODEL'],
);
}
public function instructions(): string
{
return (string) new SystemPrompt(
background: [
'You write crisp internal strategy memos.',
'Prefer short sections and operationally useful language.',
],
);
}
}
Queuety-suoratoistovaihe
namespace App\Workflow\Steps;
use App\Neuron\DraftMemoAgent;
use NeuronAI\Chat\Messages\UserMessage;
use Queuety\Contracts\StreamingStep;
use Queuety\Heartbeat;
final class StreamMemoDraftStep implements StreamingStep
{
public function stream(array $state, array $existing_chunks = []): \Generator
{
if (! empty($existing_chunks)) {
return;
}
$handler = (new DraftMemoAgent())->stream(
new UserMessage(sprintf(
"Write a strategy memo about %s for account %d.",
$state['topic'],
$state['account_id'],
))
);
foreach ($handler->events() as $i => $chunk) {
Heartbeat::beat(['chunks' => $i + 1]);
// This example assumes the agent has no tools attached, so
// Neuron will stream text/reasoning chunks only.
yield $chunk->content;
}
}
public function on_complete(array $chunks, array $state): array
{
return [
'draft_markdown' => implode('', $chunks),
];
}
public function config(): array
{
return [
'max_attempts' => 3,
];
}
}
Käytä sitä työnkulussa
use Queuety\Queuety;
Queuety::workflow('memo_drafting')
->then(BuildDraftBriefStep::class)
->then(StreamMemoDraftStep::class)
->then(StoreMemoStep::class)
->dispatch([
'account_id' => 10,
'topic' => 'pricing changes for enterprise accounts',
]);
Miksi käyttää kohdetta Queuety pelkkien kohteen Neuron suoratoistosovittimien sijaan
Neuronn suoratoistosovittimet sopivat käyttöliittymän protokolliin ja siirtoihin. Queuety tarjoaa muuta: jokainen tuotettu pala tallennetaan pysyvästi, uudelleenyritystä voidaan jatkaa aiemmin tallennetuista paloista, valmis luonnos yhdistetään takaisin työnkulun tilaan ja suoratoistosta tulee yksi pysyvä vaihe laajemmassa orkestroinnissa.
Tämä toimintamalli sopii hyvin tilanteisiin, joissa suoratoisto on osa monivaiheista liiketoimintaprosessia eikä pelkkä pyyntö/vastaus-UI.
Yksi huomio
Jos Neuron-agenttisi käyttää työkaluja suoratoiston aikana, käsittele suoratoistettavien osien tyypit erikseen. Kohteen Neuron nykyisissä suoratoistodokumenteissa kuvataan tyypit TextChunk, ReasoningChunk, ToolCallChunk ja ToolResultChunk. Taustalla tapahtuvassa luonnostelutyönkulussa yksinkertaisin tapa on yleensä käyttää suoratoistoagenttia, joka tuottaa vain tekstiä.