Към съдържанието

Neuron Поточна стъпка

Този пример показва ясно разделение. Neuron предава отговора на агента на части, докато Queuety запазва трайно всяка част чрез StreamingStep. Така UI може да получава проект в реално време, докато работният процес продължава да оцелява при сривове или повторни опити на работника.

Кога този модел е полезен

Използвайте го, когато даден проект или отговор е достатъчно дълъг, за да искате да го предавате на живо, когато не искате да губите частичния изход при спиране на работника и когато крайният артефакт трябва да остане в състоянието на работния процес след приключване на потока.

Агентът Neuron

PHP
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

PHP
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,
        ];
    }
}

Използване в работен процес

PHP
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. За фонов работен процес за създаване на проект най-лесният подход обикновено е агентът да предава само текст.