Skip to content

Commit 299a48c

Browse files
committed
feat: refactor error handling in chat message sending and HTTP requests
1 parent a4496f4 commit 299a48c

File tree

5 files changed

+54
-34
lines changed

5 files changed

+54
-34
lines changed

packages/plugins/robot/src/components/renderers/AgentRenderer.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ export default {
5353
},
5454
failed: {
5555
title: '页面生成失败',
56-
content: '页面生成失败',
56+
content: () => props.content?.slice(-30) || '页面生成失败',
5757
icon: 'failed.svg'
5858
}
5959
}

packages/plugins/robot/src/composables/modes/useAgentMode.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,10 +141,20 @@ export default function useAgentMode(): ModeHooks {
141141
updatePageSchema(content, pageSchema!)
142142
}
143143

144-
const onRequestEnd = async (finishReason: string, content: string, messages: any[]) => {
144+
const onRequestEnd = async (
145+
finishReason: string,
146+
content: string,
147+
messages: any[],
148+
extraData?: Record<string, unknown>
149+
) => {
145150
if (finishReason === 'aborted' || finishReason === 'error') {
146151
removeLoading(messages)
147-
messages.at(-1).renderContent.at(-1).status = 'failed'
152+
const errorInfo = { content: extraData?.error || '请求失败', status: 'failed' }
153+
if (messages.at(-1).renderContent.at(-1)) {
154+
Object.assign(messages.at(-1).renderContent.at(-1), errorInfo)
155+
} else {
156+
messages.at(-1).renderContent = [{ type: getContentType(), ...errorInfo }]
157+
}
148158
}
149159
}
150160

packages/plugins/robot/src/composables/modes/useChatMode.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
*
1111
*/
1212

13-
import { removeLoading } from '../../utils'
13+
import { removeLoading, serializeError } from '../../utils'
1414
import useModelConfig from '../core/useConfig'
1515
import useMcpServer from '../features/useMcp'
1616
import type { ModeHooks } from '../../types/mode.types'
@@ -104,9 +104,15 @@ export default function useChatMode(): ModeHooks {
104104
// Chat 模式不需要处理流式数据
105105
}
106106

107-
const onRequestEnd = async (finishReason: string, _content: string, messages: any[]) => {
107+
const onRequestEnd = async (
108+
finishReason: string,
109+
_content: string,
110+
messages: any[],
111+
extraData?: Record<string, unknown>
112+
) => {
108113
if (finishReason === 'aborted' || finishReason === 'error') {
109114
removeLoading(messages)
115+
messages.at(-1)!.renderContent.push({ type: 'text', content: serializeError(extraData.error) })
110116
}
111117
}
112118

packages/plugins/robot/src/composables/useChat.ts

Lines changed: 19 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { nextTick } from 'vue'
22
import { STATUS, type ChatMessage } from '@opentiny/tiny-robot-kit'
3-
import { formatMessages, removeLoading, serializeError } from '../utils'
3+
import { formatMessages, removeLoading } from '../utils'
44
import { getClientConfig as getConfig, updateClientConfig as updateConfig, client } from '../services/aiClient'
55
import useModelConfig from './core/useConfig'
66
import useMode from './modes/useMode'
@@ -107,11 +107,7 @@ const handleFinishRequest = async (finishReason, messages, contextMessages, mess
107107

108108
const handleRequestError = async (error, messages, messageState) => {
109109
chatStatus = CHAT_STATUS.FINISHED
110-
111-
await onRequestEnd('error', messages.at(-1).content, messages) // 本次请求结束
112-
113-
messages.at(-1)!.renderContent.push({ type: 'text', content: serializeError(error) })
114-
110+
await onRequestEnd('error', messages.at(-1).content, messages, { error }) // 本次请求结束
115111
messageState.status = STATUS.ERROR
116112
}
117113

@@ -173,27 +169,25 @@ const autoSetTitle = () => {
173169
}
174170

175171
const sendUserMessage = async () => {
176-
try {
177-
nextTick(() => {
178-
const assistantMessage: ChatMessage = {
179-
role: 'assistant',
180-
content: '',
181-
renderContent: [{ type: getLoadingType() }]
182-
}
183-
messageManager.messages.value.push(assistantMessage)
184-
})
185-
await messageManager.send()
186-
onMessageSent()
187-
autoSetTitle()
188-
} catch (error) {
189-
removeLoading(messageManager.messages.value)
190-
const lastMessage = messageManager.messages.value.at(-1)
191-
if (lastMessage) {
192-
lastMessage.renderContent.push({ type: 'text', content: serializeError(error) })
172+
nextTick(() => {
173+
const assistantMessage: ChatMessage = {
174+
role: 'assistant',
175+
content: '',
176+
renderContent: [{ type: getLoadingType() }]
193177
}
194-
// eslint-disable-next-line no-console
195-
console.error(error)
178+
messageManager.messages.value.push(assistantMessage)
179+
})
180+
await messageManager.send()
181+
if (messageManager.messageState.status === STATUS.ERROR) {
182+
removeLoading(messageManager.messages.value)
183+
await handleRequestError(
184+
messageManager.messageState.errorMsg,
185+
messageManager.messages.value,
186+
messageManager.messageState
187+
)
196188
}
189+
onMessageSent()
190+
autoSetTitle()
197191
}
198192

199193
const abortRequest = () => {

packages/plugins/robot/src/services/OpenAICompatibleProvider.ts

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,11 @@ export class OpenAICompatibleProvider extends BaseModelProvider {
160160

161161
if (!fetchResponse.ok) {
162162
const errorText = await fetchResponse.text()
163-
throw new Error(`HTTP error! status: ${fetchResponse.status}, details: ${errorText}`)
163+
const customError: any = new Error(
164+
`HTTP error! status: ${fetchResponse.status}${errorText ? ', details: ' + errorText : ''}`
165+
)
166+
customError.response = fetchResponse
167+
throw customError
164168
}
165169

166170
if (isStream) {
@@ -218,7 +222,12 @@ export class OpenAICompatibleProvider extends BaseModelProvider {
218222

219223
if (!response.ok) {
220224
const errorText = await response.text()
221-
throw new Error(`HTTP error! status: ${response.status}, details: ${errorText}`)
225+
const customError: any = new Error(
226+
`HTTP error! status: ${response.status}${errorText ? ', details: ' + errorText : ''}`
227+
)
228+
customError.response = response
229+
230+
throw customError
222231
}
223232

224233
return response
@@ -307,7 +316,7 @@ export class OpenAICompatibleProvider extends BaseModelProvider {
307316
if (signal?.aborted) {
308317
return
309318
}
310-
handler.onError(this.toAIAdapterError(error))
319+
throw error
311320
}
312321
}
313322

@@ -335,8 +344,9 @@ export class OpenAICompatibleProvider extends BaseModelProvider {
335344
}
336345

337346
if (httpClientType === 'axios' && axiosClient) {
347+
this.httpClientType = 'axios'
338348
this.axiosClient = axiosClient
339-
} else {
349+
} else if (httpClientType) {
340350
this.httpClientType = 'fetch'
341351
}
342352

0 commit comments

Comments
 (0)