Ga naar de inhoud

Neuron Afhankelijke workflows

Dit voorbeeld behandelt een veelgestelde vraag over agents:

Kan één workflow bepalen dat een andere workflow pas verder mag gaan nadat een eerdere workflow is voltooid?

Ja. De belangrijke nuance is dat Queuety dit al ondersteunt met wait_for_workflow() en wait_for_workflows().

Dat betekent:

  • workflow X kan nu worden gestart
  • X kan wachten in waiting_for_workflows
  • X wordt pas hervat wanneer workflow Y is voltooid

Voorbeeld: eerst onderzoek, dan schrijven

Gebruik één workflow op het hoogste niveau om een onderzoeksdossier samen te stellen en een tweede workflow op het hoogste niveau om de definitieve tekst op te stellen.

Onderzoeksworkflow

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

Schrijfworkflow

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

Wanneer de schrijfworkflow start, wordt deze onmiddellijk gepauzeerd in waiting_for_workflows totdat de onderzoeksworkflow succesvol is voltooid.

De schrijfstap 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'] is beschikbaar omdat wait_for_workflow() de voltooide openbare status van de afhankelijkheidsworkflow naar de huidige workflow heeft gekopieerd onder de sleutel research.

Wanneer u dit gebruikt in plaats van één grote workflow

Kies voor afzonderlijke workflows op het hoogste niveau wanneer:

  • de fasen verschillende eigenaren of operationele levenscycli hebben
  • u ze onafhankelijk wilt inspecteren en opnieuw uitvoeren
  • een latere fase al kan worden gestart voordat de eerdere fase is afgerond

Kies voor één workflow wanneer:

  • de fasen nauw met elkaar verweven zijn
  • ze één levenscyclus en één statusobject delen

De rol van een toestandsmachine

Als deze schrijfworkflow deel uitmaakt van een langer durende redactiesessie, laat dan een toestandsmachine de levenscyclus aansturen en gebruik deze workflows voor uitvoeringsfasen met een afgebakende duur. Zo blijven levenscyclusstatussen zoals awaiting_brief, researching, awaiting_review en completed expliciet, terwijl de duurzaamheid van workflows binnen elke fase behouden blijft.

Eén belangrijk onderscheid

Dit patroon betekent:

  • X bestaat nu, maar wacht op Y

Het betekent niet:

  • X wordt pas aangemaakt wanneer Y is afgerond

Als u het tweede gedrag wilt, laat dan een bovenliggende workflow wachten op Y en roep pas daarna start_workflows() of start_agents() aan voor X.