跳到正文

OpenCode API Key 过期:api_key_expired 恢复步骤与提供商 Key 轮换

截至 2026 年 10 月 19 日,OpenCode 自家 Key 失效的原因官方未解释,重新登录或换新 Key 可恢复;Console 里存过提供商 Key 的要按泄露处理。

••17 分钟阅读•故障排查
OpenCode Key 过期封面:终端里的 401 api_key_expired 报错分成两条路,/connect 重新登录与吊销提供商 Key

截至 2026 年 10 月 19 日,OpenCode 突然报 This API key has expired,通常是两件事叠在一起:一是你自己的 OpenCode Key(Console、Zen 或 Go 的 Key)在 10 月 17–18 日被标记为过期或直接从账户里消失,官方没有解释原因;二是 OpenCode Console 出了安全事件,官方称影响 1.4% 的 Console 用户,范围是“接入了外部提供商”的那部分人,他们存在 Console 里的 OpenAI、Anthropic 等 Key 可能已经泄露。

先恢复使用,再判断要不要换提供商 Key:

  • 只想马上能用:在 OpenCode 终端界面(TUI)里运行 /connect,选 OpenCode,在浏览器里完成授权。多位用户靠这一步恢复,尽管报错原文说重新登录无效。
  • 用的是 Key 而不是登录(Go 订阅、外部客户端、CI):在 OpenCode Console(opencode.ai 的网页控制台,不是本地 CLI)新建 Key,再用 opencode auth logout 和 opencode auth login 换掉旧 Key。OpenCode 不会自动用上新 Key。
  • 新 Key 还是报同样的错:大概率旧 Key 还在被发送,去查环境变量、opencode.json 和 auth.json。
  • 收到过 OpenCode 的事件邮件,或在 Console 里填过提供商 Key:除了恢复 OpenCode,还要到 OpenAI、Anthropic、Google 等提供商后台吊销旧 Key、换新 Key、查账单。
  • 不想再把提供商 Key 存进 Console:可以在 opencode.json 里直接配置提供商,Key 从环境变量读取,做法见后文。
你的情况先做什么要不要轮换提供商 Key
本地 CLI 或桌面版,通过 OpenCode 登录使用 Zen / Go/connect → OpenCode → 浏览器授权没接入过外部提供商就不需要
用 Go Key、Zen Key 接 LiteLLM 等外部客户端或脚本Console 新建 Key,在客户端里替换同上
新建 Key 后仍报 api_key_expired查三处旧凭据,再不行发邮件给 help@anoma.ly同上
在 Console 的 Providers 页填过 OpenAI、Anthropic、Google 等 Key,或收到事件邮件先到提供商后台吊销并新建,再更新 Console 和其他应用需要
只在本地 opencode auth login 或 opencode.json 里填自己的提供商 Key,从没用过 Console 的提供商功能这些 Key 照常可用,只处理 OpenCode 自家凭据官方没点名;拿不准就换,成本很低

“This API key has expired” 是哪一方的 Key 过期

报错的完整原文是:

text
This API key has expired. Create a new API key in OpenCode Console and replace it in your client or secret store. Signing in again will not renew this key.

