Treci la conținut

Neuron Fluxuri de lucru dependente

Acest exemplu răspunde unei întrebări frecvente despre agenții:

Poate un flux de lucru să decidă că altul ar trebui să continue doar după finalizarea unui flux anterior?

Da. Nuanța importantă este că Queuety acceptă deja acest lucru prin wait_for_workflow() și wait_for_workflows().

Asta înseamnă că:

  • fluxul de lucru X poate fi lansat acum
  • X poate rămâne în așteptare în waiting_for_workflows
  • X se reia doar după finalizarea fluxului de lucru Y

Exemplu: mai întâi cercetare, apoi redactare

Folosiți un flux de lucru de nivel superior pentru a crea un pachet de cercetare și un al doilea flux de lucru de nivel superior pentru a redacta textul final.

Flux de lucru pentru cercetare

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

Flux de lucru pentru redactare

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

Când începe fluxul de lucru pentru redactare, acesta se pune imediat în așteptare în waiting_for_workflows până când fluxul de lucru pentru cercetare se încheie cu succes.

Pasul de redactare 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'] este disponibil deoarece wait_for_workflow() a copiat starea publică finalizată din fluxul de lucru dependent în fluxul de lucru curent, sub cheia research.

Când să folosiți această abordare în locul unui singur flux de lucru uriaș

Alegeți fluxuri de lucru separate de nivel superior când:

  • etapele au proprietari sau cicluri operaționale de viață diferite
  • doriți să le inspectați și să le reîncercați independent
  • o etapă ulterioară trebuie să poată fi lansată chiar înainte de încheierea etapei anterioare

Alegeți un singur flux de lucru când:

  • etapele sunt strâns legate
  • au un singur ciclu de viață și un singur pachet de stare în comun

Rolul unei mașini de stări

Dacă acest flux de redactare face parte dintr-o sesiune editorială de durată mai lungă, lăsați o mașină de stări să gestioneze ciclul de viață exterior și folosiți aceste fluxuri de lucru pentru etapele de execuție cu durată limitată. Astfel, stări ale ciclului de viață precum awaiting_brief, researching, awaiting_review și completed rămân explicite, păstrând totodată durabilitatea fluxului de lucru în fiecare fază.

O distincție importantă

Acest model înseamnă că:

  • X există acum, dar așteaptă Y

Nu înseamnă că:

  • X nu este creat până când Y nu se încheie

Dacă doriți al doilea comportament, faceți ca un flux de lucru părinte să aștepte Y și apoi să apeleze start_workflows() sau start_agents() pentru X.