现在claude code更新之后已经不再存在这个问题了 不需要往下看

前言

最近我按照 MiMo 官方的 Claude Code 配置文档,把 Claude Code 接到了 MiMo 的 Anthropic 兼容接口上。基础安装过程本身不复杂:安装 Node.js、安装 Claude Code CLI、配置 MiMo 的 Base URL 和 API Key。

但是配置完成后,我第一次运行 Claude Code 就遇到了一个比较迷惑的报错:

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

后面修好之后,又在继续使用 Claude Code 的过程中遇到了类似错误:

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

这篇文章记录一下完整排查过程、最终解决方案,以及为什么解决之后能用。

我的环境

我的环境大致如下:

系统:Windows
终端:Git Bash / PowerShell
Node.js:v24.16.0
npm:11.13.0
Claude Code CLI:2.1.154
VS Code Claude Code 扩展:anthropic.claude-code@2.1.154
MiMo 模型:mimo-v2.5-pro
MiMo Base URL:https://api.xiaomimimo.com/anthropic

按官方文档配置 Claude Code

按照 MiMo 官方文档,用户目录下需要配置 Claude Code 的环境变量。

Windows 上配置文件一般在:

C:\Users\你的用户名\.claude\settings.json

基础配置类似这样:

{
  "env": {
    "ANTHROPIC_BASE_URL": "https://api.xiaomimimo.com/anthropic",
    "ANTHROPIC_AUTH_TOKEN": "sk-你的MiMo API Key",
    "ANTHROPIC_MODEL": "mimo-v2.5-pro",
    "ANTHROPIC_DEFAULT_SONNET_MODEL": "mimo-v2.5-pro",
    "ANTHROPIC_DEFAULT_OPUS_MODEL": "mimo-v2.5-pro",
    "ANTHROPIC_DEFAULT_HAIKU_MODEL": "mimo-v2.5-pro"
  }
}

如果使用 VS Code 插件,也可以在 VS Code 用户设置里配置:

C:\Users\你的用户名\AppData\Roaming\Code\User\settings.json

对应配置大概是:

{
  "claudeCode.selectedModel": "mimo-v2.5-pro",
  "claudeCode.environmentVariables": [
    {
      "name": "ANTHROPIC_BASE_URL",
      "value": "https://api.xiaomimimo.com/anthropic"
    },
    {
      "name": "ANTHROPIC_AUTH_TOKEN",
      "value": "sk-你的MiMo API Key"
    },
    {
      "name": "ANTHROPIC_MODEL",
      "value": "mimo-v2.5-pro"
    },
    {
      "name": "ANTHROPIC_DEFAULT_SONNET_MODEL",
      "value": "mimo-v2.5-pro"
    },
    {
      "name": "ANTHROPIC_DEFAULT_OPUS_MODEL",
      "value": "mimo-v2.5-pro"
    },
    {
      "name": "ANTHROPIC_DEFAULT_HAIKU_MODEL",
      "value": "mimo-v2.5-pro"
    }
  ]
}

配置完成后,我运行:

claude

结果报错:

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

从错误语义判断:这是请求体结构问题

这个错误本身已经把方向说得很清楚了,它不是鉴权问题,也不是网络连通性问题。鉴权失败通常会表现为 401、403,或者直接提示 token/key 无效。而这里的报错非常明确:

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

也就是说,请求已经到达 MiMo 接口,MiMo 在校验请求体时发现 messages 数组里的某一条消息角色不合法。

为了把问题边界收窄,我单独用一个最小 Anthropic Messages API 请求测试过 MiMo 接口:

{
  "model": "mimo-v2.5-pro",
  "max_tokens": 16,
  "system": "You are a helpful assistant.",
  "messages": [
    {
      "role": "user",
      "content": "只回复 OK"
    }
  ]
}

这个请求可以成功返回,说明基础链路是通的:

认证可以通过
Base URL 可以访问
模型 ID 可以被 MiMo 识别
标准 Anthropic Messages 请求可以正常返回

真正的问题在 Claude Code 默认模式发出的请求结构上。

为什么会出现 messages[1].role = system

Anthropic Messages API 的正常结构里,系统提示词应该放在顶层 system 字段,而不是放进 messages 数组里。

也就是说,比较标准的请求应该像这样:

{
  "system": "这里是系统提示词",
  "messages": [
    {
      "role": "user",
      "content": "你好"
    },
    {
      "role": "assistant",
      "content": "你好,有什么可以帮你?"
    }
  ]
}

messages 数组里的 role 一般只能是:

user
assistant

而我遇到的报错说明 Claude Code 在某些默认运行路径下,会让 MiMo 收到类似这样的结构:

{
  "messages": [
    {
      "role": "user",
      "content": "..."
    },
    {
      "role": "system",
      "content": "..."
    }
  ]
}

MiMo 的 Anthropic 兼容层比较严格,看到 messages 里面出现 system,就直接返回 400。

