Neuron Pas de transmitere în flux
Acest exemplu arată o împărțire clară. Neuron transmite răspunsul agentului în fragmente, în timp ce Queuety persistă durabil fiecare fragment prin StreamingStep. Astfel, UI poate primi o versiune în lucru în timp real, iar fluxul de lucru continuă să reziste la blocări ale proceselor de lucru sau la reîncercări.
Când este util acest model
Folosiți-l când o versiune sau un răspuns este suficient de lung încât să doriți să-l transmiteți în timp real, când nu doriți să pierdeți rezultatul parțial dacă procesul de lucru se oprește și când artefactul final trebuie să ajungă în continuare în starea fluxului de lucru după încheierea transmiterii în flux.
Agentul 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.',
],
);
}
}
Pasul de transmitere în flux 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,
];
}
}
Folosiți-l într-un flux de lucru
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',
]);
De ce să folosiți Queuety în locul adaptoarelor de flux Neuron singure
Adaptoarele de flux Neuron sunt utile pentru protocoalele și transporturile frontendului. Queuety adaugă altceva: fiecare fragment generat este persistat, reîncercările pot relua execuția folosind fragmentele salvate anterior, versiunea finalizată este îmbinată înapoi în starea fluxului de lucru, iar fluxul devine un pas durabil într-o orchestrare mai amplă.
Acest model se potrivește bine când fluxul face parte dintr-un proces de afaceri cu mai mulți pași, nu doar dintr-o cerere/un răspuns UI.
O atenționare
Dacă agentul Neuron folosește instrumente în timpul transmiterii în flux, gestionați explicit tipurile de fragmente transmise. Documentația actuală despre transmiterea în flux pentru Neuron descrie TextChunk, ReasoningChunk, ToolCallChunk și ToolResultChunk. Pentru un flux de lucru de redactare în fundal, cea mai simplă abordare este de obicei să păstrați agentul de transmitere în flux limitat la text.