AI API 调用报“模型不可用”?先别急着换模型,可能是 /chat/completions、/responses、/messages 用错了
AI API 调用报“模型不可用”?先别急着换模型,可能是 /chat/completions、/responses、/messages 用错了
很多人在配置 AI 工具、中转 API、OpenAI 兼容接口的时候,会碰到一个很烦的问题:
model unavailable
unsupported endpoint
invalid request body
not found
schema mismatch
看起来像是模型不能用,或者服务挂了。
但实际排查下来,经常不是模型问题,而是接口端点和请求格式没对上。
尤其是下面这三个 endpoint,非常容易被混用:
/v1/chat/completions
/v1/responses
/v1/messages
它们名字都像“聊天接口”,但其实分别对应不同的 API 体系。
如果你把 A 体系的请求体发到 B 体系的 endpoint,就算模型真实存在,也可能报“模型不可用”。
这篇文章不讲太多概念,直接按排错思路讲:什么时候该用哪个端点,以及怎么判断自己填错了。
一句话判断
先给最重要的结论:
OpenAI 兼容工具:用 /v1/chat/completions
OpenAI Responses API:用 /v1/responses
Anthropic / Claude 原生工具:用 /v1/messages
如果你用的是普通 AI 客户端,比如各种聊天 UI、Cursor 类工具、FastGPT、LiteLLM、OpenAI SDK 兼容模式,一般优先考虑:
/v1/chat/completions
如果文档明确写了 Responses API,再考虑:
/v1/responses
如果工具明确是 Claude / Anthropic 原生 SDK,再考虑:
/v1/messages
为什么明明模型存在,却会提示不可用?
因为一次 API 请求不是只有模型名。
它至少包含三部分:
1. 模型名
2. endpoint
3. 请求体 schema
这三个必须匹配。
举个例子:
你选了一个 Claude 模型,但你的工具是 OpenAI-compatible 客户端。这个时候它可能应该走:
/v1/chat/completions
而不是:
/v1/messages
反过来,如果你的工具是 Anthropic 原生 SDK,代码里写的是 Claude Messages API 格式,那你把 endpoint 改成 /v1/chat/completions 也可能失败。
所以不要只看模型名。
更准确的判断方式是:
客户端类型 + endpoint + 请求格式
这三个要一致。
第一类:/v1/chat/completions
这是最常见的 OpenAI 兼容聊天接口。
典型请求格式:
{
"model": "gpt-5.5",
"messages": [
{
"role": "user",
"content": "帮我解释一下 API endpoint 的区别"
}
]
}
完整 curl 示例:
curl https://crazyrouter.com/v1/chat/completions \
-H "Authorization: Bearer $CRAZYROUTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-5.5",
"messages": [
{"role": "user", "content": "帮我解释一下 API endpoint 的区别"}
]
}'
它的特点是:
messages 数组
role 字段
content 字段
适合场景:
- 工具支持 OpenAI-compatible API;
- 配置里有
OPENAI_BASE_URL; - 配置里有
base_url; - 用 OpenAI SDK 的兼容模式;
- 用 Chatbox、Cherry Studio、Cursor 类客户端;
- 用 FastGPT、LiteLLM、各种 Web UI;
- 通过一个 API 网关调用多个模型。
大多数人接中转站,默认应该先试这个。
第二类:/v1/responses
/v1/responses 是 OpenAI 新版 Responses API。
它不是 /chat/completions 的简单改名,而是一套新的响应结构。
典型请求格式:
{
"model": "gpt-5.5",
"input": "解释一下 Responses API 和 Chat Completions 的区别"
}
完整 curl 示例:
curl https://crazyrouter.com/v1/responses \
-H "Authorization: Bearer $CRAZYROUTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-5.5",
"input": "解释一下 Responses API 和 Chat Completions 的区别"
}'
它的特点是:
input 字段
response item
tools / reasoning / multimodal 等新版结构
适合场景:
- 工具文档明确写 OpenAI Responses API;
- 示例代码里用的是
input; - 工具明确调用
/v1/responses; - 需要新版工具调用、多模态、reasoning 输出;
- 模型和服务端都支持 Responses API。
常见错误是:
{
"model": "xxx",
"messages": []
}
直接发到:
/v1/responses
这样就可能报请求体不合法。
第三类:/v1/messages
/v1/messages 是 Anthropic Claude 原生 Messages API 风格。
典型请求格式:
{
"model": "claude-sonnet-4-6",
"max_tokens": 1024,
"system": "You are a helpful assistant.",
"messages": [
{
"role": "user",
"content": "解释一下 Claude Messages API"
}
]
}
完整 curl 示例:
curl https://crazyrouter.com/v1/messages \
-H "Authorization: Bearer $CRAZYROUTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "claude-sonnet-4-6",
"max_tokens": 1024,
"system": "You are a helpful assistant.",
"messages": [
{"role": "user", "content": "解释一下 Claude Messages API"}
]
}'
它的特点是:
顶层 system
max_tokens
Anthropic 风格 content block
Claude 原生 schema
适合场景:
- 使用 Anthropic SDK;
- 工具文档明确写 Claude Messages API;
- 工具不是 OpenAI-compatible,而是 Claude-native;
- 请求体里有顶层
system; - 需要 Anthropic 原生工具调用或内容块格式。
注意一个重点:
Claude 模型 ≠ 一定要用 /v1/messages
如果你是在 OpenAI 兼容客户端里调用 Claude 模型,可能还是应该用:
/v1/chat/completions
Base URL 不要和 endpoint 混在一起
这个坑比 endpoint 本身还常见。
很多工具让你填的是:
Base URL
OPENAI_BASE_URL
base_url
OpenAI API Base
这种情况一般填:
https://crazyrouter.com/v1
不要填:
https://crazyrouter.com/v1/chat/completions
原因是 SDK 会自己拼 endpoint。
比如你填:
https://crazyrouter.com/v1
SDK 会请求:
https://crazyrouter.com/v1/chat/completions
如果你直接把完整 endpoint 填进去,有些 SDK 会拼成:
https://crazyrouter.com/v1/chat/completions/chat/completions
然后就开始报 404 或 endpoint not found。
判断规则:
字段叫 Base URL:填到 /v1
字段叫 Full Endpoint:按要求填完整路径
常见错误排查表
| 错误配置 | 常见报错 | 正确做法 |
|---|---|---|
Base URL 填成 https://crazyrouter.com |
404 / route not found | 改成 https://crazyrouter.com/v1 |
Base URL 填成 /v1/chat/completions |
路径重复 | Base URL 只填到 /v1 |
Chat 请求体发到 /v1/responses |
invalid request body | 改用 /v1/chat/completions 或改成 input 格式 |
Claude 原生请求体发到 /v1/chat/completions |
schema mismatch | 改用 /v1/messages 或转换格式 |
OpenAI SDK 调 /v1/messages |
响应解析失败 | OpenAI 兼容模式用 /v1/chat/completions |
| API endpoint 加了 UTM | 鉴权/路由异常 | UTM 只能加网页链接,不能加 API 地址 |
Crazyrouter 普通用户应该怎么填?
如果你只是使用普通 OpenAI 兼容客户端,推荐这样填:
API Key: 你的 Crazyrouter API Key
Base URL: https://crazyrouter.com/v1
Model: 从模型列表选择
如果你在国内/内地网络环境下 global 地址不稳定,可以使用:
Base URL: https://cn.crazyrouter.com/v1
注意,API 地址不要加 UTM 参数。
网页链接可以加 UTM,比如:
https://crazyrouter.com/models?utm_source=csdn&utm_medium=article&utm_campaign=api_endpoints_v2
但是 API 地址不要写成:
https://api-endpoint.example.invalid/v1?utm_source=csdn
出问题时按这个顺序排查
1. 先确认模型名
模型名必须完全一致,包括:
- 大小写;
- 横线;
- 版本号;
- 后缀。
不要自己猜模型名。
2. 再确认客户端类型
看工具文档或配置项。
如果它写的是:
OpenAI Base URL
OPENAI_BASE_URL
OpenAI-compatible
大概率是 OpenAI 兼容模式。
如果它写的是:
Anthropic API Key
Claude Messages API
/v1/messages
大概率是 Claude 原生模式。
3. 确认 endpoint
OpenAI 兼容:/v1/chat/completions
Responses API:/v1/responses
Claude 原生:/v1/messages
4. 确认请求体
Chat Completions:
{
"model": "xxx",
"messages": []
}
Responses:
{
"model": "xxx",
"input": "xxx"
}
Claude Messages:
{
"model": "xxx",
"max_tokens": 1024,
"system": "xxx",
"messages": []
}
5. 确认 Base URL
大多数工具里应该填:
https://crazyrouter.com/v1
而不是完整 endpoint。
最后总结
遇到“模型不可用”,不要第一时间就认定是模型挂了。
先检查这三个东西:
模型名
endpoint
请求 schema
最常用的判断方式:
OpenAI 兼容工具 → /v1/chat/completions
OpenAI Responses API → /v1/responses
Claude 原生工具 → /v1/messages
尤其要注意:
Claude 模型不一定走 /v1/messages
OpenAI 兼容客户端不应该乱填完整 endpoint
Base URL 通常只填到 /v1
很多调用失败,看起来像模型不可用,本质上只是端点和请求格式没匹配。
把这几个地方对齐,问题通常就能解决。
参考链接:
https://crazyrouter.com/zh/blog/chat-completions-vs-responses-vs-messages-api-zh?utm_source=csdn&utm_medium=article&utm_campaign=api_endpoints_v2
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)