Install
openclaw skills install @somkh/dify-dsl-to-code将 Dify 导出的工作流/Chatflow DSL 文件(YAML)转化为可部署、可运行的独立代码项目(默认 Python+FastAPI,可选 Node.js+Express)。当用户要求"Dify 工作流转代码"、"DSL 导出转项目"、"把 Dify 应用代码化"、"脱离 Dify 部署工作流"时使用。
openclaw skills install @somkh/dify-dsl-to-code把 Dify「导出 DSL」得到的 YAML 转化为脱离 Dify 运行的独立代码项目。核心原则:DSL 里没有的信息绝不编造,一律问用户;问不到的降级并显式声明。
0 定位文件 → 1 解析分析 → 2 补全缺失信息 → 3 定技术栈/脚手架
→ 4 生成代码(小:单智能体 / 大:多智能体分块)→ 5 拼接验证 → 6 交付说明
第一动作永远是问用户:
请提供 Dify 导出的 DSL 文件(.yml/.yaml)在当前机器上的完整路径。 未导出的话:Dify 控制台 → 应用 → 编排页右上角「导出 DSL」。
拿到路径后依次验证,任一失败立即反馈并请用户重新提供,不要猜路径:
workflow.graph.nodes(否则不是 workflow/chatflow 导出)。运行分析脚本(确定性解析,不要凭肉眼读大 YAML):
python scripts/analyze_dsl.py <dsl文件> --out analysis.json --blocks-dir blocks/
# 需要 pyyaml;输出: 应用元数据 / 节点清单 / 边图 / 外部依赖清单 / 功能块划分
阅读 analysis.json,重点关注:
app.mode:workflow 用 end 节点收尾;advanced-chat(chatflow)用 answer 节点,默认 SSE 流式。external_requirements:模型 provider、工具、知识库 dataset、http 端点、env/secret 变量、conversation 变量、agent 策略——这就是缺失信息清单。flags:强制用户决策的信号——javascript_code_nodes(JS 代码需 Node 运行时或授权改写)、file_input_variables/file_upload_enabled(文件输入如何处理)、uses_conversation_variables(会话状态是否保留)、has_iteration/has_loop。stats:节点数与文件大小,决定阶段 4 走单智能体还是多智能体。节点类型 → 代码的映射策略见 references/dsl-node-types.md;各组件的完整属性字典(实现具体节点时查阅)见 references/dsl-components.md。assets/examples/ 下有两个真实导出样例(workflow 与 chatflow 各一),对节点结构拿不准时直接对照。
严格按 references/interaction-playbook.md 执行。要点:
.env.example 占位,永不硬编码;用户说"占位即可"就尊重。与用户确认语言、服务形态、是否带 Dockerfile(话术见 playbook 阶段 2)。默认推荐 Python + FastAPI + Dockerfile。
选定后复制模板为项目起点:
cp -r assets/templates/python-fastapi/ <输出目录>/<项目名>/ # Python 栈
cp -r assets/templates/node-express/ <输出目录>/<项目名>/ # Node.js 栈
# 模板自带执行引擎(context/runner)——直接复用,禁止改写
# 引擎内置:拓扑执行、if-else(含新版 cases[])、question-classifier 路由、
# iteration/loop 子图执行、answer 流式(/run 一次性 + /run/stream SSE)
项目骨架、引擎约定与质量红线见 references/codegen-patterns.md。
definition.py:按 analysis.json 直译全部节点与边(数据,不含逻辑)。app/workflow/blocks/:按功能块组织 handler,每块一个文件。app/services/:LLM、检索、HTTP 等可复用客户端。.env.example:覆盖 analysis.json 中全部环境变量与 secret 引用。definition.py 全图骨架 + 每块接口签名(输入/输出变量清单),作为所有子智能体的对齐基准。blocks/block_XX_*.yaml 子图 + 接口签名 + dsl-components.md(组件属性查阅),只实现 blocks/block_XX_*.py 一个文件;禁止触碰 definition.py、引擎文件和其他块。incoming_edges/outgoing_edges 就是干这个的)。先跑自动验收脚本(六项检查:结构/节点覆盖率/变量引用/.env 覆盖/编译/handler 注册):
python scripts/verify_project.py --analysis analysis.json --project <项目目录>
# 全部 PASS 后再人工过 codegen-patterns.md 的验证清单
再跑冒烟测试(mock LLM 与 HTTP,主链路能从头走到 end/answer)。其余人工核对项(节点恰好一次、变量名对齐、code 原样搬运)见 references/codegen-patterns.md。
交付时给出:项目路径、启动命令(uvicorn app.main:app 或 docker build)、降级项清单(哪些凭据是占位、哪个知识库用了什么方案、哪些工具是 NotImplementedError 待补)。降级可以,静默不行。