メインコンテンツまでスキップ

SSE ストリーミングガイド

AGENTIC STAR Chat API の SSE ストリーミングレスポンスの詳細。接続ライフサイクル、レスポンスオブジェクト、エージェント拡張フィールド、エラーハンドリングを解説します。

このガイドの読み方​

マーケットプレイス版のエージェントは、導入企業が AGENTIC STAR Platform SDK を使って自ら開発します。そのため SSE レスポンスには、プラットフォームが必ず行う部分と、エージェントの実装次第で現れたり現れなかったりする部分があります。分岐処理を書く前に、この区別を押さえてください。

プラットフォームが必ず行うこと​

接続先のエージェントに関係なく、次は常に同じです。

  • 接続と終端 — : connected / : heartbeat / data: [DONE]、ロールチャンクと messageInfo、レスポンスヘッダー
  • 会話開始時にプラットフォームが送る起動通知(delta.content を 1 件)
  • Task のフィールド名と既定値の補完、files の正規化、内部キーの除去
  • outputFormat を指定しない場合のプレーンテキスト化
  • finishReason: "stop" での終端 — SDK の runner が成功・失敗のどちらでも終端イベントを送るため
  • キャンセルが受理されたときの cancelled: true チャンク

エージェントの実装次第で現れるもの​

項目現れる条件
delta.tasksエージェントが metadata.actionType を指定してツールイベントを送った場合。指定が無いと Task にはならず、本文(delta.content)に落ちます
delta.interactionエージェントがユーザーへの問いかけを実装している場合
choice.deliverablesエージェントが成果物ファイルを送った場合
delta.content の中身最終応答・途中経過・思考過程がすべてここに流れます。どれがどれかを区別する情報は付きません

これらは「届くこともある」ものです。接続先のエージェントが実際に何を送るかを確認してから、クライアント側の分岐を実装してください。

概要​

AGENTIC STAR Chat API はレスポンスを SSE(Server-Sent Events)ストリーミングで配信します。各チャンクは OpenAI 互換の ChatCompletionChunk 形式で、エージェント固有の拡張フィールド(タスク情報、対話リクエスト等)が含まれます。

ポイント
  • Content-Type は text/event-stream; charset=utf-8
  • 各イベントは data: プレフィックス付きの JSON 行
  • ストリーム終了は data: [DONE] で通知
  • エージェントの長時間タスクでは、再接続・キャンセルのエンドポイントが利用可能
システム連携 API リファレンス(Chat)に戻る

接続ライフサイクル​

POST /v1/chat/completions へのリクエスト後、SSE 接続が確立され、以下の順序でイベントが配信されます。

SSE イベントフロー​

: connected                          ← SSE接続確立コメント

data: {"createdAt":"...","model":"AGENTIC STAR","choices":[{"index":0,"delta":{"role":"assistant","messageInfo":{...}}}]}
↑ ロールチャンク(1回)

data: {"createdAt":"...","model":"AGENTIC STAR","choices":[{"index":0,"delta":{"content":"売上"}}]}
data: {"createdAt":"...","model":"AGENTIC STAR","choices":[{"index":0,"delta":{"content":"データ"}}]}
data: {"createdAt":"...","model":"AGENTIC STAR","choices":[{"index":0,"delta":{"content":"を..."}}]}
↑ コンテンツチャンク(複数回)

data: {"createdAt":"...","model":"AGENTIC STAR","choices":[{"index":0,"delta":{"content":"...","tasks":[{"messageId":"...","conversationId":"...","actionType":"command_execution","title":"コマンド実行","status":"completed","timestamp":1773499412706}]}}]}
↑ タスク実行情報を含むチャンク(複数回)

: heartbeat ← コネクション維持コメント(約15秒間隔、アイドル時のみ任意のタイミングで挿入)

data: {"createdAt":"...","model":"AGENTIC STAR","choices":[{"index":0,"delta":{"content":"..."},"finishReason":"stop"}]}
↑ 最終チャンク(finishReason付き)

