Nodaro ドキュメント
ドキュメントノードリファレンスモデルAI エージェント(MCP)開発者向けセルフホスティングリサーチ
REST API

パイプライン

REST でストーリー → 動画のパイプラインを開始し、各ステージを確認してゲートを承認し、監督とチャットして、完成したパイプラインをステージから分岐します。

Nodaro Cloud で利用できます

パイプライン API は、コードからストーリー → 動画(Story → Video)を実行します。1 行のストーリーを送信すると、パイプラインエンジンが脚本を書き、キャスト、小道具、ロケーションを作成し、ショットを計画します。続けて、キーフレームをレンダリングし、音声付きで動画化して、映画を結合します。各ステージは、あなたの承認を待って停止することも、自動で進むことも、監督とのチャットを開くこともできます。

パイプラインは Nodaro Cloud でのみ動作します。Community エディションと Business エディションでは 403 edition_required が返されます。セルフホスティング環境では、脚本生成(Generate Script)、画像生成(Generate Image)、動画生成(Generate Video)などのノードを使って、同じ手順をワークフローとして組み立てます。ルートにはベアラートークンが必要です。OAuth アプリのトークンには、以下に挙げるスコープが必要です。認証を参照してください。

エンドポイント

メソッドパススコープ説明
POST/v1/pipelinespipelines:executeパイプラインを作成し、開始します。
GET/v1/pipelinespipelines:read自分のパイプラインを、新しい順に一覧表示します。
GET/v1/pipelines/:idpipelines:readステータス、現在のステージ、クレジットを取得します。
GET/v1/pipelines/:id/eventspipelines:readパイプラインのイベントをストリーミングします(サーバー送信イベント)。
GET/v1/pipelines/:id/stages/:stagepipelines:read1 つのステージのステータス、出力、クリティックのフィードバックを取得します。
GET/v1/pipelines/:id/pending-approvalspipelines:read承認待ちのステージを一覧表示します。
GET/v1/pipelines/:id/timelinepipelines:read組み立てられた映画を取得します。シーン、長さ、オーディオです。
GET/v1/pipelines/:id/entities?type=pipelines:readパイプラインのキャラクター、オブジェクト、ロケーション、またはシーンを一覧表示します。
POST/v1/pipelines/:id/stages/:stage/approvepipelines:approveステージを承認します。任意で編集を加えられます。
POST/v1/pipelines/:id/stages/:stage/rejectpipelines:approveフィードバックを付けて脚本を却下し、書き直させます。
POST/v1/pipelines/:id/sub-gates/:gate/approvepipelines:approve動画化ステージの中のチェックポイントを承認します。
POST/v1/pipelines/:id/sub-gates/:gate/rejectpipelines:approveそのチェックポイントを却下し、パイプラインを停止します。
POST/v1/pipelines/:id/entities/:sceneId/helpers/accept_match_cut_breakpipelines:approveシーン画像ステージで、マッチカットの不連続を 1 件承認します。
POST/v1/pipelines/:id/stages/:stage/chatpipelines:approve監督にメッセージを送信します(ガイド付きモード)。
GET/v1/pipelines/:id/stages/:stage/chatpipelines:readステージのチャットを読み取ります。
POST/v1/pipelines/:id/stages/:stage/chat/turns/:turnId/applypipelines:approve監督が提案した変更を適用します。
POST/v1/pipelines/:id/branchpipelines:execute完了したパイプラインをステージから再実行し、新しいパイプラインにします。
POST/v1/pipelines/:id/forkpipelines:executeパイプラインを停止し、そのキャンバスを通常のノードとして残します。
POST/v1/pipelines/:id/cancelpipelines:execute実行中のパイプラインをキャンセルし、使われなかったクレジットを返還します。

ステージとモード

パイプラインは、8 つのステージを順番に進みます。パスの :stage には、次のいずれかの名前が入ります。

ステージ作られるもの
script構成案です。タイトル、シーン、キャスト、ロケーション、小道具です。
charactersキャストの役ごとのキャラクターです。
objectsストーリーに必要な小道具です。
locationsストーリーに登場するロケーションです。
shot_list各シーンのショットです。カメラと連続性の選択を含みます。
scene_images各ショットのキーフレームです。
animate_audio_edit動画化されたショットです。セリフ、ナレーション、音楽、編集を含みます。
post_merge最終的に結合された映画です。

