# 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.py`、`batch_3forms.py`、`build_workflows.py`、`batch_extract_procedures.py`、`evaluation/`(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),无需改。 --- ## 怎么跑 ```bash 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 procedure` → `procedures/{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`/`filelock`(`run_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_workflows` 从 `SE` 解析成功 - ✅ `/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 自相对路径,复制后内部无需改。*