エージェントオーケストレーション実行の世界 · ランタイムループ

モデルはステートレス。
仕事はステートフルに、統制される。

オーケストレーションコアは、ステートレスなLLM呼び出しを永続的で認証情報を意識した監査可能な作業へと変える、ステートフルなエージェントランタイムです — チャットアシスタント、ワンショットの関数型エージェント、ステートマシン型ワークフローが、すべて1つのAPIの裏側で動きます。

ドキュメントを読む
課題

LLMは何をすべきか決められても、それをやり遂げることはできません。

LLMはOAuthトークンを保持できず、タスク途中の再起動を生き延びられず、不安定なAPIをバックオフ付きで再試行できず、人間の承認を3日間待つこともできません。オーケストレーションコアはこの実行基盤を担います: LLMはステートレスなままで、システムが状態を永続化し、実行時に認証情報を解決し、複数ステップの計画を実行し、すべてのアクションを記録します。

エージェントルーム

すべての会話は、アシスタント、プラットフォーム(UI、Slack、Teams、API、ワークフロー)、外部ユーザーを結びつけるルームです。ルームごとのプロセスが処理中のリクエストを直列化するため、重複した同時メッセージが競合状態を起こすことはありません。

エージェンティックループ

各ターンで: コンテキストを構築 → 構造化された計画と結論(応答、確認、再評価)を取得 → 実行 → 必要ならループ。反復回数の上限、進捗検知、強制的な応答生成が終了を保証します。

ループ検知

同一のツール呼び出しの繰り返し(引数をハッシュ比較)、連続するエラー、繰り返されるエラー種別はループを中断させます — 暴走するエージェントは、ランタイムが拒否する失敗モードです。

動的なツール発見

事前登録されたツール一覧はありません。エージェントはSKBのセマンティック検索を通じて機能を見つけます。確信度の低いマッチは推測ではなく確認質問を引き起こし、確認された結果は以後のマッチング精度を高めます。

認証情報を意識した実行

2つの認証情報レイヤーが明確に分離されています: エージェントがあなたのInteractorアカウントに入るためのログインと、接続済みのサードパーティアプリ内で操作するためのOAuthトークンです。プロンプトには接続済みサービス、戻り値の型ヒント付きの機能シグネチャ、再認証が必要な期限切れのサードパーティ認証情報が含まれ、モデルは一度で計画を立てられます。実行時にはトークンが呼び出しごとに解決され、自動更新され、会話データには決して含まれません。

マルチエージェント委任

プライマリエージェントは、独自のツールを持つ一時的なルームで生成されたスペシャリストに委任します。チェーンの深さ、並行性、タイムアウト、循環については厳格な上限が課され、認証情報の継承は全継承・最小権限にスコープされた継承・継承なしのいずれかです。

ワークフローステートマシン

長時間実行されるプロセスは、有向ステートマシンとして表現されます: ステートが処理し、遷移がルーティングし、条件が判断します。インスタンスは作成時点の定義をスナップショットとして保持し、各遷移時に永続化され、ジョインセマンティクスを持つ並列スレッドに分岐できます。

一時停止 / 再開 — 人間が関わる場所

一時停止状態はデータ、スレッドの状態、選択肢、暗号化された認証情報の参照まですべてを保持したまま待機します。承認は再起動やデプロイをまたいでも維持され、重複した再開要求は何も起こしません。

プロバイダー抽象化

1つのアダプター層が、OpenAI、Anthropic、Google、そしてテキストパース方式のフォールバックにわたって構造化出力を統一します。モデルレジストリはすべてのモデルを1つの推論インターフェースの裏にあるバージョン管理されたレコードとして扱います — プロバイダーの切り替えは設定変更のみで済み、レイテンシ、トークン数、コストは呼び出しごとに記録されます。

プロンプト & メモリのマージ

プロファイルはアカウント → コンテキスト → ユーザーの順にすべてのシステムプロンプトへマージされます。メモリは4層構造です: 構造化されたステート、そのまま保持される直近のウィンドウ、圧縮された進行中の要約、そして類似度で検索されるpgvectorベースのエピソード記憶。

1ターンの流れ

メッセージから統制された実行まで。

会話1ターン分

01

直列化メッセージがルームに届き、ルームごとのプロセスが同時リクエストの重複を排除します。