作成時に選ぶ mode によって、パイプラインを誰が先に進めるかが決まります。

モード動作
manual(デフォルト)すべてのステージが awaiting_approval で停止します。承認、編集、却下のいずれかを行うと、パイプラインが先に進みます。
autoエンジンがすべてのステージを自分で実行します。クリティックが、脚本、キャスト・ロケーション・小道具の網羅性、キーフレームをチェックします。進行を止める判定が 3 回続くと、パイプラインは失敗し、使われなかったクレジットが返還されます。マッチカットの不連続があるときだけ停止し、すべての不連続が承認されるまで待機します。その間、status は running のままで、pending-approvals の一覧に scene_images ステージが含まれます。
guidedmanual と同じですが、script と post_merge のステージで監督とチャットできます。

パイプラインを開始する

POST /v1/pipelines は、パイプラインを作成してクレジットを確保し、開始します。{ id } とともに 201 を返します。

curl -X POST https://app.nodaro.ai/v1/pipelines \
  -H "Authorization: Bearer $NODARO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "root_node_id": "0e6b2f7c-4a1d-4c8e-9b3f-5d7a2c1e8f4b",
    "story_prompt": "A lighthouse keeper must restart the light before the storm hits.",
    "format": "short_film",
    "target_duration_seconds": 60,
    "mode": "auto",
    "output_resolution": "720p"
  }'
import { createClient, StaticTokenAuth } from '@nodaro/sdk'

const client = createClient({
  baseUrl: 'https://app.nodaro.ai',
  auth: new StaticTokenAuth(process.env.NODARO_API_KEY!),
})

const { id } = await client.pipelines.create({
  root_node_id: crypto.randomUUID(),
  story_prompt: 'A lighthouse keeper must restart the light before the storm hits.',
  format: 'short_film',
  target_duration_seconds: 60,
  mode: 'auto',
})
{ "id": "c2f8a4e6-1b9d-4f3a-8c7e-6d2b9f1a5e3c" }

Prop

Type

各 format には、使える長さの範囲があります。

形式最短最長
reel7 秒90 秒
commercial10 秒90 秒
trailer30 秒180 秒
short_film12 秒600 秒
music_video30 秒600 秒

パイプラインの進行を確認する

GET /v1/pipelines/:id は、パイプラインの状態を返します。数秒おきにポーリングするか、GET /v1/pipelines/:id/events を開いて、変化をサーバー送信イベントとして受け取ります。

{
  "id": "c2f8a4e6-1b9d-4f3a-8c7e-6d2b9f1a5e3c",
  "status": "running",
  "current_stage": "scene_images",
  "mode": "auto",
  "spent_credits": 412,
  "reserved_credits": 1180,
  "upfront_credit_estimate": 1650,
  "failure_reason": null,
  "current_progress_message": "Rendering keyframe 5 of 9",
  "branched_from_pipeline_id": null,
  "branched_from_stage": null
}

status は、queued、running、awaiting_approval、completed、failed、cancelled、forked のいずれかです。failure_reason は、failed になったパイプラインの理由を説明します。

パイプラインが completed になると、GET /v1/pipelines/:id/timeline は、レンダリングしたり編集アプリに渡したりできるデータとして、映画を返します。

{
  "fps": 24,
  "width": 1280,
  "height": 720,
  "scenes": [
    { "compositeUrl": "https://cdn.nodaro.ai/pipelines/scene-1.mp4", "durationSeconds": 8.5 },
    { "compositeUrl": "https://cdn.nodaro.ai/pipelines/scene-2.mp4", "durationSeconds": 11 }
  ],
  "musicUrl": "https://cdn.nodaro.ai/pipelines/score.mp3",
  "narrationUrl": "https://cdn.nodaro.ai/pipelines/narration.mp3"
}

動画化ステージの実行中は、timeline に animateProgress({ totalShots, shotsDone, percent })も含まれます。外部の編集アプリでカットを仕上げる方法については、タイムラインを書き出すを参照してください。

curl https://app.nodaro.ai/v1/pipelines/c2f8a4e6-1b9d-4f3a-8c7e-6d2b9f1a5e3c \
  -H "Authorization: Bearer $NODARO_API_KEY"

curl https://app.nodaro.ai/v1/pipelines/c2f8a4e6-1b9d-4f3a-8c7e-6d2b9f1a5e3c/timeline \
  -H "Authorization: Bearer $NODARO_API_KEY"
