{"version":3,"sources":["/Users/shyun/comcom/ain-enterprise/ain-adk/dist/cjs/chunk-R5ODNT7N.cjs","../../src/services/tool-calling.service.ts"],"names":[],"mappings":"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","file":"/Users/shyun/comcom/ain-enterprise/ain-adk/dist/cjs/chunk-R5ODNT7N.cjs","sourcesContent":[null,"import { getManifest } from \"@/config/manifest\";\nimport type { A2AModule, MCPModule, ModelModule } from \"@/modules\";\nimport { CONNECTOR_PROTOCOL_TYPE, type ConnectorTool } from \"@/types/connector\";\nimport type { ThreadObject } from \"@/types/memory\";\nimport type { AssembledToolCall, StreamEvent } from \"@/types/stream\";\nimport { loggers } from \"@/utils/logger\";\nimport {\n\tsplitAdkToolArgs,\n\ttruncateThinkingDescription,\n} from \"@/utils/tool-args\";\n\nexport type ToolCallingMode = \"all\" | \"mcp\";\n\n/**\n * Hard cap on the tool-calling iteration loop. The loop normally exits when\n * the model returns a turn with no tool_calls; the cap is a defense-in-depth\n * guard against runaway interactions caused by protocol drift or persistent\n * model loops.\n */\nexport const MAX_TOOL_ITERATIONS = 15;\n\nexport class ToolCallingService {\n\tprivate modelModule: ModelModule;\n\tprivate a2aModule?: A2AModule;\n\tprivate mcpModule?: MCPModule;\n\n\tconstructor(\n\t\tmodelModule: ModelModule,\n\t\ta2aModule?: A2AModule,\n\t\tmcpModule?: MCPModule,\n\t) {\n\t\tthis.modelModule = modelModule;\n\t\tthis.a2aModule = a2aModule;\n\t\tthis.mcpModule = mcpModule;\n\t}\n\n\tasync getTools(params: {\n\t\ttoolPrompt: string;\n\t\tmode?: ToolCallingMode;\n\t}): Promise<ConnectorTool[]> {\n\t\tconst tools: ConnectorTool[] = [];\n\t\tthis.mcpModule && tools.push(...this.mcpModule.getTools(params.toolPrompt));\n\t\tif (params.mode !== \"mcp\") {\n\t\t\tthis.a2aModule &&\n\t\t\t\ttools.push(...(await this.a2aModule.getTools(params.toolPrompt)));\n\t\t}\n\t\treturn tools;\n\t}\n\n\tasync *run(params: {\n\t\tmessages: unknown[];\n\t\ttools: ConnectorTool[];\n\t\tquery: string;\n\t\tthread: ThreadObject;\n\t\ttoolChoice?: \"auto\" | \"required\";\n\t}): AsyncGenerator<StreamEvent, { toolCallsExecuted: number }, unknown> {\n\t\tconst modelInstance = this.modelModule.getModel();\n\t\tconst modelOptions = this.modelModule.getModelOptions();\n\t\tconst tools = [...params.tools];\n\t\tconst processList: string[] = [];\n\t\tlet isFirstCall = true;\n\t\tlet iteration = 0;\n\n\t\tfor (; iteration < MAX_TOOL_ITERATIONS; iteration++) {\n\t\t\tconst functions = modelInstance.convertToolsToFunctions(tools);\n\t\t\tconst toolChoice =\n\t\t\t\tisFirstCall && params.toolChoice === \"required\" && functions.length > 0\n\t\t\t\t\t? (\"required\" as const)\n\t\t\t\t\t: (\"auto\" as const);\n\t\t\tconst options = { ...modelOptions, toolChoice };\n\t\t\tconst responseStream = await modelInstance.fetchStreamWithContextMessage(\n\t\t\t\tparams.messages,\n\t\t\t\tfunctions,\n\t\t\t\toptions,\n\t\t\t);\n\t\t\tisFirstCall = false;\n\n\t\t\tconst assembledToolCalls: AssembledToolCall[] = [];\n\t\t\tlet assistantText = \"\";\n\n\t\t\tfor await (const chunk of responseStream) {\n\t\t\t\tconst delta = chunk.delta;\n\t\t\t\tif (delta?.tool_calls) {\n\t\t\t\t\tfor (const { index, id, function: func } of delta.tool_calls) {\n\t\t\t\t\t\tassembledToolCalls[index] ??= {\n\t\t\t\t\t\t\tid: \"\",\n\t\t\t\t\t\t\ttype: \"function\",\n\t\t\t\t\t\t\tfunction: { name: \"\", arguments: \"\" },\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tif (id) assembledToolCalls[index].id = id;\n\t\t\t\t\t\tif (func?.name) assembledToolCalls[index].function.name = func.name;\n\t\t\t\t\t\tif (func?.arguments) {\n\t\t\t\t\t\t\tassembledToolCalls[index].function.arguments += func.arguments;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (chunk.delta?.content) {\n\t\t\t\t\tassistantText += chunk.delta.content;\n\t\t\t\t\tyield {\n\t\t\t\t\t\tevent: \"text_chunk\",\n\t\t\t\t\t\tdata: { delta: chunk.delta.content },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tloggers.intentStream.debug(\"assembledToolCalls\", {\n\t\t\t\tthreadId: params.thread.threadId,\n\t\t\t\tassembledToolCalls,\n\t\t\t});\n\n\t\t\tif (assembledToolCalls.length === 0) {\n\t\t\t\treturn { toolCallsExecuted: processList.length };\n\t\t\t}\n\n\t\t\tmodelInstance.appendAssistantToolCallTurn(params.messages, {\n\t\t\t\tcontent: assistantText.length > 0 ? assistantText : null,\n\t\t\t\ttoolCalls: assembledToolCalls,\n\t\t\t});\n\n\t\t\tfor (const toolCall of assembledToolCalls) {\n\t\t\t\tconst toolName = toolCall.function.name;\n\t\t\t\tconst selectedTool = this.selectTool(tools, toolName);\n\t\t\t\tif (!selectedTool) {\n\t\t\t\t\tloggers.intent.warn(\"Tool not found\", {\n\t\t\t\t\t\ttoolName,\n\t\t\t\t\t\ttoolCallId: toolCall.id,\n\t\t\t\t\t});\n\t\t\t\t\tmodelInstance.appendToolResult(params.messages, {\n\t\t\t\t\t\ttoolCallId: toolCall.id,\n\t\t\t\t\t\ttoolName,\n\t\t\t\t\t\tcontent: `Tool \"${toolName}\" is not available.`,\n\t\t\t\t\t\tisError: true,\n\t\t\t\t\t});\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tlet toolArgs: Record<string, unknown>;\n\t\t\t\ttry {\n\t\t\t\t\ttoolArgs = JSON.parse(toolCall.function.arguments || \"{}\");\n\t\t\t\t} catch (error) {\n\t\t\t\t\tloggers.intent.warn(\"Invalid tool arguments JSON\", {\n\t\t\t\t\t\ttoolName,\n\t\t\t\t\t\targuments: toolCall.function.arguments,\n\t\t\t\t\t\terror,\n\t\t\t\t\t});\n\t\t\t\t\tmodelInstance.appendToolResult(params.messages, {\n\t\t\t\t\t\ttoolCallId: toolCall.id,\n\t\t\t\t\t\ttoolName,\n\t\t\t\t\t\tcontent: `Invalid tool arguments JSON: ${toolCall.function.arguments}`,\n\t\t\t\t\t\tisError: true,\n\t\t\t\t\t});\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst { thinkingText, protocolArgs } = splitAdkToolArgs(toolArgs);\n\t\t\t\tyield {\n\t\t\t\t\tevent: \"thinking_process\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\ttitle: `[${getManifest().name}] ${selectedTool.protocol} 실행: ${toolName}`,\n\t\t\t\t\t\tdescription: truncateThinkingDescription(thinkingText),\n\t\t\t\t\t},\n\t\t\t\t};\n\n\t\t\t\tconst toolResult = yield* this.executeTool({\n\t\t\t\t\ttoolName,\n\t\t\t\t\tselectedTool,\n\t\t\t\t\tprotocolArgs,\n\t\t\t\t\tquery: params.query,\n\t\t\t\t\tthread: params.thread,\n\t\t\t\t});\n\n\t\t\t\tloggers.intent.debug(\"Tool Result\", { toolResult });\n\t\t\t\tprocessList.push(toolResult);\n\t\t\t\tmodelInstance.appendToolResult(params.messages, {\n\t\t\t\t\ttoolCallId: toolCall.id,\n\t\t\t\t\ttoolName,\n\t\t\t\t\tcontent: toolResult,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (iteration >= MAX_TOOL_ITERATIONS) {\n\t\t\tloggers.intent.warn(\"Tool calling loop reached max iterations cap\", {\n\t\t\t\tthreadId: params.thread.threadId,\n\t\t\t\tmaxIterations: MAX_TOOL_ITERATIONS,\n\t\t\t});\n\t\t}\n\n\t\treturn { toolCallsExecuted: processList.length };\n\t}\n\n\tprivate selectTool(\n\t\ttools: ConnectorTool[],\n\t\ttoolName: string,\n\t): ConnectorTool | undefined {\n\t\tfor (const [index, tool] of tools.entries()) {\n\t\t\tif (tool.toolName !== toolName) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (tool.protocol === CONNECTOR_PROTOCOL_TYPE.A2A) {\n\t\t\t\treturn tools.splice(index, 1)[0];\n\t\t\t}\n\n\t\t\treturn tool;\n\t\t}\n\t}\n\n\tprivate async *executeTool(params: {\n\t\ttoolName: string;\n\t\tselectedTool: ConnectorTool;\n\t\tprotocolArgs: Record<string, unknown>;\n\t\tquery: string;\n\t\tthread: ThreadObject;\n\t}): AsyncGenerator<StreamEvent, string, unknown> {\n\t\tconst { selectedTool, toolName, protocolArgs, query, thread } = params;\n\n\t\tif (\n\t\t\tthis.mcpModule &&\n\t\t\tselectedTool.protocol === CONNECTOR_PROTOCOL_TYPE.MCP\n\t\t) {\n\t\t\tloggers.intent.info(\"MCP tool call\", {\n\t\t\t\ttoolName,\n\t\t\t\ttoolArgs: protocolArgs,\n\t\t\t});\n\t\t\treturn await this.mcpModule.useTool(selectedTool, protocolArgs);\n\t\t}\n\n\t\tif (\n\t\t\tthis.a2aModule &&\n\t\t\tselectedTool.protocol === CONNECTOR_PROTOCOL_TYPE.A2A\n\t\t) {\n\t\t\tloggers.intent.info(\"A2A tool call\", { toolName });\n\t\t\tconst a2aStream = this.a2aModule.useTool(\n\t\t\t\tselectedTool,\n\t\t\t\tquery,\n\t\t\t\tthread.threadId,\n\t\t\t);\n\t\t\tlet result = await a2aStream.next();\n\t\t\twhile (!result.done) {\n\t\t\t\tif (result.value.event === \"thinking_process\") {\n\t\t\t\t\tyield result.value;\n\t\t\t\t}\n\t\t\t\tresult = await a2aStream.next();\n\t\t\t}\n\t\t\treturn result.value;\n\t\t}\n\n\t\tloggers.intent.warn(`Unrecognized tool type: ${selectedTool.protocol}`);\n\t\treturn \"\";\n\t}\n}\n"]}