メインコンテンツにスキップ

AG-UI プロトコルリファレンス

iac-code agui の HTTP/SSE インターフェースと、標準 AG-UI envelope 内の iac-code 拡張を説明します。先に概要クイックスタートを参照してください。

HTTP エンドポイント

メソッドとパス用途
GET /healthヘルスとプロトコルバージョン
POST /RunAgentInput を送信し SSE を受信
POST /extensions/iac-code/v1/executions/{executionId}/cancel名前空間付きキャンセル拡張

POST / は JSON で送信し、SSE を要求します。

Content-Type: application/json
Accept: text/event-stream

IAC_CODE_AGUI_AUTH_TOKEN を設定した場合:

Authorization: Bearer <token>

標準 Accept-Language はエラーメッセージ言語のフォールバックです。forwardedProps.iacCode.preferredLanguage が優先され、A2A runtime にも転送されます。

RunAgentInput

{
"threadId": "8473547e-c8ed-4aef-a84c-603a6a8d42da",
"runId": "32c263f2-b0b0-42ac-905c-524a0a9bb652",
"state": {},
"messages": [{"id": "message-1", "role": "user", "content": "VPC テンプレートを作成"}],
"tools": [],
"context": [],
"forwardedProps": {
"iacCode": {
"schemaVersion": 1,
"rosInvocationId": "invocation-1",
"cwd": "/workspace/session-1",
"runMode": "normal"
}
}
}
標準フィールド要件と動作
threadId必須。会話中安定し、A2A context と iac-code session に対応
runId必須。HTTP/SSE 実行ごとに一意
parentRunId任意。RUN_STARTED へコピー
state必須。標準 envelope に保持するが runtime 状態源にはしない
messages必須。新規 run は最新 user message を使用
tools必須かつ空配列。クライアント定義ツールは未対応
context必須。現在は prompt context へ変換しない
forwardedProps必須。iacCode 拡張を含める
resumeResume 時に使用。保留中 Interrupt ごとの回答

ユーザーメッセージは文字列、text part、base64 data source の image part に対応します。リモート画像 URL、音声、動画、document、汎用 binary は未対応です。画像 1 件はデコード後 8 MiB、合計 10 MiB、HTTP リクエスト全体は 12 MiB が上限です。

forwardedProps.iacCode

未知フィールドを拒否する厳密な schema です。

