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

プロトコルリファレンス

このドキュメントでは、iac-code サーバーが公開する A2A 1.0 の範囲と、iac-code a2a-client call で使用される Phase 1 クライアントの挙動を説明します。正確な CLI オプションについては、コマンドリファレンスを参照してください。

ライフサイクル概要

典型的な A2A インタラクションは次の流れに従います。

GET Agent Card -> SendMessage or SendStreamingMessage -> GetTask / follow-up / CancelTask
  1. 発見/.well-known/agent-card.json を取得します。
  2. 送信/ の JSON-RPC エンドポイントへテキストメッセージを送信します。
  3. ストリームTaskMessageTaskStatusUpdateEvent ペイロードを受信します。
  4. 継続 — 同じ contextId でフォローアップメッセージを送信します。
  5. キャンセルまたは照会CancelTaskGetTask、または ListTasks を使用します。

Agent Card

Agent Card は次の場所で利用できます。

GET /.well-known/agent-card.json

重要なフィールド:

FieldValue意味
nameiac-codeエージェント名
supportedInterfaces[0].protocolBindingJSONRPCトランスポートバインディング
supportedInterfaces[0].protocolVersion1.0A2A プロトコルバージョン
supportedInterfaces[0].urlhttp://<host>:<port>/JSON-RPC エンドポイント
capabilities.streamingtrueストリーミングタスク更新をサポート
capabilities.pushNotificationsfalse or truetruepush-notifications: true が設定されている場合
capabilities.extendedAgentCardtrue認証済み呼び出し元は拡張ランタイム詳細をリクエスト可能
capabilities.extensionsurn:iac-code:a2a:artifact-metadata:v1ツール状態と保存済みアーティファクトメタデータのための任意の iac-code メタデータ名前空間
defaultInputModestext, JSON, YAML, image, audio, and binary MIME types受け付ける入力 MIME モード
defaultOutputModes["text/plain"]テキスト出力のみ

Agent Card 応答には Cache-Control: public, max-age=60ETagLast-Modified が含まれます。クライアントは If-None-Match を送信でき、カードが変更されていない場合は 304 Not Modified を受け取ります。

広告されるスキル:

Skill ID用途
iac_generation自然言語から Alibaba Cloud ROS と Terraform テンプレートを生成
iac_reviewIaC テンプレートを検査し修正を提案
aliyun_ros_operationsAlibaba Cloud ROS スタックワークフローを支援
terraform_ros_conversionバンドルされたスキルリソースを使用して Terraform から ROS への変換を支援

認証が有効な場合、Agent Card は設定済みのセキュリティ方式を広告します。

Scheme広告される条件
bearerAuthtoken または IACCODE_A2A_HTTP_TOKEN が設定されている
basicAuthBasic username と password の両方が設定されている
apiKeyAuthapi-key または IACCODE_A2A_API_KEY が設定されている

ルート

RouteMethod説明
/healthGET{"status":"healthy"} を返す
/.well-known/agent-card.jsonGETAgent Card を返す
/POSTA2A JSON-RPC リクエストを処理
REST routesmixedcreate_rest_routes によって登録される A2A SDK REST ルート

Phase 1 クライアントとトランスポートの注意点

デフォルトの相互運用可能な Phase 1 トランスポートは、HTTP 上の JSON-RPC です。HTTP モードは SDK REST ルート向けに HTTP+JSON も広告します。

サーバーには、stdio、Unix ソケット、WebSocket、公式 gRPC、gRPC JSON-RPC エンベロープ、Redis Streams の任意トランスポートもあります。stdio、Unix ソケット、WebSocket、gRPC JSON-RPC、Redis Streams はカスタム JSON-RPC トランスポートです。公式 gRPC は grpc として広告され、任意の gRPC 依存関係が必要です。

組み込みクライアントは、メッセージ呼び出しの前に Agent Card ディスカバリー (GET /.well-known/agent-card.json) を使用し、最初に広告された実行可能な supportedInterfaces[].url を選択してから、A2A-Version: 1.0SendMessage などの A2A 1.0 メソッド名を使って JSON-RPC リクエストを送信します。

push-notifications: true は A2A プッシュ通知設定メソッドと終端状態の配信を有効にします。