data: [DONE] ← ストリーム終了

各フェーズの詳細​

フェーズ説明
: connectedSSE コメント行。接続が確立されたことを示します。
ロールチャンク最初の data イベント。delta に role: "assistant" と messageInfo(conversationId, messageId)が含まれます。
コンテンツチャンクテキストコンテンツの差分。delta.content に追記テキストが含まれます。テキストの形式はリクエストの outputFormat で制御でき、省略時はプレーンテキスト("markdown" 指定で Markdown 記法を保持)。エージェントのタスク実行情報(delta.tasks)が含まれることもあります。複数回配信されます。
: heartbeatSSE コメント行。長時間アイドル時のコネクション維持用(プロキシのアイドルタイムアウト対策)。約15秒間隔で挿入されます。data: で始まらないため通常のクライアントは自動的に無視します。
最終チャンクfinishReason が設定されたチャンク。status(実行状態)や deliverables(成果物)が含まれることがあります。
data: [DONE]ストリーム終了シグナル。この後 SSE 接続が閉じられます。
テキストはプレーンテキストに変換されます

リクエストで outputFormat: "markdown" を指定しない限り、配信されるテキストは Markdown 記法を落としたプレーンテキストに変換されます。対象は delta.content と、delta.interaction.content です。Markdown のまま受け取りたい場合は outputFormat: "markdown" を指定してください。

レスポンスヘッダー​

ヘッダー説明
Content-Typetext/event-stream; charset=utf-8
X-Conversation-Id会話ID。新規会話の場合はサーバーが生成したIDが返されます。
X-Message-Idアシスタントの応答メッセージID。

レスポンスオブジェクト​

SSE の各 data: 行は以下のオブジェクト階層で構成されます。

ChatCompletionChunk
└─ choices[]
└─ Choice
├─ delta … Delta オブジェクト(差分データ)
├─ finishReason … 完了理由
├─ status … エージェント実行状態
└─ deliverables … 成果物ファイル

ChatCompletionChunk​

各 SSE イベントのトップレベルオブジェクトです。

パラメータ型説明
createdAtstringチャンクの生成日時(ISO 8601形式)
modelstringモデル名。"AGENTIC STAR"
choicesarrayChoiceオブジェクトの配列(要素数は常に1)

Choice​

choices 配列の各要素です。AGENTIC STAR では常に 1 要素のみ含まれます。

パラメータ型説明
indexnumber常に 0
deltaobject差分データ(下記 Delta オブジェクト)
finishReasonstring | null"stop"(正常完了)、"error"(エラー)、または null(ストリーミング中)
statusobject{ processing: boolean, unfinished: boolean } — エージェントの実行状態
deliverablesarrayエージェントが生成した成果物ファイルの配列
cancelledbooleanキャンセルが受理されたチャンクにのみ true で付きます。通常のチャンクにはフィールド自体が現れません

Delta​

各チャンクの差分データです。チャンクの種類によって含まれるフィールドが異なります。

パラメータ型出現説明
rolestring最初のみ最初のチャンクでのみ送信。"assistant" 固定。
messageInfoobject最初のみ{ conversationId, messageId } — メッセージ識別情報
contentstring複数回テキストコンテンツの差分
tasksarray複数回エージェントのタスク実行情報(Task オブジェクトの配列)
interactionobject条件付きユーザー対話リクエスト(選択肢提示等)

エージェント拡張フィールド​

AGENTIC STAR は OpenAI 互換フォーマットに、エージェント固有の拡張フィールドを追加しています。

フィールドレベル説明
delta.tasksDeltaエージェントのタスク実行情報
delta.interactionDeltaユーザー対話リクエスト
choice.statusChoiceエージェントの実行状態
choice.deliverablesChoice成果物ファイル一覧

delta.tasks​

