{"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/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 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    supported_modalities: string[];\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) || 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            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\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: m.supports_reasoning || false,\n                supported_modalities,\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\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 type { ModelUsageType } from \"./ModelUsage\";\nimport config from \"./config\";\nimport * as parsers from \"./parsers\";\nimport { parseStream, handleErrorResponse, isBrowser, isNode, join } 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\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);\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) { this.addMessage(\"user\", content) }\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        this.user(input);\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        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    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);\n            if (!usage) {\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            }\n\n            if (this.isLocal) {\n                usage.input_cost_per_token = 0;\n                usage.output_cost_per_token = 0;\n                usage.output_cost_per_reasoning_token = 0;\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            if (message.role === \"thinking\" || message.role === \"tool_call\") message.role = \"assistant\";\n            return message;\n        });\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 } from \"./LLM.types\";\nimport { unwrapToolCall, wrapTool, join } from \"./utils\";\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\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 verifyConnection(): Promise<boolean> {\n        const response = await fetch(`${this.baseUrl}`);\n        return await response.text() === \"Ollama is running\";\n    }\n}\n","import LLM from \"./LLM\";\nimport type { Message, Model, Options, ServiceName, ToolCall, Tool } from \"./LLM.types\";\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\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    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 type { ServiceName, Options, Model, ToolCall, Tool } from \"./LLM.types\";\nimport { filterMessageRole, filterNotMessageRole, keywordFilter, uuid, join } from \"./utils\";\n\n/**\n * @category Message\n */\nexport interface GoogleMessage {\n    role: \"user\" | \"model\" | \"assistant\";\n    content: 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?: {\n        parts: { text: string }[];\n    }[];\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 messages = JSON.parse(JSON.stringify(options.messages || [])).map((m: GoogleMessage) => {\n            if (m.role === \"assistant\") m.role = \"model\";\n            return m;\n        });\n\n        const system = filterMessageRole(messages, \"system\");\n        const nonSystem = filterNotMessageRole(messages, \"system\");\n        delete options.messages;\n\n        if (system.length > 0) { options.system_instruction = { parts: system.map(message => ({ text: message.content })) } }\n        if (nonSystem.length > 0) { options.contents = nonSystem.map(message => ({ role: message.role, parts: [{ text: message.content }] })) }\n\n        if (!options.generationConfig) options.generationConfig = {};\n        if (typeof options.temperature === \"number\") options.generationConfig.temperature = options.temperature;\n        if (typeof options.max_tokens === \"number\") options.generationConfig.maxOutputTokens = options.max_tokens;\n        if (!options.generationConfig.maxOutputTokens) options.generationConfig.maxOutputTokens = this.max_tokens;\n\n        if (options.tools) {\n            options.tools = [ { functionDeclarations: options.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 (options.think) {\n            if (!options.generationConfig) options.generationConfig = {};\n            options.generationConfig.thinkingConfig = { includeThoughts: true };\n            delete options.think;\n        }\n\n        delete options.think;\n        delete options.max_tokens;\n        delete options.temperature;\n        delete options.stream;\n\n        return options;\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        } 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    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","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\";\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}","import type { ServiceName, Options } 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","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 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 } 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 };\nexport type { AnthropicOptions } from \"./anthropic\";\nexport type { OllamaOptions } from \"./ollama\";\nexport type { OpenAIOptions, OpenAITool } from \"./openai\";\nexport type { GoogleOptions, GoogleTool } from \"./google\";\nexport type { GroqOptions } from \"./groq\";\nexport type { APIv1Options } from \"./APIv1\";\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    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.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","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","join","pathSegments","firstSegment","protocol","urlParts","remainingSegments","joinedPath","parts","l","newParts","part","_LLM","input","options","LLM","parsers.json","_a","headers","opts","vanillaOptions","body","tokenUsage","thinking","restream","chunk","parsers","buffers","name","callback","usage","tool_calls","complete","models","modelUsage","inputCostPerToken","outputCostPerToken","input_cost","output_cost","total_cost","_Anthropic","budget_tokens","delta","input_tokens","_b","_c","output_tokens","_e","_d","_f","tools","Anthropic","_Ollama","Ollama","_OpenAI","OpenAI","_Google","system","nonSystem","functionCall","Google","_APIv1","created","APIv1","_xAI","xAI","_Groq","Groq","_DeepSeek","DeepSeek","SERVICES","LLMShortHandImpl","initOrOpts","llm","LLMClass","Service","LLMWrapper"],"mappings":"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"}