刘文武 102d6bbe75 feat(mode_workflow): 添加图片反代与灯箱预览,优化多项细节 1 день назад
..
mode-dsl 6e63988e77 feat(mode_workflow): 新增完整工作流与工具提取系统 2 дней назад
procedure-dsl 6e63988e77 feat(mode_workflow): 新增完整工作流与工具提取系统 2 дней назад
query_jobs 6e63988e77 feat(mode_workflow): 新增完整工作流与工具提取系统 2 дней назад
shell 6e63988e77 feat(mode_workflow): 新增完整工作流与工具提取系统 2 дней назад
.cloudflared.log 102d6bbe75 feat(mode_workflow): 添加图片反代与灯箱预览,优化多项细节 1 день назад
.cloudflared.pid 6e63988e77 feat(mode_workflow): 新增完整工作流与工具提取系统 2 дней назад
README.md 6e63988e77 feat(mode_workflow): 新增完整工作流与工具提取系统 2 дней назад
db.py 6e63988e77 feat(mode_workflow): 新增完整工作流与工具提取系统 2 дней назад
mode_procedure_分析.md 6e63988e77 feat(mode_workflow): 新增完整工作流与工具提取系统 2 дней назад
new_query.html 6e63988e77 feat(mode_workflow): 新增完整工作流与工具提取系统 2 дней назад
server.py 6e63988e77 feat(mode_workflow): 新增完整工作流与工具提取系统 2 дней назад

README.md

mode_procedure · 新模式 + 直写版工序解构

自包含文件夹,跑「new 模式界面 + procedure 直写版工序解构」。 打法同 fixed_query_eval引擎全复用父目录 search_eval/ 原件,本目录只放改造后的 server + 前端


这是什么

search_eval/server.py --mode new + run_cyber.py --skill procedure 这一套固化进一个文件夹:

  • new 模式:读写 runs_new/、前端用 new_query.html、query 用自由中文名(非 q0000)。
  • procedure 直写版:工序解构走 run_cyber.py --skill procedure(读 procedure-dsl/procedure/SKILL.md,强模型一次 write 出 workflow.json),而不是默认的 spec 三阶段版。

完整原理分析见同目录 mode_procedure_分析.md

想改提取逻辑/词表:直接改 procedure-dsl/procedure/SKILL.md(提取规范+内嵌词表)、procedure-dsl/procedure/tools/vocab.py(合法词表)、validate.py(校验规则)——都是本地副本,改完即生效,不碰别人那份。


文件结构

mode_procedure/
├── server.py        ← 后端枢纽(new 模式 + 双引擎接线 + 版本/DB + procedure_versions)
├── new_query.html   ← 前端操作台(两个工序子 tab + 版本下拉)
├── db.py            ← 共享持久层:agent_dsl / mode_dsl 双表(每版本一行)
├── procedure-dsl/   ← ★ 【Agent 工序】引擎(run_cyber 直写版 + 渲染器)
│   ├── run_cyber.py / run_procedure_dsl.py / plan_tool.py
│   ├── procedure/            直写版 skill(SKILL.md + tools/{validate,wf-patch,render,vocab}.py)
│   └── spec/                 渲染基础设施(renderer.py + taxonomy,两种工序共用)
├── mode-dsl/        ← ★ 【大模型工序】全部(与 procedure-dsl 并列)
│   ├── procedure_model_extract.py   单帖:一次大模型直出 workflow.json + 渲染
│   ├── batch_model_extract.py       批量:一个 query 全部帖 + 写 mode_dsl
│   └── prompts/procedure_extract_system.md   提取 prompt(可单独迭代)
├── runs_new/        ← 产出目录(每个 query 一个中文名子目录;含 _model/ + history/)
├── mode_procedure_分析.md   ← 原理分析
└── README.md

procedure-dsl/(Agent 工序)vs mode-dsl/(大模型工序) 是两条并列的提取引擎;db.py / server.py / new_query.html / runs_new/ 是两者共享。大模型工序的渲染复用 procedure-dsl/ 的 render.py + spec/renderer(不重复造)。

两类依赖,分清楚:

  • 工序提取引擎 → 本地副本mode_procedure/procedure-dsl/):run_cyber.py + 依赖 + procedure/ 直写 skill。这套是你的,随便改(改 SKILL.md / 词表 / 校验规则都行),不影响 ../procedure-dsl/ 那份共享的。
  • 搜索 / 评分 / 重评 → 复用父目录 ../(不复制):search_and_evaluate.pybatch_3forms.pybuild_workflows.pybatch_extract_procedures.pyevaluation/(taxonomy)。

spec/ 也复制了(不是为了那个「三阶段」skill,而是 procedure/tools/render.py 渲染 HTML 时复用 spec/tools/renderer.py + spec/taxonomy/)。不复制 spec/ 的话,workflow.json 能生成但最后渲染 HTML 会失败 → 界面看不到结果。你不用改 spec/,它只是渲染基础设施。

前端「Claude SDK」引擎在本目录可用(spec/ 已在),但本目录定位是 cyber_runner + procedure 直写版。

