dsh-qwenpaw-bridge:在不改 DSH 核心的前提下,为 QwenPaw 升级标准 ACP 能力

前言

用 DSH 跑 ACP 时,客户端通常通过 @deepseek-ai/dsh-acp 与 Harness 对话。若要在 QwenPaw 这类 ACP 客户端里看到助手流式输出、在会话中切换权限预设,并在初始化时拿到完整模型目录,往往需要在适配层或客户端里堆私有协议。

dsh-qwenpaw-bridge 是 DSH 侧的 bundle 插件:它替换 profile 里默认的 acp 行,在标准 ACP 线路上增加 QwenPaw 约定的 _meta.qwenpaw 扩展,而不修改 DSH 核心。QwenPaw 仍对接 @deepseek-ai/dsh-acp,无需私有 wire 协议。QwenPaw 端配套插件在 BillYuan01/qwenpaw-dsh;本桥接包可单独安装与验证。

下面介绍插件定位、能力与安装步骤。

这是什么

  • 名称:dsh-qwenpaw-bridge(npm 包名与仓库名一致)
  • 维护者:BillYuan01
  • 分类:客户端(社区目录 SkillHub 归类)
  • 定位:DSH bundle 插件,在 acp profile 上为 QwenPaw 提供 live streaming、可热切换的 permission presets,以及在 _meta 中一次性下发的 model catalog(协议版本 protocol: 1)

仓库与目录页:

  • GitHub:https://github.com/BillYuan01/dsh-qwenpaw-bridge
  • SkillHub:https://www.skillhub.cn/plugins/BillYuan01/dsh-qwenpaw-bridge

核心功能

线路上仍为标准 ACP;其余能力(图片、工具更新、usage、配置更新、MCP、resume、cancel 等)按原样转发。插件主要增加以下四类行为(资料中的 fail-soft 列说明了降级方式):

1. Live streaming

通过标准 session/update,将 agent/assistant-stream 的 text-delta / reasoning-delta 映射为 agent_message_chunk / agent_thought_chunk;已提交的文本与思考会去重,避免重复投影。

若事件缺失、订阅失败或客户端选择关闭流式,则回退为 stock 的 committed 投影,行为与未装桥接时一致。客户端可在 initialize 时设置 initialize._meta.qwenpaw.streaming = false 主动关闭;响应中 "streaming": false 即表示使用 committed 模式。

2. 权限预设(可热切换)

在 _meta['qwenpaw'].permission_presets 中暴露预设列表,并在 configOptions 中增加 permission_mode 下拉项。切换方式包括标准 ACP session/set_config_option,或扩展方法 qwenpaw/permission/set、qwenpaw/permission/get。

若运行上下文中没有 ctx.permissionPresets,则不对外展示该选项,且 permission_mode 切换会被拒绝(-32602),不会静默回退到其他预设。

新建会话时可通过 session/new 的 params._meta.qwenpaw.permission_preset 指定初始预设。

3. 模型目录

在 initialize 与 session/new(及 session/resume)结果的 _meta.qwenpaw.models 中提供模型列表;每个模型可带 reasoning_efforts 等字段。模型数量取决于当前 LLM 路由,客户端不应写死数量,应断言列表非空、每项含 efforts,且恰好有一个 default: true。

若 ctx.llm 查询失败,相关字段会省略,不会导致进程崩溃。

4. 工具 kind 映射(可选)

将 tool_call.kind 按工具名映射为 read / edit / execute / search / fetch;未知名称保持 other。

环境与依赖

项 要求
Node >= 22
DSH >= 0.2.0-rc.2 < 0.3.0-0(上界排除 0.3 预发布)
@deepseek-ai/dsh-acp 同上,由 dsh-acp-app bundle 提供
@agentclientprotocol/sdk ^1.4.0,由 @deepseek-ai/dsh-acp 提供
pnpm dsh plugin add 会调用 pnpm,需在 PATH 中
客户端 任意 ACP 客户端;QwenPaw 为参考实现

DSH 会在加载插件前校验 peer 范围。版本不匹配时需用 dsh plugin --profile <name> allow-version ... 显式豁免;生产环境不建议绕过校验。

安装与启用

qwenpaw 不是 DSH 内置 profile 名,需先从自带的 acp 模板创建,再安装桥接包。若对全新 profile 名直接 dsh plugin add,只会初始化 dsh-base,没有 ACP 应用与 acp-app-startup。

