{"version":3,"file":"agent/agent-runner.mjs","sources":["webpack://@multimodal/agent/./src/agent/agent-runner.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {\n  AgentRunObjectOptions,\n  AgentRunStreamingOptions,\n  AgentEventStream,\n  ToolCallEngine,\n  ToolCallEngineType,\n  AgentContextAwarenessOptions,\n} from '@multimodal/agent-interface';\nimport { ToolManager } from './tool-manager';\nimport { ResolvedModel, LLMReasoningOptions } from '@multimodal/model-provider';\nimport { getLogger } from '../utils/logger';\nimport type { Agent } from './agent';\nimport {\n  NativeToolCallEngine,\n  PromptEngineeringToolCallEngine,\n  StructuredOutputsToolCallEngine,\n} from '../tool-call-engine';\nimport { LLMProcessor } from './runner/llm-processor';\nimport { ToolProcessor } from './runner/tool-processor';\nimport { LoopExecutor } from './runner/loop-executor';\nimport { StreamAdapter } from './runner/stream-adapter';\nimport { AgentEventStreamProcessor } from './event-stream';\n\n/**\n * Runner configuration options\n */\ninterface AgentRunnerOptions {\n  instructions: string;\n  maxIterations: number;\n  maxTokens?: number;\n  temperature: number;\n  reasoningOptions: LLMReasoningOptions;\n  toolCallEngine?: ToolCallEngineType;\n  eventStream: AgentEventStreamProcessor;\n  toolManager: ToolManager;\n  agent: Agent;\n  contextAwarenessOptions?: AgentContextAwarenessOptions;\n}\n\n/**\n * AgentRunner - Coordinates the agent's execution\n *\n * This class serves as the main entry point for running agent loops,\n * delegating to specialized components for specific functionality.\n */\nexport class AgentRunner {\n  private instructions: string;\n  private maxIterations: number;\n  private maxTokens?: number;\n  private temperature: number;\n  private reasoningOptions: LLMReasoningOptions;\n  private toolCallEngine?: ToolCallEngine; // lazy init\n  private eventStream: AgentEventStreamProcessor;\n  private toolManager: ToolManager;\n  private agent: Agent;\n  private contextAwarenessOptions?: AgentContextAwarenessOptions;\n  private logger = getLogger('AgentRunner');\n\n  // Specialized components\n  public readonly toolProcessor: ToolProcessor;\n  public readonly llmProcessor: LLMProcessor;\n  public readonly loopExecutor: LoopExecutor;\n  public readonly streamAdapter: StreamAdapter;\n\n  constructor(private options: AgentRunnerOptions) {\n    this.instructions = options.instructions;\n    this.maxIterations = options.maxIterations;\n    this.maxTokens = options.maxTokens;\n    this.temperature = options.temperature;\n    this.reasoningOptions = options.reasoningOptions;\n    this.eventStream = options.eventStream;\n    this.toolManager = options.toolManager;\n    this.agent = options.agent;\n    this.contextAwarenessOptions = options.contextAwarenessOptions;\n\n    // Initialize the specialized components\n    this.toolProcessor = new ToolProcessor(this.agent, this.toolManager, this.eventStream);\n\n    this.llmProcessor = new LLMProcessor(\n      this.agent,\n      this.eventStream,\n      this.toolProcessor,\n      this.reasoningOptions,\n      this.maxTokens,\n      this.temperature,\n      this.contextAwarenessOptions,\n    );\n\n    this.loopExecutor = new LoopExecutor(\n      this.agent,\n      this.llmProcessor,\n      this.eventStream,\n      this.instructions,\n      this.maxIterations,\n    );\n\n    this.streamAdapter = new StreamAdapter(this.eventStream);\n  }\n\n  /**\n   * Create the appropriate tool call engine based on configuration\n   * @param engineType The requested engine type\n   * @returns The created tool call engine\n   */\n  private createToolCallEngine(engineType?: ToolCallEngineType): ToolCallEngine {\n    let engine: ToolCallEngine;\n\n    switch (engineType) {\n      case 'prompt_engineering':\n        engine = new PromptEngineeringToolCallEngine();\n        break;\n      case 'native':\n        engine = new NativeToolCallEngine();\n        break;\n      case 'structured_outputs':\n        engine = new StructuredOutputsToolCallEngine();\n        break;\n      default:\n        // Default to native engine\n        engineType = 'native';\n        engine = new NativeToolCallEngine();\n        break;\n    }\n\n    return engine;\n  }\n\n  /**\n   * Get the current loop iteration number\n   * @returns The current iteration number (1-based)\n   */\n  getCurrentIteration(): number {\n    return this.loopExecutor.getCurrentIteration();\n  }\n\n  /**\n   * Handles errors from LLM processing and agent loop execution\n   * @param error The error that occurred\n   * @param resolvedModel The resolved model information\n   * @param sessionId The current session ID\n   * @param abortSignal Optional abort signal\n   * @returns An assistant message event with error information\n   */\n  private handleError(\n    error: unknown,\n    resolvedModel: ResolvedModel,\n    sessionId: string,\n    abortSignal?: AbortSignal,\n  ): AgentEventStream.AssistantMessageEvent {\n    // Check if this is an abort error\n    const isAbortError =\n      (error instanceof Error && error.name === 'AbortError') || abortSignal?.aborted;\n\n    if (isAbortError) {\n      this.logger.info(`[Session] Execution aborted | SessionId: \"${sessionId}\"`);\n\n      // Add system event for aborted request\n      const systemEvent = this.eventStream.createEvent('system', {\n        level: 'info',\n        message: `LLM request aborted`,\n        details: { provider: resolvedModel.provider },\n      });\n      this.eventStream.sendEvent(systemEvent);\n\n      // Return an abort message\n      return this.eventStream.createEvent('assistant_message', {\n        content: 'Request was aborted',\n        finishReason: 'abort',\n      });\n    } else {\n      // Handle other types of errors\n      this.logger.error(\n        `[Session] Error in execution | SessionId: \"${sessionId}\" | Error: ${error}`,\n      );\n\n      // Add system event for error\n      const systemEvent = this.eventStream.createEvent('system', {\n        level: 'error',\n        message: `LLM API error: ${error}`,\n        details: { error: String(error), provider: resolvedModel.provider },\n      });\n      this.eventStream.sendEvent(systemEvent);\n\n      // Add error message as assistant response\n      const errorMessage = `Sorry, an error occurred while processing your request: ${error}`;\n      return this.eventStream.createEvent('assistant_message', {\n        content: errorMessage,\n        finishReason: 'error',\n      });\n    }\n  }\n\n  /**\n   * Executes the agent's reasoning loop in non-streaming mode\n   *\n   * @param runOptions Options for this execution\n   * @param resolvedModel The resolved model configuration\n   * @param sessionId Unique session identifier\n   * @returns Final answer as an AgentEventStream.AssistantMessageEvent\n   */\n  async execute(\n    runOptions: AgentRunObjectOptions,\n    resolvedModel: ResolvedModel,\n    sessionId: string,\n  ): Promise<AgentEventStream.AssistantMessageEvent> {\n    // Resolve which model and provider to use\n    const abortSignal = runOptions.abortSignal;\n\n    this.logger.info(\n      `[Session] Execution started | SessionId: \"${sessionId}\" | ` +\n        `Provider: \"${resolvedModel.provider}\" | Model: \"${resolvedModel.id}\" | ` +\n        `Mode: non-streaming`,\n    );\n\n    try {\n      // Check if already aborted\n      if (abortSignal?.aborted) {\n        this.logger.warn(`[Session] Execution aborted before starting | SessionId: \"${sessionId}\"`);\n\n        // Create system event for aborted execution\n        const systemEvent = this.eventStream.createEvent('system', {\n          level: 'warning',\n          message: 'Execution aborted',\n        });\n        this.eventStream.sendEvent(systemEvent);\n\n        // Return minimal response\n        return this.eventStream.createEvent('assistant_message', {\n          content: 'Request was aborted',\n          finishReason: 'abort',\n        });\n      }\n\n      const toolCallEngineType =\n        this.options.toolCallEngine ?? runOptions.toolCallEngine ?? 'native';\n      const toolCallEngine = this.createToolCallEngine(toolCallEngineType);\n      this.logger.info(`Using tool call engine: ${toolCallEngineType}`);\n\n      try {\n        // Execute the agent loop with abort signal\n        return await this.loopExecutor.executeLoop(\n          resolvedModel,\n          sessionId,\n          toolCallEngine,\n          false, // Non-streaming mode\n          abortSignal,\n        );\n      } catch (error) {\n        // Handle LLM and execution errors\n        return this.handleError(error, resolvedModel, sessionId, abortSignal);\n      }\n    } finally {\n      await this.agent.onAgentLoopEnd(sessionId);\n    }\n  }\n\n  /**\n   * Executes the agent's reasoning loop in streaming mode\n   *\n   * @param runOptions Options for this execution\n   * @param resolvedModel The resolved model configuration\n   * @param sessionId Unique session identifier\n   * @returns AsyncIterable of streaming events\n   */\n  async executeStreaming(\n    runOptions: AgentRunStreamingOptions,\n    resolvedModel: ResolvedModel,\n    sessionId: string,\n  ): Promise<AsyncIterable<AgentEventStream.Event>> {\n    // Resolve which model and provider to use\n    const abortSignal = runOptions.abortSignal;\n\n    this.logger.info(\n      `[Session] Execution started | SessionId: \"${sessionId}\" | ` +\n        `Provider: \"${resolvedModel.provider}\" | Model: \"${resolvedModel.id}\" | ` +\n        `Mode: streaming`,\n    );\n\n    // Check if already aborted\n    if (abortSignal?.aborted) {\n      this.logger.warn(`[Session] Execution aborted before starting | SessionId: \"${sessionId}\"`);\n\n      // Create an empty stream with just an abort event\n      const emptyStream = this.streamAdapter.createAbortedStream();\n      return emptyStream;\n    }\n\n    const toolCallEngineType = this.options.toolCallEngine ?? runOptions.toolCallEngine ?? 'native';\n    const toolCallEngine = this.createToolCallEngine(toolCallEngineType);\n    this.logger.info(`Using tool call engine: ${toolCallEngineType}`);\n\n    // Create a stream of events\n    const stream = this.streamAdapter.createStreamFromEvents(abortSignal);\n\n    // Start the agent loop execution in the background\n    this.loopExecutor\n      .executeLoop(\n        resolvedModel,\n        sessionId,\n        toolCallEngine,\n        true, // Streaming mode\n        abortSignal,\n      )\n      .then((finalEvent) => {\n        // When the loop is completely done (final answer produced)\n        this.logger.info(`[Stream] Agent loop execution completed with final answer`);\n        this.streamAdapter.completeStream(finalEvent);\n        return finalEvent;\n      })\n      .catch((error) => {\n        // Handle errors in execution\n        if (abortSignal?.aborted) {\n          this.logger.info(`[Stream] Agent loop execution aborted`);\n          this.streamAdapter.abortStream();\n        } else {\n          // Handle other errors during execution\n          this.logger.error(`[Stream] Error in agent loop execution: ${error}`);\n\n          // Create system error event\n          const systemEvent = this.eventStream.createEvent('system', {\n            level: 'error',\n            message: `Error in agent execution: ${error}`,\n            details: { error: String(error), provider: resolvedModel.provider },\n          });\n          this.eventStream.sendEvent(systemEvent);\n        }\n      })\n      .finally(async () => {\n        await this.agent.onAgentLoopEnd(sessionId);\n      });\n\n    return stream;\n  }\n}\n"],"names":["AgentRunner","engineType","engine","PromptEngineeringToolCallEngine","NativeToolCallEngine","StructuredOutputsToolCallEngine","error","resolvedModel","sessionId","abortSignal","isAbortError","Error","systemEvent","String","errorMessage","runOptions","toolCallEngineType","toolCallEngine","emptyStream","stream","finalEvent","options","getLogger","ToolProcessor","LLMProcessor","LoopExecutor","StreamAdapter"],"mappings":"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"}