前言¶
DeepSeek Harness (DSH) 采用插件化架构,旨在通过插件扩展功能。dsh-dingtalk-channel 是一个插件,它将钉钉 IM 机器人 channel 接入 DSH。该插件通过钉钉官方的 Stream 模式(WebSocket 长连接)建立连接,不需要公网回调地址或服务器配置 webhook。每条单聊或群聊消息都可以作为入口驱动一个完整的 agent,回复内容也会流式返回到对话中。
核心功能¶
下面介绍该插件的主要能力。
一会话一 agent¶
插件为每个会话创建一个独立的 agent。会话 ID 通过会话键确定性派生(格式为 ding-<chatId>),保证跨重启的稳定性。通过配置 sessionScope: chat-sender,可以在共享群里让每个成员拥有独立的 agent。
即时反馈与静默过程¶
钉钉原生不支持打字指示或思考过程卡片。插件通过先发送“🤔 已收到”的回执来提供即时反馈。在 agent 调用 bash、read 等工具的过程中,中间步骤不会发送聊天消息,只发送最终的 markdown 格式答案,思考过程仅在回执或思考表情中暗示。
访问策略与权限¶
插件提供细粒度的访问控制。
- 单聊/群聊限制:通过
senderAllowlist限制单聊发送者,通过groupAllowlist限制群会话。 - 群聊 mention:通过
requireMention配置,仅在群消息被 @ 时响应。 - 审批机制:支持审批流程,agent 需要批准时会在对话中发送审批消息,回复“允许一次”或“拒绝”进行结算。
- 权限范围:chat agent 拥有与宿主进程相同的权限,可以执行 bash、读写文件、git、网络操作及使用 skills。
长连接与命令¶
- 长连接自愈:SDK 内置自动重连机制,断线后自动尝试恢复。
- 命令支持:支持
/ping、/help、/status、/stop、/new等命令。 - 可观测性:拒绝、失败或断线等事件会通过 stderr 输出通知。
安装与启用¶
钉钉侧准备¶
- 登录 钉钉开发者后台。
- 创建一个企业内部应用,记下 ClientID 与 ClientSecret。
- 在应用能力中添加机器人,完善信息,将消息接收模式设置为 Stream 模式,然后发布应用。
- 将机器人拉入目标群或让成员私聊它。
安装插件¶
在终端执行以下命令安装插件:
dsh plugin --profile web add github:ttmouse/dsh-dingtalk-channel
配置凭证¶
在 ~/.dsh/profiles/web/cordis.patch.yml 中添加配置。如果需要走环境变量,可以使用 !!js process.env.… 语法。
- id: dingtalk-channel
name: 'dsh-dingtalk-channel'
config:
clientId: 'ding...'
clientSecret: '...'
botName: '我的助手'
requireMention: true
# sessionScope: chat-sender
# preset: standard
# cwd: /path/to/workspace
启动 DSH:
dsh web
启动日志中若显示凭证校验通过,说明连接成功。在钉钉中私聊机器人发送 /ping,应收到 pong。
典型用法¶
基础对话¶
配置好 clientId、clientSecret 和 botName 后,通过聊天即可与 agent 交互。工具可以通过 preset 挂载到会话 agent 上。
共享群多用户¶
在共享群中,若想让每个人拥有独立的 agent,需在配置中设置 sessionScope: chat-sender。这样插件会根据发送者生成独立的会话键,实现一人一号。
审批操作¶
当 agent 需要执行敏感操作(如审批)时,它会在聊天中发起审批请求。你可以直接回复“允许一次”或“拒绝”来控制流程。
注意事项¶
- 权限风险:chat agent 拥有与宿主进程同等的权限,包括执行 bash 命令、读写文件等。请仅在可信的环境或群组中使用。
- 功能限制:钉钉原生不支持思考过程可视化,工具调用过程不会直接显示在聊天中;目前暂不支持图片和文件的转发;不支持扫码注册,需在后台手动创建应用。
- 工作区切换:目前不支持
/cd、/model use、/ws等工作区切换与模型热切换功能。 - 默认配置:默认禁用了
ask_user_question和exit_plan_mode工具,审批改为对话内回复结算。
许可证¶
该插件遵循 MIT 许可证。