SimpliGen Docs
AI Agents

Control API リファレンス

SimpliGen がマシンで公開するローカル HTTP API。カスタム統合の構築と、ヘッドレス生成の実行に対応しています。

SimpliGen はアプリがオープンしている間、マシン上で小規模な HTTP Control API を実行します。これは MCP サーバー が通信する同じ API であり、直接公開されているため、アプリを最小化してトレイに格納した状態でも、独自のスクリプト、サービス、またはエージェントから SimpliGen を制御できます。

MCP と Control API の違い

AI エージェント (Claude、Codex など) に SimpliGen を使用させたいだけの場合は、代わりに MCP サーバー を設定してください。このサーバーは API をラップしています。任意の言語でカスタム統合を記述している場合は、Control API を直接使用してください。

ベース URL と検出

サーバーは ループバックのみ にバインドされ、デフォルトは以下です:

http://127.0.0.1:48199

そのポートが使用されている場合、SimpliGen は OS が割り当てたポートにフォールバックします。現在のポート (と API バージョン) は、常にアプリのユーザーデータディレクトリの検出ファイルに書き込まれます:

# Windows
%APPDATA%\simpligen\agent-api.json
# macOS
~/Library/Application Support/simpligen/agent-api.json
# Linux
~/.config/simpligen/agent-api.json
agent-api.json
{ "port": 48199, "version": 1 }

48199 をハードコードするのではなく、このファイルを読んで有効なポートを検出してください。

要件

Control API はアプリがオープンしており、マシンが エージェントアクセスを許可 されている (ライセンスの一部です) 場合にのみ実行されます。Host ヘッダーがループバックエイリアスの場合のみリクエストがサーブされます。それ以外の場合は 403 forbidden_host が返されます (DNS リバインディング対策)。

認証

GET /health を除くすべてのエンドポイントには、Authorization ヘッダーの ペアリングトークン が必要です:

Authorization: Bearer sg-agent-xxxxxxxx...

トークンをアプリの 設定 → エージェントの接続 で作成してください (エージェントの接続 を参照)。生のトークンは 1 回のみ 表示されます。ハッシュのみが保存されます。各トークンはクラウド生成用の使用額上限をオプションで持つことができます。アプリでトークンを取り消すと、即座に有効になります。

トークンが見つからないか無効な場合は 401 unauthorized が返されます。

規約

  • リクエスト: JSON ボディ (Content-Type: application/json)、最大 50 MB。
  • レスポンス: 常に JSON。
  • エラー: 2xx 以外のレスポンスは { "errorCode": "...", "message": "..." } の形式です。
  • ID: プリセットは presetId (+オプションの packId) でアドレス指定されます。ジョブは jobId でアドレス指定されます。

最小限の認証呼び出し:

TOKEN="sg-agent-..."
curl -s http://127.0.0.1:48199/status -H "Authorization: Bearer $TOKEN"

ヘルスチェック

GET /health

稼働確認プローブ。認証不要。

{ "ok": true, "name": "simpligen", "version": 1 }

機能

GET /capabilities

生成できるすべてのプリセットを一覧表示します。(preset, mediaType) ごとに 1 エントリ、入力、オプション、ローカル準備状況、クラウド適格性/コスト付き。

