DeepSeek Harness Hub
← 返回列表

Discord 桥接ghbhiee/dsh-plugin-discord

DeepSeek Harnessspec-screened在 GitHub 查看 ↗
未验证

在 Discord 里接管并继续你的 Web 会话

尚未跑自动兼容性验证,可查看页面内的依赖与入口分析。 · 最近上游提交 2026/9/10 · 已提供中文文档

DeepSeek Harness 的 Discord 桥接:在 Discord 中与你的 dsh Web 会话聊天

综合分
30.1
GitHub 分
30.1
用户评分
★ Stars
1
周下载量
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add ghbhiee/dsh-plugin-discord
该插件未发布到 npm,走 GitHub 源安装(pnpm 若拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑)
数据截至 2026/9/16(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
依赖的 DSH / Cordis 模块
@deepseek-ai/schemastery@deepseek-ai/cordis@deepseek-ai/dsh-agent@deepseek-ai/dsh-agent-presets@deepseek-ai/dsh-llm@deepseek-ai/dsh-session
用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动

README

dsh-plugin-discord

DeepSeek Harness(dsh)的 Discord 桥接插件:在 Discord 中与你的 dsh 会话聊天——正是 Web UI 所显示的那些会话,因此在办公桌前开始的对话可以通过 Discord 在手机上继续,反之亦然。

- 来自允许列表中的 Discord 用户/频道的消息会被转发到 dsh 会话中;回复会以 Discord 消息的形式返回(长回复会被拆分,代码围栏在拆分后依然保留)。
- /new 会启动一个全新会话,命名类似 [Discord] 08-18 15:04——这个固定标题在 Web 侧边栏中标记了它的来源。
- 会话通过与 Web 宿主相同的 agent 预设组合方式创建,因此它们携带完整的工具链,并且随时可以在 Web UI 中打开、继续和重命名。在 Web 上创建的会话可以通过 /use  从 Discord 接管。
- 零运行时依赖:网关运行在 Node 内置的 WebSocket 上,REST 使用内置的 fetch。

命令

启动时,桥接插件会将这些注册为真正的 Discord 斜杠命令(它们会出现在 / 选择器中)。纯文本形式仍可作为后备方式使用——即使注册尚未传播完成,输入 /new 并按回车也能生效。

| 命令 | 效果 |
|---|---|
| (任意文本) | 向频道当前会话发送提示(自动创建一个) |
| /new [标题] | 新建会话,标题带日期戳 [Discord] |
| /sessions(/list) | 最近的 Discord 桥接会话 |
| /use (/switch、/resume) | 将此频道绑定到一个会话——Web 创建的 id 也可以使用 |
| /current(/session) | 显示已绑定的会话及其状态 |
| /stop(/cancel) | 取消正在运行的回合 |
| /help | 帮助 |

任何其他以 / 为前缀的文本都会作为提示传递。

主动通知:HTTP API + MCP(监控 / 提醒 / 告警)

每个部署的桥接插件也会将自己的机器人作为推送通道来提供服务,因此 agent 和守护进程可以主动向用户发送消息,而不仅仅是被动回复。由于每个 dsh 都服务于自己的机器人,发送者身份会跟随部署:你本地的 dsh 以其机器人身份通知,你服务器上的 dsh 以其机器人身份通知。

哪些是自动的,哪些是手动的:

| 部分 | 自动? |
|---|---|
| MCP 服务器端点(POST /plugins/discord/mcp) | ✅ 插件启动时即提供服务,无需操作 |
| HTTP API(POST /plugins/discord/api/notify) | ✅ 插件启动时即提供服务 |
| Bearer 密钥 | ✅ 首次启动时自动生成 → /discord-notify.secret(0600);可通过配置 notifySecret 或环境变量 DSH_DISCORD_NOTIFY_SECRET 覆盖 |
| MCP 客户端注册(让 agent 看到该工具) | ❌ 每个客户端需一次性手动步骤,配方见下文 |

使用 notifyEnabled: false 可禁用整个接口面。

HTTP API 参考(适用于任何应用程序)

POST http://127.0.0.1:/plugins/discord/api/notify

| | |
|---|---|
| 认证 | Authorization: Bearer ——从 /discord-notify.secret 读取密钥(例如 ~/.dsh/profiles/web/discord-notify.secret) |
| Body | {"content": "text", "userId"?: "...", "channelId"?: "..."} — JSON,content 必填 |
| Target | 默认 = 第一个 allowedUsers 条目的私信;userId = 另一个用户的私信;channelId = 机器人可以发帖的服务器频道 |
| Content | Discord markdown;超过 2000 字符的文本会自动拆分为多条消息 |
| 200 | {"ok": true, "channelId": "...", "messageIds": ["..."]} |
| 400 | JSON 格式错误 / 内容为空 |
| 401 | 缺少或错误的 bearer token |
| 502 | Discord 侧投递失败({"ok": false, "error": "..."}) |

curl -s -X POST http://127.0.0.1:3080/plugins/discord/api/notify \
-H "authorization: Bearer $(cat ~/.dsh/profiles/web/discord-notify.secret)" \
-H 'content-type: application/json' \
-d '{"content": "⚠️ 磁盘使用率 92%"}'

该端点默认仅限回环访问(dsh 绑定 127.0.0.1):同一台机器上的调用方直接访问它;远程调用方通过隧道(ssh -L 3080:127.0.0.1:3080 host)或经由已经为你的 dsh 提供前置服务的任意反向代理访问。

注册 MCP 客户端(一次性,按 agent 计)

MCP 服务器端(Streamable HTTP,工具 discord_notify)已经在运行——这些配方只是让客户端指向它。

dsh 本身(让每个 dsh agent 都能使用该工具)——机器级
~/.dsh/cordis.patch.yml,然后重启 dsh:

- insert:
- id: mcp-discord-notify
name: '@deepseek-ai/dsh-mcp-client'
config:
serverName: discord
transport: streamable-http
url: http://127.0.0.1:3080/plugins/discord/mcp
headers:
authorization: Bearer

Claude Code:

claude mcp add --transport http discord \
http://127.0.0.1:3080/plugins/discord/mcp \
--header "Authorization: Bearer $(cat ~/.dsh/profiles/web/discord-notify.secret)"

仅支持 Stdio 的 MCP 客户端(通过 mcp-remote):

{ "command": "npx", "args": ["-y", "mcp-remote", "http://127.0.0.1:3080/plugins/discord/mcp", "--header", "Authorization: Bearer "] }

给其他 agent 的复制粘贴提示词

把下面这段给 agent,让它自行注册 MCP(填入你的路径):

帮我接入本机 dsh 的 Discord 通知能力:MCP 端点是
http://127.0.0.1:3080/plugins/discord/mcp(transport: streamable-http),
鉴权头 Authorization: Bearer ,密钥内容读文件
~/.dsh/profiles/web/discord-notify.secret。请把它注册进你的 MCP 配置,
然后调用 discord_notify 工具发一条测试消息「MCP 接入成功」验证。

把下面这段给 agent,让它在代码/脚本中使用 HTTP API(无需 MCP):

本机有一个 Discord 推送接口,写监控/定时脚本需要通知我时调用它:
POST http://127.0.0.1:3080/plugins/discord/api/notify,
请求头 Authorization: Bearer $(cat ~/.dsh/profiles/web/discord-notify.secret)
和 Content-Type: application/json,请求体 {"content": "通知文本"}。
返回 {"ok": true} 即送达;非 200 时把状态码和响应体记入日志,不要重试超过 3 次。

或者把这一行放进 agent 的常驻指令(CLAUDE.md 等),
这样它始终知道该通道的存在:

需要主动通知用户时(任务完成、告警、提醒),POST
http://127.0.0.1:3080/plugins/discord/api/notify,Bearer 密钥在
~/.dsh/profiles/web/discord-notify.secret,正文 {"content": "..."}。

内联提问(ask_user_question → Discord 组件)

当 agent 向用户提问时(dsh 的 ask_user_question 工具——选项选择、确认、计划审查),桥接会将其渲染为绑定频道中的 Discord 内联组件:一个用于选项的选择菜单(支持多选)、一个打开模态框以输入自由文本答案的 ✏️ 按钮,以及一个取消按钮。选择某个选项会就地更新消息,agent 的回合会带着该答案继续。

工作原理:harness 在 Cordis 瀑布流 user-questions/request 上分发问题,而桥接在其上占据一个 前置席位——浏览器的应答者会直接认领一个问题,因此位于其后的席位永远看不到该问题。从前端来看,桥接发布 Discord 卡片,并通过 next() 将同一个问题继续传递下去,因此两个界面都保持活跃,先给出的答案胜出。网页端的答案会明显地关闭 Discord 卡片。

需要 dsh >= 0.1.1(该瀑布流)。在较旧的主机上,该席位根本不会触发,问题仅保留在网页端。

文件传输

两个方向都可用,并且 agent 会被告知这些功能(当首次从 Discord 驱动会话时,每个会话会注入一次能力通知):

- Agent → Discord:agent 在其回复中写入一行 [discord-file: /absolute/path];桥接会剥离该行,并将文件作为 Discord 附件上传(图片会内联渲染)。只有位于会话工作目录下(加上配置的 uploadRoots)且在 maxUploadBytes 范围内的文件才会被发送——拒绝会在回复中报告。
- Discord → agent:用户附加的文件/图片会保存在会话 cwd 的 .discord-uploads/ 下,其路径会追加到提示中,因此 agent 可以直接读取它们。

安装

dsh plugin --profile web add github:ghbhiee/dsh-plugin-discord

通过 dsh 进程的 DSH_DISCORD_TOKEN 环境变量提供 bot token(推荐——不会有任何机密信息触及 profile YAML)。在 launchd 部署下,这意味着服务 plist 的 EnvironmentVariables 字典;在 systemd 下,是一行 Environment=;在 shell 中,则是普通的 export。

然后在 profile 的 cordis.patch.yml 中配置该行:

- id: discord-bridge
config:
allowedUsers: [""]
allowedChannels: [""]   # empty = DM-only
cwd: /Users/you/projects         # where new sessions live
preset: ""                     # agent preset; empty = deployment default
titlePrefix: "[Discord] "

Token 查找顺序:config.token → $DSH_DISCORD_TOKEN(名称可通过 tokenEnv 配置)→ tokenFile(原始 token 或 env 风格的文件)。

当两个允许列表都为空时,桥接 拒绝启动——一个不受限制的桥接会把你的 agent(及其工具)交给任何能给 bot 发私信的人。

配置

| 字段 | 默认值 | 含义 |
|---|---|---|
| token | "" | Bot token;为空时回退到 tokenEnv,然后是 tokenFile |
| tokenEnv | DSH_DISCORD_TOKEN | 当 token 为空时查询的环境变量 |
| tokenFile | "" | 存放 token 的文件——原始格式,或环境变量风格的 KEY=value 行。让密钥不进入 profile YAML |
| tokenFileKey | DISCORD_BOT_TOKEN | 当 tokenFile 为环境变量风格时查找的键 |
| allowedUsers | [] | 允许对话的 Discord 用户 id(私信必需) |
| allowedChannels | [] | 桥接监听的公会频道 id;为空 = 仅私信 |
| cwd | home dir | 新建会话的工作目录(不存在则创建)。已绑定的会话保留其创建时的 cwd——更改此项后请使用 /new |
| preset | "" | 新会话的 Agent 预设;为空则组合默认值 |
| titlePrefix | "[Discord] " | 标记 Discord 来源会话的标题前缀 |
| maxChunksPerReply | 6 | 每条回复的 Discord 消息数量上限(溢出部分截断并附通知) |
| maxUploadBytes | 8000000 | 单个出站附件([discord-file: …])的上限 |
| uploadRoots | [] | Agent 可上传的额外目录(会话 cwd 始终允许) |
| maxIncomingBytes | 25000000 | 保存到磁盘的单个入站 Discord 附件的上限 |
| stateFile | "" | 频道→会话绑定文件;为空则在 profile 目录中派生一个 |
| typingIntervalMs | 8000 | 回合运行期间输入指示器的刷新间隔 |
| gatewayUrl | "" | Gateway URL 覆盖——scripts/fake-discord.mjs 的测试接缝 |
| restBaseUrl | "" | REST 源覆盖——同样的测试接缝 |

无需 Discord 的本地端到端测试

scripts/fake-discord.mjs 在 ws://127.0.0.1:8931 / http://127.0.0.1:8932 上运行一个脚本化的假 Discord(gateway + REST)。通过 gatewayUrl/restBaseUrl(任意 token)将插件指向它,重启 dsh,该脚本会针对你真实的 dsh 部署驱动一整段对话——会话创建、/new、/use、上下文连续性——并打印桥接发送的每一条回复。

Discord 应用设置

1. Discord 开发者门户 → 你的应用 → Bot。
2. 启用 Message Content Intent(公会频道文本需要它;私信无需它也能工作——如果被拒绝,桥接会自动在无该 intent 的情况下重试并在日志中警告)。
3. 将机器人邀请到你的服务器,或直接向它发送私信。

共享会话部分的工作原理

- 新会话经过 agentPresets.resolve/mount——与 session.create 在 web 线路上使用的完全相同的组合路径——并由主机的会话持久化进行持久化,因此 session.list 会像显示任何其他会话一样显示它们。
- 恢复冷会话时会组合其日志中记录的预设,与 web 主机的冷恢复路径一致。
- 桥接器会为每个转发的提示词的消息来源打上 Discord 消息 id 标记(与 Web 客户端使用 rpcId 的模式相同),然后精确折叠该提示词所开启的那一轮对话——同一会话中并发运行的 Web 提示词绝不会被误认为是 Discord 的回答。
- 模型选择遵循会话日志(Web 主机的行为),因此在 Web UI 中切换模型会延续到之后的 Discord 轮次。

已知限制

- 回复在轮次完成时才会到达(运行期间显示正在输入指示器);目前尚不支持部分流式编辑。
- 来自 Discord 的附件/图片会被忽略——目前仅支持文本。
- 审批提示(工具权限询问)无法从 Discord 回答;会话将按照配置文件所组合的审批策略运行。
- 一个机器人令牌驱动一个网关连接:不要复用另一个正在运行的机器人(例如 Hermes)正在使用的令牌,否则会将其踢下线。

上游仓库有新提交时邮件通知你(每天最多一封,无更新不打扰),随时一键退订。

同作者(ghbhiee)的其他插件

💬 加入 DPharness 群聊

插件用法、部署报错、新插件第一时间同步——群里问,比一个人翻文档快。

点击加入 QQ 群
DPharness 群聊二维码,手机 QQ 扫码进群
扫码进群