GET /v1/models

GET /v1/models 返回 cc-router 对外暴露的固定虚拟模型清单。该清单反映上游订阅,而是一份硬编码的别名表,用于让 Claude Code / Codex CLI / 任何讲 Anthropic 或 OpenAI 协议的 SDK 看到一致的虚拟模型列表。

适用版本: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
  • 无 query 参数、无 body
  • 无鉴权(白名单,与 /health、所有 OPTIONS 同列)
  • 响应:200 OKContent-Type: application/json

响应

数据条目当前共 18 条(2026-05 起增加 6 个 OpenAI Responses 兼容入口别名):

{
  "object": "list",
  "data": [
    { "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-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-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-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.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": "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" }
  ],
  "has_more": false,
  "first_id": "model-opus",
  "last_id": "openai/gpt-5.4-mini"
}

模型 ID 分组

分组ID(共 18 条)命中虚拟模型
Anthropic 短名model-opus / model-sonnet / model-haikumodel-opus / model-sonnet / model-haiku
Anthropic 版本号claude-opus-4-7 / claude-sonnet-4-6 / claude-haiku-4-5model-opus / model-sonnet / model-haiku
anthropic/ 前缀(版本号)anthropic/claude-{opus,sonnet,haiku}-*同上
anthropic/ 前缀(短名)anthropic/model-{opus,sonnet,haiku}同上
OpenAI 别名(v2.3+ 新增)gpt-5.5 / gpt-5.4 / gpt-5.4-minimodel-opus / model-sonnet / model-haiku
OpenAI openai/ 前缀openai/gpt-5.5 / openai/gpt-5.4 / openai/gpt-5.4-mini同上

完整映射规则见 Anthropic /v1/messages → 虚拟模型映射


与官方 /v1/models 的差异

差异点cc-router官方 Anthropic / OpenAI
数据来源固定 18 个 ID(硬编码在源码)动态返回该 API Key 可访问的全部模型
created_at / created硬编码 2026-01-01T00:00:00Z / 1767225600各模型真实发布时间
分页has_more 永远 false,无 before_id / after_id 支持支持分页
model-fallback不在列表中(只能隐式触发)不适用
字段Anthropic + OpenAI 超集各自只有自己字段

返回这 18 个 ID 是为了让 CC / 任何 Anthropic 客户端 / 任何 OpenAI Responses 客户端不管接 cc-router 哪个上游订阅,看到的可用模型清单都一致——它们都是 cc-router 的虚拟模型,真实路由在 POST /v1/messagesPOST /v1/responses 时按虚拟模型映射决定。


示例

# 列出所有虚拟模型 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
  • 无参数、无 body、无鉴权
  • 响应:200 OKContent-Type: text/plain; charset=utf-8,body 为字符串 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 check
  • 浏览器手动验证服务存活

/health 不返回 JSON,也不暴露内部状态(版本号、订阅数、上游健康等都没有)。这些信息走 Tauri IPC 给 UI 用,不通过 HTTP 暴露。