From 9b77c13337e998b22212ce8b1b793bf9316386af Mon Sep 17 00:00:00 2001 From: ct <164434275@qq.com> Date: Mon, 18 May 2026 16:11:28 +0800 Subject: [PATCH] =?UTF-8?q?snail-ai=E6=B5=8B=E8=AF=95=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/ai/agent/index.ts | 15 ++ src/views/ai/chat/index.vue | 36 +++- src/views/ai/chat/modules/chat-input.vue | 33 ++- src/views/ai/chat/modules/chat-main.vue | 230 +++++++++++++++++---- src/views/ai/chat/modules/chat-sidebar.vue | 1 - 5 files changed, 254 insertions(+), 61 deletions(-) diff --git a/src/api/ai/agent/index.ts b/src/api/ai/agent/index.ts index f448086f..03661142 100644 --- a/src/api/ai/agent/index.ts +++ b/src/api/ai/agent/index.ts @@ -50,6 +50,13 @@ export const registerCurrentSnailUser = (): AxiosPromise => { }); }; +export const fetchChatMode = (): AxiosPromise<{ mode?: 'stream' | 'sync' }> => { + return request({ + url: '/snail-ai/chat/mode', + method: 'get' + }); +}; + export const fetchAgentChat = ( agentId: number, data: AgentChatRequest, @@ -131,3 +138,11 @@ export const fetchAgentChat = ( } }); }; + +export const fetchAgentChatSync = (agentId: number, data: AgentChatRequest): AxiosPromise => { + return request({ + url: `/snail-ai/agent/${agentId}/chat/sync`, + method: 'post', + data + }); +}; diff --git a/src/views/ai/chat/index.vue b/src/views/ai/chat/index.vue index 5e7d9fdc..72f0fb2c 100644 --- a/src/views/ai/chat/index.vue +++ b/src/views/ai/chat/index.vue @@ -13,6 +13,33 @@ const currentAgent = ref(null); const currentConversationId = ref(''); const currentNickname = ref(''); +function normalizeConversationList(payload: any): ConversationSummaryItem[] { + const container = payload?.data ?? payload; + const source = + (Array.isArray(container) && container) || + (Array.isArray(container?.rows) && container.rows) || + (Array.isArray(container?.list) && container.list) || + (Array.isArray(container?.records) && container.records) || + (Array.isArray(payload?.rows) && payload.rows) || + (Array.isArray(payload?.list) && payload.list) || + (Array.isArray(payload?.records) && payload.records) || + []; + + return source + .map((item: any) => ({ + conversationId: String(item?.conversationId ?? item?.id ?? ''), + title: String(item?.title ?? item?.name ?? ''), + lastMessageDt: item?.lastMessageDt ?? item?.updateTime ?? item?.updateDt, + createDt: item?.createDt ?? item?.createTime + })) + .filter((item: ConversationSummaryItem) => !!item.conversationId) + .sort((a: ConversationSummaryItem, b: ConversationSummaryItem) => { + const ta = new Date(a.lastMessageDt || a.createDt || 0).getTime(); + const tb = new Date(b.lastMessageDt || b.createDt || 0).getTime(); + return tb - ta; + }); +} + async function loadAgents() { const { data: user } = await registerCurrentSnailUser(); currentNickname.value = user?.nickname || ''; @@ -24,8 +51,7 @@ async function loadAgents() { async function loadConversations(agentId: number) { try { const { data } = await fetchAgentConversations(agentId, { page: 1, size: 50 }); - const list = Array.isArray(data?.data) ? data.data : []; - conversations.value = list; + conversations.value = normalizeConversationList(data); } catch { conversations.value = []; } @@ -78,9 +104,10 @@ onMounted(() => { .ai-chat-page { display: flex; flex-direction: column; - height: 100%; - min-height: calc(100vh - 84px); + height: calc(100vh - 84px); + min-height: 0; background: #f5f6f8; + overflow: hidden; } .chat-header { @@ -112,5 +139,6 @@ onMounted(() => { flex: 1; display: flex; overflow: hidden; + min-height: 0; } diff --git a/src/views/ai/chat/modules/chat-input.vue b/src/views/ai/chat/modules/chat-input.vue index 85310f9f..2413715c 100644 --- a/src/views/ai/chat/modules/chat-input.vue +++ b/src/views/ai/chat/modules/chat-input.vue @@ -21,19 +21,14 @@ function submit() {