直接答案
400 表示服务端已经收到请求,但无法按当前接口契约处理;先保留响应体中的错误类型和参数名,再缩减请求。
这篇内容解决什么问题
解决 invalid_request_error、JSON 解析失败、参数不兼容和接口路径错误导致的 HTTP 400。
先确认症状与影响范围
请求立即返回 400 Bad Request,响应体常带有 invalid_request_error、具体参数名或 JSON 解析信息。它与 DNS、TLS、超时不同,说明 HTTP 请求通常已经到达某个可响应的服务。
同一 Key 的简单模型列表请求成功,而带 tools、stream、response_format 或复杂消息的生成请求失败,通常更接近请求结构或目标模型能力问题。
- 保存状态码、响应体、request ID 和发生时间,不只保存客户端包装后的最后一行。
- 确认失败发生在
/responses、/chat/completions还是其他路径。 - 确认相同请求在关闭可选参数后是否成功。
常见原因与责任边界
400 的根因位于“请求可到达,但契约不被接受”这一层。兼容 API 不一定支持官方接口的所有参数,不能只凭 SDK 类型检查判断服务端一定接受。
- JSON 缺少必填字段、类型不正确、尾随逗号或请求体被二次编码。
- Base URL 与 SDK 自动拼接路径组合错误,请求打到了错误的接口。
- 模型不支持 tools、图片、结构化输出或某个采样参数。
- 把 Responses API 的字段发送给 Chat Completions,或反向混用两套请求结构。
按层执行最小诊断
先发送只含模型和一条文本消息的最小请求。最小请求成功后,每次只恢复一个参数;最小请求仍失败时,检查最终 URL、Content-Type 和原始响应体。
SDK 报错时同时用 curl 复现,可区分 SDK 序列化问题与服务端契约问题。不要在日志里记录完整 Authorization 头。
- 01确认端点记录最终请求路径,避免 Base URL 中重复或缺失
/v1。 - 02缩减请求仅保留 model、messages/input 和一条纯文本内容。
- 03逐项恢复按 stream、tools、response_format、采样参数顺序一次恢复一个字段。
- 04读取错误体优先使用服务端返回的 type、param、code 和 request ID 定位。
API_BASE_URL='https://<your-api-host>/v1'
MODEL_ID='<YOUR_MODEL_ID>'
curl -sS -D /tmp/api-headers.txt "$API_BASE_URL/chat/completions" -H "Authorization: Bearer ${API_KEY:?set API_KEY first}" -H 'Content-Type: application/json' --data "{"model":"$MODEL_ID","messages":[{"role":"user","content":"ping"}]}"针对根因完成修复
根据最小复现结果修正字段、类型或接口路径,不要通过无限重试处理确定性的 400。若只有高级参数失败,应以目标模型和网关实际公布的能力为准。
- 01修正 URL让 SDK 的 base URL 与它自动追加的资源路径只组合一次。
- 02对齐接口按 Responses 或 Chat Completions 的目标接口重建请求对象。
- 03移除不兼容字段仅在确认模型支持后恢复工具、视觉和结构化输出参数。
from openai import OpenAI
client = OpenAI(api_key="<YOUR_API_KEY>", base_url="https://<your-api-host>/v1")
result = client.chat.completions.create(
model="<YOUR_MODEL_ID>",
messages=[{"role": "user", "content": "ping"}],
)
print(result.choices[0].message.content)验证修复而不是只看一次成功
成功响应应来自预期资源路径,并包含客户端可解析的结构。随后逐项恢复业务参数并重复测试,找到第一个导致 400 的字段。
- 最小 curl 和目标 SDK 均成功。
- 恢复参数后能明确指出支持与不支持的边界。
- 错误日志保留 request ID,但不包含 Key、Cookie 或完整业务数据。
安全边界与升级证据
不要把真实 Key、完整请求正文或用户数据粘贴到公开 Issue。需要支持时提供脱敏后的字段结构、模型 ID、接口路径、状态码和 request ID。
- 不要关闭证书校验来“修复”400。
- 不要把确定性 400 纳入无上限自动重试。
- 涉及用户内容时只保留可复现的最小样例。
官方来源与核验范围
本文以协议规范和客户端官方文档为事实依据。错误文案、重试头和配置字段可能随服务或客户端版本变化;执行前请核对来源,并对日志与请求样例脱敏。
查看技术核验方法