Aller au contenu

Neuron Étape de streaming

Cet exemple présente une répartition claire. Neuron diffuse la réponse de l’agent fragment par fragment, tandis que Queuety conserve chaque fragment de façon durable via StreamingStep. Le UI peut ainsi recevoir un brouillon en temps réel, même si le workflow survit aux plantages ou aux nouvelles tentatives du processus de travail.

Quand utiliser ce modèle

Utilisez-le lorsqu’un brouillon ou une réponse est assez long pour être diffusé en temps réel, lorsque vous ne voulez pas perdre les résultats partiels en cas d’arrêt du processus de travail et lorsque l’artefact final doit tout de même être enregistré dans l’état du workflow à la fin du flux.

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

L’étape de streaming 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,
        ];
    }
}

L’utiliser dans un 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',
    ]);

Pourquoi utiliser Queuety plutôt que de simples adaptateurs de flux Neuron

Les adaptateurs de flux de Neuron sont utiles pour les protocoles et les transports frontend. Queuety apporte autre chose : chaque fragment produit est enregistré, les nouvelles tentatives peuvent reprendre avec les fragments déjà sauvegardés, le brouillon terminé est fusionné dans l’état du workflow et le flux devient une étape durable d’une orchestration plus vaste.

Ce modèle convient donc bien lorsque le flux fait partie d’un processus métier en plusieurs étapes, et non d’une simple UI requête/réponse.

Une réserve

Si votre agent Neuron utilise des outils pendant le streaming, gérez explicitement les types de fragments diffusés. La documentation actuelle sur le streaming de Neuron décrit TextChunk, ReasoningChunk, ToolCallChunk et ToolResultChunk. Pour un workflow de rédaction en arrière-plan, le plus simple est généralement de limiter l’agent de streaming au texte.