02

構築プロファイル、履歴、永続ステート、検索されたメモリ、認証情報の要約、機能シグネチャがコンテキストを構築します。

03

計画LLMが構造化された計画と結論を返し、スキーマに照らして検証されます。

04

実行デフォルトは順次実行。依存関係分析で独立性が証明されたグループは並列実行されます。認証情報はアクションごとに解決されます。

05

委任スペシャリストがスコープ付き認証情報とともに生成され、構造化された結果とアクションログが計画変数に戻ります。

06

結論応答、確認、再評価のいずれかで締めくくります — 上限があります。トークンはSSEでストリーミングされ、HMAC署名済みWebhookが再試行付きで発火します。

07

記憶履歴が更新され、メモリが埋め込まれ、実行結果はUKBの検知とSKBの信頼性スコアに反映されます。

APIサーフェス

アシスタント、ルーム、ワークフロー — すべて1つのAPI。

POST/agentsアシスタントを作成 — モデル設定、ツール、プロンプト
POST/agents/:assistant_id/rooms会話ルームを作成
POST/agents/rooms/:room_id/messagesメッセージを送信(非同期; 応答はSSE経由)
GET/agents/rooms/:room_id/streamステータス、トークン、イベントのSSEストリーム
POST/agents/:assistant_id/executeワンショットの関数型エージェント実行
GET/profiles/effective/:user_idアカウント → コンテキスト → ユーザーでマージされたプロファイル
POST/workflowsワークフローを定義(静的検証: 到達可能性、宙に浮いた遷移)
POST/workflows/:id/instancesインスタンスを開始 — client_refで冪等
GET/workflows/instances/:id/historyステップ単位の完全な監査履歴
POST/workflows/instances/:id/threads/:tid/resume遷移キーで一時停止中のスレッドを再開
保証事項

非決定的なモデルの上に成り立つ決定的な実行。

構造化され検証された計画スキーマ検証済みの出力、パース失敗時のガイド付き再試行、上限のある再評価、すべてのアクションを記録。

分類されたリトライ一時的なエラーはRetry-Afterを尊重しつつ指数バックオフとジッターで再試行します。永続的なエラーとセキュリティエラーは決して再試行されず、アクションごとのリトライポリシーと明示的なフォールバックがあります。

全経路での冪等性client_refによるインスタンスの重複排除、冪等な再開、冪等でないHTTPステップのリクエストID、副作用のあるステップを再実行する前に完了マーカーを確認するクラッシュリカバリ。

永続性状態はすべての遷移で永続化されます。一時停止中のワークフローとクラッシュしたインスタンスは再起動時に復旧します。

テナント分離アカウント単位でスコープされたデータ、アカウントごとの認証情報暗号化、不透明な外部ユーザーID — エンドユーザーの個人情報はあなたのアプリ内にとどまります。

認証情報の衛生管理値は呼び出し時点で解決され、ワークフローやチャットデータに永続化されることは決してなく、使用後は破棄され、すべてのアクセスが監査されます。

実践例

実際の仕事を、証拠とともに。

委任するサポートエージェント

注文を確認し、スコープ付き認証情報のみを持つ課金スペシャリストに返金処理を委任し、Slackに投稿しつつ並列グループでチケットを更新します — すべてトークン単位でストリーミングされます。

週末を生き延びた承認

注文ワークフローが決済処理を実行し、高額注文についてはawaiting_approvalで一時停止し、2日間とデプロイ1回を生き延び、マネージャーが承認をクリックすると再開します。

バッチワーカー

会話を一切伴わない関数型エージェントがチケットを分類します — 確信度とトークン使用量を含む構造化された結果を返します。

ルームをまたぐ記憶

一度だけ語られた「メールよりLinkedInでのアウトリーチを優先する」という言葉が、数週間後、別のルームで類似度検索により呼び出されます。

モデルの入れ替え

レジストリの1行を編集するだけで、タスクは別のLLMプロバイダーに移行します。構造化出力の契約はそのまま、コード変更はゼロです。

目標を設定すれば、あとはシステムが動きます。あなたの許可なしには何も実行されません。

ノードあたり数千の分離された、クラッシュから復旧可能なエージェントセッション — OTPの並行処理の物語が、あなたに応えるエージェントに適用されています。