Preskočiť na obsah

Neuron Krok streamovania

Tento príklad ukazuje čisté rozdelenie úloh. Neuron streamuje odpoveď agenta po jednotlivých častiach, zatiaľ čo Queuety každú časť trvalo ukladá cez StreamingStep. Vďaka tomu môže UI dostávať priebežný návrh a pracovný postup zároveň odolá pádom workerov alebo opakovaným pokusom.

Kedy sa tento vzor hodí

Použite ho, keď je návrh alebo odpoveď natoľko dlhá, že ju chcete streamovať priebežne, keď nechcete prísť o čiastočný výstup pri páde workera a keď sa má výsledný artefakt po dokončení streamu uložiť aj do stavu pracovného postupu.

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

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

Použitie v pracovnom postupe

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

Prečo použiť Queuety namiesto samotných adaptérov streamu Neuron

Adaptéry streamu Neuron sa hodia pre protokoly a prenosy na strane frontendu. Queuety pridáva niečo iné: každá odovzdaná časť sa uloží, pri opakovanom pokuse možno pokračovať s predtým uloženými časťami, dokončený návrh sa zlúči späť do stavu pracovného postupu a stream sa stane jedným odolným krokom v rámci väčšej orchestrácie.

Preto sa tento vzor hodí, keď je stream súčasťou viacstupňového obchodného procesu, a nie iba požiadavky a odpovede UI.

Jedno upozornenie

Ak váš agent Neuron počas streamovania používa nástroje, spracúvajte typy streamovaných častí explicitne. Aktuálna dokumentácia streamovania v Neuron opisuje TextChunk, ReasoningChunk, ToolCallChunk a ToolResultChunk. Pri pracovnom postupe na tvorbu návrhov na pozadí je zvyčajne najjednoduchšie ponechať agenta na streamovanie iba textu.