エージェントのタスク実行情報。ツール実行・ファイル作成・検索などのアクション発生時に SSE チャンクの delta.tasks 配列として配信されます。タスク状態が更新されるたびに送信され、1 チャンクに含まれる Task は通常 1 件です。delta.tasks は delta.content と同一チャンクに共存します。

Task オブジェクトの詳細は「Task データモデル」を参照してください。

以下は配信例です。actionType と metadata の値は、接続先エージェントの実装によって異なります。

JSON
{
"createdAt": "2026-03-14T15:00:53.059Z",
"model": "AGENTIC STAR",
"choices": [{
"index": 0,
"finishReason": null,
"delta": {
"content": "コマンドを実行しています",
"tasks": [{
"messageId": "5b47837a-...",
"conversationId": "09071b95-...",
"callId": "call-1",
"actionType": "command_execution",
"title": "コマンド実行",
"description": "コマンドを実行しています",
"status": "in_progress",
"metadata": { "call_id": "call-1", "command": "ls -la" },
"timestamp": 1773499412706,
"createdAt": "2026-03-14T14:43:32.708Z",
"updatedAt": "2026-03-14T14:43:32.708Z"
}]
},
"status": { "processing": true, "unfinished": true }
}]
}

delta.interaction​

エージェントがタスク実行中にユーザーの入力を求めるときに送信されます。

エージェントが実装している場合にのみ発生します

SDK が提供しているのは EventType.USER_INTERACTION_REQUIRED と metadata.interaction_type という手段だけで、どの場面で問いかけるか、そもそも問いかけるかどうかはエージェントの実装次第です。対話を実装していないエージェントでは delta.interaction は一度も現れません。接続先のエージェントが対話を使うかどうかを確認してから実装してください。

エージェントはこのイベントを出した時点で実行ループを止め、ターンを閉じます。したがってクライアントは内容をユーザーに提示し、回答を次のリクエストで送って会話を継続させる必要があります。これを実装しないと、対話を使うエージェントでは会話がそこで止まります。

パラメータ型必須説明
interactionTypestring✓"question" | "choice" | "confirmation"
contentstring対話メッセージの本文
optionsstring[]選択肢の配列。choice でのみ付きます(最大 10 件・各 200 文字以内)。要素数は決め打ちせず、渡された配列をそのまま提示してください。
interactionType用途SDK 側の発行方法
question自由記述での回答を求めるUSER_INTERACTION_REQUIRED + interaction_type: "question"
choice選択肢を提示し、1つを選ばせるUSER_INTERACTION_REQUIRED + interaction_type: "choice" + options[]
confirmation承認 / 拒否を求めるUSER_INTERACTION_REQUIRED + interaction_type: "confirmation"

回答は、次の POST /v1/chat/completions に同じ conversationId を指定してテキストで送信します。SSE ストリーム内で回答を返す経路はありません。options がある場合は選択肢として提示したうえで、ユーザーが選んだ内容をテキストで送ってください。question と confirmation には options が付かないため、content の本文を読んで回答を組み立てます。

question の例:

JSON
"interaction": {
"interactionType": "question",
"content": "出力の対象期間はいつからいつまでですか?"
}

choice の例:

JSON
"interaction": {
"interactionType": "choice",
"content": "どの形式で出力しますか?",
"options": ["PDF", "Excel", "Markdown"]
}

confirmation の例:

JSON
"interaction": {
"interactionType": "confirmation",
"content": "このファイルを削除してよいですか?"
}

choice.status​

最終チャンクの Choice レベルに含まれるフィールドです。エージェントの実行状態を示します。

パラメータ型説明
processingbooleanエージェントがバックグラウンドで処理を継続中かどうか。通常は unfinished と同じ値で遷移する。true の場合、再接続で後続イベントを受信可能。
unfinishedbooleanタスクが未完了かどうか。通常は processing と同じ値で遷移する。両方 false で正常完了、両方 true で処理継続中を示す。
JSON
"status": { "processing": false, "unfinished": false }

