🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI
DeepSeek Harness Hub

长效机器人团队 Fei2411/DeepSeek-Bot

DeepSeek Harnessv0.1.7
Fei24111 天前有提交已提供中文文档扫描:含敏感能力

DeepSeek Bot简称 DS Bot是一个基于 DeepSeek Harness简称 dsh的 bot…

70.9/100
综合分
2,686
GitHub 星标
5,094
npm 周下载
—/5
用户评分

数据截至 2026/10/21 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add ds-bot
npm 源 · ds-bot 的发布者账号已校验与本仓库一致

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · chat
装得上吗
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 1 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过

安装清单取自 ds-bot/package.json

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包ds-bot @ 0.1.7
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/19 00:41:00

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 87 处,展示前 83 条)
  • 发起网络请求
    client.js:1084
    response = await fetch(ROUTE, {
  • 写入剪贴板
    client.js:4013
    void navigator.clipboard?.writeText(text).then(() => {
  • 写入剪贴板
    client.js:10526
    var copy = (text) => navigator.clipboard === void 0 ? Promise.resolve(false) : navigator.clipboard.writeText(text).then(() => true, () => false);
  • 写入剪贴板
    client.js:11181
    [[t("Copy conversation ID"), CopyIcon, () => navigator.clipboard?.writeText(bot ? currentPart(bot) : menu.id)]],
  • 写入剪贴板
    client.js:11760
    void navigator.clipboard?.writeText(transcript).then(() => {
  • 写入剪贴板
    client.js:13499
    void navigator.clipboard?.writeText(text).then(() => {
  • 发起网络请求
    web-search.js:376
    return { id, name: shape.name, url: shape.url(base, model), model, auth: shape.auth, request: call => shape.request({ ...call, model }), read: shape.r
  • 发起网络请求
    web-search.js:562
    const call = candidate.request({ query: request.query, maxResults: request.maxResults })
  • 发起网络请求
    web-search.js:567
    response = await deps.fetch(candidate.url, {
  • 发起网络请求
    web-search.js:772
    fetch: (url, init) => fetch(url, init),
  • 发起网络请求
    web-search.js:773
    webFetch: (request, signal) => ctx.web.fetch(request, signal),
  • 读取本地文件
    src/host/diagnostics.js:94
    return JSON.parse(readFileSync(fileURLToPath(new URL('../../package.json', import.meta.url)), 'utf8')).version
  • 读取本地文件
    src/host/diagnostics.js:106
    const manifest = JSON.parse(readFileSync(join(dir, 'package.json'), 'utf8'))
  • 读取本地文件
    src/host/diagnostics.js:134
    ? readFile(logPath, 'utf8').then(text => text.split('\n').filter(Boolean).slice(-KEEP).flatMap((line) => {
  • 写入本地文件
    src/host/diagnostics.js:148
    await mkdir(dirname(logPath), { recursive: true })
  • 读取本地文件
    src/host/diagnostics.js:149
    const size = await stat(logPath).then(info => info.size, () => 0)
  • 写入本地文件
    src/host/diagnostics.js:150
    if (size > LOG_MAX_BYTES) await rename(logPath, `${logPath}.1`)
  • 写入本地文件
    src/host/diagnostics.js:151
    await appendFile(logPath, `${JSON.stringify(entry)}\n`, 'utf8')
  • 写入本地文件
    src/host/diagnostics.js:252
    writing = writing.then(() => writeFile(logPath, '', 'utf8')).catch(() => {})
  • 读取本地文件
    src/host/store.js:32
    const { mtimeMs, size } = statSync(statePath)
  • 写入本地文件
    src/host/store.js:42
    mkdirSync(home, { recursive: true })
  • 读取本地文件
    src/host/store.js:62
    contents = await readFile(statePath, 'utf8')
  • 写入本地文件
    src/host/store.js:80
    await copyFile(statePath, backup)
  • 写入本地文件
    src/host/store.js:284
    await mkdir(home, { recursive: true })
  • 写入本地文件
    src/host/store.js:294
    await writeFile(temp, snapshot, 'utf8')
  • 写入本地文件
    src/host/store.js:296
    await rename(temp, statePath)
  • 删除本地文件
    src/host/store.js:300
    await unlink(temp).catch(() => {})
  • 写入本地文件
    src/host/roster.js:17
    if (team !== undefined) await mkdir(team, { recursive: true }).catch(error => rt.warn('ds-bot: team folder %s not made again: %s', team, error))
  • 写入本地文件
    src/host/roster.js:27
    await mkdir(path, { recursive: true })
  • 读取本地文件
    src/host/folders.js:25
    const isFolder = path => stat(path).then(info => info.isDirectory(), () => false)
  • 读取本地文件
    src/host/folders.js:26
    const real = path => realpath(path).catch(() => resolve(path))
  • 读取本地文件
    src/host/folders.js:56
    path = await realpath(expanded)
  • 发起网络请求
    src/host/folders.js:83
    const outcome = await approval.request({
  • 写入本地文件
    src/host/chat-index.js:77
    await mkdir(home, { recursive: true })
  • 删除本地文件
    src/host/chat-index.js:85
    if (fresh) await unlink(indexPath).catch(() => {})
  • 写入本地文件
    src/host/groups.js:139
    mkdirSync(join(linesDir, roomId), { recursive: true })
  • 写入本地文件
    src/host/groups.js:140
    writeFileSync(lineFile(roomId, line.seq), read, 'utf8')
  • 删除本地文件
    src/host/groups.js:151
    if (writes()) void rm(lineFile(roomId, line.seq), { force: true }).catch(() => {})
  • 删除本地文件递归
    src/host/groups.js:156
    if (writes()) void rm(join(linesDir, roomId), { recursive: true, force: true }).catch(() => {})
  • 读取本地文件
    src/host/groups.js:162
    .map(line => readFile(lineFile(room.id, line.seq), 'utf8').then(text => { wholeLines.set(lineKey(room.id, line.seq), text) }, () => {})))
  • 读取本地文件
    src/host/resume.js:39
    const parsed = JSON.parse(readFileSync(file, 'utf8'))
  • 写入本地文件
    src/host/resume.js:75
    await mkdir(home, { recursive: true })
  • 写入本地文件
    src/host/resume.js:76
    await writeFile(file, snapshot, 'utf8')
  • 读取本地文件
    src/host/memory.js:431
    return readFileSync(path, 'utf8')
  • 读取本地文件
    src/host/memory.js:439
    return readdirSync(dirOf(scope)).filter(name => name.endsWith('.md') && name !== MAIN).map(name => name.slice(0, -3)).sort()
  • 写入本地文件
    src/host/memory.js:457
    await mkdir(dirname(path), { recursive: true })
  • 写入本地文件
    src/host/memory.js:459
    await writeFile(temp, text, 'utf8')
  • 写入本地文件
    src/host/memory.js:460
    await rename(temp, path)
  • 写入本地文件
    src/host/memory.js:463
    await mkdir(root, { recursive: true })
  • 写入本地文件
    src/host/memory.js:464
    await appendFile(journalPath, `${JSON.stringify({ time: new Date().toISOString(), ...record })}\n`, 'utf8')
  • 删除本地文件
    src/host/memory.js:616
    await unlink(old.file.path).catch(error => { if (error?.code !== 'ENOENT') throw error })
  • 删除本地文件
    src/host/memory.js:636
    await unlink(join(root, 'summaries', `${safeId(botId)}.json`)).catch(() => {})
  • 读取本地文件
    src/host/memory.js:638
    if (!existsSync(dir)) return
  • 写入本地文件
    src/host/memory.js:640
    await mkdir(join(root, 'archive'), { recursive: true })
  • 读取本地文件
    src/host/memory.js:689
    let text = existsSync(path) ? readText(path) : ''
  • 删除本地文件
    src/host/memory.js:709
    try { unlinkSync(snapshotPath(sessionId)) } catch { }
  • 读取本地文件
    src/host/memory.js:968
    const value = JSON.parse(readFileSync(summaryPath(botId), 'utf8'))
  • 读取本地文件
    src/host/memory.js:1079
    const value = JSON.parse(readFileSync(cursorsPath, 'utf8'))
  • 读取本地文件
    src/host/images.js:71
    ocrCache = new Map(Object.entries(JSON.parse(await readFile(ocrPath, 'utf8'))))
  • 写入本地文件
    src/host/images.js:82
    await mkdir(home, { recursive: true })
  • 写入本地文件
    src/host/images.js:84
    await writeFile(temp, snapshot, 'utf8')
  • 写入本地文件
    src/host/images.js:85
    await rename(temp, ocrPath)
  • 读取本地文件
    src/host/secrets.js:119
    const parsed = JSON.parse(await readFile(path, 'utf8'))
  • 写入本地文件
    src/host/secrets.js:134
    if (!loadedReadOnly) await chmod(path, 0o600).catch(() => {})
  • 写入本地文件
    src/host/secrets.js:148
    await mkdir(home, { recursive: true })
  • 写入本地文件
    src/host/secrets.js:151
    await writeFile(temp, snapshot, { encoding: 'utf8', mode: 0o600 })
  • 写入本地文件
    src/host/secrets.js:152
    await chmod(temp, 0o600)
  • 写入本地文件
    src/host/secrets.js:153
    await rename(temp, path)
  • 删除本地文件
    src/host/secrets.js:155
    await unlink(temp).catch(() => {})
  • 写入本地文件
    src/host/usage.js:242
    await mkdir(home, { recursive: true })
  • 删除本地文件
    src/host/usage.js:253
    if (fresh) await unlink(path).catch(() => {})
  • 读取本地文件
    src/host/update.js:8
    const PKG = JSON.parse(readFileSync(new URL('../../package.json', import.meta.url), 'utf8'))
  • 发起网络请求
    src/host/update.js:66
    const response = await fetch(url, { headers: { accept: 'application/json', ...headers }, signal: AbortSignal.timeout(FETCH_TIMEOUT_MS) })
  • 读取本地文件
    src/host/update.js:94
    return JSON.parse(readFileSync(join(dir, 'package.json'), 'utf8')).dependencies?.[PKG.name]
  • 读取本地文件
    src/host/dsh-update.js:18
    const PKG = JSON.parse(readFileSync(new URL('../../package.json', import.meta.url), 'utf8'))
  • 读取本地文件
    src/host/dsh-update.js:59
    const manifest = JSON.parse(readFileSync(join(dir, 'package.json'), 'utf8'))
  • 执行外部命令来自配置/变量
    src/host/dsh-update.js:148
    const runner = rt.dshSpawn ?? ((command, argv, options) => spawn(command, argv, options))
  • 读取本地文件
    src/host/home-lock.js:31
    return JSON.parse(readFileSync(path, 'utf8'))
  • 读取本地文件
    src/host/home-lock.js:37
    try { return now() - statSync(path).mtimeMs } catch { return Infinity }
  • 写入本地文件
    src/host/home-lock.js:53
    try { utimesSync(path, time, time) } catch {}
  • 写入本地文件
    src/host/home-lock.js:66
    writeFileSync(path, JSON.stringify({ pid, host, token, since: now() }), { flag: 'wx' })
  • 删除本地文件
    src/host/home-lock.js:83
    try { unlinkSync(path) } catch {}
  • 删除本地文件
    src/host/home-lock.js:92
    try { unlinkSync(path) } catch {}
扫描于 2026/10/21(1 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

界面预览

3 张 · 点击查看大图

功能亮点

  • 常驻智能体
  • 智能体互发消息
  • 群聊

给 DeepSeek Harness 的一组常驻智能体,含主智能体、智能体互发消息和群聊。

v0.1.72026-10-16
· 新增 · 机器人能看到队友在做什么:list_bots 会说明其他机器人当前在做什么:等你批准、切换到新会话、工作中(在自己的聊天里还是在哪个群、做了多久、为谁做、用哪个工具),或者在等队友交回工作,以及是否有问题卡片在等你、是否有消息未读。message_bot 对它发消息的机器人也会说明同样的情况。(#262) · 会回来的交接:机器人把请求的一部分交给其他机器人,或在群里发帖并等待回复时,只有全部结果都回来后才回复发起请求的机器人,且回复中带上返回的内容。同一个机器人可以多次参与同一项工作,例如一个设计、一个构建、第三个审查、第一个验收。(#262) · 机器人在等队友交回工作时会显露性格:它摇摆、眼睛打转,没有工作圆点,侧边栏那一行写明它在等谁。(#262) · Docker 镜像:在 NAS 或其他常开机器上运行 DS Bot,配有可内联配置的 Compose 文件、Linux 启动脚本,以及更改数据归属的设置。见 docker/README.md。 · 变更 · 机器人不再受数量限制:六条转发消息的链条、10 条未读消息、机器人在一个群里发起的三轮、自你上次发言以来的 40 条机器人消息,都不再适用。唯一被拒绝的消息是发给正在等待当前工作结果的机器人的消息,因为结果会自动送到它那里。机器人尚未读到的、来自同一机器人、针对同一工作的消息会合并成一条,它只回复一次。(#262) · 在群聊中派发的工作留在该群:用 message_bot 在那里调用的机器人在群内工作,与 @Name 一样,群外的机器人不再通过自己的聊天被拉进来。(#165) · 长消息:机器人超过 20,000 字符的消息或群帖会以文件形式发出,供其他机器人读取;聊天中的长消息折叠为前几行并显示「显示全部」,机器人交流对话框中也一样;它们也不再让团队文件变大、每次保存都变慢。(#206) · 机器人回答上方的推理只显示最后五行,其余部分可滚动,而不是展开整条思维链。 · 设置对话框在每个页面保持同一尺寸,即 Usage 页面的尺寸,因此打开 Usage 时不再变大。 · 未读圆点、「新」分隔线和新消息提示条采用你的强调色,强调色上的文字在更易读时变为深色。 · 危险操作和错误消息使用同一种红色。 · 修复 · 你在群聊中发送的文件(如 PDF)现在能到达那里的机器人,它们可以像在私聊中一样读取。(#176) · 向群成员请求工作的机器人现在总能听到工作完成的消息,即使该成员的结果作为它的第一条消息发出。(#185) · 机器人工作时删除它,不再让它显示为思考中,等待它回复的机器人会被告知它已被删除。(#124) · 群成员在群中的会话无法打开时,现在会在群里显示「无法回答」并在那里获得新会话,而不是保持沉默。(#163) · 创建或更改群时删除机器人,不再把它留在群里;同时对一个群做两处更改不再互相丢失成员;只剩一个机器人的群仍可更改设置。(#200、#205) · 同时创建的机器人和群聊不再可能得到相同名称。(#148、#199) · 机器人不能再命名为「User」或「You」,群聊用它们指代你。(#178) · 机器人在开始会话的新部分时选定的模型,现在应用于该部分及其后的每个部分。(#159) · 机器人或群的工作文件夹被删除或重命名时,机器人会在团队工作区中继续,而不是沉默,群轮次也不再为在开始前就失败的成员等待数分钟。(#209) · 机器人在有工作文件夹的群聊中发布的相对文件链接,或发给另一个机器人的相对文件链接,现在可以打开。(#217) · 群聊中消息上的表情回应现在只留在该消息上。(#212) · 在一个 DSH 标签页或窗口中设置的表情回应和未读标记,现在在你使用另一个时仍保留,并立即在那里显示。(#215) · web_search 在 OpenCode 和 OpenCode Go 路由上重新使用模型自带的搜索,而不是总是回退到无密钥结果页。(#184) · 切换到经典 Agent 模式现在会移除整个机器人皮肤,即使另一个插件遮蔽了相同控件,例如 dsh-codex-subscription 的模型选择器。(#149) · 右侧边栏(工作区文件、终端)在机器人模式下又有按钮了,位于会话标题栏右侧。(#172) · 在机器人模式下,侧边栏可以用按钮折叠,窄窗口折叠后可以恢复,在 Windows 标题栏下也一样。(#211) · 在机器人模式下,其他插件添加到侧边栏页脚的条目各占一行,而不是挤压 Connect plugins。(#164) · 设置 → 反馈中的「在 GitHub 上报告」在 DSH Desktop 中也会在浏览器中打开新 issue。(#182) · 预设强调色在深色模式下使用其深色调,因此 Char
v0.1.62026-10-15
· 新增 · 群组权限:群聊可用一套权限预设(只读、工作区或完全访问)统一运行所有成员,替代各成员自己的预设。在群组设置的「权限」下打开「所有成员相同」;开启期间群组详情会显示该预设。成员在群里的会话立即改变,成员之后在群里的会话也以它开始。关闭后,每个成员重新使用自己的预设。 · 变更 · 在群聊中工作的 Bot 不再沉默到完成:它会说明将要做什么,过程中持续向群组汇报,最后给出结果。 · 群组、侧边栏和 Bot 自己的聊天里的工作状态会说明 Bot 正在做什么,而不只是「处理中」,切换到新会话时也一样。 · 修复 · 在群聊中,Bot 在某个后台任务完成后、或切换到新会话后所做的一切,从未传达到群组。现在会了。 · Bot 之间可能在你不在场时长时间互发消息,例如把请求从 Bot 转发给 Bot,或通过群组帖子。现在每条转发消息和群组帖子都计入 Bot 消息链的长度上限,在你上次发言、回答提问卡或定时任务运行之后,Bot 消息达到 40 条后,message_bot 和 post_to_group 会失败,并告诉 Bot 向你汇报。Bot 也被要求不要发送感谢或确认,不要回复回复。(#129) · URL 中含 $DSH_SECRET_ 的 HTTP MCP 能力会把引用本身发给服务器,并显示就绪,直到第一次工具调用失败。现在 URL 会拿到密钥的值并做 URL 编码,Bot 无权使用该密钥的能力会显示错误。(#125) · 群聊现在用 ptc 智能体预设(DSH Desktop 的默认预设)向 Bot 转发消息。新的 Bot 聊天、群聊和会话部分使用标准预设。在 ptc 下创建的群聊仍会转发,但每一轮受 DSH 程序运行时限约束,约 10 分钟。(#37) · Bot 聊天和群聊不再运行 DeepSeek Harness 目标。在那里用 /goal 启动的目标会立即停止并附简短说明,因此群聊不再一轮接一轮地运行,聊天也不显示目标轮次。(#133) · 同时安装了给 DSH 输入框或侧边栏换肤的插件(如 @michengai/dsh-codex-ui)时,Bot 聊天的消息框保持单行高度、按钮间距和「Message 」占位符,侧边栏页脚让账户按钮和 Connect 插件保持在同一行。(#127) · 在长聊天中打开和关闭详情面板不再卡顿,群聊中尤其明显。滑动每一帧都会重新给整个会话加样式,原因是 DSH 在每次调整大小时给会话写入一个宽度,而 Bot 聊天并不使用它。会话仍随面板滑动,现在每帧只重新给变化的部分加样式。 · 在群聊中,每个工作中的成员在消息框上方各占一行,压住了后面的消息。现在消息框上方一个胶囊会说明谁在等你批准、谁在工作,并打开群组详情。Bot 自己的聊天也以同样方式显示它所在的群组。 · 群组详情面板不再在成员标记上加徽章,也不再把成员的工作放在其行下方的松散一行。每个成员一行,含标记、名称、Admin 标签和正在做什么,在群组中工作时旁边有「停止」,下方是它等待的批准。群组并排显示首批成员,只放「详情」的标签行已移除。
v0.1.52026-10-13
· 新增 · 工作文件夹:Bot 可以直接在你选定的文件夹里工作,不必用团队工作区。在 Bot 的设置或详情面板里设置:输入路径、选一个你的 DSH 项目,或浏览选择。群聊可以给所有成员设同一个文件夹。你也可以让 Bot 改自己的文件夹,或让主 Bot 改任意 Bot 或群的文件夹。Bot 把文件夹设到团队工作区之外,或把只能在自己文件夹里写的 Bot 加进这样的群时,会先请你批准。改动后,Bot 的聊天在新的部分继续,从新文件夹开始。 · 修复 · 新 Bot 首次回复时直接问从哪里开始,不再用问题卡片,自己的指令另有说明时按指令来。 · Bot 不再用 DeepSeek Harness 自带的问题卡片,那张卡片会卡住 Bot 等你回答,其他 Bot 的消息只能干等。 · Bot 给忙于先前工作的 Bot 发消息时,每次都被告知「已送达」,看不出其实没人读。现在会告诉它有多少条先前消息未读、对方何时在等你批准,未读满 10 条后 message_bot 失败,并提示它向你报告卡住的 Bot。 · 在要求每个请求都标明对话的服务商上(如 OpenCode Go),记忆面板、自动记忆更新、长聊天的上下文检查、纯文本模型的图片读取都会失败。现在这些也能用了。 · 记忆面板的摘要、「询问或更新」和记忆审查不再因 Bot 的模型拒绝调用或输出预算耗尽而中断:会在配置档的默认模型上再试一次。你改了 Bot 的模型后,失败的摘要会自动重写。(#116) · 用 ptc 智能体预设时,团队视图和 Bot 的角色会显示 Bot 从代码里运行的工具,批准卡片说明该工具做什么,从代码里问的问题卡片会留在聊天搜索和聊天的下一部分。群聊里只读聊天或查看团队的成员,不再像出去干活一样离开本轮。 · 从 Bot 模式切回智能体模式时,某个部分关闭失败不会再让 Bot 界面残留,比如聊天标题栏或丢了样式的 Bot 消息。其他部分照常关闭,Bot 模式也能正常再打开。 · DS Bot 不再把 DeepSeek Harness 的工作详情模式(设置 → 通用)设成最详细的一档,也不再隐藏该设置。Bot 聊天在任何模式下都保持扁平,你的选择在聊天之外照常生效。如果你之前选过别的模式,请再选一次:DS Bot 分不清是哪一个。 · 在给消息气泡重新上色的深色皮肤下,你在 Bot 聊天里的消息依然清晰可读。 · Bot 聊天现在会显示 Bot 用 DeepSeek Harness 的 present 工具交付的文件卡片,以及本轮改动过的文件卡片,和 DSH 自己的聊天一样。回复里的文件路径在本轮创建或交付了该文件时会链接到文件。 · 用 ptc 智能体预设时,聊天会再次显示 Bot 从代码里运行的工具:群回复、问题和密钥卡片,以及消息、Bot、群和记忆的行。 · 调用不在屏幕上的问题或密钥卡片(比如在聊天更早的部分或 Bot 对 Bot 的回合里问的),会等在消息框上方。一张卡片只显示在一处。 · DSH_HOME 为空或以 ~ 开头时,DS Bot 现在把数据放在 dsh 所用文件夹里的 bot/ 下。以前它用的是相对 dsh 启动目录的文件夹;想保留这样建成的团队,请关闭 dsh,把那个 bot/ 文件夹移到 dsh 的文件夹里。
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。

README

由 DeepSeek 最新模型翻译生成
DeepSeek Bot DeepSeek Bot(简称 DS Bot)是一个基于 DeepSeek Harness(简称 dsh)的 bot 插件,插件将 dsh 改造为 bot 形式。你可以与自己创建的 bot 交流、工作。 和 Chief 说一句话,它就把 bot 和群聊建好 安装 先装好 dsh,并在 dsh 里配好至少一个模型。ds bot 直接使用 dsh 里的模型。 dsh Desktop(Windows、macOS) 1. 侧栏点 插件 → 添加插件。 2. 包名或地址 填 ds-bot。在中国大陆,安装源 选 中国大陆镜像源。 3. 点 安装,再点 立即启用。如果提示“下次启动生效”,完全退出 dsh 再打开。 连不上 npm 时,第 2 步也可以填 Releases 里下载的 ds-bot-0.1.7.tgz 的完整路径,或者 github:Fei2411/DeepSeek-Bot#v0.1.7&path:/ds-bot(需要装 Git)。 dsh Web(Windows、macOS、Linux) 需要 Node.js 22.19 以上和 pnpm。
展开完整文档(README 剩余 1 节)
DeepSeek Bot

DeepSeek Bot(简称 DS Bot)是一个基于 DeepSeek Harness(简称 dsh)的 bot 插件,插件将 dsh 改造为 bot 形式。你可以与自己创建的 bot 交流、工作。

和 Chief 说一句话,它就把 bot 和群聊建好

安装

先装好 dsh,并在 dsh 里配好至少一个模型。ds bot 直接使用 dsh 里的模型。

dsh Desktop(Windows、macOS)

1. 侧栏点 插件 → 添加插件。
2. 包名或地址 填 ds-bot。在中国大陆,安装源 选 中国大陆镜像源。
3. 点 安装,再点 立即启用。如果提示“下次启动生效”,完全退出 dsh 再打开。

连不上 npm 时,第 2 步也可以填 Releases 里下载的 ds-bot-0.1.7.tgz 的完整路径,或者 github:Fei2411/DeepSeek-Bot#v0.1.7&path:/ds-bot(需要装 Git)。

dsh Web(Windows、macOS、Linux)

需要 Node.js 22.19 以上和 pnpm。

npx @deepseek-ai/dsh@0.2.0-rc.2 plugin --profile web add ds-bot
npx @deepseek-ai/dsh@0.2.0-rc.2 web

Docker(NAS、Linux 服务器)

docker/ 目录构建一个带 dsh Web 和 DS Bot 的镜像,适合 NAS 或其他常开的机器。容器就是 bot 的沙箱:bot 对挂进容器的目录有完全权限,其他的碰不到。见 docker/README.md(英文)。

配置

我强烈建议你直接通过和 bot 对话来配置其他 bot 和群聊。

功能

Bot

你可以在一个窗口中和一个 bot 完成所有对话和工作,你无需担心背后的上下文问题。你可以在 bot 详情页查看 bot 信息,也可以为 bot 选择你想使用的模型。你可以随时切换模型,但我仍然建议你为一个 bot 长期保持一个模型,仅在真正必要的时刻切换。

另外,bot 拥有记忆,它会记住你的喜好并在下次的工作中应用。你可以在 bot 的详情页管理记忆,也可以直接和 bot 对话来进行管理。

bot 详情页:模型、记忆、用量

Main bot

这个 bot 作为你的 chief,它拥有非常高的权限,可以管理其他 bot 和群聊。第一次进入 ds bot 时,默认会有一个 main bot 叫 Chief。你可以直接和它对话,让它引导你完成配置。

总之,有问题,找 main bot。

群聊

ds bot 拥有群聊功能。群聊是非常好的多 bot 协作方式,但它会带来非常明显的费用问题。ds bot 为此特意做了优化:在一个群聊中,你需要设置一个管理员。你的消息默认由管理员回复,它会帮你调用其他 bot。你也可以直接 @ 你需要沟通的 bot,它会直接回应你:输入 @,从列表里选 bot 就行。想让 bot 参考另一段对话,点输入框的 + → 引用对话。

任何 bot 都可以用 @ 把活派给另一个 bot。接活的 bot 自己去做,群聊照常进行。它干活时会在群里同步进度,群聊、侧边栏和它自己的聊天里也能看到它在做什么。做完后,它把结果发到群里,由派活的 bot 接着回应。要停下它的工作,打开群聊详情。

群聊:管理员 Chief 把活派给写手和程序员

能力

设置 → 能力 是团队共享的 MCP 服务、技能和能力包列表。在 Bot 设置中启用能力后,从该 Bot 下一条消息开始生效,也适用于它参与的群聊。Bot 添加的本地 MCP 命令需要你先批准才能运行。有其他 Bot 在用的能力,只有你或主 Bot 能修改、删除。

用量

在 设置 → 用量 里,可以按时间、按 bot、按模型查看 Token 用量。

用量页

数据

所有数据都在你自己的电脑上,在 dsh 主目录(默认 ~/.dsh)的 bot/ 和 sessions/ 里。卸载插件不会删除这些数据。

开发

插件源码在 ds-bot/。配置项和内部结构见 ds-bot/README.md,开发、测试和协作方式见 CONTRIBUTING.zh.md,版本变化见 CHANGELOG.md。

致谢

- DeepSeek Harness:ds bot 建在 dsh 的插件系统上。每个 bot 都在 dsh 会话里工作,用的是 dsh 的工具和模型。
- esbuild:用来打包插件的界面代码。
- 感谢下面这些项目公开的设计思路。ds bot 参考了它们的思路,没有使用它们的代码:
- AgentMemoryRepo:bot 记忆的 Markdown 格式。
- OpenAI Codex:压缩时把用户原话留在摘要旁边,以及搜索聊天记录用的消息锚点。
- OpenMausBot:群聊轮流发言和 @ 接力。
- Hermes Agent 和 Hermes Bot Mode:每个成员在每个群里一个会话,以及交接时带上用户之前的原话。
- OpenCode、goose、pi、Gemini CLI:长对话什么时候压缩,交接笔记写哪些内容。
- obelisk:用 SQLite 全文索引搜索聊天记录。
- 每一位试用 ds bot、提问题、报 bug 的人。

许可

Apache License 2.0。按“原样”提供,不附带任何担保。用到的第三方代码和它的许可见 NOTICE。

声明

ds bot 是独立的社区项目,不是 DeepSeek 官方产品,与 DeepSeek 没有隶属、认可或赞助关系。“DeepSeek”“DeepSeek Harness”等名称是各自所有者的商标,这里只用来说明本插件和什么一起用。

bot 会消耗你自己的模型额度,也会按你的要求读写文件、运行命令。重要的操作请自己检查。
预览分享卡片长什么样 ↓Fei2411/DeepSeek-Bot
分享 · DeepSeek Harness Hub
Fei2411/DeepSeek-Bot

DeepSeek Bot简称 DS Bot是一个基于 DeepSeek Harness简称 dsh的 bot…

回到顶部