From 0a9474d00c0a418c3cddc97dda45e585038249fa Mon Sep 17 00:00:00 2001 From: Emily Date: Mon, 16 Dec 2024 16:57:52 +0100 Subject: [PATCH] adjust ai --- dashboard/package.json | 3 +- dashboard/pages/analyst.vue | 63 ++++++++++++++---- dashboard/public/favicon.ico | Bin 4661 -> 9662 bytes dashboard/server/ai/functions/AI_Events.ts | 8 +-- dashboard/server/ai/functions/AI_Visits.ts | 62 ++++++++++++----- .../server/api/ai/[chat_id]/get_messages.ts | 10 +-- dashboard/server/api/ai/send_message.post.ts | 4 +- dashboard/server/services/AiService.ts | 33 ++++----- pnpm-lock.yaml | 14 +++- 9 files changed, 134 insertions(+), 63 deletions(-) diff --git a/dashboard/package.json b/dashboard/package.json index 1a74478..b97d66b 100644 --- a/dashboard/package.json +++ b/dashboard/package.json @@ -35,7 +35,8 @@ "vue-chart-3": "^3.1.8", "vue-markdown-render": "^2.2.1", "vue-router": "^4.3.0", - "winston": "^3.14.2" + "winston": "^3.14.2", + "zod": "^3.24.1" }, "devDependencies": { "@nuxt/ui": "^2.15.2", diff --git a/dashboard/pages/analyst.vue b/dashboard/pages/analyst.vue index 8fde690..3a37cff 100644 --- a/dashboard/pages/analyst.vue +++ b/dashboard/pages/analyst.vue @@ -4,13 +4,17 @@ import VueMarkdown from 'vue-markdown-render'; definePageMeta({ layout: 'dashboard' }); + +const debugModeAi = ref(false); + +const { userRoles } = useLoggedUser(); + const { project } = useProject(); const { data: chatsList, refresh: reloadChatsList } = useFetch(`/api/ai/chats_list`, { headers: useComputedHeaders({ useSnapshotDates: false }) }); - const viewChatsList = computed(() => (chatsList.value || []).toReversed()); const { data: chatsRemaining, refresh: reloadChatsRemaining } = useFetch(`/api/ai/chats_remaining`, { @@ -21,14 +25,14 @@ const currentText = ref(""); const loading = ref(false); const currentChatId = ref(""); -const currentChatMessages = ref<{ role: string, content: string, charts?: any[] }[]>([]); +const currentChatMessages = ref<{ role: string, content: string, charts?: any[], tool_calls?: any }[]>([]); const currentChatMessageDelta = ref(''); const currentChatMessageDeltaHtml = computed(() => { const lastData = currentChatMessageDelta.value.match(/\[(data:(.*?))\]/g); const cleanMessage = currentChatMessageDelta.value.replace(/\[(data:(.*?))\]/g, ''); if (!lastData || lastData.length == 0) return cleanMessage; - return `
LOADER HERE: ${lastData.at(-1)} ${cleanMessage}
`; + return `
${lastData.at(-1)}
${cleanMessage}
`; }); const scroller = ref(null); @@ -36,7 +40,7 @@ const scroller = ref(null); async function pollSendMessageStatus(chat_id: string, times: number, updateStatus: (status: string) => any) { - if (times > 20) return; + if (times > 100) return; const res = await $fetch(`/api/ai/${chat_id}/status`, { headers: useComputedHeaders({ @@ -48,14 +52,22 @@ async function pollSendMessageStatus(chat_id: string, times: number, updateStatu updateStatus(res.status); if (res.completed === false) { - setTimeout(() => pollSendMessageStatus(chat_id, times + 1, updateStatus), 200); + setTimeout(() => pollSendMessageStatus(chat_id, times + 1, updateStatus), (times > 20 ? 1000 : 500)); } else { - currentChatMessages.value.push({ - role: 'assistant', - content: currentChatMessageDelta.value.replace(/\[data:.*?\]/g, ''), + + const messages = await $fetch(`/api/ai/${chat_id}/get_messages`, { + headers: useComputedHeaders({ useSnapshotDates: false }).value }); + if (!messages) return; + + currentChatMessages.value = messages.map(e => ({ ...e, charts: e.charts.map(k => JSON.parse(k)) })) as any; currentChatMessageDelta.value = ''; + // currentChatMessages.value.push({ + // role: 'assistant', + // content: currentChatMessageDelta.value.replace(/\[data:.*?\]/g, ''), + // }); + } } @@ -67,7 +79,7 @@ async function sendMessage() { loading.value = true; - const body: any = { text: currentText.value } + const body: any = { text: currentText.value, timeOffset: new Date().getTimezoneOffset() } if (currentChatId.value) body.chat_id = currentChatId.value currentChatMessages.value.push({ role: 'user', content: currentText.value }); @@ -92,6 +104,8 @@ async function sendMessage() { currentChatMessageDelta.value = status; }); + + } catch (ex: any) { if (ex.message.includes('CHAT_LIMIT_REACHED')) { @@ -179,6 +193,8 @@ async function deleteChat(chat_id: string) { const { visible: pricingDrawerVisible } = usePricingDrawer() + +