choice.deliverables​

最終チャンクの Choice レベルに含まれるフィールドです。エージェントが生成した成果物ファイルの一覧です。

パラメータ型説明
filenamestringファイル名
filepathstringファイルパス(ダウンロード用の相対パス)
sourcestring"agent"(エージェント生成)または "user"(ユーザーアップロード)。
isPrimaryboolean主要成果物かどうか
createdAtstring作成日時(ISO 8601形式)
mimeTypestring?MIME タイプ(例: "application/pdf"、"image/png"、"text/markdown")。filename から判定できない場合は省略される
sizenumber?ファイルサイズ(バイト)。0 以下の場合は省略
JSON
"deliverables": [{
"filename": "report.pdf",
"filepath": "/files/output/report.pdf",
"source": "agent",
"isPrimary": true,
"createdAt": "2026-03-14T10:30:05.000Z",
"mimeType": "application/pdf",
"size": 4201846
}]

Task データモデル​

delta.tasks 配列には、エージェントが実行したアクションを表す Task オブジェクト が並びます。Task は「全ての Task に共通するフィールド」と「actionType によって構造が切り替わる可変部」で構成されます。

どこまでが基盤の仕様で、どこからがエージェント実装か

SSE の接続ライフサイクル、ChatCompletionChunk / Choice / Delta の構造、choice.status、choice.deliverables、そして下記「共通フィールド」に挙げる Task のフィールド名と既定値までが、基盤が保証する範囲です。

一方、actionType の値、metadata のキーと構造、title / description / content の文言は、応答を生成するエージェントの実装が決めます。基盤はこれらを検証も変換もせず、そのまま配信します。

共通フィールド​

全ての Task に共通して現れるフィールドです。

フィールド型説明
messageIdstringTask が属するメッセージの ID
conversationIdstringTask が属する会話の ID
actionTypestring可変部の構造を決める discriminator(actionType の詳細)
statusstringTask の状態。値は in_progress / completed / failed / error / pending のいずれか。エージェントが指定しなかった場合もプラットフォームが既定値(in_progress または pending)を入れるため、空にはなりません。ツール固有の詳細ステータスは metadata.status に格納され、本フィールドとは別の値です
callIdstring | nullエージェントが metadata.call_id を入れた Task のみ値を持ち、無い場合は null。同じ値で開始と結果の Task が紐付きます
titlestringタスク種別や対象の短い見出し(表示用)
descriptionstring実行中メッセージや補足説明(表示用)
contentstringタスクの出力本文(表示用、長文になり得る)
metadataobjectactionType によって構造が変わる(actionType の詳細参照)
filesTaskFile[]関連ファイル(TaskFile の構造は こちら)
timestampnumberTask のタイムスタンプ(Unix ミリ秒)
createdAtstring作成日時(ISO 8601)
updatedAtstring更新日時(ISO 8601)
表示用テキストをプログラム分岐に使わない

title / description / content は人間可読なテキストです。プログラム側の分岐条件には使用しないでください。分岐には actionType / status / metadata.sub_event_type を使います。

フィールド典型的な用途
titleタスク種別・対象の短い見出し(例: ツール名や対象名)
description実行中メッセージや補足説明
contentツール出力の本文
未知のフィールドは安全に無視

実装は将来 actionType / metadata / 共通フィールドに新規キーを追加する可能性があります。クライアント実装では、本ドキュメントに記載されていないフィールドは安全に無視するようにしてください。

TaskFile 構造​

files: TaskFile[] の各要素の構造です。

フィールド型説明
filenamestringファイル名
sizenumberファイルサイズ(バイト)
filepathstringダウンロード URL または作業ディレクトリ内のファイルパス
mimeTypestring?MIME タイプ(例: "application/pdf"、"image/png"、"text/markdown")。filename から判定できない場合は省略される

actionType と metadata​