这不是凭证类错误,而是第三方兼容接口和 Claude Code 当前默认请求结构之间的兼容问题。

解决方案:开启 CLAUDE_CODE_SIMPLE

最终我没有降级 Claude Code,也没有换模型,而是在 Claude Code 配置里加入了:

CLAUDE_CODE_SIMPLE=1

同时保留了:

CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1

最终我的 C:\Users\你的用户名\.claude\settings.json 配置如下:

{
  "env": {
    "ANTHROPIC_BASE_URL": "https://api.xiaomimimo.com/anthropic",
    "ANTHROPIC_AUTH_TOKEN": "sk-你的MiMo API Key",
    "ANTHROPIC_MODEL": "mimo-v2.5-pro",
    "ANTHROPIC_DEFAULT_SONNET_MODEL": "mimo-v2.5-pro",
    "ANTHROPIC_DEFAULT_OPUS_MODEL": "mimo-v2.5-pro",
    "ANTHROPIC_DEFAULT_HAIKU_MODEL": "mimo-v2.5-pro",
    "CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS": "1",
    "CLAUDE_CODE_SIMPLE": "1"
  }
}

VS Code 用户配置里也同步加入:

{
  "name": "CLAUDE_CODE_SIMPLE",
  "value": "1"
}

以及:

{
  "name": "CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS",
  "value": "1"
}

CLAUDE_CODE_SIMPLE 为什么有用

Claude Code 的 --bare 模式会启用一个更简单的运行路径,而 --bare 内部会设置:

CLAUDE_CODE_SIMPLE=1

这个模式会减少 Claude Code 默认启动时的一些复杂能力,例如 hooks、skills、plugins、MCP 自动发现、自动 memory、CLAUDE.md 自动发现等。

简单理解就是:Claude Code 默认模式会带很多本地上下文、插件、自动发现和系统提示相关能力;这些能力在官方 Anthropic 服务里通常没问题,但通过 MiMo 这种 Anthropic 兼容接口时,请求结构可能会踩到兼容层的限制。

开启:

CLAUDE_CODE_SIMPLE=1

之后,Claude Code 发出的请求更简单,MiMo 不再收到 messages 数组里的异常 system 角色,所以就能正常返回了。

我修完之后测试:

claude -p "Reply with exactly OK." --max-turns 1

可以正常返回:

OK

说明 Claude Code CLI、MiMo 认证配置、Base URL 和模型配置都已经跑通。

后续又遇到 messages[13].role = system

本来以为问题到这里结束了,结果后面继续使用 Claude Code 时,又出现了类似错误:

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

这次和第一次不太一样。

第一次是:

messages[1].role

说明一开始请求就有问题。

第二次是:

messages[13].role

这说明前面已经有多轮上下文了,直到第 14 条历史消息附近,才出现了一个 system 角色。

继续排查后发现,我在这个会话里使用过 Claude Code 的一些本地斜杠命令,例如:

/effort
/agents
/btw

这些命令不是普通聊天内容,而是 Claude Code 本地的控制命令。Claude Code 会在本地会话历史里记录一些系统事件,例如:

type: system
subtype: local_command

或者:

type: system
subtype: turn_duration

当继续这个旧会话时,Claude Code 可能会把这些本地系统事件也带进历史上下文。MiMo 的兼容接口看到 messages 数组里又出现了 system,于是再次返回 400。

所以第二个错误的原因不是 CLAUDE_CODE_SIMPLE 没生效,而是当前会话历史已经被本地斜杠命令产生的 system 事件污染了。

解决第二个错误的方法

如果遇到:

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

我的处理建议是:

1. 不要继续 resume 这个旧会话

不要使用:

claude -c

也不要从 /resume 里继续选择这个已经报错的会话。

直接新开一个干净会话:

claude

2. 避免在 MiMo 接入下使用某些斜杠命令

在 MiMo 当前兼容层下,尽量不要在同一个会话里使用这些命令:

/effort
/agents
/btw

这些命令可能会写入本地 system 事件,后面继续对话时又触发 400。

3. 不要在 MiMo 接入下固定 xhigh / ultracode

我还遇到过另一个提示:

There's an issue with the selected model (mimo-V2.5-pro). It may not exist or you may not have access to it. Run /model to pick a different model.

这个提示容易让人误解成 MiMo 模型不可用,但结合 Claude Code 官方模型配置文档来看,更合理的解释是:/effort/model 这类 Claude Code 内置模型能力选择,本来是围绕 Claude 自家模型设计的。

官方文档里写得很明确:effort level 是 Claude Code 的 adaptive reasoning 配置,支持范围取决于模型。当前列出的支持模型是 Opus 4.8、Opus 4.7、Opus 4.6 和 Sonnet 4.6;xhigh 只出现在 Opus 4.8 / Opus 4.7 这一档。MiMo 的 mimo-v2.5-pro 是通过 Anthropic 兼容协议接入的第三方模型,不属于 Claude Code 官方模型选择器里的 Claude 模型。

