前言¶
在 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 插件页(推荐)¶
- 侧栏打开 插件 / Plugins。
- 点 添加插件 / Add plugin。
- 填入 Git 地址
https://github.com/SoldierNo4/dsh-stata,或本地包含package.json的目录绝对路径。 - 点 安装,随后 启用。启用了 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