マーケットプレイス版のエージェントは、導入企業が自ら開発し、AGENTIC STAR Platform SDK を使って実装します。本節はその前提で記載しています。 そのため delta.tasks[] の中身は接続先のエージェントによって変わります。プラットフォームは Task のフィールド名と既定値を保証しますが、値そのものは検証も変換もせず、エージェントが送ったまま配信します。

決まるもの決める主体
Task のフィールド名(actionType / status / title / description / metadata / files / callId / timestamp)プラットフォーム
未指定時の既定値プラットフォーム
actionType の値エージェント
metadata のキーと構造エージェント
title / description / content の文言エージェント
files に載せる成果物エージェント
未指定時の既定値

actionType / title / description が未指定の場合は空文字が入ります。status は未指定でもプラットフォームが既定値(in_progress または pending)を入れるため、空にはなりません。timestamp はプラットフォームが採番します。callId は metadata.call_id から取り出され、無い場合は null になります。

actionType に入る値​

SDK でエージェントが metadata.actionType に指定できる値は、次の 7 つです。

actionType用途
command_executionコマンド実行
code_executionコード実行
file_operationファイル操作
browser_actionブラウザ操作
search_result検索結果
image_search画像プレビュー
markdown_displayMarkdown 表示

エージェント側の指定方法は イベント / ストリーミングガイド を参照してください。

actionType を指定しないツールイベントは Task になりません

actionType は SDK では任意指定です。しかしプラットフォームは、actionType を持たない Task を delta.tasks に含めず、その本文を delta.content として配信します。つまりエージェントが metadata.actionType を入れていない場合、ツール実行の情報は delta.tasks に一切現れません。

ツール実行の開始と完了を対応付ける

SDK ではツール実行の開始・完了を EventType.TOOL_START / TOOL_RESULT で表します。どちらも actionType には上の 7 値のいずれかが入るため、両者の対応付けには callId(metadata.call_id)を使ってください。同じ値を持つ 2 件が 1 つのツール実行を表します。

本文として届くもの​

次のイベントは、いずれも delta.content として届きます。種類を区別する情報は付きません。

SDK のイベントエージェント側の意図
`PROGRESS_MESSAGE`処理中のローディング表示
`THOUGHT_MESSAGE`エージェントの思考過程
`PHASE_START` / `PROGRESS_UPDATE`フェーズ開始・進捗更新
`COMPLETION_SUCCESS`最終応答の本文

最終的な回答も、途中経過も、思考過程も、すべて delta.content に流れます。API 利用者側でこれらを分離する手段はありません。最終応答だけを取り出したい場合は、finishReason: "stop" が付いたチャンクを待ってください。

終了とエラー​

SDK は、成功・失敗のどちらでも終端イベントとして COMPLETION_SUCCESS を送る設計です(COMPLETION_FAILURE はターンを閉じません)。したがってストリームは常に finishReason: "stop" で閉じます。エージェント側で発生したエラーは finishReason: "error" にはならず、エラー内容を含んだ delta.content として届きます。

後述の「エラーハンドリング」に記載した finishReason: "error" と SSE エラーチャンクは、プラットフォーム側で障害が起きた場合に限られます。

応答がどのように届くか​

マーケットプレイス版のエージェントは、実行結果をプラットフォームの Webhook(環境変数 WEBHOOK_URL 宛、HMAC 署名必須)に送信します。この Webhook のペイロードが、本ドキュメントに記載した SSE レスポンスの元データです。SDK(run_marketplace_agent / create_marketplace_handler)がこのペイロードを組み立てます。

SDK が送るもの外部 API に現れる場所
chunk_type: "task_created"delta.tasks[] の 1 要素
chunk_type: "content"delta.content。interaction_type を伴う場合は delta.interaction
deliverable_fileschoice.deliverables

プラットフォームが送る最初のチャンク​

