Neuron Зависими работни потоци
Този пример разглежда често срещан въпрос за агентните системи:
Може ли един работен поток да реши, че друг трябва да продължи едва след като предишният приключи?
Да. Важното уточнение е, че Queuety вече поддържа това чрез wait_for_workflow() и wait_for_workflows().
Това означава, че:
- работен поток
Xможе да бъде стартиран сега Xможе да изчака вwaiting_for_workflowsXпродължава едва когато работен потокYзавърши
Пример: първо проучване, после писане
Използвайте един работен поток от най-горно ниво за създаване на пакет с проучване, а втори работен поток от най-горно ниво — за изготвяне на крайния текст.
Работен поток за проучване
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',
]);
Работен поток за писане
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',
]);
Когато работният поток за писане стартира, той веднага се поставя на пауза в waiting_for_workflows, докато работният поток за проучване не завърши успешно.
Стъпката за писане 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'] е наличен, защото wait_for_workflow() е копирал завършеното публично състояние от зависимия работен поток в текущия поток под ключа research.
Кога да използвате това вместо един огромен работен поток
Изберете отделни работни потоци от най-горно ниво, когато:
- етапите имат различни собственици или оперативни жизнени цикли
- искате да ги проверявате и изпълнявате повторно независимо
- по-късен етап трябва да може да бъде стартиран още преди завършването на предходния
Изберете един работен поток, когато:
- етапите са тясно свързани
- споделят един жизнен цикъл и един контейнер за състояние
Ролята на машина на състоянията
Ако този процес на писане е част от по-дълготрайна редакционна сесия, оставете машина на състоянията да управлява външния жизнен цикъл и използвайте тези работни потоци за ограничените етапи на изпълнение. Така състоянията на жизнения цикъл като awaiting_brief, researching, awaiting_review и completed остават изрични, а работният поток запазва устойчивостта си във всяка фаза.
Едно важно разграничение
Този модел означава, че:
Xсъществува сега, но изчакваY
Това не означава, че:
Xне се създава, докатоYне приключи
Ако искате второто поведение, накарайте родителски работен поток да изчака Y и едва след това да извика start_workflows() или start_agents() за X.