
# Neuron Straumēšanas solis

Šajā piemērā redzams skaidrs pienākumu sadalījums. Neuron straumē aģenta atbildi pa daļām, savukārt Queuety noturīgi saglabā katru daļu, izmantojot `StreamingStep`. Tādējādi UI var saņemt melnrakstu reāllaikā, kamēr darbplūsma joprojām spēj atjaunoties pēc izpildītāja avārijas vai atkārtotiem mēģinājumiem.

## Kad šī pieeja noder

Izmantojiet to, ja melnraksts vai atbilde ir pietiekami gara, lai to straumētu reāllaikā, ja nevēlaties zaudēt daļēju izvadi izpildītāja kļūmes gadījumā un ja pēc straumēšanas pabeigšanas galīgais artefakts jāsaglabā darbplūsmas stāvoklī.

## Neuron aģents

```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 straumēšanas darbība

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

## Izmantojiet darbplūsmā

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

## Kāpēc izmantot Queuety, nevis tikai Neuron straumes adapterus

Neuron straumes adapteri noder frontend protokoliem un transporta slāņiem. Queuety pievieno citas iespējas: katra nodotā daļa tiek saglabāta, pēc atkārtota mēģinājuma var turpināt ar iepriekš saglabātajām daļām, pabeigtais melnraksts tiek apvienots ar darbplūsmas stāvokli, un straume kļūst par vienu noturīgu darbību plašākā orķestrēšanas procesā.

Tāpēc šī pieeja ir piemērota gadījumos, kad straume ir daļa no vairāku darbību biznesa procesa, nevis tikai pieprasījuma un atbildes UI.

## Viens ierobežojums

Ja jūsu Neuron aģents straumēšanas laikā izmanto rīkus, skaidri apstrādājiet straumēto daļu tipus. Pašreizējā Neuron straumēšanas dokumentācijā aprakstīti `TextChunk`, `ReasoningChunk`, `ToolCallChunk` un `ToolResultChunk`. Fona melnraksta veidošanas darbplūsmā parasti vienkāršāk ir izmantot aģentu, kas straumē tikai tekstu.

## Saistītā dokumentācija

- [Straumēšanas darbības](https://queuety.inline0.dev/lv/docs/workflows/streaming)
- [Aģentu orķestrēšana](https://queuety.inline0.dev/lv/docs/workflows/agent-orchestration)
