Lewati ke konten

Neuron Langkah Streaming

Contoh ini menunjukkan pemisahan yang rapi. Neuron mengalirkan respons agent per bagian, sementara Queuety menyimpan setiap bagian secara tahan lama melalui StreamingStep. Artinya, UI dapat menerima draf langsung sementara alur kerja tetap bertahan dari crash worker atau percobaan ulang.

Kapan pola ini berguna

Gunakan pola ini saat draf atau respons cukup panjang sehingga Anda ingin mengalirkannya secara langsung, saat Anda tidak ingin kehilangan keluaran parsial jika worker berhenti, dan saat artefak akhir tetap harus masuk ke status alur kerja setelah streaming selesai.

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

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

Gunakan dalam alur kerja

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

Mengapa menggunakan Queuety alih-alih adapter streaming Neuron saja

Adapter streaming Neuron berguna untuk protokol dan transport frontend. Queuety menambahkan hal yang berbeda: setiap bagian yang dihasilkan disimpan, percobaan ulang dapat dilanjutkan dengan bagian yang sebelumnya tersimpan, draf yang selesai digabungkan kembali ke status alur kerja, dan streaming menjadi satu langkah tahan lama dalam orkestrasi yang lebih besar.

Dengan begitu, pola ini cocok saat streaming menjadi bagian dari proses bisnis multi-langkah, bukan sekadar UI permintaan/respons.

Satu catatan penting

Jika agent Neuron Anda menggunakan alat saat streaming, tangani tipe bagian streaming secara eksplisit. Dokumentasi streaming Neuron saat ini menjelaskan TextChunk, ReasoningChunk, ToolCallChunk, dan ToolResultChunk. Untuk alur kerja penyusunan draf di latar belakang, pendekatan paling sederhana biasanya adalah menjaga agent streaming hanya menghasilkan teks.