接入失败的原因九成不在代码,而在这三个信息的组合不对:Base URL 少了 /v1、模型名不是对方站里的名字、或者拿 OpenAI 的写法去请求 Anthropic 兼容接口。下面按「最小可运行」给三种写法,并告诉你怎样确认自己真的打到了想用的模型。
先确认三个信息
- Base URL(接口地址)
- 中转站控制台会给,形如 https://example.com/v1;多数 OpenAI 兼容接口要求以 /v1 结尾
- API Key(密钥)
- 通常以 sk- 开头;本站所有检测都建议用临时 Key,不要用主力 Key
- 模型名
- 必须用对方站里列出的名字,例如 claude-sonnet-4-5、gpt-5、deepseek-chat;自动补全或猜测的名字一定失败
写法一:curl(最快确认链路通不通)
curl https://<你的站>/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sk-xxxx" \
-d '{
"model": "<站内模型名>",
"messages": [{"role": "user", "content": "只回复两个字:你好"}],
"max_tokens": 32
}'返回 JSON 里 200 且 choices[0].message.content 有内容,说明地址、Key、模型名三者都对。HTTP 状态码的含义见 报错速查表,例如 404 多半是模型名不对,401 是 Key 不对。
写法二:Python(OpenAI SDK)
from openai import OpenAI
client = OpenAI(
api_key="sk-xxxx",
base_url="https://<你的站>/v1", # 注意 /v1
)
resp = client.chat.completions.create(
model="<站内模型名>",
messages=[{"role": "user", "content": "只回复两个字:你好"}],
max_tokens=32,
)
print(resp.model) # 服务端实际使用的模型名,重点看这个
print(resp.usage) # prompt / completion / 缓存 token 明细
print(resp.choices[0].message.content)写法三:Anthropic 兼容接口
Claude 系列在多数中转站走 Anthropic 原生协议,路径是 /v1/messages,用 x-api-key 而不是 Authorization,并必须带 anthropic-version 头:
curl https://<你的站>/v1/messages \
-H "content-type: application/json" \
-H "x-api-key: sk-xxxx" \
-H "anthropic-version: 2023-06-01" \
-d '{
"model": "claude-sonnet-4-5",
"max_tokens": 64,
"messages": [{"role": "user", "content": "只回复两个字:你好"}]
}'两种协议的差别集中在三处:请求头(x-api-key vs Authorization)、路径(/v1/messages vs /v1/chat/completions)、以及返回结构(content 数组 vs choices)。把 OpenAI 的写法发到 /v1/chat/completions 去请求 Claude,如果站点做了兼容层可能通,没做就是 404。
怎样确认打到的真是你要的模型
- 看返回体的 model 字段服务端实际用的模型名会回传,与你请求的名字不一致时,先怀疑站点做了映射。
- 跑一条只有该模型知道的问题比如让它输出自己的知识截止日期或特定格式,用同题在官方渠道对比一次。
- 看 usage 的缓存字段连续两轮同前缀请求,第二轮应出现缓存读取命中;完全没有缓存字段,说明这条链路不走缓存。
- 核对扣费按站方公示单价算出应扣金额,与面板余额变化逐笔对照。
第一次就卡住的四种情况
| 现象 | 多半原因 | 怎么改 |
|---|---|---|
| 404 model not found | 模型名不是该站的名字 | 复制站内模型列表里的原名,不要用别家的写法 |
| 401 / invalid api key | Key 复制带了空格、用了别的站的 Key | 重新复制完整 Key,确认没有换行 |
| 连接超时 / SSL 错误 | 地址写错、少了 /v1、或本机代理拦截 | 先 curl 单测;本地代理开着时注意别让代理吞掉域名 |
| 返回正常但内容是空的 | max_tokens 太小、或触发了内容过滤 | 把 max_tokens 调到 64 以上再试 |
常见问题
Base URL 到底要不要带 /v1?
看对方的文档,多数 OpenAI 兼容接口要带;不带时有的站会自动跳转,有的直接 404。判断方法:直接 curl 两个地址各试一次,哪个返回正常 JSON 用哪个。
同一次调用能不能只发一次请求?
验证阶段建议先串行单发,确认可用再上并发。并发测试容易触发 429,把「配置不对」和「被限流」混在一起,反而查不清。
为什么返回的 model 字段和请求的不一样?
两种可能:站点做了模型名映射(把便宜模型挂到贵模型名下),或上游做了版本别名。前者属于掉包,务必用同题对比或第三方检测交叉验证。