所以在 MiMo 接入场景下,我不建议把配置写成:

{
  "effortLevel": "xhigh"
}

也不建议通过 /effort 切到 xhighultracode

另外还要注意模型 ID 的大小写。MiMo 官方 Claude Code 文档里的模型 ID 是:

mimo-v2.5-pro

而不是:

mimo-V2.5-pro

如果某次 /model 或其他操作让 Claude Code 里残留了大小写不一致的模型名,就可能触发 There's an issue with the selected model (...) 这类模型校验提示。遇到这种情况,可以检查并清理这些位置里的 stale model 值:

命令行启动时的 --model 参数
ANTHROPIC_MODEL 环境变量
项目级 .claude/settings.json
项目级 .claude/settings.local.json
用户级 ~/.claude/settings.json
VS Code 的 claudeCode.selectedModel

我最终的做法是:保持 MiMo 官方文档里的小写模型 ID,移除 effortLevel,不在 MiMo 会话里使用 /effort 调整 Claude 自家模型的 reasoning 档位。

最终推荐配置

CLI 推荐配置:

{
  "env": {
    "ANTHROPIC_BASE_URL": "https://api.xiaomimimo.com/anthropic",
    "ANTHROPIC_AUTH_TOKEN": "sk-你的MiMo API Key",
    "ANTHROPIC_MODEL": "mimo-v2.5-pro",
    "ANTHROPIC_DEFAULT_SONNET_MODEL": "mimo-v2.5-pro",
    "ANTHROPIC_DEFAULT_OPUS_MODEL": "mimo-v2.5-pro",
    "ANTHROPIC_DEFAULT_HAIKU_MODEL": "mimo-v2.5-pro",
    "CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS": "1",
    "CLAUDE_CODE_SIMPLE": "1"
  }
}

VS Code 推荐同步配置:

{
  "claudeCode.selectedModel": "mimo-v2.5-pro",
  "claudeCode.environmentVariables": [
    {
      "name": "ANTHROPIC_BASE_URL",
      "value": "https://api.xiaomimimo.com/anthropic"
    },
    {
      "name": "ANTHROPIC_AUTH_TOKEN",
      "value": "sk-你的MiMo API Key"
    },
    {
      "name": "ANTHROPIC_MODEL",
      "value": "mimo-v2.5-pro"
    },
    {
      "name": "ANTHROPIC_DEFAULT_SONNET_MODEL",
      "value": "mimo-v2.5-pro"
    },
    {
      "name": "ANTHROPIC_DEFAULT_OPUS_MODEL",
      "value": "mimo-v2.5-pro"
    },
    {
      "name": "ANTHROPIC_DEFAULT_HAIKU_MODEL",
      "value": "mimo-v2.5-pro"
    },
    {
      "name": "CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS",
      "value": "1"
    },
    {
      "name": "CLAUDE_CODE_SIMPLE",
      "value": "1"
    }
  ]
}

排查命令

确认版本:

node -v
npm -v
claude --version

最小测试:

claude -p "Reply with exactly OK." --max-turns 1

如果返回类似:

OK

说明基本链路已经通了。

如果还是报:

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

可以优先检查:

1. settings.json 里是否加了 CLAUDE_CODE_SIMPLE=1
2. 是否正在继续一个旧会话
3. 旧会话里是否使用过 /effort、/agents、/btw 等斜杠命令
4. 是否配置了 effortLevel: xhigh,或者在 MiMo 会话里使用过 /effort、ultracode
5. 模型 ID 是否严格使用 MiMo 官方文档里的小写 mimo-v2.5-pro
6. VS Code 是否完全重启过

总结

这次问题的核心是 Claude Code 当前默认请求结构和 MiMo Anthropic 兼容接口之间存在兼容差异。

第一个错误:

messages[1].role got system

主要通过开启:

CLAUDE_CODE_SIMPLE=1

解决。

第二个错误:

messages[13].role got system

一般是旧会话历史里混入了 Claude Code 本地斜杠命令产生的 system 事件。解决方式是新开干净会话,并尽量避免在 MiMo 接入下使用 /effort/agents/btw 这类会污染历史的命令。

最终,我没有降级 Claude Code,仍然使用:

Claude Code 2.1.154
MiMo mimo-v2.5-pro

通过 CLAUDE_CODE_SIMPLE=1 和干净会话,成功跑通了 MiMo 接入 Claude Code。

参考资料

  • MiMo 官方 Claude Code 配置文档:https://platform.xiaomimimo.com/docs/zh-CN/integration/claudecode
  • MiMo Anthropic API 文档:https://platform.xiaomimimo.com/docs/api/chat/anthropic-api
  • Claude Code Model Configuration:https://code.claude.com/docs/en/model-config
  • Claude Code Error Reference:https://code.claude.com/docs/en/errors
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