diff --git a/packages/twenty-server/src/engine/metadata-modules/ai/ai-agent-execution/services/__tests__/agent-run.service.spec.ts b/packages/twenty-server/src/engine/metadata-modules/ai/ai-agent-execution/services/__tests__/agent-run.service.spec.ts index 10a9feda97..d28d014b48 100644 --- a/packages/twenty-server/src/engine/metadata-modules/ai/ai-agent-execution/services/__tests__/agent-run.service.spec.ts +++ b/packages/twenty-server/src/engine/metadata-modules/ai/ai-agent-execution/services/__tests__/agent-run.service.spec.ts @@ -129,6 +129,24 @@ describe('AgentRunService', () => { }); }); + it('returns a generic error result when agent execution throws instead of bubbling GraphQL errors', async () => { + agentAsyncExecutorService.executeAgent.mockRejectedValue( + new Error('Failed to process successful response'), + ); + + const result = await service.run({ + workspace, + requestUserWorkspaceId: 'user-workspace-1', + input, + }); + + expect(result).toEqual({ + result: null, + error: 'Agent execution failed.', + success: false, + }); + }); + it('throws when no agent matches the identifier', async () => { agentRepository.findOne.mockResolvedValue(null); diff --git a/packages/twenty-server/src/engine/metadata-modules/ai/ai-agent-execution/services/agent-run.service.ts b/packages/twenty-server/src/engine/metadata-modules/ai/ai-agent-execution/services/agent-run.service.ts index ca02ffd82b..0b59748930 100644 --- a/packages/twenty-server/src/engine/metadata-modules/ai/ai-agent-execution/services/agent-run.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/ai/ai-agent-execution/services/agent-run.service.ts @@ -1,4 +1,4 @@ -import { Injectable, NotFoundException } from '@nestjs/common'; +import { Injectable, Logger, NotFoundException } from '@nestjs/common'; import { type RunAgentInput, @@ -17,6 +17,8 @@ import { WorkspaceScopedRepository } from 'src/engine/twenty-orm/workspace-scope @Injectable() export class AgentRunService { + private readonly logger = new Logger(AgentRunService.name); + constructor( private readonly agentAsyncExecutorService: AgentAsyncExecutorService, private readonly applicationService: ApplicationService, @@ -61,25 +63,38 @@ export class AgentRunService { application, }; - const { result, hasNoMoreAvailableCredits } = - await this.agentAsyncExecutorService.executeAgent({ - agent, - userPrompt: input.prompt, - baseSystemPrompt: AGENT_RUN_BASE_SYSTEM_PROMPT, - authContext, - workspaceId: workspace.id, - userWorkspaceId: requestUserWorkspaceId, - operationType: UsageOperationType.AI_WORKFLOW_TOKEN, - }); + try { + const { result, hasNoMoreAvailableCredits } = + await this.agentAsyncExecutorService.executeAgent({ + agent, + userPrompt: input.prompt, + baseSystemPrompt: AGENT_RUN_BASE_SYSTEM_PROMPT, + authContext, + workspaceId: workspace.id, + userWorkspaceId: requestUserWorkspaceId, + operationType: UsageOperationType.AI_WORKFLOW_TOKEN, + }); + + if (hasNoMoreAvailableCredits) { + return { + result: null, + error: 'AI agent stopped: no more available credits.', + success: false, + }; + } + + return { result, error: null, success: true }; + } catch (error) { + this.logger.error( + `Agent execution failed for ${input.agentUniversalIdentifier}`, + error instanceof Error ? error.stack : error, + ); - if (hasNoMoreAvailableCredits) { return { result: null, - error: 'AI agent stopped: no more available credits.', + error: 'Agent execution failed.', success: false, }; } - - return { result, error: null, success: true }; } }