Agent Card 署名は A2A SDK の署名ユーティリティを使用し、標準の AgentCardSignature JWS フィールドを出力します。対称キーモードは HS256 を使用します。検証では、保護ヘッダー kid による設定済みシークレット、ローカル octet-key JWKS、またはリモート JWKS URL を選択できます。サーバー側の非対称署名と自動キーローテーションは Phase 1 では実装されていません。

Phase 1 で未サポートの挙動の標準的な一覧は、A2A プロトコルを参照してください。

プッシュ通知配信バックエンド

iac-code a2a --config a2a-server.yml は 2 つのプッシュ配信キューをサポートします。

  • push-queue: local-file は A2A 永続化ディレクトリの下にジョブを保存し、ローカルの単一ノード利用を想定しています。
  • push-queue: redis-streams は Redis Streams にジョブを保存し、Redis consumer group を通じてワーカーを調整します。

Redis ベースのプッシュ配信には任意の a2a-redis extra が必要で、at-least-once です。ワーカーのクラッシュ、リース期限切れ、再接続、リトライ競合の後にジョブが再配信される可能性があるため、コールバック受信側はタスク更新を冪等に処理する必要があります。

一般的な Redis オプション:

push-notifications: true
push-queue: redis-streams
push-redis-url: redis://localhost:6379/0
push-stream: iac-code:a2a:push
push-retry-key: iac-code:a2a:push:retry
push-dead-stream: iac-code:a2a:push:dead
push-consumer-group: iac-code-push
push-consumer-name: worker-1
push-lease-timeout-ms: 300000

Callback URL は保存前と配送前に検証されます。デフォルトのバリデーターは、非 HTTP(S) URL、localhost ホスト名、リテラルな private/local IP アドレスを拒否します。コールバック受信側は、それでも独自の認証と冪等性ポリシーを適用する必要があります。

JSON-RPC メソッド

SendMessage

非ストリーミング A2A メッセージターンを実行します。応答には、ターン完了後のタスクまたはメッセージが含まれます。

リクエスト

{
"jsonrpc": "2.0",
"id": "1",
"method": "SendMessage",
"params": {
"message": {
"messageId": "msg-1",
"role": "ROLE_USER",
"parts": [{"text": "Create a VPC with two vSwitches."}],
"metadata": {
"iac_code": {"cwd": "/absolute/path/to/project"}
}
},
"configuration": {
"acceptedOutputModes": ["text/plain"]
}
}
}

必須メッセージフィールド

FieldTypeRequired説明
messageIdstringYes一意のクライアントメッセージ ID
rolestringYesユーザー入力には ROLE_USER を使用
partsarrayYesテキスト風、JSON データ、生テキスト、ローカルファイル URL、または制限付きマルチモーダルパーツ
metadata.iac_code.cwdstringRecommended絶対ワークスペースパス。省略時はサーバープロセスディレクトリがデフォルト
metadata.iac_code.channelstring任意この contextId に紐づくテレメトリチャネル。IAC_CODE_CHANNEL より優先される
metadata.iac_code.preferredLanguagestring任意呼び出し側が本タスクに期待する表示言語。ユーザーに表示されるテキストがリクエスト単位でローカライズされる
metadata.iac_code.candidatePresentationstring任意rich-v1 を指定すると、Pipeline の候補確認ステップが構造化されたリッチ表示ペイロードを返す

metadata.iac_code.cwd が指定された場合、既存の絶対ディレクトリである必要があります。許可されたワークスペースルート内になければなりません。デフォルトでは、許可されるルートはサーバープロセスディレクトリとシステム一時ディレクトリです。IACCODE_A2A_ALLOWED_CWDS で、OS パス区切りの許可リストを指定できます。

metadata.iac_code.channeliac_code.channel を A2A の contextId に紐づけます。値は前後の空白が除去され、128 文字に制限され、IAC_CODE_CHANNEL より優先されます。空値または文字列以外の値は無視されます。同じ contextId を使う normal ターン、pipeline ターン、input-required の後続ターン、および pipeline handoff 後の normal chat は、サーバー再起動と context 復元後もこの設定を引き継ぎます。後続ターンで別の有効値を送ると紐づけが更新されます。紐づけがない場合は IAC_CODE_CHANNEL、それも未設定なら unknown を使用します。

