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.