Neuron Závislé pracovní postupy
Tento příklad odpovídá na častou otázku týkající se agentů:
Může jeden pracovní postup rozhodnout, že jiný bude pokračovat až po dokončení předchozího?
Ano. Důležité je, že Queuety tuto možnost již nabízí pomocí wait_for_workflow() a wait_for_workflows().
To znamená:
- pracovní postup
Xlze spustit hned Xmůže čekat ve stavuwaiting_for_workflowsXpokračuje až po dokončení pracovního postupuY
Příklad: nejprve výzkum, potom psaní
Pomocí jednoho pracovního postupu nejvyšší úrovně vytvořte podklady z výzkumu a druhým napište finální text.
Výzkumný pracovní postup
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',
]);
Pracovní postup pro psaní
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 spuštění pracovní postup pro psaní ihned přejde do stavu waiting_for_workflows a čeká, dokud výzkumný pracovní postup úspěšně neskončí.
Krok psaní 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 k dispozici, protože wait_for_workflow() zkopíroval dokončený veřejný stav z pracovního postupu závislosti do aktuálního pracovního postupu pod klíčem research.
Kdy použít toto řešení místo jednoho velkého pracovního postupu
Samostatné pracovní postupy nejvyšší úrovně jsou vhodnější, když:
- jednotlivé fáze mají různé vlastníky nebo provozní životní cykly
- chcete je kontrolovat a opakovat nezávisle
- pozdější fázi má být možné spustit ještě před dokončením předchozí
Jeden pracovní postup je vhodnější, když:
- jsou jednotlivé fáze úzce provázané
- sdílejí jeden životní cyklus a jednu sadu stavových dat
Kde se uplatní stavový automat
Pokud tento proces psaní patří k déle trvající redakční relaci, svěřte vnější životní cyklus stavovému automatu a pro jednotlivé fáze s omezeným rozsahem použijte tyto pracovní postupy. Stavy životního cyklu, například awaiting_brief, researching, awaiting_review a completed, tak zůstanou explicitní a každá fáze si zachová trvalost pracovního postupu.
Důležitý rozdíl
Tento vzor znamená:
Xexistuje už nyní, ale čeká naY
Neznamená to, že:
Xvznikne až po dokončeníY
Chcete-li dosáhnout druhého chování, nechte nadřazený pracovní postup čekat na Y a teprve potom zavolat start_workflows() nebo start_agents() pro X.