import { ProviderV3, LanguageModelV3, LanguageModelV3CallOptions, LanguageModelV3GenerateResult, LanguageModelV3StreamResult, LanguageModelV3Prompt } from '@ai-sdk/provider';
import { OpenAIProviderSettings } from '@ai-sdk/openai';
import { AnthropicProviderSettings } from '@ai-sdk/anthropic';
import { CohereProviderSettings } from '@ai-sdk/cohere';
import { GroqProviderSettings } from '@ai-sdk/groq';
import { GoogleGenerativeAIProviderSettings } from '@ai-sdk/google';

interface Mem0Provider extends ProviderV3 {
    (modelId: Mem0ChatModelId, settings?: Mem0ChatSettings): LanguageModelV3;
    chat(modelId: Mem0ChatModelId, settings?: Mem0ChatSettings): LanguageModelV3;
    completion(modelId: Mem0ChatModelId, settings?: Mem0ChatSettings): LanguageModelV3;
    languageModel(modelId: Mem0ChatModelId, settings?: Mem0ChatSettings): LanguageModelV3;
}
interface Mem0ProviderSettings {
    baseURL?: string;
    /**
     * Custom fetch implementation. You can use it as a middleware to intercept
     * requests or to provide a custom fetch implementation for e.g. testing
     */
    fetch?: typeof fetch;
    /**
     * Custom headers to include in the requests.
     */
    headers?: Record<string, string | undefined>;
    name?: string;
    mem0ApiKey?: string;
    apiKey?: string;
    provider?: string;
    modelType?: "completion" | "chat";
    mem0Config?: Mem0Config;
    /**
     * The configuration for the provider.
     */
    config?: LLMProviderSettings;
}
declare function createMem0(options?: Mem0ProviderSettings): Mem0Provider;
declare const mem0: Mem0Provider;

type Mem0ChatModelId = (string & NonNullable<unknown>);
interface Mem0ConfigSettings {
    user_id?: string;
    app_id?: string;
    agent_id?: string;
    run_id?: string;
    metadata?: Record<string, any>;
    filters?: Record<string, any>;
    infer?: boolean;
    page?: number;
    page_size?: number;
    mem0ApiKey?: string;
    top_k?: number;
    threshold?: number;
    rerank?: boolean;
    host?: string;
}
interface Mem0ChatConfig extends Mem0ConfigSettings, Mem0ProviderSettings {
}
type LLMProviderSettings = OpenAIProviderSettings | AnthropicProviderSettings | CohereProviderSettings | GroqProviderSettings | GoogleGenerativeAIProviderSettings;
interface Mem0Config extends Mem0ConfigSettings {
}
interface Mem0ChatSettings extends Mem0ConfigSettings {
}

declare class Mem0GenericLanguageModel implements LanguageModelV3 {
    readonly modelId: Mem0ChatModelId;
    readonly settings: Mem0ChatSettings;
    readonly config: Mem0ChatConfig;
    readonly provider_config?: Mem0ProviderSettings | undefined;
    readonly specificationVersion = "v3";
    readonly supportedUrls: Record<string, RegExp[]>;
    constructor(modelId: Mem0ChatModelId, settings: Mem0ChatSettings, config: Mem0ChatConfig, provider_config?: Mem0ProviderSettings | undefined);
    provider: string;
    private processMemories;
    doGenerate(options: LanguageModelV3CallOptions): Promise<LanguageModelV3GenerateResult>;
    doStream(options: LanguageModelV3CallOptions): Promise<LanguageModelV3StreamResult>;
}

declare class Mem0 {
    readonly baseURL: string;
    readonly headers?: any;
    constructor(options?: Mem0ProviderSettings);
    private get baseConfig();
    chat(modelId: Mem0ChatModelId, settings?: Mem0ChatSettings): Mem0GenericLanguageModel;
    completion(modelId: Mem0ChatModelId, settings?: Mem0ChatSettings): Mem0GenericLanguageModel;
}

declare const addMemories: (messages: LanguageModelV3Prompt, config?: Mem0ConfigSettings) => Promise<any>;
declare const retrieveMemories: (prompt: LanguageModelV3Prompt | string, config?: Mem0ConfigSettings) => Promise<string>;
declare const getMemories: (prompt: LanguageModelV3Prompt | string, config?: Mem0ConfigSettings) => Promise<any>;
declare const searchMemories: (prompt: LanguageModelV3Prompt | string, config?: Mem0ConfigSettings) => Promise<any>;

export { Mem0, type Mem0ChatConfig, type Mem0ChatSettings, type Mem0ConfigSettings, type Mem0Provider, type Mem0ProviderSettings, addMemories, createMem0, getMemories, mem0, retrieveMemories, searchMemories };
