Neuron Поточна стъпка
Този пример показва ясно разделение. Neuron предава отговора на агента на части, докато Queuety запазва трайно всяка част чрез StreamingStep. Така UI може да получава проект в реално време, докато работният процес продължава да оцелява при сривове или повторни опити на работника.
Кога този модел е полезен
Използвайте го, когато даден проект или отговор е достатъчно дълъг, за да искате да го предавате на живо, когато не искате да губите частичния изход при спиране на работника и когато крайният артефакт трябва да остане в състоянието на работния процес след приключване на потока.
Агентът 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.',
],
);
}
}
Поточната стъпка 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,
];
}
}
Използване в работен процес
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',
]);
Защо да използвате Queuety вместо само адаптери за поток на Neuron
Адаптерите за поток на Neuron са полезни за протоколи и транспорт на интерфейса. Queuety добавя нещо друго: всяка предадена част се запазва, повторните опити могат да продължат с вече запазените части, завършеният проект се обединява обратно в състоянието на работния процес, а потокът става една устойчива стъпка в по-голямо оркестриране.
Това прави модела подходящ, когато потокът е част от многоетапен бизнес процес, а не просто заявка/отговор UI.
Едно уточнение
Ако агентът Neuron използва инструменти при предаване на поток, обработвайте изрично типовете части от потока. Актуалната документация за потока на Neuron описва TextChunk, ReasoningChunk, ToolCallChunk и ToolResultChunk. За фонов работен процес за създаване на проект най-лесният подход обикновено е агентът да предава само текст.