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.