400 messages[1].role must be either 'user' or 'assistant', but got 'system'

2026年05月29日 10:48 28.36 秒 success

错误信息

API Error: 400 messages[1].role must be either 'user' or 'assistant', but got 'system'

AI 解决方案

1. 🌐 错误翻译


原文:API Error: 400 messages[1].role must be either 'user' or 'assistant', but got 'system'
译文:API 错误:400  messages[1].role 必须是 'user' 或 'assistant',但得到的是 'system'。

2. 🎯 原因分析


  • 根本原因:您在调用大语言模型(如OpenAI)的API时,构造的messages(消息)数组格式不符合规范。API要求数组中每个消息对象都必须指定一个合法的role(角色),并且通常对role的顺序和组合有特定要求。

  • 具体分析:错误指向了messages数组中的第二个元素(索引为1)。该元素的role字段被设置为'system',但API期望这个位置的消息角色只能是'user'(用户)或'assistant'(助手)。在大多数对话API中,'system'角色的消息通常用于设定初始上下文或指令,并且必须作为整个messages数组的第一个元素。您的代码很可能将系统消息错误地放在了数组的第二个位置(或更后)。
  • 3. 💡 解决方案


    请调整您构造messages数组的代码,确保'system'角色的消息始终位于数组的最开头(索引为0)
    # 错误的结构示例(导致当前报错)
    messages = [
        {"role": "user", "content": "你好,请介绍一下你自己"}, # 索引 0
        {"role": "system", "content": "你是一个专业的助手。"} # 索引 1 -> 报错:此处不允许是system
    ]
    
    # ✅ 正确的结构示例(修复后)
    messages = [
        {"role": "system", "content": "你是一个专业的助手。"}, # 索引 0 -> 系统消息在最前
        {"role": "user", "content": "你好,请介绍一下你自己"},  # 索引 1
        # 后续的对话历史...
    ]
    

    4. 🛡️ 预防措施


  • 仔细阅读文档:在集成任何API前,务必详细阅读其官方文档中关于请求体(Request Body)结构、特别是消息(Messages)数组格式和角色(Role)字段的说明。

  • 使用代码检查/工具:在发送API请求前,可以在代码中添加简单的验证逻辑,检查messages数组的结构是否符合预期。例如,检查第一个元素的role是否为'system'(如果使用了系统消息),以及后续元素的role是否有效。

  • 调试时打印请求体:遇到400错误时,在代码中打印出即将发送给API的完整请求体(JSON格式),可以快速定位构造错误。