会話を開始すると、エージェントが応答を返すより先に、プラットフォームがエージェントの起動を知らせる delta.content チャンクを 1 件配信します。文面はリクエストの言語に応じた固定文言で、日本語では「エージェント (エージェント名) がタスクを実行中です。」、英語では "Agent (name) is now executing your task." です。

このチャンクは Task にはなりません。actionType を持たないため delta.tasks には含まれず、delta.content としてのみ配信されます。エージェントが生成した文章ではない点に注意してください。

プラットフォームが除去するフィールド​

エージェントが送った値のうち、以下は外部 API に出る前に取り除かれます。

対象理由
_ で始まるすべてのキー(Task 直下・metadata 内を問わず)内部用途
user / taskId内部パイプライン用

files の各要素は、filename / size / filepath / mimeType の形に正規化されます(TaskFile 構造)。

クライアント実装の指針​

  • actionType による分岐は、接続先エージェントが実際に送る値を確認したうえで実装してください。上の 7 値は「指定できる値」であって、どれが送られるかはエージェント次第です。
  • 未知の actionType / metadata キーは安全に無視できる実装にしてください。エージェントの更新で新しい値が増えることがあります。
  • 表示だけが目的であれば、title / description / content と status だけで組み立てられます。この 4 つはどのエージェントでも同じ意味で入ります。
  • プログラムの分岐に title / description / content を使わないでください(人間可読なテキストのため)。

再接続​

進行中の会話の SSE ストリームに再接続します。ネットワーク切断後の復帰に使用します。

GET /v1/chat/completions/{conversationId}

使用例​

curl
# 進行中の会話に再接続
curl -N https://api.fd.agenticstar.tm.softbank.jp/api/v1/chat/completions/550e8400-e29b-41d4-a716-446655440000 \
-H "Authorization: Bearer $TOKEN"
備考

再接続は進行中の会話にのみ可能です。終了済みの会話には 404 Not Found が返ります。終了済みの会話の結果は、リソース API(GET /v1/conversations/{conversationId}/messages)で取得できます。

キャンセル​

進行中の会話をキャンセルし、エージェントの実行を中断します。

POST /v1/chat/completions/{conversationId}/cancel

使用例​

curl
curl -X POST https://api.fd.agenticstar.tm.softbank.jp/api/v1/chat/completions/550e8400-e29b-41d4-a716-446655440000/cancel \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json"

レスポンス​

JSON
{
"conversationId": "550e8400-e29b-41d4-a716-446655440000",
"cancelled": true
}

ストリーム側に流れるもの​

キャンセルが受理されると、接続中の SSE ストリームには次のチャンクが 1 件流れ、続けて data: [DONE] でストリームが終了します。

JSON
{
"createdAt": "2026-03-14T10:30:07.000Z",
"model": "AGENTIC STAR",
"choices": [{
"index": 0,
"delta": { "content": "Cancelled" },
"finishReason": "stop",
"cancelled": true
}]
}

delta.content は固定文言 "Cancelled" です。finishReason は "error" ではなく "stop" になるため、正常完了と区別するには choice.cancelled を見てください。

エラーハンドリング​

エラーは発生タイミングによって 2 種類のフォーマットで返されます。

ストリーム開始前のエラー(HTTP エラー)​

SSE 接続が確立される前に発生するエラーです。通常の HTTP レスポンスとして JSON 形式で返されます。

ステータス説明
400リクエストパラメータ不正(model, messages, stream等)
401認証トークンが無効または未指定
409指定した会話が現在処理中

HTTP 400 エラーレスポンス:

JSON
{
"error": {
"type": "invalid_request_error",
"message": "Parameter 'model' is required",
"code": "missing_parameter",
"param": "model",
"suggested_action": "Please provide the required parameter"
}
}

ストリーム中のエラー(SSE エラーチャンク)​

SSE ストリーミング中にバックエンドで発生したエラーです。finishReason が "error" に設定された ChatCompletionChunk として配信されます。

