Neuron Krok streamovania
Tento príklad ukazuje čisté rozdelenie úloh. Neuron streamuje odpoveď agenta po jednotlivých častiach, zatiaľ čo Queuety každú časť trvalo ukladá cez StreamingStep. Vďaka tomu môže UI dostávať priebežný návrh a pracovný postup zároveň odolá pádom workerov alebo opakovaným pokusom.
Kedy sa tento vzor hodí
Použite ho, keď je návrh alebo odpoveď natoľko dlhá, že ju chcete streamovať priebežne, keď nechcete prísť o čiastočný výstup pri páde workera a keď sa má výsledný artefakt po dokončení streamu uložiť aj do stavu pracovného postupu.
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.',
],
);
}
}
Krok streamovania 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žitie v pracovnom postupe
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',
]);
Prečo použiť Queuety namiesto samotných adaptérov streamu Neuron
Adaptéry streamu Neuron sa hodia pre protokoly a prenosy na strane frontendu. Queuety pridáva niečo iné: každá odovzdaná časť sa uloží, pri opakovanom pokuse možno pokračovať s predtým uloženými časťami, dokončený návrh sa zlúči späť do stavu pracovného postupu a stream sa stane jedným odolným krokom v rámci väčšej orchestrácie.
Preto sa tento vzor hodí, keď je stream súčasťou viacstupňového obchodného procesu, a nie iba požiadavky a odpovede UI.
Jedno upozornenie
Ak váš agent Neuron počas streamovania používa nástroje, spracúvajte typy streamovaných častí explicitne. Aktuálna dokumentácia streamovania v Neuron opisuje TextChunk, ReasoningChunk, ToolCallChunk a ToolResultChunk. Pri pracovnom postupe na tvorbu návrhov na pozadí je zvyčajne najjednoduchšie ponechať agenta na streamovanie iba textu.