Neuronの依存ワークフロー
この例では、エージェントを使う際によくある疑問に答えます。
あるワークフローが、先行する別のワークフローの完了後にだけ続行するよう判断できますか?
はい。重要な点として、Queuetyはすでにwait_for_workflow()とwait_for_workflows()でこれをサポートしています。
つまり、次のことが可能です。
- ワークフロー
Xは今すぐディスパッチできます Xはwaiting_for_workflowsで待機できますXは、ワークフローYが完了した場合にのみ再開します
例:まず調査し、その後に執筆
1つ目のトップレベルワークフローで調査資料を作成し、2つ目のトップレベルワークフローで最終原稿を作成します。
調査ワークフロー
PHP
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',
]);
執筆ワークフロー
PHP
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の執筆ステップ
PHP
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キーの下に格納したためです。
1つの巨大なワークフローではなく、この方法を使う場面
次の場合は、トップレベルワークフローを分けてください。
- 各段階の担当者や運用ライフサイクルが異なる
- 個別に調査して再試行したい
- 前段階の完了前でも後続段階をディスパッチ可能にしたい
次の場合は、1つのワークフローを使ってください。
- 各段階が密接に結びついている
- 1つのライフサイクルと1つの状態バッグを共有する
ステートマシンの役割
この執筆フローが長期間続く編集セッションの一部である場合は、外側のライフサイクルをステートマシンに管理させ、範囲を限定した実行段階にはこれらのワークフローを使います。これにより、各フェーズ内のワークフローの耐久性を保ちながら、awaiting_brief、researching、awaiting_review、completedのようなライフサイクル状態を明示できます。
重要な違い
このパターンでは、次のようになります。
Xは今すでに存在し、Yを待機する
次の意味ではありません。
Yが完了するまでXは作成されない
後者の動作にしたい場合は、親ワークフローでYを待機し、その後にXのためにstart_workflows()またはstart_agents()を呼び出します。