From 3f4a5f2e8bca4b45133e1ed407a9b8cbb2212d5e Mon Sep 17 00:00:00 2001 From: Chuck1sn Date: Mon, 26 May 2025 11:27:00 +0800 Subject: [PATCH] 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 @@