{"version":3,"file":"index.cjs","sources":["../src/logger.ts","../src/ModelUsage.ts","../src/config.ts","../src/parsers.ts","../src/utils.ts","../src/LLM.ts","../src/anthropic.ts","../src/ollama.ts","../src/openai.ts","../src/google.ts","../src/APIv1.ts","../src/xai.ts","../src/groq.ts","../src/deepseek.ts","../src/Attachment.ts","../src/index.ts"],"sourcesContent":["interface LoggerConfig {\n  enabled: boolean;\n  color: string;\n  lastTime?: number;\n}\n\ninterface Logger {\n  (message: any, ...args: any[]): void;\n  debug: (message: any, ...args: any[]) => void;\n  warn: (message: any, ...args: any[]) => void;\n  error: (message: any, ...args: any[]) => void;\n  namespace: string;\n  enabled: boolean;\n}\n\nclass LoggerManager {\n  private loggers = new Map<string, LoggerConfig>();\n  private patterns: string[] = [];\n  private isNode = typeof process !== 'undefined' && process.env;\n  private colors = [\n    '#e6194b', '#3cb44b', '#ffe119', '#4363d8', '#f58231', '#911eb4',\n    '#46f0f0', '#f032e6', '#bcf60c', '#fabebe', '#008080', '#e6beff',\n    '#9a6324', '#fffac8', '#800000', '#aaffc3', '#808000', '#ffd8b1',\n    '#000075', '#808080'\n  ];\n  \n  constructor() {\n    this.updatePatterns();\n  }\n\n  private updatePatterns(): void {\n    let debugEnv = '';\n    \n    if (this.isNode) {\n      debugEnv = typeof process !== 'undefined' && process.env.DEBUG || '';\n    } else {\n      // Browser: check localStorage and global config\n      if (typeof localStorage !== 'undefined') {\n        debugEnv = localStorage.getItem('DEBUG') || '';\n      }\n      if (typeof globalThis !== 'undefined' && (globalThis as any).DEBUG) {\n        debugEnv = (globalThis as any).DEBUG;\n      }\n    }\n\n    this.patterns = debugEnv.split(',').map(p => p.trim()).filter(Boolean);\n    \n    // Update existing loggers\n    for (const [namespace, config] of this.loggers) {\n      config.enabled = this.isEnabled(namespace);\n    }\n  }\n\n  private isEnabled(namespace: string): boolean {\n    if (this.patterns.length === 0) return false;\n\n    for (const pattern of this.patterns) {\n      if (pattern.startsWith('-')) {\n        // Exclusion pattern\n        const excludePattern = pattern.slice(1);\n        if (this.matchPattern(namespace, excludePattern)) {\n          return false;\n        }\n      } else {\n        // Inclusion pattern\n        if (this.matchPattern(namespace, pattern)) {\n          return true;\n        }\n      }\n    }\n\n    return false;\n  }\n\n  private matchPattern(namespace: string, pattern: string): boolean {\n    if (pattern === '*') return true;\n    if (pattern === namespace) return true;\n    \n    // Convert glob pattern to regex\n    const regexPattern = pattern\n      .replace(/\\*/g, '.*')\n      .replace(/\\?/g, '.')\n      .replace(/\\+/g, '\\\\+')\n      .replace(/\\[/g, '\\\\[')\n      .replace(/\\]/g, '\\\\]')\n      .replace(/\\(/g, '\\\\(')\n      .replace(/\\)/g, '\\\\)')\n      .replace(/\\{/g, '\\\\{')\n      .replace(/\\}/g, '\\\\}')\n      .replace(/\\^/g, '\\\\^')\n      .replace(/\\$/g, '\\\\$')\n      .replace(/\\|/g, '\\\\|');\n    \n    const regex = new RegExp(`^${regexPattern}$`);\n    return regex.test(namespace);\n  }\n\n  private getColor(namespace: string): string {\n    // Simple hash function to consistently assign colors\n    let hash = 0;\n    for (let i = 0; i < namespace.length; i++) {\n      const char = namespace.charCodeAt(i);\n      hash = ((hash << 5) - hash) + char;\n      hash = hash & hash; // Convert to 32bit integer\n    }\n    return this.colors[Math.abs(hash) % this.colors.length];\n  }\n\n  private formatMessage(namespace: string, level: string, message: any, args: any[]): string {\n    const now = Date.now();\n    const config = this.loggers.get(namespace)!;\n    \n    let prefix = namespace;\n    let timeDiff = '';\n    \n    if (config.lastTime) {\n      timeDiff = `+${now - config.lastTime}ms`;\n    }\n    config.lastTime = now;\n\n    if (this.isNode) {\n      // Node.js: Use ANSI color codes\n      const colorCode = this.getAnsiColor(config.color);\n      prefix = `\\x1b[${colorCode}m${namespace}\\x1b[0m`;\n      if (timeDiff) {\n        prefix += ` \\x1b[90m${timeDiff}\\x1b[0m`;\n      }\n    } else {\n      // Browser: Use CSS colors\n      if (timeDiff) {\n        prefix += ` ${timeDiff}`;\n      }\n    }\n\n    const levelPrefix = level !== 'debug' ? `[${level.toUpperCase()}]` : '';\n    return `${prefix}${levelPrefix ? ' ' + levelPrefix : ''} ${message}`;\n  }\n\n  private getAnsiColor(hexColor: string): string {\n    // Convert hex color to closest ANSI color code\n    const colorMap: { [key: string]: string } = {\n      '#e6194b': '31', // red\n      '#3cb44b': '32', // green  \n      '#ffe119': '33', // yellow\n      '#4363d8': '34', // blue\n      '#f58231': '35', // magenta\n      '#911eb4': '36', // cyan\n    };\n    return colorMap[hexColor] || '37'; // default to white\n  }\n\n  private log(namespace: string, level: 'debug' | 'warn' | 'error', message: any, ...args: any[]): void {\n    const config = this.loggers.get(namespace);\n    if (!config || !config.enabled) return;\n\n    if (typeof message === \"object\" || Array.isArray(message)) {\n      message = JSON.stringify(message);\n    }\n\n    for (let i = 0; i < args.length; i++) {\n      if (typeof args[i] === \"object\" || Array.isArray(args[i])) {\n        args[i] = JSON.stringify(args[i]);\n      }\n    }\n\n    const formattedMessage = this.formatMessage(namespace, level, message, args);\n    \n    if (this.isNode) {\n      // Node.js: Write to stderr for debug, stdout for warn/error\n      const output = level === 'debug' ? process.stderr : process.stdout;\n      output.write(formattedMessage + ' ');\n      if (args.length > 0) {\n        output.write(args.map(arg => \n          typeof arg === 'object' ? JSON.stringify(arg, null, 2) : String(arg)\n        ).join(' '));\n      }\n\n      output.write(\"\\n\");\n    } else {\n      // Browser: Use console with CSS styling\n      const styles = `color: ${config.color}; font-weight: bold;`;\n      if (level === 'warn') {\n        console.warn(`%c${formattedMessage}`, styles, ...args);\n      } else if (level === 'error') {\n        console.error(`%c${formattedMessage}`, styles, ...args);\n      } else {\n        console.log(`%c${formattedMessage}`, styles, ...args);\n      }\n    }\n  }\n\n  createLogger(namespace: string): Logger {\n    if (!this.loggers.has(namespace)) {\n      this.loggers.set(namespace, {\n        enabled: this.isEnabled(namespace),\n        color: this.getColor(namespace)\n      });\n    }\n\n    const config = this.loggers.get(namespace)!;\n\n    const logger = ((message: any, ...args: any[]) => {\n      this.log(namespace, 'debug', message, ...args);\n    }) as Logger;\n\n    logger.debug = (message: any, ...args: any[]) => {\n      this.log(namespace, 'debug', message, ...args);\n    };\n\n    logger.warn = (message: any, ...args: any[]) => {\n      this.log(namespace, 'warn', message, ...args);\n    };\n\n    logger.error = (message: any, ...args: any[]) => {\n      this.log(namespace, 'error', message, ...args);\n    };\n\n    logger.namespace = namespace;\n    \n    Object.defineProperty(logger, 'enabled', {\n      get: () => config.enabled\n    });\n\n    return logger;\n  }\n\n  // Update patterns when environment changes\n  refresh(): void {\n    this.updatePatterns();\n  }\n}\n\n// Singleton instance\nconst manager = new LoggerManager();\n\n// Factory function to create loggers\nfunction createLogger(namespace: string): Logger {\n  return manager.createLogger(namespace);\n}\n\n// Utility to refresh patterns (useful when DEBUG env changes)\ncreateLogger.refresh = () => manager.refresh();\n\nexport default createLogger;\nexport { Logger, createLogger };","import data from \"../data/model_prices_and_context_window.json\";\n\nlet modelData = data;\n\nimport type { ServiceName, QualityFilter } from \"./LLM.types\";\n\nlet customModels: Record<string, ModelUsageType> = {\n};\n\n/**\n * @category Usage\n */\nexport type ModelTag = \"reasoning\" | \"tools\" | \"images\" | \"search\" | \"audio\" | \"cache\";\n\n/**\n * @category Usage\n */\nexport type ModelUsageType = {\n    mode: string;\n    service: string;\n    model: string;\n    max_tokens: number;\n    max_input_tokens: number;\n    max_output_tokens: number;\n    input_cost_per_token: number;\n    output_cost_per_token: number;\n    output_cost_per_reasoning_token: number;\n    supports_reasoning: boolean;\n    supports_function_calling: boolean;\n    supports_vision: boolean;\n    supports_web_search: boolean;\n    supports_audio_input: boolean;\n    supports_audio_output: boolean;\n    supports_prompt_caching: boolean;\n    tags: ModelTag[];\n}\n\n/**\n * @category Usage\n */\nexport default class ModelUsage {\n    static readonly DEFAULT_BASE_URL: string = \"https://raw.githubusercontent.com/BerriAI/litellm/refs/heads/main/model_prices_and_context_window.json\";\n\n    service: ServiceName;\n\n    constructor(service: ServiceName) {\n        this.service = service;\n    }\n\n    getModel(model: string, quality_filter: QualityFilter = {}): ModelUsageType | null {\n        return ModelUsage.get(this.service, model, quality_filter);\n    }\n\n    async refresh() {\n        await ModelUsage.refresh();\n    }\n\n    models() {\n        return ModelUsage.getByService(this.service);\n    }\n\n    static get(service: ServiceName, model: string, quality_filter: QualityFilter = {}): ModelUsageType | null {\n        let info = this.getByServiceModel(service, model);\n        if (info) return info;\n\n        if (!quality_filter.allowSimilar) return null;\n\n        info = this.getByServiceModel(service, `${model}-latest`);\n        if (info) return info;\n\n        info = this.getByServiceModel(service, `${model}-beta`);\n        if (info) return info;\n\n        info = this.getByServiceModel(service, `${service}/${model}`);\n        if (info) return info;\n\n        info = this.getByServiceModel(service, `${service}/${model}-beta`);\n        if (info) return info;\n\n        info = this.getByServiceModel(service, model.replace(\"-beta\", \"\"));\n        if (info) return info;\n\n        info = this.getByServiceModel(service, model.replace(\"-thinking\", \"\"));\n        if (info) return info;\n\n        info = this.getByServiceModel(service, model.replace(\"-exp\", \"\"));\n        if (info) return info;\n\n        info = this.getByServiceModel(service, model.replace(\"-experimental\", \"\"));\n        if (info) return info;\n\n        info = this.getByServiceModel(service, model.replace(\"-thinking-exp\", \"\"));\n        if (info) return info;\n\n        info = this.getByServiceModel(service, model.replace(\"-preview\", \"\"));\n        if (info) return info;\n\n        return null;\n    }\n\n    static getAll(): ModelUsageType[] {\n        return this.factories(data).filter(this.filter());\n    }\n\n    static getByService(service?: ServiceName): ModelUsageType[] {\n        return this.factories(data).filter(this.filter(service));\n    }\n\n    static getByServiceModel(service: ServiceName, model: string): ModelUsageType | null {\n        return this.getByService(service).find(m => m.model === model || m.model === `${service}/${model}`) || null;\n    }\n\n    static filter(service?: ServiceName): (model: ModelUsageType) => boolean {\n        return (model: ModelUsageType) => {\n            if (model.mode !== \"chat\" && model.mode !== \"responses\") return false;\n            if (service === \"google\" && model.service === \"gemini\") return true;\n            return service ? model.service === service : true;\n        }\n    }\n\n    static factories(data: any): ModelUsageType[] {\n        const custom = Object.assign({}, data, customModels);\n\n        return Object.keys(custom).map(key => {\n            const m = custom[key];\n\n            const max_input_tokens = m.max_input_tokens || 0;\n            const max_output_tokens = m.max_output_tokens || 0;\n            const max_tokens = (m.max_tokens ? m.max_tokens : max_input_tokens + max_output_tokens);\n\n            const input_cost_per_token = m.input_cost_per_token || 0;\n            const output_cost_per_token = m.output_cost_per_token || 0;\n            const output_cost_per_reasoning_token = m.output_cost_per_reasoning_token || 0;\n\n            const supported_modalities = m.supported_modalities || [];\n            const supports_reasoning = m.supports_reasoning || false;\n            const supports_function_calling = m.supports_function_calling || m.raw?.supports_function_calling || false;\n            const supports_vision = m.supports_vision || m.raw?.supports_vision || false;\n            const supports_web_search = m.supports_web_search || m.raw?.supports_web_search || false;\n            const supports_audio_input = m.supports_audio_input || m.raw?.supports_audio_input || false;\n            const supports_audio_output = m.supports_audio_output || m.raw?.supports_audio_output || false;\n            const supports_prompt_caching = m.supports_prompt_caching || m.raw?.supports_prompt_caching || false;\n\n            const tags: ModelTag[] = [];\n            if (supports_reasoning) tags.push(\"reasoning\");\n            if (supports_function_calling) tags.push(\"tools\");\n            if (supports_vision) tags.push(\"images\");\n            if (supports_web_search) tags.push(\"search\");\n            if (supports_audio_input || supports_audio_output) tags.push(\"audio\");\n            if (supports_prompt_caching) tags.push(\"cache\");\n\n            let model = key;\n            if (key.includes(\"/\")) model = key.split(\"/\").slice(1).join(\"/\");\n\n            return {\n                service: m.litellm_provider || m.service,\n                mode: m.mode,\n                model,\n                max_tokens,\n                max_input_tokens,\n                max_output_tokens,\n                input_cost_per_token,\n                output_cost_per_token,\n                output_cost_per_reasoning_token,\n                supports_reasoning,\n                supports_function_calling,\n                supports_vision,\n                supports_web_search,\n                supports_audio_input,\n                supports_audio_output,\n                supports_prompt_caching,\n                supported_modalities,\n                tags,\n            }\n        });\n    }\n\n    static async refresh(service?: ServiceName): Promise<ModelUsageType[]> {\n        const response = await fetch(this.DEFAULT_BASE_URL);\n        const data = await response.json();\n        modelData = data;\n        return this.factories(data).filter(this.filter(service));\n    }\n\n    static addCustom(info: ModelUsageType) {\n        customModels[`${info.service}/${info.model}`] = Object.assign({}, { mode: \"chat\" }, info);\n    }\n    static getCustom(service: ServiceName, model: string): ModelUsageType | null { return customModels[`${service}/${model}`] || null }\n    static getCustoms() { return customModels }\n    static removeCustom(service: ServiceName, model: string) { delete customModels[`${service}/${model}`] }\n    static clearCustom() { customModels = {} }\n}","import type { ServiceName } from \"./LLM.types\";\n\ntype Config = {\n    service: ServiceName;\n    max_tokens: number;\n}\n\nexport default {\n    service: \"ollama\",\n    max_tokens: 1024,\n} as Config;","import logger from \"./logger\";\n\nconst log = logger(\"llm.js:parsers\");\n\n/**\n * @category Parsers\n */\nexport function codeBlock(blockType: string) {\n    return function (content: string) : string {\n        try {\n            return content.split(\"```\" + blockType)[1].split(\"```\")[0].trim();\n        } catch (e) {\n            log.error(`error parsing code block of type ${blockType} from content`, content);\n            throw e;\n        }\n    }\n}\n\n/**\n * @category Parsers\n */\nexport function markdown(content: string) : string {\n    try {\n        return codeBlock(\"markdown\")(content);\n    } catch (e) {\n        return codeBlock(\"md\")(content);\n    }\n}\n\n/**\n * @category Parsers\n */\nexport function json(content: string) : any {\n    try {\n        return JSON.parse(content);\n    } catch (e) {\n        const parser = codeBlock(\"json\");\n        try {\n            return JSON.parse(parser(content));\n        } catch (e) {\n            log.error(`error parsing json from content`, content);\n            throw e;\n        }\n    }\n}\n\n/**\n * @category Parsers\n */\nexport function xml(tag: string) {\n    return function (content: string) : string {\n        try {\n            const inner = content.split(`<${tag}>`)[1].split(`</${tag}>`)[0].trim();\n            if (!inner || inner.length == 0) {\n                throw new Error(`No content found inside of XML tag ${tag}`);\n            }\n            return inner;\n        } catch (e) {\n            log.error(`error parsing xml tag ${tag} from content`, content);\n            throw e;\n        }\n    }\n}","import logger from \"./logger\";\nimport type { Message, MessageRole, Tool, ToolCall, WrappedTool, WrappedToolCall } from \"./LLM.types\";\n\nconst log = logger(\"llm.js:utils\");\n\nexport async function handleErrorResponse(response: Response, error=\"Error while handling response\") {\n    if (response.ok) return true;\n    let data;\n    try {\n        data = await response.json();\n    } catch (e) {\n        let err = \"Unable to parse response\";\n        if (response.status && response.statusText) {\n            err = `${response.status} ${response.statusText}`;\n        }\n\n        throw new Error(err);\n    }\n\n    let err = error;\n    if (data.error && typeof data.error === \"string\") {\n        err = data.error;\n    } else if (data.error && typeof data.error === \"object\" && data.error.type && data.error.message) {\n        err = `${data.error.type}: ${data.error.message}`;\n    } else if (data.error && typeof data.error === \"object\") {\n        err = JSON.stringify(data.error);\n    }\n\n    throw new Error(err);\n}\n\nexport async function *parseStream(stream: ReadableStream) : AsyncGenerator<any> {\n    const reader = stream.getReader();\n    const decoder = new TextDecoder();\n    let buffer = \"\";\n\n    let done = false;\n    while (!done) {\n        let { done, value } = await reader.read();\n        if (done) break;\n\n        let jsonchunk = decoder.decode(value, { stream: true });\n        if (!jsonchunk) continue;\n\n        const jsonlines = jsonchunk.split(\"\\n\");\n        let unparsedLines: string[] = [];\n\n        for (let jsonline of jsonlines) {\n            if (jsonline.startsWith(\"event: \")) continue;\n            if (jsonline.startsWith(\"data: \")) jsonline = jsonline.slice(6);\n            if (jsonline.length === 0) continue;\n            unparsedLines.push(jsonline);\n        }\n\n        buffer = unparsedLines.join(\"\\n\");\n        unparsedLines = [];\n\n        const lines = buffer.split(\"\\n\");\n        for (const line of lines) {\n            try {\n                const data = JSON.parse(line);\n                yield data;\n                if (data.type === \"message_stop\" || data.type === \"response.completed\" ||  data.done) {\n                    done = true;\n                    break;\n                }\n            } catch (e) {\n                unparsedLines.push(line);\n            }\n        }\n\n        buffer = unparsedLines.join(\"\\n\");\n    }\n\n    if (buffer.length > 0) {\n        try {\n            const data = JSON.parse(buffer);\n            yield data;\n        } catch (e) {\n            log.error(\"Error parsing JSON LINE:\", buffer);\n        }\n    }\n}\n\nexport function filterMessageRole(messages: Message[], role: MessageRole): Message[] {\n    return messages.filter(message => message.role === role);\n}\n\nexport function filterNotMessageRole(messages: Message[], role: MessageRole): Message[] {\n    return messages.filter(message => message.role !== role);\n}\n\nexport function uuid() {\n    return crypto.randomUUID();\n}\n\nexport function wrapTool(tool: Tool) : WrappedTool {\n    if (!tool.name) throw new Error(\"Tool name is required\");\n    if (!tool.description) throw new Error(\"Tool description is required\");\n    if (!tool.input_schema) throw new Error(\"Tool input schema is required\");\n\n    return {\n        type: \"function\",\n        function: { name: tool.name, description: tool.description, parameters: tool.input_schema },\n    };\n}\n\nexport function unwrapToolCall(tool_call: WrappedToolCall) : ToolCall {\n    if (!tool_call.function) throw new Error(\"Tool call function is required\");\n    if (!tool_call.function.id) tool_call.function.id = crypto.randomUUID();\n    if (!tool_call.function.name) throw new Error(\"Tool call function name is required\");\n    if (!tool_call.function.arguments) throw new Error(\"Tool call function arguments is required\");\n\n    let args = tool_call.function.arguments;\n    if (typeof args === \"string\") args = JSON.parse(args);\n\n    return { id: tool_call.function.id, name: tool_call.function.name, input: args };\n}\n\nexport function keywordFilter(str: string, keywords: string[]): boolean {\n  for (const keyword of keywords) {\n    if (str.includes(`${keyword}-`)) return false;\n    if (str.includes(`-${keyword}`)) return false;\n  }\n  return true;\n}\n\nexport function isBrowser(): boolean {\n    return typeof window !== 'undefined' && !isNode();\n}\n\nexport function isNode(): boolean {\n    return typeof process !== 'undefined' && !isBrowser();\n}\n\nexport function apiKeys() {\n    if (isBrowser()) {\n        return Object.fromEntries(Object.entries(localStorage).filter(([key]) => key.indexOf(\"API_KEY\") !== -1));\n    } else {\n        return Object.fromEntries(Object.entries(process.env).filter(([key]) => key.indexOf(\"API_KEY\") !== -1));\n    }\n}\n\n/* @ts-ignore */\nexport const environment = isBrowser() ? import.meta.env : process.env;\n\n\nexport function getenv(key: string) {\n    return environment[key] ?? environment[`VITE_${key}`];\n}\n\n/**\n * Deep clone an object while preserving class instances and their methods\n * Unlike JSON.parse(JSON.stringify()), this preserves prototype chains\n */\nexport function deepClone<T>(obj: T): T {\n    if (obj === null || typeof obj !== \"object\") {\n        return obj;\n    }\n\n    if (obj instanceof Date) {\n        return new Date(obj.getTime()) as T;\n    }\n\n    if (obj instanceof Array) {\n        return obj.map((item) => deepClone(item)) as T;\n    }\n\n    if (obj instanceof RegExp) {\n        return new RegExp(obj) as T;\n    }\n\n    // For class instances, preserve the prototype\n    if (obj.constructor !== Object) {\n        const cloned = Object.create(Object.getPrototypeOf(obj));\n        for (const key in obj) {\n            if (obj.hasOwnProperty(key)) {\n                cloned[key] = deepClone((obj as any)[key]);\n            }\n        }\n        return cloned;\n    }\n\n    // For plain objects\n    const cloned = {} as T;\n    for (const key in obj) {\n        if (obj.hasOwnProperty(key)) {\n            (cloned as any)[key] = deepClone((obj as any)[key]);\n        }\n    }\n\n    return cloned;\n}\n\nexport function join(...pathSegments: string[]): string {\n    if (pathSegments.length === 0) return \".\";\n    \n    const firstSegment = pathSegments[0];\n    const isUrl = firstSegment.startsWith(\"http://\") || firstSegment.startsWith(\"https://\");\n    \n    if (isUrl) {\n        const [protocol, ...urlParts] = firstSegment.split(\"://\");\n        const remainingSegments = pathSegments.slice(1);\n        \n        const allSegments = [urlParts.join(\"://\"), ...remainingSegments];\n        const joinedPath = allSegments.join(\"/\").replace(/\\/+/g, \"/\"); // Remove duplicate slashes\n        \n        return `${protocol}://${joinedPath}`;\n    }\n    \n    let parts: string[] = [];\n    for (let i = 0, l = pathSegments.length; i < l; i++) {\n      parts = parts.concat(pathSegments[i].split(\"/\"));\n    }\n\n    const newParts: string[] = [];\n    for (let i = 0, l = parts.length; i < l; i++) {\n      const part = parts[i];\n      if (!part || part === \".\") continue;\n      if (part === \"..\") newParts.pop();\n      else newParts.push(part);\n    }\n\n    if (parts[0] === \"\") newParts.unshift(\"\");\n    return newParts.join(\"/\") || (newParts.length ? \"/\" : \".\");\n}","import logger from './logger';\nconst log = logger(\"llm.js:index\");\n\nimport ModelUsage from \"./ModelUsage\";\nimport Attachment from \"./Attachment\";\nimport type { ModelUsageType } from \"./ModelUsage\";\nimport config from \"./config\";\nimport * as parsers from \"./parsers\";\nimport { parseStream, handleErrorResponse, isBrowser, isNode, join, deepClone } from \"./utils\";\nimport type {\n    ServiceName, Options, InputOutputTokens, Usage, Response, PartialStreamResponse, StreamResponse, QualityFilter,\n    Message, Parsers, Input, Model, MessageRole, ParserResponse, Tool, MessageContent, ToolCall, StreamingToolCall } from \"./LLM.types\";\n\n/**\n * LLM Base Class\n * \n * @category LLMs\n */\nexport default class LLM {\n    static parsers = parsers;\n    static readonly service: ServiceName;\n    static DEFAULT_BASE_URL: string;\n    static DEFAULT_MODEL: string;\n    static isLocal: boolean = false;\n    static isBearerAuth: boolean = false;\n    static MessageExtendedContentInputKey: string = \"text\";\n\n    service: ServiceName;\n    messages: Message[];\n    model: string;\n    baseUrl: string;\n    options: Options;\n    modelUsage: ModelUsage;\n    stream: boolean;\n    max_tokens: number;\n    max_thinking_tokens?: number;\n    extended: boolean;\n    think: boolean;\n    temperature?: number;\n    parser?: ParserResponse;\n    json?: boolean;\n    tools?: Tool[];\n    qualityFilter: QualityFilter;\n    protected abortController: AbortController | null = null;\n    protected cache: Record<string, any> = {};\n\n    constructor(input?: Input | Options, options: Options = {}) {\n        const LLM = this.constructor as LLMConstructor;\n\n        this.service = options.service ?? (this.constructor as typeof LLM).service;\n        this.messages = [];\n        if (input && typeof input === \"string\") this.user(input, options.attachments);\n        else if (input && Array.isArray(input)) this.messages = input;\n        this.options = options;\n        this.model = options.model ?? LLM.DEFAULT_MODEL;\n        this.baseUrl = options.baseUrl ?? LLM.DEFAULT_BASE_URL;\n        this.modelUsage = new ModelUsage(this.service);\n        this.stream = options.stream ?? false;\n        this.max_tokens = options.max_tokens ?? config.max_tokens;\n        this.extended = options.extended ?? false;\n        this.think = options.think ?? false;\n        this.qualityFilter = options.qualityFilter ?? {};\n        if (typeof options.temperature === \"number\") this.temperature = options.temperature;\n        if (typeof options.max_thinking_tokens === \"number\") this.max_thinking_tokens = options.max_thinking_tokens;\n        if (typeof options.parser === \"string\") this.parser = this.parsers[options.parser];\n        if (typeof options.json === \"boolean\") this.json = options.json;\n        if (this.json && !this.parser) this.parser = parsers.json;\n        if (Array.isArray(options.tools)) this.tools = options.tools as Tool[];\n        if (this.think) this.extended = true;\n        if (this.tools && this.tools.length > 0) this.extended = true;\n\n        log.debug(`LLM ${this.service} constructor`);\n    }\n\n    get isLocal() { return (this.constructor as typeof LLM).isLocal }\n    get apiKey() {\n        if (this.options.apiKey) return this.options.apiKey;\n        if (isBrowser()) {\n            if (localStorage.getItem(`${this.service.toUpperCase()}_API_KEY`)) return localStorage.getItem(`${this.service.toUpperCase()}_API_KEY`);\n        } else if (isNode()) {\n            if (typeof process !== 'undefined' && process.env?.[`${this.service.toUpperCase()}_API_KEY`]) return process.env[`${this.service.toUpperCase()}_API_KEY`];\n        }\n        return undefined;\n    }\n    get llmOptions(): Options {\n        const options = {\n            model: this.model,\n            messages: this.parseMessages(this.messages),\n            stream: this.stream,\n            max_tokens: this.max_tokens,\n            think: this.think,\n        } as Options;\n        if (typeof this.max_thinking_tokens === \"number\") options.max_thinking_tokens = this.max_thinking_tokens;\n        if (typeof this.temperature === \"number\") options.temperature = this.temperature;\n        if (this.tools) options.tools = this.tools;\n        return options;\n    }\n\n    get llmHeaders() {\n        const headers: Record<string, string> = {\n            \"Content-Type\": \"application/json\",\n        };\n        if ((this.constructor as typeof LLM).isBearerAuth) headers[\"Authorization\"] = `Bearer ${this.apiKey}`;\n        else if (this.apiKey) headers[\"x-api-key\"] = this.apiKey;\n        return headers;\n    }\n\n    get chatUrl() { return join(this.baseUrl, \"api/chat\") }\n    get modelsUrl() { return join(this.baseUrl, \"api/tags\") }\n    getChatUrl(opts: Options) { return this.chatUrl }\n    getModelsUrl() { return this.modelsUrl }\n    get parsers(): Parsers {\n        return {\n            thinking: this.parseThinkingChunk.bind(this),\n            content: this.parseContentChunk.bind(this),\n            usage: this.parseTokenUsage.bind(this),\n            tool_calls: this.parseToolsChunk.bind(this),\n        }\n    }\n\n    addMessage(role: MessageRole, content: MessageContent) { this.messages.push({ role, content }) }\n    user(content: string, attachments?: Attachment[]) {\n        if (attachments && attachments.length > 0) {\n            const key = (this.constructor as typeof LLM).MessageExtendedContentInputKey;\n            this.addMessage(\"user\", { type: key, text: content, attachments });\n        } else {\n            this.addMessage(\"user\", content);\n        }\n    }\n    assistant(content: string) { this.addMessage(\"assistant\", content) }\n    system(content: string) { this.addMessage(\"system\", content) }\n    thinking(content: string) { this.addMessage(\"thinking\", content) }\n    toolCall(tool: ToolCall) { this.addMessage(\"tool_call\", tool) }\n\n    async chat(input: string, options?: Options): Promise<string | AsyncGenerator<string> | Response | PartialStreamResponse> {\n        const attachments = options?.attachments || [];\n        this.user(input, attachments);\n        return await this.send(options);\n    }\n\n    abort() { \n        if (this.abortController) {\n            this.abortController.abort();\n        }\n    }\n\n    async send(options?: Options): Promise<string | AsyncGenerator<string> | Response | PartialStreamResponse> {\n        delete options?.attachments;\n\n        const vanillaOptions = { ...this.llmOptions, ...options || {} };\n        const opts = this.parseOptions(JSON.parse(JSON.stringify(vanillaOptions)));\n\n        this.resetCache();\n\n        if (opts.tools && opts.tools.length > 0) this.extended = true;\n\n        log.debug(`LLM ${this.service} send`);\n\n        this.abortController = new AbortController();\n\n        const response = await fetch(this.getChatUrl(opts), {\n            method: \"POST\",\n            body: JSON.stringify(opts),\n            headers: this.llmHeaders,\n            signal: this.abortController.signal,\n            mode: \"cors\",\n            credentials: \"omit\",\n        });\n\n        await handleErrorResponse(response, \"Failed to send request\");\n\n        if (this.stream) {\n            const body = response.body;\n            if (!body) throw new Error(\"No body found\");\n            if (this.extended) return this.extendedStreamResponse(body, vanillaOptions);\n            return this.streamResponse(body);\n        }\n\n        try {\n            const data = await response.json();\n            if (this.extended) return this.extendedResponse(data, vanillaOptions);\n            return this.response(data);\n        } finally {\n            this.abortController = null;\n        }\n    }\n\n    response(data: any) : string {\n        let content = this.parseContent(data);\n        if (this.parser) content = this.parser(content) as string;\n\n        if (content) this.assistant(content);\n        return content;\n    }\n\n    protected extendedResponse(data: any, options: Options): Response {\n        const response = {\n            service: this.service,\n            options,\n        } as Response;\n\n        const tokenUsage = this.parseTokenUsage(data);\n        if (tokenUsage) {\n            response.usage = this.parseUsage(tokenUsage);\n        }\n\n        if (options.think) {\n            const thinking = this.parseThinking(data);\n            if (thinking) {\n                response.thinking = thinking;\n                this.thinking(thinking);\n            }\n        }\n\n        let content = this.parseContent(data);\n        if (this.parser) content = this.parser(content) as string;\n        if (content) this.assistant(content);\n\n        if (this.tools && this.tools.length > 0) {\n            response.tool_calls = this.parseTools(data) as ToolCall[];\n            for (const tool of response.tool_calls) {\n                if (tool && Object.keys(tool).length > 0) { this.toolCall(tool) }\n            }\n        }\n\n        response.content = content;\n        response.messages = JSON.parse(JSON.stringify(this.messages));\n\n        return response;\n    }\n\n    protected async *streamResponse(stream: ReadableStream): AsyncGenerator<string> {\n        const restream = this.streamResponses(stream, { content: this.parseContentChunk.bind(this) });\n        for await (const chunk of restream) {\n            if (chunk.type === \"content\") {\n                yield chunk.content as string;\n            }\n        }\n\n        this.abortController = null;\n    }\n\n    protected async *streamResponses(stream: ReadableStream, parsers: Parsers): AsyncGenerator<Record<string, string | InputOutputTokens | ToolCall[]>> {\n        const reader = await parseStream(stream);\n        let buffers : Record<string, string | InputOutputTokens | ToolCall[] | StreamingToolCall> = { \"type\": \"buffers\" };;\n\n        for await (const chunk of reader) {\n            for (const [name, parser] of Object.entries(parsers)) {\n                const content = parser(chunk);\n                if (!content) continue;\n\n                if (name === \"usage\") {\n                    buffers[name] = content as InputOutputTokens;\n                    yield { type: name, content: content as InputOutputTokens };\n                } else if (name === \"tool_calls\") {\n                    if (!Array.isArray(content) || content.length === 0) continue;\n                    if (!buffers[name]) buffers[name] = [];\n                    (buffers[name] as ToolCall[]).push(...content as unknown as ToolCall[]);\n                    yield { type: name, content: content as unknown as ToolCall[] };\n                } else {\n                    if (!buffers[name]) buffers[name] = \"\";\n                    buffers[name] += content as string;\n                    yield { type: name, content: content as string };\n                }\n            }\n        }\n\n        this.saveBuffers(buffers);\n\n        return buffers;\n    }\n\n    protected saveBuffers(buffers: Record<string, string | InputOutputTokens | ToolCall[] | StreamingToolCall>) {\n        for (let [name, content] of Object.entries(buffers)) {\n            if (name === \"thinking\") {\n                this.thinking(content as string);\n            } else if (name === \"tool_calls\") {\n                for (const tool of content as unknown as ToolCall[]) {\n                    if (tool && Object.keys(tool).length > 0) { this.toolCall(tool) }\n                }\n            } else if (name === \"content\") {\n                if (this.parser) {\n                    content = this.parser(content) as string;\n                    buffers[name] = content;\n                }\n                if (content) this.assistant(content as string);\n            }\n        }\n    }\n\n    protected async *restream(stream: AsyncGenerator<Record<string, string | InputOutputTokens>>, callback?: (chunk: Record<string, string | InputOutputTokens>) => void): AsyncGenerator<Record<string, string | InputOutputTokens>> {\n        while (true) {\n            const { value, done } = await stream.next();\n            if (callback && value) callback(value);\n            if (done) break;\n            yield value;\n        }\n    }\n\n    protected extendedStreamResponse(body: ReadableStream, options: Options): PartialStreamResponse {\n        let usage: Usage;\n\n        let thinking = \"\";\n        let content = \"\";\n        let tool_calls: ToolCall[] = [];\n\n        const complete = async (): Promise<StreamResponse> => {\n            const messages = JSON.parse(JSON.stringify(this.messages));\n            const response = { service: this.service, options, usage, messages, content } as StreamResponse;\n            if (thinking) response.thinking = thinking;\n            if (tool_calls.length > 0) response.tool_calls = tool_calls;\n\n            this.abortController = null;\n\n            return response;\n        }\n\n        const stream = this.streamResponses(body, this.parsers);\n        const restream = this.restream(stream as AsyncGenerator<Record<string, string | InputOutputTokens>>, (chunk) => {\n            if (chunk.type === \"usage\" && chunk.content && typeof chunk.content === \"object\") {\n                const tokenUsage = chunk.content as InputOutputTokens;\n                usage = this.parseUsage(tokenUsage);\n            }\n\n            if (chunk.type === \"tool_calls\" && chunk.content && Array.isArray(chunk.content)) {\n                tool_calls.push(...chunk.content as unknown as ToolCall[]);\n            }\n\n            if (chunk.type !== \"buffers\") return;\n            if (chunk.thinking) thinking = chunk.thinking as string;\n            if (chunk.content) content = chunk.content as string;\n        });\n\n        return { service: this.service, options, stream: restream, complete, think: this.think ?? false }\n    }\n\n    async fetchModels(): Promise<Model[]> {\n        const options = { headers: this.llmHeaders } as RequestInit;\n        log.debug(`LLM ${this.service} fetchModels`);\n        const response = await fetch(this.getModelsUrl(), options);\n        await handleErrorResponse(response, \"Failed to fetch models\");\n\n        const data = await response.json();\n        let models = [];\n        if (Array.isArray(data)) models = data;\n        else if (Array.isArray(data.models)) models = data.models;\n        else if (Array.isArray(data.data)) models = data.data;\n\n        if (!models) throw new Error(\"No models found\");\n        return models.map(this.parseModel);\n    }\n\n    async verifyConnection(): Promise<boolean> { return (await this.fetchModels()).length > 0 }\n\n    getDefaultModelUsage(model: Model): ModelUsageType {\n        return {\n            input_cost_per_token: 0,\n            output_cost_per_token: 0,\n            output_cost_per_reasoning_token: 0,\n            mode: \"chat\",\n            service: this.service,\n            model: model.model,\n            max_tokens: model.max_tokens || 0,\n            max_input_tokens: model.max_input_tokens || 0,\n            max_output_tokens: model.max_output_tokens || 0,\n            supports_reasoning: model.supports_reasoning || false,\n            supports_function_calling: model.supports_function_calling || false,\n            supports_vision: model.supports_vision || false,\n            supports_web_search: model.supports_web_search || false,\n            supports_audio_input: model.supports_audio_input || false,\n            supports_audio_output: model.supports_audio_output || false,\n            supports_prompt_caching: model.supports_prompt_caching || false,\n            tags: model.tags || [],\n        }\n    }\n\n    async getModels(quality_filter: QualityFilter = {}): Promise<Model[]> {\n        const models = await this.fetchModels();\n        return models.map(model => {\n            let usage = ModelUsage.get(this.service, model.model, quality_filter) || {} as ModelUsageType;\n\n            if (Object.keys(usage).length === 0) {\n                if (this.isLocal) {\n                    if (typeof model[\"supports_reasoning\"] === \"undefined\") {\n                        if (quality_filter.allowUnknown) {\n                            usage = { input_cost_per_token: 0, output_cost_per_token: 0, output_cost_per_reasoning_token: 0 } as ModelUsageType;\n                        } else {\n                            throw new Error(`model info not found for ${model.model}`);\n                        }\n                    } else {\n                        usage = this.getDefaultModelUsage(model);\n                    }\n                } else {\n                    usage = this.getDefaultModelUsage(model);\n                    if (!quality_filter.allowUnknown) throw new Error(`model info not found for ${model.model}`);\n                }\n            }\n\n            return { ...usage, name: model.name, model: model.model, created: model.created, service: this.service, raw: model } as Model;\n        }).filter(this.filterQualityModel);\n    }\n\n    filterQualityModel(model: Model): boolean {\n        return true;\n    }\n\n    async getQualityModels(): Promise<Model[]> {\n        return this.getModels({ allowUnknown: true, allowSimilar: true, topModels: true });\n    }\n\n    async refreshModelUsage(): Promise<void> {\n        await this.modelUsage.refresh();\n    }\n\n    parseContent(data: any): string { throw new Error(\"parseContent not implemented\") }\n    parseTools(data: any): ToolCall[] { return [] }\n    parseToolsChunk(chunk: any): ToolCall[] { return this.parseTools(chunk) }\n    parseContentChunk(chunk: any): string { return this.parseContent(chunk) }\n    parseThinking(data: any): string { return \"\" }\n    parseThinkingChunk(chunk: any): string { return this.parseThinking(chunk) }\n    parseModel(model: any): Model { throw new Error(\"parseModel not implemented\") }\n    parseMessages(messages: Message[]): Message[] {\n        return messages.map(message => {\n            const copy = deepClone(message);\n            if (copy.role === \"thinking\" || copy.role === \"tool_call\") copy.role = \"assistant\";\n\n            if (message.content && message.content.attachments) {\n                copy.content = this.parseAttachmentsContent(message.content);\n            } else if (message.content && message.content.text) {\n                copy.content = message.content.text;\n            } else if (typeof copy.content !== \"string\") {\n                copy.content = JSON.stringify(copy.content);\n            }\n\n            return copy;\n        });\n    }\n\n    parseAttachmentsContent(content: MessageContent): MessageContent[] {\n        const key = (this.constructor as typeof LLM).MessageExtendedContentInputKey;\n        const parts = content.attachments.map(this.parseAttachment);\n        parts.push({ type: key, text: content.text });\n        return parts;\n    }\n\n    parseAttachment(attachment: Attachment): MessageContent {\n        return attachment.content;\n    }\n\n    parseOptions(options: Options): Options {\n        if (!options) return {};\n        return options;\n    }\n    parseTokenUsage(usage: any): InputOutputTokens | null { return usage }\n    parseUsage(tokenUsage: InputOutputTokens): Usage {\n        const modelUsage = this.modelUsage.getModel(this.model, this.qualityFilter);\n        let inputCostPerToken = modelUsage?.input_cost_per_token || 0;\n        let outputCostPerToken = modelUsage?.output_cost_per_token || 0;\n\n        if (this.isLocal) {\n            inputCostPerToken = 0;\n            outputCostPerToken = 0;\n        }\n\n        const input_cost = tokenUsage.input_tokens * inputCostPerToken;\n        const output_cost = tokenUsage.output_tokens * outputCostPerToken;\n        const total_cost = input_cost + output_cost;\n\n        return {\n            ...tokenUsage,\n            local: this.isLocal,\n            total_tokens: tokenUsage.input_tokens + tokenUsage.output_tokens,\n            input_cost,\n            output_cost,\n            total_cost,\n        }\n    }\n\n    protected resetCache() {\n        this.cache = {};\n    }\n}\n\nexport type LLMConstructor = typeof LLM;","import LLM from \"./LLM\";\nimport type { Model, ServiceName, Options, ToolCall } from \"./LLM.types\";\nimport { isBrowser, join } from \"./utils\";\n\n/**\n * @category Options\n */\nexport interface AnthropicOptions extends Options {\n    thinking: {\n        type: \"enabled\" | \"disabled\";\n        budget_tokens: number;\n    }\n}\n\n/**\n * @category LLMs\n */\nexport default class Anthropic extends LLM {\n    static readonly service: ServiceName = \"anthropic\";\n    static DEFAULT_BASE_URL: string = \"https://api.anthropic.com/v1\";\n    static DEFAULT_MODEL: string = \"claude-opus-4-20250514\";\n    static API_VERSION: string = \"2023-06-01\";\n\n    get chatUrl() { return join(this.baseUrl, \"messages\") }\n    get modelsUrl() { return join(this.baseUrl, \"models\") }\n    get llmHeaders() {\n        const headers = Object.assign({\n            \"anthropic-version\": Anthropic.API_VERSION,\n        }, super.llmHeaders);\n\n        if (isBrowser()) {\n            headers[\"anthropic-dangerous-direct-browser-access\"] = \"true\";\n        }\n\n        return headers;\n    }\n\n    parseOptions(options: AnthropicOptions): AnthropicOptions {\n        if (options.think) {\n            const budget_tokens = Math.floor((options.max_tokens || 0) / 2);\n            options.thinking = { type: \"enabled\", budget_tokens };\n        }\n\n        if (typeof options.max_thinking_tokens === \"number\") {\n            options.thinking.budget_tokens = options.max_thinking_tokens;\n            delete options.max_thinking_tokens;\n        }\n\n        delete options.think;\n        return options as AnthropicOptions;\n    }\n\n    parseThinking(data: any): string {\n        const messages = data.content ?? [];\n        for (const message of messages) {\n            if (message.type !== \"thinking\") continue;\n            if (!message.thinking) continue;\n            return message.thinking;\n        }\n        return \"\";\n    }\n\n    parseThinkingChunk(chunk: any): string {\n        if (!chunk || chunk.type !== \"content_block_delta\" || !chunk.delta) return \"\";\n        const delta = chunk.delta;\n        if (delta.type !== \"thinking_delta\" || !delta.thinking) return \"\";\n        return delta.thinking;\n    }\n\n    parseTokenUsage(data: any) {\n        if (!data) return null;\n        const input_tokens = data.message?.usage?.input_tokens || data.usage?.input_tokens;\n        const output_tokens = data.message?.usage?.output_tokens || data.usage?.output_tokens;\n        if (typeof input_tokens !== \"number\") return null;\n        if (typeof output_tokens !== \"number\") return null;\n        return { input_tokens, output_tokens };\n    }\n\n    parseContent(data: any): string {\n        const messages = data.content ?? [];\n        for (const message of messages) {\n            if (message.type !== \"text\" || !message.text) continue;\n            return message.text;\n        }\n        return \"\";\n    }\n\n    parseContentChunk(chunk: any): string {\n        if (chunk.type !== \"content_block_delta\" || !chunk.delta || chunk.delta.type !== \"text_delta\" || !chunk.delta.text) return \"\";\n        return chunk.delta.text;\n    }\n\n    parseToolsChunk(data: any): ToolCall[]  {\n        if (data.type === \"content_block_start\" && data.content_block && data.content_block.type === \"tool_use\") {\n            this.cache[\"tool_call\"] = data.content_block;\n        }\n\n        if (this.cache[\"tool_call\"] && data.type === \"content_block_delta\" && data.delta && data.delta.type === \"input_json_delta\") {\n            if (!this.cache[\"tool_call_input\"]) this.cache[\"tool_call_input\"] = \"\";\n            this.cache[\"tool_call_input\"] += data.delta.partial_json;\n        }\n\n        if (!this.cache[\"tool_call\"]) return [];\n        if (!this.cache[\"tool_call_input\"]) return [];\n\n        try {\n            const input = JSON.parse(this.cache[\"tool_call_input\"]);\n            const tool_call = { id: this.cache[\"tool_call\"].id, name: this.cache[\"tool_call\"].name, input } as ToolCall;\n\n            delete this.cache[\"tool_call\"];\n            delete this.cache[\"tool_call_input\"];\n\n            return [tool_call];\n        } catch (error) {\n            return [];\n        }\n    }\n\n    parseTools(data: any): ToolCall[] {\n        if (!data || !data.content || !Array.isArray(data.content)) return [];\n        const tools: ToolCall[] = [];\n        for (const content of data.content) {\n            if (content.type !== \"tool_use\" || !content.id || !content.name || !content.input) continue;\n            tools.push({ id: content.id, name: content.name, input: content.input });\n        }\n        return tools;\n    }\n\n    parseModel(model: any): Model {\n        return { name: model.display_name, model: model.id, created: new Date(model.created_at) } as Model;\n    }\n\n    filterQualityModel(model: Model): boolean {\n        if (model.mode !== \"chat\") return false;\n        if (model.model.startsWith(\"claude-2\")) return false;\n        return true;\n    }\n}","import LLM from \"./LLM\";\nimport type { Options, Model, ServiceName, ToolCall, Tool, WrappedToolCall, MessageContent, Message } from \"./LLM.types\";\nimport { unwrapToolCall, wrapTool, join } from \"./utils\";\nimport Attachment from \"./Attachment\";\n\n/**\n * @category Message\n */\nexport interface OllamaMessage {\n    role: string;\n    content?: string;\n    images?: string[];\n}\n\n/**\n * @category Options\n */\nexport interface OllamaOptions extends Options {\n    think?: boolean;\n    options?: {\n        num_predict?: number;\n    }\n}\n\n/**\n * @category LLMs\n */\nexport default class Ollama extends LLM {\n    static readonly service: ServiceName = \"ollama\";\n    static DEFAULT_BASE_URL: string = \"http://localhost:11434\";\n    static DEFAULT_MODEL: string = \"gemma3:4b\";\n    static isLocal: boolean = true;\n\n    get chatUrl() { return join(this.baseUrl, \"api/chat\") }\n    get modelsUrl() { return join(this.baseUrl, \"api/tags\") }\n    get modelUrl() { return join(this.baseUrl, \"api/show\") }\n\n    get llmHeaders() {\n        const headers = super.llmHeaders;\n        delete headers[\"x-api-key\"];\n        return headers;\n    }\n\n    parseOptions(options: OllamaOptions): OllamaOptions {\n        if (options.max_tokens) {\n            const max_tokens = options.max_tokens;\n            delete options.max_tokens;\n            if (!options.options) options.options = {};\n            options.options.num_predict = max_tokens;\n        }\n\n        if (options.tools) {\n            const tools = options.tools.map(tool => wrapTool(tool as Tool));\n            options.tools = tools;\n        }\n\n        delete options.apiKey;\n\n        return options;\n    }\n\n    parseThinking(data: any): string {\n        if (!data || !data.message || !data.message.thinking) return \"\";\n        return data.message.thinking;\n    }\n\n    parseTokenUsage(usage: any) {\n        if (!usage) return null;\n        if (typeof usage.prompt_eval_count !== \"number\") return null;\n        if (typeof usage.eval_count !== \"number\") return null;\n\n        return { input_tokens: usage.prompt_eval_count, output_tokens: usage.eval_count };\n    }\n\n    parseContent(data: any): string {\n        if (!data || !data.message || !data.message.content) return \"\";\n        return data.message.content;\n    }\n\n    parseContentChunk(chunk: any): string {\n        if (!chunk || !chunk.message || !chunk.message.content || chunk.message.role !== \"assistant\") return \"\";\n        return chunk.message.content;\n    }\n\n    parseTools(data: any): ToolCall[] {\n        if (!data || !data.message || !data.message.tool_calls) return [];\n        return data.message.tool_calls.map((tool_call: WrappedToolCall) => unwrapToolCall(tool_call));\n    }\n\n    parseModel(model: any): Model {\n        return { name: model.model, model: model.model, created: new Date(model.modified_at) } as Model;\n    }\n\n    async fetchModel(model: string): Promise<any> {\n        const response = await fetch(`${this.modelUrl}`, {\n            method: \"POST\",\n            body: JSON.stringify({ name: model }),\n        });\n        return await response.json();\n    }\n\n    async fetchModels(): Promise<Model[]> {\n        const models = await super.fetchModels();\n        for (const model of models) {\n            const modelData = await this.fetchModel(model.model);\n            const modelInfo = modelData.model_info;\n            const architecture = modelInfo[\"general.architecture\"];\n            const context_length = modelInfo[`${architecture}.context_length`];\n            const capabilities = modelData.capabilities ?? [];\n            model.supports_reasoning = capabilities.includes(\"thinking\");\n            model.supports_function_calling = capabilities.includes(\"tools\");\n            model.supports_vision = capabilities.includes(\"vision\");\n            model.supports_web_search = false;\n            model.supports_audio_input = false;\n            model.supports_audio_output = false;\n            model.supports_prompt_caching = false;\n            model.max_tokens = context_length;\n            model.tags = [];\n            if (model.supports_reasoning) model.tags.push(\"reasoning\");\n            if (model.supports_function_calling) model.tags.push(\"tools\");\n            if (model.supports_vision) model.tags.push(\"images\");\n        }\n\n        return models;\n    }\n\n    async verifyConnection(): Promise<boolean> {\n        const response = await fetch(`${this.baseUrl}`);\n        return await response.text() === \"Ollama is running\";\n    }\n\n    parseMessages(messages: Message[]): Message[] {\n        const msgs = [] as OllamaMessage[];\n        for (const message of messages) {\n            let added = false;\n\n            if (message.role === \"thinking\" || message.role === \"tool_call\") message.role = \"assistant\";\n\n            if (message.role && message.content.text) {\n                msgs.push({ \"role\": message.role, \"content\": message.content.text });\n                added = true;\n            }\n\n            if (message.role && message.content.attachments) {\n                msgs.push({ \"role\": message.role, \"images\": message.content.attachments.map(this.parseAttachment) });\n                added = true;\n            }\n\n            if (!added) {\n                msgs.push(message);\n            }\n        }\n\n        return msgs as Message[];\n    }\n\n    parseAttachmentsContent(content: MessageContent): MessageContent[] {\n        return [{\n            \"role\": \"user\",\n            \"content\": content.text,\n            \"images\": content.attachments.map(this.parseAttachment)\n        }]\n    }\n\n    parseAttachment(attachment: Attachment): MessageContent {\n        if (attachment.isImage && !attachment.isURL) {\n            return attachment.data;\n        }\n\n        throw new Error(\"Unsupported attachment type\");\n    }\n}\n","import LLM from \"./LLM\";\nimport type { Message, Model, Options, ServiceName, ToolCall, Tool, MessageContent } from \"./LLM.types\";\nimport Attachment from \"./Attachment\";\nimport { keywordFilter, join } from \"./utils\";\n\n/**\n * @category Options\n */\nexport interface OpenAIOptions extends Options {\n    input?: string | Message[];\n    max_output_tokens?: number;\n    reasoning?: { effort: \"low\" | \"medium\" | \"high\", summary: \"auto\" | \"concise\" | \"detailed\" };\n}\n\n/**\n * @category Tools\n */\nexport interface OpenAITool {\n    name: string;\n    parameters: any;\n    strict: boolean;\n    type: \"function\";\n    description: string;\n}\n\n/**\n * @category LLMs\n */\nexport default class OpenAI extends LLM {\n    static readonly service: ServiceName = \"openai\";\n    static DEFAULT_BASE_URL: string = \"https://api.openai.com/v1\";\n    static DEFAULT_MODEL: string = \"gpt-4o-mini\";\n    static isBearerAuth: boolean = true;\n    static MessageExtendedContentInputKey: string = \"input_text\";\n\n    get chatUrl() { return join(this.baseUrl, \"responses\") }\n    get modelsUrl() { return join(this.baseUrl, \"models\") }\n\n    parseOptions(options: OpenAIOptions): OpenAIOptions {\n        options.input = options.messages;\n        delete options.messages;\n\n        if (options.max_tokens) {\n            const max_tokens = options.max_tokens;\n            delete options.max_tokens;\n            options.max_output_tokens = max_tokens;\n        }\n\n        if (options.tools) {\n            const tools = options.tools.map(tool => wrapTool(tool as Tool));\n            options.tools = tools;\n        }\n\n        if (options.think && !options.reasoning) {\n            options.reasoning = { effort: \"medium\", summary: \"detailed\" };\n        }\n        delete options.think;\n\n        return options;\n    }\n\n    parseContent(data: any): string {\n        if (!data || !data.output || !Array.isArray(data.output)) return \"\";\n        if (data.object !== \"response\" || data.status !== \"completed\") return \"\";\n        for (const output of data.output) {\n            if (output.type !== \"message\" || output.role !== \"assistant\" || output.status !== \"completed\" || !output.content || !Array.isArray(output.content)) continue;\n            for (const content of output.content) { \n                if (content.type !== \"output_text\" || !content.text) continue;\n                return content.text;\n            }\n        }\n\n        return \"\";\n    }\n\n    parseTokenUsage(data: any) {\n        if (data.response && data.type === \"response.completed\") data = data.response;\n\n        if (!data || !data.usage || !data.usage.input_tokens || !data.usage.output_tokens) return null;\n\n        return {\n            input_tokens: data.usage.input_tokens,\n            output_tokens: data.usage.output_tokens,\n        };\n    }\n\n    parseTools(data: any): ToolCall[] {\n        if (!data || !data.output || !Array.isArray(data.output)) return [];\n        if (data.object !== \"response\" || data.status !== \"completed\") return [];\n\n        const tool_calls: ToolCall[] = [];\n        for (const output of data.output) {\n            if (output.type !== \"function_call\" || output.status !== \"completed\" || !output.call_id || !output.name || !output.arguments) continue;\n            tool_calls.push({\n                id: output.call_id,\n                name: output.name,\n                input: JSON.parse(output.arguments),\n            });\n        }\n\n        return tool_calls;\n    }\n\n    parseToolsChunk(data: any): ToolCall[]  {\n        if (data.type === \"response.output_item.added\" && data.item && data.item.type === \"function_call\") {\n            this.cache[\"tool_call\"] = data.item;\n        }\n\n        if (this.cache[\"tool_call\"] && data.type === \"response.function_call_arguments.done\") {\n            this.cache[\"tool_call_input\"] = data.arguments;\n        }\n\n        if (!this.cache[\"tool_call\"]) return [];\n        if (!this.cache[\"tool_call_input\"]) return [];\n\n        try {\n            const input = JSON.parse(this.cache[\"tool_call_input\"]);\n            const tool_call = { id: this.cache[\"tool_call\"].id, name: this.cache[\"tool_call\"].name, input } as ToolCall;\n\n            delete this.cache[\"tool_call\"];\n            delete this.cache[\"tool_call_input\"];\n\n            return [tool_call];\n        } catch (error) {\n            return [];\n        }\n    }\n\n    parseThinking(data: any): string {\n        if (!data || !data.output || !Array.isArray(data.output)) return \"\";\n        if (data.object !== \"response\" || data.status !== \"completed\") return \"\";\n        for (const output of data.output) {\n            if (output.type !== \"reasoning\" || !output.summary || !Array.isArray(output.summary)) continue;\n            for (const part of output.summary) {\n                if (part.type !== \"summary_text\" || !part.text) continue;\n                return part.text;\n            }\n        }\n        return \"\";\n    }\n\n    parseThinkingChunk(chunk: any): string {\n        if (!chunk || chunk.type !== \"response.reasoning_summary_text.delta\" || !chunk.delta) return \"\";\n        return chunk.delta;\n    }\n\n    parseContentChunk(chunk: any): string {\n        if (!chunk || !chunk.delta || chunk.type !== \"response.output_text.delta\") return \"\";\n        return chunk.delta;\n    }\n\n    parseModel(model: any): Model {\n        return {\n            name: model.model,\n            model: model.id,\n            created: new Date(model.created * 1000),\n        } as Model;\n    }\n\n    parseAttachment(attachment: Attachment): MessageContent {\n        const data = (attachment.isURL) ? attachment.data : `data:${attachment.contentType};base64,${attachment.data}`;\n\n        if (attachment.isImage) {\n            return { type: \"input_image\", image_url: data }\n        } else if (attachment.isDocument) {\n            return { type: \"input_file\", filename: crypto.randomUUID(), file_data: data }\n        }\n\n        throw new Error(\"Unsupported attachment type\");\n    }\n\n    filterQualityModel(model: Model): boolean {\n        const keywords = [\"audio\", \"image\", \"davinci\", \"babbage\", \"dall-e\", \"tts\", \"whisper\", \"embedding\", \"vision\", \"moderation\", \"realtime\",\n                          \"computer-use\", \"transcribe\", \"instruct\", \"codex\"];\n        return keywordFilter(model.model, keywords);\n    }\n\n}\n\nfunction wrapTool(tool: Tool): OpenAITool {\n    return {\n        name: tool.name,\n        parameters: Object.assign({}, tool.input_schema, { additionalProperties: false }),\n        strict: true,\n        type: \"function\",\n        description: tool.description,\n    } as OpenAITool;\n}\n","import LLM from \"./LLM\";\nimport Attachment from \"./Attachment\";\nimport type { ServiceName, Options, Model, ToolCall, Tool, MessageContent, Message, MessageRole } from \"./LLM.types\";\nimport { filterMessageRole, filterNotMessageRole, keywordFilter, uuid, join, deepClone } from \"./utils\";\n\n/**\n * @category Message\n */\nexport interface GoogleMessage {\n    role: \"user\" | \"model\";\n    parts: Array<{ text?: string } | { inline_data?: { mime_type: string; data: string } }>;\n}\n\n/**\n * @category Tools\n */\nexport interface GoogleTool {\n    name: string;\n    description: string;\n    parameters: Record<string, any>;\n}\n\n/**\n * @category Options\n */\nexport interface GoogleOptions extends Options {\n    system_instruction?: {\n        parts: { text: string }[];\n    }\n    contents?: GoogleMessage[];\n    generationConfig?: {\n        temperature?: number;\n        maxOutputTokens?: number;\n        thinkingConfig?: {\n            includeThoughts: boolean;\n        }\n    }\n}\n\n/**\n * @category LLMs\n */\nexport default class Google extends LLM {\n    static readonly service: ServiceName = \"google\";\n    static DEFAULT_BASE_URL: string = \"https://generativelanguage.googleapis.com/v1beta/\";\n    static DEFAULT_MODEL: string = \"gemini-2.5-flash-preview-05-20\";\n\n    get chatUrl() { return join(this.baseUrl, \"chat/completions\") }\n    get modelsUrl() { return join(this.baseUrl, \"models\") }\n\n    getChatUrl(opts: Options) {\n        return join(this.baseUrl, \"models\", `${opts.model}:generateContent?key=${this.apiKey}`);\n    }\n\n    getModelsUrl() { return `${this.modelsUrl}?key=${this.apiKey}` }\n\n    parseOptions(options: GoogleOptions): GoogleOptions {\n        const opts = deepClone(options);\n\n        const messages = opts.messages || [];\n\n\n        const system = filterMessageRole(messages, \"system\");\n        const nonSystem = filterNotMessageRole(messages, \"system\");\n        delete opts.messages;\n\n        if (system.length > 0) { opts.system_instruction = { parts: system.map(message => ({ text: message.content })) } }\n        if (nonSystem.length > 0) { opts.contents = nonSystem.map(Google.toGoogleMessage) }\n\n        if (!opts.generationConfig) opts.generationConfig = {};\n        if (typeof opts.temperature === \"number\") opts.generationConfig.temperature = opts.temperature;\n        if (typeof opts.max_tokens === \"number\") opts.generationConfig.maxOutputTokens = opts.max_tokens;\n        if (!opts.generationConfig.maxOutputTokens) opts.generationConfig.maxOutputTokens = this.max_tokens;\n\n        if (opts.tools) {\n            opts.tools = [ { functionDeclarations: opts.tools.map(tool => ({\n                name: (tool as Tool).name,\n                description: (tool as Tool).description,\n                parameters: (tool as Tool).input_schema,\n            })) } ] as any;\n        }\n\n        if (opts.think) {\n            if (!opts.generationConfig) opts.generationConfig = {};\n            opts.generationConfig.thinkingConfig = { includeThoughts: true };\n            delete opts.think;\n        }\n\n        delete opts.think;\n        delete opts.max_tokens;\n        delete opts.temperature;\n        delete opts.stream;\n\n        return opts;\n    }\n\n    parseMessages(messages: Message[]): Message[] {\n        return messages.map(message => {\n            const copy = deepClone(message);\n            if (copy.role === \"thinking\" || copy.role === \"tool_call\") copy.role = \"assistant\";\n\n            // Don't transform attachments here - toGoogleMessage handles them properly\n            if (typeof copy.content !== \"string\" && !(copy.content && copy.content.attachments)) {\n                copy.content = JSON.stringify(copy.content);\n            }\n\n            return copy;\n        });\n    }\n\n    get llmHeaders() {\n        // Google needs endpoint to not send preflight...so we remove \"x-\" header and we're passing through query params\n        const headers = super.llmHeaders;\n        delete headers[\"x-api-key\"];\n        return headers;\n    }\n     \n    parseContent(data: any): string {\n        if (!data?.candidates?.[0]?.content?.parts) return \"\";\n        const parts = data.candidates[0].content.parts as any[];\n        for (const part of parts) {\n            if (part.thought) continue;\n            return part.text;\n        }\n        return \"\";\n    }\n\n    parseTokenUsage(data: any) {\n        if (!data?.usageMetadata?.promptTokenCount || !data?.usageMetadata?.candidatesTokenCount) return null;\n        const usage = data.usageMetadata;\n        return { input_tokens: usage.promptTokenCount, output_tokens: usage.candidatesTokenCount };\n    }\n\n    parseModel(model: any): Model {\n        return {\n            name: model.displayName,\n            model: model.name.replace(/^models\\//, \"\"),\n            created: new Date(), // :(\n            max_input_tokens: model.inputTokenLimit,\n            max_output_tokens: model.outputTokenLimit,\n        } as Model;\n    }\n\n    parseTools(data: any): ToolCall[] {\n        if (!data?.candidates?.[0]?.content?.parts?.[0]?.functionCall) return [];\n        const functionCall = data.candidates[0].content.parts[0].functionCall;\n        return [ { id: uuid(), name: functionCall.name, input: functionCall.args, } as ToolCall ];\n    }\n\n    parseThinking(data: any): string {\n        if (!data?.candidates?.[0]?.content?.parts) return \"\";\n        const parts = data.candidates[0].content.parts as any[];\n        for (const part of parts) {\n            if (part.thought !== true) continue;\n            return part.text;\n        }\n        return \"\";\n    }\n\n    parseAttachment(attachment: Attachment): MessageContent {\n        if (attachment.isImage) {\n            if (!attachment.isURL) {\n                return { \"inline_data\": { \"mime_type\": attachment.contentType, \"data\": attachment.data } };\n            }\n        }\n\n        throw new Error(\"Unsupported attachment type\");\n    }\n\n    parseAttachmentsContent(content: MessageContent): any[] {\n        const parts = content.attachments?.map(this.parseAttachment.bind(this)) || [];\n        if (content.text) {\n            parts.push({ text: content.text });\n        }\n        return parts;\n    }\n\n    filterQualityModel(model: Model): boolean {\n        const keywords = [\"embedding\", \"vision\", \"learnlm\", \"image-generation\", \"gemma-3\", \"gemma-3n\", \"gemini-1.5\", \"embedding\"];\n        return keywordFilter(model.model, keywords);\n    }\n\n    static toGoogleMessage(message: Message): GoogleMessage {\n        if (message.content && typeof message.content === 'object' && message.content.attachments) {\n            // Handle messages with attachments\n            const parts: any[] = [];\n            \n            // Add attachments first\n            for (const attachment of message.content.attachments) {\n                if (attachment.contentType !== \"url\") {\n                    parts.push({\n                        inline_data: {\n                            mime_type: attachment.contentType,\n                            data: attachment.data\n                        }\n                    });\n                } else {\n                    throw new Error(\"URL attachments are not supported with Google\");\n                }\n            }\n            \n            // Add text if present\n            if (message.content.text) {\n                parts.push({ text: message.content.text });\n            }\n            \n            return {\n                role: message.role === \"assistant\" ? \"model\" : message.role as \"user\" | \"model\",\n                parts\n            };\n        } else {\n            // Handle text-only messages\n            const content = typeof message.content === 'string' ? message.content : JSON.stringify(message.content);\n            return {\n                role: message.role === \"assistant\" ? \"model\" : message.role as \"user\" | \"model\",\n                parts: [{ text: content }]\n            };\n        }\n    }\n\n    static fromGoogleMessage(googleMessage: GoogleMessage): Message {\n        const parts = googleMessage.parts;\n        if (parts.length === 1 && \"text\" in parts[0] && parts[0].text) {\n            return { role: googleMessage.role, content: parts[0].text } as Message;\n        }\n        if (parts.length === 2 && \"inline_data\" in parts[0] && \"text\" in parts[1] && parts[0].inline_data && parts[1].text) {\n            return { \n                role: googleMessage.role, \n                content: { \n                    text: parts[1].text, \n                    attachments: [{ \n                        type: \"image\", \n                        contentType: parts[0].inline_data.mime_type, \n                        data: parts[0].inline_data.data \n                    }] \n                } \n            } as Message;\n        }\n        throw new Error(\"Unsupported message type\");\n    }\n}\n","import LLM from \"./LLM\";\nimport type { ServiceName, Options, Model, ToolCall, WrappedToolCall, Tool } from \"./LLM.types\";\nimport { unwrapToolCall, wrapTool, join } from \"./utils\";\nimport { keywordFilter } from \"./utils\";\nimport Attachment from \"./Attachment\";\n\n/**\n * @category Options\n */\nexport type APIv1Options = Options & {\n    stream_options?: {\n        include_usage?: boolean;\n    },\n    reasoning_effort?: \"low\" | \"medium\" | \"high\"\n}\n\n/**\n * OpenAI API v1 Compatible Base Class\n * \n * @category LLMs\n */\nexport default class APIv1 extends LLM {\n    static readonly service: ServiceName = \"openai\";\n    static DEFAULT_BASE_URL: string = \"\";\n    static DEFAULT_MODEL: string = \"\";\n    static isBearerAuth: boolean = true;\n    static KEY_REASONING_CONTENT: string = \"reasoning_content\";\n\n    get chatUrl() { return join(this.baseUrl, \"chat/completions\") }\n    get modelsUrl() { return join(this.baseUrl, \"models\") }\n\n    parseOptions(options: APIv1Options): APIv1Options {\n        if (options.think && !options.reasoning_effort) {\n            options.reasoning_effort = \"high\";\n        }\n        delete options.think;\n\n        if (options.tools) {\n            const tools = options.tools.map(tool => wrapTool(tool as Tool));\n            options.tools = tools;\n        }\n\n        if (options.stream) {\n            options.stream_options = { include_usage: true };\n        }\n        return options;\n    }\n\n    parseContent(data: any): string {\n        if (!data) return \"\";\n        if (!data.choices) return \"\";\n        if (!data.choices[0]) return \"\";\n        if (!data.choices[0].message) return \"\";\n        return data.choices[0].message.content;\n    }\n\n    parseContentChunk(data: any): string {\n        if (!data) return \"\";\n        if (!data.choices) return \"\";\n        if (!data.choices[0]) return \"\";\n        if (!data.choices[0].delta) return \"\";\n        if (!data.choices[0].delta.content) return \"\";\n        return data.choices[0].delta.content;\n    }\n\n    parseThinking(data: any): string {\n        const key = (this.constructor as typeof APIv1).KEY_REASONING_CONTENT;\n        if (!data || !data.choices || !data.choices[0] || !data.choices[0].message || !data.choices[0].message[key]) return \"\";\n        return data.choices[0].message[key];\n    }\n\n    parseThinkingChunk(data: any): string {\n        const key = (this.constructor as typeof APIv1).KEY_REASONING_CONTENT;\n        if (!data || !data.choices || !data.choices[0] || !data.choices[0].delta || !data.choices[0].delta[key]) return \"\";\n        return data.choices[0].delta[key];\n    }\n\n    parseTokenUsage(data: any) {\n        if (!data) return null;\n        if (!data.usage) return null;\n        if (!data.usage.prompt_tokens) return null;\n        if (!data.usage.completion_tokens) return null;\n\n        return {\n            input_tokens: data.usage.prompt_tokens,\n            output_tokens: data.usage.completion_tokens,\n        };\n    }\n\n    parseModel(model: any): Model {\n        let created = (model.created ? new Date(model.created * 1000) : new Date());\n        return { name: model.model, model: model.id, created } as Model;\n    }\n\n    parseTools(data: any): ToolCall[] {\n        if (!data || !data.choices || !data.choices[0] || !data.choices[0].message || !data.choices[0].message.tool_calls) return [];\n        return data.choices[0].message.tool_calls.map((tool_call: WrappedToolCall) => unwrapToolCall(tool_call));\n    }\n\n    parseToolsChunk(data: any): ToolCall[] {\n        if (!data || !data.choices || !data.choices[0] || !data.choices[0].delta || !data.choices[0].delta.tool_calls) return [];\n        return data.choices[0].delta.tool_calls.map((tool_call: WrappedToolCall) => unwrapToolCall(tool_call));\n    }\n\n    filterQualityModel(model: Model): boolean {\n        const keywords = [\"audio\", \"vision\", \"image\"];\n        return keywordFilter(model.model, keywords);\n    }\n\n    parseAttachment(attachment: Attachment) {\n        if (attachment.isImage) {\n            if (attachment.isURL) {\n                return { type: \"image_url\", image_url: { url: attachment.data, detail: \"high\" } }\n            } else {\n                return { type: \"image_url\", image_url: { url: `data:${attachment.contentType};base64,${attachment.data}`, detail: \"high\" } }\n            }\n        }\n\n        throw new Error(\"Unsupported attachment type\");\n    }\n}","import type { ServiceName } from \"./LLM.types\";\nimport APIv1 from \"./APIv1\";\n\n/**\n * @category LLMs\n */\nexport default class xAI extends APIv1 {\n    static readonly service: ServiceName = \"xai\";\n    static DEFAULT_BASE_URL: string = \"https://api.x.ai/v1/\";\n    static DEFAULT_MODEL: string = \"grok-3\";\n}\n","import type { ServiceName, Model } from \"./LLM.types\";\nimport APIv1, { APIv1Options } from \"./APIv1\";\nimport { keywordFilter } from \"./utils\";\n\n/**\n * @category Options\n */\nexport type GroqOptions = APIv1Options & {\n    reasoning_effort?: \"none\" | \"default\";\n    reasoning_format?: \"parsed\" | \"raw\" | \"hidden\";\n}\n\n/**\n * @category LLMs\n */\nexport default class Groq extends APIv1 {\n    static readonly service: ServiceName = \"groq\";\n    static DEFAULT_BASE_URL: string = \"https://api.groq.com/openai/v1/\";\n    static DEFAULT_MODEL: string = \"deepseek-r1-distill-llama-70b\";\n    static KEY_REASONING_CONTENT: string = \"reasoning\";\n\n    parseOptions(options: GroqOptions): GroqOptions {\n        options = super.parseOptions(options) as GroqOptions;\n        // groq reasoning support is strange...implied by model usually\n        if (options.reasoning_effort === \"high\") {\n            delete options.reasoning_effort;\n            if (!options.reasoning_format) options.reasoning_format = \"parsed\";\n        }\n        return options;\n    }\n\n    // groq wraps usage in x_groq for streaming\n    parseTokenUsage(data: any): { input_tokens: any; output_tokens: any; } | null {\n        if (!data) return null;\n        if (!data.usage && data.x_groq && data.x_groq.usage) data = data.x_groq;\n\n        if (!data || !data.usage) return null;\n        if (!data.usage.prompt_tokens) return null;\n        if (!data.usage.completion_tokens) return null;\n\n        return {\n            input_tokens: data.usage.prompt_tokens,\n            output_tokens: data.usage.completion_tokens,\n        };\n    }\n\n    filterQualityModel(model: Model): boolean {\n        return keywordFilter(model.model, [\"whisper\", \"tts\"]);\n    }\n}\n","import type { ServiceName } from \"./LLM.types\";\nimport APIv1 from \"./APIv1\";\n\n/**\n * @category LLMs\n */\nexport default class DeepSeek extends APIv1 {\n    static readonly service: ServiceName = \"deepseek\";\n    static DEFAULT_BASE_URL: string = \"https://api.deepseek.com/v1/\";\n    static DEFAULT_MODEL: string = \"deepseek-chat\";\n}\n","export type AttachmentType = \"image\" | \"document\";\n\nexport default class Attachment {\n    public data: string;\n    public type: AttachmentType;\n    public contentType: string;\n\n    constructor(data: string, type: AttachmentType, contentType: string) {\n        this.data = data;\n        this.type = type;\n        this.contentType = contentType;\n    }\n\n    get isImage() {\n        return this.type === \"image\";\n    }\n\n    get isDocument() {\n        return this.type === \"document\";\n    }\n\n    get isURL() {\n        return this.contentType === \"url\";\n    }\n\n    get content() {\n        return { type: this.type, source: this.source }\n    }\n\n    get source() {\n        if (this.contentType === \"url\") {\n            return { type: \"url\", url: this.data }\n        } else {\n            return { type: \"base64\", media_type: this.contentType, data: this.data }\n        }\n    }\n\n    static fromBase64(data: string, type: AttachmentType, contentType: string) {\n        return new Attachment(data, type, contentType);\n    }\n\n    static fromJPEG(data: string) {\n        return new Attachment(data, \"image\", \"image/jpeg\");\n    }\n\n    static fromPNG(data: string) {\n        return new Attachment(data, \"image\", \"image/png\");\n    }\n\n    static fromGIF(data: string) {\n        return new Attachment(data, \"image\", \"image/gif\");\n    }\n\n    static fromWEBP(data: string) {\n        return new Attachment(data, \"image\", \"image/webp\");\n    }\n\n    static fromSVG(data: string) {\n        return new Attachment(data, \"image\", \"image/svg+xml\");\n    }\n\n    static fromTIFF(data: string) {\n        return new Attachment(data, \"image\", \"image/tiff\");\n    }\n\n    static fromPDF(data: string) {\n        return new Attachment(data, \"document\", \"application/pdf\");\n    }\n\n    static fromImageURL(url: string) {\n        return new Attachment(url, \"image\", \"url\");\n    }\n\n    static fromDocumentURL(url: string) {\n        return new Attachment(url, \"document\", \"url\");\n    }\n}\n","import type { Options, Input, Message, ServiceName, Response, PartialStreamResponse } from \"./LLM.types\";\n\nimport Anthropic from \"./anthropic\";\nimport Ollama from \"./ollama\";\nimport OpenAI from \"./openai\";\nimport Google from \"./google\";\nimport xAI from \"./xai\";\nimport Groq from \"./groq\";\nimport DeepSeek from \"./deepseek\";\nimport LLM from \"./LLM\";\nimport APIv1 from \"./APIv1\";\n\nimport Attachment from \"./Attachment\";\n\n\nimport ModelUsage from \"./ModelUsage\";\n\nimport * as parsers from \"./parsers\";\nimport config from \"./config\";\n\nexport type * from \"./LLM.types\"\n\n/**\n * @category Usage\n */\nexport type { ModelUsageType, ModelTag } from \"./ModelUsage\";\n\n/**\n * @category LLMs\n */\nexport type LLMServices = Anthropic | Ollama | OpenAI | Google | xAI | Groq | DeepSeek | APIv1;\n\n/**\n * @category LLMs\n */\nexport type { LLM, Anthropic, Ollama, OpenAI, Google, xAI, Groq, DeepSeek, APIv1 };\n\n/**\n * @category Parsers\n */\nexport type { parsers };\n\n/**\n * @category Usage\n */\nexport type { ModelUsage };\n\nexport type { Input, Message, Attachment };\nexport type { AnthropicOptions } from \"./anthropic\";\nexport type { OllamaOptions } from \"./ollama\";\nexport type { OpenAIOptions, OpenAITool } from \"./openai\";\nexport type { GoogleOptions, GoogleTool, GoogleMessage } from \"./google\";\nexport type { GroqOptions } from \"./groq\";\nexport type { APIv1Options } from \"./APIv1\";\nexport type { AttachmentType } from \"./Attachment\";\n\nlet SERVICES = [Anthropic, Ollama, OpenAI, Google, xAI, Groq, DeepSeek];\n\n/**\n * @category LLMs\n */\nexport interface LLMInterface {\n    (input: Input, options?: Options): Promise<string>;\n    (options: Options): Promise<string>;\n    \n    new (input: Input, options?: Options): LLMServices;\n    new (options: Options): LLMServices;\n    new (): LLMServices;\n\n    parsers: typeof parsers;\n    services: any[];\n\n    ModelUsage: typeof ModelUsage;\n\n    LLM: typeof LLM;\n    Anthropic: typeof Anthropic;\n    Ollama: typeof Ollama;\n    OpenAI: typeof OpenAI;\n    Google: typeof Google;\n    xAI: typeof xAI;\n    Groq: typeof Groq;\n    DeepSeek: typeof DeepSeek;\n    APIv1: typeof APIv1;\n\n    Attachment: typeof Attachment;\n\n    register(LLMClass: typeof LLM): void;\n    unregister(LLMClass: typeof LLM): void;\n}\n\nfunction LLMShortHandImpl(\n    initOrOpts?: Input | Options,\n    opts?: Options\n): Promise<string | Response | PartialStreamResponse> | LLMServices {\n\n    let input: Input | undefined;\n    let options : Options;\n\n    if (typeof initOrOpts === \"string\" || Array.isArray(initOrOpts)) {\n        input = initOrOpts as Input;\n        options = opts || {};\n    } else if (typeof initOrOpts === \"object\" && initOrOpts !== null) {\n        input = undefined;\n        options = initOrOpts as Options;\n    } else {\n        input = undefined;\n        options = {};\n    }\n\n    let llm;\n\n    const service = options?.service ?? config.service as ServiceName;\n    let LLMClass = SERVICES.find(Service => Service.service === service);\n    if (!LLMClass) LLMClass = APIv1;\n    llm = new LLMClass(input, options);\n\n    if (new.target) return llm;\n\n    const response = llm.send() as Promise<string | Response | PartialStreamResponse>;\n    return response;\n};\n\nconst LLMWrapper = LLMShortHandImpl as LLMInterface;\n\nLLMWrapper.parsers = parsers;\nLLMWrapper.services = SERVICES;\nLLMWrapper.ModelUsage = ModelUsage;\n\nLLMWrapper.Anthropic = Anthropic;\nLLMWrapper.Ollama = Ollama;\nLLMWrapper.OpenAI = OpenAI;\nLLMWrapper.Google = Google;\nLLMWrapper.xAI = xAI;\nLLMWrapper.Groq = Groq;\nLLMWrapper.DeepSeek = DeepSeek;\nLLMWrapper.APIv1 = APIv1;\nLLMWrapper.LLM = LLM;\n\nLLMWrapper.Attachment = Attachment;\n\nLLMWrapper.register = (LLMClass: typeof LLM) => {\n    SERVICES.push(LLMClass as any);\n};\n\nLLMWrapper.unregister = (LLMClass: typeof LLM) => {\n    SERVICES = SERVICES.filter(Service => Service !== LLMClass);\n};\n\nexport default LLMWrapper;"],"names":["LoggerManager","debugEnv","p","namespace","config","pattern","excludePattern","regexPattern","hash","i","char","level","message","args","now","prefix","timeDiff","levelPrefix","hexColor","formattedMessage","output","arg","styles","logger","manager","createLogger","customModels","_ModelUsage","service","model","quality_filter","info","data","m","custom","key","max_input_tokens","max_output_tokens","max_tokens","input_cost_per_token","output_cost_per_token","output_cost_per_reasoning_token","supported_modalities","supports_reasoning","supports_function_calling","_a","supports_vision","_b","supports_web_search","_c","supports_audio_input","_d","supports_audio_output","_e","supports_prompt_caching","_f","tags","ModelUsage","log","codeBlock","blockType","content","markdown","json","parser","e","xml","tag","inner","handleErrorResponse","response","error","err","parseStream","stream","reader","decoder","buffer","done","value","jsonchunk","jsonlines","unparsedLines","jsonline","lines","line","done2","filterMessageRole","messages","role","filterNotMessageRole","uuid","wrapTool","tool","unwrapToolCall","tool_call","keywordFilter","str","keywords","keyword","isBrowser","isNode","deepClone","obj","item","cloned","join","pathSegments","firstSegment","protocol","urlParts","remainingSegments","joinedPath","parts","l","newParts","part","_LLM","input","options","LLM","parsers.json","headers","opts","attachments","vanillaOptions","body","tokenUsage","thinking","restream","chunk","parsers","buffers","name","callback","usage","tool_calls","complete","models","copy","attachment","modelUsage","inputCostPerToken","outputCostPerToken","input_cost","output_cost","total_cost","_Anthropic","budget_tokens","delta","input_tokens","output_tokens","tools","Anthropic","_Ollama","modelData","modelInfo","architecture","context_length","capabilities","msgs","added","Ollama","_OpenAI","OpenAI","_Google","system","nonSystem","functionCall","googleMessage","Google","_APIv1","created","APIv1","_xAI","xAI","_Groq","Groq","_DeepSeek","DeepSeek","Attachment","type","contentType","url","SERVICES","LLMShortHandImpl","initOrOpts","llm","LLMClass","Service","LLMWrapper"],"mappings":"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"}