フィールド必須意味
schemaVersion1はい拡張バージョン
rosInvocationIdstringはいexecution 呼び出し識別子。最大 256 文字
cwdstringはいワークスペース絶対パス
modelstringいいえリクエスト単位のモデル上書き
llmApiKeystringいいえLLM provider key
thinking.enabled/effort/budgetboolean/string/正整数いいえthinking 設定
userIdstringいいえtelemetry と呼び出し元の識別
channelstringいいえチャネルメタデータ
preferredLanguagestringいいえユーザー向け言語(例:ja
candidatePresentationstandard / richいいえPipeline 候補の表示形式
runModenormal / pipelineいいえ実行モード
pipelineNamestringいいえPipeline 名
cleanupOnlybooleanいいえクリーンアップのみを要求
alibabaCloud.accessKeyIdstringいいえ一時 AccessKey ID
alibabaCloud.accessKeySecretstringいいえ一時 AccessKey Secret
alibabaCloud.securityTokenstringいいえ一時 STS token
alibabaCloud.regionIdstringいいえ既定 region

initial run とその Resume は同じ rosInvocationId を使います。次の通常ターンでは新しい値を利用できます。Cancel も現在の値が必要です。

同じ threadId は最初の cwduserId に固定され、後続リクエストで別のワークスペースや呼び出し元へ変更できません。

SSE と heartbeat

各イベントは SSE data: レコードです。15 秒イベントがなければ次のコメントを送信します。

: heartbeat

これは AG-UI CUSTOM ではありません。SSE クライアントは無視しつつ、HTTP 接続の維持に利用します。

標準イベント対応

iac-code/A2A 信号AG-UI
リクエスト受付RUN_STARTED
agent テキストTEXT_MESSAGE_*
raw thinkingREASONING_*
ツール開始・引数TOOL_CALL_START/ARGS/END
ツール結果TOOL_CALL_RESULT
Pipeline stepSTEP_STARTED/STEP_FINISHED
Pipeline 復旧スナップショットACTIVITY_SNAPSHOT
正常終了success の RUN_FINISHED
入力待ちinterrupt の RUN_FINISHED
エラーRUN_ERROR

RUN_FINISHED は AG-UI run 1 回の終了であり、Pipeline 全体の終了とは限りません。複数 Interrupt がある Pipeline では複数 run が生じます。Pipeline の業務終端は pipeline_completedpipeline_error などで表します。

AG-UI span の整合性を保つため、Interrupt 前に開いている message、reasoning、tool、step を閉じ、Resume の新 run で継続中の step を再度開きます。同じ業務 step が run 間で一度閉じて再開して見えるのは逆順実行ではありません。

iac-code カスタムイベント

  • iac-code.session.v1threadIdexecutionIdcontextIdtaskIdsessionId などの対応情報。executionId は Cancel に使用できます。
  • iac-code.artifact.v1:A2A task artifact の構造化投影。
  • iac-code.tool-progress.v1:標準イベントにないツール中間進捗。開始、引数、結果は標準 TOOL_CALL_* のままです。
  • iac-code.pipeline.v1:標準表現のない有用な Pipeline 情報。

iac-code.pipeline.v1eventType

  • Pipeline:pipeline_startedpipeline_resumedpipeline_completedpipeline_errorpipeline_warningbackup_blocked
  • 候補:candidate_startedcandidate_completedcandidate_failedcandidate_interruptedcandidate_restart_requestedcandidate_selectedcandidate_detail_showncandidate_step_failed
  • sub-pipeline:sub_pipeline_startedsub_pipeline_completedsub_step_failedstep_failed
  • スタックとクリーンアップ:stack_progressstack_instances_progressstack_current_changedcleanup_startedcleanup_progresscleanup_completedcleanup_failed
  • rollback:rollback_triggeredrollback_completed
  • context:context_compaction_startedcontext_compactedcontext_compaction_failedfields_marked_stale
  • 表示とツール:diagram_shownmcp_statustool_progress

text_deltathinking_deltatool_started/tool_resultusage、step lifecycle は標準イベントに変換されるため CUSTOM では重複送信しません。再送イベントは (name, value.eventId) または sequence で重複排除してください。

Interrupt と Resume

入力待ち run は RUN_FINISHED.outcome.type = "interrupt" で終了します。Interrupt には idreason、ユーザー向け message、任意の toolCallId、JSON responseSchemaexpiresAttitle/purpose/safeSummary/options/toolName などの metadata が含まれます。

権限確認の例:

{"decision": "allow_once"}

または:

{"decision": "deny"}

UI は reason だけで推測せず、messageresponseSchema、説明 metadata を利用してください。

Resume は同じ threadId、新しい runId、同じ rosInvocationId で、新しい POST / として送信します。

{
"resume": [{
"interruptId": "permission-1",
"status": "resolved",
"payload": {"decision": "allow_once"}
}]
}

全 pending Interrupt を 1 回ずつ回答し、重複・未知 ID は使用できません。resolved の payload は schema に一致する必要があります。cancelled はその Interrupt を中止し、権限では deny として扱われます。schema エラーは RUN_ERROR となりますが、Interrupt は再試行可能なままです。受理済み回答を再送してもツールは再実行されません。

turn と識別子

threadId(会話全体で固定)
├─ runId-1(ユーザーターン)
├─ runId-2(Interrupt Resume)
├─ runId-3(次の Resume)
└─ runId-4(次の通常メッセージ)

HTTP/SSE リクエストごとに一意の runId を使います。冪等性の範囲は (threadId, runId) です。

キャンセル拡張

POST /extensions/iac-code/v1/executions/<executionId>/cancel
Content-Type: application/json
{"threadId": "thread-1", "rosInvocationId": "invocation-1"}

結果は cancelledalready_terminal、または HTTP 404EXECUTION_NOT_FOUND です。Cancel は pending Interrupt を消去しますが、標準イベント形式は変更しません。

永続化と切断

状態は既定で <config-dir>/agui/threads/<thread-key>.json に保存されます。thread 対応、session/task/execution ID、Pipeline 復旧位置、pending Interrupt、冪等性情報を含みます。要求された thread だけを遅延読み込みし、その小さなファイルだけを原子的に置き換えます。

LLM key、AccessKey Secret、STS token、会話本文、実行成果物は保存しません。A2A の session/task 永続化は A2A server が管理します。A2A ドキュメントを参照してください。

期限切れ Interrupt は次回アクセス時に拒否・消去され、対応 A2A task のキャンセルを試みます。Interrupt で安全終了した run は古い SSE を必要としません。通常の実行中に切断すると A2A task をキャンセルします。

エラー

SSE 前のエラーは HTTP JSON、実行中のエラーは RUN_ERROR です。主な code:

code意味
INVALID_INPUTenvelope、拡張、メッセージ、workspace が無効
DUPLICATE_RUN_ID / RUN_ID_CONFLICTrun ID の再利用
THREAD_BUSYthread が実行中
THREAD_BINDING_CONFLICTworkspace または caller が既存 binding と不一致
RESUME_REQUIREDInterrupt 回答待ち
INCOMPLETE_RESUME / UNKNOWN_INTERRUPTResume の不足、重複、未知 ID
RESUME_PAYLOAD_INVALIDpayload が schema と不一致
RESUME_ALREADY_APPLIED回答を適用済み
EXECUTION_EXPIRED / EXECUTION_LOSTexecution が期限切れまたは復旧不能
STATE_PERSISTENCE_FAILED重要状態を書き込めない
A2A_UNAVAILABLE / A2A_PROTOCOL_ERROR / A2A_EXECUTION_FAILEDA2A の接続、ID、実行エラー
CANCELLEDexecution がキャンセル済み

復旧に必要な書き込みは fail closed です。永続化前に復旧可能だと通知せず、必要に応じて A2A task をキャンセルします。