Gå til indhold

Neuron Streamingtrin

Dette eksempel viser en tydelig opdeling. Neuron streamer agentsvaret stykke for stykke, mens Queuety gemmer hvert stykke holdbart gennem StreamingStep. Det betyder, at UI kan modtage et liveudkast, mens workflowet stadig overlever nedbrud eller nye forsøg på workerprocessen.

Hvornår dette mønster er nyttigt

Brug det, når et udkast eller svar er så langt, at du vil streame det live, når du ikke vil miste delvist output, hvis workerprocessen stopper, og når det endelige resultat stadig skal gemmes i workflowtilstanden, når streamen er færdig.

Neuron-agenten

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-streamingtrinnet

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

Brug det i et workflow

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',
    ]);

Hvorfor bruge Queuety i stedet for kun Neuron-streamadaptere

Neurons streamadaptere er nyttige til frontendprotokoller og transport. Queuety tilføjer noget andet: Hvert udsendt stykke gemmes, nye forsøg kan fortsætte med de tidligere gemte stykker, det færdige udkast flettes tilbage i workflowtilstanden, og streamen bliver ét holdbart trin i en større orkestrering.

Det gør mønstret velegnet, når streamen indgår i en proces med flere trin, ikke kun en UI med anmodning og svar.

Én vigtig begrænsning

Hvis din Neuron-agent bruger værktøjer under streaming, skal du håndtere de streamede stykketyper eksplicit. Den aktuelle streamingdokumentation for Neuron beskriver TextChunk, ReasoningChunk, ToolCallChunk og ToolResultChunk. For et baggrundsworkflow til udarbejdelse af udkast er den enkleste løsning som regel at lade streamingagenten kun håndtere tekst.