const pipeline = await client.pipelines.get(id)
console.log(pipeline.status, pipeline.current_stage)

const timeline = await client.pipelines.getTimeline(id)
for (const scene of timeline.scenes) {
  console.log(scene.compositeUrl, scene.durationSeconds)
}

ステージを承認または却下する

manual モードと guided モードでは、各ステージが awaiting_approval で停止します。GET /v1/pipelines/:id/pending-approvals は、待機中のステージを一覧表示し、それぞれ { stage_name, output } です。ステージの全体は GET /v1/pipelines/:id/stages/:stage で読み取り、{ status, output, critic_feedback } が返されます。

  • 承認する。POST /v1/pipelines/:id/stages/:stage/approve は { ok: true } を返し、パイプラインが先に進みます。先にステージの出力を変更するには、{ edits } を送信します。承認の前に出力に適用される JSON Patch です。
  • 却下する。却下できるのは脚本だけです。{ feedback } を付けて POST /v1/pipelines/:id/stages/script/reject を呼び出すと、{ ok: true } が返され、エンジンはその内容を踏まえて脚本を書き直します。ほかのステージでは 400 stage_not_implemented が返されます。脚本を却下できるのは最大 2 回で、脚本のクリティックによってすでに修正されている場合は、それより少なくなります。
curl -X POST https://app.nodaro.ai/v1/pipelines/c2f8a4e6-1b9d-4f3a-8c7e-6d2b9f1a5e3c/stages/script/approve \
  -H "Authorization: Bearer $NODARO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "edits": [{ "op": "replace", "path": "/title", "value": "The Last Light" }] }'

curl -X POST https://app.nodaro.ai/v1/pipelines/c2f8a4e6-1b9d-4f3a-8c7e-6d2b9f1a5e3c/stages/script/reject \
  -H "Authorization: Bearer $NODARO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "feedback": "Make the story darker and more suspenseful." }'
const approvals = await client.pipelines.pendingApprovals(id)
const { output } = await client.pipelines.getStage(id, 'script')

await client.pipelines.approveStage(id, 'script', [
  { op: 'replace', path: '/title', value: 'The Last Light' },
])
// or
await client.pipelines.rejectStage(id, 'script', 'Make the story darker and more suspenseful.')

動画化ステージの中のチェックポイント

manual モードと guided モードでは、animate_audio_edit ステージが、独自の 2 つのチェックポイントで停止することがあります。

  • dialogue_recheck。このステージは、セリフの実際の長さを計画と比較し、シーンのタイミングを調整します。シーンが目標の 10% 以内に収まらない場合、ステージはあなたの承認を待ちます。
  • silent_cut_preview。このステージは、音楽なしのカットのプレビューを組み立て、音楽を生成して料金が発生する前に、あなたの承認を待ちます。

POST /v1/pipelines/:id/sub-gates/:gate/approve はステージを再開し、{ ok: true, gate, resumed_at } を返します。POST /v1/pipelines/:id/sub-gates/:gate/reject は、ステージとパイプラインを失敗させ、使われなかったクレジットを返還します。auto モードでは、ステージは停止せずに続行します。

シーン画像ステージでのマッチカットの不連続

scene_images ステージは、3 つ目のチェックポイントである match_cut_break_pending で停止することがあります。2 つのショットの間で計画したマッチカットが成立しない場合、auto を含むすべてのモードで、ここで停止します。ステージの出力の match_cut_break_pending に、該当するショットが列挙されます。

上のサブゲートのルートでは、このチェックポイントを解除できません。これらのルートは 400 invalid_sub_gate を返し、エラーメッセージには、解除に使うルートが示されます。不連続は 1 件ずつ、{ "shotId": "<shot id>" } を付けて POST /v1/pipelines/:id/entities/:sceneId/helpers/accept_match_cut_break で承認します。sceneId は、そのショットを含むシーンの id で、metadata.scene_id ではありません。GET /v1/pipelines/:id/entities?type=scene はシーンを一覧表示し、各シーンのショットは metadata.scene_node_data.shots に含まれます。

不連続を承認するには pipelines:approve スコープが必要で、クレジットはかかりません。この呼び出しは { ok: true, pendingRemaining } を返します。pendingRemaining は、まだ待機中の不連続の数です。最後の 1 件を承認すると、ステージが続行します。

