把编码代理接入本地引擎,按对话持久化会话并实时流式输出
28.3/100
综合分
4
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/9/16 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add fatwang2/pi-dsh该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:需留意
是什么
dsh 原生插件 · model
装得上吗
实装验证未通过(dependency_conflict),装前请到仓库确认最近更新与 issue
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 80 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
⚠︎ 实装验证未通过(dependency_conflict · 2026/9/26) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件
查看扫描证据(共 6 处,展示前 6 条)
- 读取本地文件src/config.ts:42
if (!existsSync(DSH_SETTINGS_PATH)) return undefined; - 读取本地文件src/config.ts:43
const parsed: unknown = loadYaml(readFileSync(DSH_SETTINGS_PATH, "utf8")); - 读取本地文件src/config.ts:74
if (!existsSync(path)) return { exists: false, parsed: {} }; - 读取本地文件src/config.ts:76
const parsed = JSON.parse(readFileSync(path, "utf8")) as unknown; - 写入本地文件src/dsh-host.ts:89
writeFileSync(rootConfigPath, "[]\n"); - 执行外部命令来自配置/变量src/providers.ts:591
const child = spawn(cfg.dshBin, ["--profile", "headless", prompt], {
扫描于 2026/11/3(0 天前) · 范围 全包扫描 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/cordis-plugin-group@deepseek-ai/cordis-plugin-hmr@deepseek-ai/cordis-plugin-loader@deepseek-ai/cordis-plugin-timer@deepseek-ai/dsh-agent@deepseek-ai/dsh-app-boot@deepseek-ai/dsh-base@deepseek-ai/dsh-llm@deepseek-ai/dsh-session@deepseek-ai/dsh-session-persistence-jsonl给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 接入本地编码引擎
- 按对话持久化会话
- 实时流式输出
README
由 DeepSeek 最新模型翻译生成pi-dsh
Pi Coding Agent provider 扩展,将 DeepSeek Harness(dsh)暴露为可选的 provider。选择 dsh provider 后,每一轮都会路由到 DSH 自身的 harness,运行一个进程内的 cordis 树,并带有按对话持久化的会话池,而不是 HTTP LLM 端点。
上下文归属 = DSH。 DSH 原生加载自己的系统提示词、AGENTS.md(~/.dsh/AGENTS.md + 通过 dsh-agent-instructions 加载的项目 AGENTS.md 链)以及技能(~/.agents/skills、~/.dsh/skills、项目 .dsh/skills + 通过 dsh-skill-filesystem 加载的 .agents/skills)。pi-dsh 不会再次转发 pi 的 AGENTS.md/技能——那会导致重复加载。
展开完整文档(README 剩余 1 节)
pi-dsh
Pi Coding Agent provider 扩展,将 DeepSeek Harness(dsh)暴露为可选的 provider。选择 dsh provider 后,每一轮都会路由到 DSH 自身的 harness,运行一个进程内的 cordis 树,并带有按对话持久化的会话池,而不是 HTTP LLM 端点。
上下文归属 = DSH。 DSH 原生加载自己的系统提示词、AGENTS.md(~/.dsh/AGENTS.md + 通过 dsh-agent-instructions 加载的项目 AGENTS.md 链)以及技能(~/.agents/skills、~/.dsh/skills、项目 .dsh/skills + 通过 dsh-skill-filesystem 加载的 .agents/skills)。pi-dsh 不会再次转发 pi 的 AGENTS.md/技能——那会导致重复加载。
要求
- Pi Coding Agent 宿主(@earendil-works/pi-ai / @earendil-works/pi-coding-agent >= 0.82.0)
- 池模式需要真实的 DSH 安装(~/.dsh/profiles/headless + 凭据);oneshot 回退需要 PATH 中有 dsh
- 运行验证脚本需要 Node.js >= 22(test/verify-pathb.mjs 通过原生类型剥离导入一个独立的 .ts 模块)
工作原理
- 注册一个 provider dsh,使用自定义的 api: "dsh-exec" 和非 HTTP 的 baseUrl: "dsh-exec://local"。
- 池模式(默认,mode: "pool"):每个进程启动一个进程内的 DSH cordis 树(dsh-base 组合,禁用 HMR 行),然后维护一个活跃 agent 池——每个 Pi 对话对应一个 DSH 对话,以 Pi 的 session id 为键(LRU 上限 8,空闲 TTL 15 分钟)。每一轮都是 agent.followup(...),session/event 事件流被转换为 Pi 的 AssistantMessageEventStream——text_delta / thinking_delta,工具活动以 thinking 块的形式展示——因此回答是实时流式输出的,而不是一次性整块返回。
- 一次性回退(mode: "oneshot"):path-B 之前的行为——启动 dsh --profile headless "",收集 stdout,输出一个文本块。保留为可配置选项,以防 rc 树出现异常。
- DSH 拥有提示词/记忆/技能;pi-dsh 只路由最新的用户消息。跨轮连续性来自 DSH 的会话持久化(~/.dsh/sessions JSONL):恢复的 Pi 对话会恢复同一个 DSH 会话(通过确定性的 session id,因此连续性甚至能在宿主重启后保持)。
权限
嵌入式 DSH 树以 sandbox danger-full-access + approval never 启动,在 src/dsh-host.ts 中于启动时打补丁(否则 dsh-base 会默认使用 workspace-write + approval ask)。
这是一个安装时的信任决策,而不是每次操作的关卡。DSH 在 provider 内部运行自己的工具循环(bash/fs/subagents),这些活动以 thinking 块的形式呈现——Pi 的审批 UI 从设计上就永远不会看到或拦截这些调用(将它们作为 Pi 的 toolcall_ 事件转发会把工具执行交给 Pi 的 agent 循环,并导致该轮次被无限重新驱动)。因此,一旦安装了 pi-dsh,该 harness 就会以你的完整本地访问权限行事,并且没有任何东西——无论是 Pi 还是 DSH——会在模型写入文件或运行命令之前进行提示。这与 pi-claude-bridge 的 permissionMode: "bypassPermissions" 以及 pi-cursor-sdk 的 SDK 嵌入(完全没有权限对话框)如出一辙。
这两个设置是一对,而其中只有一个才是真正让工具得以运行的关键。danger-full-access 在沙箱层允许一切,因此永远不需要升级。审批 never 并不意味着“自动批准”——dsh-user-approval 会将其解析为 rejected——它意味着升级请求会确定性地失败,并且模型会事先被告知不要尝试 sandbox_permissions。
- DSH 的文件沙箱不会限制来自嵌入式树的写入。
- 在任何模式下,网络/进程策略都超出了 DSH 的 SandboxMode 词汇范围。
- 限制该树(例如 workspace-write)需要首先将审批请求桥接到 Pi 的权限 UI,这是一项有意为之的未来变更。仅仅降低沙箱模式是行不通的:ask 会诱使模型升级,但在没有挂载应答者的情况下,每个请求都会以 unavailable 失败关闭,因此它会在永远无法成功的重试上浪费步骤。
安装
已发布到 npm:
pi install npm:pi-dsh
对于本地开发,请将此仓库的绝对路径添加到 ~/.pi/agent/settings.json → packages:
{
"packages": [
""
]
}
然后重启 pi(或你的 pi 宿主)。dsh provider 会出现在 /model 中,形式为 dsh/——即 DSH 自身被配置为运行的模型(~/.dsh/settings.yaml → agent-default-model,例如 dsh/deepseek-v4-pro)。
当该文件不可读时,目录会回退到一个合成的 dsh/dsh-harness 条目。DSH 拥有模型选择权;pi-dsh 只是镜像它。
依赖布局
@deepseek-ai/ 是固定版本(0.1.0-rc.6)的 pi-dsh dependencies,并作为真实安装存在于此仓库的 node_modules 中,与 pi 宿主的依赖图隔离(dsh 会拉取 zod@4,而它绝不能在一个固定 zod@3 的宿主上被提升)。pi 宿主包和开发工具通过作用域级符号链接解析到宿主安装中。有关确切的布局和理由,请参见 plans/002-design-notes.md。
开发
npm install # 安装固定版本的 @deepseek-ai/* 依赖 + 开发工具
将 pi 宿主包指向你的 pi 安装(单一物理 pi-ai 实例): ln -s /node_modules/@earendil-works node_modules/@earendil-works
npm run typecheck # tsc --noEmit
npm run verify # provider 注册检查
npm run verify:stream # oneshot 模式回归测试(fake dsh)
npm run verify:pathb # pool 模式集成测试(真实 dsh;若不存在则 SKIP)
配置(可选)
~/.pi/agent/dsh.json:
{
"mode": "pool",
"poolMax": 8,
"poolIdleTtlMs": 900000,
"dshBin": "dsh",
"timeoutMs": 1800000
}
- mode:"pool"(默认)或 "oneshot"。
- poolMax:池中最大会话数(超出时按 LRU 淘汰)。默认 8。
- poolIdleTtlMs:池中会话关闭前的空闲时间,单位毫秒。默认 15 分钟。
- dshBin:仅由 "oneshot" 回退路径使用。默认 dsh。
- timeoutMs:仅由 "oneshot" 回退路径使用(每次运行的预算)。默认 30 分钟。
环境变量覆盖:PI_DSH_MODE、PI_DSH_POOL_MAX、PI_DSH_POOL_IDLE_TTL_MS、PI_DSH_BIN、PI_DSH_TIMEOUT_MS。
版本固定策略
进程内 DSH 接口不稳定(0.1.0-rc.6、SESSION_FORMAT_VERSION = 0、“不隐含任何兼容性保证”)。@deepseek-ai/ 在 package.json 中固定为精确版本(不带 ^),并且每一处 @deepseek-ai/ 导入都被隔离在 src/dsh-host.ts 之后(唯一的收口点)。任何 dsh 升级(0.1.0-rc.x → 更新版本)都需要重新运行 Phase 1–2 的 spike 门禁(记录在仓库的 plans/ 笔记中——不会随 npm tarball 发布),然后才能提升版本固定——assistant/chunk / turn/end 事件词汇表没有任何兼容性保证。
限制
- Pool 模式需要真实的 DSH 安装(~/.dsh/profiles/headless + ~/.dsh/.credentials.yaml 中的凭据)。如果 rc 树行为异常,设置 mode: "oneshot" 回退到无状态子进程路径(无连续性,无流式输出)。
- 中止(Abort)会取消当前活动轮次,但保留池中会话;只有在真实轮次出错时,或由空闲 TTL/LRU 清理器触发时,条目才会被销毁。
- 工具调用运行在 DSH 自己的工具循环内,并按其时间顺序位置显示为思考块(调用时显示 [tool] …,完成时显示 [tool result] …)——因此流按时间交错(思考 → 工具 → 思考 → 工具),而不是把工具堆叠到单独区域。它们永远不会是 Pi 的 toolcall_* 事件:外来的 toolCall 块会让 Pi 的 agent 循环接管工具执行,产生空的 toolResults 并重新驱动该轮次(无限循环)。
- 用量(Usage)按轮次报告:DSH 的 usage 块是按模型调用计的(已对照持久化会话验证),因此 pi-dsh 会对该轮次的块求和;totalTokens 保持在提示词侧,这样 Pi 的自动压缩就永远不会误触发。
验证
npx tsc --noEmit # 类型检查
node verify.mjs # provider 已注册
node verify-stream.mjs # path-A(oneshot)回归测试,对照 fake-dsh.sh
node test/verify-pathb.mjs # path-B pool 集成测试(真实 dsh;若不存在则 SKIP)预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
fatwang2/pi-dsh
把编码代理接入本地引擎,按对话持久化会话并实时流式输出
相关插件 · 模型接入
API 中继安全审计toby-bridges/api-relay-audit
面向 AI API 中转与 LLM 代理的本地安全审计。
★ 897已汉化DSH
69.4
免费搜索插件DDDMUC/dsh-free-search
DeepSeek Harness 免费搜索插件 —— 无需 API key,零成本,多引擎可切换。 一个插件,给…
★ 814已汉化DSH
68.8
免费联网搜索liustack/modsearch
在官方 App 里模型能联网,切到 API 就不能了。ModSearch 把联网补回来:网页搜索、X…
★ 863已汉化DSH
68.5
OpenCode 免费模型FishBottle7/opencode2dsh
在 DSHDeepSeek Harness里原生使用 OpenCode Zen 的免费匿名模型。
★ 385已汉化DSH
67.9
AI 模型网关tingly-dev/tingly-box
Tingly Box Web UI 演示
★ 373已汉化DSH
67.4
WorkBuddy 账号池XDTrees/dsh-xdpool
把你能白嫖的模型额度接进 DSH 同一个池:WorkBuddy 多账号自动容错、十三家扫码登录、76…
★ 359已汉化DSH
67.1