前言¶
DeepSeek Harness(DSH)的智能体在输出工具结果时,默认会将这部分折叠为”process”区段,用户无法直接在消息内修改参数或进行交互。如果希望模型在回答后继续收集参数、进行计算或对比,通常需要将工具结果展开为文本,再让用户手动输入。这中间的交互链路被切断,用户体验较为生硬。
dsh-tool-cards 是一个为 DSH 提供交互式聊天卡片的插件。它在助手消息内渲染滑块、下拉、分段控件、日期选择器、表单、图表和表格——用户按下提交按钮后,参数快照会作为一条用户消息回传给智能体,让模型在下一轮继续处理。该插件实现了 chat-ui/1.0 消息格式的独立版本,不依赖任何官方协议,也不复现私有实现。
功能说明¶
工作流程¶
模型调用 chat_ui 工具后,DSH host 会校验载荷(组件白名单、树深度、节点数、action 形状),并将工具结果的 meta 携带 kind: 'chat-ui/1.0' 标识。插件会在会话输出流上锚定一个自定义聊天节点(chat-ui-card),将卡片”提升”为最终聊天输出——不再折叠进工具过程。
用户在卡片上的拖动、勾选或输入操作仅更新本地状态,不产生网络请求。只有按下提交按钮时,才会通过 POST /chat-ui/action 发送 action 请求,包含 cardToken、actionId、operation 和 values。host 根据卡片令牌解析出所属会话,调用 agent.followup() 生成用户消息。智能体在下一轮即可看到参数快照。
如果当前环境不支持 uiConversation,插件会回退到在工具行内渲染卡片,功能仍然可用。
组件类型¶
插件注册了 26 种组件,分为四类:
- 输入:Slider、Checkbox、Radio、Select、Segmented、Input、Textarea、Date、Button
- 容器:Form、Pressable、Popover、Carousel
- 视觉:Chart(柱/线/饼/散点)、Map
- 展示:Card、Metric、Text、Heading、Row、Column、Divider、Badge、Alert、Table、KeyValue
Chart 和 Map 使用手绘 SVG 实现,Map 仅做坐标投影示意,不连接任何瓦片服务。
表达式使用白名单 JSON AST,例如 { op: "mul", args: [{ var: "a" }, { var: "b" }] },支持 add/sub/mul/div/round/eq/and/or/not 等运算。插件没有使用 eval,也不会生成可执行代码。
安全与限制¶
在 action 执行阶段,client 永远不会告知哪个会话属于某个 action。host 在执行时记录 card → session 映射,并通过 presentationMeta 向 client 传递一个不可见的 cardToken。action 路由只接受该 token,忽略请求体中的 sessionId,避免任意会话注入。如果 host 无法确定拥有者,插件将不发放 token,卡片以只读方式渲染。
DSH host 对载荷有强制限制:每条消息最多 120 个节点,树深度不超过 8,状态键不超过 60 个,action 不超过 20 个,文本不超过 4000 字符。畸形载荷会在到达 client 前被拒绝。
安装与启用¶
在 DSH 的 profile 中执行:
dsh plugin --profile web add dsh-tool-cards
或在 ~/.dsh/profiles/<profile>/package.json 中手动添加 bundle 行:
{ "dsh": { "profile": { "bundles": ["...", "dsh-tool-cards"] } } }
然后重启 DSH(profile patch 在启动时读取)。
典型用法¶
chat_ui 工具会出现在模型的工具集里。其描述由模型按任务决定使用时机,例如调参数、多维对比、”给我做个计算器”等,不用于纯解释或一次性结论。
以下是一个最小载荷示例,用于药剂投加量计算:
{
"title": "药剂投加量计算器",
"ui": {
"schemaVersion": "chat-ui/1.0",
"initialState": { "soilTons": 1000, "doseGPerKg": 2 },
"tree": {
"id": "root",
"type": "Card",
"props": { "title": "药剂投加量" },
"children": [
{
"id": "soil",
"type": "Input",
"label": "土壤质量 (t)",
"bind": "soilTons",
"props": { "inputType": "number", "min": 0 }
},
{
"id": "dose",
"type": "Slider",
"label": "投加量 (g/kg)",
"bind": "doseGPerKg",
"props": { "min": 0.1, "max": 5, "step": 0.1 }
},
{
"id": "total",
"type": "Metric",
"label": "理论药剂质量",
"props": { "unit": "t" },
"value": {
"op": "round",
"args": [
{
"op": "div",
"args": [
{ "op": "mul", "args": [{ "var": "soilTons" }, { "var": "doseGPerKg" }] },
1000
]
},
3
]
}
},
{
"id": "submit",
"type": "Button",
"label": "提交这次配比",
"actionId": "apply"
}
]
},
"actions": {
"apply": {
"kind": "submitToAgent",
"operation": "apply-dose",
"includeKeys": ["soilTons", "doseGPerKg"]
}
}
}
}
Action 类型包括 submitToAgent、callTool 和 openUrl(仅限 http/https)。
按钮是卡片唯一的出口:全宽、加粗、上方有分隔线。按钮文案应描述用户的下一个动作,由模型按当前任务决定,例如”应用这组参数”“计算推荐投加量”“提交这次配比”。
适用场景与注意¶
适合在需要模型在回答后继续收集参数、进行计算或对比的场景中使用,例如计算器、配置向导、多维对比工具等。
插件以当前 DSH 进程的权限运行。安装前应检查源码与许可证。插件仅使用 --dsw-alias-* 主题 token,自动跟随亮/暗主题;React 保持为 external,由 host 提供。
结语¶
dsh-tool-cards 为 DeepSeek Harness 提供了在助手消息内直接进行交互的能力,让模型在回答后仍能继续收集参数、展示图表或表格,并将结果回传到下一轮对话中。通过白名单 JSON AST 表达式和安全的 action 路由机制,插件在功能与安全性之间取得了平衡。
- 目录页:https://www.skillhub.cn/plugins/wszw142857-beep/dsh-tool-cards
- GitHub:https://github.com/wszw142857-beep/dsh-tool-cards