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

三魂共识 gulagala001/dsh-trisoul

DeepSeek Harness
gulagala00161 天前有提交已提供中文文档扫描:含敏感能力

三个小模型盲写互评,用便宜模型跑出大模型效果

31.2/100
综合分
4
GitHub 星标
—
npm 周下载
—/5
用户评分

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

自动兼容检查有告警:未发布到 npm registry,仅可从源码安装。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add gulagala001/dsh-trisoul
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么[目录]—
dsh 原生插件 · skill
暂无时间戳·判据 →
装得上吗[实装验证]✓
本站已在 dsh 0.2.1-rc.5 下真实安装成功
非静态推断
L5 · 运行时冒烟等级说明 →
数据截至 2026/10/31·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/04·判据 →
还在维护吗[仓库]—
更新放缓:最近一次提交在 61 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

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

验证判据与等级说明 →

可信度证据

安装兼容性检查⚠ 装前注意

未发布到 npm registry,仅可从源码安装

展开查看检查明细 ↓

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

✗npm 包dsh-trisoul(未发布到 npm,仅可源码安装)
✓Node 引擎要求 >=20 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

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

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

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 50 处,展示前 49 条)
  • 写入本地文件
    cli/lib/init.mjs:27
    writeFileSync(join(dir, '.npmrc'), NPMRC)
  • 写入本地文件
    cli/lib/init.mjs:28
    writeFileSync(join(dir, 'pnpm-workspace.yaml'), PNPM_WS)
  • 读取本地文件
    cli/lib/init.mjs:106
    const needHost = force || !existsSync(join(lay.host, 'node_modules', '@deepseek-ai', 'dsh', 'lib', 'bin.js'))
  • 写入本地文件
    cli/lib/init.mjs:109
    writeFileSync(hostPkg, `${JSON.stringify({
  • 删除本地文件递归
    cli/lib/init.mjs:121
    rmSync(join(lay.app, 'packages'), { recursive: true, force: true })
  • 写入本地文件
    cli/lib/init.mjs:123
    writeFileSync(join(lay.app, 'package.json'), `${JSON.stringify({
  • 写入本地文件
    cli/lib/init.mjs:133
    writeFileSync(join(lay.profile, 'package.json'), `${JSON.stringify(profileManifest(lay.app), null, 2)}\n`)
  • 写入本地文件
    cli/lib/init.mjs:134
    writeFileSync(join(lay.profile, 'cordis.yml'), '[]\n')
  • 读取本地文件
    cli/lib/init.mjs:136
    const tpl = readFileSync(join(PKG_ROOT, 'config', 'trisoul.patch.yml'), 'utf8')
  • 读取本地文件
    cli/lib/init.mjs:155
    return !existsSync(p)
  • 执行外部命令来自配置/变量
    cli/lib/patch-onpayload.mjs:124
    const chk = spawnSync(process.execPath, ['--check', f], { stdio: 'ignore' })
  • 读取本地文件
    cli/lib/server.mjs:12
    const pid = Number(readFileSync(lay.pidFile, 'utf8').trim())
  • 执行外部命令固定命令
    cli/lib/server.mjs:25
    spawnSync('taskkill', ['/PID', String(pid), '/T', ...(force ? ['/F'] : [])], { stdio: 'ignore' })
  • 删除本地文件
    cli/lib/server.mjs:51
    try { if (statSync(logFile).size > 50 * 1024 * 1024) rmSync(logFile, { force: true }) } catch { }
  • 读取本地文件
    cli/lib/server.mjs:51
    try { if (statSync(logFile).size > 50 * 1024 * 1024) rmSync(logFile, { force: true }) } catch { }
  • 执行外部命令来自配置/变量
    cli/lib/server.mjs:55
    const child = spawn(process.execPath, [
  • 写入本地文件
    cli/lib/server.mjs:69
    writeFileSync(lay.pidFile, String(child.pid))
  • 读取本地文件
    cli/lib/server.mjs:82
    try { log(readFileSync(logFile, 'utf8').split('\n').slice(-40).join('\n')) } catch { }
  • 删除本地文件
    cli/lib/server.mjs:90
    if (!up && (!pid || !alive(pid))) { ok('未在运行'); rmSync(lay.pidFile, { force: true }); return 0 }
  • 删除本地文件
    cli/lib/server.mjs:105
    if (!alive(pid)) { rmSync(lay.pidFile, { force: true }); ok('已停止'); return 0 }
  • 读取本地文件
    cli/lib/server.mjs:140
    if (!existsSync(f)) { log('还没有日志'); return 1 }
  • 读取本地文件
    cli/lib/server.mjs:141
    log(readFileSync(f, 'utf8').split('\n').slice(-lines).join('\n'))
  • 读取本地文件
    cli/lib/uninstall.mjs:14
    for (const e of readdirSync(d, { withFileTypes: true })) {
  • 读取本地文件
    cli/lib/uninstall.mjs:17
    else if (e.isFile()) { try { total += statSync(p).size } catch { } }
  • 读取本地文件
    cli/lib/uninstall.mjs:29
    if (!existsSync(root)) { ok('没有安装,无需卸载'); return 0 }
  • 读取本地文件
    cli/lib/uninstall.mjs:38
    if (!existsSync(join(root, 'host')) && !existsSync(join(root, 'home'))) {
  • 读取本地文件
    cli/lib/uninstall.mjs:65
    if (keepData && existsSync(lay.data)) {
  • 删除本地文件递归
    cli/lib/uninstall.mjs:68
    rmSync(backup, { recursive: true, force: true })
  • 删除本地文件递归
    cli/lib/uninstall.mjs:73
    rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 200 })
  • 读取本地文件
    cli/lib/uninstall.mjs:74
    if (existsSync(root)) {
  • 写入本地文件
    cli/lib/util.mjs:45
    mkdirSync(dir, { recursive: true })
  • 执行外部命令来自配置/变量
    cli/lib/util.mjs:75
    const r = spawnSync(cmd, [...args, '--version'], {
  • 执行外部命令来自配置/变量
    cli/lib/util.mjs:88
    const r = spawnSync(pnpm.cmd, [...pnpm.args, ...args], {
  • 发起网络请求
    cli/lib/util.mjs:100
    const res = await fetch(url, { signal: ac.signal })
  • 执行外部命令来自配置/变量
    cli/lib/util.mjs:137
    spawn(cmd, args, { stdio: 'ignore', detached: true }).unref()
  • 读取本地文件
    cli/lib/util.mjs:148
    return existsSync(dshEntry(lay)) && existsSync(join(lay.profile, 'package.json'))
  • 写入本地文件
    packages/dsh-api/src/index.mjs:151
    try { appendFileSync(journalPath, `${JSON.stringify({ ts: Date.now(), ch, ...info })}\n`) } catch (e) {
  • 写入本地文件
    packages/dsh-canvas/src/index.mjs:52
    const dbg = (msg) => { try { appendFileSync(DBG_PATH, `${new Date().toISOString()} ${msg}\n`) } catch {} }
  • 写入本地文件
    packages/dsh-memory/src/index.mjs:42
    const dbg = (msg) => { try { appendFileSync(DBG_PATH, `${new Date().toISOString()} ${msg}\n`) } catch {} }
  • 读取本地文件
    packages/dsh-memory/src/project.mjs:21
    if (!existsSync(g)) return false
  • 读取本地文件
    packages/dsh-memory/src/project.mjs:22
    const st = statSync(g)
  • 读取本地文件
    packages/dsh-memory/src/store.mjs:117
    if (existsSync(storePath)) {
  • 读取本地文件
    packages/dsh-memory/src/store.mjs:118
    try { raw = JSON.parse(readFileSync(storePath, 'utf8')) } catch { raw = {} }
  • 写入本地文件
    packages/dsh-memory/src/store.mjs:134
    writeFileSync(tmp, payload)
  • 写入本地文件
    packages/dsh-memory/src/store.mjs:135
    renameSync(tmp, storePath)
  • 写入本地文件
    packages/dsh-plugin/src/index.mjs:1845
    try { mkdirSync(dumpDir, { recursive: true }); writeFileSync(join(dumpDir, `${Date.now()}-${soul.name}.json`), JSON.stringify({ provider: soul.provide
  • 写入本地文件
    packages/dsh-plugin/src/index.mjs:1845
    try { mkdirSync(dumpDir, { recursive: true }); writeFileSync(join(dumpDir, `${Date.now()}-${soul.name}.json`), JSON.stringify({ provider: soul.provide
  • 执行外部命令来自配置/变量
    packages/dsh-plugin/src/todolist.mjs:237
    child = execFile(cmd, args, { cwd, maxBuffer: 64 * 1024 * 1024, detached: grouped }, (err, stdout, stderr) => {
  • 读取本地文件
    packages/dsh-plugin/src/todolist.mjs:259
    try { accessSync(real, constants.X_OK); return execP(real, [], cwd, signal, timeoutMs) } catch {}
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 三模型盲写互评
  • 三官补偿生成
  • 画布式上下文

TriSoul —— 三魂共识 Agent:三个灵魂盲写+匿名互评,三官(对齐/博识/实证)补偿生成,画布式上下文,记忆中枢。DeepSeek Harness 插件套件,一键装/独立端口/一键卸载

README

由 DeepSeek 最新模型翻译生成
TriSoul —— 三魂共识 Agent 三个灵魂盲写互评的共识 agent——用一个便宜的小模型,做到接近大模型的事。 License: MIT Node 评测报告 快速开始 · 它怎么工作 · 跑分 · 常用命令 · 风险提示 [!WARNING] v0.2 · 半成品,拿来玩玩可以,别拿来干正事。 装之前先读风险提示。 同一批难题上谁能过 同一个 deepseek-v4-flash,在官方通过率 ≤ 1/4 的 38 道 DeepSWE 难题上:官方 10.5%, TriSoul 30.6%——每题只跑一次、全程断网。两道 Claude Opus 5 官方 20 次尝试 0 通过的题(awilix、meriyah),它过了。 快速开始 前置:Node.js ≥ 20、pnpm(没有就 npm i -g pnpm)。 npx github:gulagala001/dsh-trisoul init npx github:gulagala001/dsh-trisoul start 装进独立目录(macOS / Linux ~/.dsh-trisoul,Windows %LOCALAPPDATA%\dsh-trisoul),跑在自己的端口上,不碰你已有的 ~/.dsh;不想要了一条命令删干净。
展开完整文档(README 剩余 1 节)
TriSoul —— 三魂共识 Agent

三个灵魂盲写互评的共识 agent——用一个便宜的小模型,做到接近大模型的事。

License: MIT
Node
评测报告

快速开始 · 它怎么工作 · 跑分 · 常用命令 · 风险提示

[!WARNING]
v0.2 · 半成品,拿来玩玩可以,别拿来干正事。 装之前先读风险提示。

同一批难题上谁能过

同一个 deepseek-v4-flash,在官方通过率 ≤ 1/4 的 38 道 DeepSWE 难题上:官方 10.5%, TriSoul 30.6%——每题只跑一次、全程断网。两道 Claude Opus 5 官方 20 次尝试 0 通过的题(awilix、meriyah),它过了。

快速开始

前置:Node.js ≥ 20、pnpm(没有就 npm i -g pnpm)。

npx github:gulagala001/dsh-trisoul init
npx github:gulagala001/dsh-trisoul start

装进独立目录(macOS / Linux ~/.dsh-trisoul,Windows %LOCALAPPDATA%\dsh-trisoul),跑在自己的端口上,不碰你已有的 ~/.dsh;不想要了一条命令删干净。
启动后打开 http://127.0.0.1:3081,在网页 设置 → 模型 填一个 DeepSeek API key,保存即用。
key 存在你自己的安装目录里,页面不会回显明文。

想让它在某个项目里干活:在那个目录下 start,或 start --cwd /path/to/project。

没有 git 的机器上 npx github: 会失败,改用 Releases 压缩包,解压后在目录里跑 node cli/index.mjs init。

它怎么工作

普通 agent 是一个模型自己想、自己写、自己交。TriSoul 的立论是:弱模型的病在生成时穷——顾一头就丢其他,所以补偿要发生在生成阶段(几份完整稿各补一头),而不是对一份穷稿做事后质检。

TriSoul 的一步

- 三魂共识:同一份上下文发给三个「灵魂」并行盲写(互相看不见稿子),写完匿名互评——只能投别人、不能投自己,胜者带着落败稿里的有用要点去执行。
- 三官镜头:三个灵魂是同一模型的三份实例,各带一个补偿镜头。对齐官盯「做什么」(task_map 任务账本:动手前铺成清单,做一条勾一条);博识官盯「凭什么做」(web_search / web_fetch:把「我记得」逼成有出处的事实);实证官盯「做对没有」(verify_link:给结论挂证据——引原文,或真跑一条过安全门名单的验证命令)。
设置里只选灵魂数量 1 / 2 / 3,嫌贵就降魂数。
- 画布式上下文:不按「新旧」自动截断。上下文分恒真区 / 状态区 / 工作区,由读得懂内容的「手术刀」圈定区间改写,改完做探针题验收。
- 记忆中枢:独立模型订阅事件流,自动消化沉淀成记忆;推(开场注入)、拉(trisoul_recall)、手术后回捞三条通道。

装上以后你看到的还是 dsh 原来的网页,只是多了「监控」「记忆」两个标签页和设置里的 TriSoul 分区。

跑分

DeepSWE 是让前沿大模型也只能做对七成的编程题库。从官方 28010 次公开运行记录里挑出 deepseek-v4-flash 通过率 ≤ 1/4 的 38 道题,用 TriSoul 驱动同一个 flash 再跑一遍:全程断网、每题只跑一次、不看答案(对比口径均为平均每次通过率 pass@1)。

| | 通过率 | 口径 |
| deepseek-v4-flash 官方(同底座) | 10.5% | 16/152 次 · $0.10/次 |
| TriSoul(同一个 flash) | 30.6% | 11/36 题 · 每题只跑 1 次 |
| gpt-5.4 xhigh 官方 | 28.3% | 43/152 次 · $5/次 |
| deepseek-v4-pro 官方 | 38.8% | 59/152 次 · $0.25/次 |
| claude-opus-5 全档 官方 | 58.7% | 436/743 次 · $5–12/次 |

- 同一个模型,架构带来 2.9 倍。
- 两道 Opus 5 官方 0/20 的题(awilix、meriyah),TriSoul 过了;另有三道 Opus 5 仅 2–3/20 的题也过了。
- 表决不是摆设:183 轮里胜者 A/B/C 均衡(36% / 29% / 35%),没人垄断;投票者只看别人的稿, 2-1 就是这套架构里最强的共识信号。

逐题转胜分析、表决全景、断网与作弊面审计、全量外推算法,都在完整评测报告 → (单文件 HTML,可下载本地打开,无外链无脚本)。

常用命令

npx github:gulagala001/dsh-trisoul

| 命令 | 干什么 |
| init / start | 安装(首次)/ 启动并开浏览器 |
| stop / restart | 停止 / 重启(有任务在跑会拒绝,--force 无视) |
| status / log [n] | 查看状态 / 查看最后 n 行日志 |
| doctor | 重新应用上游补丁 + 自检 |
| uninstall [--keep-data] | 卸载整个安装目录(--keep-data 会先把记忆库和会话备份到 ~/trisoul-data-backup) |

常用选项:--port (默认 3081)、--cwd (agent 的工作目录)、--no-open。

风险提示

这套架构是用资源换准确率,代价很实在:

| 风险 | 说明 |
| 账单高一个量级 | 三魂各消耗一份完整上下文(输入 ×3 起)+ 每魂一份官位人设 + 记忆/手术后台调用;人设温度各异,缓存也难命中。先用小额度试,嫌贵就把灵魂数量降到 2 或 1。 |
| 并发压力 | 三路盲写并行,容易撞上 API 限流;撞上后表现为变慢、报错或某魂掉线(自动降级为 2/3 继续)。 |
| 结果不保证收敛 | 同样的问题问两次可能得到不同答案;平票(实测约 18.6%)走轮换兜底——那只是「有个结果」,不是「更对」。 |
| 只能本机使用 | 默认只绑定 127.0.0.1,接口没有鉴权,不要暴露到公网。 |
| 模型得会输出 JSON | 支持强制格式输出的渠道(DeepSeek 官方就支持)会被自动上语法锁;其余渠道靠提示词软约束,弱模型可能偶尔跑飞。 |

和原版 dsh 的关系

TriSoul 是 DeepSeek Harness(dsh,MIT)的插件套件:

- 全部功能以 dsh 插件实现,宿主一行没改;上游依赖的三处小补丁在安装时自动打上(doctor 可重打,均有幂等标记与 .orig 备份)。
- 独立目录、独立端口(3081,原版默认 3080),和你已有的 dsh 互不影响,可以同时开着。
- 宿主标着 developer preview,会有破坏性变更;本项目钉死在一个已知能跑的版本上。

仓库结构

cli/ 安装器与启停命令(零第三方依赖,直接 node 跑) index.mjs 命令分发入口 lib/init.mjs 装宿主 dsh → 复制插件 → 装配 profile → 打上游补丁 → 自检 lib/server.mjs start / stop / status / restart(Windows 走 taskkill,POSIX 走信号) lib/uninstall.mjs 卸载(带路径安全围栏,拒绝删 $HOME、~/.dsh 这类目录) lib/patch-pi-ai.mjs 给上游 pi-ai 打一个 O(n²) 性能补丁,可用 doctor 重打 lib/patch-onpayload.mjs 桥/官方适配器放行 onPayload(JSON 格式锁的通道),同样 doctor 可重打

config/
trisoul.patch.yml profile 配置模板:挂哪些插件、灵魂数量、模型路由

packages/ TriSoul 插件本体(服务端 6 个 + 客户端 3 个) dsh-plugin/ 三魂共识:盲写 / 匿名表决 / tips 挂账 / 平票轮换 dsh-canvas/ 画布式上下文:恒真区 / 状态区 / 工作区的分区与触发 dsh-surgeon/ 上下文手术刀:圈定区间改写 + 探针题验收 dsh-memory/ 记忆中枢:事件流消化、推 / 拉 / 回捞三通道 dsh-guard/ 安全门:共识 ≠ 授权,三个灵魂一致同意的危险动作照样拦 dsh-api/ Web UI 的后端接口 + 灵魂名册解析 + 监控归因 client/memory-ui、client/monitor、client/settings 三个网页插件(预构建产物)

docs/ README 里的图表 + 完整评测报告(单文件 HTML)

装完以后东西都在安装目录里,和这个仓库无关。

许可证

MIT
预览分享卡片长什么样 ↓gulagala001/dsh-trisoul
分享 · DeepSeek Harness Hub
gulagala001/dsh-trisoul

三个小模型盲写互评,用便宜模型跑出大模型效果

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部