Preskoči na vsebino

Neuron Korak pretakanja

Ta primer prikazuje jasno razdelitev. Neuron pretaka odgovor agenta po delih, Queuety pa vsak del trajno shrani prek StreamingStep. Tako lahko UI prejme osnutek v živo, medtem ko potek dela preživi sesutja izvajalcev ali ponovne poskuse.

Kdaj je ta vzorec uporaben

Uporabite ga, kadar je osnutek ali odgovor dovolj dolg za pretakanje v živo, kadar ne želite izgubiti delnega izhoda ob sesutju izvajalca in kadar naj se končni artefakt po koncu pretakanja še vedno shrani v stanje poteka dela.

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

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

Uporaba v poteku dela

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

Zakaj uporabiti Queuety namesto samih prilagojevalnikov toka Neuron

Prilagojevalniki toka Neuron so uporabni za protokole in prenose v uporabniškem vmesniku. Queuety dodaja nekaj drugega: vsak oddani del se shrani, pri ponovnih poskusih je mogoče nadaljevati s prej shranjenimi deli, dokončani osnutek se združi nazaj v stanje poteka dela, tok pa postane en trajen korak v večji orkestraciji.

Ta vzorec je zato primeren, kadar je tok del večstopenjskega poslovnega procesa in ne zgolj zahteve ter odgovora UI.

Pomembno opozorilo

Če vaš agent Neuron med pretakanjem uporablja orodja, izrecno obravnavajte vrste pretakanih delov. Trenutna dokumentacija za pretakanje Neuron opisuje TextChunk, ReasoningChunk, ToolCallChunk in ToolResultChunk. Pri poteku dela za pripravo osnutka v ozadju je običajno najpreprosteje, da agent za pretakanje ustvarja samo besedilo.