Preskočiť na obsah

Neuron Závislé workflowy

Tento príklad odpovedá na častú otázku týkajúcu sa agentov:

Môže jeden workflow rozhodnúť, že iný workflow bude pokračovať až po dokončení predchádzajúceho?

Áno. Dôležitý detail je, že Queuety to už podporuje pomocou wait_for_workflow() a wait_for_workflows().

To znamená:

  • workflow X možno odoslať na vykonanie hneď
  • X môže čakať v waiting_for_workflows
  • X pokračuje až po dokončení workflowu Y

Príklad: najprv výskum, potom písanie

Pomocou jedného nadradeného workflowu pripravte podklady k výskumu a druhým nadradeným workflowom vytvorte návrh finálneho textu.

Workflow výskumu

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

Workflow písania

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

Keď sa workflow písania spustí, okamžite sa pozastaví v waiting_for_workflows, kým sa workflow výskumu úspešne nedokončí.

Krok písania 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'] je dostupné, pretože wait_for_workflow() skopíroval dokončený verejný stav zo závislého workflowu do aktuálneho workflowu pod kľúčom research.

Kedy použiť tento prístup namiesto jedného veľkého workflowu

Samostatné nadradené workflowy uprednostnite, keď:

  • fázy majú rôznych vlastníkov alebo prevádzkové životné cykly
  • chcete ich kontrolovať a opakovať nezávisle
  • neskoršiu fázu možno spustiť ešte pred dokončením predchádzajúcej

Jeden workflow uprednostnite, keď:

  • fázy sú úzko prepojené
  • zdieľajú jeden životný cyklus a jeden balík stavu

Úloha stavového automatu

Ak tento proces písania patrí do dlhšie trvajúcej redakčnej relácie, zverte vonkajší životný cyklus stavovému automatu a tieto pracovné postupy použite pre ohraničené fázy vykonávania. Vďaka tomu zostanú stavy životného cyklu, ako sú awaiting_brief, researching, awaiting_review a completed, explicitné a zároveň sa zachová trvácnosť pracovného postupu v každej fáze.

Jeden dôležitý rozdiel

Tento vzor znamená:

  • X existuje už teraz, ale čaká na Y

Neznamená to, že:

  • X sa vytvorí až po dokončení Y

Ak chcete dosiahnuť druhé správanie, nechajte nadradený workflow čakať na Y a až potom zavolajte start_workflows() alebo start_agents() pre X.