Trae CN 配置内网API KEY的踩坑实录:3个坑,最后一个最致命

前言

天下苦trae模型排队久已。Trae 是字节出的 AI IDE,内置模型免费,但有时候想用自己的 Key 跑特定模型,总是要排队,晚上还好,白天几千人的队伍,一排就是十几分钟,而且随着使用时间久了,发现这个排队时间越来越长,且明显可以看到氪金用户在插队,导致名次时高时低。
寒极必春暖,苦尽会回甘。boss终于给我们配发了api key, cc-switch上一瞧,支持巨多模型;于是屁颠屁颠着手尝试在 Trae CN 配置上API KEY,可惜惨败。
本以为就是填个地址、贴个 Key 的事,结果踩了三个大坑,最后一个坑直接让整个方案不可行。如果你也打算在 Trae 里用自己的 API Key 接入api模型,这篇文章能帮你少走弯路。


坑1:改配置文件?Trae CN 根本不读

我第一反应是让auto模型ai去改 Trae 的配置文件。找到路径:

C:\Users\<用户名>\AppData\Roaming\Trae CN\User\settings.json

往里面加了一段:

"trae.customModels": [
  {
    "name": "GLM-5.1",
    "provider": "openai-compatible",
    "baseUrl": "http://xxx/v1",
    "apiKey": "xxxxx",
    "modelId": "glm-5.1"
  }
]

重启 Trae,满怀期待地打开模型下拉框——什么都没有

让auto模型ai解释一番:“翻了 Trae 的源码才发现,国内版的 settings.json 里根本没有解析 trae.customModels 这个字段的逻辑。自定义模型的配置走的是 Trae 内部的存储机制,只能通过 UI 操作添加。“,我被它蠢哭了o(╥﹏╥)o

教训:别折腾Trae CN的配置文件了,直接走 UI,且模型选聪明点的。


坑2:添加成功,但发消息一直转圈

老老实实走 UI:设置 → 模型 → 添加模型 → 自定义配置,填好地址和 Key,验证通过,模型出现在列表里了。

然而,选上glm-5.1这个模型发消息,提示Concurrency limit exceeded for account, please retry later
image
改选glm-5这个模型发消息,一直转圈,没有任何响应
image

第一反应是:可能这个key不支持流式输出?

查了一下trae文档,配置自定义模型时,非完整链接需要在 baseUrl 后面添加 v1。完整链接则需要拼接v1/chat/completions。可能有些厂商提供的连接是v2接口,需要在 baseUrl 后面添加 v2

赶紧用 curl 测了一下:

# 先把请求体写入文件(PowerShell 直接传 JSON 会被转义!)
$body = '{"model":"glm-5.1","messages":[{"role":"user","content":"hello"}],"max_tokens":50}'
[System.IO.File]::WriteAllText("$env:TEMP\test.json", $body, [System.Text.UTF8Encoding]::new($false))

# 非流式测试
curl.exe -s -X POST "http://xxx/v1/chat/completions" -H "Content-Type: application/json" -H "Authorization: Bearer sk-xxx" -d "@$env:TEMP\test.json"

# 流式测试(加 "stream":true)

结果:非流式 200,流式也 200。返回是完全正常。

顺便提一个 PowerShell 的坑:直接用单引号传 JSON 给 curl.exe 会被 PowerShell 转义,导致 400 错误。必须先写入文件再用 @文件路径 方式传参。这个坑卡了我好一会儿。

转圈问题后来没有复现,可能是首次连接延迟或网络波动。

教训:遇到"转圈",先用 curl、cc-switch等工具直连测试,排除接口本身的问题。


坑3(致命):503 No available accounts——这不是你的问题

转圈问题消失后,我再次尝试发送消息,这次等来的是一个明确的错误:
image

No available accounts: no available accounts (HTTP Status: 503)

第一反应还是链接的问题。但 curl 测试明明一切正常啊?

让模型仔细分析后才发现:这个 503 根本不是api模型链接返回的,是 Trae 自己的后端返回的。

关键发现:Trae CN 的自定义模型功能,虽然允许你添加模型、验证 Key,但实际调用时,请求并不是直连你的api模型链接,而是经过 Trae 的后端代理转发。Trae 后端会先检查你的账户权限和额度:

  • Free(免费)用户:自定义模型调用受限,额度用完或权限不足时返回 503
  • Pro(付费)用户:自定义模型调用正常

也就是说,不管你的api模型链接有多正常、Key 有多有效,Free 用户就是用不了自定义模型。这不是配置问题,是平台限制。


深挖:凭什么说 503 是 Trae 后端返回的?

你可能会问:你怎么知道 503 不是api模型链接返回的?光凭猜测吗?

不是。我让模型ai翻了 Trae CN 的源码,找到了四层证据。

证据1:错误格式不对

"No available accounts" 不是 OpenAI 兼容 API 的标准错误格式。标准格式长这样:

{"error": {"message": "...", "type": "...", "code": "..."}}

而我们的api模型链接 curl 测试返回 200 完全正常,所以 503 不是api模型链接返回的。

