declare enum ModelEnum {
    'gpt-4' = "gpt-4",
    'gpt-4-turbo' = "gpt-4-turbo",
    'gpt-4o' = "gpt-4o",
    'gpt-4o-64k-output-alpha' = "gpt-4o-64k-output-alpha",
    'gpt-4o-mini' = "gpt-4o-mini",
    'gpt-4o-2024-08-06' = "gpt-4o-2024-08-06",
    'gpt-4.1' = "gpt-4.1",
    'gpt-4.1-mini' = "gpt-4.1-mini",
    'gpt-4.1-nano' = "gpt-4.1-nano",
    'o1-preview' = "o1-preview",
    'o1-mini' = "o1-mini",
    'o1' = "o1",
    'o3' = "o3",
    'o3-mini' = "o3-mini",
    'o4-mini' = "o4-mini",
    'claude-3-5-sonnet-20240620' = "claude-3-5-sonnet-20240620",
    'claude-3-5-sonnet-20241022' = "claude-3-5-sonnet-20241022",
    'claude-3-5-haiku-20241022' = "claude-3-5-haiku-20241022",
    'claude-3-7-sonnet-20250219' = "claude-3-7-sonnet-20250219",
    'claude-opus-4-20250514' = "claude-opus-4-20250514",
    'claude-sonnet-4-20250514' = "claude-sonnet-4-20250514",
    'deepseek-chat' = "deepseek-chat",
    'deepseek-reasoner' = "deepseek-reasoner",
    'gemini-2.5-pro-exp-03-25' = "gemini-2.5-pro-exp-03-25",
    'gemini-2.5-pro-preview-03-25' = "gemini-2.5-pro-preview-03-25",
    'gemini-2.5-pro-preview-05-06' = "gemini-2.5-pro-preview-05-06",
    'gemini-2.5-pro-preview-06-05' = "gemini-2.5-pro-preview-06-05",
    'gemini-2.5-pro' = "gemini-2.5-pro",
    'gemini-2.5-flash-preview-04-17' = "gemini-2.5-flash-preview-04-17",
    'gemini-2.5-flash-preview-05-20' = "gemini-2.5-flash-preview-05-20",
    'gemini-2.5-flash' = "gemini-2.5-flash"
}
declare enum NonModelEnum {
    'chatgpt' = "chatgpt"
}
declare const AllModels: ModelEnum[];
declare const AllModelLikes: (ModelEnum | NonModelEnum.chatgpt)[];
type ModelLike = ModelEnum | NonModelEnum;

declare const AI_PROVIDERS: {
    readonly OPENAI: "openai";
    readonly ANTHROPIC: "anthropic";
    readonly AZURE_OPENAI: "azure-openai";
    readonly DEEPSEEK: "deepseek";
    readonly OPENROUTER: "openrouter";
    readonly GOOGLE: "google";
    readonly GOOGLE_VERTEX_AI: "google-vertex-ai";
    readonly FIREWORKS: "fireworks";
};
type AI_PROVIDER_TYPE = (typeof AI_PROVIDERS)[keyof typeof AI_PROVIDERS];
type FIRST_PARTY_SDK_AI_PROVIDER_TYPE = {
    name: string;
    firstParty: true;
    thirdParty: false;
    nativeSDK: true;
    baseURL?: string;
    website?: string;
};
type FIRST_PARTY_BASE_URL_AI_PROVIDER_TYPE = {
    name: string;
    firstParty: true;
    thirdParty: false;
    baseURL: string;
    nativeSDK: false;
    website?: string;
};
type THIRD_PARTY_AI_PROVIDER_TYPE = {
    name: string;
    firstParty: false;
    thirdParty: true;
    nativeSDK: false;
    baseURL: string;
    website: string;
};
type AI_PROVIDER_CONFIG_TYPE = FIRST_PARTY_SDK_AI_PROVIDER_TYPE | FIRST_PARTY_BASE_URL_AI_PROVIDER_TYPE | THIRD_PARTY_AI_PROVIDER_TYPE;
declare const AI_PROVIDER_CONFIG: Record<AI_PROVIDER_TYPE, AI_PROVIDER_CONFIG_TYPE>;
declare const AI_PROVIDER_NAME_MAP: Record<AI_PROVIDER_TYPE, string>;

