Μετάβαση στο περιεχόμενο

Neuron Βήμα ροής δεδομένων

Αυτό το παράδειγμα δείχνει έναν σαφή διαχωρισμό. Το Neuron μεταδίδει την απόκριση του agent σε διαδοχικά τμήματα, ενώ το Queuety αποθηκεύει μόνιμα κάθε τμήμα μέσω του StreamingStep. Έτσι, το UI μπορεί να λαμβάνει ένα προσχέδιο σε πραγματικό χρόνο, ενώ η ροή εργασιών εξακολουθεί να αντέχει σε καταρρεύσεις ή επαναλήψεις εργατών.

Πότε είναι χρήσιμο αυτό το μοτίβο

Χρησιμοποιήστε το όταν ένα προσχέδιο ή μια απάντηση είναι αρκετά μεγάλο ώστε να θέλετε να μεταδίδεται ζωντανά, όταν δεν θέλετε να χαθεί μέρος της εξόδου αν τερματιστεί ο worker και όταν το τελικό τεχνούργημα πρέπει να αποθηκευτεί στην κατάσταση της ροής εργασιών μετά την ολοκλήρωση της μετάδοσης.

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

Το βήμα ροής δεδομένων 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,
        ];
    }
}

Χρήση σε ροή εργασιών

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

Γιατί να χρησιμοποιήσετε το Queuety αντί για προσαρμογείς ροής του Neuron μόνο

Οι προσαρμογείς ροής του Neuron είναι χρήσιμοι για πρωτόκολλα και μεταφορές στο frontend. Το Queuety προσφέρει κάτι διαφορετικό: κάθε τμήμα που παράγεται αποθηκεύεται μόνιμα, οι επαναλήψεις μπορούν να συνεχιστούν με τα προηγουμένως αποθηκευμένα τμήματα, το ολοκληρωμένο προσχέδιο συγχωνεύεται ξανά στην κατάσταση της ροής εργασιών και η ροή γίνεται ένα ανθεκτικό βήμα σε έναν ευρύτερο συντονισμό.

Αυτό καθιστά το μοτίβο κατάλληλο όταν η ροή αποτελεί μέρος μιας επιχειρησιακής διαδικασίας πολλών βημάτων και όχι απλώς μιας κλήσης UI αιτήματος/απόκρισης.

Μια επιφύλαξη

Αν ο agent Neuron χρησιμοποιεί εργαλεία κατά τη ροή, χειριστείτε ρητά τους τύπους τμημάτων ροής. Η τρέχουσα τεκμηρίωση ροής του Neuron περιγράφει τα TextChunk, ReasoningChunk, ToolCallChunk και ToolResultChunk. Για μια ροή εργασιών σύνταξης στο παρασκήνιο, η απλούστερη προσέγγιση είναι συνήθως να περιορίσετε τον agent ροής σε κείμενο.