让 QQ Bot 接入 DeepSeek Harnessdsh的官方插件
68.4/100
综合分
505
GitHub 星标
46,665
npm 周下载
—/5
用户评分
数据截至 2026/11/3 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add @tencent-connect/dsh-qqbotnpm 源 · @tencent-connect/dsh-qqbot 的发布者账号已校验与本仓库一致
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · platform
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 0 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✓npm 包@tencent-connect/dsh-qqbot @ 0.5.3
✓Node 引擎要求 >=20.3.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/29 17:38:54
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 56 处,展示前 55 条)
- 发起网络请求lib/client.js:209
const res = await fetch(BIND_STATE_PATH, { cache: "no-store" }); - 发起网络请求lib/client.js:261
const res = await fetch(BIND_MANUAL_PATH, { - 发起网络请求lib/client.js:368
fetch(BIND_UNBIND_PATH, { method: "POST" }).then(async (res) => { - 发起网络请求lib/client.js:418
fetch(BIND_REFRESH_PATH, { method: "POST" }).catch(() => {}); - 发起网络请求lib/client.js:740
fetch(BIND_CONFIG_PATH, { cache: "no-store" }).then(async (res) => { - 发起网络请求lib/client.js:775
fetch(BIND_CONFIG_PATH, { - 读取密钥环境变量lib/gateway/bootstrap.js:44
tokenBaseUrl: process.env.QQBOT_TOKEN_BASE_URL?.replace(/ +$/, '') || 'https://api.bot.qq.com', - 读取本地文件lib/shared/utils.js:18
const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')); - 读取本地文件lib/shared/utils.js:52
const byPatch = findProfileAncestor(baseDir, (dir) => existsSync(resolve(dir, 'cordis.patch.yml')) ? dir : null); - 读取本地文件lib/shared/utils.js:55
const byWorkspace = findProfileAncestor(baseDir, (dir) => existsSync(resolve(dir, 'pnpm-workspace.yaml')) ? dir : null); - 读取本地文件lib/shared/utils.js:77
if (!existsSync(profilesRoot)) - 读取本地文件lib/shared/utils.js:103
entries = readdirSync(profilesRoot); - 读取密钥环境变量lib/setup/bind-routes.js:234
delete process.env.QQBOT_SECRET; - 执行外部命令来自配置/变量lib/setup/presenters.js:74
const child = spawn(command, args, { detached: true, stdio: 'ignore', windowsHide: true }); - 写入本地文件lib/setup/persist.js:43
mkdirSync(dir, { recursive: true }); - 读取本地文件lib/setup/persist.js:46
const before = existsSync(patchPath) ? readFileSync(patchPath, 'utf8') : ''; - 读取本地文件lib/setup/persist.js:46
const before = existsSync(patchPath) ? readFileSync(patchPath, 'utf8') : ''; - 读取本地文件lib/setup/persist.js:55
const current = existsSync(patchPath) ? readFileSync(patchPath, 'utf8') : ''; - 读取本地文件lib/setup/persist.js:55
const current = existsSync(patchPath) ? readFileSync(patchPath, 'utf8') : ''; - 写入本地文件lib/setup/persist.js:65
writeFileSync(tmpPath, next, 'utf8'); - 写入本地文件lib/setup/persist.js:66
renameSync(tmpPath, patchPath); - 删除本地文件lib/setup/persist.js:70
unlinkSync(tmpPath); - 读取本地文件lib/setup/persist.js:77
const writtenDoc = parseProfilePatch(readFileSync(patchPath, 'utf8')); - 写入本地文件lib/setup/persist.js:88
writeFileSync(rollback, before, 'utf8'); - 写入本地文件lib/setup/persist.js:89
renameSync(rollback, patchPath); - 读取本地文件lib/media/media-cleaner.js:24
if (!existsSync(MEDIA_ROOT)) - 读取本地文件lib/media/media-cleaner.js:28
const entries = await readdir(MEDIA_ROOT, { withFileTypes: true }); - 读取本地文件lib/media/media-cleaner.js:33
const info = await stat(filePath); - 删除本地文件lib/media/media-cleaner.js:36
await rm(filePath, { force: true }); - 发起网络请求lib/media/vision-tool.js:48
const resp = await fetch(image, { signal, redirect: 'error' }); - 读取本地文件lib/media/vision-tool.js:57
const info = await stat(image).catch(() => null); - 读取本地文件lib/media/vision-tool.js:62
data = new Uint8Array(await readFile(image)); - 读取本地文件lib/media/vision-tool.js:150
if (!existsSync(settingsPath)) - 读取本地文件lib/media/vision-tool.js:153
const before = readFileSync(settingsPath, 'utf8'); - 读取本地文件lib/media/vision-tool.js:197
if (readFileSync(settingsPath, 'utf8') !== before) { - 写入本地文件lib/media/vision-tool.js:204
writeFileSync(tmpPath, next, 'utf8'); - 写入本地文件lib/media/vision-tool.js:205
renameSync(tmpPath, settingsPath); - 删除本地文件lib/media/vision-tool.js:209
unlinkSync(tmpPath); - 读取本地文件lib/media/send-file-tool.js:97
if (!existsSync(absPath)) { - 发起网络请求lib/transport/attachment.js:144
const resp = await fetch(url, { signal: AbortSignal.timeout(DOWNLOAD_TIMEOUT_MS) }); - 写入本地文件lib/transport/attachment.js:165
mkdirSync(MEDIA_ROOT, { recursive: true }); - 写入本地文件lib/transport/attachment.js:185
writeFileSync(localPath, buf); - 写入本地文件lib/session/session-manager.js:565
mkdirSync(dir, { recursive: true }); - 读取本地文件lib/media/send-media.js:74
const info = await stat(filePath); - 读取本地文件lib/model/prefs-store.js:92
if (!existsSync(this.prefsPath)) - 读取本地文件lib/model/prefs-store.js:94
const content = readFileSync(this.prefsPath, 'utf8'); - 读取本地文件lib/model/prefs-store.js:134
if (!existsSync(this.prefsPath)) - 读取本地文件lib/model/prefs-store.js:138
raw = readFileSync(this.prefsPath, 'utf8'); - 写入本地文件lib/model/prefs-store.js:162
writeFileSync(backupPath, raw, 'utf8'); - 写入本地文件lib/model/prefs-store.js:190
mkdirSync(dirname(this.prefsPath), { recursive: true }); - 写入本地文件lib/model/prefs-store.js:197
writeFileSync(tmpPath, JSON.stringify(data, null, 2), 'utf8'); - 写入本地文件lib/model/prefs-store.js:198
renameSync(tmpPath, this.prefsPath); - 删除本地文件lib/model/prefs-store.js:202
unlinkSync(tmpPath); - 读取本地文件lib/model/settings-reader.js:62
if (!existsSync(settingsPath)) { - 读取本地文件lib/model/settings-reader.js:66
const content = readFileSync(settingsPath, 'utf8');
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-agent@deepseek-ai/dsh-llm@deepseek-ai/dsh-session@deepseek-ai/dsh-system-prompt@deepseek-ai/dsh-user-approval@deepseek-ai/schemastery给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
界面预览
1 张 · 点击查看大图最近更新
在 GitHub 查看全部 →0.5.52026-10-30
· 问题修复
· 修复端内绑定二维码裂图:改用 createRequire 加载 qrcode,绕过宿主 ESM 互通导致的 API 缺失;二维码无法生成时页面降级为提示,可重启应用、在浏览器打开链接或手动填写凭据。
0.5.42026-10-30
· 新功能
· 新增 /bot-me 指令:查看发送者 OpenID(私聊为 user openid,群聊为群成员 openid 与群 openid),作为白名单配置的自助入口——用户拿 ID 交管理员加入名单即可。
· 管理指令白名单鉴权:/preset、/model 私聊/群聊均可用,但仅限白名单用户,非白名单成员不可切换 preset/模型(群聊中切换影响该群会话);指令的私聊/群聊适用范围在 /bot-help 中标注。(#5)
· ⚠️ 行为变更(安全默认)
· 访问控制默认收紧:私聊默认白名单且留空拒绝所有人(此前留空会静默放行);群聊默认开放(有进群门槛与 @bot 双前置)。扫码绑定时私聊自动切白名单并重置为扫码用户(重绑即换人),绑定即授权。
· 工作目录默认独立:Agent 工作目录缺省为 ~/.dsh-qqbot/workspace,不再跟随 DSH 进程目录;显式配置 cwd 可覆盖。
· 审批按钮校验权限:白名单模式下审批按钮只对名单内用户生效——非授权成员点击无效,私聊卡片转发后他人点击同样无效。
· 问题修复
· 保存配置不再破坏其他插件:绑定、改配置、解绑只改自己的条目,其他插件内容与注释原样保留。(#53)
· 长提示词可保存:配置保存请求体上限从 4KB 提高到 512KB。(#69)
· 视觉链路隐患修复:qqbot_describe_image 的消息来源改为新版会话格式,未来图片注入主对话不会报错。(#77)
· 会话 id 加固:统一 session- 前缀(#81)——社区插件不再误判,多进程并发不产生重复 id;老会话沿用原 id。
· 切换模型修复:/model 崩溃与切换后重启的「历史加载失败」均已修复,会话历史完整保留。
· 会话事件读取修复:/tokens 显示 0、/export 导出为空、审批按钮不回显被审批命令——均已修复。
· 压缩修复:/compact 误报「压缩能力不可用」或「当前无活跃会话」——均已修复;后者场景会自动从磁盘拉起会话再压缩。
· 修复 link 安装后保存配置失败:dsh plugin add link: 安装时界面保存一直报「无法定位 profile 目录」,现已修复;多 profile 共享源码时按当前进程的 profile 精确写入,仍失败时提示手动编辑 cordis.patch.yml。(#78)
· 修复白名单默认值可被绕过:完全省略 access 配置时私聊仍回落开放模式(外层默认值未随子字段更新),现已对齐白名单并加测试钉死。(#94)
· 审批卡片防混淆与身份加固:按钮绑定本次审批的唯一标识,旧卡片点击不再生效;白名单模式下点击者身份缺失同样拒绝。(#94)
· 文件发送路径白名单解析符号链接:按真实位置判定,root 内的符号链接指向外部时拒绝访问。(#94)
· 图片附件按真实格式命名扩展名:QQ 网关对图片统一标注 image/png(实际多为 GIF/JPEG),落盘文件名照搬导致按扩展名解码的读图工具失败;现按文件头(magic bytes)识别真实格式并校正扩展名,字节不变、不转码,识别不了的格式保持原行为。(#76)
· 统一 workspace 路径解析:新增插件目录单一事实源(~/.dsh-qqbot),workspace、media、模型偏好等子路径统一派生,未配置 cwd 时不再误用宿主进程目录(此前导致 workspace 内文件发送被误拒);不存在的文件也改为报「文件不存在」而非误报路径不允许。
· vision 配置自动补写不再破坏 settings.yaml:启动时为视觉模型补写 input 声明改用文档保真编辑(注释、锚点、其他配置原样保留)+ 原子写 + 并发冲突时放弃重试,此前全量重序列化会抹掉文件里的全部注释与排版。
· 偏好文件并发安全:model-prefs.json(会话 id 映射,多实例/多进程共享)改为原子写 + 写前合并其他写者的条目,多 bot 或多 profile 并存不再互相覆盖丢映射;删除操作带墓碑防止被并发写复活;读取/写入失败升级为可见告警(此前仅 debug 甚至静默,映射丢失表现为「QQ 里丢上下文」且无从排查)。
· 修复会话列表可能打不开:恢复会话失败时只在确认磁盘上确实没有该会话后才新建,日志损坏、后端故障等原因不再沿用同一会话 id 重复创建(此前会把同一 id 写进多个目录,宿主随后拒绝加载整个会话列表);这类故障改为明确报错并记录日志,恢复后原会话历史仍在。
· 修复并发消息可能切错会话:旧版本的会话 id 由用户标识确定性派生,仅用于迁移存量会话,不再用于新建;同一会话的并发请求
0.5.32026-10-27
· 新功能
· 流式回复:回复实时分段送达 QQ,长回复不再整段等待;模型自动重试时改写同一条消息,不会重复。流式此前实际未生效,本版接入实时通道后真正可用。
· 交付文件直达会话:模型通过 present 声明的交付文件(文档、表格、导出数据等)在本轮回复送达后自动发送到当前 QQ 会话;未能发送的以文字提示路径。可在配置中关闭或限制单轮数量。
· 问题修复
· 操作确认恢复工作:此前确认请求从未送达,敏感操作一直报「没有可用的确认通道」,现已修复。
· 设置面板输入与文案:白名单文本框支持回车换行,保存时统一规范化;「开放 / 停用」等选项文案更直白。
· 元数据
· 插件元数据补齐:新增插件图标与中英文双语描述,插件列表按界面语言显示「QQ 机器人 (dsh-qqbot)」/「QQ Bot (dsh-qqbot)」。
· 界面入口与图标:侧栏与插件详情页新增管理面板入口,设置页图标改为矢量 logo。
· 文档
· README 新增桌面版安装说明(插件页添加 → 设置页扫码连接,全程无需命令行)。
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。
README
由 DeepSeek 最新模型翻译生成QQ Bot 插件,基于 deepseek-harness (dsh),把 DeepSeek AI 助手接入 QQ 私聊与群聊。
扫码加入 QQ 群 / 频道
QQ 开发者交流群1群: 1032635674 · 2群: 1056948758 QQ 开发者社区频道频道号: 20dnumts4z
架构
QQ 用户 → QQ WebSocket → dsh-qqbot → ctx.agents → dsh agent loop → LLM ↑ │ └── session/event ──────────┘ (assistant reply → QQ sendMarkdown)
安装
方式一:桌面版安装(推荐)
无需命令行,全程在应用内完成:
1. 安装:左侧栏点击「插件」→「添加插件」→ 输入 @tencent-connect/dsh-qqbot@latest → 安装并立即启动
2. 连接:左下角头像 → 设置 →「QQ 机器人」→ 手机 QQ 扫码连接
扫码成功后凭据自动保存,后续启动无需再次扫码。
展开完整文档(README 剩余 1 节)
QQ Bot 插件,基于 deepseek-harness (dsh),把 DeepSeek AI 助手接入 QQ 私聊与群聊。
扫码加入 QQ 群 / 频道
QQ 开发者交流群1群: 1032635674 · 2群: 1056948758 QQ 开发者社区频道频道号: 20dnumts4z
架构
QQ 用户 → QQ WebSocket → dsh-qqbot → ctx.agents → dsh agent loop → LLM ↑ │ └── session/event ──────────┘ (assistant reply → QQ sendMarkdown)
安装
方式一:桌面版安装(推荐)
无需命令行,全程在应用内完成:
1. 安装:左侧栏点击「插件」→「添加插件」→ 输入 @tencent-connect/dsh-qqbot@latest → 安装并立即启动
2. 连接:左下角头像 → 设置 →「QQ 机器人」→ 手机 QQ 扫码连接
扫码成功后凭据自动保存,后续启动无需再次扫码。
方式二:手动执行
安装到 profile
npx @deepseek-ai/dsh plugin --profile qqbot add @tencent-connect/dsh-qqbot
启动
npx @deepseek-ai/dsh --profile qqbot
首次启动时,插件检测到凭据未配置会自动进入扫码引导:终端输出二维码 → 手机 QQ 扫码绑定 → 凭据自动保存到 profile,后续启动无需再次扫码。
无端内绑定页的环境(如纯命令行)可设置 QQBOT_BIND_OPEN_BROWSER=1,额外拉起系统浏览器扫码页作为降级通道。
提示:建议升级至 0.4.0 以上版本扫码,支持点击链接在浏览器打开,避免部分终端二维码渲染错位的问题。
方式三:本地路径安装
构建
cd /path/to/dsh-qqbot
pnpm install && pnpm build
安装到 profile(本地路径)
npx @deepseek-ai/dsh plugin --profile qqbot add /path/to/dsh-qqbot
启动
export QQBOT_APPID="你的AppID" QQBOT_SECRET="你的AppSecret"
npx @deepseek-ai/dsh --profile qqbot
方式四:--patch 开发模式
export QQBOT_APPID="你的AppID" QQBOT_SECRET="你的AppSecret"
npx @deepseek-ai/dsh web --patch /path/to/dsh-qqbot/cordis.dev.yml
配置项
| 配置 | 类型 | 默认值 | 说明 |
| appId | string | 必填 | QQ Bot AppID(或通过 QQBOT_APPID 环境变量) |
| appSecret | string | 必填 | QQ Bot AppSecret(或通过 QQBOT_SECRET 环境变量) |
| provider | string | deepseek-official | LLM 服务商名称 |
| model | string | deepseek-chat | 模型名称 |
| preset | string | - | Agent preset id |
| cwd | string | process.cwd() | Agent 工作目录 |
| requireMention | boolean | true | 群聊是否需要 @bot 才触发 |
| groupPrompt | string | - | 群聊额外 system prompt |
| directPrompt | string | - | 私聊额外 system prompt |
| textChunkLimit | number | 4500 | 单条消息最大字符数 |
| streaming | boolean | true | 是否启用流式输出(群聊始终不启用) |
| sessionIdleTimeout | number | 1800000 | 会话闲置超时(ms),默认 30 分钟 |
| processingTimeoutMs | number | 1800000 | 处理超时(ms),超时中断当前 LLM 调用 |
| maxQueue | number | 20 | 并发队列最大长度 |
| historyLimit | number | 10 | 群历史缓冲条数 |
| askTimeoutMs | number | 300000 | 待答问题超时(ms),默认 5 分钟(ask_user_question) |
| showToolResults | boolean | false | 是否展示工具调用成功结果(错误始终展示) |
| debug | boolean | false | 调试模式 |
访问控制(access)
| 配置 | 类型 | 默认值 | 说明 |
| access.c2cMode | open/allowlist/disabled | open | 私聊访问模式 |
| access.c2cAllow | string[] | [] | 私聊白名单(user openid) |
| access.groupMode | open/allowlist/disabled | open | 群聊访问模式 |
| access.groupAllow | string[] | [] | 群聊白名单(group openid) |
富媒体理解(media)
| 配置 | 类型 | 默认值 | 说明 |
| media.enabled | boolean | true | 是否启用富媒体理解(图片/视频下载 + 工具分析) |
| media.maxMB | number | 200 | 富媒体下载大小上限(MB) |
| media.ttlHours | number | 24 | 富媒体存活时长(小时),0=永不过期 |
视觉理解(vision)
| 配置 | 类型 | 默认值 | 说明 |
| vision.enabled | boolean | false | 是否启用视觉理解(qqbot_describe_image 工具) |
| vision.provider | string | - | 视觉模型 provider(如 pi-ai) |
| vision.model | string | - | 视觉模型 id(如 qwen-vl-max) |
| vision.maxBytes | number | 10MB | 图片字节上限 |
| vision.maxTokens | number | 1024 | 输出 token 上限 |
| vision.timeoutMs | number | 120000 | 视觉调用超时(ms) |
附件发送(sendFile)
| 配置 | 类型 | 默认值 | 说明 |
| sendFile.restrictPaths | boolean | true | 是否启用路径白名单(仅 media + cwd + extraRoots) |
| sendFile.extraRoots | string[] | [] | 额外允许访问的根目录 |
内置命令
| 命令 | 说明 |
| /new(别名 /reset /clear) | 开始新会话(清空上下文) |
| /compact | 压缩会话历史(摘要替换旧记录,保留上下文) |
| /model | 查看或切换模型 |
| /preset | 查看或切换 agent preset(新会话生效) |
| /stop | 中止当前生成 |
| /bot-ping | 网络延迟检测(返回传输与处理耗时) |
| /bot-version | 查看版本信息 |
| /bot-status | 查看当前会话状态 |
| /bot-help | 查看所有指令 |
核心模块
src/
├── index.ts # Cordis 插件入口(async apply) ├── config.ts # 配置 Schema ├── types.ts # 全局类型定义 ├── setup/ # 凭据绑定(扫码) │ ├── index.ts # 绑定编排(ensureCredentials) │ ├── binding-service.ts # 扫码状态机(宿主内唯一事实源) │ ├── bind-routes.ts # 端内绑定页路由(/qqbot/im-qqbot/bind) │ ├── presenters.ts # 呈现策略(终端/浏览器降级) │ ├── qr-svg.ts # 二维码 SVG 渲染(宿主侧) │ └── persist.ts # 凭据写入 cordis.patch.yml ├── client/ # 浏览器半边(dsh.client Web Bundle) │ ├── index.ts # 侧栏 Tab 注册 + 待绑定自动引导 │ └── bind-page.ts # 端内绑定页(二维码 + 状态轮询) ├── gateway/ # 网关装配 │ ├── bootstrap.ts # 启动装配(监听 session/event 等) │ └── middleware-setup.ts # 中间件链配置 ├── transport/ # 传输层 │ ├── inbound.ts # QQ 入站消息 → agent.followup() │ ├── outbound.ts # session/event → QQ sendMarkdown │ ├── outbound-buffer.ts # 流式缓冲 │ ├── streaming-writer.ts # 流式写入 │ ├── reply-target.ts # 回复目标解析 │ ├── msgid-cache.ts # 被动回复 msgid 缓存 │ ├── reply-limiter.ts # 被动回复限流 │ ├── tool-presenter.ts # 工具调用展示 │ └── chunker.ts # Markdown 文本切分 ├── session/ # 会话管理层 │ ├── session-manager.ts # QQ peer → Agent 映射 │ └── idle-evictor.ts # 闲置回收 ├── model/ # 模型路由层 │ ├── model-resolver.ts # 路由解析 │ ├── prefs-store.ts # per-peer 偏好持久化 │ └── settings-reader.ts # settings.yaml 只读 ├── features/ # 交互特性 │ ├── question-channel.ts # ask_user_question 问答通道 │ ├── approval-channel.ts # approval 审批确认通道 │ └── answer-parser.ts # 答案解析 ├── media/ # 多媒体 │ ├── vision-tool.ts # 图片视觉理解 │ ├── send-file-tool.ts # 发送本地文件 │ └── media-cleaner.ts # 媒体 TTL 清理 ├── middleware/ # 中间件 │ ├── question-answer.ts # 问答答案处理 │ └── attachment.ts # 附件处理 ├── shared/ # 共享工具 │ ├── utils.ts # 通用函数 │ ├── scope.ts # scope/peer 提取 │ └── send-helper.ts # 分块发送 └── commands/ # 斜杠命令
会话路由
sessionKey: qqbot:${appId}:${scope}:${peerId}。新会话会铸造 UUID 会话 id,并持久化到 model-prefs.json,重启后按持久化 id 恢复;0.5.x 老会话沿用原派生 id。
解析策略:进程内复用 → 持久化恢复 → 全新创建。
设计原则
- 纯 Cordis 插件 — 遵循 dsh「Plugins, not loop changes」原则
- 声明式依赖 — inject = ['agents'],不直接耦合其他插件
- 会话隔离 — 每个 QQ 私聊用户、每个群聊各一个独立 Agent
- Preset 支持 — 可通过 agent-presets 服务挂载预设(工具集、prompt 等)
- 闲置回收 — 超时自动 dispose Agent,防止内存泄漏
- Markdown 输出 — 回复以 Markdown 格式发送,切分时能识别代码块和表格
- 图片理解 — 支持 qqbot_describe_image 视觉理解,可分析用户发送的图片
- 附件发送 — 支持 qqbot_send_file 把本地文件发送给用户(默认启用路径白名单)
- 问答互动 — 支持 ask_user_question,单选生成内联按钮(点一个其余变灰)、多选回复编号,逐题推进 + 问题级超时
- 操作确认 — 支持 approval/request,关键操作通过「允许/拒绝」按钮请求用户确认
本地开发
安装依赖
pnpm install
构建
pnpm build
开发模式(watch)
pnpm dev
用 --patch 方式调试
export QQBOT_APPID="xxx" QQBOT_SECRET="xxx"
npx @deepseek-ai/dsh web --patch /path/to/dsh-qqbot/cordis.dev.yml
License
MIT预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
tencent-connect/dsh-qqbot
让 QQ Bot 接入 DeepSeek Harnessdsh的官方插件
相关插件 · 平台集成
智能体工程课walkinglabs/learn-harness-engineering
一门项目制课程,教你搭建环境、管理状态、做验证、加控制机制,让 AI 编程智能体稳定干活。
★ 21,155已汉化DSH
71.7
视频翻译配音liuzhao1225/YouDub-webui
开源视频本地化工作台:导入视频,识别、翻译并逐句克隆原声,生成字幕和配音成片。
★ 5,778已汉化Cordis
71.4
失败经验库Ikalus1988/MisakaNet
📚 零依赖、由 git 支撑的微课程库,让 AI 智能体异步分享并检索经过验证的调试经验。| https://misakanet.org
★ 550已汉化DSH
71.2
桌面智能体工作区freestylefly/wesight
WeSight 是开源桌面控制台,面向本地 AI 智能体。它帮你安装或复用 Claude…
★ 933已汉化MCP
71
IM 机器人接入xmanrui/dsh-im
让 DeepSeek Harness 触手可及 Connecting DeepSeek Harness
★ 3,110已汉化DeepSeek 客户端
70.9
中国平台研究引擎Jesseovo/last30days-skill-cn
给 AI Agent 的中文互联网研究 Skill:检索 8 大平台最近 30…
★ 2,031已汉化DSH
70.7