metadata.iac_code.preferredLanguage はユーザーに表示されるテキスト(進捗、質問、権限プロンプト、候補表示、結果の説明など)にのみ影響します。プロトコルフィールド名、列挙値、ID、コマンド形式は翻訳されません。指定できる値はサポートされている言語 enzhesfrdejapt です。値は空白の除去、小文字化、地域サフィックスの除去(例: zh-CNzh に解決)によって正規化され、認識できない値は無視されてサーバーの既定の言語に戻ります。このフィールドは現在のメッセージターンのみに適用されます。同じ contextId を再利用する後続ターンで再び指定しない場合、既定の言語に戻ります。

metadata.iac_code.candidatePresentationrich-v1 を指定すると、selling pipeline の候補確認ステップがリッチレンダリングに適した構造化ペイロード(候補名、サマリー、アーキテクチャ図、月額総コスト、コスト内訳)を返します。指定しない場合、従来のテキスト表示の挙動は変わりません。

サポートされる入力カテゴリ:

CategoryAccepted Shape制限と挙動
テキスト風パーツtext with text/plain, JSON, Markdown, YAML, or configured extra text MIME typesプロンプトへ直接追加
JSON データパーツdata with application/jsonコンパクト JSON にシリアライズ。インライン最大 1 MiB
生テキストパーツraw with a text-like MIME type有効な UTF-8 である必要あり。インライン最大 1 MiB
ローカルテキストファイル URLurl with file://... and text-like MIME typeファイルは cwd と許可済みルート内に存在する必要あり。最大 1 MiB
マルチモーダル raw/data/file パーツimage, audio, or configured multimodal MIME typesファイル名、メディアタイプ、バイトサイズ、ハッシュ、ソースを含むプロンプトマニフェストに変換。raw/data は最大 5 MiB、file URL は最大 25 MiB

リモート HTTP(S) URL 取り込みはサポートされません。File URL パーツはローカル file:// URL を使用し、許可されたワークスペース内に留まる必要があります。

SendStreamingMessage

ストリーミング A2A メッセージターンを実行します。リクエスト本文は SendMessage と同じ形ですが、サーバーは JSON-RPC 応答を Server-Sent Events としてストリーミングします。

{
"jsonrpc": "2.0",
"id": "2",
"method": "SendStreamingMessage",
"params": {
"message": {
"messageId": "msg-2",
"role": "ROLE_USER",
"parts": [{"text": "Review this ROS template."}],
"metadata": {
"iac_code": {"cwd": "/absolute/path/to/project"}
}
},
"configuration": {
"acceptedOutputModes": ["text/plain"]
}
}
}

GetTask

保存された A2A タスクを ID で返します。保存済みタスク履歴を変更せずに返却履歴を制限するには historyLength を使用します。省略すると、サーバーの現在のデフォルト履歴を受け取ります。

{
"jsonrpc": "2.0",
"id": "3",
"method": "GetTask",
"params": {
"id": "task-id",
"historyLength": 10
}
}

ListTasks

認証済み呼び出し元に見える既知のタスクを返します。結果は、安定した順序になるように、ステータスタイムスタンプの降順、次にタスク ID の降順でソートされます。サーバーは contextIdstatuspageSizepageTokenhistoryLengthincludeArtifacts をサポートします。

{
"jsonrpc": "2.0",
"id": "4",
"method": "ListTasks",
"params": {
"contextId": "ctx-id",
"status": "TASK_STATE_WORKING",
"pageSize": 20,
"includeArtifacts": false
}
}

別のページが利用可能な場合、nextPageToken が返されます。includeArtifacts のデフォルトは false のため、明示的に要求しない限り、一覧応答ではタスクアーティファクトが省略されます。

CancelTask

実行中タスクのキャンセルをリクエストします。

{
"jsonrpc": "2.0",
"id": "5",
"method": "CancelTask",
"params": {
"id": "task-id"
}
}

タスクがアクティブな場合、サーバーは実行中のエージェントターンをキャンセルし、キャンセル済みタスク状態を出力します。タスクは存在するが実行中でない場合、サーバーは標準 A2A TaskNotCancelableError を返します。

