dsh-stata:在 DSH 里驱动常驻 Stata GUI 会话

前言

在 DSH(DeepSeek Harness)里做计量或实证分析时,智能体往往需要执行 Stata 命令、跑 .do 文件,并把回归表、错误码一并读回来。常见自动化路径各有门槛:PyStata 依赖许可与无头初始化,许可异常会直接初始化失败;批处理 /e 跑完进程即退出,有时连 .log 都落不下来;OLE/COM 又要求注册表写入,Stata 17 默认不注册,部分环境还要管理员权限。

下面介绍社区插件 dsh-stata(维护者 SoldierNo4):在只要能打开 Stata GUI 的前提下,用文件队列与常驻轮询 daemon.do 控制 Stata,不依赖 COM、管理员或批处理模式,也不绕过 Stata 许可校验。

这是什么

dsh-stata 是 DSH 工作流类插件,在可见的 Stata 窗口里维持一个长期会话:执行命令、运行磁盘上的 .do 文件,并把 Results 窗口的真实输出回传给 agent。当前版本(package.json 为 0.1.0)显式支持 Windows;需已安装 Stata 14 及以上(MP / SE / BE 均可)、DSH(profile 具备插件管理能力),Node.js 为 ^22.19.0 || >=24.0.0(DSH 自带运行时即可)。

插件在 SkillHub 目录 归类为「工作流」;源码与文档见 GitHub:SoldierNo4/dsh-stata,许可证 MIT。

和 PyStata / COM / 批处理相比

README 用表格归纳了实测差异,核心结论是:dsh-stata 只要能手动在 Stata 里敲命令,就能工作——因为它是在 GUI 里跑轮询脚本,而不是替 Stata 做无头嵌入。

方案 主要前提 常见卡点
PyStata 有效许可、无头初始化 许可问题 → SystemError: failed to initialize Stata
批处理 /e do file.do 有效许可 进程退出,可能无 .log
OLE(COM) StataOLEApp 注册 Stata 17 默认不注册 HKLM;HKCU 注册在部分环境对 ole32 不可见
dsh-stata 能打开 Stata GUI 纯文件队列,无需 COM / 管理员 / 批处理模式

核心功能

插件注册四个工具,并附带技能 stata(会话模型、工作流与排错指引),便于 agent 理解「一个会话对应一份内存里的数据」。

工具 用途
stata_run 在常驻会话执行 Stata 命令(可多行,支持循环、program define、注释),返回控制台输出
stata_do 运行磁盘上的 .do 文件(绝对路径或相对工作目录)
stata_status 查看可执行文件路径、会话目录、进程号、就绪状态与交换文件
stata_reset 停止后台命令循环、恢复窗口交互;卡死或超时后用于恢复

行为要点(均来自官方 README):

  • 会话跨多次工具调用保留:当前数据集、宏、program define、估计结果等;return list / r() 之外的 e() 仍在。
  • 输出为真实 Results 内容:命令回显、结果与错误码(例如 r(111);)。
  • Stata 报错不终止会话,下一条命令仍可执行。
  • 单条命令串行执行,带超时与互斥锁;超时可用 stata_reset 恢复。

安装与启用

方式一:DSH 插件页(推荐)

  1. 侧栏打开 插件 / Plugins。
  2. 点 添加插件 / Add plugin。
  3. 填入 Git 地址 https://github.com/SoldierNo4/dsh-stata,或本地包含 package.json 的目录绝对路径。
  4. 点 安装,随后 启用。启用了 HMR 的 profile 会立即重组,无需重启。

方式二:Creator 模式

通过 plugin_manager 安装 bundle:

{ "action": "install_bundle", "target": "https://github.com/SoldierNo4/dsh-stata" }

方式三:手动写入 profile

在 profile 的 package.json 依赖中加入本包(link: 本地目录或 git 地址),并把 dsh-stata 追加到 dsh.profile.bundles,然后重启 DSH。插件自带的 cordis.patch.yml 会注册工具与技能,无需再改 profile 的 patch 文件。

典型用法

自然语言驱动

直接对 DSH 说明意图,例如:用 Stata 载入 auto 数据,跑 price 对 mpg、weight 的回归。底层会调用 stata_run,返回与交互式 Stata 一致的回归表。

下一次调用可接着用内存数据,例如:

stata_run: display _N " obs in memory"
→ 74 obs in memory

运行已有脚本

stata_do: analysis/table1.do

path 支持绝对路径或相对当前工作目录。

工具参数摘要

stata_run:code(必填,多行或分号分隔)、timeoutSeconds(可选,默认 180,上限 3600)。返回 { ok, output, durationMs, error? }。

stata_do:path(必填)、timeoutSeconds(同上)。

stata_reset:可选 force;优雅路径保留数据并回到交互提示符,force: true 会结束 Stata 进程并丢弃内存数据,下次 stata_run 会开新会话。

可选配置

默认零配置。需在 profile patch 层覆盖时:

- id: dsh-stata
  config:
    stataPath: C:\Program Files\Stata17\StataMP-64.exe
    sessionDir: E:\stata-session
    defaultTimeoutMs: 180000
键 默认 说明
stataPath 自动探测 顺序:配置项 → DSH_STATA_EXE / STATA_EXE → %ProgramFiles%\Stata* 下最新 MP/SE/BE 等
sessionDir %LOCALAPPDATA%\dsh-stata 命令与日志交换目录;不可写时回退系统临时目录
defaultTimeoutMs 180000 单条命令默认超时,上限 3600000

工作原理(简述)

stata_run 将会话目录下的 cmd.do 写好(并挂 log using response.log),删除 done.txt;Stata GUI 中常驻的 daemon.do 约每 60ms 轮询并 capture noisily do cmd.do,完成后写 done.txt。插件读到 done.txt 后解析 response.log 去头尾后返回。.lock 保证串行;stata_reset 通过 stop.txt 让 daemon 优雅退出并写 idle.txt。

README 给出的参考延迟(Stata 17 MP,Windows 11):冷启动首条约 1.5–3.0 秒,之后约 0.2–1.1 秒。

适用场景与注意

适合谁:在 Windows 上已有合法 Stata GUI,希望 agent 在 DSH 里串行跑实证步骤、保留内存状态、读回真实控制台输出,又不想折腾 COM 或无头 Stata 的团队。

务必知晓:

  • 插件以当前 DSH 进程权限在本机启动 Stata 并按命令读写会话目录文件;安装前请阅读源码与 MIT 许可证,只运行可信脚本。
  • Windows only;路径与可执行文件探测按 Windows 实现,其他平台尚未支持。
  • 同一会话同时只跑一个命令块;并行需多个 Stata 实例(不同 sessionDir)。
  • 不要在命令里 exit / quit;不要手工改会话目录里的 daemon.do / cmd.do。
  • 图形导出建议 graph export out.png, replace,直接 graph 会在 Stata 窗口弹窗。
  • 超时:先 stata_status 看 processAlive,再 stata_reset;长任务调大 timeoutSeconds。找不到 Stata 时配置 stataPath 或 DSH_STATA_EXE。

SkillHub 等社区目录与 DeepSeek / 幻方无官方从属关系;DSH 生态强调「一切皆插件」,本插件是社区维护的工作流扩展之一。

结尾

dsh-stata 把「能开 Stata 窗口」变成 agent 可用的常驻会话:四条工具覆盖跑命令、跑 .do、看状态与恢复,输出与手工操作一致,状态在多次调用间保留。需要安装或参数细节时,以仓库 README 为准。

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

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

Xiaoye