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

> OpenCode 报 api_key_expired：先 /connect 重新登录或新建 Key 并清掉旧凭据；Console 存过 OpenAI 等 Key 的，还要去提供商后台吊销更换。

- Source: https://www.aifreeapi.com/zh/posts/opencode-api-key-expired
- Language: zh
- Published: 2026-10-19
- Updated: 2026-10-19
- Publisher: AI Free API (https://www.aifreeapi.com)

**截至 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](https://github.com/anomalyco/opencode/issues/56806)、[#56560](https://github.com/anomalyco/opencode/issues/56560)）。

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

报告集中在 2026 年 10 月 17 日 21:52 UTC（北京时间 10 月 18 日 05:52）之后（[#56586](https://github.com/anomalyco/opencode/issues/56586)、[#56833](https://github.com/anomalyco/opencode/issues/56833)）。不少人的 Key 原本没有设置过期时间，失效后在账户里也找不到了，其中包括一位没有接入任何外部提供商、只有自己 Go Key 的订阅用户（[#56556](https://github.com/anomalyco/opencode/issues/56556)、[#56833](https://github.com/anomalyco/opencode/issues/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 帖](https://x.com/opencode/status/2111519637049319818)）。

用户转述的邮件内容更具体：攻击者未经授权访问了一套“正在下线的旧系统”，保存在 workspace 里的第三方提供商 Key（例如 OpenAI、Anthropic）可能已经暴露，请到提供商后台吊销并更换、更新使用这些 Key 的应用、检查近期用量（[Hacker News 帖](https://news.ycombinator.com/item?id=50133401)，[Notebookcheck 报道](https://www.notebookcheck.net/OpenCode-hacked-users-urged-to-revoke-their-API-keys.1426957.0.html)）。

需要注意两个口径：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 的回复](https://x.com/thdxr/status/2111790511409258796)）。成功恢复的记录见 [#56586](https://github.com/anomalyco/opencode/issues/56586) 和 [#56442](https://github.com/anomalyco/opencode/issues/56442)；另一位用户在终端里直接重新运行 `opencode auth login` 也恢复了（[#56782](https://github.com/anomalyco/opencode/issues/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](https://github.com/anomalyco/opencode/issues/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](https://github.com/anomalyco/opencode/issues/56442)、[#56445](https://github.com/anomalyco/opencode/issues/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](https://github.com/anomalyco/opencode/issues/52227)、[#56498](https://github.com/anomalyco/opencode/issues/56498)）。
- **workspace 服务账号 Key**：**Keys** → **Add Service Account** → **Add API Key**，生成的是 `oc_sk_` 开头的 Key，绑定一个 workspace，可设置权限和可选的过期日期，只显示一次，适合集成和 CI（[Console API 文档](https://opencode.ai/v2/docs/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](https://github.com/anomalyco/opencode/issues/56498)）。凭据保存在 `~/.local/share/opencode/auth.json`（[CLI 文档](https://opencode.ai/docs/cli)）。

做完后**彻底退出桌面版**（包括系统托盘里的进程）再打开；VS Code 插件和 CLI 共用同一份凭据，重启 VS Code 或至少重开集成终端，确保没有旧的 opencode 进程还拿着旧 Key（[#56806](https://github.com/anomalyco/opencode/issues/56806)、[#56560](https://github.com/anomalyco/opencode/issues/56560)）。

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

如果你是在别的客户端或网关里填 OpenCode 的 Key 调用 Zen / Go，`opencode auth login` 管不到它们。要去该客户端的密钥配置、环境变量或密钥管理服务里换成新 Key，然后重启服务。[#56560](https://github.com/anomalyco/opencode/issues/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 条目，各自对应的处理方法](https://www.aifreeapi.com/posts/zh/opencode-api-key-expired/img/stale-credentials.webp)

| 位置 | 怎么查 | 怎么处理 |
| --- | --- | --- |
| `OPENCODE_API_KEY` 环境变量或项目里的 `.env` | `echo $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](https://github.com/anomalyco/opencode/issues/56560)）。第三处是用户找到的修复办法，不是官方步骤：新版 `auth login` / `auth logout` 不会处理 `auth.json` 里的旧 `opencode` 条目，后台服务却优先使用它（[#56556](https://github.com/anomalyco/opencode/issues/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](https://github.com/anomalyco/opencode/issues/56560)）。

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

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

![提供商 Key 轮换五步：吊销旧 Key、新建 Key、在 Console 换新、更新其他应用、查用量和账单，下方是用户报告的盗用个案](https://www.aifreeapi.com/posts/zh/opencode-api-key-expired/img/provider-key-rotation.webp)

1. **到提供商后台吊销旧 Key**：例如 [OpenAI](https://platform.openai.com/api-keys)、[Anthropic](https://console.anthropic.com/settings/keys)、[Google AI Studio](https://aistudio.google.com/apikey)。用的是云平台（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 帖](https://news.ycombinator.com/item?id=50133401)、[Notebookcheck](https://www.notebookcheck.net/OpenCode-hacked-users-urged-to-revoke-their-API-keys.1426957.0.html)）。这些是个案，不代表典型损失，但说明拖延的代价可能很直接。

OpenAI 余额被盗刷后可能出现 429 `insufficient_quota`，排查见 [OpenAI API 配额超限怎么办：429 insufficient_quota 排查指南](/zh/posts/openai-api-key-quota-exceeded)；换新的 Gemini Key 后涉及付费等级，可以看 [Gemini API Key 怎么付费：官方额度、使用等级与国内选择](/zh/posts/gemini-api-key-tiers)。

## 只在本地用 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 接入文档](https://docs.laozhang.ai/scenarios/programming/opencode)）。这次报错的用户多在 1.19.x 和 2.0.x 上，新版本若有差异，以 [OpenCode providers 文档](https://opencode.ai/docs/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 服务本身是否在出问题，可以看 [状态页](https://status.opencode.ai/)。它记录了 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](https://github.com/anomalyco/opencode/issues/56833)）。需要申请的，发邮件到 help@anoma.ly，写清失效时间和受影响的订阅时长。

### 这次事件还有哪些没公开？

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