監督とチャットする

guided モードでは、承認待ちのステージにチャットがあります。POST /v1/pipelines/:id/stages/:stage/chat に { message } を付けて、最大 8,000 文字のメッセージを送信します。監督は 1 文で答え、変更を提案することもあります。

{
  "turnId": "f1a3c5e7-9b2d-4f6a-8c1e-3d5b7f9a2c4e",
  "role": "assistant",
  "content": "I moved the keeper's reason for staying into scene 2 and tightened the ending.",
  "proposed_change": {
    "change_type": "edit_artifact",
    "json_patch": [{ "op": "replace", "path": "/scenes/1/description", "value": "The keeper finds his late wife's log and decides to stay." }]
  }
}

proposed_change は、null、json_patch を持つ edit_artifact、または from_stage と reason を持つ suggest_branch のいずれかです。

ステージ監督が提案できる内容ターン数
script構成案への編集(タイトル、シーン、キャスト、ロケーション、小道具に対する JSON Patch)、または、パッチを当てるには構造的すぎる変更の場合は分岐です。パイプラインごとに 20
post_merge完成した映画の診断と、前のステージからの分岐です。映画自体にパッチを当てることはできません。パイプラインごとに 8

提案を受け入れるには、POST /v1/pipelines/:id/stages/:stage/chat/turns/:turnId/apply を呼び出します。{ applied: true, attemptId, newOutput } を返し、ステージを承認します。変更が構成案を壊す場合、たとえば、シーンでまだ使われているキャラクターを削除してしまう場合は、{ applied: false, error } が返され、監督が何を直せばよいかを説明するターンを追加します。有効ではない提案や、すでに待機中ではなくなったステージには、409 が返されます。GET /v1/pipelines/:id/stages/:stage/chat は、会話全体である { turns } を返します。

ガイド付きのパイプラインは、開始時にチャット用として 40 クレジットを追加で確保します。使わなかった分は返還されます。

curl -X POST https://app.nodaro.ai/v1/pipelines/c2f8a4e6-1b9d-4f3a-8c7e-6d2b9f1a5e3c/stages/script/chat \
  -H "Authorization: Bearer $NODARO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "message": "Make the keeper'\''s motivation clearer in scene 2." }'
const reply = await client.pipelines.chatStage(id, 'script', "Make the keeper's motivation clearer in scene 2.")
if (reply.proposed_change) {
  const result = await client.pipelines.applyChatProposal(id, 'script', reply.turnId)
  if (!result.applied) console.log(result.error.code)
}

完成したパイプラインを分岐する

POST /v1/pipelines/:id/branch は、completed になったパイプラインを 1 つのステージから再実行し、新しいパイプラインにします。fromStage より前のステージは承認済みとしてコピーされ、fromStage は実行を開始し、それ以降のステージは新しく作成されます。元のパイプラインは completed のままです。

分岐は、キャラクター、オブジェクト、ロケーションを新しいパイプラインにコピーしますが、画像ファイルは再利用するため、ファイルが重複することはありません。チャットは空の状態で始まります。

curl -X POST https://app.nodaro.ai/v1/pipelines/c2f8a4e6-1b9d-4f3a-8c7e-6d2b9f1a5e3c/branch \
  -H "Authorization: Bearer $NODARO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "fromStage": "scene_images" }'
const branch = await client.pipelines.branch(id, { fromStage: 'scene_images' })
console.log(branch.pipelineId, branch.clonedStages)

このルートは、{ pipelineId, clonedStages, clonedEntities } とともに 201 を返します。新しいパイプラインの id、承認済みとしてコピーされたステージ、コピーされたキャラクター、オブジェクト、ロケーションの数です。fromStage には、上の表にあるどのステージ名でも指定できます。

パイプラインをキャンセルまたはフォークする

  • キャンセルする。POST /v1/pipelines/:id/cancel は、実行中のパイプラインを停止し、まだ実行されていない作業分の確保済みクレジットを返還して、{ ok: true } を返します。すでに完了、失敗、キャンセルのいずれかの状態になったパイプラインでは 409 already_terminal が返され、何も変わりません。
  • フォークする。POST /v1/pipelines/:id/fork は、キャンバスをパイプラインの管理から外します。パイプラインが作成したすべてのノードは、編集できる通常のノードになり、使われなかったクレジットが返還され、status は forked になります。フォークは元に戻せません。引き続きエンジンを使うには、新しいパイプラインを開始してください。