SubscribeToTask

クライアントトランスポートでサポートされる場合、アクティブタスク更新ストリームを購読します。

{
"jsonrpc": "2.0",
"id": "6",
"method": "SubscribeToTask",
"params": {
"id": "task-id"
}
}

アクティブなタスクでは、ストリームは現在の Task で開始し、その後のタスクイベントを出力し、アクティブターンが終了すると閉じます。完了済み、失敗済み、キャンセル済み、または input-required のタスクを購読すると、無期限に待つのではなく task-not-found 風のエラーが返されます。新しいターンでは、SendStreamingMessage を優先してください。1 つのリクエストで実行を開始し、応答をストリーミングします。

プッシュ通知設定メソッド

サーバーが push-notifications: true で起動した場合、次をサポートします。

Method用途
CreateTaskPushNotificationConfigタスクのコールバック設定を保存
GetTaskPushNotificationConfig1 つのコールバック設定を取得
ListTaskPushNotificationConfigsタスクのコールバック設定を一覧表示
DeleteTaskPushNotificationConfigコールバック設定を削除

作成リクエストの例:

{
"jsonrpc": "2.0",
"id": "7",
"method": "CreateTaskPushNotificationConfig",
"params": {
"taskId": "task-id",
"id": "webhook-1",
"url": "https://hooks.example.com/a2a",
"token": "notification-token",
"authentication": {
"scheme": "bearer",
"credentials": "callback-token"
}
}
}

ローカルプッシュ keyring が利用可能な場合、サーバーは保存された通知トークンとコールバック認証情報を暗号化します。

GetExtendedAgentCard

認証済みクライアントは拡張 Agent Card をリクエストできます。

{
"jsonrpc": "2.0",
"id": "8",
"method": "GetExtendedAgentCard",
"params": {}
}

拡張カードには、公開カードに加えて認証済みランタイム詳細が含まれます。

タスクとコンテキストの挙動

iac-code は A2A コンテキストを内部エージェントランタイムにマッピングします。

Concept挙動
contextId omittedSDK/サーバーが新しいコンテキスト ID を生成
Same contextId同じ内部 iac-code セッションと会話状態を再利用
Same contextId, different cwd異なるワークスペースとして拒否
Same contextId, concurrent messageTask is already working. で拒否
Different contextId values並行実行が可能
Idle context設定されたアイドルタイムアウト後にメモリから削除

タスク ID とコンテキスト ID は空でなく、最大 128 文字で、文字、数字、_.:- のみを含む必要があります。

タスク状態

State意味
TASK_STATE_SUBMITTEDタスクが受理された
TASK_STATE_WORKINGiac-code がエージェントターンを実行中
TASK_STATE_INPUT_REQUIREDターンが完了し、エージェントがフォローアップ入力を受けられる状態
TASK_STATE_CANCELEDキャンセルが要求され適用された
TASK_STATE_FAILEDタスクが検証または実行に失敗した

コンテキストがフォローアップメッセージで利用可能なまま残るため、iac-code は通常の完了状態として TASK_STATE_INPUT_REQUIRED を使用します。通常の A2A turn は TASK_STATE_INPUT_REQUIRED をこの通常完了状態として扱い、成功した turn-end backup は非ブロッキングの normal_turn_end checkpoint です。通常の A2A terminal または cancellation publication が重要なバックアップ制御でブロックされた場合、task metadata の metadata.iac_code.backupBlockedreasonerrorrecoverable が公開されます。クライアントは復旧を待ってから次の turn を送ってください。Pipeline mode では backup 失敗を pipeline event として公開するため、metadata.iac_code.pipeline.eventType == "backup_blocked" と event data を確認してください。Pipeline mode は step 完了時の backup を作成しません。pipeline_step_completed は従来の復旧用にのみ保持されます。IAC_CODE_CONFIG_BACKUP_DIR が有効な場合、input_requiredwaiting_input を先に公開してから、唯一の重要 backup を実行します。terminal は引き続き terminal publication を保護し、handoff_ready は引き続き pipeline_handoff_ready を保護します。terminal および pipeline_handoff_ready の committed publication では、iac-code は committedEventIdcommittedEventTypecommittedSequence を含む backup_committed pipeline event を永続化します。クライアントは再起動後に publication を復旧可能と扱う前に、保護された event と対応付けられます。

