Neuron Straumēšanas solis
Šajā piemērā redzams skaidrs pienākumu sadalījums. Neuron straumē aģenta atbildi pa daļām, savukārt Queuety noturīgi saglabā katru daļu, izmantojot StreamingStep. Tādējādi UI var saņemt melnrakstu reāllaikā, kamēr darbplūsma joprojām spēj atjaunoties pēc izpildītāja avārijas vai atkārtotiem mēģinājumiem.
Kad šī pieeja noder
Izmantojiet to, ja melnraksts vai atbilde ir pietiekami gara, lai to straumētu reāllaikā, ja nevēlaties zaudēt daļēju izvadi izpildītāja kļūmes gadījumā un ja pēc straumēšanas pabeigšanas galīgais artefakts jāsaglabā darbplūsmas stāvoklī.
Neuron aģents
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 straumēšanas darbība
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,
];
}
}
Izmantojiet darbplūsmā
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',
]);
Kāpēc izmantot Queuety, nevis tikai Neuron straumes adapterus
Neuron straumes adapteri noder frontend protokoliem un transporta slāņiem. Queuety pievieno citas iespējas: katra nodotā daļa tiek saglabāta, pēc atkārtota mēģinājuma var turpināt ar iepriekš saglabātajām daļām, pabeigtais melnraksts tiek apvienots ar darbplūsmas stāvokli, un straume kļūst par vienu noturīgu darbību plašākā orķestrēšanas procesā.
Tāpēc šī pieeja ir piemērota gadījumos, kad straume ir daļa no vairāku darbību biznesa procesa, nevis tikai pieprasījuma un atbildes UI.
Viens ierobežojums
Ja jūsu Neuron aģents straumēšanas laikā izmanto rīkus, skaidri apstrādājiet straumēto daļu tipus. Pašreizējā Neuron straumēšanas dokumentācijā aprakstīti TextChunk, ReasoningChunk, ToolCallChunk un ToolResultChunk. Fona melnraksta veidošanas darbplūsmā parasti vienkāršāk ir izmantot aģentu, kas straumē tikai tekstu.