返回的是 HTTP 401,错误码 api_key_expired,类型 authentication_error;在桌面版里有时显示为 Internal error: This API key has expired。这些都来自 OpenCode Console / Zen 一侧:被标记过期的是 OpenCode 自己发给你的凭据,所以所有 Zen、Go 模型同时失败,而你自己配置的 OpenRouter 等其他提供商还能用(见 GitHub #56806、#56560)。

这一点要和其他平台的 Key 过期分开。阿里云百炼 Coding Plan、七牛云等平台的 Key 也会因为套餐到期失效,但报错不会让你“去 OpenCode Console 新建 Key”。如果你在 OpenCode 里接的是这些平台,应当去对应平台查套餐和 Key,本文的步骤不适用。

报告集中在 2026 年 10 月 17 日 21:52 UTC(北京时间 10 月 18 日 05:52)之后(#56586、#56833)。不少人的 Key 原本没有设置过期时间,失效后在账户里也找不到了,其中包括一位没有接入任何外部提供商、只有自己 Go Key 的订阅用户(#56556、#56833)。OpenCode 至今没有说明为什么自家的 Key 也会失效,所以它既不能算“官方主动预防性吊销”,也不能说明你的 OpenCode Key 已经泄露。

2026 年 10 月 17 日 OpenCode Console 安全事件:官方说了什么

OpenCode 官方账号在 2026 年 10 月 17 日 18:08 UTC(北京时间 10 月 18 日 02:08)发帖称,前一晚发生了与“large scale distillation attack”(大规模蒸馏攻击,即有人大量调用模型、用输出来训练自己的模型)相关的安全事件,影响 1.4% 的 OpenCode Console 用户;受影响的人都已收到邮件,“没收到邮件就没有受影响”,范围是接入了外部提供商的一部分用户;事件仍在处理中,他们正与 Anthropic、OpenAI、Google 合作处置(官方 X 帖)。

用户转述的邮件内容更具体:攻击者未经授权访问了一套“正在下线的旧系统”,保存在 workspace 里的第三方提供商 Key(例如 OpenAI、Anthropic)可能已经暴露,请到提供商后台吊销并更换、更新使用这些 Key 的应用、检查近期用量(Hacker News 帖,Notebookcheck 报道)。

需要注意两个口径:1.4% 是 Console 用户里的比例,不是全部 OpenCode 用户;这里说的“提供商 Key”指你在 Console 里自带的第三方 Key(BYOK,即自带提供商 Key),不是 OpenCode 发给你的 Zen / Go Key。

恢复方法一:在 TUI 里用 /connect 重新登录 OpenCode

适合在本地终端或桌面版里通过 OpenCode 账号使用 Zen / Go 的人:

  1. 在 OpenCode 终端界面输入 /connect。
  2. 在提供商列表里选 OpenCode(Console 登录,不是 “OpenCode Go”)。
  3. 浏览器会打开设备授权页面,登录并选择持有订阅或余额的 workspace,点击批准。
  4. 回到终端发一条消息,确认不再报 401。

报错说 “Signing in again will not renew this key”,而用户靠登录恢复了,两者并不矛盾:登录拿到的是一套新的登录凭据,旧 Key 并没有被续期。OpenCode 团队成员 dax 在 X 上回复称,通过 OpenCode 登录时默认使用 OAuth token,而不是长期有效的 API Key(dax 的回复)。成功恢复的记录见 #56586 和 #56442;另一位用户在终端里直接重新运行 opencode auth login 也恢复了(#56782)。

登录后提示 Insufficient account funds:换成 opencode-go 模型

Go 订阅用户重新登录后,可能接着看到 Upstream request failed: Insufficient account funds。这不是要你充值:请求被算到了 Console 的预付余额上,而不是 Go 订阅。在模型列表里选 opencode-go/ 开头的模型(例如 opencode-go/deepseek-v4.1-flash)后,计费就会走 Go 订阅(#56586)。

浏览器登录失败或提示 Too many registration attempts

10 月 17–18 日有不少人在 Console 用 GitHub 或 Google 登录时看到 Unable to start social login,注册页提示 Too many registration attempts. Please wait an hour, then try again.(#56442、#56445)。这是 Console 账户服务的问题,不是本地安装坏了;有用户等一段时间后什么都没做就恢复了。按提示等一小时再试,不要反复重装 OpenCode。

恢复方法二:新建 OpenCode Key 并替换旧 Key

适合用 Key 而不是登录的场景:Go Key 接外部工具、LiteLLM 这类网关、脚本或 CI。

在 OpenCode Console 哪里新建 Key

Console 的界面在变,截至 2026 年 10 月 19 日有两种 Key:

  • 个人 Key(给自己的 Zen / Go 用):登录 Console 后点右上角账户名 → Account → Create。不少 Go 用户反映很难找到这个入口(#52227、#56498)。
  • workspace 服务账号 Key:Keys → Add Service Account → Add API Key,生成的是 oc_sk_ 开头的 Key,绑定一个 workspace,可设置权限和可选的过期日期,只显示一次,适合集成和 CI(Console API 文档)。有用户拿这种 Key 去接 Go,结果报 Invalid credential,所以给 Go 订阅用的不要选它。

Key 复制下来只放进本地配置或密钥管理里,不要贴到 GitHub issue。

在 OpenCode CLI 和桌面版里替换

bash
# 1. 删掉旧的 OpenCode Zen / OpenCode Go 凭据(不带参数会让你选择)
opencode auth logout

# 2a. Zen:重新登录,选 OpenCode Zen,粘贴新 Key
opencode auth login

# 2b. Go:直接用 Key 方式连接 OpenCode Go
opencode auth login opencode-go --method key

# 3. 核对当前保存的凭据
opencode auth list

opencode-go 只支持 Key 和环境变量两种方式,没有浏览器登录,所以 Go Key 要用 2b 这一条(#56498)。凭据保存在 ~/.local/share/opencode/auth.json(CLI 文档)。

做完后彻底退出桌面版(包括系统托盘里的进程)再打开;VS Code 插件和 CLI 共用同一份凭据,重启 VS Code 或至少重开集成终端,确保没有旧的 opencode 进程还拿着旧 Key(#56806、#56560)。

在 LiteLLM 等外部客户端里调用 OpenCode Zen / Go

如果你是在别的客户端或网关里填 OpenCode 的 Key 调用 Zen / Go,opencode auth login 管不到它们。要去该客户端的密钥配置、环境变量或密钥管理服务里换成新 Key,然后重启服务。#56560 里那条 litellm.AuthenticationError ... api_key_expired 日志就是这种情况:换了 Key,LiteLLM 那边还在发旧的。

新建 Key 后仍报 api_key_expired:检查这三处旧凭据

新 Key 也被拒,最常见的原因是旧 Key 还在别处被发送,而且优先级更高。按顺序查:

三处旧凭据示意:OPENCODE_API_KEY 环境变量、opencode.json 里的 provider.opencode.options.apiKey、auth.json 里的旧 opencode 条目,各自对应的处理方法
位置怎么查怎么处理
OPENCODE_API_KEY 环境变量或项目里的 .envecho $OPENCODE_API_KEY(Windows 用 echo %OPENCODE_API_KEY%),再看 shell 配置文件和 .env换成新 Key 或删掉这一行,重开终端
全局 ~/.config/opencode/opencode.json(或 .jsonc)及项目配置找 provider.opencode.options.apiKey换成新 Key 或删掉
~/.local/share/opencode/auth.json(Windows:%USERPROFILE%\.local\share\opencode\auth.json)看是否还有一个旧的 "opencode" 条目先备份,再删除该条目并重启服务

前两处来自 OpenCode 自动回复给出的检查项(#56560)。第三处是用户找到的修复办法,不是官方步骤:新版 auth login / auth logout 不会处理 auth.json 里的旧 opencode 条目,后台服务却优先使用它(#56556)。macOS / Linux 上可以这样做:

bash
cd ~/.local/share/opencode
cp auth.json auth.json.bak
jq 'del(.["opencode"])' auth.json.bak > auth.json
pkill -f "opencode-cli serve --service"

然后重新打开桌面版或 OpenCode。没有 jq 的话,用编辑器打开备份后的 auth.json,删除 "opencode" 这一项并保证 JSON 格式完整。

三处都清干净、全新的 Key 仍然返回 api_key_expired,问题就在账户那一侧,本地再折腾也没用。发邮件到 help@anoma.ly,写明新 Key 也被拒、大约何时创建,Key 本身和账户信息不要发到公开 issue 里(#56560)。

在 Console 接入过 OpenAI、Anthropic 或 Google Key:吊销并更换

OpenCode Console 的 Providers 功能可以接入 Anthropic、OpenAI、Google、xAI、DeepSeek、Mistral、Groq、OpenRouter 等提供商:管理员填入提供商的 Key,Console 代为保存并转发请求,费用由提供商直接向你收取(Providers 文档)。官方说可能泄露的正是这些 Key。只要你在 Console 里填过,不管有没有收到邮件,都建议按下面处理:

提供商 Key 轮换五步:吊销旧 Key、新建 Key、在 Console 换新、更新其他应用、查用量和账单,下方是用户报告的盗用个案
  1. 到提供商后台吊销旧 Key:例如 OpenAI、Anthropic、Google AI Studio。用的是云平台(Vertex AI、AWS Bedrock、Azure)的,同样去对应的凭据管理页处理服务账号或访问密钥。
  2. 新建一个 Key,只给需要的权限和额度。
  3. 在 Console 里换上新 Key:打开 Providers 页,点击该提供商的凭据,填入新 Key。
  4. 更新其他用到旧 Key 的地方:本地脚本、CI、其他客户端。
  5. 查用量和账单:看 10 月 17 日前后有没有陌生的调用、模型或地区,顺手设置用量提醒和预算上限。

已经有人报告损失:Anthropic 的 $20 额度当天被用完、约 $400 的 Anthropic 账单、约 €200 的 Google 账单且项目因滥用被暂停(Hacker News 帖、Notebookcheck)。这些是个案,不代表典型损失,但说明拖延的代价可能很直接。

OpenAI 余额被盗刷后可能出现 429 insufficient_quota,排查见 OpenAI API 配额超限怎么办:429 insufficient_quota 排查指南;换新的 Gemini Key 后涉及付费等级,可以看 Gemini API Key 怎么付费:官方额度、使用等级与国内选择。

只在本地用 OpenCode CLI、自己填提供商 Key,要不要换

官方声明只点名了“接入了外部提供商的 Console 用户”。如果你从没在 Console 里填过提供商 Key,只是在本地用 opencode auth login 配自己的 OpenAI、Anthropic 等 Key,这些 Key 存在你电脑上的 auth.json 里,不在被入侵的 Console 系统中。社区普遍据此认为本地用法不受影响,但 OpenCode 并没有用这样的原话为本地 CLI 作出说明。

拿不准自己有没有在 Console 填过,就直接轮换:吊销、新建、替换只要几分钟,比事后查账单省事。

不经过 OpenCode Console:在 opencode.json 里直接配置提供商

如果 Console 登录一时恢复不了,或者你不想再把提供商 Key 存进 Console,可以在本地配置文件里直接声明提供商,Key 从环境变量读取。这样 Key 既不在 Console 里,也不写进配置文件;需要吊销时,只要在提供商后台吊销、再改一处环境变量。这是可选做法,不能修复 OpenCode Zen / Go 本身的 api_key_expired,用 Zen / Go 模型仍要走前面的恢复步骤。

下面的配置以 laozhang.ai 为例,在 OpenCode 1.18.34 上于 2026 年 10 月 5 日实测可用(laozhang.ai 的 OpenCode 接入文档)。这次报错的用户多在 1.19.x 和 2.0.x 上,新版本若有差异,以 OpenCode providers 文档为准。

先把 Key 放进环境变量(bash 用户改成 ~/.bashrc):

bash
echo 'export LAOZHANG_API_KEY="你的 Key"' >> ~/.zshrc
source ~/.zshrc

再编辑 ~/.config/opencode/opencode.json(只想对某个项目生效就放在项目根目录):

json
{
  "$schema": "https://opencode.ai/config.json",
  "provider": {
    "laozhang": {
      "npm": "@ai-sdk/openai",
      "name": "LaoZhang API",
      "options": {
        "baseURL": "https://api.laozhang.ai/v1",
        "apiKey": "{env:LAOZHANG_API_KEY}"
      },
      "models": {
        "gpt-6-sol": { "name": "GPT-6 Sol" }
      }
    },
    "laozhang-compat": {
      "npm": "@ai-sdk/openai-compatible",
      "name": "LaoZhang API (compatible)",
      "options": {
        "baseURL": "https://api.laozhang.ai/v1",
        "apiKey": "{env:LAOZHANG_API_KEY}"
      },
      "models": {
        "deepseek-v4-pro": { "name": "DeepSeek V4 Pro" }
      }
    }
  },
  "model": "laozhang/gpt-6-sol"
}

几个容易出错的地方:

  • GPT-6 系列要放在 @ai-sdk/openai 下。放进 @ai-sdk/openai-compatible 时,请求会带 max_tokens,GPT-6 会拒绝并报 Unsupported parameter: 'max_tokens' is not supported with this model. Use 'max_completion_tokens' instead.
  • DeepSeek、Gemini、Qwen 等模型接受 max_tokens,放在 @ai-sdk/openai-compatible 下即可。
  • models 里的键必须是完整的模型 ID,name 只用于界面显示;model 的格式是“provider 名/模型 ID”。

测试一条请求:

bash
opencode run "Reply with exactly one word: connected"

返回 connected 就说明配置生效;要试兼容组的模型,加 -m laozhang-compat/deepseek-v4-pro。报 401 时,先在运行 OpenCode 的终端执行 test -n "$LAOZHANG_API_KEY" && echo 已设置,确认环境变量确实生效。

同样的写法也适用于各家官方 API:把 baseURL 换成提供商的官方地址,环境变量换成官方 Key。要说清楚的是,中转网关和 Console 一样是第三方,换成它并不意味着更安全;这种写法的好处只在于 Key 留在你自己的环境变量里,出事时吊销和替换都只需要动一个地方。

怎么确认已经恢复

  • opencode auth list 里能看到 OpenCode(或 OpenCode Go)的凭据,旧条目已经删掉。
  • 发一条消息,不再出现 401 api_key_expired;Go 订阅用户确认当前模型是 opencode-go/ 开头。
  • 桌面版、VS Code、外部客户端都已重启或换上新 Key。
  • 接入过提供商的,旧 Key 在提供商后台显示为已吊销,Console 里是新 Key,近期账单没有异常。

想看 OpenCode 服务本身是否在出问题,可以看 状态页。它记录了 10 月 18 日 04:04–07:21 UTC(北京时间 12:04–15:21)的 Console API 错误率升高,但截至 2026 年 10 月 19 日没有列出安全事件条目。

OpenCode Key 失效的几个相邻问题

新建的 OpenCode Key 还会再失效吗?

不知道。OpenCode 没说明为什么吊销自家 Key,也没说新 Key 是否稳定。用浏览器登录(OAuth)的方式不依赖长期 Key,能用登录就优先用登录;必须用 Key 的场景,把替换步骤记下来,再遇到时几分钟就能处理。

Go 订阅停用期间能退款或补偿吗?

截至 2026 年 10 月 19 日,OpenCode 没有公布补偿政策,GitHub 上的自动回复明确表示不处理账单问题(#56833)。需要申请的,发邮件到 help@anoma.ly,写清失效时间和受影响的订阅时长。

这次事件还有哪些没公开?

攻击者如何进入、持续了多久、为什么第一方 Key 被吊销、一共吊销了多少、事后报告何时发布,官方都还没有说明。事件仍在处理中,以上步骤基于 2026 年 10 月 19 日的公开信息;官方有新说明时,以官方为准。

发现内容有误,或遇到文中没覆盖的问题?请把文章地址和你看到的情况发到 hi@laozhang.ai,核实后我们会更新正文。