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
Xmožno odoslať na vykonanie hneď Xmôže čakať vwaiting_for_workflowsXpokračuje až po dokončení workflowuY
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
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
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
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á:
Xexistuje už teraz, ale čaká naY
Neznamená to, že:
Xsa 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.