type ModelInfoCurrent = {
    name: string;
    provider: AI_PROVIDER_TYPE;
    id: string;
    contextWindowTokenLimit: number;
    outputTokenLimit: number | null;
    pricePerMillionInputTokens: number | null;
    pricePerMillionOutputTokens: number | null;
    tokenizerId: string | null;
    notes?: string;
    notesUrl?: string;
    legacy: false;
    alpha?: boolean;
    small?: boolean;
    reasoning?: boolean;
    recommendedForCoding?: boolean;
    recommendedForWriting?: boolean;
    supportsImageInput?: boolean;
    openRouterModelId?: string;
};
type ModelInfoLegacy = {
    name: string;
    provider: AI_PROVIDER_TYPE;
    id: string;
    contextWindowTokenLimit: number;
    outputTokenLimit: number | null;
    pricePerMillionInputTokens: number | null;
    pricePerMillionOutputTokens: number | null;
    tokenizerId: string | null;
    notes?: string;
    notesUrl?: string;
    legacy: true;
    legacyReason: string;
    alpha?: boolean;
    small?: boolean;
    reasoning?: boolean;
    recommendedForCoding?: boolean;
    recommendedForWriting?: boolean;
    supportsImageInput?: boolean;
    openRouterModelId?: string;
};
type ModelInfo = ModelInfoCurrent | ModelInfoLegacy;

type OpenRouterModelResponse = {
    data: Array<{
        id: string;
        name: string;
        created: number;
        description: string;
        architecture: {
            input_modalities: string[];
            output_modalities: string[];
            tokenizer: string;
        };
        top_provider: {
            is_moderated: boolean;
        };
        pricing: {
            prompt: string;
            completion: string;
            image: string;
            request: string;
            input_cache_read: string;
            input_cache_write: string;
            web_search: string;
            internal_reasoning: string;
        };
        context_length: number;
        per_request_limits: Record<string, string>;
    }>;
};
/**
 * Convert OpenRouter model to ModelInfo
 * @param model OpenRouter model
 * @returns ModelInfo object
 */
declare function convertOpenRouterModelToModelInfo(model: OpenRouterModelResponse['data'][0]): ModelInfo;
/**
 * Get all available models from OpenRouter API
 * @returns Promise with the OpenRouter API response
 */
declare function getOpenRouterModels(): Promise<OpenRouterModelResponse>;
/**
 * Get all models from a specific provider
 * @param provider The AI provider to get models from
 * @returns Promise with an array of ModelInfo objects for the specified provider
 */
declare function getModelsByProvider(provider: AI_PROVIDER_TYPE): Promise<ModelInfo[]>;

declare const ModelInfoMap: Record<ModelLike, Omit<ModelInfoCurrent, 'id'> | Omit<ModelInfoLegacy, 'id'>>;
declare function getModelInfoWithId(id: ModelLike): ModelInfo;
declare function getAllModelsWithIds(): ModelInfo[];

export { AI_PROVIDERS, AI_PROVIDER_CONFIG, type AI_PROVIDER_CONFIG_TYPE, AI_PROVIDER_NAME_MAP, type AI_PROVIDER_TYPE, AllModelLikes, AllModels, type FIRST_PARTY_BASE_URL_AI_PROVIDER_TYPE, type FIRST_PARTY_SDK_AI_PROVIDER_TYPE, ModelEnum, type ModelInfo, type ModelInfoCurrent, type ModelInfoLegacy, ModelInfoMap, type ModelLike, NonModelEnum, type OpenRouterModelResponse, type THIRD_PARTY_AI_PROVIDER_TYPE, convertOpenRouterModelToModelInfo, getAllModelsWithIds, getModelInfoWithId, getModelsByProvider, getOpenRouterModels };
