dsh-mx-test · git:20261104.ee4272d · 2026-11-04 · sha256 9df9557ee434ecce

dsh-mx-test git:20261104.ee4272dB

Immutable. This exact content never changes and is served at /api/v1/blob/9df9557ee434ecce.

---
name: dsh-mx-test
description: 用 dsh(DeepSeek Harness)ACP 协议对 modelmux(mx)网关做端到端模型测试。适用于:用 dsh 测 mx、dsh 接入 modelmux、渠道端到端验收、换 harness 复测渠道、dsh 会话编程驱动(新建/停止/续接/固定模型/固定 preset)、验证工具调用与文件落盘、排查 dsh 到 mx 链路报错。测试必须用免费或当前渠道最低倍率模型,账单前后核对。
---

# dsh → modelmux 端到端测试(ACP 协议)

用 dsh 的 **acp profile**(stdio JSON-RPC 服务器)直连 modelmux 网关(OpenAI 兼容协议),对池内**每个渠道**的模型做端到端 Agent 测试。
本文件只保留**流程与判据**;overlay 机制与 dsh 会话 API 见 [references/setup.md](references/setup.md),
成本与账单见 [references/billing.md](references/billing.md),
网关侧判据(工具桥接 / 排队文案 / messageCount)见 [references/gateway-quirks.md](references/gateway-quirks.md)。

## 测试成本红线

端到端 Agent 测试一轮轻松几万 token,用高倍率模型等于直接烧钱。这条优先于本文其他内容。

1. **先找免费模型**:`mx model <cid>` 看倍率,倍率 0 的先用(如 `catpaw/longcat-2.0`、`loomy/spark-x2.6`)。
2. **没有免费模型时**:先 `mx bill <cid>` 记录额度,选**最低**倍率;不选 `*-pro`、`*-max`、`kimi-k3` 等高倍率旗舰。
3. **倍率显示 `-`**:渠道没暴露倍率(如 `astudio`),按文档标注默认档;无法判断成本时只跑单轮最小对话并如实注明。
4. **每次都要核对账单**:免费预期差 0,付费预期差值 > 0 且量级合理;流程与「已用 0」陷阱见 [references/billing.md](references/billing.md)。
5. 不确定就先 `mx model <cid>` + `mx bill <cid>`,把选择和成本说清楚,不要直接开跑。

> dsh 的成本闸门:ACP `session/prompt` 单轮阻塞语义 + harness `--timeout` 兜底,
> 提示词写短,overlay 只放本次要测的模型。详见 billing.md。

## 为什么用 dsh + 为什么走 ACP

- dsh 是主人日常在用的 harness(桌面版 + QQ 机器人生态),换 harness 复测能发现渠道桥接层在另一套 Agent 工作流下的问题;
  同一模型在不同 harness 下工具名不同,桥接问题可能只在一边暴露(见 gateway-quirks.md)。
- dsh 的编程入口有三层:headless CLI(一次性任务)、**ACP stdio 服务器**(官方为「测试运行器、脚本化控制器」设计)、宿主内 cordis 插件(dsh-qqbot 的路子)。
- **ACP 是测试的正解**:`session/new`(新建会话)、`session/set_config_option`(逐会话固定模型)、`session/prompt` / `session/cancel`(提交/中止)、`session/close` / `session/list` / `session/resume`(停止/枚举/续接),全操作覆盖;headless 无 `--model` 参数且实测存在静默退出问题(见 troubleshooting)。

## 前置条件

| 条件 | 验证 |
| --- | --- |
| 网关在跑 | `curl -s http://127.0.0.1:4412/health` 同时含 `"ok":true` 与 `"service":"modelmux"` |
| dsh 桌面版已安装 | 存在 `C:\Users\<用户>\AppData\Local\Programs\DeepSeek Harness\DeepSeek Harness.exe` |
| 目标渠道已登录 | `mx status <cid> --json` 的 `credentials.present` 为 `true` |
| 已选免费/最低倍率模型 | `mx model <cid>` 看倍率(缓存可能过期,要最新加 `--refresh`) |
| 从仓库根运行 harness | harness 的生成 overlay 落 `<仓库根>/.tmp/` |

## 端到端工作流

### 1. 冒烟(默认 catpaw/longcat-2.0,免费)

```bash
node .agents/skills/dsh-mx-test/references/mx-acp-test.mjs "Reply with the single word: pong."
```

成功标志:`prompt settled: stopReason=end_turn` + 助手回复非空;
`configOptions` 里 `currentValue` 是 `["modelmux","catpaw/longcat-2.0"]`(路由生效的直接证据)。

### 2. 换渠道/模型(动态生成 overlay)

```bash
node .agents/skills/dsh-mx-test/references/mx-acp-test.mjs "Reply pong." --model loomy/spark-x2.6
```

