fix(server): better copilot error handle (#10509)

This commit is contained in:
darkskygit
2025-02-28 11:01:58 +00:00
parent 7227b7f8f6
commit 6b76037e39
2 changed files with 81 additions and 49 deletions
@@ -37,6 +37,8 @@ import {
Config,
CopilotFailedToGenerateText,
CopilotSessionNotFound,
InternalServerError,
mapAnyError,
mapSseError,
metrics,
NoCopilotProviderAvailable,
@@ -148,8 +150,8 @@ export class CopilotController implements BeforeApplicationShutdown {
if (!messageId || retry) {
// revert the latest message generated by the assistant
// if messageId is provided, we will also revert latest user message
await this.chatSession.revertLatestMessage(sessionId, !messageId);
session.revertLatestMessage(!messageId);
await this.chatSession.revertLatestMessage(sessionId, !!messageId);
session.revertLatestMessage(!!messageId);
}
if (messageId) {
@@ -209,31 +211,34 @@ export class CopilotController implements BeforeApplicationShutdown {
@Param('sessionId') sessionId: string,
@Query() params: Record<string, string | string[]>
): Promise<string> {
const { messageId, retry } = this.prepareParams(params);
const info: any = { sessionId, params };
const provider = await this.chooseTextProvider(
user.id,
sessionId,
messageId
);
const session = await this.appendSessionMessage(
sessionId,
messageId,
retry
);
try {
metrics.ai.counter('chat_calls').add(1, { model: session.model });
const content = await provider.generateText(
session.finish(params),
session.model,
{
...session.config.promptConfig,
signal: this.getSignal(req),
user: user.id,
}
const { messageId, retry } = this.prepareParams(params);
const provider = await this.chooseTextProvider(
user.id,
sessionId,
messageId
);
const session = await this.appendSessionMessage(
sessionId,
messageId,
retry
);
info.model = session.model;
metrics.ai.counter('chat_calls').add(1, { model: session.model });
const finalMessage = session.finish(params);
info.finalMessage = finalMessage;
const content = await provider.generateText(finalMessage, session.model, {
...session.config.promptConfig,
signal: this.getSignal(req),
user: user.id,
});
session.push({
role: 'assistant',
content,
@@ -243,8 +248,13 @@ export class CopilotController implements BeforeApplicationShutdown {
return content;
} catch (e: any) {
metrics.ai.counter('chat_errors').add(1, { model: session.model });
throw new CopilotFailedToGenerateText(e.message);
metrics.ai.counter('chat_errors').add(1);
let error = mapAnyError(e);
if (error instanceof InternalServerError) {
error = new CopilotFailedToGenerateText(e.message);
}
error.log('CopilotChat', info);
throw error;
}
}
@@ -276,8 +286,10 @@ export class CopilotController implements BeforeApplicationShutdown {
metrics.ai.counter('chat_stream_calls').add(1, { model: session.model });
this.ongoingStreamCount$.next(this.ongoingStreamCount$.value + 1);
const finalMessage = session.finish(params);
info.finalMessage = finalMessage;
const source$ = from(
provider.generateTextStream(session.finish(params), session.model, {
provider.generateTextStream(finalMessage, session.model, {
...session.config.promptConfig,
signal: this.getSignal(req),
user: user.id,