1. 从 acp 模板创建 profile

下面命令初始化 profile 并立即退出,避免此时启动 ACP(acp 会等待 stdin):

# initialize the profile and exit immediately (do not boot ACP here)
dsh --profile qwenpaw --from-default-profile acp --dump-config >/dev/null

2. 安装桥接插件

# published package
dsh plugin --profile qwenpaw add dsh-qwenpaw-bridge

# local checkout (works before the first npm release)
dsh plugin --profile qwenpaw add /absolute/path/to/dsh-qwenpaw-bridge

dsh plugin add 会在 $DSH_HOME/profiles/qwenpaw 下执行 pnpm,写入 package.json 依赖并把 bundle 追加到 dsh.profile.bundles。没有 pnpm 时命令以 127 退出,不会完成安装。

安装完成后 profile 依赖大致为:@deepseek-ai/dsh-base、@deepseek-ai/dsh-acp-app、dsh-qwenpaw-bridge。bundle 会禁用原 acp 行并插入 qwenpaw-bridge;acp-app-startup 保留,负责 stdin EOF 与 --help。

3. 配置模型路由

默认使用 ctx.agentDefaultModel。若要固定 provider 与模型,将仓库内 examples/profile/cordis.patch.yml 合并进 $DSH_HOME/profiles/qwenpaw/cordis.patch.yml,并编辑 provider、models 与 API key 环境变量。不要覆盖已有路由的 patch,也不要再添加第二条 qwenpaw-bridge 行(bundle 已插入一条)。示例 patch 仅含 llm-pi-ai 与 agent-default-model。

4. 启动

dsh --profile qwenpaw

验证 bundle 组合

dsh --profile qwenpaw --dump-config > /tmp/qwenpaw.dump

grep -A8 -- "- id: qwenpaw-bridge" /tmp/qwenpaw.dump
grep -A12 -- "- id: acp$" /tmp/qwenpaw.dump | grep "disabled: true"
grep -A2 -- "- id: acp-app-startup" /tmp/qwenpaw.dump
grep -c -- "- id: qwenpaw-bridge" /tmp/qwenpaw.dump   # must print 1

预期:qwenpaw-bridge 仅出现一次,name 为 dsh-qwenpaw-bridge;acp 行 disabled: true;acp-app-startup 存在。

典型用法与协议要点

initialize 返回的 _meta.qwenpaw 包含 protocol、bridge、version(与包 package.json 的 version 一致)、streaming、models、current_model、permission_presets 等。session/new / session/resume 会重复同一结构,并按会话解析 current_model 与 permission_preset;同时 configOptions 中出现 permission_mode。

热切换权限(标准 ACP,无需重启进程):

{"method": "session/set_config_option",
 "params": {"sessionId": "…", "configId": "permission_mode", "value": "read-only"}}

扩展方法示例(SDK 会自动为方法名加前导下划线,如 _qwenpaw/permission/set):

{"method": "qwenpaw/permission/set", "params": {"sessionId": "…", "preset": "read-only"}}
{"method": "qwenpaw/permission/get", "params": {"sessionId": "…"}}
{"method": "qwenpaw/streaming/set", "params": {"enabled": false}}

适用场景与注意

适合需要在 标准 ACP 上对接 QwenPaw(或兼容 _meta.qwenpaw 的客户端)、并希望流式输出、权限预设与模型目录由 DSH 侧统一提供的场景。插件以当前 dsh 进程的权限运行;安装前请阅读仓库源码与 MIT 许可证,并确认 DSH / dsh-acp 版本落在 peer 范围内。

社区插件目录 SkillHub 为独立站点,与 DeepSeek / 幻方无官方从属关系;星标与版本以仓库与 npm 为准(当前 package 版本为 0.2.0)。

结尾

dsh-qwenpaw-bridge 把 QwenPaw 所需的 streaming、权限预设与模型目录收敛到 DSH bundle 层,保持 @deepseek-ai/dsh-acp 标准线路不变。按上文步骤创建 qwenpaw profile、安装插件并校验 dump-config 后,即可用 QwenPaw 或其它 ACP 客户端连接验证。

  • 目录页:https://www.skillhub.cn/plugins/BillYuan01/dsh-qwenpaw-bridge
  • 源码与 README:https://github.com/BillYuan01/dsh-qwenpaw-bridge
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye