import { ProviderV1, LanguageModelV1, LanguageModelV1CallOptions } from '@ai-sdk/provider';
import { OpenAIProviderSettings } from '@ai-sdk/openai';
import { OpenAIChatSettings } from '@ai-sdk/openai/internal';
import { AnthropicMessagesSettings } from '@ai-sdk/anthropic/internal';
import { AnthropicProviderSettings } from '@ai-sdk/anthropic';
import { LanguageModelV1Prompt } from 'ai';

interface Mem0Provider extends ProviderV1 {
    (modelId: Mem0ChatModelId, settings?: Mem0ChatSettings): LanguageModelV1;
    chat(modelId: Mem0ChatModelId, settings?: Mem0ChatSettings): LanguageModelV1;
    completion(modelId: Mem0ChatModelId, settings?: Mem0ChatSettings): LanguageModelV1;
    languageModel(modelId: Mem0ChatModelId, settings?: Mem0ChatSettings): LanguageModelV1;
}
interface Mem0ProviderSettings extends OpenAIChatSettings, AnthropicMessagesSettings {
    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>;
    name?: string;
    mem0ApiKey?: string;
    apiKey?: string;
    provider?: string;
    modelType?: "completion" | "chat";
    mem0Config?: Mem0Config;
    /**
     * The configuration for the provider.
     */
    config?: OpenAIProviderSettings | AnthropicProviderSettings;
}
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;
    org_name?: string;
    project_name?: string;
    org_id?: string;
    project_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;
    enable_graph?: boolean;
    output_format?: string;
    filter_memories?: boolean;
}
interface Mem0ChatConfig extends Mem0ConfigSettings, Mem0ProviderSettings {
}
interface Mem0Config extends Mem0ConfigSettings {
}
interface Mem0ChatSettings extends OpenAIChatSettings, AnthropicMessagesSettings, Mem0ConfigSettings {
}

declare class Mem0GenericLanguageModel implements LanguageModelV1 {
    readonly modelId: Mem0ChatModelId;
    readonly settings: Mem0ChatSettings;
    readonly config: Mem0ChatConfig;
    readonly provider_config?: Mem0ProviderSettings | undefined;
    readonly specificationVersion = "v1";
    readonly defaultObjectGenerationMode = "json";
    readonly supportsImageUrls = false;
    constructor(modelId: Mem0ChatModelId, settings: Mem0ChatSettings, config: Mem0ChatConfig, provider_config?: Mem0ProviderSettings | undefined);
    provider: string;
    private processMemories;
    doGenerate(options: LanguageModelV1CallOptions): Promise<Awaited<ReturnType<LanguageModelV1['doGenerate']>>>;
    doStream(options: LanguageModelV1CallOptions): Promise<Awaited<ReturnType<LanguageModelV1['doStream']>>>;
}

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: LanguageModelV1Prompt, config?: Mem0ConfigSettings) => Promise<any>;
declare const retrieveMemories: (prompt: LanguageModelV1Prompt | string, config?: Mem0ConfigSettings) => Promise<string>;
declare const getMemories: (prompt: LanguageModelV1Prompt | string, config?: Mem0ConfigSettings) => Promise<any>;
declare const searchMemories: (prompt: LanguageModelV1Prompt | string, config?: Mem0ConfigSettings) => Promise<any>;

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