GET /v1/models

GET /v1/models は cc-router が公開する固定の仮想モデル一覧を返します。この一覧は上流サブスクリプションを反映しません——Claude Code / Claude Desktop / Codex CLI / Open WebUI など、Anthropic または OpenAI プロトコルを話す任意のクライアントが、すべて同じ仮想モデルカタログを見られるようにするためのハードコードされたエイリアス表です。3 つの対話入口(/v1/messages、/v1/responses、/v1/chat/completions)はこの一覧を共有します。

対応バージョン:cc-router v3.0.0 以上。

設計変更(v3.0+:Anthropic + OpenAI フィールドスーパーセット)

同一パスを Anthropic SDK と OpenAI SDK / OpenAI Responses クライアント双方で使えるようにするため、cc-router は /v1/models を Anthropic /v1/models schema + OpenAI /v1/models schema のフィールドスーパーセットにしました:

フィールド由来プロトコル説明
type: "model"AnthropicAnthropic SDK が検査
id共通両側で使用
display_nameAnthropicAnthropic SDK が表示名に使う
created_at(ISO 文字列)Anthropicハードコード "2026-01-01T00:00:00Z"
object: "model"OpenAIOpenAI SDK が検査
created(Unix 秒)OpenAIハードコード 1767225600(= created_at と同時刻)
owned_by: "cc-router"OpenAIOpenAI SDK が owner 表示に使う

両 SDK とも extra: allow で未知フィールドを無視するため、同一 JSON が両側で合法です。

外側 wrapper もスーパーセット:

フィールド由来プロトコル
object: "list"OpenAI(list wrapper)
data: [...]共通
has_more: falseAnthropic(page wrapper)
first_id / last_idAnthropic

リクエスト

GET /v1/models
  • クエリパラメータなし、ボディなし
  • 認証なし(許可リスト、/health および全 OPTIONS プリフライトと同じ扱い)
  • レスポンス:200 OK、Content-Type: application/json

レスポンス

カタログは現在 30 件:Anthropic 形式 16 件 + OpenAI 形式 14 件。

