修复细节,优化错误提示

master
落雨楓 2 years ago
parent cbe05151f1
commit d4d858eaca

@ -2,6 +2,7 @@ import { RemoteError } from "@/errors/remoteError"
import { toolkitApi } from "@/request/toolkit-api";
import { useUserStore } from "@/stores"
import { BotPersonaInfo, ChatCompleteChunkInfo, ExtractDocInfo } from "@/types/base";
import { showApiError } from "@/utils/error";
import { getWebSocketApiUrl } from "@/utils/request";
export type IndexPageParams = {
@ -102,6 +103,7 @@ export const chatCompleteApi = {
})
} else if (data.event === 'error') {
isFinished = true
showApiError(data.error)
reject(new RemoteError(data.message, data.error))
}
})
@ -202,6 +204,7 @@ export const chatCompleteApi = {
resolve(data.result)
} else if (data.event === 'error') {
isFinished = true
showApiError(data.error)
reject(new RemoteError(data.message, data.error))
}
}

@ -9,7 +9,6 @@ export {}
declare module '@vue/runtime-core' {
export interface GlobalComponents {
BotPersonaList: typeof import('./components/BotPersonaList.vue')['default']
ChatCompleteSettingsModal: typeof import('./components/ChatCompleteSettingsModal.vue')['default']
ChatMessage: typeof import('./components/ChatMessage.vue')['default']
IonApp: typeof import('@ionic/vue')['IonApp']

@ -119,7 +119,7 @@ const displayTime = computed(() => {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 8px;
margin-bottom: 4px;
>.header-left {
display: flex;

@ -1,7 +1,7 @@
import { useUserStore } from '@/stores';
import { showError } from '@/utils/dialog';
import { ServerError } from '@/utils/error';
import axios, { AxiosResponse } from 'axios';
import { useUserStore } from '@/stores'
import { showError } from '@/utils/dialog'
import { ServerError, showApiError } from '@/utils/error'
import axios, { AxiosResponse } from 'axios'
export const toolkitApi = axios.create({
baseURL: import.meta.env.VITE_TOOLKIT_API_ENDPOINT,
@ -44,8 +44,10 @@ toolkitApi.interceptors.response.use((response) => {
// 处理其他服务器报告的错误
if (response.data?.status) {
if (response.data.status < 0 && response.data.error) {
showError(response.data.error?.message ?? '服务器错误');
throw new ServerError(response.data.error?.message, response, response.data.error)
let errData = response.data.error
showApiError(errData)
throw new ServerError(errData.message, response, errData)
}
} else if (response.status >= 500) {
showError(`服务器错误:${response.status} ${response.statusText}`)

@ -1,6 +1,40 @@
import { showError } from "./dialog";
export class ServerError extends Error {
constructor(message: string, public response: any, public detail: any = {}) {
super(message);
this.name = 'ServerError';
}
}
export async function showApiError(errData: any): Promise<void> {
switch (errData.code) {
case 'invalid-token':
await showError('登录信息已过期,请重新登录。')
break
case 'permission-denied':
await showError('没有使用此功能的权限。')
break
case 'no-enough-points':
await showError('没有足够的积分。')
break
case 'question-too-long':
await showError(`提问过长最大提问Tokens${errData.limit}当前提问Tokens${errData.current}`)
break
case 'page-not-found':
await showError('当前选中的页面不存在,可能已被移动或删除。')
break
case 'task-not-found':
await showError('当前生成任务不存在,请刷新页面。')
break
case 'page-index-running':
await showError('当前页面正在生成索引,请稍后刷新查看。')
break
case 'mediawiki-api-error':
await showError('MediaWiki API 错误:' + errData.info)
break
default:
await showError(errData.message ?? '服务器错误')
break
}
}

@ -107,7 +107,6 @@ const onSendMessage = async () => {
contentEl?.scrollToBottom()
ignoreAutoScroll = false
state.personaLoaded = true
state.conversationLoading = true
try {
let question = state.formMessage
@ -196,6 +195,7 @@ const onSendMessage = async () => {
id: startRes.conversation_id,
module: MODULE_NAME,
title: '未命名对话',
page_title: pageStore.title,
pinned: false,
description: description,
updated_at: Math.floor(Date.now() / 1000),
@ -224,6 +224,7 @@ const onSendMessage = async () => {
conversationStore.updateById(startRes.conversation_id, {
title: chatCompleteRes.delta_data.title
})
setPageTitle(chatCompleteRes.delta_data.title)
}
state.conversationLoading = false
@ -339,7 +340,6 @@ const loadConversation = async () => {
state.botId = route.query.botId as string ?? 'default'
await loadBotPersona()
} else {
state.personaLoaded = true
state.messageChunkList = []
state.errorMessage = null
state.formMessage = ''
@ -359,7 +359,7 @@ const loadConversation = async () => {
state.conversationTitle = conversationInfo.title ?? '未命名对话'
state.pinned = conversationInfo.pinned
state.botId = conversationInfo.extra.bot_id ?? 'default'
state.botId = conversationInfo.extra.bot_id || 'default'
await loadBotPersona()
@ -428,7 +428,7 @@ const loadBotPersona = async () => {
state.formMessage = personaInfo.default_question ?? ''
}
state.botName = personaInfo.bot_name
state.botAvatar = personaInfo.bot_avatar ?? DEFAULT_BOT_AVATAR
state.botAvatar = personaInfo.bot_avatar || DEFAULT_BOT_AVATAR
} catch (err: any) {
console.error(err)
}
@ -830,7 +830,7 @@ watch(() => conversationInfo.value, (currentConversation) => {
<ion-label color="medium" v-show="!state.pointCostLoading">{{ state.pointCost }}</ion-label>
<ion-spinner v-show="state.pointCostLoading" color="medium" name="dots"></ion-spinner>
</ion-chip>
<ion-textarea class="message-input" aria-label="" :rows="1" :maxlength="768" placeholder="在这里输入问题..."
<ion-textarea class="message-input" aria-label="" :rows="1" :maxlength="768" placeholder="输入问题"
auto-grow v-model="state.formMessage" @keydown="onMessageInputKeyDown" @ion-input="onInput"
@compositionstart="onCompositionStart" @compositionend="onCompositionEnd"
:disabled="state.conversationLoading"></ion-textarea>

Loading…
Cancel
Save