MCPcopy Create free account
hub / github.com/ShipSecAI/studio / execute

Function execute

worker/src/components/ai/ai-agent.ts:542–770  ·  view source on GitHub ↗
({ inputs, params }, context)

Source from the content-addressed store, hash-verified

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 });

Callers

nothing calls this directly

Calls 15

emitMessageStartMethod · 0.95
emitToolInputMethod · 0.95
emitToolOutputMethod · 0.95
emitTextDeltaMethod · 0.95
emitFinishMethod · 0.95
getGatewaySessionTokenFunction · 0.90
registerGatewayToolsFunction · 0.85
ensureModelNameFunction · 0.85
resolveApiKeyFunction · 0.85
sanitizeHeadersFunction · 0.85
ensureSystemMessageFunction · 0.85
trimConversationFunction · 0.85

Tested by

no test coverage detected