{
  "object": "list",
  "data": [
    { "type": "model", "id": "model-fable",                 "display_name": "model-fable",                 "created_at": "2026-01-01T00:00:00Z", "object": "model", "created": 1767225600, "owned_by": "cc-router" },
    { "type": "model", "id": "model-opus",                  "display_name": "model-opus",                  "created_at": "2026-01-01T00:00:00Z", "object": "model", "created": 1767225600, "owned_by": "cc-router" },
    { "type": "model", "id": "model-sonnet",                "display_name": "model-sonnet",                "created_at": "2026-01-01T00:00:00Z", "object": "model", "created": 1767225600, "owned_by": "cc-router" },
    { "type": "model", "id": "model-haiku",                 "display_name": "model-haiku",                 "created_at": "2026-01-01T00:00:00Z", "object": "model", "created": 1767225600, "owned_by": "cc-router" },
    { "type": "model", "id": "claude-fable-5",              "display_name": "claude-fable-5",              "created_at": "2026-01-01T00:00:00Z", "object": "model", "created": 1767225600, "owned_by": "cc-router" },
    { "type": "model", "id": "claude-opus-4-7",             "display_name": "claude-opus-4-7",             "created_at": "2026-01-01T00:00:00Z", "object": "model", "created": 1767225600, "owned_by": "cc-router" },
    { "type": "model", "id": "claude-sonnet-4-6",           "display_name": "claude-sonnet-4-6",           "created_at": "2026-01-01T00:00:00Z", "object": "model", "created": 1767225600, "owned_by": "cc-router" },
    { "type": "model", "id": "claude-haiku-4-5",            "display_name": "claude-haiku-4-5",            "created_at": "2026-01-01T00:00:00Z", "object": "model", "created": 1767225600, "owned_by": "cc-router" },
    { "type": "model", "id": "anthropic/claude-fable-5",    "display_name": "anthropic/claude-fable-5",    "created_at": "2026-01-01T00:00:00Z", "object": "model", "created": 1767225600, "owned_by": "cc-router" },
    { "type": "model", "id": "anthropic/claude-opus-4-7",   "display_name": "anthropic/claude-opus-4-7",   "created_at": "2026-01-01T00:00:00Z", "object": "model", "created": 1767225600, "owned_by": "cc-router" },
    { "type": "model", "id": "anthropic/claude-sonnet-4-6", "display_name": "anthropic/claude-sonnet-4-6", "created_at": "2026-01-01T00:00:00Z", "object": "model", "created": 1767225600, "owned_by": "cc-router" },
    { "type": "model", "id": "anthropic/claude-haiku-4-5",  "display_name": "anthropic/claude-haiku-4-5",  "created_at": "2026-01-01T00:00:00Z", "object": "model", "created": 1767225600, "owned_by": "cc-router" },
    { "type": "model", "id": "anthropic/model-fable",       "display_name": "anthropic/model-fable",       "created_at": "2026-01-01T00:00:00Z", "object": "model", "created": 1767225600, "owned_by": "cc-router" },
    { "type": "model", "id": "anthropic/model-opus",        "display_name": "anthropic/model-opus",        "created_at": "2026-01-01T00:00:00Z", "object": "model", "created": 1767225600, "owned_by": "cc-router" },
    { "type": "model", "id": "anthropic/model-sonnet",      "display_name": "anthropic/model-sonnet",      "created_at": "2026-01-01T00:00:00Z", "object": "model", "created": 1767225600, "owned_by": "cc-router" },
    { "type": "model", "id": "anthropic/model-haiku",       "display_name": "anthropic/model-haiku",       "created_at": "2026-01-01T00:00:00Z", "object": "model", "created": 1767225600, "owned_by": "cc-router" },
    { "type": "model", "id": "gpt-5.6",                     "display_name": "gpt-5.6",                     "created_at": "2026-01-01T00:00:00Z", "object": "model", "created": 1767225600, "owned_by": "cc-router" },
    { "type": "model", "id": "gpt-5.5",                     "display_name": "gpt-5.5",                     "created_at": "2026-01-01T00:00:00Z", "object": "model", "created": 1767225600, "owned_by": "cc-router" },
    { "type": "model", "id": "gpt-5.4",                     "display_name": "gpt-5.4",                     "created_at": "2026-01-01T00:00:00Z", "object": "model", "created": 1767225600, "owned_by": "cc-router" },
    { "type": "model", "id": "gpt-5.4-mini",                "display_name": "gpt-5.4-mini",                "created_at": "2026-01-01T00:00:00Z", "object": "model", "created": 1767225600, "owned_by": "cc-router" },
    { "type": "model", "id": "gpt-5.6-sol",                 "display_name": "gpt-5.6-sol",                 "created_at": "2026-01-01T00:00:00Z", "object": "model", "created": 1767225600, "owned_by": "cc-router" },
    { "type": "model", "id": "gpt-5.6-terra",               "display_name": "gpt-5.6-terra",               "created_at": "2026-01-01T00:00:00Z", "object": "model", "created": 1767225600, "owned_by": "cc-router" },
    { "type": "model", "id": "gpt-5.6-luna",                "display_name": "gpt-5.6-luna",                "created_at": "2026-01-01T00:00:00Z", "object": "model", "created": 1767225600, "owned_by": "cc-router" },
    { "type": "model", "id": "openai/gpt-5.6",              "display_name": "openai/gpt-5.6",              "created_at": "2026-01-01T00:00:00Z", "object": "model", "created": 1767225600, "owned_by": "cc-router" },
    { "type": "model", "id": "openai/gpt-5.5",              "display_name": "openai/gpt-5.5",              "created_at": "2026-01-01T00:00:00Z", "object": "model", "created": 1767225600, "owned_by": "cc-router" },
    { "type": "model", "id": "openai/gpt-5.4",              "display_name": "openai/gpt-5.4",              "created_at": "2026-01-01T00:00:00Z", "object": "model", "created": 1767225600, "owned_by": "cc-router" },
    { "type": "model", "id": "openai/gpt-5.4-mini",         "display_name": "openai/gpt-5.4-mini",         "created_at": "2026-01-01T00:00:00Z", "object": "model", "created": 1767225600, "owned_by": "cc-router" },
    { "type": "model", "id": "openai/gpt-5.6-sol",          "display_name": "openai/gpt-5.6-sol",          "created_at": "2026-01-01T00:00:00Z", "object": "model", "created": 1767225600, "owned_by": "cc-router" },
    { "type": "model", "id": "openai/gpt-5.6-terra",        "display_name": "openai/gpt-5.6-terra",        "created_at": "2026-01-01T00:00:00Z", "object": "model", "created": 1767225600, "owned_by": "cc-router" },
    { "type": "model", "id": "openai/gpt-5.6-luna",         "display_name": "openai/gpt-5.6-luna",         "created_at": "2026-01-01T00:00:00Z", "object": "model", "created": 1767225600, "owned_by": "cc-router" }
  ],
  "has_more": false,
  "first_id": "model-fable",
  "last_id": "openai/gpt-5.6-luna"
}

