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
Xkan nu worden gestart Xkan wachten inwaiting_for_workflowsXwordt pas hervat wanneer workflowYis 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
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
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
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:
Xbestaat nu, maar wacht opY
Het betekent niet:
Xwordt pas aangemaakt wanneerYis 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.