400 Failed to deserialize the JSON body into the target type: messages[1].role: ...

2026年05月29日 10:37 30.02 秒 success

错误信息

API Error: 400 Failed to deserialize the JSON body into the target type: messages[1].role: unknown variant `system`, expected `user` or `assistant` at line 1 column 11403 (request id: 20260529103734580722358itYVlmF4)

AI 解决方案

🔍 错误翻译

原文:API Error: 400 Failed to deserialize the JSON body into the target type: messages[1].role: unknown variant `system`, expected `user` or `assistant` at line 1 column 11403
译文:API错误:400 无法将JSON请求体反序列化为目标类型:在消息数组(messages)索引[1]的字段`role`中,发现未知的变量值`system`,期望的值是`user`或`assistant`(位于第1行,第11403列)。

🎯 原因分析

根本原因: 您向API发送的请求体(JSON格式)结构不符合要求。具体问题在于:

  • 您构建的对话消息列表(messages数组)中,索引为 [1] 的消息对象的 role 字段值被设置为 "system"

  • 目标API的接口规范不支持 system 这个角色值,它只期望接收 userassistant 这两种角色。
  • 常见场景: 许多对话式AI API(如OpenAI的Chat Completions API)要求系统提示(System Prompt)必须作为数组的第一个元素(索引[0]),并且将其role设置为 "system"。而后续的对话历史应严格交替使用 "user""assistant"。您的错误提示表明,API在验证消息角色时,发现数组中间位置出现了不允许的 system 角色。

    💡 解决方案

    请检查并修正您的消息构造代码。正确的消息结构通常如下所示:

    {
      "model": "your-model-name",
      "messages": [
        {
          "role": "system",
          "content": "You are a helpful assistant." // 系统指令,通常位于最前
        },
        {
          "role": "user",
          "content": "Hello!" // 第一条用户消息
        },
        {
          "role": "assistant",
          "content": "Hi there! How can I help you?" // 模型的回复
        },
        {
          "role": "user",
          "content": "What's the weather today?" // 后续用户消息
        }
        // ... 之后的消息必须严格交替 `user` 和 `assistant`
      ]
    }
    

    核心修正步骤:

  • 定位错误: 找到代码中构建 messages 数组的地方。

  • 调整顺序与角色: 确保 "system" 角色消息是数组的第一个元素(索引0)。检查所有后续消息对象的 role 字段,确保它们只有 "user""assistant" 两种值,并且是正确交替出现的。

  • 合并系统指令: 如果您有多个系统提示,考虑将它们合并为一个 "system" 消息对象。
  • 🛡️ 预防措施

    • 详阅API文档: 在调用任何API前,务必仔细阅读其官方文档中关于请求格式(Request Body)和消息结构(Message Structure)的章节,明确支持的角色列表和消息顺序要求。

    • 使用API调试工具: 在开发阶段,使用Postman或类似工具先构造并验证API请求,可以快速发现格式错误。许多AI API提供商也提供交互式的API参考(Playground),可以直观地看到正确的请求示例。

    • 输入验证: 在您的代码中,可以在发送请求前对 messages 数组进行简单的验证,确保第一个消息的 role"system"(如果存在),且后续消息的 role 严格为 ["user", "assistant", "user", "assistant", ...] 的模式。