{
  "capabilities": [
    {
      "packId": "local-core-pack",
      "presetId": "z-image-turbo",
      "mediaType": "image",
      "name": "Z-Image Turbo",
      "description": "Ultra-fast, high-quality images in seconds",
      "apiProvider": null,
      "inputs": {
        "acceptsPrompt": true,
        "requiresPrompt": true,
        "requiresImage": false,
        "acceptsReferenceImages": null,
        "acceptsVideo": false,
        "acceptsAudio": false,
        "acceptsReferenceVideos": false,
        "acceptsReferenceAudios": false,
        "supportsLoras": true
      },
      "options": {
        "steps": null,
        "cfg": null,
        "duration": null,
        "resolution": null,
        "aspectRatio": ["1:1", "3:4", "4:3", "9:16", "16:9"]
      },
      "cloudAliasTo": null,
      "localReady": true,
      "cloudEligible": true,
      "cloudCost": 4
    }
  ]
}
フィールド意味
localReadyすべてのモデルファイルがインストールされています。プリセットは今すぐローカルで実行できます。
cloudEligibleプリセットは SimpliGen Cloud で実行できます。
cloudCostクラウド実行の概算クレジットコスト (適格でない場合は null)。
apiProvider外部 API プリセット (OpenAI、Google など) の場合は null 以外。これらは Control API が ディスパッチできない プリセットです。
inputs / optionsプリセットが受け入れるもの、および POST /generate に渡すことができるオプション範囲/アスペクト比。steps/cfg は高度な制御を公開するプリセットにのみ null 以外です。
inputs.requiresPrompt高度な制御が組み込まれているプリセット (カットアウト、頭部またはアウトフィット交換、アップスケール) の場合は false です: 空の prompt は有効で、送信するテキストは追加メモとして追加されます。

ステータス

GET /status

{
  "engineRunning": true,
  "engineVersion": "v0.26.0",
  "cloudConnected": true,
  "creditBalance": 1280,
  "activeProject": { "id": "default", "name": "My Project" },
  "characters": { "enabled": true, "base": 1, "edit": 1, "i2v": 1, "enhancePresets": 2 }
}

POST /engine/start

エンジンがまだ実行されていない場合、ローカルエンジンを開始します。ボディを取得しません。

{ "engineRunning": true, "engineVersion": "v0.37.0", "engineStarting": false }

コールドブートはリクエストが待機するより長くかかります。その場合、応答は 202 で engineStarting: true であり、エンジンはブートを続けるため、GET /status をポーリングして engineRunning が true になるまで待ってください。

既に実行されているエンジンを開始すると、200 で alreadyRunning: true が返され、何も変更されません。エンジンがインストールされていない場合、応答は 409 engine_not_installed です: インストールは数ギガバイトのダウンロードであり、API ではなくアプリのジョブのままです。エンジンが実行を拒否するマシンは 409 engine_unsupported_hardware で応答します。再試行しても修正されません。

POST /engine/stop

ローカルエンジンを停止し、その VRAM を解放します。クラウド生成は影響を受けません。既に停止しているエンジンを停止することは成功です。

POST /engine/restart

停止して再度開始します。ウェッジされたエンジンの場合、またはカスタムノードがインストールまたは削除された後。開始時と同じ 202 の動作をします (ブートがリクエストより長い場合)。

プロジェクト

プロジェクトは生成を保持するコンテナです。

GET /projects

{ "projects": [ { "id": "default", "name": "My Project", "slug": "my-project" } ] }

POST /projects

Request
{ "name": "Campaign assets" }

201 で { "project": { ... } } を返します。name は必須です (それ以外の場合は 400 invalid_options です)。

アップロード

入力 (ソース画像、参照画像、ソース動画) はローカルパスとして渡されません。まずバイトをアップロードして、返された ハンドル を POST /generate に渡してください。

POST /uploads

Request
{ "filename": "ref.png", "dataBase64": "<base64 of the file bytes>" }
Response (201)
{ "handle": "a1b2c3d4.png", "sizeBytes": 51234 }

最大アップロードは 100 MB です (413 asset_too_large)。サポートされていない拡張子は 400 unsupported_file_type を返します。

生成

POST /generate

生成をエンキューして、即座に jobId で返します。GET /jobs/:id をポーリング (ジョブ を参照) して結果を取得してください。

