Neuron Srautinio perdavimo žingsnis
Šiame pavyzdyje aiškiai atskirtos dvi funkcijos. Neuron perduoda agento atsakymą dalimis, o Queuety patvariai išsaugo kiekvieną dalį per StreamingStep. Taip UI gali gauti juodraštį realiuoju laiku, o darbo eiga išlieka net sugedus darbuotojui ar pakartojus bandymą.
Kada šis modelis naudingas
Naudokite jį, kai juodraštis ar atsakymas pakankamai ilgas, kad norėtumėte jį perduoti realiuoju laiku, kai nenorite prarasti dalinio rezultato sugedus darbuotojui ir kai galutinis rezultatas, srautui pasibaigus, vis tiek turi būti įrašytas į darbo eigos būseną.
Agentas Neuron
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.',
],
);
}
}
Srautinio perdavimo žingsnis Queuety
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,
];
}
}
Naudojimas darbo eigoje
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',
]);
Kodėl verta rinktis Queuety, o ne vien Neuron srauto adapterius
Neuron srauto adapteriai naudingi frontend protokolams ir transportams. Queuety suteikia ką kita: kiekviena perduota dalis išsaugoma, pakartojus bandymą galima tęsti nuo anksčiau išsaugotų dalių, užbaigtas juodraštis sujungiamas su darbo eigos būsena, o srautas tampa vienu patvariu žingsniu didesnėje orkestracijoje.
Todėl šis modelis tinka, kai srautas yra kelių žingsnių verslo proceso dalis, o ne vien užklausos ir atsakymo UI.
Vienas apribojimas
Jei jūsų Neuron agentas srautinio perdavimo metu naudoja įrankius, aiškiai apdorokite perduodamų dalių tipus. Dabartinėje Neuron srautinio perdavimo dokumentacijoje aprašyti TextChunk, ReasoningChunk, ToolCallChunk ir ToolResultChunk. Fono juodraščių rengimo darbo eigai paprastai paprasčiausia naudoti tik tekstą generuojantį srautinio perdavimo agentą.