export type Role = 'user' | 'assistant';
export interface Turn {
    role: Role;
    content: string;
    additionalMetadata?: Record<string, unknown>;
}
export interface ConversationalTestCase {
    turns: Turn[];
    additionalMetadata?: Record<string, unknown>;
}
export interface UserProfile {
    user_profile: string;
}
export interface Scenario {
    scenario: string;
}
export interface SimulatedInput {
    simulated_input: string;
}
export interface ConversationCompletion {
    is_complete: boolean;
    reason: string;
}
export interface SimulatorModel {
    /**
     * Generate a completion for `prompt`.  If you supply a `jsonKey`, the model is
     * expected to return valid JSON with that top‑level key and we’ll parse it.
     * Return the parsed result plus a numeric token cost (for accounting).
     */
    generate<T>(prompt: string, jsonKey?: keyof T): Promise<{
        result: T;
        cost: number;
    }>;
    /** Human‑readable name, used for logs & progress bars. */
    getModelName(): string;
}
export declare class ConversationSimulatorTemplate {
    static generateUserProfile(userProfileItems: string[], language: string): string;
    static generateScenario(userProfile: string, intent: string, language: string): string;
    static generateFirstInput(scenario: string, userProfile: string, language: string): string;
    static generateNextUserInput(scenario: string, userProfile: string, conversationHistory: string, language: string): string;
    static checkConversationCompleted(conversationHistory: string, stoppingCriteria: string): string;
}
export interface ConversationSimulatorOpts {
    userIntentions: Record<string, number>;
    /**
     * Supply *either* free‑form profile strings *or* items to synthesise profiles
     * on the fly (e.g. ["name", "phone number" …]).
     */
    userProfiles?: string[];
    userProfileItems?: string[];
    simulatorModel: SimulatorModel;
    openingMessage?: string;
    maxConcurrent?: number;
    language?: string;
    cliApiClient?: {
        getUserProfile: (intent: string, userProfileItems?: string[]) => Promise<{
            userProfile: string;
            cost?: number;
            tokenUsage?: {
                prompt: number;
                completion: number;
                total: number;
                cached: number;
            };
        }>;
        getScenario: (userProfile: string, intent: string) => Promise<{
            scenario: string;
            cost?: number;
            tokenUsage?: {
                prompt: number;
                completion: number;
                total: number;
                cached: number;
            };
        }>;
        getUserInput: (scenario: string, userProfile: string, conversationHistory?: Turn[]) => Promise<{
            userInput: string;
            cost?: number;
            tokenUsage?: {
                prompt: number;
                completion: number;
                total: number;
                cached: number;
            };
        }>;
    };
    total?: {
        cost: any;
        tokenUsage: {
            prompt: any;
            completion: any;
            total: any;
            cached: any;
        };
    };
}
export declare class ConversationSimulator {
    private readonly opts;
    private semaphore;
    private simulatedConversations;
    private language;
    private simulationCost;
    constructor(opts: ConversationSimulatorOpts);
    /**
     * Simulate all requested conversations.
     * @param modelCallback  Function that sends the user input to *your* chatbot
     *                       and returns either a string response or
     *                       [response, updatedKwargs].
     */
    simulate(modelCallback: (input: string, params: {
        conversationHistory: Turn[];
    } & Record<string, unknown>) => Promise<string | [string, Record<string, unknown>]>, minTurns?: number, maxTurns?: number, stoppingCriteria?: string, cliCall?: boolean): Promise<ConversationalTestCase[]>;
    private simulateSingleConversation;
    private simulateUserProfile;
    private simulateScenario;
    private simulateFirstUserInput;
    private simulateNextUserInput;
    private checkConversationComplete;
}
//# sourceMappingURL=conversationSimulator.d.ts.map