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

Neuron Εξαρτημένες ροές εργασιών

Αυτό το παράδειγμα απαντά σε ένα συνηθισμένο ερώτημα σχετικά με agent:

Μπορεί μια ροή εργασιών να αποφασίσει ότι μια άλλη θα συνεχίσει μόνο αφού ολοκληρωθεί μια προηγούμενη;

Ναι. Η σημαντική λεπτομέρεια είναι ότι το Queuety το υποστηρίζει ήδη με τα wait_for_workflow() και wait_for_workflows().

Αυτό σημαίνει ότι:

  • Η ροή εργασιών X μπορεί να αποσταλεί τώρα
  • Η X μπορεί να περιμένει στο waiting_for_workflows
  • Η X συνεχίζει μόνο όταν ολοκληρωθεί η ροή εργασιών Y

Παράδειγμα: πρώτα έρευνα, μετά σύνταξη

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

Ροή εργασιών έρευνας

PHP
use Queuety\Enums\WaitMode;
use Queuety\Queuety;

$research_agent = Queuety::workflow('research_agent')
    ->then(ResearchTopicStep::class);

$research_id = Queuety::workflow('research_packet')
    ->then(PlanResearchTasksStep::class)
    ->start_agents('agent_tasks', $research_agent)
    ->wait_for_agents(mode: WaitMode::All, result_key: 'agent_results')
    ->then(SynthesizeResearchPacketStep::class)
    ->dispatch([
        'brief_id' => 42,
        'provider' => 'anthropic',
    ]);

Ροή εργασιών σύνταξης

PHP
Queuety::workflow('write_brief')
    ->wait_for_workflow('research_workflow_id', 'research')
    ->then(WriteBriefWithNeuronStep::class)
    ->wait_for_decision(result_key: 'editor_review')
    ->then(PublishBriefStep::class)
    ->dispatch([
        'brief_id' => 42,
        'research_workflow_id' => $research_id,
        'provider' => 'openai',
    ]);

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

Το βήμα σύνταξης Neuron

PHP
namespace App\Workflow\Steps;

use App\Neuron\WriterAgent;
use NeuronAI\Chat\Messages\UserMessage;
use Queuety\Step;

final class WriteBriefWithNeuronStep implements Step
{
    public function handle(array $state): array
    {
        $agent = new WriterAgent(
            providerName: $state['provider'] ?? 'openai',
        );

        $message = $agent->chat(
            new UserMessage(sprintf(
                "Write the final brief for brief %d using this research packet:\n\n%s",
                $state['brief_id'],
                json_encode($state['research'], JSON_PRETTY_PRINT),
            ))
        )->getMessage();

        return [
            'draft_markdown' => $message->getContent(),
        ];
    }

    public function config(): array
    {
        return [];
    }
}

Το $state['research'] είναι διαθέσιμο επειδή το wait_for_workflow() αντέγραψε την ολοκληρωμένη δημόσια κατάσταση από την εξαρτώμενη ροή εργασιών στην τρέχουσα ροή εργασιών, με το κλειδί research.

Πότε να το χρησιμοποιήσετε αντί για μία τεράστια ροή εργασιών

Προτιμήστε ξεχωριστές ροές εργασιών ανώτατου επιπέδου όταν:

  • τα στάδια έχουν διαφορετικούς υπευθύνους ή λειτουργικούς κύκλους ζωής
  • θέλετε να τα επιθεωρείτε και να επαναλαμβάνετε την εκτέλεσή τους ανεξάρτητα
  • ένα μεταγενέστερο στάδιο πρέπει να μπορεί να αποσταλεί πριν ολοκληρωθεί το προηγούμενο

Προτιμήστε μία ροή εργασιών όταν:

  • τα στάδια συνδέονται στενά
  • μοιράζονται έναν κύκλο ζωής και ένα σύνολο κατάστασης

Ο ρόλος μιας μηχανής καταστάσεων

Αν αυτή η ροή σύνταξης ανήκει σε μια συνεδρία σύνταξης μεγάλης διάρκειας, αφήστε μια μηχανή καταστάσεων να διαχειρίζεται τον εξωτερικό κύκλο ζωής και χρησιμοποιήστε αυτές τις ροές εργασιών για τα στάδια εκτέλεσης με σαφή όρια. Έτσι, καταστάσεις κύκλου ζωής όπως οι awaiting_brief, researching, awaiting_review και completed παραμένουν σαφείς, διατηρώντας παράλληλα την ανθεκτικότητα των ροών εργασιών σε κάθε φάση.

Μια σημαντική διάκριση

Αυτό το μοτίβο σημαίνει ότι:

  • Το X υπάρχει ήδη, αλλά περιμένει το Y

Δεν σημαίνει ότι:

  • Το X δημιουργείται μόνο αφού ολοκληρωθεί το Y

Αν θέλετε τη δεύτερη συμπεριφορά, βάλτε μια γονική ροή εργασιών να περιμένει το Y και μόνο τότε να καλεί το start_workflows() ή το start_agents() για το X.