diff --git a/packages/twenty-front/src/modules/ai/components/AiChatErrorRenderer.tsx b/packages/twenty-front/src/modules/ai/components/AiChatErrorRenderer.tsx index b4f6e7af1a..a8217903d1 100644 --- a/packages/twenty-front/src/modules/ai/components/AiChatErrorRenderer.tsx +++ b/packages/twenty-front/src/modules/ai/components/AiChatErrorRenderer.tsx @@ -22,6 +22,10 @@ export const AiChatErrorRenderer = ({ return ; } + if (isGraphqlErrorOfType(error, AiChatErrorCode.CONTEXT_WINDOW_EXCEEDED)) { + return ; + } + if (isGraphqlErrorOfType(error, AiChatErrorCode.CONNECTION_LOST)) { return ; } diff --git a/packages/twenty-front/src/modules/ai/utils/aiChatErrorCode.ts b/packages/twenty-front/src/modules/ai/utils/aiChatErrorCode.ts index b106c8c978..bb534f76de 100644 --- a/packages/twenty-front/src/modules/ai/utils/aiChatErrorCode.ts +++ b/packages/twenty-front/src/modules/ai/utils/aiChatErrorCode.ts @@ -1,5 +1,6 @@ export const AiChatErrorCode = { BILLING_CREDITS_EXHAUSTED: 'BILLING_CREDITS_EXHAUSTED', + CONTEXT_WINDOW_EXCEEDED: 'CONTEXT_WINDOW_EXCEEDED', API_KEY_NOT_CONFIGURED: 'API_KEY_NOT_CONFIGURED', CONNECTION_LOST: 'CONNECTION_LOST', } as const; diff --git a/packages/twenty-server/src/engine/metadata-modules/ai/ai-chat/services/chat-execution.service.ts b/packages/twenty-server/src/engine/metadata-modules/ai/ai-chat/services/chat-execution.service.ts index 816cac8602..90799abe8c 100644 --- a/packages/twenty-server/src/engine/metadata-modules/ai/ai-chat/services/chat-execution.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/ai/ai-chat/services/chat-execution.service.ts @@ -41,6 +41,10 @@ import { getToolMetricName } from 'src/engine/core-modules/tool-provider/utils/g import { isToolOutputSuccessful } from 'src/engine/core-modules/tool-provider/utils/is-tool-output-successful.util'; import { resolveToolName } from 'src/engine/core-modules/tool-provider/utils/resolve-tool-name.util'; import { type WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; +import { + AiException, + AiExceptionCode, +} from 'src/engine/metadata-modules/ai/ai.exception'; import { AgentActorContextService } from 'src/engine/metadata-modules/ai/ai-agent-execution/services/agent-actor-context.service'; import { finalizeDanglingToolParts } from 'src/engine/metadata-modules/ai/ai-agent-execution/utils/finalize-dangling-tool-parts.util'; import { AGENT_CONFIG } from 'src/engine/metadata-modules/ai/ai-agent/constants/agent-config.const'; @@ -302,8 +306,9 @@ export class ChatExecutionService { ); if (pruningResult.isStillOverLimit) { - throw new Error( + throw new AiException( 'This conversation is too long for the model to process. Please start a new thread.', + AiExceptionCode.CONTEXT_WINDOW_EXCEEDED, ); } diff --git a/packages/twenty-server/src/engine/metadata-modules/ai/ai.exception.ts b/packages/twenty-server/src/engine/metadata-modules/ai/ai.exception.ts index 919d8e7650..36a7d4b1d2 100644 --- a/packages/twenty-server/src/engine/metadata-modules/ai/ai.exception.ts +++ b/packages/twenty-server/src/engine/metadata-modules/ai/ai.exception.ts @@ -12,6 +12,7 @@ export enum AiExceptionCode { INVALID_AGENT_INPUT = 'INVALID_AGENT_INPUT', THREAD_NOT_FOUND = 'THREAD_NOT_FOUND', WORKSPACE_NOT_FOUND = 'WORKSPACE_NOT_FOUND', + CONTEXT_WINDOW_EXCEEDED = 'CONTEXT_WINDOW_EXCEEDED', INVALID_CHAT_THREAD_TITLE = 'INVALID_CHAT_THREAD_TITLE', MESSAGE_NOT_FOUND = 'MESSAGE_NOT_FOUND', QUESTION_NOT_PENDING = 'QUESTION_NOT_PENDING', @@ -39,6 +40,8 @@ const getAiExceptionUserFriendlyMessage = (code: AiExceptionCode) => { return msg`Chat thread not found.`; case AiExceptionCode.WORKSPACE_NOT_FOUND: return msg`Workspace not found.`; + case AiExceptionCode.CONTEXT_WINDOW_EXCEEDED: + return msg`This conversation is too long for the model. Start a new thread to continue.`; case AiExceptionCode.INVALID_CHAT_THREAD_TITLE: return msg`Chat thread title cannot be empty.`; case AiExceptionCode.MESSAGE_NOT_FOUND: diff --git a/packages/twenty-server/src/engine/metadata-modules/ai/utils/ai-graphql-api-exception-handler.util.ts b/packages/twenty-server/src/engine/metadata-modules/ai/utils/ai-graphql-api-exception-handler.util.ts index 5b394de6c1..b54dff9c84 100644 --- a/packages/twenty-server/src/engine/metadata-modules/ai/utils/ai-graphql-api-exception-handler.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/ai/utils/ai-graphql-api-exception-handler.util.ts @@ -27,6 +27,7 @@ export const aiGraphqlApiExceptionHandler = (error: Error) => { case AiExceptionCode.MESSAGE_NOT_FOUND: case AiExceptionCode.ROLE_NOT_FOUND: throw new NotFoundError(error); + case AiExceptionCode.CONTEXT_WINDOW_EXCEEDED: case AiExceptionCode.INVALID_AGENT_INPUT: case AiExceptionCode.INVALID_CHAT_THREAD_TITLE: case AiExceptionCode.QUESTION_NOT_PENDING: