dsh-opencli:用常驻 OpenCLI daemon 替代逐条 CLI 冷启动

前言

在 DSH 里让智能体操作本机已登录浏览器,常见路径是调用 opencli。每次执行都会再起一次 Node 进程、加载大量模块,只为向本机 daemon 发一条请求;README 中给出的实测是单次约 1.4–1.8 s(例如 opencli list search 约 1071 ms)。Agent 连续多步调用时,这部分时间会叠在任务链路上。

dsh-opencli 由维护者 d342784178 发布,分类属于客户端类 DSH 插件。它不替你在 shell 里反复敲 opencli,而是在 harness 侧通过 HTTP 直连本机已运行的 OpenCLI daemon,把「每条命令一次 CLI 冷启动」换成「常驻服务 + 短请求」。社区目录页见 SkillHub,源码与文档在 GitHub。npm 包名同为 dsh-opencli,当前 package.json 标注版本 0.1.0,许可证 MIT。DSH 社区目录是独立站点,与 DeepSeek / 幻方无官方从属关系;生态上 DSH 强调「一切皆插件」,本插件是其中一条可选 bundle。

下面介绍它做什么、怎么装、怎么用,以及和真实浏览器交互时要注意的事。

这是什么

一句话:dsh-opencli 是面向 DeepSeek Harness 的低延迟浏览器工具集,直接驱动本机 OpenCLI daemon,而不是每步都 spawn 一次 opencli CLI。

README 用两条路径对比延迟:

CLI path    : agent -> shell -> node opencli -> (318 modules) -> daemon   ~1400-1800 ms
plugin path : agent -> oc_exec -> fetch()     ->                daemon    ~10-20 ms

实现上,插件向 http://127.0.0.1:19825/command 发请求,并带上 X-OpenCLI: 1 头,把 daemon 的响应交回 agent。daemon 预热后,同类请求 README 称约 5–20 ms。

核心功能

插件通过 cordis.patch.yml 注册五个工具(无需手写 patch 条目)。下表含义来自官方 README。

工具 作用 是否写页面
oc_status daemon 版本、在线状态、扩展连接、contextId、profiles、内存;出问题时先调它 否
oc_exec 在已登录浏览器里执行 JS 表达式;codes 一次最多 40 条;支持 await fetch(...) 等异步 视表达式而定
oc_navigate 打开 URL,等待加载,返回标题 / 最终 URL / 是否超时 是
oc_snapshot 把页面压成紧凑可交互结构(标题、带 href 的链接、按钮、输入框 name/placeholder、disabled 等),比 outerHTML 便宜一个数量级 否
oc_tabs 在自动化容器内 list / new / select / close 标签页 new/select/close 会改状态

session 是持久自动化标签页的键(默认 dsh),不同任务可以用不同 session 隔离标签。每次 oc_tabs 操作都要带 session(缺省则用配置的默认 session)。

失败不会抛未捕获异常,而是结构化返回:{ ok: false, errorCode, error, hint },hint 指向建议的下一步。daemon 死掉时插件不会自动重启,避免真实故障被静默重试掩盖。

配置

可在 profile patch 或插件设置 UI 覆盖 cordis.patch.yml 中的三项:

config:
  port: 19825          # 须与 `opencli daemon status` 一致
  defaultSession: dsh  # 持久自动化标签页的 session 键
  timeoutMs: 30000     # 单条表达式超时,限制在 2000–120000

安装与启用

包已发布到 npm(registry:https://registry.npmjs.org/dsh-opencli;当前版本可用 npm view dsh-opencli version 查询)。Node 引擎要求 >=20。

路径 A:在 DSH 内由插件管理器从 registry 解析(会一并处理 bundle 选中)

plugin_manager action=install_bundle target=dsh-opencli

从本地目录安装时:plugin_manager action=install_bundle target=/absolute/path/to/dsh-opencli。

路径 B:用 dsh CLI(实质是在 profile 目录里走 pnpm)

npx @deepseek-ai/dsh plugin --profile web add dsh-opencli

也可先全局安装:npm i -g @deepseek-ai/dsh,再执行带 plugin 的子命令。web 是桌面端默认 profile 名。

路径 C:在 profile 目录手动加依赖

cd ~/.dsh/profiles/web
pnpm add dsh-opencli

桌面创建的 profile 常带 pnpm .npmrc(node-linker=hoisted),优先用 pnpm add;无 pnpm 配置的 profile 也可用 npm install dsh-opencli。镜像环境可在命令后加 --registry=https://registry.npmmirror.com。

路径 B、C 只安装 npm 包,不会自动改 dsh.profile.bundles,harness 不会加载插件,直到你在侧栏 Plugins 页启用该 bundle(该页可同时完成安装与选中),或在 preset 允许时用 plugin_manager 启用。路径 A 会替你完成 bundle 注册这一步。

手动写入 profile 的 package.json 示例:

{
  "dsh": {
    "profile": {
      "bundles": ["...", "dsh-opencli"]
    }
  }
}

插件自带的 cordis.patch.yml 会插入 dsh-opencli 工具行,不必手写。无论哪条路径,装完后应重启会话,或在插件列表里把 include:dsh-opencli 关一次再开。

注意:profile 的 lockfile 与 pnpm 版本要对齐(v9 lockfile 需要 pnpm 10+);版本不匹配时可能出现 lockfile 被忽略并整包重解析。用 B/C 安装时,尽量与 profile 现有 lockfile 使用同一 major 的 pnpm。

典型用法与排障

  1. 会话里先调用 oc_status,确认 daemon 在线、扩展已连接。
  2. 需要新标签时在容器内 oc_tabs op=new,再 select;只对自动化容器内的页操作。
  3. 用 oc_navigate 打开目标 URL,用 oc_snapshot 看清 DOM 结构,再用 oc_exec 执行表达式;复杂页面优先 snapshot,减少盲目写选择器。
  4. 多步脚本可把多条表达式放进 oc_exec 的 codes,一次往返最多 40 条。

常见症状与 README 建议:

现象 处理
daemon_unreachable 执行 opencli daemon restart(任意 opencli 命令也会尝试拉起 daemon)
extension ... disconnected 在 Chrome/Edge 打开 OpenCLI 扩展,保持浏览器窗口存活,再用 opencli daemon status 看 extensionConnected
Page is not in the automation container 先用 oc_tabs op=new 在容器内开页
page_not_found / stale page identity oc_tabs op=list 核对 index/page,或省略 page 让 daemon 选择
ReferenceError / SyntaxError 表达式本身有误;先 oc_snapshot 对照真实 DOM

开发 index.js 时修改不会热重载,需通过插件管理器关闭再打开条目重新 import:

plugin_manager action=list_plugins
plugin_manager action=set_plugin target=include:dsh-opencli enabled=false
plugin_manager action=set_plugin target=include:dsh-opencli enabled=true

适用场景与注意

适合: 智能体需要在你已登录的真实浏览器里连续操作——填表、点按钮、跨步保留 cookie/session,且希望把 OpenCLI 调用延迟从秒级压到毫秒级时,用 oc_* 比反复 shell 调 opencli 更合适。

不适合或需慎用: 简单、无需登录态的页面探测,README 建议仍用无头 Playwright。oc_* 驱动的是真实浏览器窗口:点击、填表、关标签都会发生在当前可见会话里,权限与你在本机登录的账号一致。

插件以当前 DSH 进程权限运行;安装前请自行查看 GitHub 仓库 源码与 MIT 许可证,确认符合你的安全与合规要求。

结尾

dsh-opencli 把本机 OpenCLI daemon 当作常驻服务,用五个 harness 工具替代「每条命令启动一次 opencli CLI」的路径,在官方 README 给出的测量下,延迟从约 1.4–1.8 s 量级降到约 10–20 ms 量级。安装任选 registry / CLI / profile 依赖三条路径之一,并记得启用 bundle 后重启或切换插件条目。

  • 目录页:https://www.skillhub.cn/plugins/d342784178/dsh-opencli
  • GitHub:https://github.com/d342784178/dsh-opencli
  • npm:https://www.npmjs.com/package/dsh-opencli
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