@mem0/vercel-ai-provider
Version:
Vercel AI Provider for providing memory to LLMs
1 lines • 51.2 kB
Source Map (JSON)
{"version":3,"sources":["../src/mem0-facade.ts","../src/provider-response-provider.ts","../src/mem0-provider-selector.ts","../src/mem0-utils.ts","../src/mem0-generic-language-model.ts","../src/mem0-provider.ts"],"sourcesContent":["import { withoutTrailingSlash } from '@ai-sdk/provider-utils'\n\nimport { Mem0GenericLanguageModel } from './mem0-generic-language-model'\nimport { Mem0ChatModelId, Mem0ChatSettings } from './mem0-types'\nimport { Mem0ProviderSettings } from './mem0-provider'\n\nexport class Mem0 {\n readonly baseURL: string\n readonly headers?: any\n\n constructor(options: Mem0ProviderSettings = {\n provider: 'openai',\n }) {\n this.baseURL =\n withoutTrailingSlash(options.baseURL) ?? 'http://127.0.0.1:11434/api'\n\n this.headers = options.headers\n }\n\n private get baseConfig() {\n return {\n baseURL: this.baseURL,\n headers: this.headers,\n }\n }\n\n chat(modelId: Mem0ChatModelId, settings: Mem0ChatSettings = {}) {\n return new Mem0GenericLanguageModel(modelId, settings, {\n provider: 'openai',\n modelType: 'chat',\n ...this.baseConfig,\n })\n }\n\n completion(modelId: Mem0ChatModelId, settings: Mem0ChatSettings = {}) {\n return new Mem0GenericLanguageModel(modelId, settings, {\n provider: 'openai',\n modelType: 'completion',\n ...this.baseConfig,\n })\n }\n}","import { LanguageModelV2, LanguageModelV2CallOptions } from \"@ai-sdk/provider\";\nimport { Mem0ProviderSettings } from \"./mem0-provider\";\nimport { createOpenAI, OpenAIProviderSettings } from \"@ai-sdk/openai\";\nimport { CohereProviderSettings, createCohere } from \"@ai-sdk/cohere\";\nimport { AnthropicProviderSettings, createAnthropic } from \"@ai-sdk/anthropic\";\nimport { createGoogleGenerativeAI, GoogleGenerativeAIProviderSettings } from \"@ai-sdk/google\";\nimport { createGroq, GroqProviderSettings } from \"@ai-sdk/groq\";\n\n// Define a private provider field\nclass Mem0AITextGenerator implements LanguageModelV2 {\n readonly specificationVersion = \"v2\";\n readonly defaultObjectGenerationMode = \"json\";\n readonly supportsImageUrls = false;\n readonly modelId: string;\n readonly provider = \"mem0\";\n readonly supportedUrls: Record<string, RegExp[]> = {\n '*': [/.*/]\n };\n private languageModel: any; // Use any type to avoid version conflicts\n\n constructor(modelId: string, config: Mem0ProviderSettings, provider_config: ProviderSettings) {\n this.modelId = modelId;\n\n switch (config.provider) {\n case \"openai\":\n if(config?.modelType === \"completion\"){\n this.languageModel = createOpenAI({\n apiKey: config?.apiKey,\n ...provider_config as OpenAIProviderSettings,\n }).completion(modelId);\n } else if(config?.modelType === \"chat\"){\n this.languageModel = createOpenAI({\n apiKey: config?.apiKey,\n ...provider_config as OpenAIProviderSettings,\n }).chat(modelId);\n } else {\n this.languageModel = createOpenAI({\n apiKey: config?.apiKey,\n ...provider_config as OpenAIProviderSettings,\n }).languageModel(modelId);\n }\n break;\n case \"cohere\":\n this.languageModel = createCohere({\n apiKey: config?.apiKey,\n ...provider_config as CohereProviderSettings,\n })(modelId);\n break;\n case \"anthropic\":\n this.languageModel = createAnthropic({\n apiKey: config?.apiKey,\n ...provider_config as AnthropicProviderSettings,\n }).languageModel(modelId);\n break;\n case \"groq\":\n this.languageModel = createGroq({\n apiKey: config?.apiKey,\n ...provider_config as GroqProviderSettings,\n })(modelId);\n break;\n case \"google\":\n this.languageModel = createGoogleGenerativeAI({\n apiKey: config?.apiKey,\n ...provider_config as GoogleGenerativeAIProviderSettings,\n })(modelId);\n break;\n case \"gemini\":\n this.languageModel = createGoogleGenerativeAI({\n apiKey: config?.apiKey,\n ...provider_config as GoogleGenerativeAIProviderSettings,\n })(modelId);\n break;\n default:\n throw new Error(\"Invalid provider\");\n }\n }\n \n async doGenerate(options: LanguageModelV2CallOptions): Promise<Awaited<ReturnType<LanguageModelV2['doGenerate']>>> {\n const result = await this.languageModel.doGenerate(options);\n return result as Awaited<ReturnType<LanguageModelV2['doGenerate']>>;\n }\n\n async doStream(options: LanguageModelV2CallOptions): Promise<Awaited<ReturnType<LanguageModelV2['doStream']>>> {\n const result = await this.languageModel.doStream(options);\n return result as Awaited<ReturnType<LanguageModelV2['doStream']>>;\n }\n}\n\nexport type ProviderSettings = OpenAIProviderSettings | CohereProviderSettings | AnthropicProviderSettings | GroqProviderSettings | GoogleGenerativeAIProviderSettings;\nexport default Mem0AITextGenerator;\n","import { Mem0ProviderSettings } from \"./mem0-provider\";\nimport Mem0AITextGenerator, { ProviderSettings } from \"./provider-response-provider\";\nimport { LanguageModelV2 } from '@ai-sdk/provider';\n\nclass Mem0ClassSelector {\n modelId: string;\n provider_wrapper: string;\n config: Mem0ProviderSettings;\n provider_config?: ProviderSettings;\n static supportedProviders = [\"openai\", \"anthropic\", \"cohere\", \"groq\", \"google\"];\n\n constructor(modelId: string, config: Mem0ProviderSettings, provider_config?: ProviderSettings) {\n this.modelId = modelId;\n this.provider_wrapper = config.provider || \"openai\";\n this.provider_config = provider_config;\n if(config) this.config = config;\n else this.config = {\n provider: this.provider_wrapper,\n };\n\n // Check if provider_wrapper is supported\n if (!Mem0ClassSelector.supportedProviders.includes(this.provider_wrapper)) {\n throw new Error(`Model not supported: ${this.provider_wrapper}`);\n }\n }\n\n createProvider(): LanguageModelV2 {\n return new Mem0AITextGenerator(this.modelId, this.config , this.provider_config || {});\n }\n}\n\nexport { Mem0ClassSelector };\n","import { LanguageModelV2Prompt } from '@ai-sdk/provider';\nimport { Mem0ConfigSettings } from './mem0-types';\nimport { loadApiKey } from '@ai-sdk/provider-utils';\ninterface MultimodalContent {\n type: 'text' | 'image_url' | 'mdx_url' | 'pdf_url';\n text?: string;\n image_url?: {\n url: string;\n };\n mdx_url?: {\n url: string;\n };\n pdf_url?: {\n url: string;\n };\n}\n\ninterface FileContent {\n type: 'file';\n data: string; // fileDataUrl\n mediaType: string; // e.g., 'application/pdf', 'text/markdown', 'image/jpeg'\n}\n\ninterface Message {\n role: string;\n content: string | MultimodalContent | Array<MultimodalContent>;\n}\n\nconst flattenPrompt = (prompt: LanguageModelV2Prompt) => {\n try {\n return prompt.map((part) => {\n if (part.role === \"user\") {\n if (typeof part.content === 'string') {\n return part.content;\n } else if (Array.isArray(part.content)) {\n return part.content\n .filter((obj) => obj.type === 'text')\n .map((obj) => obj.text)\n .join(\" \");\n } else if (part.content && typeof part.content === 'object' && 'type' in part.content) {\n const content = part.content as any;\n if (content.type === 'text' && content.text) {\n return content.text;\n } else if (content.type === 'file') {\n // For file content, we'll include a descriptive placeholder\n if (content.mediaType === 'application/pdf') {\n return '[PDF document]';\n } else if (content.mediaType === 'text/markdown' || content.mediaType === 'application/mdx') {\n return '[Markdown document]';\n } else if (content.mediaType && content.mediaType.startsWith('image/')) {\n return '[Image]';\n } else {\n return '[File attachment]';\n }\n }\n }\n // For non-text content (images, pdfs, mdx), we'll include a placeholder\n // This helps maintain context for memory search while not breaking the text flow\n return \"[multimodal content]\";\n }\n return \"\";\n }).join(\" \");\n } catch (error) {\n console.error(\"Error in flattenPrompt:\", error);\n return \"\";\n }\n}\n\nconst convertToMem0Format = (messages: LanguageModelV2Prompt) => {\n try {\n return messages.flatMap((message: any) => {\n try {\n if (typeof message.content === 'string') {\n return {\n role: message.role,\n content: message.content,\n };\n }\n else if (Array.isArray(message.content)) {\n return message.content.map((obj: any) => {\n try {\n if (obj.type === \"text\") {\n return {\n role: message.role,\n content: obj.text,\n };\n } else if (obj.type === \"file\") {\n // Handle LanguageModelV2Prompt file format\n if (obj.mediaType === \"application/pdf\") {\n return {\n role: message.role,\n content: {\n type: \"pdf_url\",\n pdf_url: {\n url: obj.data\n }\n }\n };\n } else if (obj.mediaType === \"text/markdown\" || obj.mediaType === \"application/mdx\") {\n return {\n role: message.role,\n content: {\n type: \"mdx_url\",\n mdx_url: {\n url: obj.data\n }\n }\n };\n } else if (obj.mediaType && obj.mediaType.startsWith(\"image/\")) {\n return {\n role: message.role,\n content: {\n type: \"image_url\",\n image_url: {\n url: obj.data\n }\n }\n };\n }\n } else if (obj.type === \"image_url\" || obj.type === \"image\") {\n return {\n role: message.role,\n content: {\n type: \"image_url\",\n image_url: {\n url: obj.image_url?.url || obj.image?.url || obj.url\n }\n }\n };\n } else if (obj.type === \"mdx_url\" || obj.type === \"mdx\") {\n return {\n role: message.role,\n content: {\n type: \"mdx_url\",\n mdx_url: {\n url: obj.mdx_url?.url || obj.mdx?.url || obj.url\n }\n }\n };\n } else if (obj.type === \"pdf_url\" || obj.type === \"pdf\") {\n return {\n role: message.role,\n content: {\n type: \"pdf_url\",\n pdf_url: {\n url: obj.pdf_url?.url || obj.pdf?.url || obj.url\n }\n }\n };\n }\n return null;\n } catch (error) {\n console.error(\"Error processing content object:\", error);\n return null;\n }\n }).filter((item: null) => item !== null);\n } else {\n // Handle single multimodal content object\n const obj = message.content;\n if (obj.type === \"text\") {\n return {\n role: message.role,\n content: obj.text,\n };\n } else if (obj.type === \"file\") {\n // Handle LanguageModelV2Prompt file format\n if (obj.mediaType === \"application/pdf\") {\n return {\n role: message.role,\n content: {\n type: \"pdf_url\",\n pdf_url: {\n url: obj.data\n }\n }\n };\n } else if (obj.mediaType === \"text/markdown\" || obj.mediaType === \"application/mdx\") {\n return {\n role: message.role,\n content: {\n type: \"mdx_url\",\n mdx_url: {\n url: obj.data\n }\n }\n };\n } else if (obj.mediaType && obj.mediaType.startsWith(\"image/\")) {\n return {\n role: message.role,\n content: {\n type: \"image_url\",\n image_url: {\n url: obj.data\n }\n }\n };\n }\n } else if (obj.type === \"image_url\" || obj.type === \"image\") {\n return {\n role: message.role,\n content: {\n type: \"image_url\",\n image_url: {\n url: obj.image_url?.url || obj.image?.url || obj.url\n }\n }\n };\n } else if (obj.type === \"mdx_url\" || obj.type === \"mdx\") {\n return {\n role: message.role,\n content: {\n type: \"mdx_url\",\n mdx_url: {\n url: obj.mdx_url?.url || obj.mdx?.url || obj.url\n }\n }\n };\n } else if (obj.type === \"pdf_url\" || obj.type === \"pdf\") {\n return {\n role: message.role,\n content: {\n type: \"pdf_url\",\n pdf_url: {\n url: obj.pdf_url?.url || obj.pdf?.url || obj.url\n }\n }\n };\n }\n return null;\n }\n } catch (error) {\n console.error(\"Error processing message:\", error);\n return [];\n }\n });\n } catch (error) {\n console.error(\"Error in convertToMem0Format:\", error);\n return [];\n }\n}\n\nconst searchInternalMemories = async (query: string, config?: Mem0ConfigSettings, top_k: number = 5) => {\n try {\n const filters: { OR: Array<{ [key: string]: string | undefined }> } = {\n OR: [],\n };\n if (config?.user_id) {\n filters.OR.push({\n user_id: config.user_id,\n });\n }\n if (config?.app_id) {\n filters.OR.push({\n app_id: config.app_id,\n });\n }\n if (config?.agent_id) {\n filters.OR.push({\n agent_id: config.agent_id,\n });\n }\n if (config?.run_id) {\n filters.OR.push({\n run_id: config.run_id,\n });\n }\n const org_project_filters = {\n org_id: config&&config.org_id,\n project_id: config&&config.project_id,\n org_name: !config?.org_id ? config&&config.org_name : undefined,\n project_name: !config?.org_id ? config&&config.project_name : undefined,\n }\n\n const apiKey = loadApiKey({\n apiKey: (config&&config.mem0ApiKey),\n environmentVariableName: \"MEM0_API_KEY\",\n description: \"Mem0\",\n });\n\n const options = {\n method: 'POST',\n headers: {\n Authorization: `Token ${apiKey}`,\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n query,\n filters,\n ...config,\n top_k: config&&config.top_k || top_k,\n version: \"v2\",\n output_format: \"v1.1\",\n ...org_project_filters\n }),\n };\n\n const baseUrl = config?.host || 'https://api.mem0.ai';\n const response = await fetch(`${baseUrl}/v2/memories/search/`, options);\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n const data = await response.json();\n return data;\n } catch (error) {\n console.error(\"Error in searchInternalMemories:\", error);\n throw error;\n }\n}\n\nconst addMemories = async (messages: LanguageModelV2Prompt, config?: Mem0ConfigSettings) => {\n try {\n let finalMessages: Array<Message> = [];\n if (typeof messages === \"string\") {\n finalMessages = [{ role: \"user\", content: messages }];\n } else {\n finalMessages = convertToMem0Format(messages);\n }\n const response = await updateMemories(finalMessages, config);\n return response;\n } catch (error) {\n console.error(\"Error in addMemories:\", error);\n throw error;\n }\n}\n\nconst updateMemories = async (messages: Array<Message>, config?: Mem0ConfigSettings) => {\n try {\n const apiKey = loadApiKey({\n apiKey: (config&&config.mem0ApiKey),\n environmentVariableName: \"MEM0_API_KEY\",\n description: \"Mem0\",\n });\n\n const options = {\n method: 'POST',\n headers: {\n Authorization: `Token ${apiKey}`,\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({messages, ...config, version: \"v2\"}),\n };\n\n const baseUrl = config?.host || 'https://api.mem0.ai';\n const response = await fetch(`${baseUrl}/v1/memories/`, options);\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n const data = await response.json();\n return data;\n } catch (error) {\n console.error(\"Error in updateMemories:\", error);\n throw error;\n }\n}\n\nconst retrieveMemories = async (prompt: LanguageModelV2Prompt | string, config?: Mem0ConfigSettings) => {\n try {\n const message = typeof prompt === 'string' ? prompt : flattenPrompt(prompt);\n const systemPrompt = \"These are the memories I have stored. Give more weightage to the question by users and try to answer that first. You have to modify your answer based on the memories I have provided. If the memories are irrelevant you can ignore them. Also don't reply to this section of the prompt, or the memories, they are only for your reference. The System prompt starts after text System Message: \\n\\n\";\n \n const memories = await searchInternalMemories(message, config);\n let memoriesText1 = \"\";\n let memoriesText2 = \"\";\n let graphPrompt = \"\";\n\n try {\n memoriesText1 = memories?.results?.map((memory: any) => {\n return `Memory: ${memory.memory}\\n\\n`;\n }).join(\"\\n\\n\");\n\n if (config?.enable_graph) {\n memoriesText2 = memories?.relations?.map((memory: any) => {\n return `Relation: ${memory.source} -> ${memory.relationship} -> ${memory.target} \\n\\n`;\n }).join(\"\\n\\n\");\n graphPrompt = `HERE ARE THE GRAPHS RELATIONS FOR THE PREFERENCES OF THE USER:\\n\\n ${memoriesText2}`;\n }\n } catch (error) {\n console.error(\"Error while parsing memories:\", error);\n }\n\n if (!memories || memories?.length === 0) {\n return \"\";\n }\n\n return `System Message: ${systemPrompt} ${memoriesText1} ${graphPrompt}`;\n } catch (error) {\n console.error(\"Error in retrieveMemories:\", error);\n throw error;\n }\n}\n\nconst getMemories = async (prompt: LanguageModelV2Prompt | string, config?: Mem0ConfigSettings) => {\n try {\n const message = typeof prompt === 'string' ? prompt : flattenPrompt(prompt);\n const memories = await searchInternalMemories(message, config);\n \n if (!config?.enable_graph) {\n return memories?.results;\n }\n return memories;\n } catch (error) {\n console.error(\"Error in getMemories:\", error);\n throw error;\n }\n}\n\nconst searchMemories = async (prompt: LanguageModelV2Prompt | string, config?: Mem0ConfigSettings) => {\n try {\n const message = typeof prompt === 'string' ? prompt : flattenPrompt(prompt);\n const memories = await searchInternalMemories(message, config);\n return memories;\n } catch (error) {\n console.error(\"Error in searchMemories:\", error);\n return [];\n }\n}\n\nexport {addMemories, updateMemories, retrieveMemories, flattenPrompt, searchMemories, getMemories};","/* eslint-disable camelcase */\nimport {\n LanguageModelV2CallOptions,\n LanguageModelV2Message,\n LanguageModelV2Source\n} from '@ai-sdk/provider';\n\nimport { LanguageModelV2 } from '@ai-sdk/provider';\n// streaming uses provider-native doStream; no middleware needed\n\nimport { Mem0ChatConfig, Mem0ChatModelId, Mem0ChatSettings, Mem0ConfigSettings, Mem0StreamResponse } from \"./mem0-types\";\nimport { Mem0ClassSelector } from \"./mem0-provider-selector\";\nimport { Mem0ProviderSettings } from \"./mem0-provider\";\nimport { addMemories, getMemories } from \"./mem0-utils\";\n\nconst generateRandomId = () => {\n return Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);\n}\n\nexport class Mem0GenericLanguageModel implements LanguageModelV2 {\n readonly specificationVersion = \"v2\";\n readonly defaultObjectGenerationMode = \"json\";\n // We don't support images for now\n readonly supportsImageUrls = false;\n // Allow All Media Types for now\n readonly supportedUrls: Record<string, RegExp[]> = {\n '*': [/.*/]\n };\n\n constructor(\n public readonly modelId: Mem0ChatModelId,\n public readonly settings: Mem0ChatSettings,\n public readonly config: Mem0ChatConfig,\n public readonly provider_config?: Mem0ProviderSettings\n ) {\n this.provider = config.provider ?? \"openai\";\n }\n\n provider: string;\n\n private async processMemories(messagesPrompts: LanguageModelV2Message[], mem0Config: Mem0ConfigSettings) {\n try {\n // Add New Memories\n addMemories(messagesPrompts, mem0Config).then((res) => {\n return res;\n }).catch((e) => {\n console.error(\"Error while adding memories\");\n return { memories: [], messagesPrompts: [] };\n });\n\n // Get Memories\n let memories = await getMemories(messagesPrompts, mem0Config);\n\n const mySystemPrompt = \"These are the memories I have stored. Give more weightage to the question by users and try to answer that first. You have to modify your answer based on the memories I have provided. If the memories are irrelevant you can ignore them. Also don't reply to this section of the prompt, or the memories, they are only for your reference. The System prompt starts after text System Message: \\n\\n\";\n\n const isGraphEnabled = mem0Config?.enable_graph;\n \n let memoriesText = \"\";\n let memoriesText2 = \"\";\n try {\n // @ts-ignore\n if (isGraphEnabled) {\n memoriesText = memories?.results?.map((memory: any) => {\n return `Memory: ${memory?.memory}\\n\\n`;\n }).join(\"\\n\\n\");\n\n memoriesText2 = memories?.relations?.map((memory: any) => {\n return `Relation: ${memory?.source} -> ${memory?.relationship} -> ${memory?.target} \\n\\n`;\n }).join(\"\\n\\n\");\n } else {\n memoriesText = memories?.map((memory: any) => {\n return `Memory: ${memory?.memory}\\n\\n`;\n }).join(\"\\n\\n\");\n }\n } catch(e) {\n console.error(\"Error while parsing memories\");\n }\n\n let graphPrompt = \"\";\n if (isGraphEnabled) {\n graphPrompt = `HERE ARE THE GRAPHS RELATIONS FOR THE PREFERENCES OF THE USER:\\n\\n ${memoriesText2}`;\n }\n\n const memoriesPrompt = `System Message: ${mySystemPrompt} ${memoriesText} ${graphPrompt} `;\n\n // System Prompt - The memories go as a system prompt\n const systemPrompt: LanguageModelV2Message = {\n role: \"system\",\n content: memoriesPrompt\n };\n\n // Add the system prompt to the beginning of the messages if there are memories\n if (memories?.length > 0) {\n messagesPrompts.unshift(systemPrompt);\n }\n\n if (isGraphEnabled) {\n memories = memories?.results;\n }\n\n return { memories, messagesPrompts };\n } catch(e) {\n console.error(\"Error while processing memories\");\n return { memories: [], messagesPrompts };\n }\n }\n\n async doGenerate(options: LanguageModelV2CallOptions): Promise<Awaited<ReturnType<LanguageModelV2['doGenerate']>>> {\n try { \n const provider = this.config.provider;\n const mem0_api_key = this.config.mem0ApiKey;\n \n const settings: Mem0ProviderSettings = {\n provider: provider,\n mem0ApiKey: mem0_api_key,\n apiKey: this.config.apiKey,\n }\n\n const mem0Config: Mem0ConfigSettings = {\n mem0ApiKey: mem0_api_key,\n ...this.config.mem0Config,\n ...this.settings,\n }\n\n const selector = new Mem0ClassSelector(this.modelId, settings, this.provider_config);\n \n let messagesPrompts = options.prompt;\n \n // Process memories and update prompts\n const { memories, messagesPrompts: updatedPrompts } = await this.processMemories(messagesPrompts, mem0Config);\n \n const model = selector.createProvider();\n\n const ans = await model.doGenerate({\n ...options,\n prompt: updatedPrompts,\n });\n \n // If there are no memories, return the original response\n if (!memories || memories?.length === 0) {\n return ans;\n }\n \n try {\n // Create sources array with existing sources\n const sources: LanguageModelV2Source[] = [\n {\n type: \"source\",\n title: \"Mem0 Memories\",\n sourceType: \"url\",\n id: \"mem0-\" + generateRandomId(),\n url: \"https://app.mem0.ai\",\n providerMetadata: {\n mem0: {\n memories: memories,\n memoriesText: memories\n ?.map((memory: any) => memory?.memory)\n .join(\"\\n\\n\"),\n },\n },\n },\n ];\n } catch (e) {\n console.error(\"Error while creating sources\");\n }\n \n return {\n ...ans,\n // sources\n };\n } catch (error) {\n // Handle errors properly\n console.error(\"Error in doGenerate:\", error);\n throw new Error(\"Failed to generate response.\");\n }\n }\n\n async doStream(options: LanguageModelV2CallOptions): Promise<Awaited<ReturnType<LanguageModelV2['doStream']>>> {\n try {\n const provider = this.config.provider;\n const mem0_api_key = this.config.mem0ApiKey;\n \n const settings: Mem0ProviderSettings = {\n provider: provider,\n mem0ApiKey: mem0_api_key,\n apiKey: this.config.apiKey,\n modelType: this.config.modelType,\n }\n\n const mem0Config: Mem0ConfigSettings = {\n mem0ApiKey: mem0_api_key,\n ...this.config.mem0Config,\n ...this.settings,\n }\n\n const selector = new Mem0ClassSelector(this.modelId, settings, this.provider_config);\n \n let messagesPrompts = options.prompt;\n \n // Process memories and update prompts\n const { memories, messagesPrompts: updatedPrompts } = await this.processMemories(messagesPrompts, mem0Config);\n\n const baseModel = selector.createProvider();\n\n // Use the provider's native streaming directly to avoid buffering\n const streamResponse = await baseModel.doStream({\n ...options,\n prompt: updatedPrompts,\n });\n\n // If there are no memories, return the original stream\n if (!memories || memories?.length === 0) {\n return streamResponse;\n }\n\n // Return stream untouched for true streaming behavior\n return {\n stream: streamResponse.stream,\n request: streamResponse.request,\n response: streamResponse.response,\n };\n } catch (error) {\n console.error(\"Error in doStream:\", error);\n throw new Error(\"Streaming failed or method not implemented.\");\n }\n }\n}\n","import { ProviderV2 } from '@ai-sdk/provider';\nimport { LanguageModelV2 } from '@ai-sdk/provider';\nimport { withoutTrailingSlash } from \"@ai-sdk/provider-utils\";\nimport { Mem0ChatModelId, Mem0ChatSettings, Mem0Config } from \"./mem0-types\";\nimport { Mem0GenericLanguageModel } from \"./mem0-generic-language-model\";\nimport { LLMProviderSettings } from \"./mem0-types\";\n\nexport interface Mem0Provider extends ProviderV2 {\n (modelId: Mem0ChatModelId, settings?: Mem0ChatSettings): LanguageModelV2;\n\n chat(modelId: Mem0ChatModelId, settings?: Mem0ChatSettings): LanguageModelV2;\n completion(modelId: Mem0ChatModelId, settings?: Mem0ChatSettings): LanguageModelV2;\n\n languageModel(\n modelId: Mem0ChatModelId,\n settings?: Mem0ChatSettings\n ): LanguageModelV2;\n}\n\nexport interface Mem0ProviderSettings {\n baseURL?: string;\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept\n * requests or to provide a custom fetch implementation for e.g. testing\n */\n fetch?: typeof fetch;\n /**\n * @internal\n */\n generateId?: () => string;\n /**\n * Custom headers to include in the requests.\n */\n headers?: Record<string, string>;\n name?: string;\n mem0ApiKey?: string;\n apiKey?: string;\n provider?: string;\n modelType?: \"completion\" | \"chat\";\n mem0Config?: Mem0Config;\n\n /**\n * The configuration for the provider.\n */\n config?: LLMProviderSettings ;\n}\n\nexport function createMem0(\n options: Mem0ProviderSettings = {\n provider: \"openai\",\n }\n): Mem0Provider {\n const baseURL =\n withoutTrailingSlash(options.baseURL) ?? \"http://api.openai.com\";\n const getHeaders = () => ({\n ...options.headers,\n });\n\n const createGenericModel = (\n modelId: Mem0ChatModelId,\n settings: Mem0ChatSettings = {}\n ) =>\n new Mem0GenericLanguageModel(\n modelId,\n settings,\n {\n baseURL,\n fetch: options.fetch,\n headers: getHeaders(),\n provider: options.provider || \"openai\",\n name: options.name,\n mem0ApiKey: options.mem0ApiKey,\n apiKey: options.apiKey,\n mem0Config: options.mem0Config,\n },\n options.config\n );\n\n const createCompletionModel = (\n modelId: Mem0ChatModelId,\n settings: Mem0ChatSettings = {}\n ) =>\n new Mem0GenericLanguageModel(\n modelId,\n settings,\n {\n baseURL,\n fetch: options.fetch,\n headers: getHeaders(),\n provider: options.provider || \"openai\",\n name: options.name,\n mem0ApiKey: options.mem0ApiKey,\n apiKey: options.apiKey,\n mem0Config: options.mem0Config,\n modelType: \"completion\",\n },\n options.config\n );\n\n const createChatModel = (\n modelId: Mem0ChatModelId,\n settings: Mem0ChatSettings = {}\n ) =>\n new Mem0GenericLanguageModel(\n modelId,\n settings,\n {\n baseURL,\n fetch: options.fetch,\n headers: getHeaders(),\n provider: options.provider || \"openai\",\n name: options.name,\n mem0ApiKey: options.mem0ApiKey,\n apiKey: options.apiKey,\n mem0Config: options.mem0Config,\n modelType: \"completion\",\n },\n options.config\n );\n\n const provider = function (\n modelId: Mem0ChatModelId,\n settings: Mem0ChatSettings = {}\n ) {\n if (new.target) {\n throw new Error(\n \"The Mem0 model function cannot be called with the new keyword.\"\n );\n }\n\n return createGenericModel(modelId, settings);\n };\n\n provider.languageModel = createGenericModel;\n provider.completion = createCompletionModel;\n provider.chat = createChatModel;\n\n return provider as unknown as Mem0Provider;\n}\n\nexport const mem0 = createMem0();\n"],"mappings":";AAAA,SAAS,4BAA4B;;;ACErC,SAAS,oBAA4C;AACrD,SAAiC,oBAAoB;AACrD,SAAoC,uBAAuB;AAC3D,SAAS,gCAAoE;AAC7E,SAAS,kBAAwC;AAGjD,IAAM,sBAAN,MAAqD;AAAA;AAAA,EAWjD,YAAY,SAAiB,QAA8B,iBAAmC;AAV9F,SAAS,uBAAuB;AAChC,SAAS,8BAA8B;AACvC,SAAS,oBAAoB;AAE7B,SAAS,WAAW;AACpB,SAAS,gBAA0C;AAAA,MAC/C,KAAK,CAAC,IAAI;AAAA,IACd;AAII,SAAK,UAAU;AAEf,YAAQ,OAAO,UAAU;AAAA,MACrB,KAAK;AACD,aAAG,iCAAQ,eAAc,cAAa;AAClC,eAAK,gBAAgB,aAAa;AAAA,YAC9B,QAAQ,iCAAQ;AAAA,YAChB,GAAG;AAAA,UACP,CAAC,EAAE,WAAW,OAAO;AAAA,QACzB,YAAU,iCAAQ,eAAc,QAAO;AACnC,eAAK,gBAAgB,aAAa;AAAA,YAC9B,QAAQ,iCAAQ;AAAA,YAChB,GAAG;AAAA,UACP,CAAC,EAAE,KAAK,OAAO;AAAA,QACnB,OAAO;AACH,eAAK,gBAAgB,aAAa;AAAA,YAC9B,QAAQ,iCAAQ;AAAA,YAChB,GAAG;AAAA,UACP,CAAC,EAAE,cAAc,OAAO;AAAA,QAC5B;AACA;AAAA,MACJ,KAAK;AACD,aAAK,gBAAgB,aAAa;AAAA,UAC9B,QAAQ,iCAAQ;AAAA,UAChB,GAAG;AAAA,QACP,CAAC,EAAE,OAAO;AACV;AAAA,MACJ,KAAK;AACD,aAAK,gBAAgB,gBAAgB;AAAA,UACjC,QAAQ,iCAAQ;AAAA,UAChB,GAAG;AAAA,QACP,CAAC,EAAE,cAAc,OAAO;AACxB;AAAA,MACJ,KAAK;AACD,aAAK,gBAAgB,WAAW;AAAA,UAC5B,QAAQ,iCAAQ;AAAA,UAChB,GAAG;AAAA,QACP,CAAC,EAAE,OAAO;AACV;AAAA,MACJ,KAAK;AACD,aAAK,gBAAgB,yBAAyB;AAAA,UAC1C,QAAQ,iCAAQ;AAAA,UAChB,GAAG;AAAA,QACP,CAAC,EAAE,OAAO;AACV;AAAA,MACJ,KAAK;AACD,aAAK,gBAAgB,yBAAyB;AAAA,UAC1C,QAAQ,iCAAQ;AAAA,UAChB,GAAG;AAAA,QACP,CAAC,EAAE,OAAO;AACV;AAAA,MACJ;AACI,cAAM,IAAI,MAAM,kBAAkB;AAAA,IAC1C;AAAA,EACJ;AAAA,EAEA,MAAM,WAAW,SAAkG;AAC/G,UAAM,SAAS,MAAM,KAAK,cAAc,WAAW,OAAO;AAC1D,WAAO;AAAA,EACX;AAAA,EAEA,MAAM,SAAS,SAAgG;AAC3G,UAAM,SAAS,MAAM,KAAK,cAAc,SAAS,OAAO;AACxD,WAAO;AAAA,EACX;AACJ;AAGA,IAAO,qCAAQ;;;ACrFf,IAAM,qBAAN,MAAM,mBAAkB;AAAA,EAOpB,YAAY,SAAiB,QAA8B,iBAAoC;AAC3F,SAAK,UAAU;AACf,SAAK,mBAAmB,OAAO,YAAY;AAC3C,SAAK,kBAAkB;AACvB,QAAG,OAAQ,MAAK,SAAS;AAAA,QACpB,MAAK,SAAS;AAAA,MACf,UAAU,KAAK;AAAA,IACnB;AAGA,QAAI,CAAC,mBAAkB,mBAAmB,SAAS,KAAK,gBAAgB,GAAG;AACvE,YAAM,IAAI,MAAM,wBAAwB,KAAK,gBAAgB,EAAE;AAAA,IACnE;AAAA,EACJ;AAAA,EAEA,iBAAkC;AAC9B,WAAO,IAAI,mCAAoB,KAAK,SAAS,KAAK,QAAS,KAAK,mBAAmB,CAAC,CAAC;AAAA,EACzF;AACJ;AAzBM,mBAKK,qBAAqB,CAAC,UAAU,aAAa,UAAU,QAAQ,QAAQ;AALlF,IAAM,oBAAN;;;ACFA,SAAS,kBAAkB;AA0B3B,IAAM,gBAAgB,CAAC,WAAkC;AACrD,MAAI;AACA,WAAO,OAAO,IAAI,CAAC,SAAS;AACxB,UAAI,KAAK,SAAS,QAAQ;AACtB,YAAI,OAAO,KAAK,YAAY,UAAU;AAClC,iBAAO,KAAK;AAAA,QAChB,WAAW,MAAM,QAAQ,KAAK,OAAO,GAAG;AACpC,iBAAO,KAAK,QACP,OAAO,CAAC,QAAQ,IAAI,SAAS,MAAM,EACnC,IAAI,CAAC,QAAQ,IAAI,IAAI,EACrB,KAAK,GAAG;AAAA,QACjB,WAAW,KAAK,WAAW,OAAO,KAAK,YAAY,YAAY,UAAU,KAAK,SAAS;AACnF,gBAAM,UAAU,KAAK;AACrB,cAAI,QAAQ,SAAS,UAAU,QAAQ,MAAM;AACzC,mBAAO,QAAQ;AAAA,UACnB,WAAW,QAAQ,SAAS,QAAQ;AAEhC,gBAAI,QAAQ,cAAc,mBAAmB;AACzC,qBAAO;AAAA,YACX,WAAW,QAAQ,cAAc,mBAAmB,QAAQ,cAAc,mBAAmB;AACzF,qBAAO;AAAA,YACX,WAAW,QAAQ,aAAa,QAAQ,UAAU,WAAW,QAAQ,GAAG;AACpE,qBAAO;AAAA,YACX,OAAO;AACH,qBAAO;AAAA,YACX;AAAA,UACJ;AAAA,QACJ;AAGA,eAAO;AAAA,MACX;AACA,aAAO;AAAA,IACX,CAAC,EAAE,KAAK,GAAG;AAAA,EACf,SAAS,OAAO;AACZ,YAAQ,MAAM,2BAA2B,KAAK;AAC9C,WAAO;AAAA,EACX;AACJ;AAEA,IAAM,sBAAsB,CAAC,aAAoC;AAC7D,MAAI;AACA,WAAO,SAAS,QAAQ,CAAC,YAAiB;AAtElD;AAuEY,UAAI;AACA,YAAI,OAAO,QAAQ,YAAY,UAAU;AACrC,iBAAO;AAAA,YACH,MAAM,QAAQ;AAAA,YACd,SAAS,QAAQ;AAAA,UACrB;AAAA,QACJ,WACS,MAAM,QAAQ,QAAQ,OAAO,GAAG;AACrC,iBAAO,QAAQ,QAAQ,IAAI,CAAC,QAAa;AA/E7D,gBAAAA,KAAAC,KAAAC,KAAAC,KAAAC,KAAAC;AAgFwB,gBAAI;AACA,kBAAI,IAAI,SAAS,QAAQ;AACrB,uBAAO;AAAA,kBACH,MAAM,QAAQ;AAAA,kBACd,SAAS,IAAI;AAAA,gBACjB;AAAA,cACJ,WAAW,IAAI,SAAS,QAAQ;AAE5B,oBAAI,IAAI,cAAc,mBAAmB;AACrC,yBAAO;AAAA,oBACH,MAAM,QAAQ;AAAA,oBACd,SAAS;AAAA,sBACL,MAAM;AAAA,sBACN,SAAS;AAAA,wBACL,KAAK,IAAI;AAAA,sBACb;AAAA,oBACJ;AAAA,kBACJ;AAAA,gBACJ,WAAW,IAAI,cAAc,mBAAmB,IAAI,cAAc,mBAAmB;AACjF,yBAAO;AAAA,oBACH,MAAM,QAAQ;AAAA,oBACd,SAAS;AAAA,sBACL,MAAM;AAAA,sBACN,SAAS;AAAA,wBACL,KAAK,IAAI;AAAA,sBACb;AAAA,oBACJ;AAAA,kBACJ;AAAA,gBACJ,WAAW,IAAI,aAAa,IAAI,UAAU,WAAW,QAAQ,GAAG;AAC5D,yBAAO;AAAA,oBACH,MAAM,QAAQ;AAAA,oBACd,SAAS;AAAA,sBACL,MAAM;AAAA,sBACN,WAAW;AAAA,wBACP,KAAK,IAAI;AAAA,sBACb;AAAA,oBACJ;AAAA,kBACJ;AAAA,gBACJ;AAAA,cACJ,WAAW,IAAI,SAAS,eAAe,IAAI,SAAS,SAAS;AACzD,uBAAO;AAAA,kBACH,MAAM,QAAQ;AAAA,kBACd,SAAS;AAAA,oBACL,MAAM;AAAA,oBACN,WAAW;AAAA,sBACP,OAAKL,MAAA,IAAI,cAAJ,gBAAAA,IAAe,UAAOC,MAAA,IAAI,UAAJ,gBAAAA,IAAW,QAAO,IAAI;AAAA,oBACrD;AAAA,kBACJ;AAAA,gBACJ;AAAA,cACJ,WAAW,IAAI,SAAS,aAAa,IAAI,SAAS,OAAO;AACrD,uBAAO;AAAA,kBACH,MAAM,QAAQ;AAAA,kBACd,SAAS;AAAA,oBACL,MAAM;AAAA,oBACN,SAAS;AAAA,sBACL,OAAKC,MAAA,IAAI,YAAJ,gBAAAA,IAAa,UAAOC,MAAA,IAAI,QAAJ,gBAAAA,IAAS,QAAO,IAAI;AAAA,oBACjD;AAAA,kBACJ;AAAA,gBACJ;AAAA,cACJ,WAAW,IAAI,SAAS,aAAa,IAAI,SAAS,OAAO;AACrD,uBAAO;AAAA,kBACH,MAAM,QAAQ;AAAA,kBACd,SAAS;AAAA,oBACL,MAAM;AAAA,oBACN,SAAS;AAAA,sBACL,OAAKC,MAAA,IAAI,YAAJ,gBAAAA,IAAa,UAAOC,MAAA,IAAI,QAAJ,gBAAAA,IAAS,QAAO,IAAI;AAAA,oBACjD;AAAA,kBACJ;AAAA,gBACJ;AAAA,cACJ;AACA,qBAAO;AAAA,YACX,SAAS,OAAO;AACZ,sBAAQ,MAAM,oCAAoC,KAAK;AACvD,qBAAO;AAAA,YACX;AAAA,UACJ,CAAC,EAAE,OAAO,CAAC,SAAe,SAAS,IAAI;AAAA,QAC3C,OAAO;AAEH,gBAAM,MAAM,QAAQ;AACpB,cAAI,IAAI,SAAS,QAAQ;AACrB,mBAAO;AAAA,cACH,MAAM,QAAQ;AAAA,cACd,SAAS,IAAI;AAAA,YACjB;AAAA,UACJ,WAAW,IAAI,SAAS,QAAQ;AAE5B,gBAAI,IAAI,cAAc,mBAAmB;AACrC,qBAAO;AAAA,gBACH,MAAM,QAAQ;AAAA,gBACd,SAAS;AAAA,kBACL,MAAM;AAAA,kBACN,SAAS;AAAA,oBACL,KAAK,IAAI;AAAA,kBACb;AAAA,gBACJ;AAAA,cACJ;AAAA,YACJ,WAAW,IAAI,cAAc,mBAAmB,IAAI,cAAc,mBAAmB;AACjF,qBAAO;AAAA,gBACH,MAAM,QAAQ;AAAA,gBACd,SAAS;AAAA,kBACL,MAAM;AAAA,kBACN,SAAS;AAAA,oBACL,KAAK,IAAI;AAAA,kBACb;AAAA,gBACJ;AAAA,cACJ;AAAA,YACJ,WAAW,IAAI,aAAa,IAAI,UAAU,WAAW,QAAQ,GAAG;AAC5D,qBAAO;AAAA,gBACH,MAAM,QAAQ;AAAA,gBACd,SAAS;AAAA,kBACL,MAAM;AAAA,kBACN,WAAW;AAAA,oBACP,KAAK,IAAI;AAAA,kBACb;AAAA,gBACJ;AAAA,cACJ;AAAA,YACJ;AAAA,UACJ,WAAW,IAAI,SAAS,eAAe,IAAI,SAAS,SAAS;AACzD,mBAAO;AAAA,cACH,MAAM,QAAQ;AAAA,cACd,SAAS;AAAA,gBACL,MAAM;AAAA,gBACN,WAAW;AAAA,kBACP,OAAK,SAAI,cAAJ,mBAAe,UAAO,SAAI,UAAJ,mBAAW,QAAO,IAAI;AAAA,gBACrD;AAAA,cACJ;AAAA,YACJ;AAAA,UACJ,WAAW,IAAI,SAAS,aAAa,IAAI,SAAS,OAAO;AACrD,mBAAO;AAAA,cACH,MAAM,QAAQ;AAAA,cACd,SAAS;AAAA,gBACL,MAAM;AAAA,gBACN,SAAS;AAAA,kBACL,OAAK,SAAI,YAAJ,mBAAa,UAAO,SAAI,QAAJ,mBAAS,QAAO,IAAI;AAAA,gBACjD;AAAA,cACJ;AAAA,YACJ;AAAA,UACJ,WAAW,IAAI,SAAS,aAAa,IAAI,SAAS,OAAO;AACrD,mBAAO;AAAA,cACH,MAAM,QAAQ;AAAA,cACd,SAAS;AAAA,gBACL,MAAM;AAAA,gBACN,SAAS;AAAA,kBACL,OAAK,SAAI,YAAJ,mBAAa,UAAO,SAAI,QAAJ,mBAAS,QAAO,IAAI;AAAA,gBACjD;AAAA,cACJ;AAAA,YACJ;AAAA,UACJ;AACA,iBAAO;AAAA,QACX;AAAA,MACJ,SAAS,OAAO;AACZ,gBAAQ,MAAM,6BAA6B,KAAK;AAChD,eAAO,CAAC;AAAA,MACZ;AAAA,IACJ,CAAC;AAAA,EACL,SAAS,OAAO;AACZ,YAAQ,MAAM,iCAAiC,KAAK;AACpD,WAAO,CAAC;AAAA,EACZ;AACJ;AAEA,IAAM,yBAAyB,OAAO,OAAe,QAA6B,QAAgB,MAAM;AACpG,MAAI;AACA,UAAM,UAAgE;AAAA,MAClE,IAAI,CAAC;AAAA,IACT;AACA,QAAI,iCAAQ,SAAS;AACjB,cAAQ,GAAG,KAAK;AAAA,QACZ,SAAS,OAAO;AAAA,MACpB,CAAC;AAAA,IACL;AACA,QAAI,iCAAQ,QAAQ;AAChB,cAAQ,GAAG,KAAK;AAAA,QACZ,QAAQ,OAAO;AAAA,MACnB,CAAC;AAAA,IACL;AACA,QAAI,iCAAQ,UAAU;AAClB,cAAQ,GAAG,KAAK;AAAA,QACZ,UAAU,OAAO;AAAA,MACrB,CAAC;AAAA,IACL;AACA,QAAI,iCAAQ,QAAQ;AAChB,cAAQ,GAAG,KAAK;AAAA,QACZ,QAAQ,OAAO;AAAA,MACnB,CAAC;AAAA,IACL;AACA,UAAM,sBAAsB;AAAA,MACxB,QAAQ,UAAQ,OAAO;AAAA,MACvB,YAAY,UAAQ,OAAO;AAAA,MAC3B,UAAU,EAAC,iCAAQ,UAAS,UAAQ,OAAO,WAAW;AAAA,MACtD,cAAc,EAAC,iCAAQ,UAAS,UAAQ,OAAO,eAAe;AAAA,IAClE;AAEA,UAAM,SAAS,WAAW;AAAA,MACtB,QAAS,UAAQ,OAAO;AAAA,MACxB,yBAAyB;AAAA,MACzB,aAAa;AAAA,IACjB,CAAC;AAED,UAAM,UAAU;AAAA,MACZ,QAAQ;AAAA,MACR,SAAS;AAAA,QACL,eAAe,SAAS,MAAM;AAAA,QAC9B,gBAAgB;AAAA,MACpB;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACjB;AAAA,QACA;AAAA,QACA,GAAG;AAAA,QACH,OAAO,UAAQ,OAAO,SAAS;AAAA,QAC/B,SAAS;AAAA,QACT,eAAe;AAAA,QACf,GAAG;AAAA,MACP,CAAC;AAAA,IACL;AAEA,UAAM,WAAU,iCAAQ,SAAQ;AAChC,UAAM,WAAW,MAAM,MAAM,GAAG,OAAO,wBAAwB,OAAO;AACtE,QAAI,CAAC,SAAS,IAAI;AACd,YAAM,IAAI,MAAM,uBAAuB,SAAS,MAAM,EAAE;AAAA,IAC5D;AACA,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,WAAO;AAAA,EACX,SAAS,OAAO;AACZ,YAAQ,MAAM,oCAAoC,KAAK;AACvD,UAAM;AAAA,EACV;AACJ;AAEA,IAAM,cAAc,OAAO,UAAiC,WAAgC;AACxF,MAAI;AACA,QAAI,gBAAgC,CAAC;AACrC,QAAI,OAAO,aAAa,UAAU;AAC9B,sBAAgB,CAAC,EAAE,MAAM,QAAQ,SAAS,SAAS,CAAC;AAAA,IACxD,OAAO;AACH,sBAAgB,oBAAoB,QAAQ;AAAA,IAChD;AACA,UAAM,WAAW,MAAM,eAAe,eAAe,MAAM;AAC3D,WAAO;AAAA,EACX,SAAS,OAAO;AACZ,YAAQ,MAAM,yBAAyB,KAAK;AAC5C,UAAM;AAAA,EACV;AACJ;AAEA,IAAM,iBAAiB,OAAO,UAA0B,WAAgC;AACpF,MAAI;AACA,UAAM,SAAS,WAAW;AAAA,MACtB,QAAS,UAAQ,OAAO;AAAA,MACxB,yBAAyB;AAAA,MACzB,aAAa;AAAA,IACjB,CAAC;AAED,UAAM,UAAU;AAAA,MACZ,QAAQ;AAAA,MACR,SAAS;AAAA,QACL,eAAe,SAAS,MAAM;AAAA,QAC9B,gBAAgB;AAAA,MACpB;AAAA,MACA,MAAM,KAAK,UAAU,EAAC,UAAU,GAAG,QAAQ,SAAS,KAAI,CAAC;AAAA,IAC7D;AAEA,UAAM,WAAU,iCAAQ,SAAQ;AAChC,UAAM,WAAW,MAAM,MAAM,GAAG,OAAO,iBAAiB,OAAO;AAC/D,QAAI,CAAC,SAAS,IAAI;AACd,YAAM,IAAI,MAAM,uBAAuB,SAAS,MAAM,EAAE;AAAA,IAC5D;AACA,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,WAAO;AAAA,EACX,SAAS,OAAO;AACZ,YAAQ,MAAM,4BAA4B,KAAK;AAC/C,UAAM;AAAA,EACV;AACJ;AAEA,IAAM,mBAAmB,OAAO,QAAwC,WAAgC;AAnWxG;AAoWI,MAAI;AACA,UAAM,UAAU,OAAO,WAAW,WAAW,SAAS,cAAc,MAAM;AAC1E,UAAM,eAAe;AAErB,UAAM,WAAW,MAAM,uBAAuB,SAAS,MAAM;AAC7D,QAAI,gBAAgB;AACpB,QAAI,gBAAgB;AACpB,QAAI,cAAc;AAElB,QAAI;AACA,uBAAgB,0CAAU,YAAV,mBAAmB,IAAI,CAAC,WAAgB;AACpD,eAAO,WAAW,OAAO,MAAM;AAAA;AAAA;AAAA,MACnC,GAAG,KAAK;AAER,UAAI,iCAAQ,cAAc;AACtB,yBAAgB,0CAAU,cAAV,mBAAqB,IAAI,CAAC,WAAgB;AACtD,iBAAO,aAAa,OAAO,MAAM,OAAO,OAAO,YAAY,OAAO,OAAO,MAAM;AAAA;AAAA;AAAA,QACnF,GAAG,KAAK;AACR,sBAAc;AAAA;AAAA,GAAsE,aAAa;AAAA,MACrG;AAAA,IACJ,SAAS,OAAO;AACZ,cAAQ,MAAM,iCAAiC,KAAK;AAAA,IACxD;AAEA,QAAI,CAAC,aAAY,qCAAU,YAAW,GAAG;AACrC,aAAO;AAAA,IACX;AAEA,WAAO,mBAAmB,YAAY,IAAI,aAAa,IAAI,WAAW;AAAA,EAC1E,SAAS,OAAO;AACZ,YAAQ,MAAM,8BAA8B,KAAK;AACjD,UAAM;AAAA,EACV;AACJ;AAEA,IAAM,cAAc,OAAO,QAAwC,WAAgC;AAC/F,MAAI;AACA,UAAM,UAAU,OAAO,WAAW,WAAW,SAAS,cAAc,MAAM;AAC1E,UAAM,WAAW,MAAM,uBAAuB,SAAS,MAAM;AAE7D,QAAI,EAAC,iCAAQ,eAAc;AACvB,aAAO,qCAAU;AAAA,IACrB;AACA,WAAO;AAAA,EACX,SAAS,OAAO;AACZ,YAAQ,MAAM,yBAAyB,KAAK;AAC5C,UAAM;AAAA,EACV;AACJ;AAEA,IAAM,iBAAiB,OAAO,QAAwC,WAAgC;AAClG,MAAI;AACA,UAAM,UAAU,OAAO,WAAW,WAAW,SAAS,cAAc,MAAM;AAC1E,UAAM,WAAW,MAAM,uBAAuB,SAAS,MAAM;AAC7D,WAAO;AAAA,EACX,SAAS,OAAO;AACZ,YAAQ,MAAM,4BAA4B,KAAK;AAC/C,WAAO,CAAC;AAAA,EACZ;AACJ;;;AChZA,IAAM,mBAAmB,MAAM;AAC7B,SAAO,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,EAAE,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,EAAE;AACjG;AAEO,IAAM,2BAAN,MAA0D;AAAA,EAU/D,YACkB,SACA,UACA,QACA,iBAChB;AAJgB;AACA;AACA;AACA;AAblB,SAAS,uBAAuB;AAChC,SAAS,8BAA8B;AAEvC;AAAA,SAAS,oBAAoB;AAE7B;AAAA,SAAS,gBAA0C;AAAA,MACjD,KAAK,CAAC,IAAI;AAAA,IACZ;AA3BF;AAmCI,SAAK,YAAW,YAAO,aAAP,YAAmB;AAAA,EACrC;AAAA,EAIA,MAAc,gBAAgB,iBAA2C,YAAgC;AAxC3G;AAyCI,QAAI;AAEJ,kBAAY,iBAAiB,UAAU,EAAE,KAAK,CAAC,QAAQ;AACrD,eAAO;AAAA,MACT,CAAC,EAAE,MAAM,CAAC,MAAM;AACd,gBAAQ,MAAM,6BAA6B;AAC3C,eAAO,EAAE,UAAU,CAAC,GAAG,iBAAiB,CAAC,EAAE;AAAA,MAC7C,CAAC;AAGD,UAAI,WAAW,MAAM,YAAY,iBAAiB,UAAU;AAE5D,YAAM,iBAAiB;AAEvB,YAAM,iBAAiB,yCAAY;AAEnC,UAAI,eAAe;AACnB,UAAI,gBAAgB;AACpB,UAAI;AAEF,YAAI,gBAAgB;AAClB,0BAAe,0CAAU,YAAV,mBAAmB,IAAI,CAAC,WAAgB;AACrD,mBAAO,WAAW,iCAAQ,MAAM;AAAA;AAAA;AAAA,UAClC,GAAG,KAAK;AAER,2BAAgB,0CAAU,cAAV,mBAAqB,IAAI,CAAC,WAAgB;AACxD,mBAAO,aAAa,iCAAQ,MAAM,OAAO,iCAAQ,YAAY,OAAO,iCAAQ,MAAM;AAAA;AAAA;AAAA,UACpF,GAAG,KAAK;AAAA,QACV,OAAO;AACL,yBAAe,qCAAU,IAAI,CAAC,WAAgB;AAC5C,mBAAO,WAAW,iCAAQ,MAAM;AAAA;AAAA;AAAA,UAClC,GAAG,KAAK;AAAA,QACV;AAAA,MACF,SAAQ,GAAG;AACT,gBAAQ,MAAM,8BAA8B;AAAA,MAC9C;AAEA,UAAI,cAAc;AAClB,UAAI,gBAAgB;AAClB,sBAAc;AAAA;AAAA,GAAsE,aAAa;AAAA,MACnG;AAEA,YAAM,iBAAiB,mBAAmB,cAAc,IAAI,YAAY,IAAI,WAAW;AAGvF,YAAM,eAAuC;AAAA,QAC3C,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAGA,WAAI,qCAAU,UAAS,GAAG;AACxB,wBAAgB,QAAQ,YAAY;AAAA,MACtC;AAEA,UAAI,gBAAgB;AAClB,mBAAW,qCAAU;AAAA,MACvB;AAEA,aAAO,EAAE,UAAU,gBAAgB;AAAA,IACnC,SAAQ,GAAG;AACT,cAAQ,MAAM,iCAAiC;AAC/C,aAAO,EAAE,UAAU,CAAC,GAAG,gBAAgB;AAAA,IACzC;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,SAAkG;AACjH,QAAI;AACF,YAAM,WAAW,KAAK,OAAO;AAC7B,YAAM,eAAe,KAAK,OAAO;AAEjC,YAAM,WAAiC;AAAA,QACrC;AAAA,QACA,YAAY;AAAA,QACZ,QAAQ,KAAK,OAAO;AAAA,MACtB;AAEA,YAAM,aAAiC;AAAA,QACrC,YAAY;AAAA,QACZ,GAAG,KAAK,OAAO;AAAA,QACf,GAAG,KAAK;AAAA,MACV;AAEA,YAAM,WAAW,IAAI,kBAAkB,KAAK,SAAS,UAAU,KAAK,eAAe;AAEnF,UAAI,kBAAkB,QAAQ;AAG9B,YAAM,EAAE,UAAU,iBAAiB,eAAe,IAAI,MAAM,KAAK,gBAAgB,iBAAiB,UAAU;AAE5G,YAAM,QAAQ,SAAS,eAAe;AAEtC,YAAM,MAAM,MAAM,MAAM,WAAW;AAAA,QACjC,GAAG;AAAA,QACH,QAAQ;AAAA,MACV,CAAC;AAGD,UAAI,CAAC,aAAY,qCAAU,YAAW,GAAG;AACvC,eAAO;AAAA,MACT;AAEA,UAAI;AAEF,cAAM,UAAmC;AAAA,UACvC;AAAA,YACE,MAAM;AAAA,YACN,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,IAAI,UAAU,iBAAiB;AAAA,YAC/B,KAAK;AAAA,YACL,kBAAkB;AAAA,cAChB,MAAM;AAAA,gBACJ;AAAA,gBACA,cAAc,qCACV,IAAI,CAAC,WAAgB,iCAAQ,QAC9B,KAAK;AAAA,cACV;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,GAAG;AACV,gBAAQ,MAAM,8BAA8B;AAAA,MAC9C;AAEA,aAAO;AAAA,QACL,GAAG;AAAA;AAAA,MAEL;AAAA,IACF,SAAS,OAAO;AAEd,cAAQ,MAAM,wBAAwB,KAAK;AAC3C,YAAM,IAAI,MAAM,8BAA8B;AAAA,IAChD;AAAA,EACF;AAAA,EAEA,MAAM,SAAS,SAAgG;AAC7G,QAAI;AACF,YAAM,WAAW,KAAK,OAAO;AAC7B,YAAM,eAAe,KAAK,OAAO;AAEjC,YAAM,WAAiC;AAAA,QACrC;AAAA,QACA,YAAY;AAAA,QACZ,QAAQ,KAAK,OAAO;AAAA,QACpB,WAAW,KAAK,OAAO;AAAA,MACzB;AAEA,YAAM,aAAiC;AAAA,QACrC,YAAY;AAAA,QACZ,GAAG,KAAK,OAAO;AAAA,QACf,GAAG,KAAK;AAAA,MACV;AAEA,YAAM,WAAW,IAAI,kBAAkB,KAAK,SAAS,UAAU,KAAK,eAAe;AAEnF,UAAI,kBAAkB,QAAQ;AAG9B,YAAM,EAAE,UAAU,iBAAiB,eAAe,IAAI,MAAM,KAAK,gBAAgB,iBAAiB,UAAU;AAE5G,YAAM,YAAY,SAAS,eAAe;AAG1C,YAAM,iBAAiB,MAAM,UAAU,SAAS;AAAA,QAC9C,GAAG;AAAA,QACH,QAAQ;AAAA,MACV,CAAC;AAGD,UAAI,CAAC,aAAY,qCAAU,YAAW,GAAG;AACvC,eAAO;AAAA,MACT;AAGA,aAAO;AAAA,QACL,QAAQ,eAAe;AAAA,QACvB,SAAS,eAAe;AAAA,QACxB,UAAU,eAAe;AAAA,MAC3B;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,MAAM,sBAAsB,KAAK;AACzC,YAAM,IAAI,MAAM,6CAA6C;AAAA,IAC/D;AAAA,EACF;AACF;;;AJ5NO,IAAM,OAAN,MAAW;AAAA,EAIhB,YAAY,UAAgC;AAAA,IAC1C,UAAU;AAAA,EACZ,GAAG;AAZL;AAaI,SAAK,WACH,0BAAqB,QAAQ,OAAO,MAApC,YAAyC;AAE3C,SAAK,UAAU,QAAQ;AAAA,EACzB;AAAA,EAEA,IAAY,aAAa;AACvB,WAAO;AAAA,MACL,SAAS,KAAK;AAAA,MACd,SAAS,KAAK;AAAA,IAChB;AAAA,EACF;AAAA,EAEA,KAAK,SAA0B,WAA6B,CAAC,GAAG;AAC9D,WAAO,IAAI,yBAAyB,SAAS,UAAU;AAAA,MACrD,UAAU;AAAA,MACV,WAAW;AAAA,MACX,GAAG,KAAK;AAAA,IACV,CAAC;AAAA,EACH;AAAA,EAEA,WAAW,SAA0B,WAA6B,CAAC,GAAG;AACpE,WAAO,IAAI,yBAAyB,SAAS,UAAU;AAAA,MACrD,UAAU;AAAA,MACV,WAAW;AAAA,MACX,GAAG,KAAK;AAAA,IACV,CAAC;AAAA,EACH;AACF;;;AKvCA,SAAS,wBAAAC,6BAA4B;AA6C9B,SAAS,WACd,UAAgC;AAAA,EAC9B,UAAU;AACZ,GACc;AAnDhB;AAoDE,QAAM,WACJ,KAAAC,sBAAqB,QAAQ,OAAO,MAApC,