Request
{
  "presetId": "z-image-turbo",
  "packId": "local-core-pack",
  "mediaType": "image",
  "prompt": "a red fox in the snow, cinematic",
  "backend": "auto",
  "project": "default",
  "image": "a1b2c3d4.png",
  "referenceImages": [{ "handle": "e5f6.png", "label": "style" }],
  "loras": [
    { "name": "RoomLora", "weight": 0.85 },
    { "name": "Mia", "weight": 0.75 }
  ],
  "options": { "aspectRatio": "16:9", "steps": 8, "negativePrompt": "blurry, watermark" }
}
フィールド必須注釈
presetIdはいGET /capabilities から。
mediaTypeはい"image" または "video"。
packIdいいえ指定する場合、プリセットのパックと一致する必要があります。
prompt条件付きプリセットが inputs.requiresPrompt: false を報告しない限り必須です。これらのプリセットには組み込みの手順があります: "" を送信して実行するか、テキストを追加して追加メモを渡してください。
backendいいえ"auto" (デフォルト)、"local"、または "cloud"。Auto はインストールされている場合はローカルを優先し、それ以外の場合は接続されている場合はクラウドを優先します。
image条件付きアップロードハンドル。画像から X へのプリセット (inputs.requiresImage) に必須です。
video条件付きアップロードハンドル、動画入力プリセット用。
referenceImages条件付きハンドルまたは { handle, label } の配列、参照画像プリセット用。
audio条件付きアップロードハンドル、オーディオ駆動プリセット用 (リップシンク、オーディオ to ビデオ)。プリセットが acceptsAudio を報告する場合は必須です。それ以外の場合、ジョブは needs_audio で拒否されます。
audioStartSecondsいいえトラックの開始位置、秒単位。options の下でも受け入れられます。
referenceVideos条件付きハンドル、durationSeconds などの配列、参照クリッププリセット用。
referenceAudios条件付きハンドル、durationSeconds などの配列、参照音プリセット用。
lorasいいえ{ name, weight } の配列を適用します (プリセットで inputs.supportsLoras が true の場合)。name は GET /loras の LoRA の表示名またはファイル名と一致します。weight はデフォルトで LoRA のデフォルト強度にデフォルト設定されます。不明な名前は 400 unknown_lora を返します。今のところローカルバックエンドのみ。
projectいいえプロジェクト id または slug。アクティブなプロジェクトにデフォルト設定されます。
options.aspectRatioいいえプリセットのサポートされる比率の 1 つである必要があります。
options.steps / options.cfgいいえプリセットのアドバタイズされた範囲内。
options.negativePromptいいえネガティブプロンプト (UI の詳細設定ネガティブ)。トップレベルで negativePrompt としても受け入れられます。
options.durationSecondsいいえビデオの長さ。
options.resolutionいいえ解像度レベルラベル。
Response (201)
{ "jobId": "gen_abc123", "backend": "local", "status": "queued" }

クラウドジョブの場合、応答には "cloudCost": <credits> も含まれます。

バックエンド

外部 API プリセット (ここで apiProvider が null 以外、例: GPT Image 2、Veo) はディスパッチできません。400 unsupported_backend が表示されます。ローカルまたは SimpliGen Cloud プリセットを使用してください。クラウドは接続されたアカウントが必要です (400 cloud_not_connected)。ローカルはモデルがインストールされていることが必要です (400 preset_not_installed、まず準備してください)。

GET /loras

ユーザーがインストールした LoRA をリストアップするため、エージェントが POST /generate の loras 配列に渡すものを検出できます。name (表示名) でマッチングします。

Response
{
  "loras": [
    { "name": "RoomLora", "filename": "RoomLora_000002400.safetensors", "baseModel": "flux", "triggerWords": "a room", "defaultStrength": 0.9 },
    { "name": "Mia", "filename": "mia_v2.safetensors", "baseModel": "flux", "triggerWords": "mia", "defaultStrength": 1.0 }
  ]
}

LoRA がプリセットのベースモデル (baseModel) に適合する場所に渡し、プロンプトでそのトリガーワードを使用して起動してください。

ジョブ

GET /jobs/:id

{
  "job": {
    "jobId": "gen_abc123",
    "status": "completed",
    "backend": "local",
    "mediaType": "image",
    "presetId": "z-image-turbo",
    "projectId": "default",
    "resultUrl": "local-file:///C:/Users/you/.../output.png",
    "resultPath": "C:/Users/you/.../output.png",
    "errorMessage": null,
    "createdAt": "2026-06-25T20:00:00.000Z",
    "completedAt": "2026-06-25T20:00:08.000Z"
  }
}

