dsh-choice:聊天中的单选面板

前言

在 DeepSeek Harness(DSH)里,智能体若要让用户从若干候选项里只选一项,通常会用到内置的 ask_user_question。该工具会在当前轮次内阻塞,直到用户作答。若选项里需要缩略图、试听音频,或希望先发出卡片、等用户点选后再进入下一轮对话,dsh-choice 提供的是另一条路径:在会话流里插入一块单选面板,工具调用立即返回,选择结果以普通聊天消息回传。

下面按定位、能力、安装、用法和注意事项说明该插件。

这是什么

dsh-choice(npm 包名 @machine202502/dsh-choice)由维护者 machine202502 发布,分类为客户端插件。它在 DSH 聊天界面中渲染单选看板,与内置 ask_user_question 并列出现;每个选项可以是纯文本、图片或声音。用户在某一行按下勾选后,其余行失效,所选内容作为一条普通消息发送,从而开始下一轮对话。

核心功能

工具接口

智能体通过下列调用展示看板:

ask_user_choice({ title, subtitle?, options, noneLabel? })

各字段含义:title 为卡片标题;subtitle 可选;options 为选项数组;noneLabel 可选,用于末尾「以上都不是」一类行的文案。

交互行为

  • 每块看板只能选一次:选中行的勾选按钮生效后,其他行不可再点。
  • 可选「以上都不是」:由 noneLabel 提供文案的尾部一行。
  • 选定之后,声音与图片预览仍可使用。
  • 非阻塞:与 ask_user_question 不同,本工具调用后立即返回,不占用当前轮次等待用户输入。
  • 子智能体不可用:仅主智能体可展示看板;若由被其他在线智能体托管的调用方发起,会拒绝并提示人机交互不可用。

卡片上可见的文案(标题、副标题、选项标题与描述、noneLabel)均由智能体按对话语言提供;插件自带的「选择」「播放」「打开」等按钮文案遵循下文语言设置。

卡片 UI

每一行约 52 px 高的预览区(图片缩略图或 ▶ 播放按钮)、标题与描述,右侧为圆形勾选按钮。点击图片可放大;点 ▶ 使用普通 Audio 播放声音。用户确认选项后,编辑器中原有草稿文本保留,选择结果单独作为一条消息发出。

选项结构

{
  "kind": "text",              // 必填: text | image | audio
  "title": "Keep as is",       // 行标题
  "description": "…",          // 可选第二行
  "value": "…",                // 发送到聊天的文本(默认等于 title)
  "src": "C:\\sounds\\a.wav"   // image/audio: http(s) URL 或本地绝对路径
}

本地图片或音频会被复制到 %LOCALAPPDATA%\dsh-choice\media,并通过本机回环地址提供访问。

本机 Bridge

插件在 127.0.0.1:49236 提供 HTTP 服务:

Method Path 用途
GET /status 端口与 media 计数
GET /media/<file> 提供图片或音频
POST /attach 复制本地文件并返回 URL
GET /settings 读取已存设置(language)
POST /settings 保存 language:ru、en、zh 或 auto

界面语言

在插件行配置(plugins.row.config)中可选择界面语言:Русский、English、中文或 Авто。值写入 %LOCALAPPDATA%\dsh-choice\settings.json,无需重启即可作用于卡片与表单。

解析顺序为:

  1. 已保存的 language 为 ru、en 或 zh 时直接使用;
  2. auto 时跟随应用语言:先 document.documentElement.lang,再 navigator.language;ru* → ru,zh* → zh,其余 → en;
  3. 未存储时默认为 ru。

可在 Plugins → Choice 中修改。卡片正文仍由智能体按对话语言填写,仅插件自带控件文案跟随上述规则。

安装与启用

在 DSH 依赖配置中加入包版本(以 README 为准):

"@machine202502/dsh-choice": "^0.1.1"

并将 dsh-choice 加入 dsh.profile.bundles。主机侧(host)加载需重启 DSH;客户端侧随页面刷新即可。package.json 中当前发布版本为 0.1.2,引擎要求 Node >=20,许可证 MIT。

DSH 生态奉行「一切皆插件」;社区目录站点 skillhub.cn 与 DeepSeek、幻方无官方从属关系,安装前请自行核对源码与许可证。插件在本机 dsh 进程权限下运行。

典型用法

智能体在需要用户从多个方案(含配图或试听)中做唯一选择时,调用 ask_user_choice,构造 options 数组。文本项只需 kind: "text" 与 title(及可选 description、value)。图片或音频项设置 kind 为 image 或 audio,src 为 HTTPS 地址或 Windows 本地绝对路径;本地文件经 Bridge 的 /attach 流程进入 media 目录后再展示。

若需要允许用户明确表示「都不选」,传入 noneLabel,看板末尾会出现对应行。

示例骨架(字段名与 README 一致,选项内容需按实际对话填写):

{
  "title": "请选择要保留的配置",
  "subtitle": "只能选一项",
  "noneLabel": "以上都不适用",
  "options": [
    {
      "kind": "text",
      "title": "保持现状",
      "description": "不修改当前配置",
      "value": "keep"
    },
    {
      "kind": "image",
      "title": "方案 A 示意图",
      "src": "https://example.com/a.png"
    },
    {
      "kind": "audio",
      "title": "方案 B 试听",
      "src": "C:\\sounds\\b.wav"
    }
  ]
}

调用后工具立即返回;用户点选后,聊天流中出现代表所选 value(或默认 title)的消息,后续轮次可据此继续推理。

适用场景与注意

适合:需要在同一会话里展示带图、带音的单选题;希望不阻塞当前 tool 轮次;主智能体直接与用户交互的场景。

注意:

  • 子智能体调用会被拒绝,编排时勿把该工具下放给子 agent。
  • 本地媒体依赖 %LOCALAPPDATA%\dsh-choice\media 与 127.0.0.1:49236,部署或安全策略需允许本机回环访问。
  • 界面语言默认与 auto 规则见上文;中文用户可在插件设置中选「中文」或「Авто」。
  • 安装命令与版本以项目 README 与 npm 包为准,勿凭仓库名自行拼接 dsh plugin add github:... 一类未经文档记载的命令。

结尾

dsh-choice 在 DSH 聊天中补上「单选看板 + 图文音选项 + 非阻塞回传」这一小块交互能力,与 ask_user_question 形成互补。进一步了解可访问社区目录页与源码仓库:

  • 目录页:https://www.skillhub.cn/plugins/machine202502/dsh-choice
  • GitHub:https://github.com/machine202502/dsh-choice
羽毛球分组比赛记分
小程序二维码

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

小夜