尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Agent Workflow 学习向:Code 节点,比模板更强的变量加工

Agent Workflow 学习向:Code 节点,比模板更强的变量加工 上一篇浏览器联调台编辑图 JSON、一点运行、看 events相关02 最小工作流 API示例仓库flow-forge本篇讲工作流里新增第四种节点Code——在图里写一小段 Python 逻辑加工变量比 Template 的「填空成句」更灵活。先说结论前三篇已经能存图 → 跑图 → 在浏览器里看 events。但Template 节点只能做字符串插值把{name}换成输入值做不了「转大写、算长度、拼列表」这类小逻辑。本篇补的是可编程变换对比Template 节点Code 节点能做什么固定句式 占位符填空短 Python 片段加工变量配置字段data.templatedata.code输出约定写入text必须赋值result ...若是字符串也会写入text方便接 End典型路径start → template → endstart → code → end或与 template 串联一句话Code 节点让工作流里能写「几行小逻辑」而不是只能拼句子本仓是学习向受控执行不是生产级沙箱。HTTP 接口形状不变仍是 create → run → events。变的是图里多了一种data.type: code。1. 为什么需要 Code 节点想象你要把用户输入的名字转成大写或根据两个数字算和。Template 只能写Hello, {name}!没法写name.upper()这种运算。对照 Dify 一类产品Code 节点就是专门干这个的在图上挂一小段代码读当前运行里的变量算完写回交给下游。本仓 changecode-node在现有 Runner 上扩展不新加接口、不改 Web 联调流程——你在联调页把图 JSON 换成含 code 的版本即可。术语是什么本仓怎么用Code 节点执行用户提供的短代码data.type: codedata.code变量表这次运行里「名字 → 值」的对照start 的inputs进来每个节点可读可写resultCode 节点必须赋值的输出名例如result name.upper()受控执行只允许有限能力禁 import / 读文件等学习向文档会写明不是真沙箱2. 功能一图里怎么配 Code 节点在 nodes 里增加一类和 start / template / end 并列{id:code_1,data:{type:code,code:result name.upper()}}含义不必先会 Python 语法片段在干什么type: code告诉 Runner这一步要跑代码code: ...用户写的短脚本name来自运行inputs的变量名本例输入name: forgename.upper()把字符串转成大写.upper()是字符串自带的方法result ...固定约定必须把最终结果赋给resultRunner 才认最小整图start → code → end{nodes:[{id:start_1,data:{type:start}},{id:code_1,data:{type:code,code:result name.upper()}},{id:end_1,data:{type:end}}],edges:[{id:e1,source:start_1,target:code_1},{id:e2,source:code_1,target:end_1}]}创建图时还会校验data.code不能为空源码不超过4KB静态拒绝import、open(、__import__等危险模式非法图在创建阶段就会被拒绝和 Template 缺字段一样。3. 功能二跑起来会发生什么inputs示例{name: forge}。Runner 走到 Code 节点时白话顺序把当前变量表含name交给执行器在受控环境里跑data.code里的脚本检查是否出现了result把result写回变量表若是字符串同时写入textEnd 节点能直接输出照常写node_started/node_succeeded事件成功时outputs大致是{text:FORGE,result:FORGE}失败时语法错、没写result、用了禁止的import等Run 为failed事件里有node_failederror字段可读——和 Template 缺变量失败同一套观测方式。和 Template 怎么选场景更合适的节点固定问候语 填名字Template大小写、简单运算、列表拼接Code两者都要start → template → code → end先拼句再加工4. 功能三安全边界学习向不是真沙箱Code 节点会执行用户写的 Python 片段因此必须有硬边界。本仓当前做法限制目的禁用import/open/exec/eval等模式避免读文件、拉库、嵌套执行只开放少量内置函数如len、str、int允许常见小运算不开放整台 Python源码长度上限 4KB避免超长脚本拖垮请求在受控命名空间里exec学习演示够用不能当生产隔离方案仓库code.py顶部注释和api/README.md都写明这是学习向受控命名空间不是 Docker 级沙箱。你若对照 Dify 生产环境应假设那边还有更强隔离本系列先学会「节点类型怎么扩展、Runner 怎么调度、失败怎么落事件」。5. 你怎么跟跑方式 A浏览器联调页推荐按第三篇起好apiweb打开 http://localhost:3000把左侧图 JSON 换成上面的 start → code → end或从web/lib/sample.ts里的SAMPLE_CODE_GRAPH复制右侧 inputs 填{name: forge}点「运行」看status: succeeded与outputs里的FORGE联调页默认仍预填 Template 示例换 Code 图只需改文本框不必改前端代码。方式 Bcurlapi/README.md有完整的 Code 节点 curl 示例创建含 code 的图 →POST .../runs→ 查 events。自动化cdapi uv run pytest新增用例会覆盖合法 code 图、缺 code 拒绝、禁止 import、运行成功/语法失败等。6. 仓库里改动了哪几块地图不是语法课位置本篇新增职责core/workflow/graph.py允许data.type: code校验data.codecore/workflow/nodes/code.py受控执行 result约定core/workflow/runner.py调度循环里多一个code分支web/lib/sample.ts可选示例图SAMPLE_CODE_GRAPHapi/README.mdCode 示例与安全说明读代码建议顺序先看 README / 联调页跑通本节第 5 节再看graph.py多了一种节点类型意味着什么最后看code.py「受控」具体禁了什么Runner 其它节点start / template / end逻辑与第二篇相同Code 只是在循环里多插一个分支——这是以后加 LLM 节点等同理可扩的模式。本篇顺带认识的 Python仍只钉词词 / 写法先怎么记和 Code 节点的关系result ...给名为 result 的格子赋值输出约定缺了就算失败name.upper()对字符串name调「转大写」示例图里的典型一行exec(...)把字符串当代码跑危险故本仓受限使用实现细节在code.py你知道「会被关进受控环境」即可import引入外部库本仓 Code 节点禁止创建图时就会拦和前作怎么接篇补哪一段02 最小工作流 APITemplate 与 Runner 主路径03 浏览器联调台页面触发 create → run → events本篇第四种节点 Code可编程变换 受控边界下一篇更可能落在 LLM 节点、并行边或其它产品能力本切片停在「一种新节点类型如何接入现有 Runner」。你可以从这里带走什么Template 管填空Code 管小逻辑——节点类型是按能力切的不是越堆越多 UI。Code 节点的契约很简单读变量 → 跑data.code→ 必须写出result。加新节点类型时HTTP 往往不用改改的是图校验 Runner 分支 文档示例。任何「用户可写代码」的能力都要写清安全边界学习向受控 exec ≠ 生产沙箱。联调页仍够用换 JSON 就能试 Code说明前后端契约稳定。仓库与相关文档GitHubhttps://github.com/jimchou-h/flow-forgeCode 节点说明与 curlapi/README.md受控执行core/workflow/nodes/code.py图校验扩展core/workflow/graph.pyRunner 调度core/workflow/runner.pyWeb 示例图web/lib/sample.ts欢迎 Star、Issue 和 PR。_本文基于 Flow Forgecode-node覆盖 Code 节点配置、受控执行与result约定。
返回列表