status は queued、processing、completed、failed のいずれか。成功時は resultPath はデコードされたローカルファイルパスです。失敗時は errorMessage で理由が説明されます。不明な id は 404 job_not_found を返します。

GET /jobs

最新の 25 個のジョブを { "jobs": [ ...job... ] } として返します。

POST /jobs/:id/cancel

キューイング中/実行中のジョブをキャンセルします。{ "jobId", "status", "note?" } を返します。既に進行中のクラウドジョブはサーバーで完了する可能性があります (note に記載)。

プリセットの準備

ローカルプリセットは初回使用時にモデルファイルをダウンロードします。事前に準備できます。

POST /presets/prepare

Request
{ "presetId": "z-image-turbo", "mediaType": "image" }

200 { "status": "already_installed" } または 202 { "status": "started" } (ダウンロードはバックグラウンドで実行) を返します。

GET /presets/prepare

進行中のダウンロード: { "downloads": [ ... ] } を返します。このハンドル、または GET /capabilities (ウォッチ localReady) をポーリングしてください。プリセットが準備できるまで。

キャラクター

キャラクタースタジオもスクリプト可能です。キャラクターは ローカルのみ (クラウドは拒否されます)。キャラクター をコンセプトで参照してください。

エンドポイント目的
GET /charactersキャラクターをリスト表示。
GET /characters/:id1 つのキャラクターを取得。
GET /character-presetsインストール済みキャラクタープリセット (ベース/編集/i2v)。
GET /character-features利用可能な身元/外観特徴オプション。
POST /charactersキャラクターを作成 (説明から mode: "generate"、またはアップロード済みベース画像ハンドルから "upload")。
POST /characters/:id/generate-imageキャラクターの画像を生成 ({ prompt, aspect?, count?, presetId? })。
POST /characters/:id/generate-frame単一のビデオ開始フレームを生成。
POST /characters/:id/animateキャラクターをビデオにアニメーション化。
POST /characters/:id/presetキャラクターのデフォルトプリセットを設定。
POST /characters/:id/enhanceキャラクターアセットをアップスケール/強化。

すべての生成エンドポイントは POST /generate と同じく GET /jobs/:id でポーリングする jobId を返します。

レシピ

パックとプリセットのステップアウトマルチステップレシピ (フロー) を作成します。ビルディングブロック、高レベルの仕様から作成、およびオプションで公開を検出します。

エンドポイント目的
GET /recipe-blocksエントリーポイント、ステップとして使用可能なすべてのプリセット、ポートコントラクト付き。
POST /recipes/validatespec (作成+検証) または config のドライラン、保存なし。validation を返します。
POST /recipesspec から作成して下書きを保存。{ recipeId, valid, errors, config } を返します。
GET /recipesこのデバイス上のすべてのレシピ (ストアからインストール、またはここで作成) を一覧表示します。inputs (キー、種類、ラベル、必須、オプション) とステップカウント付き。
GET /recipes/:id1 つのレシピ、その完全設定、inputs および readiness (ステップごと: 実行するプリセット、ローカルにインストールされているかどうか)。
POST /recipes/:id/runレシピを実行。ボディ: { inputs: { key: value }, engine?: "local" | "cloud" | "auto" }。サブジェクト入力はキャラクターまたは製品 id を取ります。画像/ビデオ/オーディオ入力はアップロードハンドルを取ります。その他はすべて平文値を取ります。{ runId, status: "running", engine, steps, cloudCost? } を返します。クラウド実行は事前に価格設定され、トークンの使用額上限に対してカウントされます。
GET /recipes/:id/runsレシピの最近の実行 (最新順)。
GET /recipe-runs/:id実行のステータス: status (実行中、完了、失敗、キャンセル)、steps (各ステップはステータス、ジョブ id および結果パス付き)、最後のメディアステップが完了すると resultPath。
POST /recipe-runs/:id/cancel実行を停止。それ以上のステップが開始されません。ローカル進行中ステップが中断されます。
POST /recipes/:id/publishCreator Marketplace に提出 (接続されたアカウントが必要)。

製品とサブジェクト

レシピの subject 入力はキャラクターまたは製品のいずれかを取ります。製品は他のサブジェクトタイプです: ベース写真を持つ名前の付いたもの。Product Studio と UGC レシピで使用されます。

エンドポイント目的
GET /subjectsレシピが取ることができるすべてのサブジェクト: キャラクターと製品 (id、type、name、status)。
GET /products製品をリスト表示。
GET /products/:id1 つの製品を取得。
POST /productsアップロード写真から製品を作成: { name, image: <upload handle>, description?, category? }。説明とカテゴリはレシピプロンプトに組み込まれます。{ productId, product } を返します。
DELETE /products/:id製品とその写真を削除。

spec は高レベルの説明です。アプリは自動的にポートをワイヤリングし、ステップ間メディアチェーン、ステップごとのプロンプト入力、次に検証します。

POST /recipes request
{
  "spec": {
    "name": "Product to spinning video",
    "category": "product",
    "steps": [
      { "preset": "krea2-pack:krea2-turbo" },
      { "preset": "wan-2.2-video-pack:wan-2.2-i2v" }
    ]
  }
}
Response (201)
{
  "recipeId": "b1f2…",
  "valid": true,
  "errors": [],
  "config": { "blocks": [ "…" ], "inputs": [ "…" ], "output": { "from": "n2.video" } }
}

作成と保存にはクリエイターアカウントは不要です。POST /recipes/:id/publish は接続されたアカウントが必要で、ユーザーがアプリで 1 つを接続するまで not_connected (で needsConnect: true) を返します。同じドラフトはその後変更なく公開されます。レシピが使用するすべてのプリセットは配布可能なファーストパーティパックに属する必要があります。

使用額上限

トークンに使用額上限がある場合、クラウド生成は事前に価格設定され、残りの許可額を超える場合は拒否されます (402 exceeds_spend_cap)。コストを判定できない場合 (クラウドステータスが利用できない)、キャップ付きトークンはクローズド 503 cost_unknown で失敗します。ローカル生成は常にクレジットコストから無料です。

完全なフロー

BASE=http://127.0.0.1:48199
AUTH="Authorization: Bearer sg-agent-..."

# 1. Pick a ready preset
curl -s $BASE/capabilities -H "$AUTH"

# 2. Generate
JOB=$(curl -s $BASE/generate -H "$AUTH" -H 'Content-Type: application/json' \
  -d '{"presetId":"z-image-turbo","mediaType":"image","prompt":"a red fox in the snow","options":{"aspectRatio":"16:9"}}' \
  | jq -r .jobId)

# 3. Poll until done, then read resultPath
curl -s $BASE/jobs/$JOB -H "$AUTH" | jq '.job | {status, resultPath, errorMessage}'

エラーコード

HTTPerrorCode時期
400invalid_jsonボディは有効な JSON ではありません。
400invalid_options必須フィールドが見つからないか不正です。
400invalid_presetプリセット/パック/mediaType が一致しません。
400needs_*必須入力 (プロンプト、画像、参照) が見つかりません。
400invalid_handle入力は有効なアップロードハンドルではありませんでした。
400unsupported_backendプリセットは外部 API で実行されます。
400preset_not_installedローカルバックエンドが選択されたが、モデルがインストールされていません。
400cloud_not_connectedクラウドバックエンドが選択されたが、アカウントが接続されていません。
401unauthorizedトークンが見つからないか無効です。
402exceeds_spend_capクラウドコストがトークンの使用額上限を超えています。
403forbidden_hostループバック以外の Host ヘッダー。
404not_found / invalid_preset / job_not_found不明なルート、プリセット、またはジョブ。
413asset_too_large100 MB を超えるアップロード。
503cost_unknownキャップ付きトークン。クラウドコストを判定できませんでした。
500internal_error予期しないサーバーエラー。