dsh-trae-connect
把 Trae(SOLO CN) 订阅里的模型接入 DeepSeek Harness。
⚠️ 只对我自己的机器有效。 本插件读取的是宿主侧导出的明文凭据快照, 里面的 token 是我自己账号的。别人 clone 下来直接用会连不上——需要自己导出凭据, 并按自己的环境改常量。改法见下方自用改法。
它做什么
在 DSH 里以 OpenAI 兼容端点暴露 Trae 的 preset 模型,让模型选择器里出现 Trae 分组,
可直接对话。
DSH ──OpenAI──▶ 本插件的回环 shim ──Trae SSE──▶ trae-api-cn.mchost.guru
shim 只绑 127.0.0.1 随机端口 + 32 字节随机 bearer(timingSafeEqual 比对),
只服务 /healthz、/v1/models、/v1/chat/completions,无写接口。区别在于上游不是
OpenAI 形状,所以要把 Trae 的 SSE 逐事件翻译成 OpenAI 的 chat.completion.chunk。
为什么是这条入口(本项目最花时间的部分)
Trae 的推理入口不是 /api/ide/v2/llm_raw_chat。那条路属于 BYOK / 自定义模型通道
(dylib 里叫 llm_raw_chat_custom_model),要服务端按 (user, env, function) 预置一份
app config,外部调用只会拿到:
2001 failed to do chat: failed to get app config: record not found
| 入口 | 结果 |
|---|---|
/api/ide/v2/llm_raw_chat |
✗ BYOK / 自定义模型专用,外部调用恒 2001 |
/api/ide/v1/llm_raw_chat |
✗ 4001 param is invalid,请求 schema 与 v2 不同 |
/api/agent/v3/llm_utils_chat |
✓ 可用(Go 服务,内部名 llm_raw_chat_v2) |
真正能用的是 agent 服务。它只要求三样东西:
app_id+app_version_code(int64) —— 来自product.json的bootConfig,是 产品级常量,不是账号级;同一串也被硬编码在libai_agent.dylib里。function—— 必须是服务端为该appId注册过的名字(见TRAE_FUNCTIONS)。 给错名字会回no function config found for appId=..., function=...。messages[].content必须是对象数组[{type:"text",text:"..."}],不是字符串。 给字符串会回cannot unmarshal string into Go struct field LLMRawMessage.messages.content。
拿到一个有效 function 之后,任意 preset 模型都可用(实测 9×19=171 组合全过)。
凭据
容器看不到宿主 macOS 的 ~/Library/Application Support/TRAE SOLO CN/。因此由宿主侧
脚本解密 byteCrypto 信封后,写明文快照到:
$DSH_HOME/trae/credential.json # appId / appVersionCode / 会话 token
$DSH_HOME/trae/models.json # 模型目录
(~/.dsh 已 bind mount 成容器里的 /root/.dsh。)
本插件只读这两份快照,绝不碰桌面 App 自己的目录。
安装
前置:已安装并登录 Trae(SOLO CN)桌面版,且已导出上述快照。
dsh plugin --profile web add github:yembors64632/dsh-trae-connect
Desktop / TUI 把 --profile 换成 desktop / tui。
cordis.patch.yml 会注册 llm-trae 这个 provider id,不改动 profile 当前的默认模型。
自用改法:把这段提示词丢给你的 AI
插件是照着我自己的机器写死的。你在自己环境改的时候,把下面这段连同插件目录交给 AI:
我在用 DeepSeek Harness(DSH),装了你写的 dsh-trae-connect 插件。
这个插件是照着原作者的环境硬编码的,我要改成适配我自己的环境。
请你:
1. 先通读插件目录下的 lib/index.js,找出所有硬编码的路径、端点、常量;
2. 对照我下面的实际环境,逐项告诉我每一处需要改成什么,并给出修改后的完整代码;
3. 改完给我一条自检命令,用来验证凭据能读到、上游能连通。
我的实际环境:
- 我用的是(Linux / macOS / Windows WSL),DSH 数据目录 $DSH_HOME 是:<填你的路径>
- Trae 桌面版装在:<填 App 的安装/数据目录>
- 我的账号情况:<个人号 / 企业号>
- 插件报的错是:<贴报错>
注意:只改凭据读取路径和上游端点,不要动 SSE 翻译、OpenAI 兼容层这些
协议实现——那部分是验证过能用的。
你大概率要改什么
| 差异点 | 位置 |
|---|---|
| 快照路径 | lib/index.js 里凭据解析段(默认读 $DSH_HOME/trae/) |
| 网关域名 | 顶部 DEFAULT_GATEWAY(默认 https://trae-api-cn.mchost.guru) |
| 账号/计费网关 | DEFAULT_ACCOUNT_BASE(默认 https://api.trae.cn) |
appId / appVersionCode |
随 Trae App 版本变化,需从你的 product.json 取 |
默认 function |
FUNCTION_FIELD,可选值见 TRAE_FUNCTIONS |
不要动 SSE 翻译层与 OpenAI 兼容层——那部分已验证可用。
适配版本
| 项 | 版本 |
|---|---|
| 插件 | 0.1.0 |
| DSH 核心 | 0.1.5 / 0.1.6 / 0.1.7 alpha 线 |
| 上游 | Trae(SOLO CN)桌面版 |
| Node.js | ^22.19.0 || >=24.0.0 |
| 界面 | Web / Desktop / TUI |
DSH 核心版本不匹配会导致 DSH 启动失败,不是静默降级。装之前先对表。
依赖 @deepseek-ai/* 系列包(cordis、dsh-llm、dsh-llm-pi-ai、dsh-home-paths、
dsh-host-webserver、schemastery)与 @earendil-works/pi-ai。
如果 star 多了:作者会考虑做全版本适配
现在是单点适配——我验证通过的那一套环境能跑,换个版本就可能挂。这是有意的取舍: 在没确认有多少人用之前,为每个 DSH 版本做兼容矩阵的性价比不高。
如果这个仓库 star 多了(说明确实有人在用),作者会考虑做以下工作:
- 跨版本适配矩阵:把
0.1.5-rc.x/0.1.6-alpha.x/0.1.6/0.1.7各代的 peer range 与配置入口差异整理成表,插件加载时按宿主实际能力自适应。 - 凭据导出的跨平台化:目前宿主导出脚本是 macOS 取向(读 App 的 Application Support)。 补 Windows / Linux 的路径探测与 safeStorage 变体。
- 上游变更的降级策略:上游接口是私有实现,随时可能变。计划做「实时 → 上次成功 → 内置兜底」三级降级,并在卡片上显示当前来源与失败原因。
- 安装体验:一条命令探测环境 + 拉取对应版本,替代现在的手工对照。
想要哪个,开 issue 说一声——用的人多就先做哪个。
风险
上游是私有实现,没有稳定契约。Trae 服务端一改,插件就可能失效。
app_id / function 这类产品级常量随 App 版本变化,升级 App 后可能需要同步更新。
这不是 bug,是这类方案的固有风险。
免责声明
本项目仅供个人学习与研究,驱动你自己账号在你自己的机器上使用。 使用者需自行遵守 Trae 的服务条款。因使用本项目产生的任何后果 (包括但不限于账号受限、积分消耗、服务中断),由使用者自行承担。 仓库不含任何真实账号、凭据或密钥。
许可
MIT
No comments yet. Be the first to write one.