Install
openclaw skills install tbs-scenario-builder编排并执行训练场景(TBS)创建流程:意图路由、字段解析与追问、发布级骨架、persona/prompts 生成、apiDraft 去重证据、统一校验闸门与确认后落库。**禁止**用浏览器自动化操作 TBS 管理后台;落库仅经脚本 API。
openclaw skills install tbs-scenario-builder本文件提供能力宪章 + 能力树 + 按需加载规则。详细参数与流程见各模块 openapi/ 与 examples/。
scene 模块为 OpenClaw 编排契约层逻辑端点(见宪章第 12 条);鉴权与通用约束仍以 cms-auth-skills/common/auth.md 与 cms-auth-skills/common/conventions.md 为准。
当前版本: v1.3
接口版本:
/v1/scene/*(逻辑端点,仅用于契约对照)/api/v1/admin/*(通过 preflight-tbs-master-data.py 与 tbs_write_executor.py 访问)域名说明:
https://scenario-builder.openclaw.internalhttps://sg-tbs-manage.mediportal.com.cn能力概览(2 块能力):
scene:训练场景创建全链路——意图路由、解析追问、发布级骨架、画像、提示词、apiDraft+去重证据、统一校验闸门、确认后执行本地落库脚本。common:内部复用/约定承载模块(无对外业务 endpoint)。快速入口(优先读):
0. openapi/README.md、examples/README.md、scripts/README.md(目录级导航)
openapi/scene/api-index.md(先判定步骤,再按需加载 endpoint 文档)examples/scene/README.md(用户可见话术、输出边界、最短成功路径与失败回退)scripts/scene/README.md(脚本映射与执行方式)统一规范:
cms-auth-skills/common/auth.mdcms-auth-skills/common/conventions.md./references/(见 references/README.md;加载 *.persona.json / *.prompt.json / *.strategy.json / role_maps/role_type_map.json 时以此为根)./scripts/tbs_assets/(见 scripts/tbs_assets/README.md)— scenario_draft.json、system_business_domains.json、持久化记录与本地鉴权材料;executor 入口为 ./scripts/scene/tbs_write_executor.pyscenarioPack.product 与 apiDraft.scenes 中的 drugName / drug_id 必须能落到 TBS 药品记录。确认落库前应执行 preflight-tbs-master-data.py(与落库相同逻辑);落库时 tbs_write_executor.py 再次调用 scripts/scene/tbs_master_data_resolve.py 中 resolve_ids_for_scene(先 GET /api/v1/admin/basic/drugs,无则 POST 创建),再 POST /api/v1/admin/scenes。接口清单见工作区 TBS/TBS_API_REFERENCE.md「§4.4 基础数据管理 — 药品 (Drugs)」。validate-and-gate 通过后先 preflight-tbs-master-data.py(可选但推荐),用户确认后由 persist-and-execute.py 子进程执行 tbs_write_executor.py(对 TBS_BASE_URL 的 HTTP API)。若用户必须在浏览器里手工操作,agent 只提供字段清单与逐步说明,不代填、不代点、不启动 browser 工具。授权依赖:
cms-auth-skills 是否已安装cms-auth-skills/common/conventions.md、cms-auth-skills/common/auth.md、cms-auth-skills/openapi/auth/appkey.md、cms-auth-skills/openapi/auth/login.mdnpx clawhub@latest install cms-auth-skills --forcenpx clawhub@latest install https://github.com/spzwin/cms-auth-skills.git --force输入完整性规则(强制):
parse-and-gap-ask.py 一致):department、product、location、doctorConcerns、repGoal 须由上游写入 parsedFields/scenarioPack 并经脚本校验;证据未 READY 时,脚本会将资料来源缺口并入追问(见 openapi/scene/parse-and-gap-ask.md 与脚本实现)。publish-ready-compose → validate-and-gate 前尽量补齐;缺项通过对话追问与闸门 issues 处理,不得以「写库前必须一次性齐全」为由阻塞脚本验收,除非 validationReport 已判定不可放行。businessDomain 缺失时,必须让用户在系统固定选项中选择,禁止开放式提问或自由发挥。固定选项:临床推广、院外零售、学术合作、通用能力(来源:scripts/tbs_assets/system_business_domains.json)。missingFields。validate-and-gate 的 validationReport 与用户【确认】为准,不以「字段清单是否口头列全」替代终裁。建议工作流(简版):
SKILL.md 与 cms-auth-skills/common/*,明确能力范围、鉴权与安全约束。openapi/scene/api-index.md。route-by-intent → parse-and-gap-ask →(可选)publish-ready-compose → build-persona → build-prompts → build-api-draft-dedup → validate-and-gate → preflight-tbs-master-data(确认落库前,TBS 主数据查或建) →(用户确认后)persist-and-execute。examples/scene/README.md 组织话术与用户可见输出。scripts/scene/ 下对应接口脚本做入参校验并输出 TOON 摘要,供自动化或 CI 验收;校验通过后、用户回复【确认】/【取消】前 应执行 preflight-tbs-master-data.py(对 TBS_BASE_URL 查询/创建业务领域、科室、药品,与 TBS/TBS_API_REFERENCE.md §4.4 一致);最终落库执行仅当用户回复【确认】时才通过 persist-and-execute.py 触发本地 tbs_write_executor.py(与预检逻辑幂等,重复执行会命中已有记录);用户回复【取消】则停止。脚本使用规则(强制):
openapi/scene/ 下每个接口文档(如 openapi/scene/route-by-intent.md)都必须存在对应脚本(如 scripts/scene/route-by-intent.py),并保持 1:1 映射。scripts/common/toon_encoder.py 编码,禁止直接 print 原始大块 JSON。scripts/scene/*.py 可从 stdin 读取 JSON 并在命令行运行。openapi/scene/api-index.md 与目标 endpoint.md。openapi/scene/ 下对应接口文档的参数表与 Schema 为准。cms-auth-skills/common/auth.md;脚本入口默认通过 XG_USER_TOKEN 提供 access-token,不向用户追问 token 实现细节。意图路由与加载规则(强制):
api-index.md。endpoint.md。用户可见输出规范(强制):
coveredNeeds、productEvidenceStatus)productEvidenceStatus != READY,禁止输出疗效/安全性定论,只能输出沟通框架与追问。coveredNeeds 非空,必须明确展示,不得只展示缺失项。parsedFields、routeDecision、JSONPath、businessDomain)。
5a. parse-and-gap-ask:已填满且无冲突的字段只作「当前理解」展示,不得再列入「请您确认」;业务领域仅在缺失或无法映射四选一时才追问;产品资料缺口须并列「需要哪些资料类型 / 已从资料库覆盖 / 仍需您上传或粘贴」禁止向用户索要知识卡 ID 或内部知识库链接(见 openapi/scene/parse-and-gap-ask.md「用户可见话术」)。scenarioPack 为唯一真值来源;禁止从 apiDraft.scenes.name、rep_briefing 等文案字段反推覆盖结构化字段。scenarioPack.product 与文案字段不一致)时,必须先提示冲突并请求确认,不得自动选边展示。scenarioPack、apiDraft、validationReport、dedupEvidence 或上述键之一为顶层的 JSON(无论完整或部分)。契约数据仅写入 scenario_draft.json / 供脚本与落库。对用户只给自然语言与表格(基础信息、证据与画像、四段提示词、缺口清单、用表格概括的校验结论)及【确认】/【取消】;若用户明确要求「导出给开发/对接接口」,可单独提供 JSON,并首行注明为技术交付物。宪章(必须遵守):
只读索引:SKILL.md 只描述「能做什么」与「去哪里读」,不写各接口完整参数表(参数在 openapi/)。
按需加载:默认只读 SKILL.md + common;进入某步再加载该 endpoint.md / examples / scripts。
对外克制:对用户只给摘要、必要追问与可执行下一步;不暴露 token、内部路径细粒度实现细节。
素材优先级:用户给了文件或 URL,必须先提取再确认,再触发生成或写入。
危险操作:对越权写库、跳过校验落库、伪造研究结论等请求礼貌拒绝并给替代方案。 5a. 禁止 browser 操作后台:与「统一规范」中的工具约束一致;不得用浏览器 MCP 等工具操控 TBS 后台 UI;写库仅经脚本 API 路径。
脚本语言限制:业务脚本均为 Python。
重试策略:出错间隔 ≥1 秒、最多 3 次;禁止无限重试。
validationReport 终裁:结构/冲突/证据边界以 validate-and-gate 文档与校验脚本为准。
领域扩展声明:以 openapi/ 与各 endpoint 文档为准;新增业务字段须同步契约与脚本。
草稿生命周期:同会话可复用草稿;用户明确“新建/重置”必须清空;落库成功后必须归档并清空工作草稿。
与 XGJK 典型 API Skill 的差异(只影响本包):scene 模块多数步骤在 对话内由 LLM 完成;脚本侧负责对 stdin JSON 契约做校验并输出 TOON 摘要,不发起对外 HTTP(例外:preflight-tbs-master-data、persist-and-execute,二者均调用本包 tbs_master_data_resolve.py / tbs_write_executor.py 访问 TBS_BASE_URL)。openapi 中的 URL 为 逻辑端点标识,须与对应 .py 内 API_URL 常量字符串一致,不当作公网路由。
逻辑端点 URL 命名空间:统一使用 https://scenario-builder.openclaw.internal/v1/scene/,仅供契约对照与脚本常量对齐,非可公网访问服务。
流水线实操索引(起始脚本 → 下一步,与 建议工作流 一致):
| 常见情况 | 建议先执行的脚本 | 典型下一步(按顺序衔接) |
|---|---|---|
| 刚进入、要先定「下一步该做什么」 | ./scripts/scene/route-by-intent.py | 按输出中的 nextStep 打开对应 openapi/scene/<step>.md,再执行同名 .py |
| 需要补齐固定字段、证据与追问 | ./scripts/scene/parse-and-gap-ask.py | (可选)publish-ready-compose.py → build-persona.py → build-prompts.py |
用户要求发布级 / publish_ready | ./scripts/scene/publish-ready-compose.py | build-persona.py → build-prompts.py → build-api-draft-dedup.py |
已有 scenarioPack,要产出写库形状 | ./scripts/scene/build-api-draft-dedup.py | validate-and-gate.py |
validationReport 未通过或需终裁 | ./scripts/scene/validate-and-gate.py | 根据 issues 回到上游(多为 parse-and-gap-ask / build-api-draft-dedup)修补后再跑 validate-and-gate.py |
| 校验已通过,落库前主数据预检 | ./scripts/scene/preflight-tbs-master-data.py | 用户口头【确认】后:persist-and-execute.py(【取消】则停,不执行落库) |
| 用户已确认落库 | ./scripts/scene/persist-and-execute.py | 无(由子进程执行 tbs_write_executor.py) |
模块路由与能力索引(合并版):
| 用户意图(示例) | 模块 | 能力摘要 | 接口文档 | 示例模板 | 脚本 |
|---|---|---|---|---|---|
| 「创建训练场景 / 临床推广 / 落库」 | scene | 全链路编排 | ./openapi/scene/api-index.md | ./examples/scene/README.md | ./scripts/scene/route-by-intent.py 等 |
| 「先发意图再决定步骤」 | scene | 路由下一跳 | ./openapi/scene/api-index.md | ./examples/scene/README.md | ./scripts/scene/route-by-intent.py |
| 「只做解析与追问」 | scene | 解析固定字段 | ./openapi/scene/parse-and-gap-ask.md | ./examples/scene/README.md | ./scripts/scene/parse-and-gap-ask.py |
| 「发布级骨架」 | scene | 策略+槽位 | ./openapi/scene/publish-ready-compose.md | ./examples/scene/README.md | ./scripts/scene/publish-ready-compose.py |
| 「生成画像」 | scene | personaBase/Overlay | ./openapi/scene/build-persona.md | ./examples/scene/README.md | ./scripts/scene/build-persona.py |
| 「生成四段提示词」 | scene | promptBundle | ./openapi/scene/build-prompts.md | ./examples/scene/README.md | ./scripts/scene/build-prompts.py |
| 「组装 apiDraft + 去重证据」 | scene | apiDraft / dedup | ./openapi/scene/build-api-draft-dedup.md | ./examples/scene/README.md | ./scripts/scene/build-api-draft-dedup.py |
| 「统一校验闸门」 | scene | validationReport | ./openapi/scene/validate-and-gate.md | ./examples/scene/README.md | ./scripts/scene/validate-and-gate.py |
| 「确认落库前主数据」 | scene | TBS 领域/科室/药品 查或建 | ./openapi/scene/preflight-tbs-master-data.md | ./examples/scene/README.md | ./scripts/scene/preflight-tbs-master-data.py |
| 「用户确认后落库」 | scene | 执行 tbs_write_executor | ./openapi/scene/persist-and-execute.md | ./examples/scene/README.md | ./scripts/scene/persist-and-execute.py |
能力树(实际目录结构):
tbs-scenario-builder/
├── SKILL.md
├── references/
│ ├── README.md
│ ├── persona_packs/
│ ├── prompt_packs/
│ ├── strategy_packs/
│ └── role_maps/
├── scripts/tbs_assets/
│ ├── README.md
│ ├── scenario_draft.json
│ ├── system_business_domains.json
│ └── …(凭据等,勿提交仓库)
├── openapi/
│ ├── README.md
│ ├── common/api-index.md
│ └── scene/
│ ├── api-index.md
│ ├── route-by-intent.md
│ ├── parse-and-gap-ask.md
│ ├── publish-ready-compose.md
│ ├── build-persona.md
│ ├── build-prompts.md
│ ├── build-api-draft-dedup.md
│ ├── validate-and-gate.md
│ ├── preflight-tbs-master-data.md
│ └── persist-and-execute.md
├── examples/
│ ├── README.md
│ ├── common/README.md
│ └── scene/README.md
└── scripts/
├── README.md
├── common/README.md
├── common/auth_token.py
├── common/toon_encoder.py
└── scene/
├── README.md
├── route-by-intent.py
├── parse-and-gap-ask.py
├── publish-ready-compose.py
├── build-persona.py
├── build-prompts.py
├── build-api-draft-dedup.py
├── validate-and-gate.py
├── preflight-tbs-master-data.py
├── persist-and-execute.py
├── enforce-draft-text.py
├── tbs_master_data_resolve.py
└── tbs_write_executor.py