证据2:客户端源码里找不到这个错误

Trae CN 安装目录下有个 main.js(约 1400 行、几十 MB 的混淆代码)。我搜了以下关键词,全部无匹配

  • "No available accounts"
  • "availableAccounts"
  • "noAvailableAccount"

错误文本既不在客户端硬编码,也不是本地生成的,只能来自服务端响应

证据3:WebSocket 连接地址的构造逻辑(铁证)

main.js 第 1377 行找到关键代码(已反混淆):

// WebSocket 连接地址构造
vse = async (t, e) => {
  if (e?.isBytedanceUser || !e?.userInfo) return "";
  if (e?.isBusinessUser) {
    // 企业用户:连接到企业自己的后端
    const i = e?.userInfo?.account?.saasBootConfig?.apiHost || "";
    return i ? `wss://${new URL(i).host}/custom_model` : "";
  }
  // 普通 Trae 用户:连接到 Trae 官方域名的 WebSocket 服务
  return vn({ config: t.trae, ctx: e });
}

看懂了吗?自定义模型的请求根本不是直连你的api模型链接,而是通过 WebSocket 连接到 Trae 服务端的 /custom_model 端点。Trae 服务端收到请求后,先做权限校验,再转发到你配置的api模型链接地址。

  • Business 用户(企业版):走 wss://<企业apiHost>/custom_model
  • 普通 Trae 用户:走 Trae 官方域名的 WebSocket 服务

证据4:账户数据实锤

storage.jsoniCubeServerData 中可以看到:

{
  "entitlementInfo": {
    "identityStr": "Free",
    "identity": 0,
    "isPayFreshman": false,
    "permission": 0
  }
}

identity: 0 + permission: 0 = Free 用户,没有自定义模型的调用权限。503 就是在这一层被拦的。

修正后的调用链路

flowchart TD A[用户发消息] --> B[Trae 客户端] B -->|WebSocket 连接| C[Trae 服务端<br/>wss://xxx.trae.com/custom_model] C --> D{检查用户权限} D -->|Free 用户<br/>identity=0, permission=0| E["503 No available accounts"] D -->|权限通过| F[转发到用户配置的api模型链接] F --> G[返回模型响应] style E fill:#ff6b6b,color:#fff style G fill:#51cf66,color:#fff

所以之前说"HTTP 代理转发"不够精确,实际上是 WebSocket 连接到 Trae 服务端的 /custom_model 端点,由服务端做权限校验后再转发。


那怎么办?(推荐路线5)

路线1:继续人手用 Trae 内置的 GLM-5.1(最简单)

Trae CN 已经内置了 GLM-5.1,直接在模型下拉框选就行,走官方通道,Free 用户有免费额度。如果你只是想用 GLM-5.1,完全不需要折腾自己api模型链接。

路线2:升级 Pro 会员

如果你需要大量使用自定义模型(走自己的 Key),升级 Pro 后 503 问题消失。但这就不是"免费"了。

路线3:用 Cline 插件或者改用开源的trae-proxy绕过 Trae 代理

这是最硬核的方案:

  1. 安装 Trae 国际版(和国内版可以共存)
  2. 在插件市场安装 Cline 插件
  3. 在 Cline 里配置你的api模型链接地址和 Key

Cline 插件是直连你的 API 端点的,不经过 Trae 后端代理,所以不会出现 503。但缺点是 Cline 的交互体验不如 Trae 原生对话那么丝滑。

而trae-proxy是上一年的项目,现在好像没有在维护了。

路线4:改用codebody

可免费试用glm-5.1,但是要消耗积分。

路线5:改用claude等工具

亲测可行,爽哉。
image


一张图总结

flowchart TD A[用户发消息] --> B[Trae 客户端] B -->|WebSocket 连接| C[Trae 服务端 /custom_model] C --> D{用户身份检查} D -->|Free 用户<br/>identity=0, permission=0| E[503 No available accounts] D -->|Pro 用户| F[转发到用户配置的api模型链接] F --> G[返回模型响应] style E fill:#ff6b6b,color:#fff style G fill:#51cf66,color:#fff

你的api模型链接从头到尾都没被访问到——请求在 Trae 服务端就被拦了。


最后的忠告

  1. 别改配置文件:Trae CN 不读 trae.customModels,只能走 UI
  2. 先 curl、cc-switch 测api模型链接:遇到问题先排除api模型链接本身
  3. PowerShell 传 JSON 要写文件:直接传会被转义导致 400
  4. Free 用户别折腾内网自定义模型:503 是平台限制,不是你的配置问题
  5. 内置模型优先:Trae CN 已内置 GLM-5.1 等主流模型,直接用
  6. API Key 别写文件:在 IDE 设置面板手动输入,避免泄露

希望这篇文章能帮你少踩几个坑。

与君共勉。

posted @ 2026-06-16 13:08  昂流  阅读(71)  评论(0)    收藏  举报
//替换成自己路径的js文件 hhttp(s)://static.tctip.com/tctip-1.0.4.min.js