把 Trae 桌面端的模型接进任意 OpenAI 客户端(一)
内容提要
trae-proxy 是一个纯 Node 本地代理,将 Trae 桌面端已登录模型暴露为 OpenAI 兼容 API,支持国内版和国际版,无需额外 API key。它只读登录态、不写回凭据,并自动识别企业版网关。作者还记录了调试中遇到的误导性错误码、模型目录遗漏及客户端内置模型与服务端未开通的时间差问题。
延伸解读
本地代理的鉴权与安全设计
trae-proxy 为国内版和国际版分别使用独立的持久 bearer key 进行本地鉴权,且 token 刷新仅在进程内存中进行,绝不写回桌面端文件。这种只读登录态的设计避免了凭据泄露风险,也符合项目提醒中“仅适用于自己已登录账号”的合规要求。
企业版账号的自动路由机制
企业版账号的 storage.json 中包含 iCubeHostInfo 字段,代理会实时读取该信息并自动切换至企业网关,普通账号则回落公开网关。这一机制使得切换账号无需重启进程,但企业版账号在公开网关上会被拒绝,因此代理必须正确识别网关类型。
模型目录的合并策略与遗漏问题
Trae 的模型分散在多个 directory function 下,代理采用按优先级 union 所有结果、first-wins 的策略。CN 区曾遗漏 solo_agent 目录,导致部分模型在客户端可见但代理不可用;将其追加到列表末尾后,一次性恢复了 4 个模型,且不影响已有模型。
客户端内置模型与服务端未开通的时间差
DeepSeek-V4.1-Flash 在 Trae 客户端可正常使用,但通过代理转发会报 4001 错误。原因是客户端 native 二进制内置了 fallback 模型表,而服务端配置表中尚未开通该模型。代理侧无法解决此问题,只能等待后台开通。
Q&A
trae-proxy 是什么?它有什么作用?
trae-proxy 是一个纯 Node、零第三方依赖的本地代理,将 Trae 桌面端已登录的模型暴露为标准的 OpenAI 兼容 API。任何支持 OpenAI 协议的客户端、IDE 插件、SDK、CLI,只需填写 baseURL 和 apiKey 即可使用这些模型,无需额外购买 API key 或复制凭据。
trae-proxy 如何保证 Trae 账号凭据的安全?
代理只读登录态,不写回桌面端文件、不落地副本。token 刷新只在进程内存里进行,绝不修改 storage.json。代理也不提供账号切换功能,避免将“读”变成“改”。
使用 trae-proxy 需要什么运行环境?
需要 Node 22.19+ 或 24+,依靠原生类型擦除直接运行 TypeScript,无需构建,也无需执行 npm install。
为什么 trae-proxy 会同时支持国内版和国际版?它们的 baseURL 分别是什么?
因为 Trae 有国内版(cn)和国际版(ai)两个区域,代理用一个进程同时服务两者,各自使用独立的持久 bearer key 做本地鉴权。国内版 baseURL 为 http://127.0.0.1:39303/v1,国际版为 http://127.0.0.1:39304/v1。
代理如何处理企业版账号?
企业版账号的 storage.json 中包含 iCubeHostInfo,代理会每个请求实时读取当前登录态的 iCubeHostInfo,自动探测企业网关并整体切换过去(对话和模型目录都切换),普通账号则回落公开网关。这样切换账号无需重启进程。
为什么某些模型在 Trae 客户端里能用,但通过代理调用却报错?
这是因为 Trae 桌面端的 native 二进制内置了一份 fallback 模型表,客户端本地缓存中有该模型,但服务端配置表里可能尚未开通。代理转发时服务端会返回“config item is empty”错误。这是客户端内置模型与服务端未开通之间的时间差,代理侧无法解决,只能等待后台开通。
调试 trae-proxy 时遇到的最具误导性的错误是什么?如何解决?
最误导的是所有对话请求失败并返回“4011 requests have exceeded the rate limit”或“4001 the param is invalid”,实际原因是上游协议更新,请求体新增了 request_id 和 session_id 两个必填字段。服务端用 HTTP 200 + error 事件报错,状态码无法提供有效信息。解决方法是逐请求生成两个 UUID(去掉横杠)并加入请求体。