diff --git a/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/controller/task/TaskController.java b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/controller/task/TaskController.java new file mode 100644 index 0000000..8d42e94 --- /dev/null +++ b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/controller/task/TaskController.java @@ -0,0 +1,93 @@ +package com.lanyuanxiaoyao.service.ai.web.controller.task; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.lanyuanxiaoyao.service.ai.web.base.controller.SimpleControllerSupport; +import com.lanyuanxiaoyao.service.ai.web.base.entity.SimpleItem; +import com.lanyuanxiaoyao.service.ai.web.entity.FlowTask; +import com.lanyuanxiaoyao.service.ai.web.entity.FlowTaskTemplate; +import com.lanyuanxiaoyao.service.ai.web.service.task.FlowTaskService; +import com.lanyuanxiaoyao.service.ai.web.service.task.FlowTaskTemplateService; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.extern.slf4j.Slf4j; +import org.mapstruct.Context; +import org.mapstruct.Mapping; +import org.mapstruct.factory.Mappers; +import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@Slf4j +@RestController +@RequestMapping("flow_task") +public class TaskController extends SimpleControllerSupport { + private final FlowTaskTemplateService flowTaskTemplateService; + private final ObjectMapper mapper; + + public TaskController(FlowTaskService flowTaskService, FlowTaskTemplateService flowTaskTemplateService, Jackson2ObjectMapperBuilder builder) { + super(flowTaskService); + this.flowTaskTemplateService = flowTaskTemplateService; + this.mapper = builder.build(); + } + + @Override + protected SaveItemMapper saveItemMapper() { + return item -> { + FlowTask task = new FlowTask(); + FlowTaskTemplate template = flowTaskTemplateService.detailOrThrow(item.getTemplateId()); + task.setTemplate(template); + task.setInput(mapper.writeValueAsString(item.getInput())); + return task; + }; + } + + @Override + protected ListItemMapper listItemMapper() { + ListItem.Mapper map = Mappers.getMapper(ListItem.Mapper.class); + return task -> map.from(task, mapper); + } + + @Override + protected DetailItemMapper detailItemMapper() { + DetailItem.Mapper map = Mappers.getMapper(DetailItem.Mapper.class); + return task -> map.from(task, mapper); + } + + @Data + public static final class SaveItem { + private Long templateId; + private Object input; + } + + @Data + @EqualsAndHashCode(callSuper = true) + public static class ListItem extends SimpleItem { + private Long templateId; + private Object input; + private FlowTask.Status status; + + @org.mapstruct.Mapper + public static abstract class Mapper { + @Mapping(target = "templateId", source = "task.template.id") + public abstract ListItem from(FlowTask task, @Context ObjectMapper mapper) throws JsonProcessingException; + + protected Object mapInput(String input, @Context ObjectMapper mapper) throws JsonProcessingException { + return mapper.readValue(input, Object.class); + } + } + } + + @Data + @EqualsAndHashCode(callSuper = true) + public static class DetailItem extends ListItem { + private String error; + private String result; + + @org.mapstruct.Mapper + public static abstract class Mapper extends ListItem.Mapper { + @Mapping(target = "templateId", source = "task.template.id") + public abstract DetailItem from(FlowTask task, @Context ObjectMapper mapper) throws JsonProcessingException; + } + } +} diff --git a/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/controller/task/TaskTemplateController.java b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/controller/task/TaskTemplateController.java new file mode 100644 index 0000000..236f80d --- /dev/null +++ b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/controller/task/TaskTemplateController.java @@ -0,0 +1,72 @@ +package com.lanyuanxiaoyao.service.ai.web.controller.task; + +import com.lanyuanxiaoyao.service.ai.web.base.controller.SimpleControllerSupport; +import com.lanyuanxiaoyao.service.ai.web.base.entity.SimpleItem; +import com.lanyuanxiaoyao.service.ai.web.entity.FlowTaskTemplate; +import com.lanyuanxiaoyao.service.ai.web.service.task.FlowTaskTemplateService; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.extern.slf4j.Slf4j; +import org.mapstruct.factory.Mappers; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@Slf4j +@RestController +@RequestMapping("flow_task/template") +public class TaskTemplateController extends SimpleControllerSupport { + public TaskTemplateController(FlowTaskTemplateService flowTaskTemplateService) { + super(flowTaskTemplateService); + } + + @Override + protected SaveItemMapper saveItemMapper() { + return Mappers.getMapper(SaveItem.Mapper.class); + } + + @Override + protected ListItemMapper listItemMapper() { + return Mappers.getMapper(ListItem.Mapper.class); + } + + @Override + protected DetailItemMapper detailItemMapper() { + return Mappers.getMapper(DetailItem.Mapper.class); + } + + @Data + public static final class SaveItem { + private String name; + private String description; + private String inputSchema; + private String flow; + + @org.mapstruct.Mapper + public interface Mapper extends SaveItemMapper { + } + } + + @Data + @EqualsAndHashCode(callSuper = true) + public static class ListItem extends SimpleItem { + private String name; + private String description; + + @org.mapstruct.Mapper + public interface Mapper extends ListItemMapper { + } + } + + @Data + @EqualsAndHashCode(callSuper = true) + public static class DetailItem extends SimpleItem { + private String name; + private String description; + private String inputSchema; + private String flow; + + @org.mapstruct.Mapper + public interface Mapper extends DetailItemMapper { + } + } +} diff --git a/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/entity/FlowTask.java b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/entity/FlowTask.java new file mode 100644 index 0000000..c740e59 --- /dev/null +++ b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/entity/FlowTask.java @@ -0,0 +1,44 @@ +package com.lanyuanxiaoyao.service.ai.web.entity; + +import com.lanyuanxiaoyao.service.ai.web.base.entity.SimpleEntity; +import com.lanyuanxiaoyao.service.common.Constants; +import jakarta.persistence.Column; +import jakarta.persistence.ConstraintMode; +import jakarta.persistence.Entity; +import jakarta.persistence.EntityListeners; +import jakarta.persistence.ForeignKey; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import org.hibernate.annotations.DynamicUpdate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +@Getter +@Setter +@ToString +@Entity +@DynamicUpdate +@EntityListeners(AuditingEntityListener.class) +@Table(catalog = Constants.DATABASE_NAME, name = "service_ai_flow_task") +public class FlowTask extends SimpleEntity { + @ManyToOne + @JoinColumn(nullable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) + private FlowTaskTemplate template; + @Column(columnDefinition = "longtext") + private String input; + @Column(nullable = false) + private Status status = Status.RUNNING; + @Column(columnDefinition = "longtext") + private String error; + @Column(columnDefinition = "longtext") + private String result; + + public enum Status { + RUNNING, + ERROR, + FINISHED, + } +} diff --git a/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/entity/FlowTaskTemplate.java b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/entity/FlowTaskTemplate.java new file mode 100644 index 0000000..d024447 --- /dev/null +++ b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/entity/FlowTaskTemplate.java @@ -0,0 +1,32 @@ +package com.lanyuanxiaoyao.service.ai.web.entity; + +import com.lanyuanxiaoyao.service.ai.web.base.entity.SimpleEntity; +import com.lanyuanxiaoyao.service.common.Constants; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EntityListeners; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import org.hibernate.annotations.DynamicUpdate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +@Getter +@Setter +@ToString +@Entity +@DynamicUpdate +@EntityListeners(AuditingEntityListener.class) +@Table(catalog = Constants.DATABASE_NAME, name = "service_ai_flow_task_template") +public class FlowTaskTemplate extends SimpleEntity { + @Column(nullable = false) + private String name; + private String description; + @Column(nullable = false, columnDefinition = "longtext") + private String inputSchema; + @Column(nullable = false, columnDefinition = "text") + private String flow; + @Column(columnDefinition = "longtext") + private String flowGraph; +} diff --git a/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/repository/FlowTaskRepository.java b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/repository/FlowTaskRepository.java new file mode 100644 index 0000000..77f04eb --- /dev/null +++ b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/repository/FlowTaskRepository.java @@ -0,0 +1,9 @@ +package com.lanyuanxiaoyao.service.ai.web.repository; + +import com.lanyuanxiaoyao.service.ai.web.base.repository.SimpleRepository; +import com.lanyuanxiaoyao.service.ai.web.entity.FlowTask; +import org.springframework.stereotype.Repository; + +@Repository +public interface FlowTaskRepository extends SimpleRepository { +} diff --git a/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/repository/FlowTaskTemplateRepository.java b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/repository/FlowTaskTemplateRepository.java new file mode 100644 index 0000000..d867913 --- /dev/null +++ b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/repository/FlowTaskTemplateRepository.java @@ -0,0 +1,9 @@ +package com.lanyuanxiaoyao.service.ai.web.repository; + +import com.lanyuanxiaoyao.service.ai.web.base.repository.SimpleRepository; +import com.lanyuanxiaoyao.service.ai.web.entity.FlowTaskTemplate; +import org.springframework.stereotype.Repository; + +@Repository +public interface FlowTaskTemplateRepository extends SimpleRepository { +} diff --git a/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/service/feedback/FeedbackService.java b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/service/feedback/FeedbackService.java index e1e7d8b..05c2fff 100644 --- a/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/service/feedback/FeedbackService.java +++ b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/service/feedback/FeedbackService.java @@ -15,7 +15,7 @@ import org.springframework.transaction.annotation.Transactional; @Slf4j @Service -public class FeedbackService extends SimpleServiceSupport { + public class FeedbackService extends SimpleServiceSupport { private final FlowExecutor executor; @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection") diff --git a/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/service/task/FlowTaskService.java b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/service/task/FlowTaskService.java new file mode 100644 index 0000000..d3dbd83 --- /dev/null +++ b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/service/task/FlowTaskService.java @@ -0,0 +1,15 @@ +package com.lanyuanxiaoyao.service.ai.web.service.task; + +import com.lanyuanxiaoyao.service.ai.web.base.service.SimpleServiceSupport; +import com.lanyuanxiaoyao.service.ai.web.entity.FlowTask; +import com.lanyuanxiaoyao.service.ai.web.repository.FlowTaskRepository; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +public class FlowTaskService extends SimpleServiceSupport { + public FlowTaskService(FlowTaskRepository flowTaskRepository) { + super(flowTaskRepository); + } +} diff --git a/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/service/task/FlowTaskTemplateService.java b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/service/task/FlowTaskTemplateService.java new file mode 100644 index 0000000..472f3fd --- /dev/null +++ b/service-ai/service-ai-web/src/main/java/com/lanyuanxiaoyao/service/ai/web/service/task/FlowTaskTemplateService.java @@ -0,0 +1,15 @@ +package com.lanyuanxiaoyao.service.ai.web.service.task; + +import com.lanyuanxiaoyao.service.ai.web.base.service.SimpleServiceSupport; +import com.lanyuanxiaoyao.service.ai.web.entity.FlowTaskTemplate; +import com.lanyuanxiaoyao.service.ai.web.repository.FlowTaskTemplateRepository; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +public class FlowTaskTemplateService extends SimpleServiceSupport { + public FlowTaskTemplateService(FlowTaskTemplateRepository flowTaskTemplateRepository) { + super(flowTaskTemplateRepository); + } +} diff --git a/service-ai/service-ai-web/src/main/resources/application.yml b/service-ai/service-ai-web/src/main/resources/application.yml index cef88da..8019c71 100644 --- a/service-ai/service-ai-web/src/main/resources/application.yml +++ b/service-ai/service-ai-web/src/main/resources/application.yml @@ -1,11 +1,8 @@ server: + port: 8080 compression: enabled: true spring: - application: - name: service-ai-web - profiles: - include: random-port,common,discovery,metrics,forest mvc: async: request-timeout: 3600000 @@ -21,27 +18,44 @@ spring: ai: vectorstore: qdrant: - host: 132.121.206.65 - port: 29463 - api-key: ENC(0/0UkIKeAvyV17yNqSU3v04wmm8CdWKe4BYSSJa2FuBtK12TcZRJPdwk+ZpYnpISv+KmVTUrrmFBzAYrDR3ysA==) + host: 192.168.100.140 + port: 6334 llm: - base-url: http://132.121.206.65:10086 - api-key: ENC(K+Hff9QGC+fcyi510VIDd9CaeK/IN5WBJ9rlkUsHEdDgIidW+stHHJlsK0lLPUXXREha+ToQZqqDXJrqSE+GUKCXklFhelD8bRHFXBIeP/ZzT2cxhzgKUXgjw3S0Qw2R) + base-url: https://api.siliconflow.cn + api-key: sk-xrguybusoqndpqvgzgvllddzgjamksuecyqdaygdwnrnqfwo chat: - base-url: ${spring.llm.base-url}/v1 - model: 'Qwen3/qwen3-1.7b' + model: 'Qwen/Qwen3-8B' visual: - model: 'Qwen2.5/qwen2.5-vl-7b-q4km' + base-url: https://open.bigmodel.cn/api/paas/v4 + endpoint: /chat/completions + model: 'glm-4v-flash' embedding: - model: 'Qwen3/qwen3-embedding-4b' + model: 'BAAI/bge-m3' reranker: - model: 'BGE/beg-reranker-v2' + model: 'BAAI/bge-reranker-v2-m3' + cloud: + discovery: + enabled: false + zookeeper: + enabled: false + datasource: + url: jdbc:mysql://192.168.100.140:3306/hudi_collect_build_b12?useSSL=false&allowPublicKeyRetrieval=true + username: root + password: rootless + driver-class-name: com.mysql.cj.jdbc.Driver + security: + meta: + authority: ENC(GXKnbq1LS11U2HaONspvH+D/TkIx13aWTaokdkzaF7HSvq6Z0Rv1+JUWFnYopVXu) + username: ENC(moIO5mO39V1Z+RDwROK9JXY4GfM8ZjDgM6Si7wRZ1MPVjbhTpmLz3lz28rAiw7c2LeCmizfJzHkEXIwGlB280g==) + darkcode: ENC(0jzpQ7T6S+P7bZrENgYsUoLhlqGvw7DA2MN3BRqEOwq7plhtg72vuuiPQNnr3DaYz0CpyTvxInhpx11W3VZ1trD6NINh7O3LN70ZqO5pWXk=) jpa: - show-sql: true - generate-ddl: false + generate-ddl: true +jasypt: + encryptor: + password: 'r#(R,P"Dp^A47>WSn:Wn].gs/+"v:q_Q*An~zF*g-@j@jtSTv5H/,S-3:R?r9R}.' +fenix: + print-banner: false liteflow: rule-source: liteflow.xml print-banner: false check-node-exists: false -fenix: - print-banner: false diff --git a/service-web/client/src/pages/ai/task/FlowTask.tsx b/service-web/client/src/pages/ai/task/FlowTask.tsx new file mode 100644 index 0000000..cecf326 --- /dev/null +++ b/service-web/client/src/pages/ai/task/FlowTask.tsx @@ -0,0 +1,95 @@ +import React from 'react' +import {amisRender, commonInfo, crudCommonOptions, paginationTemplate,} from '../../../util/amis.tsx' +import {useNavigate} from 'react-router' + +const FlowTask: React.FC = () => { + const navigate = useNavigate() + return ( +
+ {amisRender( + { + type: 'page', + title: '任务记录', + body: [ + { + type: 'crud', + api: { + method: 'post', + url: `${commonInfo.baseAiUrl}/flow_task/list`, + data: { + page: { + index: '${page}', + size: '${perPage}', + } + } + }, + ...crudCommonOptions(), + ...paginationTemplate( + 10, + 5, + [ + { + type: 'action', + label: '', + icon: 'fa fa-plus', + size: 'sm', + onEvent: { + click: { + actions: [ + { + actionType: 'custom', + // @ts-ignore + script: (context, action, event) => { + navigate(`/ai/flow_task/add`) + }, + }, + ], + }, + }, + }, + ], + ), + columns: [ + { + name: 'id', + label: '任务ID', + width: 200, + }, + { + name: 'status', + label: '状态', + }, + { + type: 'operation', + label: '操作', + width: 200, + buttons: [ + { + type: 'action', + label: '重新执行', + level: 'link', + size: 'sm', + }, + { + type: 'action', + label: '删除', + className: 'text-danger btn-deleted', + level: 'link', + size: 'sm', + actionType: 'ajax', + api: `get:${commonInfo.baseAiUrl}/task/remove/\${id}`, + confirmText: '确认删除任务记录:${name}', + confirmTitle: '删除', + }, + ], + }, + ], + }, + ], + }, + )} +
+ ) +} + +export default FlowTask \ No newline at end of file diff --git a/service-web/client/src/pages/ai/task/FlowTaskAdd.tsx b/service-web/client/src/pages/ai/task/FlowTaskAdd.tsx new file mode 100644 index 0000000..123a1a9 --- /dev/null +++ b/service-web/client/src/pages/ai/task/FlowTaskAdd.tsx @@ -0,0 +1,36 @@ +import React from 'react' +import {amisRender,} from '../../../util/amis.tsx' + +const FlowTaskAdd: React.FC = () => { + // const navigate = useNavigate() + return ( +
+ {amisRender( + { + type: 'page', + title: '发起任务', + body: { + type: 'wizard', + wrapWithPanel: false, + steps:[ + { + title: '选择任务模板', + body: [] + }, + { + title: '填写任务信息', + body: [] + }, + { + title: '完成', + body: [] + }, + ] + }, + }, + )} +
+ ) +} + +export default FlowTaskAdd \ No newline at end of file diff --git a/service-web/client/src/pages/ai/task/template/FlowTaskTemplate.tsx b/service-web/client/src/pages/ai/task/template/FlowTaskTemplate.tsx new file mode 100644 index 0000000..4b092e1 --- /dev/null +++ b/service-web/client/src/pages/ai/task/template/FlowTaskTemplate.tsx @@ -0,0 +1,108 @@ +import React from 'react' +import {amisRender, commonInfo, crudCommonOptions, paginationTemplate,} from '../../../../util/amis.tsx' +import {useNavigate} from 'react-router' + +const FlowTaskTemplate: React.FC = () => { + const navigate = useNavigate() + return ( +
+ {amisRender( + { + type: 'page', + title: '任务模板', + body: [ + { + type: 'crud', + api: { + method: 'post', + url: `${commonInfo.baseAiUrl}/flow_task/template/list`, + data: { + page: { + index: '${page}', + size: '${perPage}', + } + } + }, + ...crudCommonOptions(), + ...paginationTemplate( + 10, + 5, + [ + { + type: 'action', + label: '', + icon: 'fa fa-plus', + size: 'sm', + onEvent: { + click: { + actions: [ + { + actionType: 'custom', + // @ts-ignore + script: (context, action, event) => { + navigate(`/ai/flow_task_template/edit/-1`) + }, + }, + ], + }, + }, + }, + ], + ), + columns: [ + { + name: 'name', + label: '名称', + width: 200, + }, + { + name: 'description', + label: '描述', + }, + { + type: 'operation', + label: '操作', + width: 200, + buttons: [ + { + type: 'action', + label: '编辑', + level: 'link', + size: 'sm', + onEvent: { + click: { + actions: [ + { + actionType: 'custom', + // @ts-ignore + script: (context, action, event) => { + navigate(`/ai/flow_task_template/edit/${context.props.data['id']}`) + }, + }, + ], + }, + }, + }, + { + type: 'action', + label: '删除', + className: 'text-danger btn-deleted', + level: 'link', + size: 'sm', + actionType: 'ajax', + api: `get:${commonInfo.baseAiUrl}/flow_task/template/remove/\${id}`, + confirmText: '确认删除任务模板:${name}', + confirmTitle: '删除', + }, + ], + }, + ], + }, + ], + }, + )} +
+ ) +} + +export default FlowTaskTemplate \ No newline at end of file diff --git a/service-web/client/src/pages/ai/task/template/FlowTaskTemplateEdit.tsx b/service-web/client/src/pages/ai/task/template/FlowTaskTemplateEdit.tsx new file mode 100644 index 0000000..e26e70b --- /dev/null +++ b/service-web/client/src/pages/ai/task/template/FlowTaskTemplateEdit.tsx @@ -0,0 +1,118 @@ +import React from 'react' +import {useParams} from 'react-router' +import styled from 'styled-components' +import {amisRender, commonInfo, horizontalFormOptions} from '../../../../util/amis.tsx' +import {isEqual} from 'licia' + +const TemplateEditDiv = styled.div` + .antd-EditorControl { + min-height: 500px !important; + } +` + +const FlowTaskTemplateEdit: React.FC = () => { + const {template_id} = useParams() + const preloadTemplateId = isEqual(template_id, '-1') ? undefined : template_id + console.log('preloadTemplateId', preloadTemplateId) + return ( + + {amisRender({ + type: 'page', + title: '模板编辑', + body: { + debug: commonInfo.debug, + type: 'form', + api: { + method: 'POST', + url: `${commonInfo.baseAiUrl}/flow_task/template/save`, + data: { + name: '${template.name}', + description: '${template.description}', + inputSchema: '${template.inputSchema}', + flow: '${template.flow}', + } + }, + initApi: preloadTemplateId + ? { + method: 'GET', + url: `${commonInfo.baseAiUrl}/flow_task/template/detail/${preloadTemplateId}`, + // @ts-ignore + adaptor: (payload, response, api, context) => { + return { + ...payload, + data: { + template: payload.data, + }, + } + }, + } + : undefined, + wrapWithPanel: false, + ...horizontalFormOptions(), + body: [ + { + type: 'input-text', + name: 'template.name', + label: '名称', + required: true, + }, + { + type: 'textarea', + name: 'template.description', + label: '描述', + required: true, + }, + { + type: 'group', + body: [ + { + type: 'editor', + required: true, + label: '入参表单', + description: '使用amis代码编写入参表单结构,流程会解析所有name对应的变量传入流程开始阶段;只需要编写form的columns部分', + name: 'template.inputSchema', + value: '[]', + language: 'json', + options: { + wordWrap: 'bounded', + }, + }, + { + type: 'amis', + name: 'template.inputSchema', + } + ] + }, + { + type: 'editor', + required: true, + label: '任务流程', + name: 'template.flow', + description: '使用标准的LiteFlow语法', + language: 'xml', + options: { + wordWrap: 'bounded', + }, + }, + { + type: 'button-toolbar', + buttons: [ + { + type: 'submit', + label: '提交', + level: 'primary', + }, + { + type: 'reset', + label: '重置', + }, + ], + }, + ], + }, + })} + + ) +} + +export default FlowTaskTemplateEdit \ No newline at end of file diff --git a/service-web/client/src/route.tsx b/service-web/client/src/route.tsx index b9a6185..302d924 100644 --- a/service-web/client/src/route.tsx +++ b/service-web/client/src/route.tsx @@ -4,6 +4,7 @@ import { ClusterOutlined, CompressOutlined, DatabaseOutlined, + FileTextOutlined, GatewayOutlined, InfoCircleOutlined, OpenAIOutlined, @@ -34,6 +35,10 @@ import YarnCluster from './pages/overview/YarnCluster.tsx' import Test from './pages/Test.tsx' import {commonInfo} from './util/amis.tsx' import FlowEditor from './pages/ai/flow/FlowEditor.tsx' +import FlowTaskTemplate from './pages/ai/task/template/FlowTaskTemplate.tsx' +import FlowTaskTemplateEdit from './pages/ai/task/template/FlowTaskTemplateEdit.tsx' +import FlowTask from './pages/ai/task/FlowTask.tsx' +import FlowTaskAdd from './pages/ai/task/FlowTaskAdd.tsx' export const routes: RouteObject[] = [ { @@ -111,6 +116,22 @@ export const routes: RouteObject[] = [ path: 'knowledge/detail/:knowledge_id/segment/:group_id', Component: DataSegment, }, + { + path: 'flow_task', + Component: FlowTask, + }, + { + path: 'flow_task/add', + Component: FlowTaskAdd, + }, + { + path: 'flow_task_template', + Component: FlowTaskTemplate, + }, + { + path: 'flow_task_template/edit/:template_id', + Component: FlowTaskTemplateEdit, + }, { path: 'flowable', Component: FlowEditor, @@ -158,7 +179,7 @@ export const menus = { icon: , }, { - path: `/yarn/${commonInfo.clusters.compaction_names()}/${values(commonInfo.clusters.compaction).join(",")}/Compaction`, + path: `/yarn/${commonInfo.clusters.compaction_names()}/${values(commonInfo.clusters.compaction).join(',')}/Compaction`, name: '压缩集群', icon: , }, @@ -222,6 +243,23 @@ export const menus = { name: '流程编排', icon: , }, + { + path: '1089caa6-9477-44a5-99f1-a9c179f6cfd3', + name: '任务', + icon: , + routes: [ + { + path: '/ai/flow_task', + name: '任务列表', + icon: , + }, + { + path: '/ai/flow_task_template', + name: '任务模板', + icon: , + }, + ] + }, ], }, ], diff --git a/service-web/client/src/util/amis.tsx b/service-web/client/src/util/amis.tsx index b77b522..d6c2c6f 100644 --- a/service-web/client/src/util/amis.tsx +++ b/service-web/client/src/util/amis.tsx @@ -10,8 +10,8 @@ import {isEqual} from 'licia' export const commonInfo = { debug: isEqual(import.meta.env.MODE, 'development'), baseUrl: 'http://132.126.207.130:35690/hudi_services/service_web', - baseAiUrl: 'http://132.126.207.130:35690/hudi_services/service_ai_web', - // baseAiUrl: 'http://localhost:8080', + // baseAiUrl: 'http://132.126.207.130:35690/hudi_services/service_ai_web', + baseAiUrl: 'http://localhost:8080', authorizationHeaders: { 'Authorization': 'Basic QXhoRWJzY3dzSkRiWU1IMjpjWXhnM2I0UHRXb1ZENVNqRmF5V3h0blNWc2p6UnNnNA==', 'Content-Type': 'application/json',