クレジット

パイプラインは、開始時に見積もり額を確保します。upfront_credit_estimate に表示されます。spent_credits と reserved_credits は、実行の現在の状況を示します。キャンセルまたは失敗したパイプラインは、使わなかった分を返還し、max_cost_credits が合計の上限になります。クレジットを参照してください。

MCP と SDK から使う

SDK は、すべてのルートを client.pipelines.* としてラップしています。CLI にはパイプラインのコマンドはありません。AI アシスタントは、次の MCP ツールを使います。

ツールスコープ説明
start_pipelinepipelines:executeパイプラインを開始します。デフォルトの mode は auto です。
get_pipeline_statuspipelines:readステータス、ステージ、クレジットを読み取ります。
pipeline_pending_approvalspipelines:read承認待ちのステージを一覧表示します。
chat_pipeline_stage、apply_chat_proposalpipelines:approve監督とチャットし、提案を適用します。
get_pipeline_stage_chatpipelines:readステージのチャットを読み取ります。
branch_pipelinepipelines:execute完了したパイプラインを分岐します。

アシスタントから映画をガイド付きで監督する方法については、Film Director を参照してください。

エラー

ステータスコード意味
400validation_errorボディが無効です。たとえば、長さが 5 秒未満または 3,600 秒超の場合や、分岐の fromStage がステージ名ではない場合です。
400duration_out_of_bounds長さが format の範囲外か、600 秒を超えています。
400pipeline_not_completedcompleted ではないパイプラインから、分岐がリクエストされました。
400invalid_stageチャットの送信または読み取りで、script、shot_list、post_merge 以外のステージが指定されました。
400invalid_stage_name承認で、8 つのステージのいずれでもないステージが指定されました。そのようなステージを読み取ると、このコードとともに 404 が返されます。
400stage_not_implemented却下の呼び出しで、script 以外のステージが指定されました。
400invalid_change_type_for_stagepost_merge ステージに対してパッチが提案されました。このステージが受け付けるのは分岐だけです。
400invalid_sub_gateそのゲートは、サブゲートのルートで解除できるゲートではありません。match_cut_break_pending の場合は、各不連続を承認するルートがメッセージに示されます。
400shot_not_found不連続を承認するショットが、そのシーンにありません。
400not_a_match_cut不連続を承認するショットに、計画されたマッチカットがありません。
400invalid_entity_typeエンティティの一覧で、character、object、location、scene 以外の type が指定されました。
401unauthorizedトークンがないか、無効か、取り消されています。
402insufficient_creditsアカウントが、確保分の料金をまかなえません。
403edition_requiredこのインスタンスは Nodaro Cloud ではありません。
403insufficient_scopeOAuth アプリのトークンに、ルートが必要とするスコープがありません。
404not_foundあなたのパイプラインの中に、その id のものがありません。サブゲートの呼び出しでは、ステージがそのゲートで待機していないことも意味します。
404pipeline_not_found分岐の呼び出しで指定したパイプラインが、存在しないか、あなたのものではありません。
404stage_not_started読み取ろうとしたステージは、まだ開始されていません。
404stage_not_foundサブゲートの呼び出しで、対象のパイプラインの動画化ステージがまだ開始されていません。ステージの承認または却下では、このコードとともに 409 が返されます。
404scene_not_foundパイプラインに、その id のシーンがありません。
409patch_invalidチャットの提案が有効な変更ではなく、適用できませんでした。
409stage_not_awaitingチャットの提案を適用するとき、または編集付きで承認するときに、ステージがすでに承認待ちではありません。
409stage_already_advanced編集なしで承認するとき、または却下するときに、ステージがすでに承認待ちではありません。
409stage_not_awaiting_approvalサブゲートの呼び出しで、対象の動画化ステージが承認待ちではありません。
409already_terminalキャンセルの呼び出しで、対象のパイプラインがすでに完了、失敗、キャンセルのいずれかの状態です。
409critic_retry_cap_reached脚本は、あなたまたは脚本のクリティックによって、すでに 2 回修正されています。
409scene_not_plannedシーンにまだショットの計画がないため、そのシーンでは不連続を承認できません。
501chat_not_wired_for_stageステージに、動作するチャットがありません。現在、該当するのは shot_list だけです。

よくある質問

最終更新

目次