A2A server で IAC_CODE_CONFIG_BACKUP_TMP_DIR を使用する場合、backup_committed はローカルの不変 snapshot を確認し、同じ sandbox 内での復旧を可能にします。最終 backup ディレクトリの更新を確認するものではありません。別の sandbox での復旧は、background process が snapshot を IAC_CODE_CONFIG_BACKUP_DIR へコピーした後に可能になります。ローカル準備を使わない場合、backup_committed は引き続き最終 backup ディレクトリを確認します。

ストリーミング更新

実行中、iac-code は TaskStatusUpdateEvent 更新を出力します。

アシスタントのテキストはステータスメッセージとして配信されます。

{
"statusUpdate": {
"taskId": "task-1",
"contextId": "ctx-1",
"status": {
"state": "TASK_STATE_WORKING",
"message": {
"role": "ROLE_AGENT",
"parts": [{"text": "Here is the ROS template..."}]
}
}
}
}

ツールと使用量の詳細は metadata.iac_code を通じて配信されます。

Metadata Path説明
iac_code.tool.statusstarted, input_delta, input_complete, completed, or failed
iac_code.tool.toolUseIdツールイベントを関連付ける安定した tool-use ID
iac_code.tool.name利用可能な場合のツール名
iac_code.tool.inputSummary完了したツール入力の形状のみの要約。文字列値とホワイトリスト外のフィールド名は、生の業務 payload を含めずに表されます
iac_code.tool.resultツール結果。フィールドごとに 4000 文字へ切り詰め
iac_code.permission.autoApprovedA2A が権限リクエストを自動承認または resolver 経由で承認したかどうか
iac_code.permission.toolName権限を要求したツール
iac_code.permission.safeSummaryマスク済みの人間向け権限サマリー
iac_code.permission.inputSummaryaliyun_api 権限リクエスト向けの安全な操作サマリー
iac_code.permission.toolInputaliyun_api 以外の権限リクエスト向けの形状のみのツール入力。文字列値は型、長さ、フィンガープリントで表され、ホワイトリスト外のフィールド名もフィンガープリントで表される場合があります
iac_code.mcpWarningマスク済みの MCP 設定または実行時 warning。server name、warning code、公開 message、scope、利用可能な場合は source path を含みます
iac_code.mcpStatusマスク済みの MCP server 状態スナップショット。connection state、authentication state、approval state、capability counts、capability refresh errors、設定 warnings を含みます
iac_code.mcpProgressMCP tool progress metadata。public tool name、original server/tool names、tool-use ID、progress、total、任意の公開 message を含みます
iac_code.thinking.typethinking-exposureraw-thinking が有効な場合は raw_thinking
iac_code.thinking.text生の provider 推論チャンク。4000 文字に切り詰められ、信頼済み設定で raw-thinking が有効な場合のみ出力
iac_code.usage.inputTokensターンの入力トークン数
iac_code.usage.outputTokensターンの出力トークン数
iac_code.usage.totalTokensターンの合計トークン数

Pipeline モードでは、metadata.iac_code.pipeline.eventType == "mcp_status" によって MCP status を pipeline metadata として公開することもできます。MCP warnings、status snapshots、progress metadata はストリーミング前にサニタイズされます。headers、環境変数、OAuth tokens、ローカルパス内の secrets はマスクまたは要約されます。

ツール結果にサポート対象のテキストアーティファクトペイロードが含まれる場合、サーバーはペイロードをローカルに保存し、標準の TaskArtifactUpdateEvent を出力し、タスクの artifacts フィールドにアーティファクトを記録します。アーティファクトパーツは、file:// URL と mediaTypebyteSizesha256 などのメタデータを使用します。元のアーティファクト内容はツールメタデータ内に重複して含まれません。

対話的な権限決定

既定の構成では、A2A ターン中に発生したツール権限リクエストは入力待ちに変換されます。iac-code はターンを一時停止し、権限エンベロープを含む TASK_STATE_INPUT_REQUIRED 状態更新を発行して、呼び出し側の構造化された決定を待ちます。

