/**
 * A basic flow that calls the LLM in a loop until a final response is generated.
 * This flow ends when it transfers to another agent.
 */
import { InvocationContext } from '../../agents/InvocationContext';
import { BaseAgent } from '../../agents/BaseAgent';
import { Event } from '../../events/Event';
import { LlmRequest } from '../../models/LlmRequest';
import { LlmResponse } from '../../models/LlmResponse';
import { BaseLlmConnection } from '../../models/BaseLlmConnection';
import { BaseLlmRequestProcessor, BaseLlmResponseProcessor } from './BaseLlmProcessor';
import { ToolContext } from '../../tools/ToolContext';
declare module '../../telemetry' {
    interface Tracer {
        startAsCurrentSpan(name: string): {
            end: () => void;
        };
    }
}
declare module '../../agents/BaseAgent' {
    interface BaseAgent {
        runLive(context: InvocationContext): AsyncGenerator<Event, void, unknown>;
        runAsync(context: InvocationContext): AsyncGenerator<Event, void, unknown>;
        rootAgent: BaseAgent;
        findAgent(name: any): BaseAgent | undefined;
    }
}
declare module '../../tools/BaseTool' {
    interface BaseTool {
        processLlmRequest(params: {
            toolContext: ToolContext;
            llmRequest: any;
        }): Promise<void>;
    }
}
declare module '../../agents/LiveRequestQueue' {
    interface LiveRequestQueue {
        close(): void;
        sendClose(): void;
    }
}
/**
 * A basic flow that calls the LLM in a loop until a final response is generated.
 * This flow ends when it transfers to another agent.
 */
export declare abstract class BaseLlmFlow {
    /**
     * List of request processors to run before LLM call
     */
    protected requestProcessors: BaseLlmRequestProcessor[];
    /**
     * List of response processors to run after LLM call
     */
    protected responseProcessors: BaseLlmResponseProcessor[];
    /**
     * Runs the flow using live API.
     *
     * @param invocationContext The invocation context
     * @returns An async generator of events
     */
    runLive(invocationContext: InvocationContext): AsyncGenerator<Event, void, unknown>;
    /**
     * Sends data to the model in a loop.
     *
     * @param llmConnection The LLM connection
     * @param invocationContext The invocation context
     */
    protected _sendToModel(llmConnection: BaseLlmConnection, invocationContext: InvocationContext): Promise<void>;
    /**
     * Receives data from the model and processes events.
     *
     * @param llmConnection The LLM connection
     * @param eventId The event ID
     * @param invocationContext The invocation context
     * @param llmRequest The LLM request
     * @returns An async generator of events
     */
    protected _receiveFromModel(llmConnection: BaseLlmConnection, eventId: string, invocationContext: InvocationContext, llmRequest: LlmRequest): AsyncGenerator<Event, void, unknown>;
    /**
     * Runs the flow asynchronously.
     *
     * @param invocationContext The invocation context
     * @returns An async generator of events
     */
    runAsync(invocationContext: InvocationContext): AsyncGenerator<Event, void, unknown>;
    /**
     * Runs one step of the flow asynchronously.
     *
     * @param invocationContext The invocation context
     * @returns An async generator of events
     */
    protected _runOneStepAsync(invocationContext: InvocationContext): AsyncGenerator<Event, void, unknown>;
    /**
     * Preprocesses the request before calling the LLM.
     *
     * @param invocationContext The invocation context
     * @param llmRequest The LLM request
     * @returns An async generator of events
     */
    protected _preprocessAsync(invocationContext: InvocationContext, llmRequest: LlmRequest): AsyncGenerator<Event, void, unknown>;
    /**
     * Postprocesses the response after the LLM call.
     *
     * @param invocationContext The invocation context
     * @param llmRequest The LLM request
     * @param llmResponse The LLM response
     * @param modelResponseEvent The model response event
     * @returns An async generator of events
     */
    protected _postprocessAsync(invocationContext: InvocationContext, llmRequest: LlmRequest, llmResponse: LlmResponse, modelResponseEvent: Event): AsyncGenerator<Event, void, unknown>;
    /**
     * Postprocesses the response for the live API.
     *
     * @param invocationContext The invocation context
     * @param llmRequest The LLM request
     * @param llmResponse The LLM response
     * @param modelResponseEvent The model response event
     * @returns An async generator of events
     */
    protected _postprocessLive(invocationContext: InvocationContext, llmRequest: LlmRequest, llmResponse: LlmResponse, modelResponseEvent: Event): AsyncGenerator<Event, void, unknown>;
    /**
     * Runs the response processors.
     *
     * @param invocationContext The invocation context
     * @param llmResponse The LLM response
     * @returns An async generator of events
     */
    protected _postprocessRunProcessorsAsync(invocationContext: InvocationContext, llmResponse: LlmResponse): AsyncGenerator<Event, void, unknown>;
    /**
     * Handles function calls in the response.
     *
     * @param invocationContext The invocation context
     * @param functionCallEvent The function call event
     * @param llmRequest The LLM request
     * @returns An async generator of events
     */
    protected _postprocessHandleFunctionCallsAsync(invocationContext: InvocationContext, functionCallEvent: Event, llmRequest: LlmRequest): AsyncGenerator<Event, void, unknown>;
    /**
     * Gets the agent to run for a transfer_to_agent function call.
     *
     * @param invocationContext The invocation context
     * @param transferToAgent The agent to transfer to
     * @returns The agent to run
     */
    protected _getAgentToRun(invocationContext: InvocationContext, transferToAgent: string | {
        agent_name: string;
    } | Record<string, any>): BaseAgent;
    /**
     * Calls the LLM asynchronously.
     *
     * @param invocationContext The invocation context
     * @param llmRequest The LLM request
     * @param modelResponseEvent The model response event
     * @returns An async generator of LLM responses
     */
    protected _callLlmAsync(invocationContext: InvocationContext, llmRequest: LlmRequest, modelResponseEvent: Event): AsyncGenerator<LlmResponse, void, unknown>;
    /**
     * Handles the before model callback.
     *
     * @param invocationContext The invocation context
     * @param llmRequest The LLM request
     * @param modelResponseEvent The model response event
     * @returns The callback response or undefined
     */
    protected _handleBeforeModelCallback(invocationContext: InvocationContext, llmRequest: LlmRequest, modelResponseEvent: Event): LlmResponse | undefined;
    /**
     * Handles the after model callback.
     *
     * @param invocationContext The invocation context
     * @param llmResponse The LLM response
     * @param modelResponseEvent The model response event
     * @returns The altered LLM response or undefined
     */
    protected _handleAfterModelCallback(invocationContext: InvocationContext, llmResponse: LlmResponse, modelResponseEvent: Event): LlmResponse | undefined;
    /**
     * Finalizes the model response event.
     *
     * @param llmRequest The LLM request
     * @param llmResponse The LLM response
     * @param modelResponseEvent The model response event
     * @returns The finalized event
     */
    protected _finalizeModelResponseEvent(llmRequest: LlmRequest, llmResponse: LlmResponse, modelResponseEvent: Event): Event;
    /**
     * Gets the LLM from the invocation context.
     *
     * @param invocationContext The invocation context
     * @returns The LLM
     */
    private _getLlm;
}
