({ inputs, params }, context)
| 540 | }, |
| 541 | }, |
| 542 | async execute({ inputs, params }, context) { |
| 543 | const { userInput, conversationState, chatModel, modelApiKey } = inputs; |
| 544 | const { systemPrompt, temperature, maxTokens, memorySize, stepLimit } = params; |
| 545 | |
| 546 | const agentRunId = `${context.runId}:${context.componentRef}:${randomUUID()}`; |
| 547 | |
| 548 | const agentStream = new AgentStreamRecorder(context, agentRunId); |
| 549 | const { connectedToolNodeIds, organizationId } = context.metadata; |
| 550 | const aiSdkOverrides = (context.metadata as { aiSdkOverrides?: AiSdkOverrides }).aiSdkOverrides; |
| 551 | const createMCPClientImpl = aiSdkOverrides?.createMCPClient ?? createMCPClient; |
| 552 | const ToolLoopAgentImpl = aiSdkOverrides?.ToolLoopAgent ?? ToolLoopAgent; |
| 553 | const stepCountIsImpl = aiSdkOverrides?.stepCountIs ?? stepCountIs; |
| 554 | const createOpenAIImpl = aiSdkOverrides?.createOpenAI ?? createOpenAI; |
| 555 | const createGoogleGenerativeAIImpl = |
| 556 | aiSdkOverrides?.createGoogleGenerativeAI ?? createGoogleGenerativeAI; |
| 557 | |
| 558 | let discoveredTools: ToolSet = {}; |
| 559 | let closeDiscovery: (() => Promise<void>) | undefined; |
| 560 | |
| 561 | if (connectedToolNodeIds && connectedToolNodeIds.length > 0) { |
| 562 | context.logger.info( |
| 563 | `Discovering tools from gateway for nodes: ${connectedToolNodeIds.join(', ')}`, |
| 564 | ); |
| 565 | try { |
| 566 | const sessionToken = await getGatewaySessionToken( |
| 567 | context.runId, |
| 568 | organizationId ?? null, |
| 569 | connectedToolNodeIds, |
| 570 | ); |
| 571 | const discoveryResult = await registerGatewayTools({ |
| 572 | gatewayUrl: DEFAULT_GATEWAY_URL, |
| 573 | sessionToken, |
| 574 | createClient: createMCPClientImpl, |
| 575 | }); |
| 576 | discoveredTools = discoveryResult.tools; |
| 577 | closeDiscovery = discoveryResult.close; |
| 578 | } catch (error) { |
| 579 | context.logger.error(`Failed to discover tools from gateway: ${error}`); |
| 580 | } |
| 581 | } |
| 582 | |
| 583 | try { |
| 584 | agentStream.emitMessageStart(); |
| 585 | context.emitProgress({ |
| 586 | level: 'info', |
| 587 | message: 'AI agent session started', |
| 588 | data: { |
| 589 | agentRunId, |
| 590 | agentStatus: 'started', |
| 591 | }, |
| 592 | }); |
| 593 | |
| 594 | const trimmedInput = userInput.trim(); |
| 595 | |
| 596 | if (!trimmedInput) { |
| 597 | throw new ValidationError('AI Agent requires a non-empty user input.', { |
| 598 | fieldErrors: { userInput: ['Input cannot be empty'] }, |
| 599 | }); |
nothing calls this directly
no test coverage detected