Neuron Fluxuri de lucru dependente
Acest exemplu răspunde unei întrebări frecvente despre agenții:
Poate un flux de lucru să decidă că altul ar trebui să continue doar după finalizarea unui flux anterior?
Da. Nuanța importantă este că Queuety acceptă deja acest lucru prin wait_for_workflow() și wait_for_workflows().
Asta înseamnă că:
- fluxul de lucru
Xpoate fi lansat acum Xpoate rămâne în așteptare înwaiting_for_workflowsXse reia doar după finalizarea fluxului de lucruY
Exemplu: mai întâi cercetare, apoi redactare
Folosiți un flux de lucru de nivel superior pentru a crea un pachet de cercetare și un al doilea flux de lucru de nivel superior pentru a redacta textul final.
Flux de lucru pentru cercetare
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',
]);
Flux de lucru pentru redactare
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',
]);
Când începe fluxul de lucru pentru redactare, acesta se pune imediat în așteptare în waiting_for_workflows până când fluxul de lucru pentru cercetare se încheie cu succes.
Pasul de redactare 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'] este disponibil deoarece wait_for_workflow() a copiat starea publică finalizată din fluxul de lucru dependent în fluxul de lucru curent, sub cheia research.
Când să folosiți această abordare în locul unui singur flux de lucru uriaș
Alegeți fluxuri de lucru separate de nivel superior când:
- etapele au proprietari sau cicluri operaționale de viață diferite
- doriți să le inspectați și să le reîncercați independent
- o etapă ulterioară trebuie să poată fi lansată chiar înainte de încheierea etapei anterioare
Alegeți un singur flux de lucru când:
- etapele sunt strâns legate
- au un singur ciclu de viață și un singur pachet de stare în comun
Rolul unei mașini de stări
Dacă acest flux de redactare face parte dintr-o sesiune editorială de durată mai lungă, lăsați o mașină de stări să gestioneze ciclul de viață exterior și folosiți aceste fluxuri de lucru pentru etapele de execuție cu durată limitată. Astfel, stări ale ciclului de viață precum awaiting_brief, researching, awaiting_review și completed rămân explicite, păstrând totodată durabilitatea fluxului de lucru în fiecare fază.
O distincție importantă
Acest model înseamnă că:
Xexistă acum, dar așteaptăY
Nu înseamnă că:
Xnu este creat până cândYnu se încheie
Dacă doriți al doilea comportament, faceți ca un flux de lucru părinte să aștepte Y și apoi să apeleze start_workflows() sau start_agents() pentru X.