Neuron Zależne przepływy pracy
Ten przykład odpowiada na często zadawane pytanie dotyczące agentów:
Czy jeden przepływ pracy może zdecydować, że inny będzie kontynuowany dopiero po zakończeniu wcześniejszego?
Tak. Ważne jest to, że Queuety już obsługuje taką możliwość za pomocą wait_for_workflow() i wait_for_workflows().
Oznacza to, że:
- przepływ pracy
Xmożna uruchomić od razu Xmoże zaczekać wwaiting_for_workflowsXwznawia działanie dopiero po zakończeniu przepływu pracyY
Przykład: najpierw badanie, potem pisanie
Użyj jednego przepływu pracy najwyższego poziomu do przygotowania pakietu materiałów z badań, a drugiego do opracowania tekstu końcowego.
Przepływ pracy badawczy
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',
]);
Przepływ pracy związany z pisaniem
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',
]);
Po uruchomieniu przepływ pracy związany z pisaniem natychmiast zatrzymuje się w waiting_for_workflows i czeka na pomyślne zakończenie przepływu badawczego.
Krok pisania 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'] jest dostępne, ponieważ wait_for_workflow() skopiowało ukończony stan publiczny zależnego przepływu pracy do bieżącego przepływu pod kluczem research.
Kiedy wybrać to rozwiązanie zamiast jednego ogromnego przepływu pracy
Wybierz osobne przepływy pracy najwyższego poziomu, gdy:
- etapy mają różnych właścicieli lub odrębne cykle operacyjne
- chcesz sprawdzać je i ponawiać niezależnie
- późniejszy etap powinien móc zostać uruchomiony, zanim zakończy się wcześniejszy
Wybierz jeden przepływ pracy, gdy:
- etapy są ściśle powiązane
- korzystają ze wspólnego cyklu życia i jednego zestawu stanu
Rola maszyny stanów
Jeśli ten proces pisania jest częścią dłuższej sesji redakcyjnej, powierz zewnętrzny cykl życia maszynie stanów, a opisane przepływy pracy wykorzystaj do ograniczonych etapów wykonania. Dzięki temu stany cyklu życia, takie jak awaiting_brief, researching, awaiting_review i completed, pozostaną jawne, a trwałość przepływu pracy będzie zachowana w każdej fazie.
Ważne rozróżnienie
Ten wzorzec oznacza, że:
Xistnieje już teraz, ale czeka naY
Nie oznacza to, że:
Xzostanie utworzony dopiero po zakończeniuY
Jeśli chcesz uzyskać ten drugi efekt, spraw, by nadrzędny przepływ pracy czekał na Y, a dopiero potem wywołał start_workflows() lub start_agents() dla X.