
# Neuron Voogedastusetapp

See näide näitab selget vastutuse jaotust. Neuron voogedastab agendi vastuse osade kaupa, samal ajal kui Queuety salvestab iga osa püsivalt `StreamingStep` kaudu. Nii saab UI mustandit reaalajas vastu võtta, samal ajal kui töövoog peab vastu töötaja krahhidele ja korduskatsetele.

## Millal see muster kasulik on

Kasutage seda siis, kui mustand või vastus on piisavalt pikk, et soovite seda reaalajas voogedastada; kui te ei soovi töötaja tõrke korral osalist väljundit kaotada; ning kui lõplik tulemus peab pärast voogedastuse lõppu jõudma töövoo olekusse.

## Neuron agent

```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 voogedastusetapp

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

## Kasutamine töövoos

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

## Miks kasutada ainult Neuron voogedastusadapterite asemel Queuety-i

Neuron voogedastusadapterid sobivad kasutajaliidese protokollide ja transpordikihtide jaoks. Queuety pakub midagi muud: iga väljastatud osa salvestatakse püsivalt, korduskatsed saavad jätkata varem salvestatud osadest, valminud mustand liidetakse tagasi töövoo olekusse ning voogedastus muutub suurema orkestreerimise üheks vastupidavaks etapiks.

See muster sobib hästi siis, kui voogedastus on osa mitmeetapilisest äriprotsessist, mitte lihtsalt päringu ja vastuse UI-st.

## Üks tähelepanek

Kui teie Neuron agent kasutab voogedastuse ajal tööriistu, käsitlege voogedastatavate osade tüüpe selgesõnaliselt. Neuron praeguses voogedastuse dokumentatsioonis kirjeldatakse tüüpe `TextChunk`, `ReasoningChunk`, `ToolCallChunk` ja `ToolResultChunk`. Taustal toimiva mustandi koostamise töövoo puhul on tavaliselt kõige lihtsam piirduda voogedastuses ainult agendi tekstiga.

## Seotud dokumentatsioon

- [Voogedastusetapid](https://queuety.inline0.dev/et/docs/workflows/streaming)
- [Agentide orkestreerimine](https://queuety.inline0.dev/et/docs/workflows/agent-orchestration)
