Commit c8e63f4a8ce7dd29b1ab388fdef10e08d3df81b2

Authored by 芋道源码
Committed by Gitee
2 parents 13823932 587504c3

!1300 feat: AI工作流

Merge pull request !1300 from Lesan/feature/ai-工作流
yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/ErrorCodeConstants.java
@@ -61,4 +61,8 @@ public interface ErrorCodeConstants { @@ -61,4 +61,8 @@ public interface ErrorCodeConstants {
61 ErrorCode TOOL_NOT_EXISTS = new ErrorCode(1_040_010_000, "工具不存在"); 61 ErrorCode TOOL_NOT_EXISTS = new ErrorCode(1_040_010_000, "工具不存在");
62 ErrorCode TOOL_NAME_NOT_EXISTS = new ErrorCode(1_040_010_001, "工具({})找不到 Bean"); 62 ErrorCode TOOL_NAME_NOT_EXISTS = new ErrorCode(1_040_010_001, "工具({})找不到 Bean");
63 63
  64 + // ========== AI 工作流 1-040-011-000 ==========
  65 + ErrorCode WORKFLOW_NOT_EXISTS = new ErrorCode(1_040_011_000, "工作流不存在");
  66 + ErrorCode WORKFLOW_KEY_EXISTS = new ErrorCode(1_040_011_001, "工作流标识已存在");
  67 +
64 } 68 }
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/workflow/AiWorkflowController.java 0 → 100644
  1 +package cn.iocoder.yudao.module.ai.controller.admin.workflow;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  4 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  5 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
  6 +import cn.iocoder.yudao.module.ai.controller.admin.workflow.vo.*;
  7 +import cn.iocoder.yudao.module.ai.dal.dataobject.workflow.AiWorkflowDO;
  8 +import cn.iocoder.yudao.module.ai.service.workflow.AiWorkflowService;
  9 +import io.swagger.v3.oas.annotations.Operation;
  10 +import io.swagger.v3.oas.annotations.Parameter;
  11 +import io.swagger.v3.oas.annotations.tags.Tag;
  12 +import jakarta.annotation.Resource;
  13 +import jakarta.validation.Valid;
  14 +import lombok.extern.slf4j.Slf4j;
  15 +import org.springframework.security.access.prepost.PreAuthorize;
  16 +import org.springframework.web.bind.annotation.*;
  17 +
  18 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  19 +
  20 +@Tag(name = "管理后台 - AI 工作流")
  21 +@RestController
  22 +@RequestMapping("/ai/workflow")
  23 +@Slf4j
  24 +public class AiWorkflowController {
  25 +
  26 + @Resource
  27 + private AiWorkflowService workflowService;
  28 +
  29 + @PostMapping("/create")
  30 + @Operation(summary = "创建 AI 工作流")
  31 + @PreAuthorize("@ss.hasPermission('ai:workflow:create')")
  32 + public CommonResult<Long> createWorkflow(@Valid @RequestBody AiWorkflowSaveReqVO createReqVO) {
  33 + return success(workflowService.createWorkflow(createReqVO));
  34 + }
  35 +
  36 + @PutMapping("/update")
  37 + @Operation(summary = "更新 AI 工作流")
  38 + @PreAuthorize("@ss.hasPermission('ai:workflow:update')")
  39 + public CommonResult<Boolean> updateWorkflow(@Valid @RequestBody AiWorkflowSaveReqVO updateReqVO) {
  40 + workflowService.updateWorkflow(updateReqVO);
  41 + return success(true);
  42 + }
  43 +
  44 + @DeleteMapping("/delete")
  45 + @Operation(summary = "删除 AI 工作流")
  46 + @Parameter(name = "id", description = "编号", required = true)
  47 + @PreAuthorize("@ss.hasPermission('ai:workflow:delete')")
  48 + public CommonResult<Boolean> deleteWorkflow(@RequestParam("id") Long id) {
  49 + workflowService.deleteWorkflow(id);
  50 + return success(true);
  51 + }
  52 +
  53 + @GetMapping("/get")
  54 + @Operation(summary = "获得 AI 工作流")
  55 + @Parameter(name = "id", description = "编号", required = true, example = "1024")
  56 + @PreAuthorize("@ss.hasPermission('ai:workflow:query')")
  57 + public CommonResult<AiWorkflowRespVO> getWorkflow(@RequestParam("id") Long id) {
  58 + AiWorkflowDO workflow = workflowService.getWorkflow(id);
  59 + return success(BeanUtils.toBean(workflow, AiWorkflowRespVO.class));
  60 + }
  61 +
  62 + @GetMapping("/page")
  63 + @Operation(summary = "获得 AI 工作流分页")
  64 + @PreAuthorize("@ss.hasPermission('ai:workflow:query')")
  65 + public CommonResult<PageResult<AiWorkflowRespVO>> getWorkflowPage(@Valid AiWorkflowPageReqVO pageReqVO) {
  66 + PageResult<AiWorkflowDO> pageResult = workflowService.getWorkflowPage(pageReqVO);
  67 + return success(BeanUtils.toBean(pageResult, AiWorkflowRespVO.class));
  68 + }
  69 +
  70 + @PutMapping("/updateWorkflowModel")
  71 + @Operation(summary = "更新 AI 工作流模型")
  72 + @PreAuthorize("@ss.hasPermission('ai:workflow:update')")
  73 + public CommonResult<Boolean> updateWorkflowModel(@Valid @RequestBody AiWorkflowUpdateModelReqVO updateReqVO) {
  74 + workflowService.updateWorkflowModel(updateReqVO);
  75 + return success(true);
  76 + }
  77 +
  78 + @PostMapping("/test")
  79 + @Operation(summary = "测试 AI 工作流")
  80 + @PreAuthorize("@ss.hasPermission('ai:workflow:test')")
  81 + public CommonResult<Object> testWorkflow(@Valid @RequestBody AiWorkflowTestReqVO testReqVO) {
  82 + return success(workflowService.testWorkflow(testReqVO));
  83 + }
  84 +
  85 +}
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/workflow/vo/AiWorkflowPageReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.ai.controller.admin.workflow.vo;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
  4 +import io.swagger.v3.oas.annotations.media.Schema;
  5 +import lombok.Data;
  6 +import org.springframework.format.annotation.DateTimeFormat;
  7 +
  8 +import java.time.LocalDateTime;
  9 +
  10 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
  11 +
  12 +@Schema(description = "管理后台 - AI 工作流分页 Request VO")
  13 +@Data
  14 +public class AiWorkflowPageReqVO extends PageParam {
  15 +
  16 + @Schema(description = "名称", example = "工作流")
  17 + private String name;
  18 +
  19 + @Schema(description = "标识", example = "FLOW")
  20 + private String definitionKey;
  21 +
  22 + @Schema(description = "创建时间")
  23 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  24 + private LocalDateTime[] createTime;
  25 +
  26 +}
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/workflow/vo/AiWorkflowRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.ai.controller.admin.workflow.vo;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +
  6 +import java.time.LocalDateTime;
  7 +
  8 +@Schema(description = "管理后台 - AI 工作流 Response VO")
  9 +@Data
  10 +public class AiWorkflowRespVO {
  11 +
  12 + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  13 + private Long id;
  14 +
  15 + @Schema(description = "工作流标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "FLOW")
  16 + private String definitionKey;
  17 +
  18 + @Schema(description = "工作流名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "工作流")
  19 + private String name;
  20 +
  21 + @Schema(description = "工作流模型 JSON", requiredMode = Schema.RequiredMode.REQUIRED, example = "{}")
  22 + private String model;
  23 +
  24 + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "时间戳格式")
  25 + private LocalDateTime createTime;
  26 +
  27 +}
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/workflow/vo/AiWorkflowSaveReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.ai.controller.admin.workflow.vo;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import jakarta.validation.constraints.NotEmpty;
  5 +import lombok.Data;
  6 +
  7 +@Schema(description = "管理后台 - AI 工作流新增/修改 Request VO")
  8 +@Data
  9 +public class AiWorkflowSaveReqVO {
  10 +
  11 + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  12 + private Long id;
  13 +
  14 + @Schema(description = "工作流标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "FLOW")
  15 + @NotEmpty(message = "工作流标识不能为空")
  16 + private String definitionKey;
  17 +
  18 + @Schema(description = "工作流名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "工作流")
  19 + @NotEmpty(message = "工作流名称不能为空")
  20 + private String name;
  21 +
  22 +}
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/workflow/vo/AiWorkflowTestReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.ai.controller.admin.workflow.vo;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import jakarta.validation.constraints.NotEmpty;
  5 +import lombok.Data;
  6 +
  7 +import java.util.Map;
  8 +
  9 +@Schema(description = "管理后台 - AI 工作流测试 Request VO")
  10 +@Data
  11 +public class AiWorkflowTestReqVO {
  12 +
  13 + @Schema(description = "工作流模型", requiredMode = Schema.RequiredMode.REQUIRED, example = "{}")
  14 + @NotEmpty(message = "工作流模型不能为空")
  15 + private String model;
  16 +
  17 + @Schema(description = "参数", requiredMode = Schema.RequiredMode.REQUIRED, example = "{}")
  18 + private Map<String, Object> params;
  19 +
  20 +}
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/workflow/vo/AiWorkflowUpdateModelReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.ai.controller.admin.workflow.vo;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import jakarta.validation.constraints.NotEmpty;
  5 +import lombok.Data;
  6 +
  7 +@Schema(description = "管理后台 - AI 工作流修改流程模型 Request VO")
  8 +@Data
  9 +public class AiWorkflowUpdateModelReqVO {
  10 +
  11 + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  12 + private Long id;
  13 +
  14 + @Schema(description = "工作流模型", requiredMode = Schema.RequiredMode.REQUIRED, example = "{}")
  15 + @NotEmpty(message = "工作流模型不能为空")
  16 + private String model;
  17 +
  18 +}
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/workflow/AiWorkflowDO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.ai.dal.dataobject.workflow;
  2 +
  3 +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
  4 +import com.baomidou.mybatisplus.annotation.KeySequence;
  5 +import com.baomidou.mybatisplus.annotation.TableId;
  6 +import com.baomidou.mybatisplus.annotation.TableName;
  7 +import lombok.Data;
  8 +
  9 +/**
  10 + * AI 工作流 DO
  11 + *
  12 + * @author lesan
  13 + */
  14 +@TableName(value = "ai_workflow", autoResultMap = true)
  15 +@KeySequence("ai_workflow") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
  16 +@Data
  17 +public class AiWorkflowDO extends BaseDO {
  18 +
  19 + /**
  20 + * 编号
  21 + */
  22 + @TableId
  23 + private Long id;
  24 +
  25 + /**
  26 + * 工作流标识
  27 + */
  28 + private String definitionKey;
  29 +
  30 + /**
  31 + * 工作流名称
  32 + */
  33 + private String name;
  34 +
  35 + /**
  36 + * 工作流模型 JSON 数据
  37 + */
  38 + private String model;
  39 +
  40 +}
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/mysql/workflow/AiWorkflowMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.module.ai.dal.mysql.workflow;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  5 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
  6 +import cn.iocoder.yudao.module.ai.controller.admin.workflow.vo.AiWorkflowPageReqVO;
  7 +import cn.iocoder.yudao.module.ai.dal.dataobject.workflow.AiWorkflowDO;
  8 +import org.apache.ibatis.annotations.Mapper;
  9 +
  10 +/**
  11 + * AI 工作流 Mapper
  12 + *
  13 + * @author lesan
  14 + */
  15 +@Mapper
  16 +public interface AiWorkflowMapper extends BaseMapperX<AiWorkflowDO> {
  17 +
  18 + default AiWorkflowDO selectByKey(String key) {
  19 + return selectOne(AiWorkflowDO::getDefinitionKey, key);
  20 + }
  21 +
  22 + default PageResult<AiWorkflowDO> selectPage(AiWorkflowPageReqVO pageReqVO) {
  23 + return selectPage(pageReqVO, new LambdaQueryWrapperX<AiWorkflowDO>()
  24 + .likeIfPresent(AiWorkflowDO::getName, pageReqVO.getName())
  25 + .likeIfPresent(AiWorkflowDO::getDefinitionKey, pageReqVO.getDefinitionKey()));
  26 + }
  27 +
  28 +}
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/workflow/AiWorkflowService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.ai.service.workflow;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.ai.controller.admin.workflow.vo.AiWorkflowPageReqVO;
  5 +import cn.iocoder.yudao.module.ai.controller.admin.workflow.vo.AiWorkflowSaveReqVO;
  6 +import cn.iocoder.yudao.module.ai.controller.admin.workflow.vo.AiWorkflowTestReqVO;
  7 +import cn.iocoder.yudao.module.ai.controller.admin.workflow.vo.AiWorkflowUpdateModelReqVO;
  8 +import cn.iocoder.yudao.module.ai.dal.dataobject.workflow.AiWorkflowDO;
  9 +import jakarta.validation.Valid;
  10 +
  11 +/**
  12 + * AI 工作流 Service 接口
  13 + *
  14 + * @author lesan
  15 + */
  16 +public interface AiWorkflowService {
  17 +
  18 + /**
  19 + * 创建 AI 工作流
  20 + *
  21 + * @param createReqVO 创建信息
  22 + * @return 编号
  23 + */
  24 + Long createWorkflow(@Valid AiWorkflowSaveReqVO createReqVO);
  25 +
  26 + /**
  27 + * 更新 AI 工作流
  28 + *
  29 + * @param updateReqVO 更新信息
  30 + */
  31 + void updateWorkflow(@Valid AiWorkflowSaveReqVO updateReqVO);
  32 +
  33 + /**
  34 + * 删除 AI 工作流
  35 + *
  36 + * @param id 编号
  37 + */
  38 + void deleteWorkflow(Long id);
  39 +
  40 + /**
  41 + * 获得 AI 工作流
  42 + *
  43 + * @param id 编号
  44 + * @return AI 工作流
  45 + */
  46 + AiWorkflowDO getWorkflow(Long id);
  47 +
  48 + /**
  49 + * 获得 AI 工作流分页
  50 + *
  51 + * @param pageReqVO 分页查询
  52 + * @return AI 工作流分页
  53 + */
  54 + PageResult<AiWorkflowDO> getWorkflowPage(AiWorkflowPageReqVO pageReqVO);
  55 +
  56 + /**
  57 + * 修改工作流模型 JSON 数据
  58 + *
  59 + * @param updateReqVO 更新数据
  60 + */
  61 + void updateWorkflowModel(AiWorkflowUpdateModelReqVO updateReqVO);
  62 +
  63 + /**
  64 + * 测试 AI 工作流
  65 + *
  66 + * @param testReqVO 测试数据
  67 + */
  68 + Object testWorkflow(AiWorkflowTestReqVO testReqVO);
  69 +}
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/workflow/AiWorkflowServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.ai.service.workflow;
  2 +
  3 +import cn.hutool.core.util.ObjUtil;
  4 +import cn.hutool.core.util.StrUtil;
  5 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  6 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
  7 +import cn.iocoder.yudao.module.ai.controller.admin.workflow.vo.AiWorkflowPageReqVO;
  8 +import cn.iocoder.yudao.module.ai.controller.admin.workflow.vo.AiWorkflowSaveReqVO;
  9 +import cn.iocoder.yudao.module.ai.controller.admin.workflow.vo.AiWorkflowTestReqVO;
  10 +import cn.iocoder.yudao.module.ai.controller.admin.workflow.vo.AiWorkflowUpdateModelReqVO;
  11 +import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiApiKeyDO;
  12 +import cn.iocoder.yudao.module.ai.dal.dataobject.workflow.AiWorkflowDO;
  13 +import cn.iocoder.yudao.module.ai.dal.mysql.workflow.AiWorkflowMapper;
  14 +import cn.iocoder.yudao.module.ai.service.model.AiApiKeyService;
  15 +import com.alibaba.fastjson.JSONArray;
  16 +import com.alibaba.fastjson.JSONObject;
  17 +import dev.tinyflow.core.Tinyflow;
  18 +import jakarta.annotation.Resource;
  19 +import lombok.extern.slf4j.Slf4j;
  20 +import org.springframework.stereotype.Service;
  21 +
  22 +import java.util.Map;
  23 +
  24 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  25 +import static cn.iocoder.yudao.module.ai.enums.ErrorCodeConstants.WORKFLOW_KEY_EXISTS;
  26 +import static cn.iocoder.yudao.module.ai.enums.ErrorCodeConstants.WORKFLOW_NOT_EXISTS;
  27 +
  28 +/**
  29 + * AI 工作流 Service 实现类
  30 + *
  31 + * @author lesan
  32 + */
  33 +@Service
  34 +@Slf4j
  35 +public class AiWorkflowServiceImpl implements AiWorkflowService {
  36 +
  37 + @Resource
  38 + private AiWorkflowMapper workflowMapper;
  39 +
  40 + @Resource
  41 + private AiApiKeyService apiKeyService;
  42 +
  43 + @Override
  44 + public Long createWorkflow(AiWorkflowSaveReqVO createReqVO) {
  45 + validateWorkflowForCreateOrUpdate(null, createReqVO.getDefinitionKey());
  46 + AiWorkflowDO workflow = BeanUtils.toBean(createReqVO, AiWorkflowDO.class);
  47 + workflow.setModel(StrUtil.EMPTY);
  48 + workflowMapper.insert(workflow);
  49 + return workflow.getId();
  50 + }
  51 +
  52 + @Override
  53 + public void updateWorkflow(AiWorkflowSaveReqVO updateReqVO) {
  54 + validateWorkflowForCreateOrUpdate(updateReqVO.getId(), updateReqVO.getDefinitionKey());
  55 + AiWorkflowDO workflow = BeanUtils.toBean(updateReqVO, AiWorkflowDO.class);
  56 + workflowMapper.updateById(workflow);
  57 + }
  58 +
  59 + @Override
  60 + public void deleteWorkflow(Long id) {
  61 + validateWorkflowExists(id);
  62 + workflowMapper.deleteById(id);
  63 + }
  64 +
  65 + @Override
  66 + public AiWorkflowDO getWorkflow(Long id) {
  67 + return workflowMapper.selectById(id);
  68 + }
  69 +
  70 + @Override
  71 + public PageResult<AiWorkflowDO> getWorkflowPage(AiWorkflowPageReqVO pageReqVO) {
  72 + return workflowMapper.selectPage(pageReqVO);
  73 + }
  74 +
  75 + @Override
  76 + public void updateWorkflowModel(AiWorkflowUpdateModelReqVO updateReqVO) {
  77 + validateWorkflowExists(updateReqVO.getId());
  78 + workflowMapper.updateById(new AiWorkflowDO().setId(updateReqVO.getId()).setModel(updateReqVO.getModel()));
  79 + }
  80 +
  81 + @Override
  82 + public Object testWorkflow(AiWorkflowTestReqVO testReqVO) {
  83 + Map<String, Object> variables = testReqVO.getParams();
  84 + Tinyflow tinyflow = parseFlowParam(testReqVO.getModel());
  85 + return tinyflow.toChain().executeForResult(variables);
  86 + }
  87 +
  88 + private void validateWorkflowForCreateOrUpdate(Long id, String key) {
  89 + validateWorkflowExists(id);
  90 + validateKeyUnique(id, key);
  91 + }
  92 +
  93 + private void validateWorkflowExists(Long id) {
  94 + if (ObjUtil.isNull(id)) {
  95 + return;
  96 + }
  97 + AiWorkflowDO workflow = workflowMapper.selectById(id);
  98 + if (ObjUtil.isNull(workflow)) {
  99 + throw exception(WORKFLOW_NOT_EXISTS);
  100 + }
  101 + }
  102 +
  103 + private void validateKeyUnique(Long id, String key) {
  104 + if (StrUtil.isBlank(key)) {
  105 + return;
  106 + }
  107 + AiWorkflowDO workflow = workflowMapper.selectByKey(key);
  108 + if (ObjUtil.isNull(workflow)) {
  109 + return;
  110 + }
  111 + if (ObjUtil.isNull(id)) {
  112 + throw exception(WORKFLOW_KEY_EXISTS);
  113 + }
  114 + if (ObjUtil.notEqual(workflow.getId(), id)) {
  115 + throw exception(WORKFLOW_KEY_EXISTS);
  116 + }
  117 + }
  118 +
  119 + private Tinyflow parseFlowParam(String model) {
  120 + JSONObject json = JSONObject.parseObject(model);
  121 + JSONArray nodeArr = json.getJSONArray("nodes");
  122 + Tinyflow tinyflow = new Tinyflow(json.toJSONString());
  123 + for (int i = 0; i < nodeArr.size(); i++) {
  124 + JSONObject node = nodeArr.getJSONObject(i);
  125 + switch (node.getString("type")) {
  126 + case "llmNode":
  127 + JSONObject data = node.getJSONObject("data");
  128 + AiApiKeyDO apiKey = apiKeyService.getApiKey(data.getLong("llmId"));
  129 + switch (apiKey.getPlatform()) {
  130 + // TODO @lesan 需要讨论一下这里怎么弄
  131 + case "OpenAI":
  132 + break;
  133 + case "Ollama":
  134 + break;
  135 + case "YiYan":
  136 + break;
  137 + case "XingHuo":
  138 + break;
  139 + case "TongYi":
  140 + break;
  141 + case "DeepSeek":
  142 + break;
  143 + case "ZhiPu":
  144 + break;
  145 + }
  146 + break;
  147 + case "internalNode":
  148 + break;
  149 + default:
  150 + break;
  151 + }
  152 + }
  153 + return tinyflow;
  154 + }
  155 +
  156 +
  157 +}
yudao-module-ai/yudao-spring-boot-starter-ai/pom.xml
@@ -15,6 +15,7 @@ @@ -15,6 +15,7 @@
15 <description>AI 大模型拓展,接入国内外大模型</description> 15 <description>AI 大模型拓展,接入国内外大模型</description>
16 <properties> 16 <properties>
17 <spring-ai.version>1.0.0-M6</spring-ai.version> 17 <spring-ai.version>1.0.0-M6</spring-ai.version>
  18 + <tinyflow.version>1.0.0-rc.3</tinyflow.version>
18 </properties> 19 </properties>
19 20
20 <dependencies> 21 <dependencies>
@@ -117,6 +118,13 @@ @@ -117,6 +118,13 @@
117 </exclusions> 118 </exclusions>
118 </dependency> 119 </dependency>
119 120
  121 + <dependency>
  122 + <!-- Tinyflow:工作流 -->
  123 + <groupId>dev.tinyflow</groupId>
  124 + <artifactId>tinyflow-java-core</artifactId>
  125 + <version>${tinyflow.version}</version>
  126 + </dependency>
  127 +
120 <!-- Test 测试相关 --> 128 <!-- Test 测试相关 -->
121 <dependency> 129 <dependency>
122 <groupId>org.springframework.boot</groupId> 130 <groupId>org.springframework.boot</groupId>