モデル ID グループ

グループID対応する仮想モデル
仮想モデル短名model-fable / model-opus / model-sonnet / model-haikuそれぞれ同名のスロット
Anthropic バージョン名claude-fable-5 / claude-opus-4-7 / claude-sonnet-4-6 / claude-haiku-4-5model-fable / model-opus / model-sonnet / model-haiku
anthropic/ プレフィックス(バージョン名)anthropic/claude-{fable,opus,sonnet,haiku}-*同上
anthropic/ プレフィックス(短名)anthropic/model-{fable,opus,sonnet,haiku}同上
OpenAI バージョン名エイリアスgpt-5.6 / gpt-5.5 / gpt-5.4 / gpt-5.4-minimodel-fable / model-opus / model-sonnet / model-haiku
OpenAI ティアエイリアスgpt-5.6-sol / gpt-5.6-terra / gpt-5.6-lunamodel-fable / model-opus / model-sonnet
openai/ プレフィックス上記 2 グループの OpenAI エイリアスに openai/ を付けたもの、計 7 件同上
  • 一覧はあくまで例示用の名前で、解決はルールに基づいて行われるため、一覧にない書き方も使えます。たとえば claude-opus-4-8、gpt-6-sol も正しくルーティングされます。完全なルールは エンドポイント概要 → 仮想モデルとエイリアス を参照してください。
  • クライアントによっては、自分のプロトコル形式のモデル名しか表示しないものがあります。たとえば Claude Desktop のモデル検出は Anthropic 形式しか認識しないため「found 16 models」と表示されますが、これは正常です。

公式 /v1/models との相違点

項目cc-router公式 Anthropic / OpenAI
データソース固定の 30 ID(ソースにハードコード)その API Key でアクセス可能な全モデルを動的に返す
created_at / createdハードコード 2026-01-01T00:00:00Z / 1767225600各モデルの実際のリリース日時
ページングhas_more は常に false、before_id / after_id 非対応ページング対応
model-fallback一覧に含まれない(暗黙的にのみ発火可能)該当なし
フィールドAnthropic + OpenAI スーパーセット各自のフィールドのみ

固定の一覧を返すのは、任意の Anthropic / OpenAI クライアントが、cc-router にどの上流サブスクリプションが接続されているかにかかわらず常に同じ仮想モデル一覧を見られるようにするためです——これらはすべて cc-router の仮想モデルであり、実際のルーティングは POST /v1/messages、POST /v1/responses、POST /v1/chat/completions のタイミングで仮想モデルマッピングにより決定されます。


例

# 全仮想モデル ID を列挙
curl -s http://127.0.0.1:23456/v1/models | jq '.data[].id'

# OpenAI SDK 風で列挙
curl -s http://127.0.0.1:23456/v1/models | jq '.data[] | {id, owned_by}'

# Anthropic SDK 風で列挙
curl -s http://127.0.0.1:23456/v1/models | jq '.data[] | {id, display_name, created_at}'

GET /health

/health は cc-router 独自の診断口で、許可リストでは /v1/models と並んでいます。

GET /health
  • パラメータなし、ボディなし、認証なし
  • レスポンス:200 OK、Content-Type: text/plain; charset=utf-8、ボディは文字列 ok
$ curl -i http://127.0.0.1:23456/health
HTTP/1.1 200 OK
content-type: text/plain; charset=utf-8

ok

用途:

  • 起動スクリプトが cc-router の待受開始を検知する
  • リバースプロキシ(nginx / caddy)の upstream ヘルスチェック
  • ブラウザで手軽に生存確認

/health は JSON を返さず、内部状態(バージョン、サブスクリプション数、上流の健康状態など)も一切公開しません。これらの情報は Tauri IPC 経由で UI に渡されており、HTTP には露出させていません。