把 Trae 桌面端的模型接进任意 OpenAI 客户端

💡 原文中文,约2800字,阅读约需7分钟。
📝

内容提要

作者开发了 trae-proxy,一个零依赖的 Node 本地代理,将 Trae 桌面端已登录模型暴露为 OpenAI 兼容 API,支持国内版与国际版,凭据只读不落地。排查中的主要难点包括:上游新增 request_id/session_id 必填字段却返回误导性的假限流错误;企业版需依据 iCubeHostInfo 自动选路;模型目录需做 union 并采用 first-wins 策略;DeepSeek-V4.1-Flash 因客户端内置而服务端未开通,代理无法解决。

🔎

延伸解读

代理的只读设计与安全边界

trae-proxy 刻意只读取 Trae 桌面端的加密登录态,token 刷新仅在进程内存中进行,绝不写回 storage.json 或生成副本。代理也不提供账号切换功能,避免将“读”变为“改”。这种设计降低了凭据泄露风险,但用户需注意:代理本身不绕过计费或多人共享,仅适用于自己已登录的账号,且应遵守 Trae 服务条款。

企业版自动选路的实现逻辑

企业版账号的 storage.json 中包含 iCubeHostInfo 字段,公开网关会拒绝此类账号并返回误导性的 4011 错误。代理在每个请求时实时读取当前登录态的 iCubeHostInfo,探测到企业网关就整体切换(对话和模型目录均如此),普通账号则回落公开网关。这样切换账号无需重启进程,但要求代理持续监控登录态变化。

模型目录的 union 与 first-wins 策略

Trae 的模型分散在多个 directory function 下,代理按优先级 union 所有可拉取结果,并采用 first-wins 策略:同一模型出现在多个 function 时,第一个命中的决定调用时携带的 function 字段。CN 区曾漏掉 solo_agent 目录,将其追加到列表末尾后,借助 first-wins 不影响已有模型,一次性多出 4 个可用模型。

DeepSeek-V4.1-Flash 不可用的根因

该模型在 Trae 客户端能正常使用,但通过代理转发会稳定报 4001 参数无效。排查发现,服务端配置表中没有此模型,客户端能使用是因为 native 二进制内置了 fallback 模型表。客户端本地缓存中的该模型缺少服务端下发的 encrypted_model_params 字段,日志也显示回退。这是客户端内置与网关未开通的时间差,代理侧无法解决,只能等待后台开通。

Q&A

trae-proxy 是什么?它有什么作用?

trae-proxy 是一个纯 Node、零第三方依赖的本地代理,将 Trae 桌面端已登录的模型暴露成标准的 OpenAI 兼容 API。任何支持 OpenAI 协议的客户端、IDE 插件、SDK、CLI,填上 baseURL + apiKey 就能使用 Trae 的模型。

trae-proxy 如何配置国内版和国际版的 baseURL 和 apiKey?

国内版(cn)的 baseURL 是 http://127.0.0.1:39303/v1,国际版(ai)的 baseURL 是 http://127.0.0.1:39304/v1。一个进程同时服务两个区域,各自使用独立的持久 bearer key 做本地鉴权。

trae-proxy 如何处理 Trae 桌面端的登录态和凭据?

Trae 桌面端的登录态加密存储在本地 storage.json 中,代理只读登录态,token 刷新只在进程内存里进行,绝不写回桌面端文件、不落地副本,也不提供账号切换,避免把「读」变成「改」。

为什么 trae-proxy 会遇到假的限流错误(4011)?如何解决?

上游协议更新后,请求体新增了 request_id / session_id 两个必填字段,老客户端不传就被拒,但服务端用 HTTP 200 + error 事件返回误导性的 4011 限流错误。修法是逐请求生成两个 UUID(去掉横杠)并填入请求体。

企业版账号在 trae-proxy 中如何自动选路?

企业版账号的 storage.json 中有 iCubeHostInfo 字段,代理每个请求实时读取当前登录态的 iCubeHostInfo,探测到企业网关就整体切过去(对话和模型目录都是),普通账号回落公开网关。切换账号不用重启进程。

为什么 DeepSeek-V4.1-Flash 在 Trae 客户端能用,但通过 trae-proxy 转发会报错?

因为 Trae 桌面端的 native 二进制内置了一份 fallback 模型表,客户端本地缓存中有 DeepSeek-V4.1-Flash,但服务端配置表里没有这个模型,导致代理转发时服务端返回 4001 错误。这是客户端内置模型与服务端未开通之间的时间差,代理侧无法解决,只能等后台开通。

trae-proxy 如何获取 Trae 的模型目录?

Trae 的模型分散在多个 directory function 下,代理按优先级 union 所有能拉到的结果,采用 first-wins 策略——同一个模型出现在多个 function 里时,第一个命中的决定调用时该带哪个 function 字段。

🏷️

标签

➡️

继续阅读