文章

工作流schema_json详解

什么是工作流

常见类工作流能力总结

序号

网址或地址

能力描述

截图示例

1

coze

字节的coze智能体搭建平台,

可以开发项目构建工作

流完成各种能力

2

rulego

基于golang实现的组件编排后端框架,

前端是基于滴滴的logicflow实现,

未开源,可捐献获取源码

3

liteflow

基于java实现的组件编排后端框架,

官网未提供前端能力,前端issue见:前端issue

ivy项目基于logicflow开源实现了一版,

但是后面迭代为vue-flow,未完全开源。

4

影刀AI power

商业项目

前端采用react-flow

5

dify

前端采用react-flow

前端开源,nb

完成度很高

6

langflow

前端基于react-flow

前端开源,完成度也很高

7

Juggle

接口编排的低代码工具,通过它可以快速将简单的API编排成一个复杂的接口,部分代码未开源

8

tinyflow-java

前端svelte后端java

comfyui

python+js

9

other

所有大模型产品都在做工作流

schema节点解析

  1. workflow_id

  2. schema

    1. nodes

    2. edges

Coze 抓包 v2

{
    "workflow_id": "7472942173802758181",
    "schema": "{\"nodes\":[{\"id\":\"100001\",\"type\":\"1\",\"meta\":{\"position\":{\"x\":0,\"y\":0}},\"data\":{\"nodeMeta\":{\"description\":\"工作流的起始节点,用于设定启动工作流需要的信息\",\"icon\":\"https://lf3-static.bytednsdoc.com/obj/eden-cn/dvsmryvd_avi_dvsm/ljhwZthlaukjlkulzlp/icon/icon-Start-v2.jpg\",\"subTitle\":\"\",\"title\":\"开始\"},\"outputs\":[{\"type\":\"string\",\"name\":\"BOT_USER_INPUT\",\"required\":false,\"description\":\"用户本轮对话输入内容1\"},{\"type\":\"string\",\"name\":\"name\",\"required\":true},{\"type\":\"list\",\"schema\":{\"type\":\"string\"},\"required\":true}],\"trigger_parameters\":[{\"type\":\"string\",\"name\":\"BOT_USER_INPUT\",\"required\":false,\"description\":\"用户本轮对话输入内容1\"},{\"type\":\"string\",\"name\":\"name\",\"required\":true},{\"type\":\"list\",\"schema\":{\"type\":\"string\"},\"required\":true}]}},{\"id\":\"900001\",\"type\":\"2\",\"meta\":{\"position\":{\"x\":1300,\"y\":0}},\"data\":{\"nodeMeta\":{\"description\":\"工作流的最终节点,用于返回工作流运行后的结果信息\",\"icon\":\"https://lf3-static.bytednsdoc.com/obj/eden-cn/dvsmryvd_avi_dvsm/ljhwZthlaukjlkulzlp/icon/icon-End-v2.jpg\",\"subTitle\":\"\",\"title\":\"结束\"},\"inputs\":{\"terminatePlan\":\"returnVariables\",\"inputParameters\":[{\"name\":\"output\",\"input\":{\"type\":\"object\",\"schema\":[{\"type\":\"string\",\"name\":\"name\"},{\"type\":\"string\",\"name\":\"info\"},{\"type\":\"string\",\"name\":\"record\"},{\"type\":\"string\",\"name\":\"questions\"}],\"value\":{\"type\":\"ref\",\"content\":{\"source\":\"block-output\",\"blockID\":\"111649\",\"name\":\"output\"}}}}]}}},{\"id\":\"145145\",\"type\":\"12\",\"meta\":{\"position\":{\"x\":479.99999999999994,\"y\":-31.174999999999997}},\"data\":{\"nodeMeta\":{\"description\":\"可支持对Database放开读写控制,用户可读写其他用户提交的数据,由开发者控制\",\"icon\":\"https://lf3-static.bytednsdoc.com/obj/eden-cn/dvsmryvd_avi_dvsm/ljhwZthlaukjlkulzlp/icon/icon-Database-v2.jpg\",\"subTitle\":\"SQL自定义\",\"title\":\"数据库\"},\"inputs\":{\"databaseInfoList\":[{\"databaseInfoID\":\"7472937438067998757\"}],\"inputParameters\":[{\"name\":\"name\",\"input\":{\"type\":\"string\",\"value\":{\"type\":\"ref\",\"content\":{\"source\":\"block-output\",\"blockID\":\"100001\",\"name\":\"name\"}}}}],\"sql\":\"SELECT name, info, record, questions FROM interview_records WHERE name = '{{name}}'\"},\"outputs\":[{\"type\":\"list\",\"name\":\"outputList\",\"schema\":{\"type\":\"object\",\"schema\":[]},\"required\":false},{\"type\":\"integer\",\"name\":\"rowNum\",\"required\":false}]}},{\"id\":\"111649\",\"type\":\"5\",\"meta\":{\"position\":{\"x\":890,\"y\":-4.675000000000001}},\"data\":{\"nodeMeta\":{\"description\":\"编写代码,处理输入变量来生成返回值\",\"icon\":\"https://lf3-static.bytednsdoc.com/obj/eden-cn/dvsmryvd_avi_dvsm/ljhwZthlaukjlkulzlp/icon/icon-Code-v2.jpg\",\"mainColor\":\"#00B2B2\",\"subTitle\":\"代码\",\"title\":\"代码\"},\"inputs\":{\"inputParameters\":[{\"name\":\"input\",\"input\":{\"type\":\"list\",\"schema\":{\"type\":\"object\",\"schema\":[]},\"value\":{\"type\":\"ref\",\"content\":{\"source\":\"block-output\",\"blockID\":\"145145\",\"name\":\"outputList\"}}}}],\"code\":\"// 在这里,您可以通过 ‘params’  获取节点中的输入变量,并通过 'ret' 输出结果\\n// 'params' 和 'ret' 已经被正确地注入到环境中\\n// 下面是一个示例,获取节点输入中参数名为‘input’的值:\\n// const input = params.input; \\n// 下面是一个示例,输出一个包含多种数据类型的 'ret' 对象:\\n// const ret = { \\\"name\\\": ‘小明’, \\\"hobbies\\\": [“看书”, “旅游”] };\\n\\nasync function main({ params }: Args): Promise<Output> {\\n    // 构建输出对象\\n    const ret = {\\n        \\\"output\\\": params.input[0] || {}\\n    };\\n\\n    return ret;\\n}\",\"language\":5,\"settingOnError\":{\"switch\":true,\"dataOnErr\":\"{\\n    \\\"output\\\": {\\n        \\\"name\\\": \\\"\\\",\\n        \\\"info\\\": \\\"\\\",\\n        \\\"record\\\": \\\"\\\",\\n        \\\"questions\\\": \\\"\\\"\\n    }\\n}\"}},\"outputs\":[{\"type\":\"object\",\"name\":\"output\",\"schema\":[{\"type\":\"string\",\"name\":\"name\"},{\"type\":\"string\",\"name\":\"info\"},{\"type\":\"string\",\"name\":\"record\"},{\"type\":\"string\",\"name\":\"questions\"}]},{\"type\":\"object\",\"name\":\"errorBody\",\"schema\":[{\"type\":\"string\",\"name\":\"errorMessage\",\"readonly\":true},{\"type\":\"string\",\"name\":\"errorCode\",\"readonly\":true}],\"readonly\":true}]}}],\"edges\":[{\"sourceNodeID\":\"100001\",\"targetNodeID\":\"145145\"},{\"sourceNodeID\":\"111649\",\"targetNodeID\":\"900001\"},{\"sourceNodeID\":\"145145\",\"targetNodeID\":\"111649\"}],\"versions\":{\"loop\":\"v2\"}}",
    "space_id": "7386668591510913065",
    "submit_commit_id": "Bot_7472942173802758181_Submit_7472942173803200549",
    "ignore_status_transfer": true
}