跨平台模型别名坑:opus 在 Vertex 和直连 API 指向不同版本

跨平台模型别名坑:opus 在 Vertex 和直连 API 指向不同版本

如果你用 Claude Code 配合 Google Vertex AI,可能遇到过这个错误:

API Error: 404 Publisher Model `projects/<your-project>/locations/us-east5/publishers/anthropic/models/claude-opus-4-1@20250805` was not found

你明明在项目里开通了 Opus 4.5,为什么请求的是 Opus 4.1?

因为 opus 这个模型别名,在不同平台上解析成不同的模型版本。

问题根源

Claude Code 的代码里有一段模型解析逻辑(GitHub issue #18447 里有人贴了出来):

function getDefaultOpusModel() {
    if (process.env.ANTHROPIC_DEFAULT_OPUS_MODEL)
        return process.env.ANTHROPIC_DEFAULT_OPUS_MODEL;
    if (isFirstParty())
        return models.opus45;  // 直连 API → Opus 4.5
    return models.opus41;      // Vertex/Bedrock → Opus 4.1
}

逻辑很清楚:用 Anthropic 直连 API 时,opus 等于 Opus 4.5;用 Vertex AI 或 Bedrock 时,opus 等于 Opus 4.1。

这个设计的初衷可能是稳妥——第三方平台上较新的模型版本可能没有全量上线。但带来的问题是:如果你的 Vertex AI 项目只开通了 Opus 4.5 而没有 Opus 4.1(或者反过来),就会 404。

Opus 4.6 发布后这个问题更混乱了。现在有三个 Opus 版本在线(4.1、4.5、4.6),别名指向哪个取决于平台、取决于 Claude Code 版本,还可能随时更新。

影响范围

这个坑不只影响 Claude Code 的命令行用户。任何通过 Vertex AI 或 Bedrock 调用 Claude 的代码,如果用了别名而不是完整 model ID,都可能碰到。

具体的别名解析规则:

别名 Anthropic 直连 Vertex AI Bedrock
opus 最新 Opus(不确定) 可能落后一到两个版本 可能落后一到两个版本
claude-opus-4-6 Opus 4.6 看是否已上线 看是否已上线

问题在于"不确定"和"可能"——这些映射没有一个稳定的文档,你不能假设它在所有平台上行为一致。

怎么解决

方法一:永远用完整 model ID

最直接的办法。不依赖别名,不受平台差异影响。

# Claude Code 命令行
claude --model claude-opus-4-6

# 不要
claude --model opus
# API 调用
response = client.messages.create(
    model="claude-opus-4-6",  # 完整 ID
    ...
)

Vertex AI 上的完整 ID 格式稍有不同:

# Vertex AI
model = "claude-opus-4-6@20260205"  # 注意 @ 后面的日期

方法二:环境变量覆盖

如果你的团队习惯了用 opus 别名,可以用环境变量强制指定:

export ANTHROPIC_DEFAULT_OPUS_MODEL="claude-opus-4-6"

但有个坑:GitHub issue #17760 报告说这个环境变量在某些版本的 Claude Code 里不被正确识别(从 /model 列表选择时无效)。确认你的 Claude Code 版本已经修复了这个问题。

方法三:在 CI/CD 和脚本里固定版本

如果你的自动化脚本调用 Claude Code,一定要显式指定 model。不要让"默认值"来决定用哪个模型。

# 在脚本里
claude -p "review this code" --model claude-opus-4-6

# 不要
claude -p "review this code"  # 默认模型取决于配置和平台

多平台部署时的额外注意

如果你的后端同时接了多个 Claude 平台(比如主用 Anthropic API,备用 Bedrock),模型版本的一致性更重要。

一个真实场景:你配了回退策略——Anthropic API 挂了自动切 Bedrock。如果两边用的 Opus 版本不一样(一个 4.6,一个 4.5),模型行为会有差异。对于依赖特定行为(比如 adaptive thinking 只在 4.6 上支持)的代码,切换后可能直接报错。

建议:

  • 在回退配置里用完整 model ID
  • 回退目标平台的模型版本要跟主平台对齐
  • 有版本不一致时宁可让回退失败并告警,也别静默用一个不兼容的版本

怎么确认当前用的是哪个模型

在 Claude Code 里:

/model

会显示当前使用的模型和可选列表。

在 API 响应里,model 字段会返回实际使用的完整 model ID(不是你传入的别名)。建议在日志里记录这个字段——调查问题时非常有用。

response = client.messages.create(model="opus", ...)
print(response.model)  # 实际用的是什么版本

这个问题不会导致数据丢失或安全问题,但会导致请求失败(404)、行为不一致、和成本偏差(不同版本价格不同,4.1 是 $15/MTok 输入,4.5/4.6 是 $5/MTok——差了三倍)。在生产环境里,任何"不确定"都是风险。


参考链接

  • GitHub Issue #18447(别名不一致):https://github.com/anthropics/claude-code/issues/18447
  • GitHub Issue #17760(环境变量不生效):https://github.com/anthropics/claude-code/issues/17760
  • Vertex AI 部署文档:https://platform.claude.com/docs/en/build-with-claude/claude-on-vertex-ai
← 返回博客列表