From 6e2cf11ec36ca62138e036ba93a7c911e9237f76 Mon Sep 17 00:00:00 2001 From: Chuck1sn Date: Sun, 25 May 2025 15:40:17 +0800 Subject: [PATCH 1/9] init action --- backend/build.gradle.kts | 1 + .../zl/mjga/config/ai/EmbeddingConfig.java | 45 +++++++++++++ .../zl/mjga/config/ai/ZhiPuConfiguration.java | 2 + .../com/zl/mjga/controller/AiController.java | 15 +++++ .../java/com/zl/mjga/model/urp/Actions.java | 14 ++++ .../com/zl/mjga/service/EmbeddingService.java | 65 +++++++++++++++++++ .../db/migration/V1_0_0__init_table.sql | 1 + .../migration/V1_0_1__insert_init_table.sql | 6 +- 8 files changed, 146 insertions(+), 3 deletions(-) create mode 100644 backend/src/main/java/com/zl/mjga/config/ai/EmbeddingConfig.java create mode 100644 backend/src/main/java/com/zl/mjga/model/urp/Actions.java create mode 100644 backend/src/main/java/com/zl/mjga/service/EmbeddingService.java diff --git a/backend/build.gradle.kts b/backend/build.gradle.kts index 0b141bd..81114d6 100644 --- a/backend/build.gradle.kts +++ b/backend/build.gradle.kts @@ -61,6 +61,7 @@ dependencies { implementation("org.springframework.boot:spring-boot-starter-quartz") implementation("dev.langchain4j:langchain4j:1.0.0") implementation("dev.langchain4j:langchain4j-open-ai:1.0.0") + implementation("dev.langchain4j:langchain4j-pgvector:1.0.1-beta6") implementation("dev.langchain4j:langchain4j-community-zhipu-ai:1.0.1-beta6") implementation("io.projectreactor:reactor-core:3.7.6") testImplementation("org.testcontainers:junit-jupiter:$testcontainersVersion") diff --git a/backend/src/main/java/com/zl/mjga/config/ai/EmbeddingConfig.java b/backend/src/main/java/com/zl/mjga/config/ai/EmbeddingConfig.java new file mode 100644 index 0000000..a0ac806 --- /dev/null +++ b/backend/src/main/java/com/zl/mjga/config/ai/EmbeddingConfig.java @@ -0,0 +1,45 @@ +package com.zl.mjga.config.ai; + +import dev.langchain4j.community.model.zhipu.ZhipuAiEmbeddingModel; +import dev.langchain4j.data.segment.TextSegment; +import dev.langchain4j.model.embedding.EmbeddingModel; +import dev.langchain4j.store.embedding.EmbeddingStore; +import dev.langchain4j.store.embedding.pgvector.PgVectorEmbeddingStore; +import jakarta.annotation.Resource; +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.DependsOn; +import org.springframework.core.env.Environment; + +@Configuration +@RequiredArgsConstructor +public class EmbeddingConfig { + + @Resource private Environment env; + + @Bean + @DependsOn("flywayInitializer") + public EmbeddingModel zhipuEmbeddingModel(ZhiPuConfiguration zhiPuConfiguration) { + return ZhipuAiEmbeddingModel.builder() + .apiKey(zhiPuConfiguration.getApiKey()) + .model(zhiPuConfiguration.getEmbeddingModel()) + .dimensions(2048) + .build(); + } + + @Bean + public EmbeddingStore zhiPuEmbeddingStore(EmbeddingModel zhipuEmbeddingModel) { + String hostPort = env.getProperty("DATABASE_HOST_PORT"); + String host = hostPort.split(":")[0]; + return PgVectorEmbeddingStore.builder() + .host(host) + .port(env.getProperty("DATABASE_EXPOSE_PORT", Integer.class)) + .database(env.getProperty("DATABASE_DB")) + .user(env.getProperty("DATABASE_USER")) + .password(env.getProperty("DATABASE_PASSWORD")) + .table("mjga.zhipu_embedding_store") + .dimension(2048) + .build(); + } +} diff --git a/backend/src/main/java/com/zl/mjga/config/ai/ZhiPuConfiguration.java b/backend/src/main/java/com/zl/mjga/config/ai/ZhiPuConfiguration.java index f94a679..603cb2a 100644 --- a/backend/src/main/java/com/zl/mjga/config/ai/ZhiPuConfiguration.java +++ b/backend/src/main/java/com/zl/mjga/config/ai/ZhiPuConfiguration.java @@ -11,10 +11,12 @@ public class ZhiPuConfiguration { private String baseUrl; private String apiKey; private String modelName; + private String embeddingModel; public void init(AiLlmConfig config) { this.baseUrl = config.getUrl(); this.apiKey = config.getApiKey(); this.modelName = config.getModelName(); + this.embeddingModel = config.getEmbeddingModel(); } } diff --git a/backend/src/main/java/com/zl/mjga/controller/AiController.java b/backend/src/main/java/com/zl/mjga/controller/AiController.java index b77f900..0d1d2a1 100644 --- a/backend/src/main/java/com/zl/mjga/controller/AiController.java +++ b/backend/src/main/java/com/zl/mjga/controller/AiController.java @@ -4,15 +4,20 @@ import com.zl.mjga.dto.PageRequestDto; import com.zl.mjga.dto.PageResponseDto; import com.zl.mjga.dto.ai.LlmQueryDto; import com.zl.mjga.dto.ai.LlmVm; +import com.zl.mjga.exception.BusinessException; import com.zl.mjga.service.AiChatService; +import com.zl.mjga.service.EmbeddingService; import com.zl.mjga.service.LlmService; import dev.langchain4j.service.TokenStream; import jakarta.validation.Valid; import java.security.Principal; import java.time.Duration; import java.util.List; +import java.util.Map; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.jooq.generated.mjga.enums.LlmCodeEnum; +import org.jooq.generated.mjga.tables.pojos.AiLlmConfig; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.security.access.prepost.PreAuthorize; @@ -28,6 +33,7 @@ public class AiController { private final AiChatService aiChatService; private final LlmService llmService; + private final EmbeddingService embeddingService; @PostMapping(value = "/chat", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public Flux chat(Principal principal, @RequestBody String userMessage) { @@ -57,4 +63,13 @@ public class AiController { @ModelAttribute PageRequestDto pageRequestDto, @ModelAttribute LlmQueryDto llmQueryDto) { return llmService.pageQueryLlm(pageRequestDto, llmQueryDto); } + + @PostMapping("/action/chat") + public Map actionChat(@RequestBody String message) { + AiLlmConfig aiLlmConfig = llmService.loadConfig(LlmCodeEnum.ZHI_PU); + if (!aiLlmConfig.getEnable()) { + throw new BusinessException("命令模型未启用,请开启后再试。"); + } + return embeddingService.searchAction(message); + } } diff --git a/backend/src/main/java/com/zl/mjga/model/urp/Actions.java b/backend/src/main/java/com/zl/mjga/model/urp/Actions.java new file mode 100644 index 0000000..30ec51c --- /dev/null +++ b/backend/src/main/java/com/zl/mjga/model/urp/Actions.java @@ -0,0 +1,14 @@ +package com.zl.mjga.model.urp; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public enum Actions { + CREATE_USER("CREATE_USER", "创建新用户"), + DELETE_USER("DELETE_USER", "删除用户"); + public static final String INDEX_KEY = "action"; + private final String code; + private final String content; +} diff --git a/backend/src/main/java/com/zl/mjga/service/EmbeddingService.java b/backend/src/main/java/com/zl/mjga/service/EmbeddingService.java new file mode 100644 index 0000000..797d898 --- /dev/null +++ b/backend/src/main/java/com/zl/mjga/service/EmbeddingService.java @@ -0,0 +1,65 @@ +package com.zl.mjga.service; + +import static dev.langchain4j.store.embedding.filter.MetadataFilterBuilder.metadataKey; + +import com.zl.mjga.model.urp.Actions; +import dev.langchain4j.data.document.Metadata; +import dev.langchain4j.data.embedding.Embedding; +import dev.langchain4j.data.segment.TextSegment; +import dev.langchain4j.model.embedding.EmbeddingModel; +import dev.langchain4j.store.embedding.EmbeddingSearchRequest; +import dev.langchain4j.store.embedding.EmbeddingSearchResult; +import dev.langchain4j.store.embedding.EmbeddingStore; +import dev.langchain4j.store.embedding.filter.Filter; +import jakarta.annotation.PostConstruct; +import java.util.HashMap; +import java.util.Map; +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Configuration; +import org.springframework.stereotype.Service; + +@Configuration +@RequiredArgsConstructor +@Service +public class EmbeddingService { + + private final EmbeddingModel zhipuEmbeddingModel; + + private final EmbeddingStore zhiPuEmbeddingStore; + + public Map searchAction(String message) { + Map result = new HashMap<>(); + EmbeddingSearchRequest embeddingSearchRequest = + EmbeddingSearchRequest.builder() + .queryEmbedding(zhipuEmbeddingModel.embed(message).content()) + .build(); + EmbeddingSearchResult embeddingSearchResult = + zhiPuEmbeddingStore.search(embeddingSearchRequest); + if (!embeddingSearchResult.matches().isEmpty()) { + result = embeddingSearchResult.matches().getFirst().embedded().metadata().toMap(); + } + return result; + } + + @PostConstruct + public void initActionIndex() { + for (Actions action : Actions.values()) { + Embedding queryEmbedding = zhipuEmbeddingModel.embed(action.getContent()).content(); + Filter createUserFilter = metadataKey(Actions.INDEX_KEY).isEqualTo(action.getCode()); + EmbeddingSearchRequest embeddingSearchRequest = + EmbeddingSearchRequest.builder() + .queryEmbedding(queryEmbedding) + .filter(createUserFilter) + .build(); + EmbeddingSearchResult embeddingSearchResult = + zhiPuEmbeddingStore.search(embeddingSearchRequest); + if (embeddingSearchResult.matches().isEmpty()) { + TextSegment segment = + TextSegment.from( + action.getContent(), Metadata.metadata(Actions.INDEX_KEY, action.getCode())); + Embedding embedding = zhipuEmbeddingModel.embed(segment).content(); + zhiPuEmbeddingStore.add(embedding, segment); + } + } + } +} diff --git a/backend/src/main/resources/db/migration/V1_0_0__init_table.sql b/backend/src/main/resources/db/migration/V1_0_0__init_table.sql index 7a25894..9f1c677 100644 --- a/backend/src/main/resources/db/migration/V1_0_0__init_table.sql +++ b/backend/src/main/resources/db/migration/V1_0_0__init_table.sql @@ -77,6 +77,7 @@ CREATE TABLE mjga.ai_llm_config ( name VARCHAR(255) NOT NULL UNIQUE, code mjga.llm_code_enum NOT NULL UNIQUE, model_name VARCHAR(255) NOT NULL, + embedding_model VARCHAR(255) NOT NULL, api_key VARCHAR(255) NOT NULL, url VARCHAR(255) NOT NULL, enable BOOLEAN NOT NULL DEFAULT true, diff --git a/backend/src/main/resources/db/migration/V1_0_1__insert_init_table.sql b/backend/src/main/resources/db/migration/V1_0_1__insert_init_table.sql index 05b4ee9..70f8f7e 100644 --- a/backend/src/main/resources/db/migration/V1_0_1__insert_init_table.sql +++ b/backend/src/main/resources/db/migration/V1_0_1__insert_init_table.sql @@ -33,7 +33,7 @@ VALUES (1, 1), (1, 9), (1, 10); -INSERT INTO mjga.ai_llm_config (name,code,model_name, api_key, url, enable, priority) +INSERT INTO mjga.ai_llm_config (name,code,model_name,embedding_model, api_key, url, enable, priority) VALUES - ('DeepSeek','DEEP_SEEK','deepseek-chat','your_api_key', 'https://api.deepseek.com', false, 0), - ('智谱清言','ZHI_PU','glm-4-flash', 'your_api_key', 'https://open.bigmodel.cn/', false, 1); \ No newline at end of file + ('DeepSeek','DEEP_SEEK','deepseek-chat','embedding-model-name','your_api_key', 'https://api.deepseek.com', false, 0), + ('智谱清言','ZHI_PU','glm-4-flash','embedding-model-name', 'your_api_key', 'https://open.bigmodel.cn/', false, 1); \ No newline at end of file From b6f72942ad0512cc9d51fc0a36a6561b615a1211 Mon Sep 17 00:00:00 2001 From: Chuck1sn Date: Sun, 25 May 2025 16:20:00 +0800 Subject: [PATCH 2/9] init embedding --- ...lConfig.java => ChatModelInitializer.java} | 33 +- ...tion.java => DeepSeekChatModelConfig.java} | 6 +- ...gConfig.java => EmbeddingInitializer.java} | 21 +- ...uration.java => ZhiPuChatModelConfig.java} | 2 +- .../config/ai/ZhiPuEmbeddingModelConfig.java | 20 + .../java/com/zl/mjga/dto/ai/LlmQueryDto.java | 2 +- .../com/zl/mjga/repository/LlmRepository.java | 5 + .../com/zl/mjga/service/AiChatService.java | 3 +- .../com/zl/mjga/service/EmbeddingService.java | 6 + .../java/com/zl/mjga/service/LlmService.java | 7 +- .../db/migration/V1_0_0__init_table.sql | 9 +- .../migration/V1_0_1__insert_init_table.sql | 7 +- .../db/migration/test/V1_0_0__init_table.sql | 14 + frontend/src/api/schema/openapi.json | 36 + frontend/src/api/types/schema.d.ts | 3321 +++++++++-------- 15 files changed, 1818 insertions(+), 1674 deletions(-) rename backend/src/main/java/com/zl/mjga/config/ai/{ChatModelConfig.java => ChatModelInitializer.java} (69%) rename backend/src/main/java/com/zl/mjga/config/ai/{ZhiPuConfiguration.java => DeepSeekChatModelConfig.java} (66%) rename backend/src/main/java/com/zl/mjga/config/ai/{EmbeddingConfig.java => EmbeddingInitializer.java} (63%) rename backend/src/main/java/com/zl/mjga/config/ai/{DeepSeekConfiguration.java => ZhiPuChatModelConfig.java} (90%) create mode 100644 backend/src/main/java/com/zl/mjga/config/ai/ZhiPuEmbeddingModelConfig.java diff --git a/backend/src/main/java/com/zl/mjga/config/ai/ChatModelConfig.java b/backend/src/main/java/com/zl/mjga/config/ai/ChatModelInitializer.java similarity index 69% rename from backend/src/main/java/com/zl/mjga/config/ai/ChatModelConfig.java rename to backend/src/main/java/com/zl/mjga/config/ai/ChatModelInitializer.java index 936bf74..49d109d 100644 --- a/backend/src/main/java/com/zl/mjga/config/ai/ChatModelConfig.java +++ b/backend/src/main/java/com/zl/mjga/config/ai/ChatModelInitializer.java @@ -14,17 +14,17 @@ import org.springframework.context.annotation.DependsOn; @Configuration @RequiredArgsConstructor -public class ChatModelConfig { +public class ChatModelInitializer { private final LlmService llmService; private final PromptConfiguration promptConfiguration; @Bean @DependsOn("flywayInitializer") - public ZhipuAiStreamingChatModel zhipuChatModel(ZhiPuConfiguration zhiPuConfiguration) { + public ZhipuAiStreamingChatModel zhipuChatModel(ZhiPuChatModelConfig zhiPuChatModelConfig) { return ZhipuAiStreamingChatModel.builder() - .model(zhiPuConfiguration.getModelName()) - .apiKey(zhiPuConfiguration.getApiKey()) + .model(zhiPuChatModelConfig.getModelName()) + .apiKey(zhiPuChatModelConfig.getApiKey()) .logRequests(true) .logResponses(true) .build(); @@ -32,11 +32,12 @@ public class ChatModelConfig { @Bean @DependsOn("flywayInitializer") - public OpenAiStreamingChatModel deepSeekChatModel(DeepSeekConfiguration deepSeekConfiguration) { + public OpenAiStreamingChatModel deepSeekChatModel( + DeepSeekChatModelConfig deepSeekChatModelConfig) { return OpenAiStreamingChatModel.builder() - .baseUrl(deepSeekConfiguration.getBaseUrl()) - .apiKey(deepSeekConfiguration.getApiKey()) - .modelName(deepSeekConfiguration.getModelName()) + .baseUrl(deepSeekChatModelConfig.getBaseUrl()) + .apiKey(deepSeekChatModelConfig.getApiKey()) + .modelName(deepSeekChatModelConfig.getModelName()) .build(); } @@ -62,19 +63,19 @@ public class ChatModelConfig { @Bean @DependsOn("flywayInitializer") - public DeepSeekConfiguration deepSeekConfiguration() { - DeepSeekConfiguration deepSeekConfiguration = new DeepSeekConfiguration(); + public DeepSeekChatModelConfig deepSeekConfiguration() { + DeepSeekChatModelConfig deepSeekChatModelConfig = new DeepSeekChatModelConfig(); AiLlmConfig deepSeek = llmService.loadConfig(LlmCodeEnum.DEEP_SEEK); - deepSeekConfiguration.init(deepSeek); - return deepSeekConfiguration; + deepSeekChatModelConfig.init(deepSeek); + return deepSeekChatModelConfig; } @Bean @DependsOn("flywayInitializer") - public ZhiPuConfiguration zhiPuConfiguration() { - ZhiPuConfiguration zhiPuConfiguration = new ZhiPuConfiguration(); + public ZhiPuChatModelConfig zhiPuConfiguration() { + ZhiPuChatModelConfig zhiPuChatModelConfig = new ZhiPuChatModelConfig(); AiLlmConfig aiLlmConfig = llmService.loadConfig(LlmCodeEnum.ZHI_PU); - zhiPuConfiguration.init(aiLlmConfig); - return zhiPuConfiguration; + zhiPuChatModelConfig.init(aiLlmConfig); + return zhiPuChatModelConfig; } } diff --git a/backend/src/main/java/com/zl/mjga/config/ai/ZhiPuConfiguration.java b/backend/src/main/java/com/zl/mjga/config/ai/DeepSeekChatModelConfig.java similarity index 66% rename from backend/src/main/java/com/zl/mjga/config/ai/ZhiPuConfiguration.java rename to backend/src/main/java/com/zl/mjga/config/ai/DeepSeekChatModelConfig.java index 603cb2a..29c17f0 100644 --- a/backend/src/main/java/com/zl/mjga/config/ai/ZhiPuConfiguration.java +++ b/backend/src/main/java/com/zl/mjga/config/ai/DeepSeekChatModelConfig.java @@ -2,21 +2,17 @@ package com.zl.mjga.config.ai; import lombok.Data; import org.jooq.generated.mjga.tables.pojos.AiLlmConfig; -import org.springframework.stereotype.Component; @Data -@Component -public class ZhiPuConfiguration { +public class DeepSeekChatModelConfig { private String baseUrl; private String apiKey; private String modelName; - private String embeddingModel; public void init(AiLlmConfig config) { this.baseUrl = config.getUrl(); this.apiKey = config.getApiKey(); this.modelName = config.getModelName(); - this.embeddingModel = config.getEmbeddingModel(); } } diff --git a/backend/src/main/java/com/zl/mjga/config/ai/EmbeddingConfig.java b/backend/src/main/java/com/zl/mjga/config/ai/EmbeddingInitializer.java similarity index 63% rename from backend/src/main/java/com/zl/mjga/config/ai/EmbeddingConfig.java rename to backend/src/main/java/com/zl/mjga/config/ai/EmbeddingInitializer.java index a0ac806..bc81f98 100644 --- a/backend/src/main/java/com/zl/mjga/config/ai/EmbeddingConfig.java +++ b/backend/src/main/java/com/zl/mjga/config/ai/EmbeddingInitializer.java @@ -1,5 +1,6 @@ package com.zl.mjga.config.ai; +import com.zl.mjga.service.LlmService; import dev.langchain4j.community.model.zhipu.ZhipuAiEmbeddingModel; import dev.langchain4j.data.segment.TextSegment; import dev.langchain4j.model.embedding.EmbeddingModel; @@ -7,6 +8,8 @@ import dev.langchain4j.store.embedding.EmbeddingStore; import dev.langchain4j.store.embedding.pgvector.PgVectorEmbeddingStore; import jakarta.annotation.Resource; import lombok.RequiredArgsConstructor; +import org.jooq.generated.mjga.enums.LlmCodeEnum; +import org.jooq.generated.mjga.tables.pojos.AiLlmConfig; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.DependsOn; @@ -14,16 +17,26 @@ import org.springframework.core.env.Environment; @Configuration @RequiredArgsConstructor -public class EmbeddingConfig { +public class EmbeddingInitializer { @Resource private Environment env; + private final LlmService llmService; @Bean @DependsOn("flywayInitializer") - public EmbeddingModel zhipuEmbeddingModel(ZhiPuConfiguration zhiPuConfiguration) { + public ZhiPuEmbeddingModelConfig zhiPuEmbeddingModelConfig() { + ZhiPuEmbeddingModelConfig zhiPuEmbeddingModelConfig = new ZhiPuEmbeddingModelConfig(); + AiLlmConfig aiLlmConfig = llmService.loadConfig(LlmCodeEnum.ZHI_PU_EMBEDDING); + zhiPuEmbeddingModelConfig.init(aiLlmConfig); + return zhiPuEmbeddingModelConfig; + } + + @Bean + @DependsOn("flywayInitializer") + public EmbeddingModel zhipuEmbeddingModel(ZhiPuEmbeddingModelConfig zhiPuEmbeddingModelConfig) { return ZhipuAiEmbeddingModel.builder() - .apiKey(zhiPuConfiguration.getApiKey()) - .model(zhiPuConfiguration.getEmbeddingModel()) + .apiKey(zhiPuEmbeddingModelConfig.getApiKey()) + .model(zhiPuEmbeddingModelConfig.getModelName()) .dimensions(2048) .build(); } diff --git a/backend/src/main/java/com/zl/mjga/config/ai/DeepSeekConfiguration.java b/backend/src/main/java/com/zl/mjga/config/ai/ZhiPuChatModelConfig.java similarity index 90% rename from backend/src/main/java/com/zl/mjga/config/ai/DeepSeekConfiguration.java rename to backend/src/main/java/com/zl/mjga/config/ai/ZhiPuChatModelConfig.java index 9b23819..a08e812 100644 --- a/backend/src/main/java/com/zl/mjga/config/ai/DeepSeekConfiguration.java +++ b/backend/src/main/java/com/zl/mjga/config/ai/ZhiPuChatModelConfig.java @@ -4,7 +4,7 @@ import lombok.Data; import org.jooq.generated.mjga.tables.pojos.AiLlmConfig; @Data -public class DeepSeekConfiguration { +public class ZhiPuChatModelConfig { private String baseUrl; private String apiKey; diff --git a/backend/src/main/java/com/zl/mjga/config/ai/ZhiPuEmbeddingModelConfig.java b/backend/src/main/java/com/zl/mjga/config/ai/ZhiPuEmbeddingModelConfig.java new file mode 100644 index 0000000..bb41312 --- /dev/null +++ b/backend/src/main/java/com/zl/mjga/config/ai/ZhiPuEmbeddingModelConfig.java @@ -0,0 +1,20 @@ +package com.zl.mjga.config.ai; + +import lombok.Data; +import org.jooq.generated.mjga.tables.pojos.AiLlmConfig; + +@Data +public class ZhiPuEmbeddingModelConfig { + + private String baseUrl; + private String apiKey; + private String modelName; + private Boolean enable; + + public void init(AiLlmConfig config) { + this.baseUrl = config.getUrl(); + this.apiKey = config.getApiKey(); + this.modelName = config.getModelName(); + this.enable = config.getEnable(); + } +} diff --git a/backend/src/main/java/com/zl/mjga/dto/ai/LlmQueryDto.java b/backend/src/main/java/com/zl/mjga/dto/ai/LlmQueryDto.java index d9fec07..a462b0a 100644 --- a/backend/src/main/java/com/zl/mjga/dto/ai/LlmQueryDto.java +++ b/backend/src/main/java/com/zl/mjga/dto/ai/LlmQueryDto.java @@ -1,3 +1,3 @@ package com.zl.mjga.dto.ai; -public record LlmQueryDto(String name) {} +public record LlmQueryDto(String name, String type) {} diff --git a/backend/src/main/java/com/zl/mjga/repository/LlmRepository.java b/backend/src/main/java/com/zl/mjga/repository/LlmRepository.java index 0e6dfa1..ff23bde 100644 --- a/backend/src/main/java/com/zl/mjga/repository/LlmRepository.java +++ b/backend/src/main/java/com/zl/mjga/repository/LlmRepository.java @@ -9,6 +9,7 @@ import org.apache.commons.lang3.StringUtils; import org.jooq.Configuration; import org.jooq.Record; import org.jooq.Result; +import org.jooq.generated.default_schema.enums.LlmTypeEnum; import org.jooq.generated.mjga.tables.daos.AiLlmConfigDao; import org.jooq.impl.DSL; import org.springframework.beans.factory.annotation.Autowired; @@ -31,6 +32,10 @@ public class LlmRepository extends AiLlmConfigDao { StringUtils.isNotEmpty(llmQueryDto.name()) ? AI_LLM_CONFIG.NAME.eq(llmQueryDto.name()) : noCondition()) + .and( + StringUtils.isNotEmpty(llmQueryDto.type()) + ? AI_LLM_CONFIG.TYPE.eq(LlmTypeEnum.lookupLiteral(llmQueryDto.type())) + : noCondition()) .orderBy(pageRequestDto.getSortFields()) .limit(pageRequestDto.getSize()) .offset(pageRequestDto.getOffset()) diff --git a/backend/src/main/java/com/zl/mjga/service/AiChatService.java b/backend/src/main/java/com/zl/mjga/service/AiChatService.java index 9612281..a77586d 100644 --- a/backend/src/main/java/com/zl/mjga/service/AiChatService.java +++ b/backend/src/main/java/com/zl/mjga/service/AiChatService.java @@ -28,12 +28,13 @@ public class AiChatService { } public TokenStream chatPrecedenceLlmWith(String sessionIdentifier, String userMessage) { - Optional precedenceLlmBy = llmService.getPrecedenceLlmBy(true); + Optional precedenceLlmBy = llmService.getPrecedenceChatLlmBy(true); AiLlmConfig aiLlmConfig = precedenceLlmBy.orElseThrow(() -> new BusinessException("没有开启的大模型")); LlmCodeEnum code = aiLlmConfig.getCode(); return switch (code) { case ZHI_PU -> zhiPuChatAssistant.chat(sessionIdentifier, userMessage); case DEEP_SEEK -> deepSeekChatAssistant.chat(sessionIdentifier, userMessage); + default -> throw new BusinessException(String.format("无效的模型代码 %s", code)); }; } } diff --git a/backend/src/main/java/com/zl/mjga/service/EmbeddingService.java b/backend/src/main/java/com/zl/mjga/service/EmbeddingService.java index 797d898..7c1b9af 100644 --- a/backend/src/main/java/com/zl/mjga/service/EmbeddingService.java +++ b/backend/src/main/java/com/zl/mjga/service/EmbeddingService.java @@ -2,6 +2,7 @@ package com.zl.mjga.service; import static dev.langchain4j.store.embedding.filter.MetadataFilterBuilder.metadataKey; +import com.zl.mjga.config.ai.ZhiPuEmbeddingModelConfig; import com.zl.mjga.model.urp.Actions; import dev.langchain4j.data.document.Metadata; import dev.langchain4j.data.embedding.Embedding; @@ -27,6 +28,8 @@ public class EmbeddingService { private final EmbeddingStore zhiPuEmbeddingStore; + private final ZhiPuEmbeddingModelConfig zhiPuEmbeddingModelConfig; + public Map searchAction(String message) { Map result = new HashMap<>(); EmbeddingSearchRequest embeddingSearchRequest = @@ -43,6 +46,9 @@ public class EmbeddingService { @PostConstruct public void initActionIndex() { + if (!zhiPuEmbeddingModelConfig.getEnable()) { + return; + } for (Actions action : Actions.values()) { Embedding queryEmbedding = zhipuEmbeddingModel.embed(action.getContent()).content(); Filter createUserFilter = metadataKey(Actions.INDEX_KEY).isEqualTo(action.getCode()); diff --git a/backend/src/main/java/com/zl/mjga/service/LlmService.java b/backend/src/main/java/com/zl/mjga/service/LlmService.java index 54d0415..d90a2ba 100644 --- a/backend/src/main/java/com/zl/mjga/service/LlmService.java +++ b/backend/src/main/java/com/zl/mjga/service/LlmService.java @@ -12,6 +12,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.jooq.Record; import org.jooq.Result; +import org.jooq.generated.default_schema.enums.LlmTypeEnum; import org.jooq.generated.mjga.enums.LlmCodeEnum; import org.jooq.generated.mjga.tables.pojos.AiLlmConfig; import org.springframework.beans.BeanUtils; @@ -28,9 +29,11 @@ public class LlmService { return llmRepository.fetchOneByCode(llmCodeEnum); } - public Optional getPrecedenceLlmBy(Boolean enable) { + public Optional getPrecedenceChatLlmBy(Boolean enable) { List aiLlmConfigs = llmRepository.fetchByEnable(enable); - return aiLlmConfigs.stream().max((o1, o2) -> o2.getPriority().compareTo(o1.getPriority())); + return aiLlmConfigs.stream() + .filter(aiLlmConfig -> LlmTypeEnum.CHAT.equals(aiLlmConfig.getType())) + .max((o1, o2) -> o2.getPriority().compareTo(o1.getPriority())); } public PageResponseDto> pageQueryLlm( diff --git a/backend/src/main/resources/db/migration/V1_0_0__init_table.sql b/backend/src/main/resources/db/migration/V1_0_0__init_table.sql index 9f1c677..f214ef9 100644 --- a/backend/src/main/resources/db/migration/V1_0_0__init_table.sql +++ b/backend/src/main/resources/db/migration/V1_0_0__init_table.sql @@ -68,16 +68,21 @@ CREATE TABLE mjga.user_position_map ( CREATE TYPE mjga.llm_code_enum AS ENUM ( 'DEEP_SEEK', - 'ZHI_PU' + 'ZHI_PU', + 'ZHI_PU_EMBEDDING' ); +CREATE TYPE "llm_type_enum" AS ENUM ( + 'CHAT', + 'EMBEDDING' +); CREATE TABLE mjga.ai_llm_config ( id BIGSERIAL NOT NULL UNIQUE, name VARCHAR(255) NOT NULL UNIQUE, code mjga.llm_code_enum NOT NULL UNIQUE, model_name VARCHAR(255) NOT NULL, - embedding_model VARCHAR(255) NOT NULL, + type LLM_TYPE_ENUM NOT NULL, api_key VARCHAR(255) NOT NULL, url VARCHAR(255) NOT NULL, enable BOOLEAN NOT NULL DEFAULT true, diff --git a/backend/src/main/resources/db/migration/V1_0_1__insert_init_table.sql b/backend/src/main/resources/db/migration/V1_0_1__insert_init_table.sql index 70f8f7e..2531d91 100644 --- a/backend/src/main/resources/db/migration/V1_0_1__insert_init_table.sql +++ b/backend/src/main/resources/db/migration/V1_0_1__insert_init_table.sql @@ -33,7 +33,8 @@ VALUES (1, 1), (1, 9), (1, 10); -INSERT INTO mjga.ai_llm_config (name,code,model_name,embedding_model, api_key, url, enable, priority) +INSERT INTO mjga.ai_llm_config (name,code,model_name, type, api_key, url, enable, priority) VALUES - ('DeepSeek','DEEP_SEEK','deepseek-chat','embedding-model-name','your_api_key', 'https://api.deepseek.com', false, 0), - ('智谱清言','ZHI_PU','glm-4-flash','embedding-model-name', 'your_api_key', 'https://open.bigmodel.cn/', false, 1); \ No newline at end of file + ('DeepSeek','DEEP_SEEK','deepseek-chat','CHAT','your_api_key', 'https://api.deepseek.com', false, 0), + ('智谱清言','ZHI_PU','glm-4-flash','CHAT', 'your_api_key', 'https://open.bigmodel.cn/', false, 1), + ('智谱清言向量','ZHI_PU_EMBEDDING','Embeddings-3','EMBEDDING', 'your_api_key', 'https://open.bigmodel.cn/', false, 0); \ No newline at end of file diff --git a/backend/src/test/resources/db/migration/test/V1_0_0__init_table.sql b/backend/src/test/resources/db/migration/test/V1_0_0__init_table.sql index 00dc253..a61d3be 100644 --- a/backend/src/test/resources/db/migration/test/V1_0_0__init_table.sql +++ b/backend/src/test/resources/db/migration/test/V1_0_0__init_table.sql @@ -66,9 +66,23 @@ CREATE TABLE mjga.user_position_map ( FOREIGN KEY (position_id) REFERENCES mjga.position(id) ON UPDATE NO ACTION ON DELETE RESTRICT ); +CREATE TYPE mjga.llm_code_enum AS ENUM ( + 'DEEP_SEEK', + 'ZHI_PU', + 'ZHI_PU_EMBEDDING' +); + +CREATE TYPE "llm_type_enum" AS ENUM ( + 'CHAT', + 'EMBEDDING' +); + CREATE TABLE mjga.ai_llm_config ( id BIGSERIAL NOT NULL UNIQUE, name VARCHAR(255) NOT NULL UNIQUE, + code mjga.llm_code_enum NOT NULL UNIQUE, + model_name VARCHAR(255) NOT NULL, + type LLM_TYPE_ENUM NOT NULL, api_key VARCHAR(255) NOT NULL, url VARCHAR(255) NOT NULL, enable BOOLEAN NOT NULL DEFAULT true, diff --git a/frontend/src/api/schema/openapi.json b/frontend/src/api/schema/openapi.json index 8f2039a..bffdf22 100644 --- a/frontend/src/api/schema/openapi.json +++ b/frontend/src/api/schema/openapi.json @@ -747,6 +747,39 @@ } } }, + "/ai/action/chat": { + "post": { + "tags": [ + "ai-controller" + ], + "operationId": "actionChat", + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "string" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "type": "object", + "additionalProperties": { + "type": "object" + } + } + } + } + } + } + } + }, "/scheduler/page-query": { "get": { "tags": [ @@ -1788,6 +1821,9 @@ "properties": { "name": { "type": "string" + }, + "type": { + "type": "string" } } }, diff --git a/frontend/src/api/types/schema.d.ts b/frontend/src/api/types/schema.d.ts index 5bb5086..6045993 100644 --- a/frontend/src/api/types/schema.d.ts +++ b/frontend/src/api/types/schema.d.ts @@ -4,1649 +4,1692 @@ */ export interface paths { - "/scheduler/job/update": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put: operations["updateJob"]; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/ai/llm": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put: operations["updateLlm"]; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/scheduler/trigger/resume": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: operations["resumeTrigger"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/scheduler/trigger/pause": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: operations["pauseTrigger"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/scheduler/job/trigger": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: operations["triggerJob"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/position": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: operations["upsertPosition"]; - delete: operations["deletePosition"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/iam/user": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: operations["queryUserWithRolePermission"]; - put?: never; - post: operations["upsertUser"]; - delete: operations["deleteUser"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/iam/role": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: operations["queryRoleWithPermission"]; - put?: never; - post: operations["upsertRole"]; - delete: operations["deleteRole"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/iam/role/unbind": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: operations["unBindRoleBy"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/iam/role/bind": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: operations["bindRoleBy"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/iam/position/unbind": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: operations["unBindPositionBy"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/iam/position/bind": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: operations["bindPositionBy"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/iam/permission": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: operations["upsertPermission"]; - delete: operations["deletePermission"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/iam/permission/unbind": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: operations["unBindPermissionBy"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/iam/permission/bind": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: operations["bindPermissionBy"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/iam/me": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: operations["currentUser"]; - put?: never; - post: operations["upsertMe"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/iam/department/unbind": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: operations["unBindDepartmentBy"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/iam/department/bind": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: operations["bindDepartmentBy"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/department": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: operations["upsertDepartment"]; - delete: operations["deleteDepartment"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/auth/sign-up": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: operations["signUp"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/auth/sign-out": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: operations["signOut"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/auth/sign-in": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: operations["signIn"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/ai/chat": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: operations["chat"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/scheduler/page-query": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: operations["pageQuery"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/position/query": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: operations["queryPositions"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/position/page-query": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: operations["pageQueryPositions"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/iam/users": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: operations["queryUsers"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/iam/roles": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: operations["queryRoles"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/iam/permissions": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: operations["queryPermissions"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/department/query-available": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: operations["queryAvailableParentDepartmentsBy"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/department/page-query": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: operations["pageQueryDepartments"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/ai/llm/page-query": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: operations["pageQueryLlm"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; + "/scheduler/job/update": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put: operations["updateJob"]; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/ai/llm": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put: operations["updateLlm"]; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/scheduler/trigger/resume": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: operations["resumeTrigger"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/scheduler/trigger/pause": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: operations["pauseTrigger"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/scheduler/job/trigger": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: operations["triggerJob"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/position": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: operations["upsertPosition"]; + delete: operations["deletePosition"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/iam/user": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations["queryUserWithRolePermission"]; + put?: never; + post: operations["upsertUser"]; + delete: operations["deleteUser"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/iam/role": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations["queryRoleWithPermission"]; + put?: never; + post: operations["upsertRole"]; + delete: operations["deleteRole"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/iam/role/unbind": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: operations["unBindRoleBy"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/iam/role/bind": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: operations["bindRoleBy"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/iam/position/unbind": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: operations["unBindPositionBy"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/iam/position/bind": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: operations["bindPositionBy"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/iam/permission": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: operations["upsertPermission"]; + delete: operations["deletePermission"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/iam/permission/unbind": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: operations["unBindPermissionBy"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/iam/permission/bind": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: operations["bindPermissionBy"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/iam/me": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations["currentUser"]; + put?: never; + post: operations["upsertMe"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/iam/department/unbind": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: operations["unBindDepartmentBy"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/iam/department/bind": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: operations["bindDepartmentBy"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/department": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: operations["upsertDepartment"]; + delete: operations["deleteDepartment"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/auth/sign-up": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: operations["signUp"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/auth/sign-out": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: operations["signOut"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/auth/sign-in": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: operations["signIn"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/ai/chat": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: operations["chat"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/ai/action/chat": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: operations["actionChat"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/scheduler/page-query": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations["pageQuery"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/position/query": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations["queryPositions"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/position/page-query": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations["pageQueryPositions"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/iam/users": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations["queryUsers"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/iam/roles": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations["queryRoles"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/iam/permissions": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations["queryPermissions"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/department/query-available": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations["queryAvailableParentDepartmentsBy"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/department/page-query": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations["pageQueryDepartments"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/ai/llm/page-query": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations["pageQueryLlm"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; } export type webhooks = Record; export interface components { - schemas: { - TriggerKeyDto: { - name: string; - group: string; - }; - LlmVm: { - /** Format: int64 */ - id: number; - name: string; - modelName: string; - apiKey: string; - url: string; - enable: boolean; - /** Format: int32 */ - priority: number; - }; - JobKeyDto: { - name: string; - group: string; - }; - Position: { - /** Format: int64 */ - id?: number; - name?: string; - }; - UserUpsertDto: { - /** Format: int64 */ - id?: number; - username: string; - password?: string; - enable: boolean; - }; - RoleUpsertDto: { - /** Format: int64 */ - id?: number; - code: string; - name: string; - }; - RoleBindDto: { - /** Format: int64 */ - userId: number; - roleIds: number[]; - }; - PositionBindDto: { - /** Format: int64 */ - userId: number; - positionIds: number[]; - }; - PermissionUpsertDto: { - /** Format: int64 */ - id?: number; - code: string; - name: string; - }; - PermissionBindDto: { - /** Format: int64 */ - roleId: number; - permissionIds: number[]; - }; - DepartmentBindDto: { - /** Format: int64 */ - userId: number; - departmentIds: number[]; - }; - Department: { - /** Format: int64 */ - id?: number; - name?: string; - /** Format: int64 */ - parentId?: number; - }; - SignUpDto: { - username: string; - password: string; - }; - SignInDto: { - username: string; - password: string; - }; - PageRequestDto: { - /** Format: int64 */ - page?: number; - /** Format: int64 */ - size?: number; - /** - * @description 排序字段 - * @example name:asc,age:desc - */ - sortBy?: string; - /** Format: int64 */ - offset?: number; - sortFields?: components["schemas"]["SortFieldObject"][]; - }; - SortFieldObject: { - name?: string; - /** @enum {string} */ - order?: "ASC" | "DESC" | "DEFAULT"; - }; - QueryDto: { - name?: string; - }; - JobTriggerDto: { - name?: string; - group?: string; - className?: string; - jobDataMap?: { - [key: string]: Record; - }; - triggerName?: string; - triggerGroup?: string; - schedulerType?: string; - cronExpression?: string; - /** Format: int64 */ - startTime?: number; - /** Format: int64 */ - endTime?: number; - /** Format: int64 */ - nextFireTime?: number; - /** Format: int64 */ - previousFireTime?: number; - triggerState?: string; - triggerJobDataMap?: { - [key: string]: Record; - }; - }; - PageResponseDtoListJobTriggerDto: { - /** Format: int64 */ - total?: number; - data?: components["schemas"]["JobTriggerDto"][]; - }; - PositionQueryDto: { - /** Format: int64 */ - userId?: number; - name?: string; - /** @enum {string} */ - bindState?: "BIND" | "UNBIND" | "ALL"; - }; - PageResponseDtoListPositionRespDto: { - /** Format: int64 */ - total?: number; - data?: components["schemas"]["PositionRespDto"][]; - }; - PositionRespDto: { - /** Format: int64 */ - id: number; - name: string; - /** Format: int64 */ - parentId?: number; - isBound?: boolean; - }; - UserQueryDto: { - username?: string; - }; - PageResponseDtoListUserRolePermissionDto: { - /** Format: int64 */ - total?: number; - data?: components["schemas"]["UserRolePermissionDto"][]; - }; - PermissionRespDto: { - /** Format: int64 */ - id?: number; - code?: string; - name?: string; - isBound?: boolean; - }; - RoleDto: { - /** Format: int64 */ - id?: number; - code?: string; - name?: string; - isBound?: boolean; - permissions?: components["schemas"]["PermissionRespDto"][]; - }; - UserRolePermissionDto: { - /** Format: int64 */ - id?: number; - username?: string; - password?: string; - enable?: boolean; - roles?: components["schemas"]["RoleDto"][]; - /** Format: date-time */ - createTime?: string; - permissions?: components["schemas"]["PermissionRespDto"][]; - }; - RoleQueryDto: { - /** Format: int64 */ - userId?: number; - /** Format: int64 */ - roleId?: number; - roleCode?: string; - roleName?: string; - roleIdList?: number[]; - /** @enum {string} */ - bindState?: "BIND" | "UNBIND" | "ALL"; - }; - PageResponseDtoListRoleDto: { - /** Format: int64 */ - total?: number; - data?: components["schemas"]["RoleDto"][]; - }; - PermissionQueryDto: { - /** Format: int64 */ - roleId?: number; - /** Format: int64 */ - permissionId?: number; - permissionCode?: string; - permissionName?: string; - permissionIdList?: number[]; - /** @enum {string} */ - bindState?: "BIND" | "UNBIND" | "ALL"; - }; - PageResponseDtoListPermissionRespDto: { - /** Format: int64 */ - total?: number; - data?: components["schemas"]["PermissionRespDto"][]; - }; - DepartmentQueryDto: { - /** Format: int64 */ - userId?: number; - name?: string; - enable?: boolean; - /** @enum {string} */ - bindState?: "BIND" | "UNBIND" | "ALL"; - }; - DepartmentRespDto: { - /** Format: int64 */ - id: number; - name: string; - /** Format: int64 */ - parentId?: number; - parentName?: string; - isBound?: boolean; - }; - PageResponseDtoListDepartmentRespDto: { - /** Format: int64 */ - total?: number; - data?: components["schemas"]["DepartmentRespDto"][]; - }; - LlmQueryDto: { - name?: string; - }; - PageResponseDtoListLlmVm: { - /** Format: int64 */ - total?: number; - data?: components["schemas"]["LlmVm"][]; - }; - }; - responses: never; - parameters: never; - requestBodies: never; - headers: never; - pathItems: never; + schemas: { + TriggerKeyDto: { + name: string; + group: string; + }; + LlmVm: { + /** Format: int64 */ + id: number; + name: string; + modelName: string; + apiKey: string; + url: string; + enable: boolean; + /** Format: int32 */ + priority: number; + }; + JobKeyDto: { + name: string; + group: string; + }; + Position: { + /** Format: int64 */ + id?: number; + name?: string; + }; + UserUpsertDto: { + /** Format: int64 */ + id?: number; + username: string; + password?: string; + enable: boolean; + }; + RoleUpsertDto: { + /** Format: int64 */ + id?: number; + code: string; + name: string; + }; + RoleBindDto: { + /** Format: int64 */ + userId: number; + roleIds: number[]; + }; + PositionBindDto: { + /** Format: int64 */ + userId: number; + positionIds: number[]; + }; + PermissionUpsertDto: { + /** Format: int64 */ + id?: number; + code: string; + name: string; + }; + PermissionBindDto: { + /** Format: int64 */ + roleId: number; + permissionIds: number[]; + }; + DepartmentBindDto: { + /** Format: int64 */ + userId: number; + departmentIds: number[]; + }; + Department: { + /** Format: int64 */ + id?: number; + name?: string; + /** Format: int64 */ + parentId?: number; + }; + SignUpDto: { + username: string; + password: string; + }; + SignInDto: { + username: string; + password: string; + }; + PageRequestDto: { + /** Format: int64 */ + page?: number; + /** Format: int64 */ + size?: number; + /** + * @description 排序字段 + * @example name:asc,age:desc + */ + sortBy?: string; + /** Format: int64 */ + offset?: number; + sortFields?: components["schemas"]["SortFieldObject"][]; + }; + SortFieldObject: { + name?: string; + /** @enum {string} */ + order?: "ASC" | "DESC" | "DEFAULT"; + }; + QueryDto: { + name?: string; + }; + JobTriggerDto: { + name?: string; + group?: string; + className?: string; + jobDataMap?: { + [key: string]: Record; + }; + triggerName?: string; + triggerGroup?: string; + schedulerType?: string; + cronExpression?: string; + /** Format: int64 */ + startTime?: number; + /** Format: int64 */ + endTime?: number; + /** Format: int64 */ + nextFireTime?: number; + /** Format: int64 */ + previousFireTime?: number; + triggerState?: string; + triggerJobDataMap?: { + [key: string]: Record; + }; + }; + PageResponseDtoListJobTriggerDto: { + /** Format: int64 */ + total?: number; + data?: components["schemas"]["JobTriggerDto"][]; + }; + PositionQueryDto: { + /** Format: int64 */ + userId?: number; + name?: string; + /** @enum {string} */ + bindState?: "BIND" | "UNBIND" | "ALL"; + }; + PageResponseDtoListPositionRespDto: { + /** Format: int64 */ + total?: number; + data?: components["schemas"]["PositionRespDto"][]; + }; + PositionRespDto: { + /** Format: int64 */ + id: number; + name: string; + /** Format: int64 */ + parentId?: number; + isBound?: boolean; + }; + UserQueryDto: { + username?: string; + }; + PageResponseDtoListUserRolePermissionDto: { + /** Format: int64 */ + total?: number; + data?: components["schemas"]["UserRolePermissionDto"][]; + }; + PermissionRespDto: { + /** Format: int64 */ + id?: number; + code?: string; + name?: string; + isBound?: boolean; + }; + RoleDto: { + /** Format: int64 */ + id?: number; + code?: string; + name?: string; + isBound?: boolean; + permissions?: components["schemas"]["PermissionRespDto"][]; + }; + UserRolePermissionDto: { + /** Format: int64 */ + id?: number; + username?: string; + password?: string; + enable?: boolean; + roles?: components["schemas"]["RoleDto"][]; + /** Format: date-time */ + createTime?: string; + permissions?: components["schemas"]["PermissionRespDto"][]; + }; + RoleQueryDto: { + /** Format: int64 */ + userId?: number; + /** Format: int64 */ + roleId?: number; + roleCode?: string; + roleName?: string; + roleIdList?: number[]; + /** @enum {string} */ + bindState?: "BIND" | "UNBIND" | "ALL"; + }; + PageResponseDtoListRoleDto: { + /** Format: int64 */ + total?: number; + data?: components["schemas"]["RoleDto"][]; + }; + PermissionQueryDto: { + /** Format: int64 */ + roleId?: number; + /** Format: int64 */ + permissionId?: number; + permissionCode?: string; + permissionName?: string; + permissionIdList?: number[]; + /** @enum {string} */ + bindState?: "BIND" | "UNBIND" | "ALL"; + }; + PageResponseDtoListPermissionRespDto: { + /** Format: int64 */ + total?: number; + data?: components["schemas"]["PermissionRespDto"][]; + }; + DepartmentQueryDto: { + /** Format: int64 */ + userId?: number; + name?: string; + enable?: boolean; + /** @enum {string} */ + bindState?: "BIND" | "UNBIND" | "ALL"; + }; + DepartmentRespDto: { + /** Format: int64 */ + id: number; + name: string; + /** Format: int64 */ + parentId?: number; + parentName?: string; + isBound?: boolean; + }; + PageResponseDtoListDepartmentRespDto: { + /** Format: int64 */ + total?: number; + data?: components["schemas"]["DepartmentRespDto"][]; + }; + LlmQueryDto: { + name?: string; + type?: string; + }; + PageResponseDtoListLlmVm: { + /** Format: int64 */ + total?: number; + data?: components["schemas"]["LlmVm"][]; + }; + }; + responses: never; + parameters: never; + requestBodies: never; + headers: never; + pathItems: never; } export type $defs = Record; export interface operations { - updateJob: { - parameters: { - query: { - cron: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["TriggerKeyDto"]; - }; - }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - updateLlm: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["LlmVm"]; - }; - }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - resumeTrigger: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["TriggerKeyDto"]; - }; - }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - pauseTrigger: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["TriggerKeyDto"]; - }; - }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - triggerJob: { - parameters: { - query: { - startAt: number; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["JobKeyDto"]; - }; - }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - upsertPosition: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["Position"]; - }; - }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - deletePosition: { - parameters: { - query: { - id: number; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - queryUserWithRolePermission: { - parameters: { - query: { - userId: number; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "*/*": components["schemas"]["UserRolePermissionDto"]; - }; - }; - }; - }; - upsertUser: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["UserUpsertDto"]; - }; - }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - deleteUser: { - parameters: { - query: { - userId: number; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - queryRoleWithPermission: { - parameters: { - query: { - roleId: number; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "*/*": components["schemas"]["RoleDto"]; - }; - }; - }; - }; - upsertRole: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["RoleUpsertDto"]; - }; - }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - deleteRole: { - parameters: { - query: { - roleId: number; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - unBindRoleBy: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["RoleBindDto"]; - }; - }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - bindRoleBy: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["RoleBindDto"]; - }; - }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - unBindPositionBy: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["PositionBindDto"]; - }; - }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - bindPositionBy: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["PositionBindDto"]; - }; - }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - upsertPermission: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["PermissionUpsertDto"]; - }; - }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - deletePermission: { - parameters: { - query: { - permissionId: number; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - unBindPermissionBy: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["PermissionBindDto"]; - }; - }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - bindPermissionBy: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["PermissionBindDto"]; - }; - }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - currentUser: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "*/*": components["schemas"]["UserRolePermissionDto"]; - }; - }; - }; - }; - upsertMe: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["UserUpsertDto"]; - }; - }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - unBindDepartmentBy: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["DepartmentBindDto"]; - }; - }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - bindDepartmentBy: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["DepartmentBindDto"]; - }; - }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - upsertDepartment: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["Department"]; - }; - }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - deleteDepartment: { - parameters: { - query: { - id: number; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - signUp: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["SignUpDto"]; - }; - }; - responses: { - /** @description Created */ - 201: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - signOut: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - signIn: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["SignInDto"]; - }; - }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - chat: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": string; - }; - }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "text/event-stream": string[]; - }; - }; - }; - }; - pageQuery: { - parameters: { - query: { - pageRequestDto: components["schemas"]["PageRequestDto"]; - queryDto: components["schemas"]["QueryDto"]; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "*/*": components["schemas"]["PageResponseDtoListJobTriggerDto"]; - }; - }; - }; - }; - queryPositions: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "*/*": components["schemas"]["Position"][]; - }; - }; - }; - }; - pageQueryPositions: { - parameters: { - query: { - pageRequestDto: components["schemas"]["PageRequestDto"]; - positionQueryDto: components["schemas"]["PositionQueryDto"]; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "*/*": components["schemas"]["PageResponseDtoListPositionRespDto"]; - }; - }; - }; - }; - queryUsers: { - parameters: { - query: { - pageRequestDto: components["schemas"]["PageRequestDto"]; - userQueryDto: components["schemas"]["UserQueryDto"]; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "*/*": components["schemas"]["PageResponseDtoListUserRolePermissionDto"]; - }; - }; - }; - }; - queryRoles: { - parameters: { - query: { - pageRequestDto: components["schemas"]["PageRequestDto"]; - roleQueryDto: components["schemas"]["RoleQueryDto"]; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "*/*": components["schemas"]["PageResponseDtoListRoleDto"]; - }; - }; - }; - }; - queryPermissions: { - parameters: { - query: { - pageRequestDto: components["schemas"]["PageRequestDto"]; - permissionQueryDto: components["schemas"]["PermissionQueryDto"]; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "*/*": components["schemas"]["PageResponseDtoListPermissionRespDto"]; - }; - }; - }; - }; - queryAvailableParentDepartmentsBy: { - parameters: { - query?: { - id?: number; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "*/*": components["schemas"]["Department"][]; - }; - }; - }; - }; - pageQueryDepartments: { - parameters: { - query: { - pageRequestDto: components["schemas"]["PageRequestDto"]; - departmentQueryDto: components["schemas"]["DepartmentQueryDto"]; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "*/*": components["schemas"]["PageResponseDtoListDepartmentRespDto"]; - }; - }; - }; - }; - pageQueryLlm: { - parameters: { - query: { - pageRequestDto: components["schemas"]["PageRequestDto"]; - llmQueryDto: components["schemas"]["LlmQueryDto"]; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "*/*": components["schemas"]["PageResponseDtoListLlmVm"]; - }; - }; - }; - }; + updateJob: { + parameters: { + query: { + cron: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["TriggerKeyDto"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + updateLlm: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["LlmVm"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + resumeTrigger: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["TriggerKeyDto"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + pauseTrigger: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["TriggerKeyDto"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + triggerJob: { + parameters: { + query: { + startAt: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["JobKeyDto"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + upsertPosition: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["Position"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + deletePosition: { + parameters: { + query: { + id: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + queryUserWithRolePermission: { + parameters: { + query: { + userId: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["UserRolePermissionDto"]; + }; + }; + }; + }; + upsertUser: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["UserUpsertDto"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + deleteUser: { + parameters: { + query: { + userId: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + queryRoleWithPermission: { + parameters: { + query: { + roleId: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["RoleDto"]; + }; + }; + }; + }; + upsertRole: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["RoleUpsertDto"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + deleteRole: { + parameters: { + query: { + roleId: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + unBindRoleBy: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["RoleBindDto"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + bindRoleBy: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["RoleBindDto"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + unBindPositionBy: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["PositionBindDto"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + bindPositionBy: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["PositionBindDto"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + upsertPermission: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["PermissionUpsertDto"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + deletePermission: { + parameters: { + query: { + permissionId: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + unBindPermissionBy: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["PermissionBindDto"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + bindPermissionBy: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["PermissionBindDto"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + currentUser: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["UserRolePermissionDto"]; + }; + }; + }; + }; + upsertMe: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["UserUpsertDto"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + unBindDepartmentBy: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["DepartmentBindDto"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + bindDepartmentBy: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["DepartmentBindDto"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + upsertDepartment: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["Department"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + deleteDepartment: { + parameters: { + query: { + id: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + signUp: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["SignUpDto"]; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + signOut: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + signIn: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["SignInDto"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + chat: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": string; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "text/event-stream": string[]; + }; + }; + }; + }; + actionChat: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": string; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": { + [key: string]: Record; + }; + }; + }; + }; + }; + pageQuery: { + parameters: { + query: { + pageRequestDto: components["schemas"]["PageRequestDto"]; + queryDto: components["schemas"]["QueryDto"]; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["PageResponseDtoListJobTriggerDto"]; + }; + }; + }; + }; + queryPositions: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["Position"][]; + }; + }; + }; + }; + pageQueryPositions: { + parameters: { + query: { + pageRequestDto: components["schemas"]["PageRequestDto"]; + positionQueryDto: components["schemas"]["PositionQueryDto"]; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["PageResponseDtoListPositionRespDto"]; + }; + }; + }; + }; + queryUsers: { + parameters: { + query: { + pageRequestDto: components["schemas"]["PageRequestDto"]; + userQueryDto: components["schemas"]["UserQueryDto"]; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["PageResponseDtoListUserRolePermissionDto"]; + }; + }; + }; + }; + queryRoles: { + parameters: { + query: { + pageRequestDto: components["schemas"]["PageRequestDto"]; + roleQueryDto: components["schemas"]["RoleQueryDto"]; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["PageResponseDtoListRoleDto"]; + }; + }; + }; + }; + queryPermissions: { + parameters: { + query: { + pageRequestDto: components["schemas"]["PageRequestDto"]; + permissionQueryDto: components["schemas"]["PermissionQueryDto"]; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["PageResponseDtoListPermissionRespDto"]; + }; + }; + }; + }; + queryAvailableParentDepartmentsBy: { + parameters: { + query?: { + id?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["Department"][]; + }; + }; + }; + }; + pageQueryDepartments: { + parameters: { + query: { + pageRequestDto: components["schemas"]["PageRequestDto"]; + departmentQueryDto: components["schemas"]["DepartmentQueryDto"]; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["PageResponseDtoListDepartmentRespDto"]; + }; + }; + }; + }; + pageQueryLlm: { + parameters: { + query: { + pageRequestDto: components["schemas"]["PageRequestDto"]; + llmQueryDto: components["schemas"]["LlmQueryDto"]; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["PageResponseDtoListLlmVm"]; + }; + }; + }; + }; } From 402c42137017039394bb671e43ca8accc61dce0c Mon Sep 17 00:00:00 2001 From: Chuck1sn Date: Sun, 25 May 2025 18:17:50 +0800 Subject: [PATCH 3/9] llm config fix --- backend/src/main/java/com/zl/mjga/dto/ai/LlmVm.java | 2 ++ .../java/com/zl/mjga/repository/LlmRepository.java | 3 ++- .../src/main/java/com/zl/mjga/service/LlmService.java | 8 +++++++- frontend/src/api/schema/openapi.json | 4 ++++ frontend/src/api/types/schema.d.ts | 1 + frontend/src/components/LlmUpdateModal.vue | 11 +++++++++++ frontend/src/composables/ai/useAiAction.ts | 11 +++++++++++ frontend/src/views/LlmConfigView.vue | 4 ++++ 8 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 frontend/src/composables/ai/useAiAction.ts diff --git a/backend/src/main/java/com/zl/mjga/dto/ai/LlmVm.java b/backend/src/main/java/com/zl/mjga/dto/ai/LlmVm.java index a188528..554fc07 100644 --- a/backend/src/main/java/com/zl/mjga/dto/ai/LlmVm.java +++ b/backend/src/main/java/com/zl/mjga/dto/ai/LlmVm.java @@ -12,6 +12,8 @@ public class LlmVm { @NotEmpty(message = "模型名称不能为空") private String modelName; + @NotEmpty(message = "模型类型不能为空") private String type; + @NotEmpty(message = "apikey 不能为空") private String apiKey; @NotEmpty(message = "url 不能为空") private String url; diff --git a/backend/src/main/java/com/zl/mjga/repository/LlmRepository.java b/backend/src/main/java/com/zl/mjga/repository/LlmRepository.java index ff23bde..b0b4d61 100644 --- a/backend/src/main/java/com/zl/mjga/repository/LlmRepository.java +++ b/backend/src/main/java/com/zl/mjga/repository/LlmRepository.java @@ -26,7 +26,8 @@ public class LlmRepository extends AiLlmConfigDao { public Result pageFetchBy(PageRequestDto pageRequestDto, LlmQueryDto llmQueryDto) { return ctx() .select( - AI_LLM_CONFIG.asterisk(), DSL.count().over().as("total_llm").convertFrom(Long::valueOf)) + AI_LLM_CONFIG.asterisk(), + DSL.count().over().as("total_llm").convertFrom(Long::valueOf)) .from(AI_LLM_CONFIG) .where( StringUtils.isNotEmpty(llmQueryDto.name()) diff --git a/backend/src/main/java/com/zl/mjga/service/LlmService.java b/backend/src/main/java/com/zl/mjga/service/LlmService.java index d90a2ba..3ab30d9 100644 --- a/backend/src/main/java/com/zl/mjga/service/LlmService.java +++ b/backend/src/main/java/com/zl/mjga/service/LlmService.java @@ -18,6 +18,8 @@ import org.jooq.generated.mjga.tables.pojos.AiLlmConfig; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; +import static org.jooq.generated.mjga.Tables.AI_LLM_CONFIG; + @Service @RequiredArgsConstructor @Slf4j @@ -42,7 +44,11 @@ public class LlmService { if (records.isEmpty()) { return PageResponseDto.empty(); } - List llmVms = records.into(LlmVm.class); + List llmVms = records.map((record) -> { + LlmVm into = record.into(LlmVm.class); + into.setType(record.get(AI_LLM_CONFIG.TYPE).getLiteral()); + return into; + }); Long totalLlm = records.get(0).getValue("total_llm", Long.class); return new PageResponseDto<>(totalLlm, llmVms); } diff --git a/frontend/src/api/schema/openapi.json b/frontend/src/api/schema/openapi.json index bffdf22..c947a72 100644 --- a/frontend/src/api/schema/openapi.json +++ b/frontend/src/api/schema/openapi.json @@ -1129,6 +1129,7 @@ "modelName", "name", "priority", + "type", "url" ], "type": "object", @@ -1143,6 +1144,9 @@ "modelName": { "type": "string" }, + "type": { + "type": "string" + }, "apiKey": { "type": "string" }, diff --git a/frontend/src/api/types/schema.d.ts b/frontend/src/api/types/schema.d.ts index 6045993..c0edb20 100644 --- a/frontend/src/api/types/schema.d.ts +++ b/frontend/src/api/types/schema.d.ts @@ -545,6 +545,7 @@ export interface components { id: number; name: string; modelName: string; + type: string; apiKey: string; url: string; enable: boolean; diff --git a/frontend/src/components/LlmUpdateModal.vue b/frontend/src/components/LlmUpdateModal.vue index 40efce4..bb70572 100644 --- a/frontend/src/components/LlmUpdateModal.vue +++ b/frontend/src/components/LlmUpdateModal.vue @@ -34,6 +34,14 @@ class="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 " required /> +
+ + +
{ priority: z.number({ message: "优先级必须为数字", }), + type: z.string({ + message: "类型不能为空", + }), }); const validatedData = llmSchema.parse(formData.value); await onSubmit(validatedData); diff --git a/frontend/src/composables/ai/useAiAction.ts b/frontend/src/composables/ai/useAiAction.ts new file mode 100644 index 0000000..d11e06c --- /dev/null +++ b/frontend/src/composables/ai/useAiAction.ts @@ -0,0 +1,11 @@ +import client from "../../api/client"; + +const useAiAction = () => { + const actionChat = (message: string) => { + return client.POST("/ai/action/chat", { + body: message, + }); + }; + + return { actionChat }; +}; diff --git a/frontend/src/views/LlmConfigView.vue b/frontend/src/views/LlmConfigView.vue index 41cbefd..d311541 100644 --- a/frontend/src/views/LlmConfigView.vue +++ b/frontend/src/views/LlmConfigView.vue @@ -40,6 +40,7 @@ 名称 模型名称 + 类型 apiKey url 状态 @@ -62,6 +63,9 @@ {{ `${llm.modelName}` }} + {{ + llm.type === 'CHAT' ? '聊天' : '嵌入' }} + {{ llm.apiKey }} From dde5fecd62612019c4a8a9c654b58ee754f927d9 Mon Sep 17 00:00:00 2001 From: Chuck1sn Date: Sun, 25 May 2025 21:09:04 +0800 Subject: [PATCH 4/9] fix command chat --- frontend/src/api/types/schema.d.ts | 3366 ++++++++++---------- frontend/src/composables/ai/useAiAction.ts | 11 - frontend/src/composables/ai/useAiChat.ts | 19 +- frontend/src/utils/errorHandler.ts | 7 +- frontend/src/views/AiChatView.vue | 50 +- 5 files changed, 1743 insertions(+), 1710 deletions(-) delete mode 100644 frontend/src/composables/ai/useAiAction.ts diff --git a/frontend/src/api/types/schema.d.ts b/frontend/src/api/types/schema.d.ts index c0edb20..dd2d7e2 100644 --- a/frontend/src/api/types/schema.d.ts +++ b/frontend/src/api/types/schema.d.ts @@ -4,1693 +4,1693 @@ */ export interface paths { - "/scheduler/job/update": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put: operations["updateJob"]; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/ai/llm": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put: operations["updateLlm"]; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/scheduler/trigger/resume": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: operations["resumeTrigger"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/scheduler/trigger/pause": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: operations["pauseTrigger"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/scheduler/job/trigger": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: operations["triggerJob"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/position": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: operations["upsertPosition"]; - delete: operations["deletePosition"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/iam/user": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: operations["queryUserWithRolePermission"]; - put?: never; - post: operations["upsertUser"]; - delete: operations["deleteUser"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/iam/role": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: operations["queryRoleWithPermission"]; - put?: never; - post: operations["upsertRole"]; - delete: operations["deleteRole"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/iam/role/unbind": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: operations["unBindRoleBy"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/iam/role/bind": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: operations["bindRoleBy"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/iam/position/unbind": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: operations["unBindPositionBy"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/iam/position/bind": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: operations["bindPositionBy"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/iam/permission": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: operations["upsertPermission"]; - delete: operations["deletePermission"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/iam/permission/unbind": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: operations["unBindPermissionBy"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/iam/permission/bind": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: operations["bindPermissionBy"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/iam/me": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: operations["currentUser"]; - put?: never; - post: operations["upsertMe"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/iam/department/unbind": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: operations["unBindDepartmentBy"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/iam/department/bind": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: operations["bindDepartmentBy"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/department": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: operations["upsertDepartment"]; - delete: operations["deleteDepartment"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/auth/sign-up": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: operations["signUp"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/auth/sign-out": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: operations["signOut"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/auth/sign-in": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: operations["signIn"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/ai/chat": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: operations["chat"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/ai/action/chat": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post: operations["actionChat"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/scheduler/page-query": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: operations["pageQuery"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/position/query": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: operations["queryPositions"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/position/page-query": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: operations["pageQueryPositions"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/iam/users": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: operations["queryUsers"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/iam/roles": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: operations["queryRoles"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/iam/permissions": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: operations["queryPermissions"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/department/query-available": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: operations["queryAvailableParentDepartmentsBy"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/department/page-query": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: operations["pageQueryDepartments"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/ai/llm/page-query": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: operations["pageQueryLlm"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; + "/scheduler/job/update": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put: operations["updateJob"]; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/ai/llm": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put: operations["updateLlm"]; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/scheduler/trigger/resume": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: operations["resumeTrigger"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/scheduler/trigger/pause": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: operations["pauseTrigger"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/scheduler/job/trigger": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: operations["triggerJob"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/position": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: operations["upsertPosition"]; + delete: operations["deletePosition"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/iam/user": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations["queryUserWithRolePermission"]; + put?: never; + post: operations["upsertUser"]; + delete: operations["deleteUser"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/iam/role": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations["queryRoleWithPermission"]; + put?: never; + post: operations["upsertRole"]; + delete: operations["deleteRole"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/iam/role/unbind": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: operations["unBindRoleBy"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/iam/role/bind": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: operations["bindRoleBy"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/iam/position/unbind": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: operations["unBindPositionBy"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/iam/position/bind": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: operations["bindPositionBy"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/iam/permission": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: operations["upsertPermission"]; + delete: operations["deletePermission"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/iam/permission/unbind": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: operations["unBindPermissionBy"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/iam/permission/bind": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: operations["bindPermissionBy"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/iam/me": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations["currentUser"]; + put?: never; + post: operations["upsertMe"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/iam/department/unbind": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: operations["unBindDepartmentBy"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/iam/department/bind": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: operations["bindDepartmentBy"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/department": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: operations["upsertDepartment"]; + delete: operations["deleteDepartment"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/auth/sign-up": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: operations["signUp"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/auth/sign-out": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: operations["signOut"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/auth/sign-in": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: operations["signIn"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/ai/chat": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: operations["chat"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/ai/action/chat": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: operations["actionChat"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/scheduler/page-query": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations["pageQuery"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/position/query": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations["queryPositions"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/position/page-query": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations["pageQueryPositions"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/iam/users": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations["queryUsers"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/iam/roles": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations["queryRoles"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/iam/permissions": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations["queryPermissions"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/department/query-available": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations["queryAvailableParentDepartmentsBy"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/department/page-query": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations["pageQueryDepartments"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/ai/llm/page-query": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations["pageQueryLlm"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; } export type webhooks = Record; export interface components { - schemas: { - TriggerKeyDto: { - name: string; - group: string; - }; - LlmVm: { - /** Format: int64 */ - id: number; - name: string; - modelName: string; - type: string; - apiKey: string; - url: string; - enable: boolean; - /** Format: int32 */ - priority: number; - }; - JobKeyDto: { - name: string; - group: string; - }; - Position: { - /** Format: int64 */ - id?: number; - name?: string; - }; - UserUpsertDto: { - /** Format: int64 */ - id?: number; - username: string; - password?: string; - enable: boolean; - }; - RoleUpsertDto: { - /** Format: int64 */ - id?: number; - code: string; - name: string; - }; - RoleBindDto: { - /** Format: int64 */ - userId: number; - roleIds: number[]; - }; - PositionBindDto: { - /** Format: int64 */ - userId: number; - positionIds: number[]; - }; - PermissionUpsertDto: { - /** Format: int64 */ - id?: number; - code: string; - name: string; - }; - PermissionBindDto: { - /** Format: int64 */ - roleId: number; - permissionIds: number[]; - }; - DepartmentBindDto: { - /** Format: int64 */ - userId: number; - departmentIds: number[]; - }; - Department: { - /** Format: int64 */ - id?: number; - name?: string; - /** Format: int64 */ - parentId?: number; - }; - SignUpDto: { - username: string; - password: string; - }; - SignInDto: { - username: string; - password: string; - }; - PageRequestDto: { - /** Format: int64 */ - page?: number; - /** Format: int64 */ - size?: number; - /** - * @description 排序字段 - * @example name:asc,age:desc - */ - sortBy?: string; - /** Format: int64 */ - offset?: number; - sortFields?: components["schemas"]["SortFieldObject"][]; - }; - SortFieldObject: { - name?: string; - /** @enum {string} */ - order?: "ASC" | "DESC" | "DEFAULT"; - }; - QueryDto: { - name?: string; - }; - JobTriggerDto: { - name?: string; - group?: string; - className?: string; - jobDataMap?: { - [key: string]: Record; - }; - triggerName?: string; - triggerGroup?: string; - schedulerType?: string; - cronExpression?: string; - /** Format: int64 */ - startTime?: number; - /** Format: int64 */ - endTime?: number; - /** Format: int64 */ - nextFireTime?: number; - /** Format: int64 */ - previousFireTime?: number; - triggerState?: string; - triggerJobDataMap?: { - [key: string]: Record; - }; - }; - PageResponseDtoListJobTriggerDto: { - /** Format: int64 */ - total?: number; - data?: components["schemas"]["JobTriggerDto"][]; - }; - PositionQueryDto: { - /** Format: int64 */ - userId?: number; - name?: string; - /** @enum {string} */ - bindState?: "BIND" | "UNBIND" | "ALL"; - }; - PageResponseDtoListPositionRespDto: { - /** Format: int64 */ - total?: number; - data?: components["schemas"]["PositionRespDto"][]; - }; - PositionRespDto: { - /** Format: int64 */ - id: number; - name: string; - /** Format: int64 */ - parentId?: number; - isBound?: boolean; - }; - UserQueryDto: { - username?: string; - }; - PageResponseDtoListUserRolePermissionDto: { - /** Format: int64 */ - total?: number; - data?: components["schemas"]["UserRolePermissionDto"][]; - }; - PermissionRespDto: { - /** Format: int64 */ - id?: number; - code?: string; - name?: string; - isBound?: boolean; - }; - RoleDto: { - /** Format: int64 */ - id?: number; - code?: string; - name?: string; - isBound?: boolean; - permissions?: components["schemas"]["PermissionRespDto"][]; - }; - UserRolePermissionDto: { - /** Format: int64 */ - id?: number; - username?: string; - password?: string; - enable?: boolean; - roles?: components["schemas"]["RoleDto"][]; - /** Format: date-time */ - createTime?: string; - permissions?: components["schemas"]["PermissionRespDto"][]; - }; - RoleQueryDto: { - /** Format: int64 */ - userId?: number; - /** Format: int64 */ - roleId?: number; - roleCode?: string; - roleName?: string; - roleIdList?: number[]; - /** @enum {string} */ - bindState?: "BIND" | "UNBIND" | "ALL"; - }; - PageResponseDtoListRoleDto: { - /** Format: int64 */ - total?: number; - data?: components["schemas"]["RoleDto"][]; - }; - PermissionQueryDto: { - /** Format: int64 */ - roleId?: number; - /** Format: int64 */ - permissionId?: number; - permissionCode?: string; - permissionName?: string; - permissionIdList?: number[]; - /** @enum {string} */ - bindState?: "BIND" | "UNBIND" | "ALL"; - }; - PageResponseDtoListPermissionRespDto: { - /** Format: int64 */ - total?: number; - data?: components["schemas"]["PermissionRespDto"][]; - }; - DepartmentQueryDto: { - /** Format: int64 */ - userId?: number; - name?: string; - enable?: boolean; - /** @enum {string} */ - bindState?: "BIND" | "UNBIND" | "ALL"; - }; - DepartmentRespDto: { - /** Format: int64 */ - id: number; - name: string; - /** Format: int64 */ - parentId?: number; - parentName?: string; - isBound?: boolean; - }; - PageResponseDtoListDepartmentRespDto: { - /** Format: int64 */ - total?: number; - data?: components["schemas"]["DepartmentRespDto"][]; - }; - LlmQueryDto: { - name?: string; - type?: string; - }; - PageResponseDtoListLlmVm: { - /** Format: int64 */ - total?: number; - data?: components["schemas"]["LlmVm"][]; - }; - }; - responses: never; - parameters: never; - requestBodies: never; - headers: never; - pathItems: never; + schemas: { + TriggerKeyDto: { + name: string; + group: string; + }; + LlmVm: { + /** Format: int64 */ + id: number; + name: string; + modelName: string; + type: string; + apiKey: string; + url: string; + enable: boolean; + /** Format: int32 */ + priority: number; + }; + JobKeyDto: { + name: string; + group: string; + }; + Position: { + /** Format: int64 */ + id?: number; + name?: string; + }; + UserUpsertDto: { + /** Format: int64 */ + id?: number; + username: string; + password?: string; + enable: boolean; + }; + RoleUpsertDto: { + /** Format: int64 */ + id?: number; + code: string; + name: string; + }; + RoleBindDto: { + /** Format: int64 */ + userId: number; + roleIds: number[]; + }; + PositionBindDto: { + /** Format: int64 */ + userId: number; + positionIds: number[]; + }; + PermissionUpsertDto: { + /** Format: int64 */ + id?: number; + code: string; + name: string; + }; + PermissionBindDto: { + /** Format: int64 */ + roleId: number; + permissionIds: number[]; + }; + DepartmentBindDto: { + /** Format: int64 */ + userId: number; + departmentIds: number[]; + }; + Department: { + /** Format: int64 */ + id?: number; + name?: string; + /** Format: int64 */ + parentId?: number; + }; + SignUpDto: { + username: string; + password: string; + }; + SignInDto: { + username: string; + password: string; + }; + PageRequestDto: { + /** Format: int64 */ + page?: number; + /** Format: int64 */ + size?: number; + /** + * @description 排序字段 + * @example name:asc,age:desc + */ + sortBy?: string; + /** Format: int64 */ + offset?: number; + sortFields?: components["schemas"]["SortFieldObject"][]; + }; + SortFieldObject: { + name?: string; + /** @enum {string} */ + order?: "ASC" | "DESC" | "DEFAULT"; + }; + QueryDto: { + name?: string; + }; + JobTriggerDto: { + name?: string; + group?: string; + className?: string; + jobDataMap?: { + [key: string]: Record; + }; + triggerName?: string; + triggerGroup?: string; + schedulerType?: string; + cronExpression?: string; + /** Format: int64 */ + startTime?: number; + /** Format: int64 */ + endTime?: number; + /** Format: int64 */ + nextFireTime?: number; + /** Format: int64 */ + previousFireTime?: number; + triggerState?: string; + triggerJobDataMap?: { + [key: string]: Record; + }; + }; + PageResponseDtoListJobTriggerDto: { + /** Format: int64 */ + total?: number; + data?: components["schemas"]["JobTriggerDto"][]; + }; + PositionQueryDto: { + /** Format: int64 */ + userId?: number; + name?: string; + /** @enum {string} */ + bindState?: "BIND" | "UNBIND" | "ALL"; + }; + PageResponseDtoListPositionRespDto: { + /** Format: int64 */ + total?: number; + data?: components["schemas"]["PositionRespDto"][]; + }; + PositionRespDto: { + /** Format: int64 */ + id: number; + name: string; + /** Format: int64 */ + parentId?: number; + isBound?: boolean; + }; + UserQueryDto: { + username?: string; + }; + PageResponseDtoListUserRolePermissionDto: { + /** Format: int64 */ + total?: number; + data?: components["schemas"]["UserRolePermissionDto"][]; + }; + PermissionRespDto: { + /** Format: int64 */ + id?: number; + code?: string; + name?: string; + isBound?: boolean; + }; + RoleDto: { + /** Format: int64 */ + id?: number; + code?: string; + name?: string; + isBound?: boolean; + permissions?: components["schemas"]["PermissionRespDto"][]; + }; + UserRolePermissionDto: { + /** Format: int64 */ + id?: number; + username?: string; + password?: string; + enable?: boolean; + roles?: components["schemas"]["RoleDto"][]; + /** Format: date-time */ + createTime?: string; + permissions?: components["schemas"]["PermissionRespDto"][]; + }; + RoleQueryDto: { + /** Format: int64 */ + userId?: number; + /** Format: int64 */ + roleId?: number; + roleCode?: string; + roleName?: string; + roleIdList?: number[]; + /** @enum {string} */ + bindState?: "BIND" | "UNBIND" | "ALL"; + }; + PageResponseDtoListRoleDto: { + /** Format: int64 */ + total?: number; + data?: components["schemas"]["RoleDto"][]; + }; + PermissionQueryDto: { + /** Format: int64 */ + roleId?: number; + /** Format: int64 */ + permissionId?: number; + permissionCode?: string; + permissionName?: string; + permissionIdList?: number[]; + /** @enum {string} */ + bindState?: "BIND" | "UNBIND" | "ALL"; + }; + PageResponseDtoListPermissionRespDto: { + /** Format: int64 */ + total?: number; + data?: components["schemas"]["PermissionRespDto"][]; + }; + DepartmentQueryDto: { + /** Format: int64 */ + userId?: number; + name?: string; + enable?: boolean; + /** @enum {string} */ + bindState?: "BIND" | "UNBIND" | "ALL"; + }; + DepartmentRespDto: { + /** Format: int64 */ + id: number; + name: string; + /** Format: int64 */ + parentId?: number; + parentName?: string; + isBound?: boolean; + }; + PageResponseDtoListDepartmentRespDto: { + /** Format: int64 */ + total?: number; + data?: components["schemas"]["DepartmentRespDto"][]; + }; + LlmQueryDto: { + name?: string; + type?: string; + }; + PageResponseDtoListLlmVm: { + /** Format: int64 */ + total?: number; + data?: components["schemas"]["LlmVm"][]; + }; + }; + responses: never; + parameters: never; + requestBodies: never; + headers: never; + pathItems: never; } export type $defs = Record; export interface operations { - updateJob: { - parameters: { - query: { - cron: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["TriggerKeyDto"]; - }; - }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - updateLlm: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["LlmVm"]; - }; - }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - resumeTrigger: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["TriggerKeyDto"]; - }; - }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - pauseTrigger: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["TriggerKeyDto"]; - }; - }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - triggerJob: { - parameters: { - query: { - startAt: number; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["JobKeyDto"]; - }; - }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - upsertPosition: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["Position"]; - }; - }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - deletePosition: { - parameters: { - query: { - id: number; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - queryUserWithRolePermission: { - parameters: { - query: { - userId: number; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "*/*": components["schemas"]["UserRolePermissionDto"]; - }; - }; - }; - }; - upsertUser: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["UserUpsertDto"]; - }; - }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - deleteUser: { - parameters: { - query: { - userId: number; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - queryRoleWithPermission: { - parameters: { - query: { - roleId: number; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "*/*": components["schemas"]["RoleDto"]; - }; - }; - }; - }; - upsertRole: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["RoleUpsertDto"]; - }; - }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - deleteRole: { - parameters: { - query: { - roleId: number; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - unBindRoleBy: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["RoleBindDto"]; - }; - }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - bindRoleBy: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["RoleBindDto"]; - }; - }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - unBindPositionBy: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["PositionBindDto"]; - }; - }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - bindPositionBy: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["PositionBindDto"]; - }; - }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - upsertPermission: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["PermissionUpsertDto"]; - }; - }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - deletePermission: { - parameters: { - query: { - permissionId: number; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - unBindPermissionBy: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["PermissionBindDto"]; - }; - }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - bindPermissionBy: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["PermissionBindDto"]; - }; - }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - currentUser: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "*/*": components["schemas"]["UserRolePermissionDto"]; - }; - }; - }; - }; - upsertMe: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["UserUpsertDto"]; - }; - }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - unBindDepartmentBy: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["DepartmentBindDto"]; - }; - }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - bindDepartmentBy: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["DepartmentBindDto"]; - }; - }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - upsertDepartment: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["Department"]; - }; - }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - deleteDepartment: { - parameters: { - query: { - id: number; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - signUp: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["SignUpDto"]; - }; - }; - responses: { - /** @description Created */ - 201: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - signOut: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - signIn: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["SignInDto"]; - }; - }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - chat: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": string; - }; - }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "text/event-stream": string[]; - }; - }; - }; - }; - actionChat: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": string; - }; - }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "*/*": { - [key: string]: Record; - }; - }; - }; - }; - }; - pageQuery: { - parameters: { - query: { - pageRequestDto: components["schemas"]["PageRequestDto"]; - queryDto: components["schemas"]["QueryDto"]; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "*/*": components["schemas"]["PageResponseDtoListJobTriggerDto"]; - }; - }; - }; - }; - queryPositions: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "*/*": components["schemas"]["Position"][]; - }; - }; - }; - }; - pageQueryPositions: { - parameters: { - query: { - pageRequestDto: components["schemas"]["PageRequestDto"]; - positionQueryDto: components["schemas"]["PositionQueryDto"]; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "*/*": components["schemas"]["PageResponseDtoListPositionRespDto"]; - }; - }; - }; - }; - queryUsers: { - parameters: { - query: { - pageRequestDto: components["schemas"]["PageRequestDto"]; - userQueryDto: components["schemas"]["UserQueryDto"]; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "*/*": components["schemas"]["PageResponseDtoListUserRolePermissionDto"]; - }; - }; - }; - }; - queryRoles: { - parameters: { - query: { - pageRequestDto: components["schemas"]["PageRequestDto"]; - roleQueryDto: components["schemas"]["RoleQueryDto"]; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "*/*": components["schemas"]["PageResponseDtoListRoleDto"]; - }; - }; - }; - }; - queryPermissions: { - parameters: { - query: { - pageRequestDto: components["schemas"]["PageRequestDto"]; - permissionQueryDto: components["schemas"]["PermissionQueryDto"]; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "*/*": components["schemas"]["PageResponseDtoListPermissionRespDto"]; - }; - }; - }; - }; - queryAvailableParentDepartmentsBy: { - parameters: { - query?: { - id?: number; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "*/*": components["schemas"]["Department"][]; - }; - }; - }; - }; - pageQueryDepartments: { - parameters: { - query: { - pageRequestDto: components["schemas"]["PageRequestDto"]; - departmentQueryDto: components["schemas"]["DepartmentQueryDto"]; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "*/*": components["schemas"]["PageResponseDtoListDepartmentRespDto"]; - }; - }; - }; - }; - pageQueryLlm: { - parameters: { - query: { - pageRequestDto: components["schemas"]["PageRequestDto"]; - llmQueryDto: components["schemas"]["LlmQueryDto"]; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "*/*": components["schemas"]["PageResponseDtoListLlmVm"]; - }; - }; - }; - }; + updateJob: { + parameters: { + query: { + cron: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["TriggerKeyDto"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + updateLlm: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["LlmVm"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + resumeTrigger: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["TriggerKeyDto"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + pauseTrigger: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["TriggerKeyDto"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + triggerJob: { + parameters: { + query: { + startAt: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["JobKeyDto"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + upsertPosition: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["Position"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + deletePosition: { + parameters: { + query: { + id: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + queryUserWithRolePermission: { + parameters: { + query: { + userId: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["UserRolePermissionDto"]; + }; + }; + }; + }; + upsertUser: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["UserUpsertDto"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + deleteUser: { + parameters: { + query: { + userId: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + queryRoleWithPermission: { + parameters: { + query: { + roleId: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["RoleDto"]; + }; + }; + }; + }; + upsertRole: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["RoleUpsertDto"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + deleteRole: { + parameters: { + query: { + roleId: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + unBindRoleBy: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["RoleBindDto"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + bindRoleBy: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["RoleBindDto"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + unBindPositionBy: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["PositionBindDto"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + bindPositionBy: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["PositionBindDto"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + upsertPermission: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["PermissionUpsertDto"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + deletePermission: { + parameters: { + query: { + permissionId: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + unBindPermissionBy: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["PermissionBindDto"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + bindPermissionBy: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["PermissionBindDto"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + currentUser: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["UserRolePermissionDto"]; + }; + }; + }; + }; + upsertMe: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["UserUpsertDto"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + unBindDepartmentBy: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["DepartmentBindDto"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + bindDepartmentBy: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["DepartmentBindDto"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + upsertDepartment: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["Department"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + deleteDepartment: { + parameters: { + query: { + id: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + signUp: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["SignUpDto"]; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + signOut: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + signIn: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["SignInDto"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + chat: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": string; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "text/event-stream": string[]; + }; + }; + }; + }; + actionChat: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": string; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": { + [key: string]: Record; + }; + }; + }; + }; + }; + pageQuery: { + parameters: { + query: { + pageRequestDto: components["schemas"]["PageRequestDto"]; + queryDto: components["schemas"]["QueryDto"]; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["PageResponseDtoListJobTriggerDto"]; + }; + }; + }; + }; + queryPositions: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["Position"][]; + }; + }; + }; + }; + pageQueryPositions: { + parameters: { + query: { + pageRequestDto: components["schemas"]["PageRequestDto"]; + positionQueryDto: components["schemas"]["PositionQueryDto"]; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["PageResponseDtoListPositionRespDto"]; + }; + }; + }; + }; + queryUsers: { + parameters: { + query: { + pageRequestDto: components["schemas"]["PageRequestDto"]; + userQueryDto: components["schemas"]["UserQueryDto"]; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["PageResponseDtoListUserRolePermissionDto"]; + }; + }; + }; + }; + queryRoles: { + parameters: { + query: { + pageRequestDto: components["schemas"]["PageRequestDto"]; + roleQueryDto: components["schemas"]["RoleQueryDto"]; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["PageResponseDtoListRoleDto"]; + }; + }; + }; + }; + queryPermissions: { + parameters: { + query: { + pageRequestDto: components["schemas"]["PageRequestDto"]; + permissionQueryDto: components["schemas"]["PermissionQueryDto"]; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["PageResponseDtoListPermissionRespDto"]; + }; + }; + }; + }; + queryAvailableParentDepartmentsBy: { + parameters: { + query?: { + id?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["Department"][]; + }; + }; + }; + }; + pageQueryDepartments: { + parameters: { + query: { + pageRequestDto: components["schemas"]["PageRequestDto"]; + departmentQueryDto: components["schemas"]["DepartmentQueryDto"]; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["PageResponseDtoListDepartmentRespDto"]; + }; + }; + }; + }; + pageQueryLlm: { + parameters: { + query: { + pageRequestDto: components["schemas"]["PageRequestDto"]; + llmQueryDto: components["schemas"]["LlmQueryDto"]; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["PageResponseDtoListLlmVm"]; + }; + }; + }; + }; } diff --git a/frontend/src/composables/ai/useAiAction.ts b/frontend/src/composables/ai/useAiAction.ts deleted file mode 100644 index d11e06c..0000000 --- a/frontend/src/composables/ai/useAiAction.ts +++ /dev/null @@ -1,11 +0,0 @@ -import client from "../../api/client"; - -const useAiAction = () => { - const actionChat = (message: string) => { - return client.POST("/ai/action/chat", { - body: message, - }); - }; - - return { actionChat }; -}; diff --git a/frontend/src/composables/ai/useAiChat.ts b/frontend/src/composables/ai/useAiChat.ts index 6974f81..8692b10 100644 --- a/frontend/src/composables/ai/useAiChat.ts +++ b/frontend/src/composables/ai/useAiChat.ts @@ -1,7 +1,7 @@ import { fetchEventSource } from "@microsoft/fetch-event-source"; import { ref } from "vue"; import useAuthStore from "../store/useAuthStore"; -import useAlertStore from "../store/useAlertStore"; +import client from "../../api/client"; const authStore = useAuthStore(); @@ -43,6 +43,21 @@ export const useAiChat = () => { } }; + const actionChat = async (message: string) => { + messages.value.push(message); + messages.value.push(""); + isLoading.value = true; + try { + const { data } = await client.POST("/ai/action/chat", { + body: message, + }); + messages.value[messages.value.length - 1] += "接收到指令,请您执行。"; + return data; + } finally { + isLoading.value = false; + } + }; + const cancel = () => { if (currentController) { currentController.abort(); @@ -50,5 +65,5 @@ export const useAiChat = () => { } }; - return { messages, chat, isLoading, cancel }; + return { messages, chat, isLoading, cancel, actionChat }; }; diff --git a/frontend/src/utils/errorHandler.ts b/frontend/src/utils/errorHandler.ts index 72e2c0b..a4924fb 100644 --- a/frontend/src/utils/errorHandler.ts +++ b/frontend/src/utils/errorHandler.ts @@ -21,7 +21,7 @@ const makeErrorHandler = }) => void, ) => (err: unknown, instance: ComponentPublicInstance | null, info: string) => { - console.error(err); + console.error(err); if (err instanceof UnAuthError) { signOut(); router.push(RoutePath.LOGIN); @@ -44,6 +44,11 @@ const makeErrorHandler = level: "error", content: err.detail ?? err.message, }); + } else { + showAlert({ + level: "error", + content: "发生异常,请稍候再试", + }); } }; diff --git a/frontend/src/views/AiChatView.vue b/frontend/src/views/AiChatView.vue index 3686cc8..4ad28e8 100644 --- a/frontend/src/views/AiChatView.vue +++ b/frontend/src/views/AiChatView.vue @@ -19,8 +19,23 @@
-
-
+ +
+
@@ -65,11 +80,16 @@ import Button from "../components/Button.vue"; import { useAiChat } from "../composables/ai/useAiChat"; import useUserStore from "../composables/store/useUserStore"; -const { messages, chat, isLoading, cancel } = useAiChat(); +const { messages, chat, isLoading, cancel, actionChat } = useAiChat(); const { user } = useUserStore(); const inputMessage = ref(""); const chatContainer = ref(null); const alertStore = useAlertStore(); +const isCommandMode = ref(false); + +const toggleCommandMode = () => { + isCommandMode.value = !isCommandMode.value; +}; marked.setOptions({ gfm: true, @@ -125,7 +145,19 @@ const abortChat = () => { cancel(); }; -const sendMessage = async () => { +const chatByMode = async (message: string) => { + if (isCommandMode.value) { + await actionChat(message); + } else { + if (isLoading.value) { + abortChat(); + } else { + await chat(message); + } + } +}; + +const handleSendClick = async () => { try { const validInputMessage = z .string({ message: "消息不能为空" }) @@ -133,7 +165,7 @@ const sendMessage = async () => { .parse(inputMessage.value); scrollToBottom(); inputMessage.value = ""; - await chat(validInputMessage); + await chatByMode(validInputMessage); } catch (error) { if (error instanceof z.ZodError) { alertStore.showAlert({ @@ -146,14 +178,6 @@ const sendMessage = async () => { } }; -const handleSendClick = async () => { - if (isLoading.value) { - abortChat(); - } else { - sendMessage(); - } -}; - onUnmounted(() => { cancel(); }); From 3f4a5f2e8bca4b45133e1ed407a9b8cbb2212d5e Mon Sep 17 00:00:00 2001 From: Chuck1sn Date: Mon, 26 May 2025 11:27:00 +0800 Subject: [PATCH 5/9] fix command type --- .../com/zl/mjga/controller/AiController.java | 2 +- .../com/zl/mjga/service/EmbeddingService.java | 7 +- frontend/src/api/schema/openapi.json | 2 +- frontend/src/api/types/schema.d.ts | 2 +- frontend/src/components/UserUpsertModal.vue | 11 +-- frontend/src/composables/ai/useAiChat.ts | 35 ++++++-- frontend/src/utils/errorHandler.ts | 6 ++ frontend/src/views/AiChatView.vue | 85 ++++++++++++++----- 8 files changed, 106 insertions(+), 44 deletions(-) diff --git a/backend/src/main/java/com/zl/mjga/controller/AiController.java b/backend/src/main/java/com/zl/mjga/controller/AiController.java index 0d1d2a1..b95d5fd 100644 --- a/backend/src/main/java/com/zl/mjga/controller/AiController.java +++ b/backend/src/main/java/com/zl/mjga/controller/AiController.java @@ -65,7 +65,7 @@ public class AiController { } @PostMapping("/action/chat") - public Map actionChat(@RequestBody String message) { + public Map actionChat(@RequestBody String message) { AiLlmConfig aiLlmConfig = llmService.loadConfig(LlmCodeEnum.ZHI_PU); if (!aiLlmConfig.getEnable()) { throw new BusinessException("命令模型未启用,请开启后再试。"); diff --git a/backend/src/main/java/com/zl/mjga/service/EmbeddingService.java b/backend/src/main/java/com/zl/mjga/service/EmbeddingService.java index 7c1b9af..d13e109 100644 --- a/backend/src/main/java/com/zl/mjga/service/EmbeddingService.java +++ b/backend/src/main/java/com/zl/mjga/service/EmbeddingService.java @@ -30,8 +30,8 @@ public class EmbeddingService { private final ZhiPuEmbeddingModelConfig zhiPuEmbeddingModelConfig; - public Map searchAction(String message) { - Map result = new HashMap<>(); + public Map searchAction(String message) { + Map result = new HashMap<>(); EmbeddingSearchRequest embeddingSearchRequest = EmbeddingSearchRequest.builder() .queryEmbedding(zhipuEmbeddingModel.embed(message).content()) @@ -39,7 +39,8 @@ public class EmbeddingService { EmbeddingSearchResult embeddingSearchResult = zhiPuEmbeddingStore.search(embeddingSearchRequest); if (!embeddingSearchResult.matches().isEmpty()) { - result = embeddingSearchResult.matches().getFirst().embedded().metadata().toMap(); + Metadata metadata = embeddingSearchResult.matches().getFirst().embedded().metadata(); + result.put(Actions.INDEX_KEY, metadata.getString(Actions.INDEX_KEY)); } return result; } diff --git a/frontend/src/api/schema/openapi.json b/frontend/src/api/schema/openapi.json index c947a72..b53b6ec 100644 --- a/frontend/src/api/schema/openapi.json +++ b/frontend/src/api/schema/openapi.json @@ -771,7 +771,7 @@ "schema": { "type": "object", "additionalProperties": { - "type": "object" + "type": "string" } } } diff --git a/frontend/src/api/types/schema.d.ts b/frontend/src/api/types/schema.d.ts index dd2d7e2..5142735 100644 --- a/frontend/src/api/types/schema.d.ts +++ b/frontend/src/api/types/schema.d.ts @@ -1484,7 +1484,7 @@ export interface operations { }; content: { "*/*": { - [key: string]: Record; + [key: string]: string; }; }; }; diff --git a/frontend/src/components/UserUpsertModal.vue b/frontend/src/components/UserUpsertModal.vue index d5c87a2..cd69a25 100644 --- a/frontend/src/components/UserUpsertModal.vue +++ b/frontend/src/components/UserUpsertModal.vue @@ -130,19 +130,10 @@ const handleSubmit = async () => { }, ); - try { const validatedData = userSchema.parse(formData.value); await onSubmit(validatedData); updateFormData(undefined); - } catch (error) { - if (error instanceof z.ZodError) { - alertStore.showAlert({ - level: "error", - content: error.errors[0].message, - }); - } - throw error; - } + }; onMounted(() => { diff --git a/frontend/src/composables/ai/useAiChat.ts b/frontend/src/composables/ai/useAiChat.ts index 8692b10..e804c39 100644 --- a/frontend/src/composables/ai/useAiChat.ts +++ b/frontend/src/composables/ai/useAiChat.ts @@ -1,23 +1,34 @@ import { fetchEventSource } from "@microsoft/fetch-event-source"; import { ref } from "vue"; -import useAuthStore from "../store/useAuthStore"; import client from "../../api/client"; +import useAuthStore from "../store/useAuthStore"; const authStore = useAuthStore(); export const useAiChat = () => { - const messages = ref([]); + const messages = ref< + { + content: string; + type: "chat" | "action"; + isUser: boolean; + username: string; + command?: string; + }[] + >([]); const isLoading = ref(false); let currentController: AbortController | null = null; const chat = async (message: string) => { isLoading.value = true; - messages.value.push(message); - messages.value.push(""); const ctrl = new AbortController(); currentController = ctrl; - + messages.value.push({ + content: "", + type: "chat", + isUser: false, + username: "知路智能体", + }); try { const baseUrl = `${import.meta.env.VITE_BASE_URL}`; await fetchEventSource(`${baseUrl}/ai/chat`, { @@ -29,7 +40,7 @@ export const useAiChat = () => { body: message, signal: ctrl.signal, onmessage(ev) { - messages.value[messages.value.length - 1] += ev.data; + messages.value[messages.value.length - 1].content += ev.data; }, onclose() { console.log("onclose"); @@ -38,20 +49,26 @@ export const useAiChat = () => { throw err; }, }); + } catch (error) { + messages.value.pop(); } finally { isLoading.value = false; } }; const actionChat = async (message: string) => { - messages.value.push(message); - messages.value.push(""); isLoading.value = true; try { const { data } = await client.POST("/ai/action/chat", { body: message, }); - messages.value[messages.value.length - 1] += "接收到指令,请您执行。"; + messages.value.push({ + content: "接收到指令,请您执行。", + type: "action", + isUser: false, + username: "知路智能体", + command: data?.action, + }); return data; } finally { isLoading.value = false; diff --git a/frontend/src/utils/errorHandler.ts b/frontend/src/utils/errorHandler.ts index a4924fb..53e44a3 100644 --- a/frontend/src/utils/errorHandler.ts +++ b/frontend/src/utils/errorHandler.ts @@ -7,6 +7,7 @@ import { RequestError, UnAuthError, } from "../types/error"; +import { z } from "zod"; const makeErrorHandler = ( @@ -44,6 +45,11 @@ const makeErrorHandler = level: "error", content: err.detail ?? err.message, }); + } else if (err instanceof z.ZodError) { + showAlert({ + level: "error", + content: err.errors[0].message, + }); } else { showAlert({ level: "error", diff --git a/frontend/src/views/AiChatView.vue b/frontend/src/views/AiChatView.vue index 4ad28e8..2d4b970 100644 --- a/frontend/src/views/AiChatView.vue +++ b/frontend/src/views/AiChatView.vue @@ -1,7 +1,7 @@