分析ランと status
ワークフローまたは analysis run を開始し、統一された status を polling し、kind-specific detail を読み取ります。
このガイドでは、run を開始し、terminal state まで polling し、semantic result を検証してから kind ごとの結果を読み取る方法を説明します。
すべての run には kind が必要です。値は workflow または analysis です。両方の kind が同じ top-level status を使います。
queued -> processing -> completed | failed | canceledkind-specific detail は workflow または analysis にあります。top-level status は polling を停止する時点を判断する唯一の値です。status は run が停止したことを示します。確認済みの answer が返ったことは示しません。completed の analysis run でも、result は uncertain または partial coverage になることがあります。
Workflow run を開始する
curl --fail-with-body -X POST "$BASE_URL/api/v1alpha1/runs" \
-H "Authorization: Bearer $DEEPFRAME_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: workflow-run-01" \
-d '{
"kind": "workflow",
"workflow_id": "wf_0190b5d4-7e1f-7a2b-9c3d-1234567890ab",
"source_snapshot": {"source_ids":["vid_0190b5d4-7e1f-7a2b-9c3d-1234567890ab"]},
"execute_now": true
}'202 response は受付を示します。完了は示しません。ワークフロー run は検出結果を作り、kind detail にワークフロー id と source snapshot を記録します。
Analysis run を開始する
保存済みの profile_id と report_template_id reference を使い、必要に応じて profile_version と report_template_version を指定します。Analysis で説明する方法です。POST /api/v1alpha1/runs では inline profile と report template body を拒否します。formats と admitted な execution_profile_ref も送ります。
Run を polling する
curl --fail-with-body "$BASE_URL/api/v1alpha1/runs/$RUN_ID" \
-H "Authorization: Bearer $DEEPFRAME_API_KEY"type ResultState = 'found' | 'not_found' | 'uncertain' | 'not_checked' | 'error';
type Run = {
kind: 'workflow' | 'analysis';
status: 'queued' | 'processing' | 'completed' | 'failed' | 'canceled';
analysis?: {
result_state?: ResultState;
reason_code?: string;
};
};
const terminal = new Set(['completed', 'failed', 'canceled']);
async function waitForRun(run_id: string): Promise<Run> {
while (true) {
const response = await fetch(`${baseUrl}/api/v1alpha1/runs/${run_id}`, {
headers: { Authorization: `Bearer ${apiKey}` },
});
if (!response.ok) throw new Error(`run read failed: ${response.status}`);
const run = await response.json() as Run;
if (terminal.has(run.status)) return run;
await new Promise((resolve) => setTimeout(resolve, 2_000));
}
}
const run = await waitForRun(RUN_ID);
if (run.status !== 'completed') throw new Error(`run did not complete: ${run.status}`);
if (run.kind === 'analysis' && run.analysis?.result_state !== 'found') {
throw new Error(
`run is not a successful checked result: ${run.analysis?.reason_code ?? 'result state is not found'}`,
);
}analysis run の processing 中の進捗は analysis.sub_state で確認します。workflow run は status より細かい進捗を報告しません。内部の処理段階は公開 contract の一部ではないためです。field がないことから terminal state を推測しないでください。
terminal response の後に、analysis answer を使う前に analysis.result_state と analysis.reason_code を確認してください。status: completed は execution が停止したことを示すだけで、semantic success を示しません。evidence-backed な positive result には analysis.result_state: found が必要です。uncertain、not_checked、error は success state ではありません。not_found は確認済みの negative にはなれますが、positive pass ではありません。各 answer の result_state、coverage、limitations、evidence も確認してから value を使ってください。
完了した analysis run に、確認済みの answer が 1 つもない場合があります。必要な evidence が利用できないか不完全な場合、または answer を確認する前に分析予算を使い切った場合に起きます。動画が長いと分析予算を使い切ることがあります。この場合、run は completed でも analysis.result_state は not_checked になり、1 つ以上の answer が result_state: not_checked になることがあります。reason_code と limitations を確認してから対応を決めてください。completed と uncertain または partial は success ではありません。
Answer の semantic result を検証する
report を作成または使用する前に、answer の full projection を読み取ります。次の expand[] は event 単位の evidence と、詳細な coverage と limitation を含む answer payload を返します。
ANSWERS="$(curl --fail-with-body --get "$BASE_URL/api/v1alpha1/runs/$RUN_ID/answers" \
-H "Authorization: Bearer $DEEPFRAME_API_KEY" \
--data-urlencode "expand[]=events" \
--data-urlencode "expand[]=events.evidence")"
if ! jq -e '
(.data | length > 0)
and all(.data[];
.result_state == "found"
and .coverage.state == "complete"
and ((.answer_payload.coverage.gaps // []) | length == 0)
and ((.answer_payload.limitations // []) | length == 0)
and (.evidence_count > 0)
)
' <<<"$ANSWERS" >/dev/null; then
echo "The run is not a clean, complete, evidence-backed result." >&2
exit 1
fiこれは full-scope の strict gate です。空でない limitations は隠さず確認してください。coverage.state が complete 以外の場合、または coverage.gaps が空でない場合は partial または limited であり、full-video の success ではありません。timeline answer では、すべての answer_payload.events[] と必須 attribute も確認してください。report が使う各 claim には result_state と timestamp 付きで review 可能な evidence reference が必要です。aggregate の evidence_count が 0 より大きいだけでは十分ではありません。
Result States
answer-level semantic result は 4 つの result state を使います。run-level の analysis.result_state には、trustworthy な result が得られる前に execution が失敗した場合の error も含まれます。下の presentation table は answer-level state にだけ適用され、言い換えるだけで reclassify しません。
| Machine state | 日本語での presentation |
|---|---|
found / present | status line は表示せず、内容自体を表示します。 |
not_found | 「この動画では確認されませんでした」と、確認したエビデンス件数を表示します。 |
uncertain | 「検証できませんでした」と、主な理由を平易な言葉で表示し、machine code は JSON artifact を参照します。 |
not_checked | 「分析されていません」と理由を表示します。 |
| Limitations | 「この分析に関する注記」の一覧を平易な言葉で表示し、machine code は JSON に残します。 |
JSON の answer、report、manifest には machine state、reason code、limitation code を保持します。reader には平易な presentation を使い、code-level の詳細が必要な場合は JSON artifact を参照してください。
Reason Code を読む
reason_code は result_state の理由を示します。次の値が DeepFrame API の reason code です。
| Code | 意味 | 呼び出し側の対応 |
|---|---|---|
manifest_unavailable | 必要な evidence の情報を利用できませんでした。 | 入力が利用可能になってから retry してください。繰り返す場合は support に連絡してください。 |
tenant_context_invalid | 有効なワークスペース context が request にありません。 | API キーとワークスペースの access を確認して retry してください。 |
not_applicable | 選択した動画には request が適用されません。 | request または動画を変更しない限り retry は不要です。 |
no_required_evidence | request に必須の evidence がないため、evidence の確認を実行していません。 | result を not checked として扱ってください。evidence に基づく result が必要な場合は request を変更してください。 |
requirements_satisfied | 必要な evidence の条件をすべて満たしました。 | retry は不要です。result と evidence を読み取ってください。 |
required_evidence_backfill | answer を確認するために追加の evidence が必要でした。 | terminal result を待ってください。not_checked のままなら、必要な evidence を持つ動画で retry してください。 |
backfill_capability_unavailable | 不足している必要な evidence を取得できませんでした。 | 必要な evidence を持つ動画を使って retry してください。 |
backfill_not_authorized | 不足している evidence の取得が許可されませんでした。 | API キーの permission とワークスペース access を確認して retry してください。 |
budget_exhausted | answer を確認する前に分析予算を使い切りました。十分に長い動画で起きることがあります。 | answer を not_checked として扱ってください。動画の範囲を狭くするか、answer の数を減らして retry してください。 |
execution_failed | result を生成する処理が失敗しました。 | answer を not_checked として扱ってください。繰り返す場合は support に連絡してください。 |
required_evidence_not_extracted | answer に必要な evidence を利用できませんでした。 | 必要な evidence を持つ動画を使って retry してください。 |
optional_evidence_unavailable | 任意の evidence を利用できませんでした。必須の evidence があれば answer を支えられる場合があります。 | limitation を付けて answer を使うか、任意の evidence を持つ動画で retry してください。 |
coverage_state_invalid | evidence coverage を正しく判定できませんでした。 | retry してください。繰り返す場合は support に連絡してください。 |
present | 必要な evidence が存在しました。 | retry は不要です。result と evidence を読み取ってください。 |
index_profile_incomplete | 選択した動画に request が必要とする evidence の種類がすべてありません。 | 必要な evidence を持つ動画を選ぶか request を変更してください。 |
conflicting_evidence | 利用できる evidence が相反する result を示しています。 | answer を uncertain として扱い、evidence を確認してください。 |
capability_not_implemented | 要求した answer type は利用できません。 | 利用可能な answer type を選ぶか support に連絡してください。 |
未知の reason code は fatal として扱わず、result_state と limitations を読み取って対応してください。
Run を cancel する
curl --fail-with-body -X POST "$BASE_URL/api/v1alpha1/runs/$RUN_ID/cancel" \
-H "Authorization: Bearer $DEEPFRAME_API_KEY" \
-H "Idempotency-Key: run-cancel-01"cancel は非同期です。top-level status が canceled になるまで polling してください。
Result を読む
- ワークフロー run:
GET /api/v1alpha1/findings?run_id={run_id}。VIEW_INSIGHTSを使います。 - analysis run:
GET /api/v1alpha1/runs/{run_id}/answers。VIEW_INSIGHTSを使います。 - presentation: 完了後に自動生成された artifact を読み取ります。別の presentation が必要な場合だけ
POST /api/v1alpha1/runs/{run_id}/reportsで明示的に rerender し、分析ガイド で persisted artifact を一覧して取得します。
analysis run では、answer の value を使う前に result_state、reason_code、coverage、limitations、evidence を確認してください。uncertain、not_checked、または partial coverage の answer は success ではありません。not_found は確認済みの negative にはなれますが、positive pass ではありません。
list operation は {data, next_cursor, has_more} envelope を使います。規約 を参照してください。