Gå til indhold

Neuron Afhængige workflows

Dette eksempel besvarer et almindeligt spørgsmål om agentbaserede systemer:

Kan ét workflow beslutte, at et andet workflow først må fortsætte, når et tidligere workflow er afsluttet?

Ja. Den vigtige detalje er, at Queuety allerede understøtter dette med wait_for_workflow() og wait_for_workflows().

Det betyder, at:

  • workflow X kan afsendes nu
  • X kan sættes på pause i waiting_for_workflows
  • X først genoptages, når workflow Y er fuldført

Eksempel: først research, derefter tekstforfatning

Brug ét workflow på øverste niveau til at udarbejde en researchpakke og et andet workflow på øverste niveau til at skrive den endelige tekst.

Researchworkflow

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

Skriveworkflow

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

Når skriveworkflowet starter, sættes det straks på pause i waiting_for_workflows, indtil researchworkflowet er fuldført.

Skrive trinnet 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'] er tilgængelig, fordi wait_for_workflow() kopierede den fuldførte offentlige tilstand fra afhængighedsworkflowet til det aktuelle workflow under nøglen research.

Hvornår dette bør bruges i stedet for ét stort workflow

Foretræk separate workflows på øverste niveau, når:

  • trinnene har forskellige ejere eller driftslivscyklusser
  • du vil kunne inspicere og prøve dem igen uafhængigt
  • et senere trin skal kunne afsendes, før det tidligere trin er færdigt

Foretræk ét workflow, når:

  • trinnene er tæt forbundne
  • de deler én livscyklus og én tilstandsbeholder

Hvor en tilstandsmaskine passer ind

Hvis dette skriveforløb hører til en længerevarende redaktionel session, så lad en tilstandsmaskine styre den overordnede livscyklus, og brug disse workflows til de afgrænsede udførelsestrin. Så forbliver livscyklustilstande som awaiting_brief, researching, awaiting_review og completed tydelige, samtidig med at workflowets holdbarhed bevares i hver fase.

En vigtig skelnen

Dette mønster betyder:

  • X findes allerede, men venter på Y

Det betyder ikke:

  • X oprettes først, når Y er færdigt

Hvis du ønsker den anden adfærd, skal et overordnet workflow vente på Y og først derefter kalde start_workflows() eller start_agents() for X.