cwd 说明:server 起 run_cyber 时把 cwd 设成 procedure-dsl/(run_cyber 假设的工作目录),否则 agent 找 procedure/SKILL.md 会瞎试浪费回合。


相对原版 server.py 的改造(5 处)

# 改动 说明
1 MODE = "new" 写死、端口默认 8771 不用再传 --mode new
2 SE = HERE.parent + sys.path.insert(SE) 复用兄弟模块 batch_extract_procedures / build_workflows
3 所有引擎脚本/procedure-dsl 路径 HERE/…SE/… 引擎在父目录 search_eval
4 4 个 subprocess 的 cwd=str(HERE)str(SE) 与原版运行目录一致
5 两处 run_cyber 命令加 --skill procedure 用直写版 skill(单帖 + 批量)

EVALDIR 靠原有 fallback 自动落到 search_eval/evaluation(taxonomy),无需改。


怎么跑

cd examples/process_pipeline/script/search_eval/mode_procedure
python server.py            # 默认 8771,写死 new 模式
# 浏览器开 http://0.0.0.0:8771

界面流程(new_query.html):

  1. 选维度/输自由 query + 勾平台 → 「搜索并评估」→ runs_new/{query}/form_A.json
  2. 看帖卡片 → 单帖「生成工序」或「批量生成工序」→ run_cyber.py --skill procedureprocedures/{folder}/workflow.json + case-*.html
  3. 可「重新评估」

模型:工序提取默认 google/gemini-3.1-flash-lite(界面可改)。

注意:procedure 直写版 SKILL 较复杂,gemini-flash-lite 可能一次写不全;要质量更稳可在界面切强模型(如 anthropic/claude-sonnet-4.6)。


详情页两种工序提取方式(分两个子 tab)

帖子详情「对应工序」下分 🛠️ Agent 工序 / ⚡ 大模型工序 两个子 tab,各自独立显示结果、互不覆盖

  • 存储分离:Agent → procedures/{folder}/;大模型 → procedures/{folder}/_model/(各有自己的 workflow.json / case-*.html / _extract.log)。
  • 状态/日志接口加了 variant=agent|model 参数路由到对应目录;task_key{q}/{folder} vs {q}/{folder}/_model 区分。
  • 切到某个子 tab 就触发该方式的提取按钮 + 显示该方式的结果。

两种提取方式:

按钮 走什么 流程 特点
开始提取工序 run_cyber.py --skill procedure(agent) 读 SKILL.md → 写 → validate 校验 → 修 → 渲染 多轮、有自我校验修错,质量稳,慢/贵
🤖 模型提取 mode-dsl/procedure_model_extract.py(单次大模型) 一次大模型调用(帖子文本+配图 → workflow.json)→ 渲染 无 agent / 无 validate 循环,快/便宜(~$0.004),不保证字段全合规

大模型工序相关全部在 mode-dsl/(与 Agent 引擎 procedure-dsl/ 并列):

  • mode-dsl/prompts/procedure_extract_system.md — 提取 prompt(可单独迭代,不动代码)
  • mode-dsl/procedure_model_extract.py — 单次多模态调用 → workflow.json → 复用 ../procedure-dsl 的 render.py 出 HTML
  • mode-dsl/batch_model_extract.py — 批量:一个 query 下所有帖逐个跑 + 写 mode_dsl
  • server /api/extract_procedure_model 端点 + run_model_extraction_task(调 mode-dsl/procedure_model_extract.py
  • new_query.html 「🤖 模型提取」按钮 + startModelExtraction()

模型默认 gemini-3.1-flash-lite,用详情页「AI 模型」下拉选中的模型。两个按钮都复用同一套 procedure_status / 日志 / 版本 / 展示逻辑。

持久化 + 版本

  • db.py(根目录,共享):agent_dsl / mode_dsl 两张表,每帖每版本一行(version = v_月日时分,保留历史)。python db.py init 建表。
  • 每次重新生成 → 新版本写 DB + _meta.json,旧版本进 history/{版本}/;详情页「重新生成」旁的版本下拉可切换历史版本。

依赖

fixed_query_eval:需 pip install -e '.[browser,server,feishu]' + Pillow/filelockrun_cyber 触发 agent.tools.builtin 全链)。server.py 本身轻量(提取走 subprocess),缺这些也能起、能看已有产出。

环境变量:OPEN_ROUTER_API_KEY(提取/评分/OCR 都走 OpenRouter)。


已验证

  • ✅ server 启动、服务 new_query.html、/api/data 正常、矩阵从 search_eval/evaluation 加载
  • from batch_extract_procedures / import build_workflowsSE 解析成功
  • /api/generate_procedure 触发 → run_cyber.py --skill procedure 正确启动(OCR 配图、调 OpenRouter 200、无路径错误)

实现:复制 ../server.py + ../new_query.html + ../procedure-dsl 的工序提取引擎(run_cyber/run_procedure_dsl/plan_tool/procedure)。server 改造:写死 new 模式 + 工序引擎指本地 procedure-dsl + 搜索/重评仍指父目录 + run_cyber 加 --skill procedure。引擎是 DSL_ROOT 自相对路径,复制后内部无需改。