Neuron Streamovací krok
Tento příklad ukazuje přehledné rozdělení. Neuron streamuje odpověď agenta po částech, zatímco Queuety každou část trvale ukládá prostřednictvím StreamingStep. UI tak může dostávat průběžný návrh, zatímco workflow přežije pády workerů nebo opakování pokusů.
Kdy se tento vzor hodí
Použijte ho, když je návrh nebo odpověď dostatečně dlouhá na živé streamování, když nechcete přijít o částečný výstup při ukončení workera a když se má dokončený výstup po skončení streamu uložit do stavu workflow.
Agent 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.',
],
);
}
}
Streamovací krok 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,
];
}
}
Použití ve workflow
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',
]);
Proč použít Queuety místo samotných streamovacích adaptérů Neuron
Streamovací adaptéry Neuron se hodí pro frontendové protokoly a přenosy. Queuety přidává něco jiného: každá předaná část se uloží, při opakování lze navázat na dříve uložené části, dokončený návrh se sloučí zpět do stavu workflow a stream se stane jedním trvalým krokem v rámci větší orchestrace.
Tento vzor se proto hodí, když je stream součástí vícekrokového obchodního procesu, a ne pouze požadavku a odpovědi UI.
Jedno upozornění
Pokud váš agent Neuron při streamování používá nástroje, zpracujte typy streamovaných částí explicitně. Aktuální dokumentace streamování Neuron popisuje TextChunk, ReasoningChunk, ToolCallChunk a ToolResultChunk. Pro pracovní postup tvorby návrhů na pozadí je obvykle nejjednodušší, když agent streamuje pouze text.