`--model <cid>/<模型>` 会生成临时 overlay(`.tmp/dsh-mx-overlays/generated-acp-overlay.yml`),
provider 必须写全——patch 对同 id config 是 key 级深合并,只写 `models` 会把 `api`/`baseURL` 抹掉。

### 3. Agent 工具往返(渠道验收必跑)

只回一句话证明不了渠道能跑 Agent。必须完成**多轮工具调用 + 文件读写**,再核对落盘与日志:

```bash
node .agents/skills/dsh-mx-test/references/mx-acp-test.mjs \
  "在当前目录创建 <cid>-e2e.txt,内容正好是 <模型> ok;读取确认后用终端执行 pwd 和 ls,最后一句话总结。" \
  --model <cid>/<最低倍率模型> --cwd .tmp/dsh-acp-e2e --timeout 180000

cat .tmp/dsh-acp-e2e/<cid>-e2e.txt   # 内容必须与要求完全一致
```

判定标准(完整判据与排队文案见 [references/gateway-quirks.md](references/gateway-quirks.md)):

| 检查项 | 通过标准 |
| --- | --- |
| 工具调用 | updates 统计出现 `tool_call` / `tool_call_update`(实测 6 轮);`toolCount` 字段**不是**判据 |
| 文件落盘 | 文件存在且内容一致 |
| 收敛 | `stopReason=end_turn` |
| 流式 | 网关日志 `stream: true` 且 `status: 200` |
| 多轮往返 | 网关日志 `messageCount` 随轮次增长(实测 5 → 16) |
| 无风控/协议错误 | `mx log --kind error --lines 20` 无该渠道新增条目 |

### 4. 渠道对比

各渠道先用 `mx model <cid>` 选免费/最低倍率模型,再跑同一句提示。比输出质量时各渠道必须用
同一个模型;只比健康度时各渠道用自己的免费/最低档即可。

### 5. 批量跑全部渠道

对每个渠道:`mx model <cid>` 选免费/最低倍率 → 逐个 `--model <cid>/<模型>` 跑冒烟与工具往返 → 汇总判定。
dsh harness 每渠道起独立进程互不干扰;结果按「输出格式」小节逐渠道记录。

### 6. 日志与账单核对

```bash
mx log --kind access --outcome success --lines 5   # 看 model/cid/stream/status/messageCount/points_consumed
mx log --kind error --lines 20
mx bill <cid>                                       # 免费模型前后差 0;JSON 精确比较见 billing.md
```

工作目录 `.tmp/dsh-acp-e2e` 不随渠道变动,产物按渠道命名区分;落盘证据保留不删(AGENTS.md 测试规则)。

## 已知边界

- harness 每次起新 dsh 进程、单会话单任务;跨进程续接用 ACP `session/list` + `session/resume`(harness 未启用,需要时按协议加)。
- 权限询问自动放行第一个选项(harness 内置);高危任务测试前想清楚。
- overlay 的 `models` 列表是**整表替换**:一次只能测写进去的模型,`--model` 每次重新生成。
- 桌面版 dsh 同时在跑不影响 ACP 服务器(独立进程),但别占用 4412 网关。
- ACP 会话落在「未分组」工作区:工作区归属是桌面客户端 RPC 的行为,ACP server 不做 attach(dsh-qqbot 源码 `attachSessionToWorkspace` 印证),展示问题不影响落盘与续接。

## References 索引

| 文件 | 什么时候读 |
| --- | --- |
| [references/setup.md](references/setup.md) | overlay/patch 语义、dsh 会话 API 全操作(qqbot 学来的)、环境与凭据 |
| [references/billing.md](references/billing.md) | 选模型、成本闸门、账单核对、「已用 0」陷阱 |
| [references/gateway-quirks.md](references/gateway-quirks.md) | 工具桥接、`toolCount` 判据、排队兜底文案、历史坑指针 |
| [references/troubleshooting.md](references/troubleshooting.md) | headless 静默退出、dsh.cmd 引号、常见报错 |
| [references/mx-acp-test.mjs](references/mx-acp-test.mjs) | harness 源码(无依赖 ACP 客户端) |
| [references/acp-modelmux-overlay.yml](references/acp-modelmux-overlay.yml) | 默认 overlay 样板(完整 provider 写法) |

## 输出格式

```text
结论:<通过 / 不通过 / 部分通过>
证据:
- model=<cid>/<模型> 倍率=<...> points_consumed=<...> 账单前后=<...>
- 冒烟=<stopReason> 工具往返=<tool_call 数> 落盘=<一致/不一致>
- configOptions.currentValue=["modelmux","<cid>/<模型>"]
- 访问日志:status=<...> stream=<...> messageCount=<...>
- 错误日志:<无新增 / 具体条目>
成本:<免费 0 / 付费差值 / 倍率未知>
说明:<模型行为或 harness 限制单列>
```