Bundle
dsh-trae-connect
把 Trae (SOLO CN) 订阅里的模型接入 DeepSeek Harness。凭据由宿主侧 scripts/export-trae-plain.mjs 解密导出为明文快照,插件只读快照。
- Source
- yembors64632
- stars
- 1 stars
- License
- MIT
- Updated
- Updated 5 days ago
Readme
# dsh-trae-connect
把 **Trae(SOLO CN)** 订阅里的模型接入 [DeepSeek Harness](https://github.com/deepseek-ai)。
> ⚠️ **只对我自己的机器有效。** 本插件读取的是**宿主侧导出的明文凭据快照**,
> 里面的 token 是我自己账号的。别人 clone 下来直接用会连不上——需要自己导出凭据,
> 并按自己的环境改常量。改法见下方[自用改法](#自用改法把这段提示词丢给你的-ai)。
---
## 它做什么
在 DSH 里以 OpenAI 兼容端点暴露 Trae 的 preset 模型,让模型选择器里出现 `Trae` 分组,
可直接对话。
```text
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 服务**。它只要求三样东西:
1. `app_id` + `app_version_code`(int64) —— 来自 `product.json` 的 `bootConfig`,是
**产品级常量**,不是账号级;同一串也被硬编码在 `libai_agent.dylib` 里。
2. `function` —— 必须是服务端为该 `appId` 注册过的名字(见 `TRAE_FUNCTIONS`)。
给错名字会回 `no function config found for appId=..., function=...`。
3. `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)桌面版,且已导出上述快照。
```sh
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:
```text
我在用 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
Install
dsh plugin --profile web add github:yembors64632/dsh-trae-connect
Profile: web
With the hub plugin installed, ask your agent to install it by name — it resolves the same plan shown here.
dsh plugin --profile web add github:stvlynn/dsh.fish#path:packages/dsh-plugin-hub
install dsh-trae-connect from the hub
- This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.