data: {
"createdAt": "2026-03-14T10:30:00.000Z",
"model": "AGENTIC STAR",
"choices": [{
"index": 0,
"delta": { "content": "An error occurred..." },
"finishReason": "error"
}]
}

data: [DONE]

リカバリー戦略​

エラー種別推奨アクション
HTTP エラー(400/401)リクエストパラメータまたは認証情報を確認して再送信
HTTP 409 Conflict会話の処理完了を待つか、キャンセルしてから再送信
SSE エラーチャンク新しいメッセージで会話を再開するか、別の会話を開始
接続断GET /v1/chat/completions/{conversationId} で再接続を試行

完全なレスポンス例​

ロールチャンク → プラットフォームの起動通知 → タスク → 最終チャンク、という典型的なシーケンスです。

// 1. ロールチャンク(最初の1回)
data: {
"createdAt": "2026-03-14T10:30:00.000Z",
"model": "AGENTIC STAR",
"choices": [{
"index": 0,
"delta": {
"role": "assistant",
"messageInfo": {
"conversationId": "550e8400-e29b-41d4-a716-446655440000",
"messageId": "660f9511-f3ac-52e5-b827-557766551111"
}
}
}]
}

// 2. プラットフォームが送る起動通知(エージェントの出力ではありません)
data: {
"createdAt": "2026-03-14T10:30:00.120Z",
"model": "AGENTIC STAR",
"choices": [{
"index": 0,
"delta": { "content": "エージェント 売上分析アシスタント がタスクを実行中です。" }
}]
}

// 3. ツール実行の開始(同じ callId で完了と対応します)
data: {
"createdAt": "2026-03-14T10:30:01.500Z",
"model": "AGENTIC STAR",
"choices": [{
"index": 0,
"delta": {
"content": "コマンドを実行しています",
"tasks": [{
"messageId": "660f9511-f3ac-52e5-b827-557766551111",
"conversationId": "550e8400-e29b-41d4-a716-446655440000",
"callId": "call-1",
"actionType": "command_execution",
"status": "in_progress",
"title": "コマンド実行",
"description": "コマンドを実行しています",
"metadata": { "call_id": "call-1", "command": "python3 analyze.py" },
"timestamp": 1710410001500,
"createdAt": "2026-03-14T10:30:01.500Z",
"updatedAt": "2026-03-14T10:30:01.500Z"
}]
},
"status": { "processing": true, "unfinished": true }
}]
}

// 4. ツール実行の完了(callId が 3 と同じ)
data: {
"createdAt": "2026-03-14T10:30:04.200Z",
"model": "AGENTIC STAR",
"choices": [{
"index": 0,
"delta": {
"content": "コマンドが完了しました",
"tasks": [{
"messageId": "660f9511-f3ac-52e5-b827-557766551111",
"conversationId": "550e8400-e29b-41d4-a716-446655440000",
"callId": "call-1",
"actionType": "command_execution",
"status": "completed",
"title": "コマンド実行",
"description": "コマンドが完了しました",
"metadata": { "call_id": "call-1", "command": "python3 analyze.py", "output": "rows=1204" },
"timestamp": 1710410004200,
"createdAt": "2026-03-14T10:30:04.200Z",
"updatedAt": "2026-03-14T10:30:04.200Z"
}]
},
"status": { "processing": true, "unfinished": true }
}]
}

// 5. 最終チャンク(成果物・ステータス付き)
data: {
"createdAt": "2026-03-14T10:30:05.456Z",
"model": "AGENTIC STAR",
"choices": [{
"index": 0,
"delta": { "content": "以上が分析結果です。" },
"finishReason": "stop",
"status": { "processing": false, "unfinished": false },
"deliverables": [{
"filename": "report.pdf",
"filepath": "/files/output/report.pdf",
"source": "agent",
"isPrimary": true,
"createdAt": "2026-03-14T10:30:05.000Z",
"mimeType": "application/pdf",
"size": 4201846
}]
}]
}

// 6. ストリーム終了
data: [DONE]