diff --git a/src/components/Content.vue b/src/components/Content.vue index 83f7123..5626309 100644 --- a/src/components/Content.vue +++ b/src/components/Content.vue @@ -31,6 +31,19 @@ watch(currentKey, () => { }) // methods +const fetchResponse = async (key: string) => { + let res + try { + res = await generateText(store.currentChatMessages, key, getOpenProxy()) + } + catch (error: any) { + return alert('[Error] 网络请求超时, 请检查网络或代理') + } + if (res.error) return alert(res.error?.message) + + return res.choices[0].message.content +} + const onSubmit = async () => { const key = getOpenKey() if (!verifyOpenKey(key)) return alert('请输入正确的API-KEY') @@ -43,14 +56,8 @@ const onSubmit = async () => { message.value = '' store.changeLoading(true) - try { - const res = await generateText(store.currentChatMessages, key!, getOpenProxy()) - if (res.error) { - alert(res.error?.message) - store.changeConversations(store.currentChatMessages.slice(-1)) - return store.changeLoading(false) - } - const content = res.choices[0].message.content + const content = await fetchResponse(key) + if (content) { store.changeConversations([ ...store.currentChatMessages, { @@ -58,12 +65,12 @@ const onSubmit = async () => { }, ]) speak(content) - store.changeLoading(false) } - catch (error) { - store.changeConversations(store.currentChatMessages.slice(-1)) - store.changeLoading(false) + else { + store.changeConversations(store.currentChatMessages.slice(0, -1)) } + + store.changeLoading(false) } function speak(content: string) { @@ -148,9 +155,9 @@ const translate = (text: string) => { v-else-if="!store.loading" v-model="message" type="text" - @keyup.enter="onSubmit" placeholder="Type your message here..." - input-box p-3 flex-1 + input-box + p-3 flex-1 @keyup.enter="onSubmit" >
AI Is Thinking... diff --git a/src/server/api.ts b/src/server/api.ts index a71c725..dd3c062 100644 --- a/src/server/api.ts +++ b/src/server/api.ts @@ -1,17 +1,11 @@ -import { OpenAi } from '@/utils' - +import { OpenAi, fetchWithTimeout } from '@/utils' export const generateText = async (messages: ChatMessage[], apiKey: string, proxy?: string) => { const openai = new OpenAi(apiKey, proxy) const { url, initOptions } = openai.generateTurboPayload({ messages }) - try { - const response = await fetch(url, initOptions) - const data = await response.json() - return data - } - catch (error) { - return `[Error] ${(error as any).message}. try again later or try using proxy` - } + const response = await fetchWithTimeout(url, 10000, initOptions) + const data = await response.json() + return data } export const generateDashboardInfo = async (apiKey: string, proxy?: string) => { diff --git a/src/utils/tools.ts b/src/utils/tools.ts index 196a7cd..71ac172 100644 --- a/src/utils/tools.ts +++ b/src/utils/tools.ts @@ -1,3 +1,27 @@ export const getAvatarUrl = (filename: string) => { return new URL(`../assets/avatars/${filename}`, import.meta.url).href } +export async function fetchWithTimeout( + url: string, + timeout: number, + options: RequestInit = {}, +): Promise { + const controller = new AbortController() + const timeoutId = setTimeout(() => { + controller.abort() + // throw new Error(`网络请求 ${url} 已超时`) + }, timeout) + + const { method = 'GET', headers = {}, body } = options + + const response = await fetch(url, { + method, + headers, + body, + signal: controller.signal, + }) + + clearTimeout(timeoutId) + + return response +}