状態更新のメタデータには次が含まれます:

  • metadata.iac_code.input — 権限エンベロープ(schemaVersion は 1)。フィールドは次のとおり:
    • 相関フィールド: kind: "permission"requestTaskIdcontextIdinputIdtoolUseIdtoolName
    • 表示フィールド: titlepurposeeffecttargetisReadOnlysafeSummary。デプロイリクエストには deploymentSummary も含まれる
    • promptoptionsallow_once / deny)。呼び出し側の優先言語にローカライズされる
  • metadata.iac_code.permissionautoApproved: falsepending: truetoolNametoolUseId を含む

呼び出し側はサイドバンドメッセージで決定を提出します。ROLE_USER の A2A メッセージ 1 件に application/json DataPart を 1 つだけ含め、その payload は次のフィールドのみで構成されなければなりません:

{
"schemaVersion": 1,
"kind": "permission",
"requestTaskId": "<権限リクエストを発行した taskId>",
"inputId": "<エンベロープの inputId>",
"toolUseId": "<エンベロープの toolUseId>",
"decision": "allow_once"
}
  • decisionallow_once または deny のみ受け付けます。
  • メッセージ外側の taskIdrequestTaskId と等しくなければなりません。contextId はメッセージ外側のエンベロープから取得されます。すべての相関フィールドはそのまま保持する必要があり、リクエスト間での再利用や、ある入力への応答を別の入力として解釈し直すことはできません。
  • サーバーは決定を照合すると permission_ack DataPart(schemaVersion: 1kind: "permission_ack"inputIdtoolUseIddecisionaccepted: true を含む)を返し、metadata.iac_code.inputReceived を含む TASK_STATE_WORKING 状態更新を発行して、ターンを再開します。

Pipeline モードでは、権限リクエストは pipeline イベントとして発行されます(エンベロープには scope と step/candidate 座標情報が追加されます)。サイドバンド応答の形式は同じです。

auto-approve-permissions が有効な場合や明示的な権限ルールが構成されている場合、権限リクエストは対話的な入力待ちにならず、自動承認(監査付き)またはルールによる裁定で処理されます。保護された Alibaba Cloud 書き込み API は通常の allow ルールでは解放されず、引き続き API ごとの正確な承認が必要です。権限決定はローカルで監査され、監査レコードを必要とする allow 決定は、そのレコードを永続化できない場合に fail-closed になります。

拡張

Agent Card は任意の iac-code アーティファクトメタデータ拡張を広告します。

urn:iac-code:a2a:artifact-metadata:v1

この拡張は、ツール進行状況、権限判断、トークン使用量、ローカルアーティファクトメタデータに使用される metadata.iac_code 名前空間を識別します。サーバーが必須拡張を設定している場合、クライアントはその URI を A2A-Extensions ヘッダーに含める必要があります。必須拡張がない場合、標準 A2A ExtensionSupportRequiredError が返されます。

thinking-exposure が 1 つ以上の信号タイプを有効にしている場合、Agent Card は次も広告します。

urn:iac-code:a2a:thinking-exposure:v1

拡張 params には enabledTypes が含まれます。例:["tool_trace", "raw_thinking"]。これは iac-code メタデータ拡張であり、A2A コアのストリーミングイベントタイプではありません。

エラー処理

シナリオ結果
空のテキスト入力TASK_STATE_FAILED with A2A server currently accepts text input only.
サポートされないメディアタイプSDK がリクエストを拒否する場所に応じて、検証エラーまたは標準 A2A content-type エラー
リモート URL パーツURL パーツはローカル file:// URL を使用する必要があるため検証エラー
許可されたワークスペース外の File URL検証エラー
必須 A2A 拡張がない標準 A2A ExtensionSupportRequiredError
不正なワークスペースメタデータinvalid workspace メッセージ付きの TASK_STATE_FAILED
認証がない、または不正HTTP 401 with {"error":"Unauthorized"}
A2A サーバー依存関係がないCLI は a2a extra のインストールヒントを表示して終了
プロバイダー認証情報がないサニタイズされた認証エラー
予期しないランタイムエラーサニタイズされた内部エラー

サーバーは、予期しないエラーメッセージでローカルパス、シークレット、プロバイダー詳細を返さないようにします。