Tinyflow AI流程编排实战教程
基于若依plus、JDK17与SpringBoot3.4.1,采用Tinyflow实现AI流程编排。Tinyflow支持Java和前端,可自定义节点并执行智能体编排。实战涵盖引入依赖、设计表结构、生成代码、定义执行、保存与发布接口及测试验证,最终成功跑通完整工作流。
这次从入门到实战,技术栈选的是若依plus加上JDK17和SpringBoot 3.4.1,这几个版本搭配起来,运行效率确实不错。
聊聊这次的主角:Tinyflow。市面上这类工作流组件不少,但Tinyflow的优势在于它同时支持Java和前端,后端引入依赖即可,前端Vue或React都能用。整个设计思路其实跟Dify、Coze的工作流很像,核心是支持智能体编排,还能自定义节点——这一点在实际开发中非常关键,因为实际情况往往不是标准化的流程能搞定的。
顺便提一嘴,Spring AI Alibaba也在做类似的功能,基于Spring AI Alibaba Graph实现,但坦白讲,目前还处在完善阶段,生产环境暂时不必作为首选。
好,话不多说,直接上手实战。
demo版
项目启动成功后,浏览器访问“http://localhost:port”就能看到界面。直接在页面上新增节点,然后点击运行测试。测试通过后,再点击保存。看一眼数据库,就能看到数据被成功插入——整个流程跑通了。
来,我们看看运行过程中生成的JSON结构是什么样的:
{"nodes":[{"id":"node_CVKeWeJL8jn5cGr4","position":{"x":-83,"y":67},"data":{"title":"开始节点","description":"开始定义输入参数","expand":true,"parameters":[{"name":"username","dataType":"String","refType":"input","id":"YtkNFKFFC5hh4zAh","required":true},{"name":"password","dataType":"String","refType":"input","id":"YW0JonLnPtsDVRlp","required":true}]},"type":"startNode","selected":false,"measured":{"width":305,"height":238},"dragging":false},{"id":"node_Lmg446ujJkBFTq7s","position":{"x":333,"y":68},"data":{"title":"结束节点","description":"结束定义输出参数","expand":true,"outputDefs":[{"name":"用户名","dataType":"String","refType":"ref","id":"0FqjBTXWXwmNHvOm","ref":"node_CVKeWeJL8jn5cGr4.username"},{"name":"密码","dataType":"String","refType":"ref","id":"jdXNtiAiLAqP1uto","ref":"node_CVKeWeJL8jn5cGr4.password"}]},"type":"endNode","selected":true,"measured":{"width":368,"height":238},"dragging":false}],"edges":[{"markerEnd":{"type":"arrowclosed","width":20,"height":20},"source":"node_CVKeWeJL8jn5cGr4","target":"node_Lmg446ujJkBFTq7s","id":"p1QfMcJuAkHG9XN7","selected":false}],"viewport":{"x":269.9146606773976,"y":109.93970251055521,"zoom":0.8705505632961242}}
这个结构非常清晰完整,开始节点定义了输入参数(username和password),结束节点引用了这些参数作为输出,中间通过一条边连接——基本的工作流骨架一目了然。
实战中,一共分为七个步骤。别看步骤多,其实每一块都不复杂,我们一个个来过。
第一步:引入依赖
在pom.xml中先定义版本号:
<tinyflow.version>1.0.8tinyflow.version>
然后引入核心依赖:
<dependency><groupId>dev.tinyflowgroupId><artifactId>tinyflow-ja va-coreartifactId><version>${tinyflow.version}version>dependency>
第二步:表设计
我们需要一张表来存储流程数据,这里定义了一个ai_workflow表,包含流程id、名称、节点数据、状态、描述等基础字段,同时也预留了租户、部门、创建者等通用字段,方便业务扩展:
CREATETABLE`ai_workflow` ( `flow_id`bigintNOTNULLCOMMENT'流程id', `flow_name`varchar(50)DEFAULTNULLCOMMENT'流程名称', `graph` jsonDEFAULTNULLCOMMENT'节点数据', `status`intDEFAULT'0'COMMENT'状态 0->草稿 1->发布', `description`varchar(255)DEFAULTNULLCOMMENT'描述内容', `tenant_id`varchar(20)DEFAULTNULLCOMMENT'租户id', `create_dept`bigintDEFAULTNULLCOMMENT'创建部门', `create_by`bigintDEFAULTNULLCOMMENT'创建者', `create_time` datetimeDEFAULTNULLCOMMENT'创建时间', `update_by`bigintDEFAULTNULLCOMMENT'更新者', `update_time` datetimeDEFAULTNULLCOMMENT'更新时间', `del_flag`char(1)DEFAULT'0'COMMENT'删除标志(0代表存在 2代表删除)',PRIMARYKEY (`flow_id`)) COMMENT='AI流程编排';
第三步:代码生成
这一块是最省事的。直接用生成器把对应的Controller、Service、Mapper一键生成,然后拷贝到项目对应的目录下就行。不需要手写任何基础的CRUD。
第四步:执行流程接口
控制器层定义了一个/excute接口,接收AiWorkflowExcuteBo参数,调用Service执行流程。实现层目前先留一个壳子,具体的执行逻辑可以根据业务需求填充。
@PostMapping("/excute")publicR
第五步:保存结果接口
执行完成后,需要把结果存起来。这个接口跟前面的执行接口设计思路一致,只是功能侧重点不同。
/*** 保存结果**@parambo*@return*/ @PostMapping("/saveResult") publicR
第六步:发布流程接口
流程从草稿状态变成已发布状态,需要一个接口来触发。这里用PUT方法,传递流程ID即可。
/** * 发布流程 * *@paramflowId 流程id *@return */@PutMapping("/release/{flowId}")publicR
第七步:功能测试
到这一步,基本的接口就齐了。测试时,依次验证以下几个接口:查询接口、流程详情接口、新增接口、修改接口、删除接口、执行流程接口、保存结果接口、发布流程接口。最后去表里看看数据是否写入成功,各字段是否正常。
至此,Tinyflow结合若依plus的AI流程编排已经完整跑通。从手动引入依赖、设计库表、生成代码,到定义核心的执行、保存、发布接口,再到测试验证——整个链条走下来,对工作流在业务中的落地方式应该就有比较直观的感受了。接下来的事情,就是根据实际业务场景,把自定义节点加进去,让这个框架真正为业务服务。
