{"version":3,"sources":["../src/models/attachment.ts","../src/models/message.ts","../src/plugin.ts","../src/tools.ts","../src/usage.ts","../src/defaults.ts","../src/logger.ts","../src/engine.ts","../src/model.ts","../src/providers/azure.ts","../src/providers/openai.ts","../src/providers/anthropic.ts","../src/providers/cerebras.ts","../src/providers/deepseek.ts","../src/providers/google.ts","../src/providers/groq.ts","../src/providers/lmstudio.ts","../src/providers/meta.ts","../src/providers/mistralai.ts","../src/providers/ollama.ts","../src/providers/openrouter.ts","../src/providers/xai.ts","../src/llm.ts","../src/index.ts"],"sourcesContent":["\nconst docxMimeType = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'\nconst pptxMimeType = 'application/vnd.openxmlformats-officedocument.presentationml.presentation'\nconst xlsxMimeType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'\n\nexport const codeFormats = [\n  'html', 'htm', 'css', 'scss', 'sass', 'less',\n  'js', 'jsx', 'ts', 'tsx', 'mjs', 'cjs', 'vue', 'svelte',\n  'py', 'pyw', 'pyx', 'pyi',\n  'java', 'kt', 'kts', 'groovy', 'scala',\n  'c', 'h', 'cpp', 'cc', 'cxx', 'hpp', 'hh', 'hxx', 'cs',\n  'swift', 'm', 'mm',\n  'rs', 'go', 'zig',\n  'rb', 'php', 'pl', 'lua', 'r',\n  'sh', 'bash', 'zsh', 'fish', 'ps1', 'bat', 'cmd',\n  'sql', 'psql', 'mysql',\n  'gradle', 'maven', 'cmake', 'make', 'dockerfile',\n]\n\nexport const configFormats = [\n  'json', 'xml', 'yaml', 'yml', 'toml', 'ini', 'env',\n  'properties', 'conf', 'config', 'cfg',\n  'gitignore', 'gitattributes', 'editorconfig', 'npmrc', 'nvmrc',\n]\n\nexport const textFormats = [\n  'txt', 'csv', 'md',\n  'log', 'diff', 'patch',\n  ...configFormats,\n  ...codeFormats\n]\n\nexport const imageFormats = [ 'jpeg', 'jpg', 'png', 'webp' ]\n\nexport default class Attachment {\n\n  content: string\n  mimeType: string\n  title: string\n  context: string\n\n  constructor(content = '', mimeType = '') {\n    this.content = content\n    this.mimeType = mimeType\n    this.title = ''\n    this.context = ''\n  }\n\n  format(): string {\n    return mimeTypeToExtension(this.mimeType)\n  }\n\n  isText(): boolean {\n    return textFormats.includes(this.format())\n  }\n\n  isImage(): boolean {\n    return imageFormats.includes(this.format())\n  }\n\n}\n\n// MIME type to extension mapping\nconst mimeToExt: Record<string, string> = {\n  // Office formats\n  [docxMimeType]: 'docx',\n  [pptxMimeType]: 'pptx',\n  [xlsxMimeType]: 'xlsx',\n\n  // Text formats\n  'text/plain': 'txt',\n  'text/markdown': 'md',\n  'text/html': 'html',\n  'text/css': 'css',\n  'text/csv': 'csv',\n\n  // Application formats\n  'application/pdf': 'pdf',\n  'application/json': 'json',\n  'application/javascript': 'js',\n  'application/xml': 'xml',\n  'application/x-yaml': 'yaml',\n  'application/octet-stream': 'bin',\n\n  // Image formats\n  'image/jpeg': 'jpg',\n  'image/png': 'png',\n  'image/gif': 'gif',\n  'image/webp': 'webp',\n  'image/svg+xml': 'svg',\n  'image/bmp': 'bmp',\n  'image/tiff': 'tif',\n}\n\n// Extension to MIME type mapping\nconst extToMime: Record<string, string> = {\n  // Office formats\n  'docx': docxMimeType,\n  'pptx': pptxMimeType,\n  'xlsx': xlsxMimeType,\n\n  // Text formats\n  'txt': 'text/plain',\n  'md': 'text/markdown',\n  'html': 'text/html',\n  'htm': 'text/html',\n  'css': 'text/css',\n  'csv': 'text/csv',\n\n  // Application formats\n  'pdf': 'application/pdf',\n  'json': 'application/json',\n  'js': 'application/javascript',\n  'xml': 'application/xml',\n  'yaml': 'application/x-yaml',\n  'yml': 'application/x-yaml',\n  'exe': 'application/octet-stream',\n\n  // Image formats\n  'jpg': 'image/jpeg',\n  'jpeg': 'image/jpeg',\n  'png': 'image/png',\n  'gif': 'image/gif',\n  'webp': 'image/webp',\n  'svg': 'image/svg+xml',\n}\n\nexport function mimeTypeToExtension(mimeType: string): string {\n  // Check direct mapping first\n  if (mimeToExt[mimeType]) {\n    return mimeToExt[mimeType]\n  }\n\n  // Handle text/x- and application/x- prefixes\n  if (mimeType.startsWith('text/x-')) {\n    return mimeType.slice(7)\n  } else if (mimeType.startsWith('application/x-')) {\n    return mimeType.slice(14)\n  }\n\n  // Fallback: extract from mime type (e.g., \"image/png\" -> \"png\")\n  return mimeType.split('/')[1] || ''\n}\n\nexport function extensionToMimeType(extension: string): string {\n  \n  // Remove leading dot if present\n  if (extension.startsWith('.')) {\n    extension = extension.slice(1)\n  }\n\n  const lower = extension.toLowerCase()\n\n  // Check direct mapping\n  if (extToMime[lower]) {\n    return extToMime[lower]\n  }\n\n  // Fallback for text formats we recognize\n  if (textFormats.includes(lower)) {\n    return `text/x-${lower}`\n  }\n\n  return 'application/octet-stream'\n}\n","\nimport { LlmRole, LlmChunkContent, LlmToolCall } from '../types/llm'\nimport Attachment from './attachment'\n\nexport default class Message {\n\n  role: LlmRole\n  content: string\n  reasoning: string|null\n  attachments: Attachment[]\n  toolCalls: LlmToolCall[]\n  thoughtSignature?: string\n  reasoningDetails?: any\n\n  get contentForModel(): string {\n    return this.content\n  }\n\n  constructor(role: LlmRole, content: string|null = null, attachment?: Attachment, toolCalls?: LlmToolCall[]) {\n    this.role = role\n    this.reasoning = null\n    this.content = (content !== null) ? content : ''\n    this.attachments = attachment ? [attachment] : []\n    this.toolCalls = toolCalls || []\n  }\n\n  attach(attachment: Attachment) {\n    this.attachments.push(attachment)\n  }\n\n  detach(attachment: Attachment) {\n    const index = this.attachments.indexOf(attachment)\n    if (index > -1) {\n      this.attachments.splice(index, 1)\n    }\n  }\n\n  appendText(chunk: LlmChunkContent) {\n    if (chunk?.text) {\n      if (chunk?.type === 'reasoning') {\n        this.reasoning = (this.reasoning || '') + chunk.text\n      } else {\n        this.content += chunk.text\n      }\n    }\n  }\n\n}\n","import { LlmTool } from 'types/llm'\nimport { IPlugin, PluginExecutionContext, PluginParameter } from './types/plugin'\n\nexport interface ICustomPlugin extends IPlugin {\n  getTools(): Promise<LlmTool|LlmTool[]>\n}\n\nexport class Plugin implements IPlugin {\n\n  serializeInTools(): boolean {\n    return true\n  }\n\n  isEnabled(): boolean {\n    return true\n  }\n\n  getName(): string {\n    throw new Error('Not implemented')\n  }\n\n  getDescription(): string {\n    throw new Error('Not implemented')\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  getPreparationDescription(tool: string, partialArgs?: any): string {\n    return ''\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  getRunningDescription(tool: string, args: any): string {\n    throw new Error('Not implemented')\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  getCompletedDescription(tool: string, args: any, results: any): string|undefined {\n    return undefined\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  getCanceledDescription(tool: string, args: any): string|undefined {\n    return undefined\n  }\n\n  getParameters(): PluginParameter[] {\n    throw new Error('Not implemented')\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  async execute(context: PluginExecutionContext , parameters: any): Promise<any> {\n    throw new Error('Not implemented')\n  }\n\n  // this is optional so not implemented by default\n  // executeWithUpdates?(context: PluginExecutionContext , parameters: any): AsyncGenerator<PluginExecutionUpdate> {}\n\n  /**\n   * Executes a promise with abort signal support and optional cleanup.\n   * Races the promise against the abort signal.\n   *\n   * This is a generic helper that works with any Promise and AbortSignal,\n   * not specific to IPC or any particular implementation.\n   *\n   * @param operation - The async operation to execute\n   * @param abortSignal - Optional abort signal to monitor\n   * @param onAbort - Optional callback invoked when abort is triggered (for cleanup)\n   * @returns Promise that resolves with operation result or rejects on abort\n   *\n   * @example\n   * // Simple fetch with abort\n   * const data = await this.runWithAbort(\n   *   fetch('https://api.example.com/data'),\n   *   context.abortSignal\n   * )\n   *\n   * @example\n   * // With cleanup callback\n   * const result = await this.runWithAbort(\n   *   someAsyncOperation(),\n   *   context.abortSignal,\n   *   () => cleanup()\n   * )\n   */\n  async runWithAbort<T>(\n    operation: Promise<T>,\n    abortSignal?: AbortSignal,\n    onAbort?: () => void\n  ): Promise<T> {\n\n    // Check if already aborted before starting\n    if (abortSignal?.aborted) {\n      onAbort?.()\n      throw new Error('Operation cancelled')\n    }\n\n    // If no abort signal, just return the promise\n    if (!abortSignal) {\n      return operation\n    }\n\n    // Race between completion and abort\n    // Listener cleanup is automatic via { once: true } option\n    return Promise.race([\n      operation,\n      new Promise<T>((_, reject) => {\n        abortSignal.addEventListener('abort', () => {\n          onAbort?.()\n          reject(new Error('Operation cancelled'))\n        }, { once: true })\n      })\n    ])\n  }\n\n}\n\nexport class CustomToolPlugin extends Plugin implements ICustomPlugin {\n\n  async getTools(): Promise<any|any[]> {\n    throw new Error('Not implemented')\n  }\n\n}\n\nexport class MultiToolPlugin extends Plugin implements ICustomPlugin{\n\n  // this allows for only specific tools of a multi-tool plugin to be enabled\n  // if null, all tools are enabled\n  // if empty, no tools are enabled\n  // implementation should make sure that getTools and handlesTool\n  // check toolsEnabled when responding\n\n  // example:\n  // handlesTool(name: string): boolean {\n  //   const handled = ...\n  //   return handled && (!this.toolsEnabled || this.toolsEnabled.includes(name))\n  // }\n\n  toolsEnabled: string[]|null = null\n\n  enableTool(name: string): void {\n    if (!this.toolsEnabled) {\n      this.toolsEnabled = []\n    }\n    if (!this.toolsEnabled.includes(name)) {\n      this.toolsEnabled.push(name)\n    }\n  }\n  \n  getTools(): Promise<any[]> {\n    throw new Error('Not implemented')\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  handlesTool(name: string): boolean {\n    return false\n  }\n\n}\n","import { PluginParameter, PluginTool } from './types/plugin'\nimport { LlmTool, LlmToolArrayItems, LlmToolOpenAI, LlmToolParameterOpenAI } from './types/llm'\n\n/**\n * Type guard to check if a tool is in the new PluginTool format.\n * PluginTool has parameters as an array, while OpenAI format has nested structure.\n */\nexport function isToolDefinition(tool: LlmTool): tool is PluginTool {\n  return Array.isArray((tool as PluginTool).parameters)\n}\n\n/**\n * Type guard to check if a tool is in the legacy OpenAI format.\n */\nexport function isLegacyOpenAITool(tool: LlmTool): tool is LlmToolOpenAI {\n  return 'type' in tool && tool.type === 'function' && 'function' in tool\n}\n\n/**\n * Normalizes any LlmTool format to PluginTool.\n * Use this to convert legacy OpenAI format tools to the new format.\n */\nexport function normalizeToToolDefinition(tool: LlmTool): PluginTool {\n  if (isToolDefinition(tool)) {\n    return tool\n  }\n\n  // Convert from OpenAI format\n  const params: PluginParameter[] = []\n  const props = tool.function.parameters?.properties || {}\n  const required = tool.function.parameters?.required || []\n\n  for (const [name, prop] of Object.entries(props)) {\n    params.push({\n      name,\n      type: prop.type,\n      description: prop.description,\n      required: required.includes(name),\n      ...(prop.enum ? { enum: prop.enum } : {}),\n      ...(prop.items ? { items: convertOpenAIItems(prop.items) } : {}),\n    })\n  }\n\n  return {\n    name: tool.function.name,\n    description: tool.function.description,\n    parameters: params,\n  }\n}\n\n/**\n * Converts a PluginTool to OpenAI format.\n * Use this for providers that use OpenAI SDK or expect OpenAI format.\n */\nexport function toolDefinitionToOpenAI(tool: PluginTool): LlmToolOpenAI {\n  const properties: Record<string, LlmToolParameterOpenAI> = {}\n  const required: string[] = []\n\n  for (const param of tool.parameters) {\n    const type = param.type || (param.items ? 'array' : 'string')\n    const prop: LlmToolParameterOpenAI = {\n      type,\n      description: param.description,\n      ...(param.enum ? { enum: param.enum } : {}),\n    }\n    // arrays must have items — default to string if missing\n    if (type === 'array') {\n      prop.items = convertItemsToJsonSchema(param.items)\n    }\n    properties[param.name] = prop\n    if (param.required) {\n      required.push(param.name)\n    }\n  }\n\n  return {\n    type: 'function',\n    function: {\n      name: tool.name,\n      description: tool.description,\n      parameters: {\n        type: 'object',\n        properties,\n        required,\n      },\n    },\n  }\n}\n\n/**\n * Converts any LlmTool to OpenAI format.\n * If already in OpenAI format, returns as-is.\n */\nexport function toOpenAITool(tool: LlmTool): LlmToolOpenAI {\n  if (isLegacyOpenAITool(tool)) {\n    return tool\n  }\n  return toolDefinitionToOpenAI(tool)\n}\n\n/**\n * Normalizes an array of tools to PluginTool format.\n */\nexport function normalizeTools(tools: LlmTool[]): PluginTool[] {\n  return tools.map(normalizeToToolDefinition)\n}\n\n/**\n * Converts an array of tools to OpenAI format.\n */\nexport function toOpenAITools(tools: LlmTool[]): LlmToolOpenAI[] {\n  return tools.map(toOpenAITool)\n}\n\n// Helper to convert OpenAI items format to PluginParameter items format\nfunction convertOpenAIItems(items: LlmToolArrayItems): PluginParameter['items'] {\n  if (!items.properties) {\n    return { type: items.type }\n  }\n\n  // LlmToolArrayItems.properties is an array of LlmToolArrayItem\n  const props: PluginParameter[] = items.properties.map((prop) => ({\n    name: prop.name,\n    type: prop.type,\n    description: prop.description,\n    required: prop.required,\n  }))\n\n  return {\n    type: items.type,\n    properties: props,\n  }\n}\n\n// Helper to convert a single PluginParameter to a JSON Schema property\nexport function pluginParamToJsonSchema(param: PluginParameter): any {\n  const type = param.type || (param.items ? 'array' : 'string')\n  const prop: any = {\n    type,\n    description: param.description,\n    ...(param.enum ? { enum: param.enum } : {}),\n  }\n  if (type === 'array') {\n    prop.items = convertItemsToJsonSchema(param.items)\n  }\n  return prop\n}\n\n// Helper to convert PluginParameter items to JSON Schema items format\n// Returns a proper JSON Schema object with properties as Record<string, ...>\nfunction convertItemsToJsonSchema(items: PluginParameter['items']): any {\n  if (!items) return { type: 'string' }\n  if (!items.properties) {\n    // array-of-arrays: propagate nested items\n    if (items.type === 'array' && items.items) {\n      return { type: 'array', items: { type: items.items.type || 'string' } }\n    }\n    return { type: items.type }\n  }\n\n  // object with nested properties: convert array to Record\n  const props: Record<string, any> = {}\n  const required: string[] = []\n  for (const param of items.properties) {\n    props[param.name] = pluginParamToJsonSchema(param)\n    if (param.required) {\n      required.push(param.name)\n    }\n  }\n\n  return {\n    type: items.type || 'object',\n    properties: props,\n    required,\n  }\n}\n","\nimport { LlmUsage } from './types/llm'\n\nexport const zeroUsage = (): LlmUsage => ({\n  prompt_tokens: 0,\n  completion_tokens: 0,\n  prompt_tokens_details: {\n    cached_tokens: 0,\n    audio_tokens: 0\n  },\n  completion_tokens_details: {\n    reasoning_tokens: 0,\n    audio_tokens: 0\n  }\n})\n\nexport const addUsages = (usage1: LlmUsage|null|undefined, usage2: LlmUsage|null|undefined): LlmUsage => {\n\n  if (!usage1 && !usage2) {\n    return zeroUsage()\n  }\n\n  if (!usage1) {\n    return usage2 as LlmUsage\n  }\n\n  if (!usage2) {\n    return usage1 as LlmUsage\n  }\n\n  return {\n    prompt_tokens: usage1.prompt_tokens + usage2.prompt_tokens,\n    completion_tokens: usage1.completion_tokens + usage2.completion_tokens,\n    prompt_tokens_details: {\n      cached_tokens: (usage1.prompt_tokens_details?.cached_tokens || 0) + (usage2.prompt_tokens_details?.cached_tokens || 0),\n      audio_tokens: (usage1.prompt_tokens_details?.audio_tokens || 0) + (usage2.prompt_tokens_details?.audio_tokens || 0)\n    },\n    completion_tokens_details: {\n      reasoning_tokens: (usage1.completion_tokens_details?.reasoning_tokens || 0) + (usage2.completion_tokens_details?.reasoning_tokens || 0),\n      audio_tokens: (usage1.completion_tokens_details?.audio_tokens || 0) + (usage2.completion_tokens_details?.audio_tokens || 0)\n    }\n  }\n}\n","\nexport const PROVIDER_BASE_URLS: Record<string, string | null> = {\n  anthropic: 'https://api.anthropic.com',\n  cerebras: 'https://api.cerebras.ai/v1',\n  deepseek: 'https://api.deepseek.com/v1',\n  google: 'https://generativelanguage.googleapis.com',\n  groq: 'https://api.groq.com/openai/v1',\n  lmstudio: 'http://localhost:1234/v1',\n  meta: 'https://api.llama.com/compat/v1/',\n  mistralai: 'https://api.mistral.ai',\n  ollama: 'http://127.0.0.1:11434',\n  openai: 'https://api.openai.com/v1',\n  openrouter: 'https://openrouter.ai/api/v1',\n  together: 'https://api.together.xyz/v1',\n  xai: 'https://api.x.ai/v1',\n}\n\nexport const getProviderBaseURL = (provider: string): string | null => {\n  return PROVIDER_BASE_URLS[provider] ?? null\n}\n","\nlet _log = console.log;\n\nexport default {\n  // Standard log method – for general info-level logging\n  log: (...args: any[]) => _log(...args),\n\n  // Debug helper – emits only when DEBUG flag is set\n  debug: (...args: any[]) => {\n    if (typeof process !== 'undefined' && process.env.DEBUG) {\n      _log(...args);\n    }\n  },\n\n  // Allow callers to replace the underlying logger implementation (e.g. pino)\n  setLogger: (logger: any) => {\n    _log = logger;\n  },\n\n  // Disable all logging (both log & debug)\n  disableLogger: () => {\n    _log = () => {};\n  }\n};\n","/* eslint-disable @typescript-eslint/no-unused-vars */\n\nimport { ChatModel, EngineCreateOpts, LlmInternalTool, Model, ModelCapabilities, ModelMetadata, ModelsList } from './types/index'\nimport { LlmResponse, LlmCompletionOpts, LlmCompletionPayload, LlmCompletionPayloadContent, LlmCompletionPayloadTool, LlmChunk, LlmToolCall, LlmStreamingResponse, LlmStreamingContext, CompletedToolCall, LlmUsage, LlmStream, LlmToolExecutionValidationCallback, LlmToolExecutionValidationResponse, LlmChunkToolAbort, EngineHookName, EngineHookCallback, EngineHookPayloads, NormalizedToolChunk } from './types/llm'\nimport { IPlugin, PluginExecutionContext, PluginExecutionUpdate, PluginParameter, PluginExecutionResult, PluginTool, ToolExecutionDelegate } from './types/plugin'\nimport { Plugin, ICustomPlugin, MultiToolPlugin } from './plugin'\nimport { normalizeToToolDefinition } from './tools'\nimport Attachment from './models/attachment'\nimport Message from './models/message'\nimport logger from './logger'\nimport { start } from 'node:repl'\nimport { parse as parsePartialJson } from 'partial-json'\n\nexport default abstract class LlmEngine {\n\n  config: EngineCreateOpts\n  plugins: IPlugin[]\n  private hooks: Map<EngineHookName, EngineHookCallback<EngineHookName>[]> = new Map()\n  private toolPreparationStatuses = new WeakMap<LlmToolCall, string>()\n\n  static isConfigured = (opts: EngineCreateOpts): boolean => {\n    return (opts?.apiKey != null && opts.apiKey.length > 0)\n  }\n\n  static isReady = (opts: EngineCreateOpts, models: ModelsList): boolean => {\n    return LlmEngine.isConfigured(opts) && models?.chat?.length > 0\n  }\n\n  constructor(config: EngineCreateOpts) {\n    this.config = config\n    this.plugins = []\n  }\n\n  //\n  // Hooks\n  //\n\n  addHook<T extends EngineHookName>(name: T, callback: EngineHookCallback<T>): () => void {\n    const callbacks = this.hooks.get(name) || []\n    callbacks.push(callback as EngineHookCallback<EngineHookName>)\n    this.hooks.set(name, callbacks)\n    return () => {\n      const cbs = this.hooks.get(name) || []\n      this.hooks.set(name, cbs.filter(cb => cb !== callback))\n    }\n  }\n\n  protected async callHook<T extends EngineHookName>(name: T, payload: EngineHookPayloads[T]): Promise<void> {\n    const callbacks = this.hooks.get(name) || []\n    for (const cb of callbacks) {\n      await cb(payload)\n    }\n  }\n\n  protected abstract syncToolHistoryToThread(context: LlmStreamingContext): void\n\n  abstract getId(): string\n  \n  getName(): string {\n    return this.getId()\n  }\n\n  abstract getModelCapabilities(model: ModelMetadata): ModelCapabilities\n  \n  abstract getModels(): Promise<ModelMetadata[]>\n  \n  protected abstract chat(model: Model, thread: any[], opts?: LlmCompletionOpts): Promise<LlmResponse>\n\n  protected abstract stream(model: Model, thread: Message[], opts?: LlmCompletionOpts): Promise<LlmStreamingResponse>\n\n  /**\n   * @deprecated This method is deprecated and may be removed in future versions. Use abortSignal in LlmCompletionOpts instead.\n   */\n  abstract stop(stream: any): Promise<void>\n\n  protected addTextToPayload(model: ChatModel, message: Message, attachment: Attachment, payload: LlmCompletionPayload, opts?: LlmCompletionOpts): void {\n\n    if (Array.isArray(payload.content)) {\n      \n      // we may need to add to already existing content\n      if (this.requiresFlatTextPayload(model, message)) {\n        const existingText = payload.content.find((c) => c.type === 'text')\n        if (existingText) {\n          existingText.text = `${existingText.text}\\n\\n${attachment.content}`\n          return\n        }\n      }\n\n      // otherwise just add a new text content\n      payload.content.push({\n        type: 'text',\n        text: attachment.content,\n      })\n    \n    } else if (typeof payload.content === 'string') {\n      payload.content = `${payload.content}\\n\\n${attachment.content}`\n    }\n  }\n\n  protected addImageToPayload(model: ChatModel, attachment: Attachment, payload: LlmCompletionPayload, opts?: LlmCompletionOpts) {\n\n    // if we have a string content, convert it to an array\n    if (typeof payload.content === 'string') {\n      payload.content = [{\n        type: 'text',\n        text: payload.content,\n      }]\n    }\n\n    // now add the image\n    if (Array.isArray(payload.content)) {\n      payload.content.push({\n        type: 'image_url',\n        image_url: { url: `data:${attachment.mimeType};base64,${attachment.content}` }\n      })\n    }\n  }\n\n  protected abstract processNativeChunk(chunk: any, context: LlmStreamingContext): AsyncGenerator<LlmChunk>\n\n  clearPlugins(): void {\n    this.plugins = []\n  }\n\n  addPlugin(plugin: Plugin): void {\n    this.plugins = this.plugins.filter((p) => p.getName() !== plugin.getName())\n    this.plugins.push(plugin)\n  }\n\n  removePlugin(name: string): void {\n    this.plugins = this.plugins.filter((p) => p.getName() !== name)\n  }\n\n  async complete(model: ChatModel|string, thread: Message[], opts?: LlmCompletionOpts): Promise<LlmResponse> {\n    const chatModel = this.toModel(model)\n    const messages = this.buildPayload(chatModel, thread, opts)\n    return await this.chat(chatModel, messages, opts)\n  }\n\n  async *generate(model: ChatModel|string, thread: Message[], opts?: LlmCompletionOpts): AsyncIterable<LlmChunk> {\n\n    // eslint-disable-next-line no-useless-catch\n    try {\n      \n      // init the streaming\n      const chatModel = this.toModel(model)\n      const response: LlmStreamingResponse = await this.stream(chatModel, thread, opts)\n      let currentStream: LlmStream = response.stream\n\n      // now we iterate as when the model emits tool call tokens\n      // we execute the tools and start a new stream with the results\n      while (true) {\n\n        // out next stream\n        let nextStream: LlmStream | null = null\n\n        // iterate the native stream (getting native = user-specific chunks)\n        for await (const chunk of currentStream) {\n\n          // Check if abort signal has been triggered\n          if (opts?.abortSignal?.aborted) {\n            currentStream.controller?.abort(opts?.abortSignal?.reason)\n            return\n          }\n\n          // now we convert the native chunk to LlmChunks\n          // we may have several llm chunks for one native chunk\n          const llmChunkStream = this.processNativeChunk(chunk, response.context)\n\n          try {\n            for await (const msg of llmChunkStream) {\n\n              // check message type\n              if (msg.type === 'stream') {\n\n                // stream switch!\n                nextStream = msg.stream\n\n              } else {\n\n                // if we are switching to a new stream make sure we don't send a done message\n                // (anthropic sends a 'message_stop' message when finishing current stream for example)\n                if (nextStream !== null && msg.type === 'content' && msg.done) {\n                  msg.done = false\n                }\n\n                // just forward the message\n                yield msg\n\n              }\n\n              // Check abort AFTER yielding (so canceled tool chunks go through)\n              if (opts?.abortSignal?.aborted) {\n                currentStream.controller?.abort(opts?.abortSignal?.reason)\n                return\n              }\n\n            }\n          } catch (error: any) {\n            if (error.type === 'tool_abort') {\n              yield error as LlmChunkToolAbort\n            } else {\n              throw error  // Re-throw non-tool-abort errors\n            }\n          }\n\n        }\n\n        // if no new stream we are done\n        // else make the next stream the current one\n        if (!nextStream) break\n        currentStream = nextStream\n\n      }\n\n    } catch (error) {\n      // Re-throw the error to ensure it propagates to the caller\n      // This is critical for async generators - errors need explicit handling\n      throw error\n    }\n\n  }\n\n  protected requiresVisionModelSwitch(thread: Message[], currentModel: ChatModel): boolean {\n    \n    // if we already have a vision\n    if (currentModel.capabilities.vision) {\n      return false\n    }\n\n    // check if amy of the messages in the thread have an attachment\n    return thread.some((msg) => msg.attachments.some(a => a.isImage()))\n\n  }\n\n  protected selectModel(model: ChatModel, thread: Message[], opts?: LlmCompletionOpts): ChatModel {\n\n    // init\n    if (!opts) {\n      return model\n    }\n\n    // if we need to switch to vision\n    if (this.requiresVisionModelSwitch(thread, model)) {\n\n      // check\n      if (!opts.visionFallbackModel) {\n        console.debug('Cannot switch to vision model as no models provided in LlmCompletionOpts')\n        return model\n      }\n\n      // return the fallback model\n      return opts.visionFallbackModel\n\n    }\n\n    // no need to switch\n    return model\n\n  }\n\n  requiresFlatTextPayload(model: ChatModel, msg: Message) {\n    return ['system', 'assistant'].includes(msg.role)\n  }\n\n  requiresReasoningContent(): boolean {\n    // for deekseek\n    return false\n  }\n\n  buildPayload<T = LlmCompletionPayload>(model: ChatModel, thread: Message[] | string, opts?: LlmCompletionOpts): T[] {\n\n    if (typeof thread === 'string') {\n\n      return [{ role: 'user', content: [{ type: 'text', text: thread }] }] as T[]\n\n    } else {\n\n      const payloads: LlmCompletionPayload[] = []\n\n      for (const msg of thread) {\n\n        if (msg.contentForModel === null) {\n          continue\n        }\n\n        // init the payload\n        const payload: LlmCompletionPayloadContent = {\n          role: msg.role as 'system'|'developer'|'user'|'assistant',\n          content: this.requiresFlatTextPayload(model, msg) ? msg.contentForModel : [{\n            type: 'text',\n            text: msg.contentForModel,\n            ...(this.requiresReasoningContent() && msg.reasoning ? { reasoning_content: msg.reasoning } : {}),\n            ...(msg.thoughtSignature ? { thoughtSignature: msg.thoughtSignature } : {}),\n          }],\n          ...(msg.reasoningDetails ? { reasoning_details: msg.reasoningDetails } : {}),\n        }\n        \n        // Attachments array may be absent when Message-like objects are supplied.\n        const atts = Array.isArray((msg as any).attachments) ? (msg as any).attachments as Attachment[] : [];\n        for (const attachment of atts) {\n        \n          // this can be a loaded chat where contents is not present\n          if (attachment.content === null || attachment.content === undefined) {\n            console.warn('Attachment contents not available. Skipping attachment.')\n            continue\n          }\n\n          // text formats\n          if (attachment.isText()) {\n            this.addTextToPayload(model, msg, attachment, payload, opts)\n          }\n\n          // image formats\n          if (attachment.isImage() && model.capabilities.vision) {\n            this.addImageToPayload(model, attachment, payload, opts)\n          }\n\n        }\n\n        if (msg.role === 'assistant' && msg.toolCalls.length > 0 && opts?.toolCallsInThread !== false) {\n\n          payload.tool_calls = msg.toolCalls.map((tc: LlmToolCall) => {\n            return {\n              type: 'function',\n              id: tc.id,\n              function: {\n                name: tc.function,\n                arguments: typeof tc.args === 'string' ? tc.args : JSON.stringify(tc.args),\n              },\n              ...(tc.thoughtSignature ? { thoughtSignature: tc.thoughtSignature } : {})\n            }\n          })\n\n        }\n\n        // main payload\n        payloads.push(payload)\n\n        // tool calls response\n        if (opts?.toolCallsInThread !== false) {\n        \n          for (const toolCall of msg.toolCalls) {\n\n            const toolPayload: LlmCompletionPayloadTool = {\n              role: 'tool',\n              tool_call_id: toolCall.id,\n              name: toolCall.function,\n              content: typeof toolCall.result === 'string' ? toolCall.result : JSON.stringify(toolCall.result),\n            }\n            payloads.push(toolPayload)\n\n          }\n        \n        }\n\n      }\n\n      // done\n      return payloads as T[]\n\n    }\n  }\n\n  protected async getAvailableTools(delegate?: ToolExecutionDelegate): Promise<PluginTool[]> {\n\n    // plugin tools first — they take priority in execution\n    const tools: PluginTool[] = []\n    for (const plugin of this.plugins) {\n\n      // needs to be enabled\n      if (!plugin.isEnabled()) {\n        continue\n      }\n\n      // some plugins are vendor specific and are handled\n      // inside the LlmEngine concrete class\n      if (!plugin.serializeInTools()) {\n        continue\n      }\n\n      // others\n      if ('getTools' in plugin) {\n        const pluginAsTool = await (plugin as ICustomPlugin).getTools()\n        if (Array.isArray(pluginAsTool)) {\n          // Normalize each tool to PluginTool format\n          tools.push(...pluginAsTool.map(normalizeToToolDefinition))\n        } else if (pluginAsTool) {\n          tools.push(normalizeToToolDefinition(pluginAsTool))\n        }\n      } else {\n        tools.push(this.getPluginAsTool(plugin as Plugin))\n      }\n    }\n\n    // append delegate tools, skipping names already claimed by plugins\n    if (delegate?.getTools) {\n      const pluginNames = new Set(tools.map(t => t.name))\n      const delegateTools = await delegate.getTools()\n      tools.push(...delegateTools.filter(t => !pluginNames.has(t.name)))\n    }\n\n    return tools\n  }\n\n  protected getInternalTools(provider: string, opts?: LlmCompletionOpts): LlmInternalTool[] {\n    return [\n      ...(this.config.internalTools || []),\n      ...(opts?.internalTools || []),\n    ].filter((tool) => {\n      const toolProvider = tool.provider\n      return !toolProvider || toolProvider === 'all' || toolProvider === provider\n    })\n  }\n\n  // Returns plugin as a PluginTool\n  // Standard plugins define parameters via getParameters()\n  protected getPluginAsTool(plugin: Plugin): PluginTool {\n    return {\n      name: plugin.getName(),\n      description: plugin.getDescription(),\n      parameters: plugin.getParameters(),\n    }\n  }\n\n  protected getPluginForTool(tool: string): Plugin|null {\n\n    const plugin = this.plugins.find((plugin) => plugin.getName() === tool)\n    if (plugin) {\n      return plugin as Plugin\n    }\n\n    // try multi-tools\n    for (const plugin of Object.values(this.plugins)) {\n      if (plugin instanceof MultiToolPlugin) {\n        const multiToolPlugin = plugin as MultiToolPlugin\n        if (multiToolPlugin.handlesTool(tool)) {\n          return plugin\n        }\n      }\n    }\n\n    // not found\n    return null\n\n  }\n\n  protected getToolPreparationDescription(tool: string, partialArgs?: any): string {\n    const plugin = this.getPluginForTool(tool)\n    return plugin?.getPreparationDescription(tool, partialArgs) || ''\n  }\n  \n  protected getToolRunningDescription(tool: string, args: any): string {\n    const plugin = this.getPluginForTool(tool)\n    return plugin?.getRunningDescription(tool, args) || ''\n  }\n\n  protected getToolCompletedDescription(tool: string, args: any, results: any): string|undefined {\n    const plugin = this.getPluginForTool(tool)\n    return plugin?.getCompletedDescription(tool, args, results)\n  }\n\n  protected getToolCanceledDescription(tool: string, args: any): string|undefined {\n    const plugin = this.getPluginForTool(tool)\n    return plugin?.getCanceledDescription(tool, args)\n  }\n\n  protected parsePartialToolArgs(args: string): any|undefined {\n    if (!args) return undefined\n    try {\n      return parsePartialJson(args)\n    } catch {\n      return undefined\n    }\n  }\n\n  protected processToolExecutionResult(\n    providerId: string,\n    toolName: string,\n    params: any,\n    lastUpdate: PluginExecutionResult|undefined\n  ): { content: any, canceled: boolean } {\n\n    // Validate we got a result\n    if (!lastUpdate) {\n      throw new Error(`[${providerId}] tool call ${toolName} did not return any result`)\n    }\n\n    // Extract content with fallback\n    const content = lastUpdate.result || { error: 'No result from tool' }\n    logger.log(`[${providerId}] tool call ${toolName} => ${JSON.stringify(content).substring(0, 128)}`)\n\n    // Handle abort decision - throw immediately\n    if (lastUpdate.validation?.decision === 'abort') {\n      const toolAbort: LlmChunkToolAbort = {\n        type: 'tool_abort',\n        name: toolName,\n        params: params,\n        reason: lastUpdate.validation,\n      }\n      throw toolAbort\n    }\n\n    // Detect cancellation (deny or explicit cancel)\n    const canceled = lastUpdate.canceled === true || lastUpdate.validation?.decision === 'deny'\n\n    return { content, canceled }\n  }\n\n  /**\n   * ============================================================================\n   * Tool Call Normalization and Execution\n   * ============================================================================\n   *\n   * Providers stream tool calls in different formats. This base class provides\n   * shared infrastructure to normalize parsing and execution across all providers.\n   *\n   * ## Flow\n   * 1. Provider parses native chunk → creates NormalizedToolChunk\n   * 2. processToolCallChunk() accumulates into context.toolCalls[]\n   * 3. On finish, provider calls executeToolCalls*() with formatting callbacks\n   * 4. Base class executes tools, provider formats results for its thread format\n   *\n   * ## Two Execution Patterns\n   *\n   * **Sequential (OpenAI/Groq/Mistral)**\n   * - Each tool call/result added to thread immediately after execution\n   * - Thread: [assistant+tool1] [result1] [assistant+tool2] [result2] ...\n   * - Use: executeToolCallsSequentially()\n   *\n   * **Batched (Anthropic/Google)**\n   * - All tools execute first, then all added to thread at once\n   * - Thread: [assistant with ALL tool calls] [user/tool with ALL results]\n   * - Use: executeToolCallsBatched()\n   *\n   * ## Provider Implementation\n   * Providers only need to:\n   * 1. Parse native chunks into NormalizedToolChunk format\n   * 2. Call processToolCallChunk() to accumulate\n   * 3. Provide formatters for their native thread message format\n   * 4. Call the appropriate execute*() method\n   * ============================================================================\n   */\n\n  /**\n   * Normalize and accumulate a tool call chunk.\n   * Handles both 'start' (new tool) and 'delta' (argument append) types.\n   * Yields 'preparing' notification for new tool calls.\n   */\n  protected *processToolCallChunk(\n    normalized: NormalizedToolChunk,\n    context: { toolCalls: LlmToolCall[] }\n  ): Generator<LlmChunk> {\n\n    if (normalized.type === 'start') {\n      // Start new tool call\n      const toolCall: LlmToolCall = {\n        id: normalized.id!,\n        function: normalized.name!,\n        args: normalized.args || '',\n        message: normalized.message,\n        ...normalized.metadata\n      }\n      const partialArgs = this.parsePartialToolArgs(toolCall.args)\n      const preparationStatus = this.getToolPreparationDescription(toolCall.function, partialArgs)\n      this.toolPreparationStatuses.set(toolCall, preparationStatus)\n      context.toolCalls.push(toolCall)\n\n      // Yield preparation notification (include metadata like thoughtSignature)\n      yield {\n        type: 'tool',\n        id: toolCall.id,\n        name: toolCall.function,\n        state: 'preparing',\n        status: preparationStatus,\n        ...(toolCall.thoughtSignature ? { thoughtSignature: toolCall.thoughtSignature } : {}),\n        done: false\n      } as LlmChunk\n\n    } else if (normalized.type === 'delta') {\n      // Find target tool call - by id if provided (parallel tool calls), otherwise last\n      const currentTool = normalized.id\n        ? context.toolCalls.find(tc => tc.id === normalized.id)\n        : context.toolCalls[context.toolCalls.length - 1]\n      if (currentTool) {\n        currentTool.args += normalized.argumentsDelta || ''\n        // Update message if it has OpenAI/Groq/Mistral format (array with function.arguments)\n        if (Array.isArray(currentTool.message) && currentTool.message.length > 0) {\n          const lastMessage = currentTool.message[currentTool.message.length - 1]\n          if (lastMessage?.function?.arguments !== undefined) {\n            lastMessage.function.arguments = currentTool.args\n          }\n        }\n        const partialArgs = this.parsePartialToolArgs(currentTool.args)\n        if (partialArgs !== undefined) {\n          const status = this.getToolPreparationDescription(currentTool.function, partialArgs)\n          if (status === this.toolPreparationStatuses.get(currentTool)) {\n            return\n          }\n          this.toolPreparationStatuses.set(currentTool, status)\n          yield {\n            type: 'tool',\n            id: currentTool.id,\n            name: currentTool.function,\n            state: 'preparing',\n            status,\n            ...(currentTool.thoughtSignature ? { thoughtSignature: currentTool.thoughtSignature } : {}),\n            done: false\n          } as LlmChunk\n        }\n      }\n    }\n  }\n\n  /**\n   * Execute tool calls with per-tool thread formatting (OpenAI/Groq/Mistral style).\n   * Each tool call and result is added to thread immediately after execution.\n   */\n  protected async *executeToolCallsSequentially<T>(\n    toolCalls: LlmToolCall[],\n    context: LlmStreamingContext<T>,\n    options: {\n      formatToolCallForThread: (tc: LlmToolCall, args: any) => T,\n      formatToolResultForThread: (result: any, tc: LlmToolCall, args: any) => T,\n      createNewStream: (context: LlmStreamingContext<T>) => Promise<LlmStream>\n    }\n  ): AsyncGenerator<LlmChunk> {\n\n    for (const toolCall of toolCalls) {\n      const executed = yield* this.executeOneTool(toolCall, context)\n\n      // Stop if aborted\n      if (!executed) return\n\n      // Add to thread immediately after each tool\n      context.thread.push(options.formatToolCallForThread(toolCall, executed.args))\n      context.thread.push(options.formatToolResultForThread(executed.result, toolCall, executed.args))\n    }\n\n    // Finalize: hook, sync, recurse\n    yield* this.finalizeToolExecution(context, options.createNewStream)\n  }\n\n  /**\n   * Execute tool calls with batched thread formatting (Anthropic/Google style).\n   * All tool calls execute first, then all are added to thread at once.\n   */\n  protected async *executeToolCallsBatched<T>(\n    toolCalls: LlmToolCall[],\n    context: LlmStreamingContext<T>,\n    options: {\n      formatBatchForThread: (completed: CompletedToolCall[]) => T[],\n      createNewStream: (context: LlmStreamingContext<T>) => Promise<LlmStream>\n    }\n  ): AsyncGenerator<LlmChunk> {\n\n    const completedTools: CompletedToolCall[] = []\n\n    for (const toolCall of toolCalls) {\n      const executed = yield* this.executeOneTool(toolCall, context)\n\n      // Stop if aborted\n      if (!executed) return\n\n      completedTools.push({ tc: toolCall, args: executed.args, result: executed.result })\n    }\n\n    // Add all to thread at once\n    const batchMessages = options.formatBatchForThread(completedTools)\n    for (const msg of batchMessages) {\n      context.thread.push(msg)\n    }\n\n    // Finalize: hook, sync, recurse\n    yield* this.finalizeToolExecution(context, options.createNewStream)\n  }\n\n  /**\n   * Execute a single tool call. Shared by both sequential and batched methods.\n   * Returns null if aborted, otherwise returns { args, result }.\n   */\n  private async *executeOneTool(\n    toolCall: LlmToolCall,\n    context: LlmStreamingContext\n  ): AsyncGenerator<LlmChunk, { args: any, result: any } | null> {\n\n    // Log the tool call\n    logger.log(`[${this.getName()}] tool call ${toolCall.function} with ${toolCall.args}`)\n\n    // Parse arguments\n    let args = null\n    try {\n      if (toolCall.args.trim() === '') {\n        args = {}\n      } else {\n        args = JSON.parse(toolCall.args)\n      }\n    } catch (err) {\n      throw new Error(`[${this.getName()}] tool call ${toolCall.function} with invalid JSON args: \"${toolCall.args}\"`, { cause: err })\n    }\n\n    try {\n      // Yield running notification\n      yield {\n        type: 'tool',\n        id: toolCall.id,\n        name: toolCall.function,\n        state: 'running',\n        status: this.getToolRunningDescription(toolCall.function, args),\n        ...(toolCall.reasoningDetails ? { reasoningDetails: toolCall.reasoningDetails } : {}),\n        call: {\n          params: args,\n          result: undefined\n        },\n        done: false\n      } as LlmChunk\n\n      // Execute tool\n      let lastUpdate: PluginExecutionResult | undefined = undefined\n      for await (const update of this.callTool(\n        { model: context.model.id, abortSignal: context.opts?.abortSignal },\n        toolCall.function,\n        args,\n        context.opts?.toolExecutionDelegate,\n        context.opts?.toolExecutionValidation,\n      )) {\n\n        // Check for abort\n        if (context.opts?.abortSignal?.aborted) {\n          yield {\n            type: 'tool',\n            id: toolCall.id,\n            name: toolCall.function,\n            state: 'canceled',\n            status: this.getToolCanceledDescription(toolCall.function, args) || 'Tool execution was canceled',\n            done: true,\n            call: {\n              params: args,\n              result: undefined\n            }\n          } as LlmChunk\n          return null\n        }\n\n        // Handle status updates\n        if (update.type === 'status') {\n          yield {\n            type: 'tool',\n            id: toolCall.id,\n            name: toolCall.function,\n            state: 'running',\n            status: update.status,\n            call: {\n              params: args,\n              result: undefined\n            },\n            done: false\n          } as LlmChunk\n        } else if (update.type === 'result') {\n          lastUpdate = update\n        }\n      }\n\n      // Process result\n      const { content, canceled: toolCallCanceled } = this.processToolExecutionResult(\n        this.getName(),\n        toolCall.function,\n        args,\n        lastUpdate\n      )\n\n      // Yield completed notification\n      yield {\n        type: 'tool',\n        id: toolCall.id,\n        name: toolCall.function,\n        state: toolCallCanceled ? 'canceled' : 'completed',\n        status: toolCallCanceled\n          ? this.getToolCanceledDescription(toolCall.function, args) || content.error || 'Tool execution was canceled'\n          : this.getToolCompletedDescription(toolCall.function, args, content),\n        done: true,\n        call: {\n          params: args,\n          result: content\n        }\n      } as LlmChunk\n\n      // Add to tool history\n      context.toolHistory.push({\n        id: toolCall.id,\n        name: toolCall.function,\n        args: args,\n        result: content,\n        round: context.currentRound,\n      })\n\n      return { args, result: content }\n\n    } catch (error: any) {\n\n      // Handle abort\n      if (context.opts?.abortSignal?.aborted) {\n        yield {\n          type: 'tool',\n          id: toolCall.id,\n          name: toolCall.function,\n          state: 'canceled',\n          status: this.getToolCanceledDescription(toolCall.function, args) || 'Tool execution was canceled',\n          done: true,\n          call: {\n            params: args,\n            result: undefined\n          }\n        } as LlmChunk\n        throw error\n      }\n\n      // Handle other errors - yield error chunk before re-throwing\n      yield {\n        type: 'tool',\n        id: toolCall.id,\n        name: toolCall.function,\n        state: 'error',\n        status: error instanceof Error ? error.message : 'Tool execution failed',\n        done: true,\n        call: {\n          params: args,\n          result: undefined\n        }\n      } as LlmChunk\n      throw error\n    }\n  }\n\n  /**\n   * Finalize tool execution: call hook, sync, and recurse.\n   */\n  private async *finalizeToolExecution<T>(\n    context: LlmStreamingContext<T>,\n    createNewStream: (context: LlmStreamingContext<T>) => Promise<LlmStream>\n  ): AsyncGenerator<LlmChunk> {\n    // Call hook before continuing\n    await this.callHook('beforeToolCallsResponse', context)\n\n    // Sync tool history to thread\n    this.syncToolHistoryToThread(context)\n\n    // Apply cooldown before next request\n    await this.applyCooldown(context.startTime)\n\n    // Recurse: yield new stream to continue the conversation with tool results\n    yield {\n      type: 'stream',\n      stream: await createNewStream(context)\n    } as LlmChunk\n  }\n\n  /**\n   * Apply cooldown delay if configured, based on elapsed time since startTime.\n   */\n  protected async applyCooldown(startTime: number): Promise<void> {\n    if (this.config.requestCooldown && startTime > 0) {\n      const elapsed = Date.now() - startTime\n      const remaining = this.config.requestCooldown - elapsed\n      if (remaining > 0) {\n        await new Promise(resolve => setTimeout(resolve, remaining))\n      }\n    }\n  }\n\n  protected async *callTool(context: PluginExecutionContext, tool: string, args: any, delegate?: ToolExecutionDelegate, toolExecutionValidation?: LlmToolExecutionValidationCallback): AsyncGenerator<PluginExecutionUpdate> {\n\n    // get the plugin\n    let payload = args\n    let toolOwner = this.plugins.find((plugin) => plugin.getName() === tool)\n    if (!toolOwner) {\n\n      // try multi-tools\n      for (const plugin of Object.values(this.plugins)) {\n        if (plugin instanceof MultiToolPlugin) {\n          const multiToolPlugin = plugin as MultiToolPlugin\n          if (multiToolPlugin.handlesTool(tool)) {\n            toolOwner = plugin\n            payload = { tool: tool, parameters: args }\n            break\n          }\n        }\n      }\n\n    }\n\n    // Check abort before calling tool\n    if (context.abortSignal?.aborted) {\n      yield {\n        type: 'result',\n        result: { error: 'Operation cancelled' },\n\n        canceled: true\n      }\n      return\n    }\n\n    // if we have validator, call it\n    let validation: LlmToolExecutionValidationResponse | undefined = undefined\n    if (toolExecutionValidation) {\n      validation = await toolExecutionValidation(context, tool, args)\n      if (validation.decision !== 'allow') {\n        yield {\n          type: 'result',\n          result: { error: `Tool ${tool} execution denied by validation function.` },\n          validation\n        }\n        return\n      }\n    }\n\n    // try delegate if no plugin owns this tool\n    if (!toolOwner && delegate) {\n      try {\n        const result = await delegate.execute(context, tool, args)\n        yield {\n          type: 'result',\n          result: result,\n          ...(validation !== undefined ? { validation } : {}),\n        }\n      } catch (error) {\n        if (context.abortSignal?.aborted || (error instanceof Error && error.message === 'Operation cancelled')) {\n          yield {\n            type: 'result',\n            result: { error: 'Operation cancelled' },\n            canceled: true,\n          ...(validation !== undefined ? { validation } : {}),\n          }\n        } else {\n          throw error\n        }\n      }\n      return\n    }\n\n    // check\n    if (!toolOwner) {\n      yield {\n        type: 'result',\n        result: { error: `Tool ${tool} does not exist. Check the tool list and try again.` }\n      }\n      return\n    }\n\n    // now we can run depending on plugin implementation\n    if ('executeWithUpdates' in toolOwner) {\n\n      for await (const update of toolOwner.executeWithUpdates!(context, payload)) {\n        if (context.abortSignal?.aborted) {\n          yield {\n            type: 'result',\n            result: { error: 'Operation cancelled' },\n            canceled: true,\n          ...(validation !== undefined ? { validation } : {}),\n          }\n          return\n        }\n        yield update\n      }\n\n    } else {\n\n      // now we can run\n      try {\n        const result = await toolOwner.execute(context, payload)\n        yield {\n          type: 'result',\n          result: result,\n          ...(validation !== undefined ? { validation } : {}),\n        }\n      } catch (error) {\n        // Check if this was a cancellation\n        if (context.abortSignal?.aborted || (error instanceof Error && error.message === 'Operation cancelled')) {\n          yield {\n            type: 'result',\n            result: { error: 'Operation cancelled' },\n            canceled: true,\n          ...(validation !== undefined ? { validation } : {}),\n          }\n        } else {\n          throw error\n        }\n      }\n\n    }\n\n  }\n\n  protected toModel(model: string|ChatModel): ChatModel {\n    if (typeof model === 'object') {\n      return model\n    } else {\n      return this.buildModel(model)\n    }\n  }\n\n  buildModel(model: string): ChatModel {\n    return {\n      id: model,\n      name: model,\n      capabilities: this.getModelCapabilities({\n        id: model,\n        name: model,\n      }),\n    }\n  }\n\n}\n","\nimport LlmEngine from './engine'\nimport Message from './models/message'\nimport { Plugin } from './plugin'\nimport { ChatModel } from './types'\nimport { LlmChunk, LlmCompletionOpts, LlmResponse } from './types/llm'\n\nexport default class LlmModel {\n\n  engine: LlmEngine\n  model: string|ChatModel\n\n  constructor(engine: LlmEngine, model: string|ChatModel) {\n    this.engine = engine\n    this.model = model\n  }\n\n  get plugins() {\n    return this.engine.plugins\n  }\n\n  clearPlugins(): void {\n    this.engine.clearPlugins()\n  }\n\n  addPlugin(plugin: Plugin): void {\n    this.engine.addPlugin(plugin)\n  }\n\n  removePlugin(name: string): void {\n    this.engine.removePlugin(name)\n  }\n\n  complete(thread: Message[], opts?: LlmCompletionOpts): Promise<LlmResponse> {\n    return this.engine.complete(this.model, thread, opts)\n  }\n\n  async *generate(thread: Message[], opts?: LlmCompletionOpts): AsyncIterable<LlmChunk> {\n    const stream = this.engine.generate(this.model, thread, opts)\n    for await (const chunk of stream) {\n      yield chunk\n    }\n  }\n\n}","import { ChatModel, EngineCreateOpts, ModelOpenAI } from '../types/index'\nimport Message from '../models/message'\nimport { AzureOpenAI } from 'openai'\nimport OpenAI from './openai'\n\nexport default class extends OpenAI {\n\n  constructor(config: EngineCreateOpts) {\n    super(config, { apiKey: config.apiKey })\n    this.client = new AzureOpenAI({\n      endpoint: config.baseURL,\n      apiKey: config.apiKey,\n      deployment: config.deployment,\n      apiVersion: config.apiVersion,\n      dangerouslyAllowBrowser: true,\n    }) \n  }\n\n  getId(): string {\n    return 'azure'\n  }\n\n  supportsServiceTiering(): boolean {\n    return false\n  }\n  \n  async getModels(): Promise<ModelOpenAI[]> {\n    return [\n      { id: 'default', object: 'model', created: 0, owned_by: 'system' },\n    ]\n  }\n\n  protected setBaseURL() {\n    // avoid override by super\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  requiresFlatTextPayload(model: ChatModel, msg: Message): boolean {\n    return true\n  }\n}\n","import { minimatch } from 'minimatch'\nimport OpenAI, { ClientOptions } from 'openai'\nimport { zodResponseFormat } from 'openai/helpers/zod'\nimport { CompletionUsage } from 'openai/resources'\nimport { ChatCompletionChunk, ChatCompletionCreateParamsBase, ChatCompletionMessageFunctionToolCall, ChatCompletionMessageParam } from 'openai/resources/chat/completions'\nimport { Response, ResponseCreateParams, ResponseFunctionToolCall, ResponseInputItem, ResponseOutputMessage, ResponseStreamEvent, ResponseUsage, Tool, ToolChoiceFunction, ToolChoiceOptions } from 'openai/resources/responses/responses'\nimport LlmEngine from '../engine'\nimport logger from '../logger'\nimport Message from '../models/message'\nimport { ChatModel, EngineCreateOpts, ModelCapabilities, ModelMetadata, ModelOpenAI } from '../types/index'\nimport { LlmCompletionPayload, LLmContentPayloadImageOpenai, LlmChunk, LlmCompletionOpts, LlmContentPayload, LlmResponse, LlmRole, LlmStream, LlmStreamingContext, LlmStreamingResponse, LlmToolCall, LlmToolCallInfo, LlmToolChoice, LlmUsage } from '../types/llm'\nimport { PluginExecutionResult } from '../types/plugin'\nimport { toOpenAITools } from '../tools'\nimport { zeroUsage } from '../usage'\nimport { PROVIDER_BASE_URLS } from '../defaults'\nimport { RequestOptions } from 'openai/internal/request-options'\n\ntype OpenAIToolOpts = Omit<ChatCompletionCreateParamsBase, 'model' | 'messages' | 'stream'>\n\ntype ResponsesToolExecutionResult = {\n  canceled?: boolean\n  error?: unknown\n}\n\ntype ResponsesSchemaConversion = {\n  schema: any\n  strict: boolean\n}\n\nconst defaultBaseUrl = PROVIDER_BASE_URLS.openai!\n\nfunction isChatCompletionReasoningEffort(effort: LlmCompletionOpts['reasoningEffort']): effort is 'minimal' | 'low' | 'medium' | 'high' {\n  return effort === 'minimal' || effort === 'low' || effort === 'medium' || effort === 'high'\n}\n\n//\n// https://platform.openai.com/docs/api-reference/introduction\n// \n\nexport type OpenAIStreamingContext = LlmStreamingContext<ChatCompletionMessageParam> & {\n  reasoningContent: string\n  textContent: string\n  responsesApi: boolean\n  thinking: boolean\n  done?: boolean\n}\n\nexport default class extends LlmEngine {\n\n  client: OpenAI\n\n  constructor(config: EngineCreateOpts, opts?: ClientOptions) {\n    super(config)\n    this.client = new OpenAI({\n      apiKey: opts?.apiKey || config.apiKey,\n      baseURL: opts?.baseURL || config.baseURL || defaultBaseUrl,\n      timeout: opts?.timeout || config.timeout || undefined,\n      dangerouslyAllowBrowser: true\n    })\n  }\n\n  getId(): string {\n    return 'openai'\n  }\n\n  // https://openai.com/api/pricing/\n\n  getModelCapabilities(model: ModelMetadata): ModelCapabilities {\n\n    const visionGlobs = [\n      '*vision*',\n      'gpt-4-turbo*',\n      'gpt-4-0125*',\n      'gpt-4-1106-vision-preview',\n      'gpt-4o*',\n      'chatgpt-4o',\n      'gpt-4.1*',\n      'gpt-4.5*',\n      'gpt-5*',\n      'o1*',\n      'o3*',\n      'o4*',\n    ]\n\n    const excludeVisionGlobs = [\n      'gpt-4o-mini-audio*',\n      'o1-mini*',\n      'o3-mini*'\n    ]\n\n    const modelId = (model as ModelOpenAI).id\n\n    return {\n      tools: !modelId.includes('chat') && !modelId.startsWith('o1-mini'),\n      vision: visionGlobs.some((m) => minimatch(modelId, m)) && !excludeVisionGlobs.some((m) => minimatch(modelId, m)),\n      reasoning: modelId.startsWith('o') || modelId.startsWith('gpt-5'),\n      caching: false,\n    }\n  }\n\n  supportsServiceTiering(): boolean {\n    return true\n  }\n\n  modelAcceptsSystemRole(model: string): boolean {\n    return !model.startsWith('o1')\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  modelSupportsMaxTokens(model: ChatModel): boolean {\n    return true\n  }\n\n  modelSupportsTemperature(model: ChatModel): boolean {\n    return !model.capabilities.reasoning\n  }\n\n  modelSupportsTopP(model: ChatModel): boolean {\n    return !model.capabilities.reasoning\n  }\n\n  modelSupportsTopK(model: ChatModel): boolean {\n    return !model.capabilities.reasoning\n  }\n\n  modelSupportsReasoningEffort(model: ChatModel): boolean {\n    return model.capabilities.reasoning\n  }\n\n  modelSupportsVerbosity(model: ChatModel): boolean {\n    return model.id.startsWith('gpt-5')\n  } \n\n  modelRequiresResponsesApi(model: ChatModel): boolean {\n    return ['o3-pro*', 'codex*'].some((m) => minimatch(model.id, m))\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  modelSupportsStructuredOutput(model: ChatModel): boolean {\n    return true\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  doesNotSendToolCallFinishReason(model: ChatModel): boolean {\n    return false\n  }\n\n  get systemRole(): LlmRole {\n    return 'system'//'developer'\n  }\n\n  async getModels(): Promise<ModelMetadata[]> {\n\n    // // need an api key\n    // if (!this.client.apiKey) {\n    //   return []\n    // }\n\n    // do it\n    try {\n\n      const response = await this.client.models.list()\n      let models = response.data\n      if (models === null || models.length === 0) {\n        // @ts-expect-error togetherai hack\n        if (response.body && Array.isArray(response.body)) {\n          // @ts-expect-error togetherai hack\n          models = response.body as OpenAI.Model[]\n        }\n      }\n\n      // done\n      return models\n\n    } catch (error) {\n      console.error('Error listing models:', error);\n      return []\n    }\n  }\n\n  protected setBaseURL() {\n    if (this.client) {\n      this.client.baseURL = this.config.baseURL || defaultBaseUrl\n    }\n  }\n\n  protected shouldUseResponsesApi(model: ChatModel, opts?: LlmCompletionOpts): boolean {\n    return this.modelRequiresResponsesApi(model) || (opts?.useResponsesApi ?? false) || (this.config.useOpenAIResponsesApi ?? false) || (opts?.tools !== false && this.getInternalTools(this.getId(), opts).length > 0)\n  }\n\n  buildOpenAIPayload(model: ChatModel, thread: Message[] | string, opts?: LlmCompletionOpts): ChatCompletionMessageParam[] {\n\n    let payloads = this.buildPayload<ChatCompletionMessageParam>(model, thread, opts)\n\n    if (!this.modelAcceptsSystemRole(model.id)) {\n\n      payloads = payloads.filter((msg) => msg.role !== 'system')\n\n    } else if (this.systemRole !== 'system') {\n\n      payloads = payloads.map((msg) => {\n        if (msg.role === 'system') {\n          (msg as any).role = this.systemRole\n        }\n        return msg\n      })\n    }\n\n    return payloads\n  }\n\n  async chat(model: ChatModel, thread: ChatCompletionMessageParam[], opts?: LlmCompletionOpts): Promise<LlmResponse> {\n\n    // process with responses api?\n    if (this.shouldUseResponsesApi(model, opts)) {\n      return this.responsesChat(model, thread as LlmCompletionPayload[], opts)\n    }\n\n    // Fallback to Chat Completions\n\n    // set baseURL on client\n    this.setBaseURL()\n\n    // save tool calls\n    const toolCallInfo: LlmToolCallInfo[] = []\n    const startTime = Date.now()\n\n    // call\n    logger.log(`[${this.getName()}] prompting model ${model.id}`)\n    const response = await this.client.chat.completions.create({\n      model: model.id,\n      messages: thread,\n      ...this.getCompletionOpts(model, opts),\n      ...await this.getToolsOpts(model, opts),\n    }, this.getRequestOptions(model, opts));\n\n    // get choice\n    const choice = response.choices?.[0]\n\n    // tool call\n    if (choice.message.tool_calls && (choice?.finish_reason === 'tool_calls' || this.doesNotSendToolCallFinishReason(model))) {\n\n      // add tool call message\n      thread.push(choice.message)\n\n      for (const tool_call of choice.message.tool_calls) {\n\n        if (!('function' in tool_call)) {\n          continue\n        }\n\n        // log\n        const functionToolCall: ChatCompletionMessageFunctionToolCall = tool_call\n        logger.log(`[openai] tool call ${functionToolCall.function.name} with ${functionToolCall.function.arguments}`)\n\n        // this can error\n        let args = null\n        try {\n          args = JSON.parse(functionToolCall.function.arguments)\n        } catch (err) {\n          throw new Error(`[openai] tool call ${functionToolCall.function.name} with invalid JSON args: \"${functionToolCall.function.arguments}\"`, { cause: err })\n        }\n\n        // now execute\n        let lastUpdate: PluginExecutionResult|undefined = undefined\n        for await (const update of this.callTool(\n          { model: model.id, abortSignal: opts?.abortSignal },\n          functionToolCall.function.name, args,\n          opts?.toolExecutionDelegate,\n          opts?.toolExecutionValidation,\n        )) {\n          if (update.type === 'result') {\n            lastUpdate = update\n          }\n        }\n\n        // process result\n        const { content, canceled } = this.processToolExecutionResult(\n          'openai',\n          functionToolCall.function.name,\n          args,\n          lastUpdate\n        )\n\n        // For non-streaming, throw immediately on cancel\n        if (canceled) {\n          throw new Error('Tool execution was canceled')\n        }\n\n        // add tool response message\n        thread.push({\n          role: 'tool',\n          tool_call_id: tool_call.id,\n          content: JSON.stringify(content)\n        })\n\n        // save tool call info\n        toolCallInfo.push({\n          name: functionToolCall.function.name,\n          params: args,\n          result: content\n        })\n\n      }\n\n      // apply cooldown before next request\n      await this.applyCooldown(startTime)\n\n      // prompt again\n      const completion = await this.chat(model, thread, opts)\n\n      // prepend tool call info\n      completion.toolCalls = [\n        ...toolCallInfo,\n        ...completion.toolCalls ?? [],\n      ]\n\n      // cumulate usage\n      if (opts?.usage && response.usage && completion.usage) {\n        this.accumulateUsage(completion.usage, response.usage)\n      }\n\n      // done\n      return completion\n\n    }\n\n    // total tokens is not part of our response\n    if (response.usage?.total_tokens) {\n      // @ts-expect-error \"must be optional\"???\n      delete response.usage.total_tokens\n    }\n\n    // done\n    return {\n      type: 'text',\n      content: choice.message.content || '',\n      toolCalls: toolCallInfo,\n      ...(opts?.usage && response.usage ? { usage: response.usage } : {}),\n    }\n\n  }\n\n  async stream(model: ChatModel, thread: Message[], opts?: LlmCompletionOpts): Promise<LlmStreamingResponse<OpenAIStreamingContext>> {\n\n    // process with responses api?\n    if (this.shouldUseResponsesApi(model, opts)) {\n      return this.responsesStream(model, thread, opts)\n    }\n\n    // set baseURL on client\n    this.setBaseURL()\n\n    // model: switch to vision if needed\n    model = this.selectModel(model, thread, opts)\n    const context: OpenAIStreamingContext = {\n      model: model,\n      responsesApi: false,\n      reasoningContent: '',\n      textContent: '',\n      thread: this.buildOpenAIPayload(model, thread, opts),\n      opts: opts || {},\n      toolCalls: [],\n      toolHistory: [],\n      currentRound: 0,\n      startTime: 0,\n      usage: zeroUsage(),\n      thinking: false,\n      done: false,\n    }\n\n    // do it\n    return {\n      stream: await this.doStream(context),\n      context: context,\n    }\n\n  }\n\n  async doStream(context: OpenAIStreamingContext): Promise<LlmStream> {\n\n    // reset\n    context.toolCalls = []\n    context.startTime = Date.now()\n    context.textContent = ''\n\n    // call\n    logger.log(`[${this.getName()}] prompting model ${context.model.id}`)\n    const stream = this.client.chat.completions.create({\n      model: context.model.id,\n      messages: context.thread,\n      ...this.getCompletionOpts(context.model, context.opts),\n      ...await this.getToolsOpts(context.model, context.opts),\n      stream_options: { include_usage: context.opts.usage || false },\n      stream: true,\n    }, this.getRequestOptions(context.model, context.opts))\n    \n    // done\n    return stream\n\n  }\n\n  getCompletionOpts(model: ChatModel, opts?: LlmCompletionOpts): Omit<ChatCompletionCreateParamsBase, 'model' | 'messages' | 'stream'> {\n    const reasoningEffort = opts?.reasoningEffort\n    return {\n      ...(this.modelSupportsMaxTokens(model) && opts?.maxTokens ? { max_completion_tokens: opts?.maxTokens } : {}),\n      ...(this.modelSupportsTemperature(model) && opts?.temperature ? { temperature: opts?.temperature } : {}),\n      ...(this.modelSupportsTopK(model) && opts?.top_k ? { logprobs: true, top_logprobs: opts?.top_k } : {}),\n      ...(this.modelSupportsTopP(model) && opts?.top_p ? { top_p: opts?.top_p } : {}),\n      // The legacy Chat Completions endpoint accepts a narrower effort set than\n      // the Responses API. Unsupported values remain available on Responses.\n      ...(this.modelSupportsReasoningEffort(model) && isChatCompletionReasoningEffort(reasoningEffort)\n        ? { reasoning_effort: reasoningEffort }\n        : {}),\n      ...(this.modelSupportsVerbosity(model) && opts?.verbosity ? { verbosity: opts.verbosity } : {}),\n      ...(this.modelSupportsStructuredOutput(model) && opts?.structuredOutput ? {\n          // @ts-expect-error structured output\n          response_format: zodResponseFormat(opts.structuredOutput.structure, opts.structuredOutput.name)\n        } : {}),\n      ...(this.supportsServiceTiering() && opts?.serviceTier && { service_tier: opts.serviceTier }),\n      ...(opts?.customOpts ? opts.customOpts : {}),\n    }\n  }\n\n  getRequestOptions(model: ChatModel, opts?: LlmCompletionOpts): RequestOptions {\n    return {\n      ...(opts?.timeout ? { timeout: opts?.timeout } : {}),\n    }\n  }\n\n  async getToolsOpts(model: ChatModel, opts?: LlmCompletionOpts): Promise<OpenAIToolOpts> {\n\n    // check if enabled\n    if (opts?.tools === false || !model.capabilities?.tools) {\n      return {}\n    }\n\n    // tools - convert PluginTool[] to OpenAI format\n    const toolDefs = await this.getAvailableTools(opts?.toolExecutionDelegate)\n    const tools = toOpenAITools(toolDefs)\n    if (!tools.length) return {}\n\n    // default chat-completions style\n    return {\n      tools: tools as any,\n      tool_choice: opts?.toolChoice?.type === 'tool' ? {\n        type: 'function',\n        function: { name: opts.toolChoice.name }\n      } : opts?.toolChoice?.type ?? 'auto',\n    }\n\n  }\n\n  async stop(stream: LlmStream) {\n    stream?.controller?.abort()\n  }\n\n  syncToolHistoryToThread(context: OpenAIStreamingContext): void {\n    // sync mutations from toolHistory back to thread\n    // OpenAI thread format: { role: 'tool', tool_call_id, name, content }\n    for (const entry of context.toolHistory) {\n      const threadEntry = context.thread.find(\n        (t: any) => t.role === 'tool' && t.tool_call_id === entry.id\n      )\n      if (threadEntry) {\n        threadEntry.content = JSON.stringify(entry.result)\n      }\n    }\n  }\n\n  async *processNativeChunk(chunk: ChatCompletionChunk, context: OpenAIStreamingContext): AsyncGenerator<LlmChunk> {\n\n    // response api events have already been translated to LLmChunk's\n    if (context.responsesApi) {\n      yield chunk as unknown as LlmChunk\n      return\n    }\n\n    // Guard malformed chunks without choices\n    if (!chunk?.choices || !Array.isArray(chunk.choices)) {\n      return\n    }\n\n    // debug\n    //console.dir(chunk, { depth: null })\n\n    // cumulate usage\n    if (chunk.usage && context.opts?.usage) {\n      this.accumulateUsage(context.usage, chunk.usage)\n    }\n\n    // tool calls - normalize and process\n    for (const tool_call of chunk.choices[0]?.delta?.tool_calls || []) {\n      if (tool_call?.function) {\n        const hasId = tool_call.id !== null && tool_call.id !== undefined && tool_call.id !== ''\n        const existingToolCall = hasId ? context.toolCalls.find(tc => tc.id === tool_call.id) : null\n\n        if (hasId && !existingToolCall) {\n          // New tool call - normalize as 'start'\n          yield* this.processToolCallChunk({\n            type: 'start',\n            id: tool_call.id,\n            name: tool_call.function.name || '',\n            args: tool_call.function.arguments || '',\n            message: chunk.choices[0].delta.tool_calls!.map((tc: any) => {\n              delete tc.index\n              return tc\n            }),\n            metadata: {\n              // @ts-expect-error reasoning details for some providers\n              reasoningDetails: chunk.choices[0]?.delta?.reasoning_details,\n            }\n          }, context)\n        } else {\n          // Delta - append to existing tool call (by id if parallel, otherwise last)\n          yield* this.processToolCallChunk({\n            type: 'delta',\n            id: hasId ? tool_call.id : undefined,\n            argumentsDelta: tool_call.function.arguments || '',\n          }, context)\n        }\n      }\n    }\n\n    // some providers (xai) do not send a finish_reason\n    if (context.toolCalls.length && this.doesNotSendToolCallFinishReason(context.model)) {\n      chunk.choices[0].finish_reason = chunk.choices[0].finish_reason || 'tool_calls'\n    }\n\n    // now tool calling\n    if (['tool_calls', 'function_call', 'stop'].includes(chunk.choices[0]?.finish_reason || '') && context.toolCalls?.length) {\n\n      // clear force tool call to avoid infinite loop\n      if (context.opts.toolChoice?.type === 'tool') {\n        delete context.opts.toolChoice\n      }\n\n      // increment round for next iteration\n      context.currentRound++\n\n      // execute tool calls using base class method\n      yield* this.executeToolCallsSequentially(context.toolCalls, context, {\n        formatToolCallForThread: (tc: LlmToolCall) => ({\n          role: 'assistant' as const,\n          content: context.textContent || '',\n          ...(this.requiresReasoningContent() ? { reasoning_content: context.reasoningContent } : {}),\n          ...(tc.reasoningDetails ? { reasoning_details: tc.reasoningDetails } : {}),\n          tool_calls: tc.message\n        }),\n        formatToolResultForThread: (result: any, tc: LlmToolCall) => ({\n          role: 'tool' as const,\n          tool_call_id: tc.id,\n          name: tc.function,\n          content: JSON.stringify(result),\n        }),\n        createNewStream: async () => this.doStream(context)\n      })\n\n      // done\n      return\n\n    }\n\n    // done?\n    const done = ['stop', 'length', 'content_filter', 'eos'].includes(chunk.choices?.[0]?.finish_reason || '')\n    if (done) {\n      context.done = true\n    }\n\n    // @ts-expect-error reasoning content for some providers\n    if (chunk.choices?.length && chunk.choices?.[0]?.delta?.reasoning_content) {\n      // @ts-expect-error reasoning content for some providers\n      context.reasoningContent += chunk.choices?.[0]?.delta?.reasoning_content\n      yield {\n        type: 'reasoning',\n        // @ts-expect-error reasoning content for some providers\n        text: chunk.choices?.[0]?.delta?.reasoning_content || '',\n        done: done,\n      }\n    }\n\n    // text chunk\n    if (chunk.choices?.length && (chunk.choices?.[0]?.delta?.content || done)) {\n      const text = chunk.choices?.[0]?.delta?.content || ''\n      if (!context.thinking) {\n        context.textContent += text\n      }\n      yield {\n        type: context.thinking ? 'reasoning' : 'content',\n        text: text,\n        done: done\n      }\n    }\n\n    // usage\n    if (context.opts?.usage && context.done && context.usage) {\n      yield { type: 'usage', usage: context.usage }\n    }\n\n  }\n\n  defaultRequiresFlatTextPayload(model: ChatModel, msg: Message): boolean {\n    return super.requiresFlatTextPayload(model, msg)\n  }\n\n  requiresFlatTextPayload(model: ChatModel, msg: Message): boolean {\n    return this.defaultRequiresFlatTextPayload(model, msg) || (this.client.baseURL?.length > 0 && this.client.baseURL !== defaultBaseUrl)\n  }\n\n  accumulateUsage(cumulate: LlmUsage, usage: CompletionUsage) {\n\n    cumulate.prompt_tokens += usage.prompt_tokens ?? 0\n    cumulate.completion_tokens += usage.completion_tokens ?? 0\n    \n    if (usage.prompt_tokens_details?.cached_tokens) {\n      cumulate.prompt_tokens_details!.cached_tokens! += usage.prompt_tokens_details?.cached_tokens\n    }\n    if (usage.prompt_tokens_details?.audio_tokens) {\n      cumulate.prompt_tokens_details!.audio_tokens! += usage.prompt_tokens_details?.audio_tokens\n    }\n    \n    if (usage.completion_tokens_details?.reasoning_tokens) {\n      cumulate.completion_tokens_details!.reasoning_tokens! += usage.completion_tokens_details?.reasoning_tokens\n    }\n    if (usage.completion_tokens_details?.audio_tokens) {\n      cumulate.completion_tokens_details!.audio_tokens! += usage.completion_tokens_details?.audio_tokens\n    }    \n  }\n\n  //\n  // Response API stuff\n  //\n\n  // ---------------------------------------------------------------------------\n  // Responses API – via official SDK with automatic tool execution\n  async responsesChat(model: ChatModel, thread: LlmCompletionPayload[], opts?: LlmCompletionOpts): Promise<LlmResponse> {\n\n    // log\n    logger.log(`[${this.getName()}] prompting model ${model.id}`)\n\n    // Build request for Responses API\n    const request = await this.buildResponsesRequest(model, thread, opts, false)\n\n    // init stuff\n    let text = ''\n    const toolCallInfo: LlmToolCallInfo[] = []\n    const usage: LlmUsage = zeroUsage()\n\n    // debug\n    logger.debug('[responses] REQUEST', JSON.stringify(request, null, 2))\n\n    // call\n    let response: Response = await this.client.responses.create(request) as Response\n\n    // we can loop several times calling tools\n    while (true) {\n\n      // update responseId tracking\n      logger.debug('[responses] RESPONSE', response)\n\n      // cumulate usage\n      if (opts?.usage && response.usage) {\n        this.accumulateResponsesUsage(usage, response.usage)\n      }\n\n      // concatenate text from the output array\n      const messages = response.output.filter((o: any) => o.type === 'message') as ResponseOutputMessage[]\n      for (const message of messages) {\n        for (const content of message.content) {\n          if (content.type === 'output_text') {\n            text += content.text || ''\n          }\n        }\n      }\n      \n      // check if we have tool calls\n      const toolCalls = response.output?.filter((o: any) => o.type === 'function_call') as ResponseFunctionToolCall[]\n      if (toolCalls.length) {\n\n        const followReqInput: any[] = []\n        for (const toolCall of toolCalls) {\n\n          // log\n          logger.log(`[openai] tool call ${toolCall.name} with ${toolCall.arguments}`)\n\n          // this can error\n          let args = null\n          try {\n            args = JSON.parse(toolCall.arguments)\n          } catch (err) {\n            throw new Error(`[openai] tool call ${toolCall.name} with invalid JSON args: \"${toolCall.arguments}\"`, { cause: err })\n          }\n\n          // now execute\n          let lastUpdate: PluginExecutionResult|undefined = undefined\n          for await (const update of this.callTool(\n            { model: model.id, abortSignal: opts?.abortSignal },\n            toolCall.name, args,\n            opts?.toolExecutionDelegate,\n            opts?.toolExecutionValidation,\n          )) {\n            if (update.type === 'result') {\n              lastUpdate = update\n            }\n          }\n\n          // process result\n          const { content, canceled } = this.processToolExecutionResult(\n            'openai',\n            toolCall.name,\n            args,\n            lastUpdate\n          )\n\n          // canceled - if validation denied, we should not continue the loop\n          if (canceled) {\n            // For responses API, we need to send the error back as the output\n            followReqInput.push({\n              type: 'function_call_output',\n              call_id: toolCall.call_id,\n              output: JSON.stringify({ error: 'Tool execution was canceled' }),\n            })\n            // save tool call info with canceled status\n            toolCallInfo.push({\n              name: toolCall.name,\n              params: args,\n              result: { error: 'Tool execution was canceled' }\n            })\n            // stop processing more tools\n            break\n          }\n\n          // store\n          followReqInput.push({\n            type: 'function_call_output',\n            call_id: toolCall.call_id,\n            output: typeof content === 'string' ? content : JSON.stringify(content),\n          })\n\n          // save tool call info\n          toolCallInfo.push({\n            name: toolCall.name,\n            params: args,\n            result: content\n          })\n        \n        }\n\n        // build follow-up request\n        const followUpReq: ResponseCreateParams = {\n          model: model.id,\n          previous_response_id: response.id,\n          input: followReqInput,\n          stream: false,\n        }\n        await this.attachResponsesTools(followUpReq, model, opts)\n        \n        // debug\n        logger.debug('[responses] FOLLOW-UP REQUEST', JSON.stringify(followUpReq, null, 2))\n\n        // continue\n        response = await this.client.responses.create(followUpReq)\n        continue\n      }\n\n      // done\n      return {\n        type: 'text',\n        content: text,\n        toolCalls: toolCallInfo,\n        openAIResponseId: response?.id,\n        ...(opts?.usage ? { usage: usage } : {}),\n      }\n    }\n  }\n\n  async responsesStream(model: ChatModel, thread: Message[], opts?: LlmCompletionOpts): Promise<LlmStreamingResponse<OpenAIStreamingContext>> {\n\n    // log\n    logger.log(`[${this.getName()}] prompting model ${model.id}`)\n\n    const request = await this.buildResponsesRequestFromMessages(model, thread, opts, true)\n    const stream = await this.client.responses.create(request) as AsyncIterable<ResponseStreamEvent>\n    logger.debug('[responsesStream] subscribed')\n\n    const context: OpenAIStreamingContext = {\n      model,\n      opts: opts || {},\n      usage: zeroUsage(),\n      thread: [],\n      toolCalls: [],\n      toolHistory: [],\n      currentRound: 0,\n      startTime: Date.now(),\n      reasoningContent: '',\n      textContent: '',\n      responsesApi: true,\n      thinking: false,\n    }\n\n    // async generator bound to preserve class context\n    async function* generator(this: any) {\n      \n      // track the response id\n      let responseId: string = ''\n\n      // we need to accumulate usage\n      const usage: LlmUsage = context.usage\n\n      // We may need to run multiple streaming passes if the model calls tools.\n      let currentStream: AsyncIterable<ResponseStreamEvent> | null = stream\n      while (true) {\n\n        // Track function-call tool invocations that the model initiates while streaming.\n        // We gather their incremental arguments and execute them once finalized.\n        const pendingCalls: ResponseFunctionToolCall[] = []\n        const toolExecutions = new Map<string, Promise<ResponsesToolExecutionResult>>()\n        const toolChunkQueue: LlmChunk[] = []\n        const preparationStatuses: Record<string, string> = {}\n        let thinking = false\n        let toolRoundStarted = false\n        let wakeToolChunks: (() => void) | null = null\n        let toolChunkWakePromise: Promise<void> | null = null\n\n        const getToolCallKey = (toolCall: ResponseFunctionToolCall, fallbackIndex?: number): string => {\n          return toolCall.id || toolCall.call_id || `${toolCall.name}:${fallbackIndex ?? pendingCalls.indexOf(toolCall)}`\n        }\n\n        const enqueueToolChunk = (chunk: LlmChunk) => {\n          toolChunkQueue.push(chunk)\n          if (wakeToolChunks) {\n            wakeToolChunks()\n            wakeToolChunks = null\n            toolChunkWakePromise = null\n          }\n        }\n\n        const ensureToolRoundStarted = () => {\n          if (!toolRoundStarted) {\n            context.currentRound++\n            context.toolCalls = []\n            context.startTime = Date.now()\n            toolRoundStarted = true\n          }\n        }\n\n        function* drainToolChunks() {\n          while (toolChunkQueue.length) {\n            yield toolChunkQueue.shift()!\n          }\n        }\n\n        const waitForToolChunks = (): Promise<void> => {\n          if (toolChunkQueue.length) {\n            return Promise.resolve()\n          }\n          if (!toolChunkWakePromise) {\n            toolChunkWakePromise = new Promise(resolve => {\n              wakeToolChunks = resolve\n            })\n          }\n          return toolChunkWakePromise\n        }\n\n        const findPendingCall = (item: any): ResponseFunctionToolCall | undefined => {\n          return pendingCalls.find(call => {\n            return (item.id && call.id === item.id) || (item.call_id && call.call_id === item.call_id)\n          })\n        }\n\n        const mergeToolCall = (target: ResponseFunctionToolCall, source: any) => {\n          if (source.name) target.name = source.name\n          if (source.call_id) target.call_id = source.call_id\n          if (typeof source.arguments === 'string' && source.arguments.length) {\n            target.arguments = source.arguments\n          }\n        }\n\n        const parseToolCallArgs = (toolCall: ResponseFunctionToolCall): any => {\n          const rawArgs = toolCall.arguments || ''\n          try {\n            return rawArgs.trim() ? JSON.parse(rawArgs) : {}\n          } catch (err) {\n            throw new Error(`[openai] tool call ${toolCall.name} with invalid JSON args: \"${rawArgs}\"`, { cause: err })\n          }\n        }\n\n        const startToolExecution = (toolCall: ResponseFunctionToolCall) => {\n          const key = getToolCallKey(toolCall)\n          if (toolExecutions.has(key)) {\n            return\n          }\n          ensureToolRoundStarted()\n\n          const args = parseToolCallArgs(toolCall)\n          const toolCallId = toolCall.call_id || toolCall.id || key\n          context.toolCalls.push({\n            id: toolCallId,\n            function: toolCall.name,\n            args,\n            message: toolCall,\n          })\n\n          enqueueToolChunk({\n            type: 'tool',\n            id: toolCall.id,\n            name: toolCall.name,\n            state: 'running',\n            status: this.getToolRunningDescription(toolCall.name, args),\n            call: {\n              params: args,\n              result: undefined\n            },\n            done: false\n          } as LlmChunk)\n\n          const execution = (async (): Promise<ResponsesToolExecutionResult> => {\n            try {\n              let lastUpdate: PluginExecutionResult|undefined = undefined\n              for await (const update of this.callTool({ model: model.id, abortSignal: opts?.abortSignal }, toolCall.name, args, opts?.toolExecutionDelegate, opts?.toolExecutionValidation)) {\n\n                if (opts?.abortSignal?.aborted) {\n                  enqueueToolChunk({\n                    type: 'tool',\n                    id: toolCall.id,\n                    name: toolCall.name,\n                    state: 'canceled',\n                    status: this.getToolCanceledDescription(toolCall.name, args) || 'Tool execution was canceled',\n                    done: true,\n                    call: {\n                      params: args,\n                      result: undefined\n                    }\n                  } as LlmChunk)\n                  return { canceled: true }\n                }\n\n                if (update.type === 'status') {\n                  enqueueToolChunk({\n                    type: 'tool',\n                    id: toolCall.id,\n                    name: toolCall.name,\n                    state: 'running',\n                    status: update.status,\n                    call: {\n                      params: args,\n                      result: undefined\n                    },\n                    done: false\n                  } as LlmChunk)\n\n                } else if (update.type === 'result') {\n                  lastUpdate = update\n                }\n\n              }\n\n              const { content, canceled: toolCallCanceled } = this.processToolExecutionResult(\n                'openai',\n                toolCall.name,\n                args,\n                lastUpdate\n              )\n\n              enqueueToolChunk({\n                type: 'tool',\n                id: toolCall.id,\n                name: toolCall.name,\n                state: toolCallCanceled ? 'canceled' : 'completed',\n                status: toolCallCanceled\n                  ? this.getToolCanceledDescription(toolCall.name, args) || (typeof content === 'object' ? content.error : undefined) || 'Tool execution was canceled'\n                  : this.getToolCompletedDescription(toolCall.name, args, content),\n                done: true,\n                call: {\n                  params: args,\n                  result: content\n                }\n              } as LlmChunk)\n\n              context.toolHistory.push({\n                id: toolCallId,\n                name: toolCall.name,\n                args,\n                result: content,\n                round: context.currentRound,\n              })\n\n              if (toolCallCanceled) {\n                return { canceled: true }\n              }\n\n              return {}\n\n            } catch (error) {\n              if (opts?.abortSignal?.aborted) {\n                enqueueToolChunk({\n                  type: 'tool',\n                  id: toolCall.id,\n                  name: toolCall.name,\n                  state: 'canceled',\n                  status: this.getToolCanceledDescription(toolCall.name, args),\n                  done: true,\n                  call: {\n                    params: args,\n                    result: undefined\n                  }\n                } as LlmChunk)\n                return { canceled: true }\n              }\n              return { error }\n            }\n          })()\n\n          toolExecutions.set(key, execution)\n        }\n\n        async function* waitForToolExecution(execution: Promise<ResponsesToolExecutionResult>): AsyncGenerator<LlmChunk, ResponsesToolExecutionResult> {\n          const executionDone = execution.then(result => ({ type: 'result' as const, result }))\n\n          while (true) {\n            if (toolChunkQueue.length) {\n              yield* drainToolChunks()\n              continue\n            }\n\n            const next = await Promise.race([\n              executionDone,\n              waitForToolChunks().then(() => ({ type: 'chunks' as const }))\n            ])\n\n            if (next.type === 'chunks') {\n              yield* drainToolChunks()\n              continue\n            }\n\n            yield* drainToolChunks()\n            return next.result\n          }\n        }\n\n        for await (const ev of currentStream!) {\n\n          switch (ev.type) {\n\n            case 'response.created':\n              responseId = ev.response.id\n              break\n\n            case 'response.in_progress':\n              yield {\n                type: 'openai_message_id',\n                id: ev.response.id,\n              }\n              break\n\n            case 'response.completed': {\n              if (opts?.usage && ev.response.usage) {\n                this.accumulateResponsesUsage(usage, ev.response.usage)\n              }\n              break\n            }\n\n            case 'response.output_item.added':\n              switch (ev.item.type) {\n                \n                case 'message':\n                  thinking = false\n                  break\n                \n                case 'reasoning':\n                  thinking = true\n                  break\n                \n                case 'function_call': {\n\n                  // record the tool call\n                  pendingCalls.push(ev.item)\n                  const partialArgs = this.parsePartialToolArgs(ev.item.arguments)\n                  const preparationStatus = this.getToolPreparationDescription(ev.item.name, partialArgs)\n                  const preparationStatusKey = ev.item.id || ev.item.call_id || ''\n                  preparationStatuses[preparationStatusKey] = preparationStatus\n\n                  // first notify\n                  yield {\n                    type: 'tool',\n                    id: ev.item.id,\n                    name: ev.item.name,\n                    state: 'preparing',\n                    status: preparationStatus,\n                    done: false\n                  }\n\n                  // done\n                  break\n                }\n              }\n              break\n\n            case 'response.output_item.done':\n              switch (ev.item.type) {\n                case 'reasoning':\n                  thinking = false\n                  break\n                case 'function_call': {\n                  const toolCall = findPendingCall(ev.item) || ev.item\n                  if (!pendingCalls.includes(toolCall)) {\n                    pendingCalls.push(toolCall)\n                  }\n                  mergeToolCall(toolCall, ev.item)\n                  startToolExecution(toolCall)\n                  break\n                }\n              }\n              break\n\n            case 'response.output_text.delta': {\n              if (ev.delta) {\n                yield {\n                  type: thinking ? 'reasoning' : 'content',\n                  text: ev.delta,\n                  done: false\n                }\n              }\n              break\n            }\n\n            case 'response.function_call_arguments.delta': {\n              const call = pendingCalls.find(c => c.id == ev.item_id)\n              if (call) {\n                call.arguments += ev.delta\n                const partialArgs = this.parsePartialToolArgs(call.arguments)\n                if (partialArgs !== undefined) {\n                  const status = this.getToolPreparationDescription(call.name, partialArgs)\n                  const preparationStatusKey = call.id || call.call_id || ''\n                  if (status !== preparationStatuses[preparationStatusKey]) {\n                    preparationStatuses[preparationStatusKey] = status\n                    yield {\n                      type: 'tool',\n                      id: call.id,\n                      name: call.name,\n                      state: 'preparing',\n                      status,\n                      done: false\n                    }\n                  }\n                }\n              }\n              break\n            }\n\n            case 'response.function_call_arguments.done': {\n              const call = pendingCalls.find(c => c.id == ev.item_id)\n              if (call) {\n                if (typeof ev.arguments === 'string') {\n                  call.arguments = ev.arguments\n                }\n                call.name = ev.name || call.name\n              }\n              break\n            }\n\n          }\n\n          yield* drainToolChunks()\n\n        }\n\n        // if no pending calls we are done\n        if (!pendingCalls.length) {\n          if (opts?.usage) {\n            yield { type: 'usage', usage: usage }\n          }\n          yield { type: 'content', text: '', done: true }\n          break\n        }\n\n        // Some providers/tests may omit response.output_item.done for function calls.\n        // Preserve the old behavior by starting any remaining tools after the stream ends.\n        for (const toolCall of pendingCalls) {\n          startToolExecution(toolCall)\n          yield* drainToolChunks()\n        }\n\n        // collect tool call results\n        for (const toolCall of pendingCalls) {\n\n          const execution = toolExecutions.get(getToolCallKey(toolCall))\n          if (!execution) {\n            continue\n          }\n\n          const result = yield* waitForToolExecution(execution)\n          if (result.error) {\n            throw result.error\n          }\n          if (result.canceled) {\n            return  // Stop processing remaining tools\n          }\n\n        }\n\n        await this.callHook('beforeToolCallsResponse', context)\n\n        const followReqInput = context.toolHistory\n          .filter((entry) => entry.round === context.currentRound)\n          .map((entry) => ({\n            type: 'function_call_output' as const,\n            call_id: entry.id,\n            output: typeof entry.result === 'string' ? entry.result : JSON.stringify(entry.result),\n          }))\n\n        // now we can build the follow-up request\n        const followReq: ResponseCreateParams = {\n          model: model.id,\n          previous_response_id: responseId,\n          input: followReqInput,\n          stream: true,\n        }\n        await this.attachResponsesTools(followReq, model, opts)\n        \n        // debug\n        logger.debug('[responsesStream] FOLLOW-UP STREAM REQ', JSON.stringify(followReq, null, 2))\n\n        // switch stream\n        currentStream = await this.client.responses.create(followReq) as AsyncIterable<ResponseStreamEvent>\n\n      }\n\n    }\n\n    return {\n      stream: (generator.bind(this))(),\n      context\n    }\n  }\n\n  private async buildResponsesRequestFromMessages(model: ChatModel, thread: Message[], opts: LlmCompletionOpts | undefined, stream: boolean): Promise<ResponseCreateParams> {\n    return this.buildResponsesRequest(model, this.buildPayload(model, thread, opts), opts, stream)\n  }\n\n  private async buildResponsesRequest(model: ChatModel, payload: LlmCompletionPayload[], opts: LlmCompletionOpts | undefined, stream: boolean): Promise<ResponseCreateParams> {\n    \n    // helper to extract text from messages\n    function extractText(msg: any): string {\n      const c = msg?.content\n      if (typeof c === 'string') return c\n      if (Array.isArray(c)) {\n        return c.map((p: any) => typeof p === 'string' ? p : (p.text ?? '')).join('')\n      }\n      if (c && typeof c === 'object' && typeof c.text === 'string') return c.text\n      return JSON.stringify(c)\n    }\n\n    function getToolCallId(toolCall: any): string {\n      return toolCall?.id || toolCall?.call_id || ''\n    }\n\n    function getToolCallName(toolCall: any): string {\n      return toolCall?.function?.name || toolCall?.name || ''\n    }\n\n    function getToolCallArguments(toolCall: any): string {\n      const args = toolCall?.function?.arguments ?? toolCall?.arguments ?? toolCall?.args\n      if (typeof args === 'string') return args\n      return JSON.stringify(args ?? {})\n    }\n\n    // rebuild the instructions\n    const instructions = payload\n      .filter((m: any) => m.role === 'system')\n      .map(extractText)\n      .join('\\n')\n      .trim()\n\n    // now we need to build the input\n    let input: string | ResponseInputItem[] = ''\n\n    // if we have a response id we will continue the response\n    if (opts?.responseId) {\n      input = extractText(payload[payload.length - 1])\n    } else {\n      input = []\n      for (const msg of payload) {\n        if (msg.role === 'user') {\n          input.push({\n            type: 'message',\n            role: 'user',\n            content: typeof msg.content === 'string' ?\n              msg.content :\n              msg.content.map((c: LlmContentPayload) => {\n                if (c.type === 'text') {\n                  return {\n                    type: 'input_text',\n                    text: c.text\n                  }\n                } else if (c.type === 'image_url') {\n                  return {\n                    type: 'input_image',\n                    detail: 'auto',\n                    image_url: (c as LLmContentPayloadImageOpenai).image_url.url,\n                  }\n                } else if (c.type === 'image') {\n                  return {\n                    type: 'input_image',\n                    detail: 'auto',\n                    image_url: c.source?.data,\n                  }\n                } else if (c.type === 'document') {\n                  return {\n                    type: 'input_file',\n                    file_data: c.source?.data,\n                  }\n                } else {\n                  // @ts-expect-error unknown content type\n                  console.log(`[openai] unknown content type ${c.type} in user message, using JSON.stringify`)\n                  return {\n                    type: 'input_text',\n                    text: JSON.stringify(c)\n                  }\n                }\n              }),\n\n          })\n\n        } else if (msg.role === 'assistant') {\n\n          const toolCalls = Array.isArray(msg.tool_calls) ? msg.tool_calls : []\n          const assistantText = extractText(msg)\n\n          if (assistantText || !toolCalls.length) {\n            input.push({\n              role: 'assistant',\n              content: assistantText\n            })\n          }\n\n          for (const toolCall of toolCalls) {\n            input.push({\n              type: 'function_call',\n              call_id: getToolCallId(toolCall),\n              name: getToolCallName(toolCall),\n              arguments: getToolCallArguments(toolCall),\n            })\n          }\n\n        // } else if (msg.role === 'assistant' && msg.messageId?.length) {\n\n        //   // dummy reasoning content\n        //   input.push({\n        //     type: 'reasoning',\n        //     id: msg.messageId.replace('resp_', 'rs_'),\n        //     summary: [],\n        //   })\n\n        //   // the message itself\n        //   input.push({\n        //     type: 'message',\n        //     role: 'assistant',\n        //     status: 'completed',\n        //     id: msg.messageId.replace('resp_', 'msg_'),\n        //     content: [{\n        //       type: 'output_text',\n        //       text: extractText(msg),\n        //       annotations: [],\n        //     }]\n        //   })\n\n        } else if (msg.role === 'tool') {\n          input.push({\n            type: 'function_call_output',\n            call_id: msg.tool_call_id || '',\n            output: msg.content || '',\n          })\n        }\n      }\n    }\n\n    const req: ResponseCreateParams = {\n      model: model.id,\n      ...(instructions ? { instructions } : {}),\n      ...(opts?.responseId ? { previous_response_id: opts.responseId } : {}),\n      ...(this.modelSupportsReasoningEffort(model) && opts?.reasoningEffort\n        ? { reasoning: { effort: opts.reasoningEffort } }\n        : {}),\n      input,\n      stream,\n    // The installed OpenAI SDK type may lag the Responses API's supported\n    // reasoning efforts (notably `xhigh`), while the wire format accepts it.\n    } as ResponseCreateParams\n\n    await this.attachResponsesTools(req, model, opts)\n\n    // done\n    return req\n  }\n\n  private async attachResponsesTools(req: ResponseCreateParams, model: ChatModel, opts?: LlmCompletionOpts): Promise<void> {\n    const tools = await this.getResponsesTools(model, opts)\n    if (!tools.length) {\n      return\n    }\n\n    req.tools = tools\n    req.tool_choice = this.getResponsesToolChoice(opts?.toolChoice)\n  }\n\n  async getResponsesTools(model: ChatModel, opts?: LlmCompletionOpts): Promise<Tool[]> {\n\n    // check if enabled\n    if (opts?.tools === false || !model.capabilities?.tools) {\n      return []\n    }\n\n    const internalTools = this.getOpenAIInternalTools(opts)\n\n    // tools - PluginTool[] format\n    const toolDefs = await this.getAvailableTools(opts?.toolExecutionDelegate)\n    if (!toolDefs.length) return internalTools\n\n    // convert PluginTool[] to Responses API Tool format\n    return [\n      ...internalTools,\n      ...toolDefs.map((tool): Tool => {\n\n        // Build properties object from PluginParameter[]\n        const properties: Record<string, any> = {}\n        let strict = true\n\n        for (const param of tool.parameters) {\n          const converted = this.pluginParamToResponsesSchema(param)\n          properties[param.name] = converted.schema\n          strict = strict && converted.strict\n        }\n\n        // Build parameters schema with strict mode requirements\n        // strict mode: required must list ALL property keys\n        const parameters = tool.parameters.length > 0 ? {\n          type: 'object',\n          properties,\n          required: Object.keys(properties),\n          additionalProperties: false,\n        } : {\n          type: 'object',\n          properties: {},\n          required: [],\n          additionalProperties: false,\n        }\n\n        return {\n          type: 'function',\n          name: tool.name,\n          description: tool.description,\n          parameters: parameters,\n          strict\n        }\n      })\n    ]\n\n  }\n\n  private getOpenAIInternalTools(opts?: LlmCompletionOpts): Tool[] {\n    return this.getInternalTools(this.getId(), opts).map((internalTool) => {\n      if ('tool' in internalTool) {\n        return internalTool.tool as Tool\n      }\n\n      if (internalTool.type === 'web_search') {\n        const tool: Record<string, any> = {\n          type: internalTool.version || 'web_search',\n        }\n        if (internalTool.searchContextSize) tool.search_context_size = internalTool.searchContextSize\n        if (internalTool.userLocation) tool.user_location = internalTool.userLocation\n        if (internalTool.allowedDomains) {\n          tool.filters = {\n            allowed_domains: internalTool.allowedDomains,\n          }\n        }\n        return tool as Tool\n      }\n\n      return internalTool as never\n    })\n  }\n\n  // Convert a single PluginParameter to Responses API strict mode schema\n  private pluginParamToResponsesSchema(param: any): ResponsesSchemaConversion {\n    const type = param.type || (param.items ? 'array' : 'string')\n    const schema: any = {\n      type,\n      ...(param.description ? { description: param.description } : {}),\n      ...(param.enum ? { enum: param.enum } : {}),\n    }\n\n    const passthroughKeys = [\n      'properties', 'additionalProperties', 'anyOf', 'oneOf', 'allOf',\n      '$defs', 'definitions', 'format', 'minimum', 'maximum', 'minLength',\n      'maxLength', 'minItems', 'maxItems',\n    ]\n\n    for (const key of passthroughKeys) {\n      if (param[key] !== undefined) {\n        schema[key] = param[key]\n      }\n    }\n\n    if (type === 'array' && param.items) {\n      schema.items = param.items\n    }\n\n    return this.normalizeSchemaForResponses(schema, param.required === false)\n  }\n\n  // Helper to convert items for Responses API strict mode\n  // Responses API strict mode: required must list ALL property keys\n  private normalizeSchemaForResponses(schema: any, nullable = false): ResponsesSchemaConversion {\n    if (!schema || typeof schema !== 'object' || Array.isArray(schema)) {\n      return this.normalizeSchemaForResponses({ type: 'string' }, nullable)\n    }\n\n    const normalized = { ...schema }\n    let strict = true\n\n    if (Array.isArray(normalized.type) && normalized.type.some((entry: any) => typeof entry === 'object')) {\n      const variants = normalized.type.map((entry: any) => typeof entry === 'string' ? { type: entry } : entry)\n      delete normalized.type\n      normalized.anyOf = [\n        ...(Array.isArray(normalized.anyOf) ? normalized.anyOf : []),\n        ...variants,\n      ]\n    }\n\n    const objectLike = this.schemaHasType(normalized, 'object') || normalized.properties !== undefined\n    if (objectLike) {\n      if (!normalized.type && !normalized.anyOf && !normalized.oneOf) {\n        normalized.type = 'object'\n      }\n\n      if (Array.isArray(normalized.properties)) {\n        const properties: Record<string, any> = {}\n        for (const prop of normalized.properties) {\n          const converted = this.pluginParamToResponsesSchema(prop)\n          properties[prop.name] = converted.schema\n          strict = strict && converted.strict\n        }\n        normalized.properties = properties\n      } else if (normalized.properties && typeof normalized.properties === 'object') {\n        const originalRequired = new Set(Array.isArray(normalized.required) ? normalized.required : [])\n        const hasOriginalRequired = Array.isArray(normalized.required)\n        const properties: Record<string, any> = {}\n\n        for (const [key, value] of Object.entries(normalized.properties)) {\n          const converted = this.normalizeSchemaForResponses(value, hasOriginalRequired && !originalRequired.has(key))\n          properties[key] = converted.schema\n          strict = strict && converted.strict\n        }\n\n        normalized.properties = properties\n      } else {\n        normalized.properties = {}\n      }\n\n      normalized.required = Object.keys(normalized.properties)\n\n      if (normalized.additionalProperties === undefined || normalized.additionalProperties === false) {\n        normalized.additionalProperties = false\n      } else {\n        strict = false\n      }\n    }\n\n    if (this.schemaHasType(normalized, 'array') || normalized.items !== undefined) {\n      const convertedItems = this.normalizeSchemaForResponses(normalized.items || { type: 'string' })\n      normalized.items = convertedItems.schema\n      strict = strict && convertedItems.strict\n    }\n\n    for (const key of ['anyOf', 'oneOf', 'allOf']) {\n      if (Array.isArray(normalized[key])) {\n        normalized[key] = normalized[key].map((entry: any) => {\n          const converted = this.normalizeSchemaForResponses(entry)\n          strict = strict && converted.strict\n          return converted.schema\n        })\n      }\n    }\n\n    const result = nullable ? this.makeSchemaNullable(normalized) : normalized\n    return { schema: result, strict }\n  }\n\n  private schemaHasType(schema: any, type: string): boolean {\n    return schema.type === type || (Array.isArray(schema.type) && schema.type.includes(type))\n  }\n\n  private makeSchemaNullable(schema: any): any {\n    if (schema.enum && !schema.enum.includes(null)) {\n      schema.enum = [...schema.enum, null]\n    }\n\n    if (typeof schema.type === 'string') {\n      if (schema.type !== 'null') {\n        schema.type = [schema.type, 'null']\n      }\n    } else if (Array.isArray(schema.type)) {\n      if (!schema.type.includes('null')) {\n        schema.type = [...schema.type, 'null']\n      }\n    } else if (Array.isArray(schema.anyOf)) {\n      if (!schema.anyOf.some((entry: any) => entry?.type === 'null')) {\n        schema.anyOf = [...schema.anyOf, { type: 'null' }]\n      }\n    } else {\n      schema.anyOf = [{ ...schema }, { type: 'null' }]\n    }\n\n    return schema\n  }\n\n  private getResponsesToolChoice(toolChoice?: LlmToolChoice): ToolChoiceOptions|ToolChoiceFunction {\n\n    if (!toolChoice) {\n      return 'auto'\n    }\n\n    switch (toolChoice.type) {\n      case 'none':\n        return 'none'\n      case 'auto':\n        return 'auto'\n      case 'required':\n        return 'required'\n      case 'tool':\n        return {\n          type: 'function',\n          name: toolChoice.name\n        }\n    }\n\n  }\n\n  async continueResponse(model: ChatModel, previousId: string, input: string, opts?: LlmCompletionOpts): Promise<LlmResponse> {\n    const req: any = {\n      model: model.id,\n      input: [{ type: 'message', role: 'user', content: input }],\n      previous_response_id: previousId,\n      stream: false,\n    }\n    const toolOpts = await this.getToolsOpts(model, opts)\n    if ((toolOpts as any).tools) req.tools = (toolOpts as any).tools\n\n    const resp: any = await (this.client as any).responses.create(req)\n    return {\n      type: 'text',\n      content: (resp.output?.text) ?? '',\n      ...(opts?.usage && resp.usage ? { usage: resp.usage } : {}),\n    }\n  }\n\n  async forkResponse(model: ChatModel, previousId: string, input: string, opts?: LlmCompletionOpts): Promise<LlmResponse> {\n    // For fork we simply call continueResponse for now (no server-side diff yet)\n    return await this.continueResponse(model, previousId, input, opts)\n  }\n\n  private accumulateResponsesUsage(cumulate: LlmUsage, usage: ResponseUsage) {\n    cumulate.prompt_tokens += usage.input_tokens\n    cumulate.completion_tokens += usage.output_tokens\n    cumulate.prompt_tokens_details!.cached_tokens! += usage.input_tokens_details.cached_tokens\n    cumulate.completion_tokens_details!.reasoning_tokens! += usage.output_tokens_details.reasoning_tokens\n  }\n\n}\n","import Anthropic from '@anthropic-ai/sdk'\nimport { ContentBlockParam, InputJSONDelta, MessageCreateParams, MessageDeltaUsage, MessageParam, RawMessageDeltaEvent, RawMessageStartEvent, RawMessageStreamEvent, TextBlock, Tool, ToolChoice, ToolUseBlock, Usage } from '@anthropic-ai/sdk/resources'\nimport { MessageCreateParamsBase } from '@anthropic-ai/sdk/resources/messages/messages'\nimport { BetaToolUnion } from '@anthropic-ai/sdk/resources/beta/messages/messages'\nimport { minimatch } from 'minimatch'\nimport LlmEngine from '../engine'\nimport logger from '../logger'\nimport Attachment from '../models/attachment'\nimport Message from '../models/message'\nimport { Plugin } from '../plugin'\nimport { ChatModel, EngineCreateOpts, ModelAnthropic, ModelCapabilities } from '../types/index'\nimport { LlmChunk, LlmCompletionOpts, LlmCompletionPayload, LlmResponse, LlmStream, LlmStreamingContext, LlmStreamingResponse, LlmToolCallInfo, LlmUsage } from '../types/llm'\nimport { addUsages, zeroUsage } from '../usage'\nimport { pluginParamToJsonSchema } from '../tools'\nimport { PluginExecutionResult, PluginParameter } from '../types/plugin'\n\n//\n// https://docs.anthropic.com/en/api/getting-started\n//\n\ntype AnthropicTool = Tool|BetaToolUnion\n\nexport type AnthropicCompletionOpts = LlmCompletionOpts & {\n  system?: string\n}\n\nconst kAnthropicCachedItems = 4\n\nexport interface AnthropicComputerToolInfo {\n  plugin: Plugin\n  screenSize(): { width: number, height: number }\n  screenNumber (): number\n}\n\nexport type AnthropicStreamingContext = LlmStreamingContext<MessageParam> & {\n  system: string\n  requestUsage: LlmUsage\n  thinkingBlock?: string\n  thinkingSignature?: string\n  textContentBlock?: string\n  firstTextBlockStart: boolean\n}\n\nexport default class extends LlmEngine {\n\n  client: Anthropic\n  computerInfo: AnthropicComputerToolInfo|null = null\n\n constructor(config: EngineCreateOpts, computerInfo: AnthropicComputerToolInfo|null = null) {\n    super(config)\n    this.client = new Anthropic({\n      apiKey: config.apiKey,\n      baseURL: config.baseURL,\n      dangerouslyAllowBrowser: true,\n    })\n    this.computerInfo = computerInfo\n  }\n\n  // Convert PluginParameter[] to Anthropic input_schema format\n  private toolDefinitionToInputSchema(parameters: PluginParameter[]): Tool['input_schema'] {\n    const properties: Record<string, any> = {}\n    const required: string[] = []\n\n    for (const param of parameters) {\n      const type = param.type || (param.items ? 'array' : 'string')\n      const prop: any = {\n        type,\n        description: param.description,\n        ...(param.enum ? { enum: param.enum } : {}),\n      }\n      if (type === 'array') {\n        prop.items = this.convertItems(param.items)\n      }\n      properties[param.name] = prop\n      if (param.required) {\n        required.push(param.name)\n      }\n    }\n\n    return {\n      type: 'object',\n      properties,\n      required,\n    }\n  }\n\n  private convertItems(items: PluginParameter['items']): any {\n    if (!items) return { type: 'string' }\n    if (!items.properties) {\n      if (items.type === 'array' && items.items) {\n        return { type: 'array', items: { type: items.items.type || 'string' } }\n      }\n      return { type: items.type }\n    }\n    const props: Record<string, any> = {}\n    const required: string[] = []\n    for (const prop of items.properties) {\n      props[prop.name] = pluginParamToJsonSchema(prop)\n      if (prop.required) {\n        required.push(prop.name)\n      }\n    }\n    return {\n      type: items.type || 'object',\n      properties: props,\n      required,\n    }\n  }\n\n  getId(): string {\n    return 'anthropic'\n  }\n\n  // https://docs.anthropic.com/en/docs/about-claude/models\n\n  getModelCapabilities(model: ModelAnthropic): ModelCapabilities {\n\n    const visionGlobs = [\n      'claude-3-*',\n      'claude-*-4-*',\n      'computer-use',\n    ]\n\n    const reasoning = model.id === 'claude-3-7-sonnet-thinking' ||\n      model.id.includes('claude-3-7') ||\n      model.id.includes('claude-3.7') ||\n      minimatch(model.id, 'claude-*-4-*')\n\n    const cachingGlobs = [\n      'claude-opus-4-*',\n      'claude-sonnet-4-*',\n      'claude-3-7-sonnet-*',\n      'claude-3-5-sonnet-*',\n      'claude-3-5-haiku-*',\n      'claude-3-opus-*',\n      'claude-3-haiku-*',\n    ]\n\n    return {\n      tools: true,\n      vision: visionGlobs.some((m) => minimatch(model.id, m)),\n      reasoning,\n      caching: cachingGlobs.some((m) => minimatch(model.id, m)),\n    }\n\n  }\n  \n  getComputerUseRealModel(): string {\n    return 'claude-3-5-sonnet-20241022'\n  }\n\n  isComputerUseModel(model: string): boolean {\n    return ['computer-use'].includes(model)\n  }\n\n  getMaxTokens(model: string): number {\n    if (model === 'computer-use') return this.getMaxTokens(this.getComputerUseRealModel())\n    if (model.includes('claude-opus-4')) return 32000\n    if (model.includes('claude-sonnet-4')) return 64000\n    if (model.includes('claude-3-7-')) return 64000\n    if (model.includes('claude-3-5-')) return 8192\n    else return 4096\n  }\n\n  async getModels(): Promise<ModelAnthropic[]> {\n\n    // need an api key\n    if (!this.client.apiKey) {\n      return []\n    }\n\n    // do it\n    const models = await this.client.models.list({ limit: 1000 })\n\n    // transform\n    return [\n      ...models.data, {\n        'type': 'model',  id: 'computer-use', display_name: 'Computer Use', created_at: '1970-01-01T00:00:00Z'\n      }\n    ]\n\n  }\n\n  async complete(model: ChatModel, thread: Message[], opts?: LlmCompletionOpts): Promise<LlmResponse> {\n    return await this.chat(model, this.buildAnthropicPayload(model, thread, opts), {\n      ...opts,\n      system: thread[0].contentForModel\n    })\n  }\n\n  async chat(model: ChatModel, thread: MessageParam[], opts?: AnthropicCompletionOpts): Promise<LlmResponse> {\n\n    // model\n    if (model.id === 'computer-use') {\n      model = this.toModel(this.getComputerUseRealModel())\n    }\n\n    // save tool calls\n    const toolCallInfo: LlmToolCallInfo[] = []\n    const startTime = Date.now()\n\n    // call\n    logger.log(`[anthropic] prompting model ${model.id}`)\n    const response = await this.client.messages.create(this.cacheRequest(model, opts ?? {}, {\n      model: model.id,\n      system: opts?.system,\n      messages: thread,\n      ...this.getCompletionOpts(model, opts),\n      ...await this.getToolOpts(model, opts),\n    }));\n\n    // tool call\n    if (response.stop_reason === 'tool_use') {\n\n      const toolCall = response.content[response.content.length - 1] as ToolUseBlock\n      \n      // need\n      logger.log(`[anthropic] tool call ${toolCall.name} with ${JSON.stringify(toolCall.input)}`)\n\n        // now execute\n        let lastUpdate: PluginExecutionResult|undefined = undefined\n        for await (const update of this.callTool(\n          { model: model.id, abortSignal: opts?.abortSignal },\n          toolCall.name, toolCall.input,\n          opts?.toolExecutionDelegate,\n          opts?.toolExecutionValidation,\n        )) {\n          if (update.type === 'result') {\n            lastUpdate = update\n          }\n        }\n\n        // process result\n        const { content, canceled: toolCallCanceled } = this.processToolExecutionResult(\n          'anthropic',\n          toolCall.name,\n          toolCall.input,\n          lastUpdate\n        )\n\n        // For non-streaming, throw immediately on cancel\n        if (toolCallCanceled) {\n          throw new Error('Tool execution was canceled')\n        }\n\n      // add all response blocks\n      thread.push(...response.content.map((c) => ({\n        role: 'assistant' as const,\n        content: [c]\n      })))\n\n      // add tool response message\n      if (toolCall!.name === 'computer') {\n        thread.push({\n          role: 'user' as const,\n          content: [{\n            type: 'tool_result' as const,\n            tool_use_id: toolCall.id,\n            ...content,\n          }]\n        })\n      } else {\n        thread.push({\n          role: 'user' as const,\n          content: [{\n            type: 'tool_result' as const,\n            tool_use_id: toolCall.id,\n            content: JSON.stringify(content)\n          }]\n        })\n      }\n\n      // save tool call info\n      toolCallInfo.push({\n        name: toolCall.name,\n        params: toolCall.input,\n        result: content\n      })\n\n      // apply cooldown before next request\n      await this.applyCooldown(startTime)\n\n      // prompt again\n      const completion = await this.chat(model, thread, opts)\n\n      // prepend tool call info\n      completion.toolCalls = [\n        ...toolCallInfo,\n        ...completion.toolCalls ?? [],\n      ]\n\n      // cumulate usage\n      if (opts?.usage && response.usage && completion.usage) {\n        completion.usage.prompt_tokens += response.usage.input_tokens\n        completion.usage.completion_tokens += response.usage.output_tokens\n      }\n\n      // done\n      return completion\n\n    }\n\n    // return an object\n    const textBlocks = response.content.filter((block): block is TextBlock => block.type === 'text' || ('text' in block && typeof block.text === 'string'))\n    return {\n      type: 'text',\n      content: textBlocks.map((block) => block.text).join(''),\n      toolCalls: toolCallInfo,\n      ...(opts?.usage && response.usage ? { usage: {\n        prompt_tokens: response.usage.input_tokens,\n        completion_tokens: response.usage.output_tokens,\n      } } : {}),\n    }\n  }\n\n  async stream(model: ChatModel, thread: Message[], opts?: LlmCompletionOpts): Promise<LlmStreamingResponse<AnthropicStreamingContext>> {\n\n    // model: switch to vision if needed\n    model = this.selectModel(model, thread, opts)\n\n    // add computer tools\n    if (this.computerInfo && model.id === 'computer-use') {\n      const computerUse = this.plugins.find((p) => p.getName() === this.computerInfo!.plugin.getName())\n      if (!computerUse) {\n        this.plugins.push(this.computerInfo.plugin)\n      }\n    }\n\n    // the context\n    const context: AnthropicStreamingContext = {\n      model: model,\n      system: thread[0].contentForModel,\n      thread: this.buildAnthropicPayload(model, thread, opts),\n      toolCalls: [],\n      toolHistory: [],\n      currentRound: 0,\n      startTime: 0,\n      opts: opts || {},\n      usage: zeroUsage(),\n      requestUsage: zeroUsage(),\n      firstTextBlockStart: true\n    }\n\n    // do it\n    return {\n      stream: await this.doStream(context),\n      context: context,\n    }\n\n  }\n\n  async doStream(context: AnthropicStreamingContext): Promise<LlmStream> {\n\n    // reset\n    context.toolCalls = []\n    context.startTime = Date.now()\n    context.requestUsage = zeroUsage()\n    context.thinkingBlock = undefined\n    context.thinkingSignature = ''\n    context.textContentBlock = undefined\n\n    // tools in anthropic format\n    const tools: AnthropicTool[] = (await this.getAvailableTools(context.opts?.toolExecutionDelegate)).map((tool) => {\n      return {\n        name: tool.name,\n        description: tool.description,\n        input_schema: this.toolDefinitionToInputSchema(tool.parameters),\n      }\n    })\n\n    // add computer tools\n    if (this.computerInfo && context.model.id === 'computer-use') {\n      const scaledScreenSize = this.computerInfo.screenSize()\n      tools.push({\n        name: 'computer',\n        type: 'computer_20241022',\n        display_width_px: scaledScreenSize.width,\n        display_height_px: scaledScreenSize.height,\n        display_number: this.computerInfo.screenNumber()\n      })\n    }\n\n    // call\n    if (context.model.id === 'computer-use') {\n      return this.doStreamBeta(context)\n    } else {\n      return this.doStreamNormal(context)\n    }\n\n  }\n\n  async doStreamNormal(context: AnthropicStreamingContext): Promise<LlmStream> {\n    logger.log(`[anthropic] prompting model ${context.model.id}`)\n    return this.client.messages.create(this.cacheRequest(context.model, context.opts, {\n      model: context.model.id,\n      system: context.system,\n      messages: context.thread,\n      ...this.getCompletionOpts(context.model, context.opts),\n      ...await this.getToolOpts<MessageCreateParams>(context.model, context.opts),\n      stream: true,\n    }))\n  }\n\n  async doStreamBeta(context: AnthropicStreamingContext): Promise<LlmStream> {\n    logger.log(`[anthropic] prompting model ${context.model.id}`)\n    return this.client.beta.messages.create(this.cacheRequest(context.model, context.opts, {\n      model: this.getComputerUseRealModel(),\n      betas: [ 'computer-use-2024-10-22' ],\n      system: context.system,\n      messages: context.thread,\n      ...this.getCompletionOpts(context.model, context.opts),\n      ...await this.getToolOpts<MessageCreateParams>(context.model, context.opts),\n      stream: true,\n    }))\n  }\n\n  getCompletionOpts(model: ChatModel, opts?: LlmCompletionOpts): Omit<MessageCreateParamsBase, 'model'|'messages'|'stream'|'tools'|'tool_choice'> {\n\n    const isThinkingEnabled = model.capabilities?.reasoning && opts?.reasoning !== false;\n    \n    return {\n      max_tokens: opts?.maxTokens ?? this.getMaxTokens(model.id),\n      ...(opts?.temperature ? { temperature: opts.temperature } : (isThinkingEnabled ? { temperature: 1.0 } : {})),\n      ...(opts?.top_k ? { top_k: opts?.top_k } : {} ),\n      ...(opts?.top_p ? { top_p: opts?.top_p } : {} ),\n      ...(isThinkingEnabled ? {\n        thinking: {\n          type: 'enabled',\n          budget_tokens: opts?.reasoningBudget || 1024,\n        }\n      } : {}),\n    }\n  }\n\n  async getToolOpts<T>(model: ChatModel, opts?: LlmCompletionOpts): Promise<Omit<T, 'max_tokens'|'model'|'messages'|'stream'>> {\n\n    if (opts?.tools === false) {\n      return {} as T\n    }\n\n    // tools in anthropic format\n    const tools: AnthropicTool[] = (await this.getAvailableTools(opts?.toolExecutionDelegate)).map((tool) => {\n      return {\n        name: tool.name,\n        description: tool.description,\n        input_schema: this.toolDefinitionToInputSchema(tool.parameters),\n      }\n    })\n    tools.push(...this.getAnthropicInternalTools(opts))\n\n    let toolChoice: ToolChoice = { type: 'auto' }\n    if (opts?.toolChoice?.type === 'auto' || opts?.toolChoice?.type === 'none') {\n      toolChoice = opts.toolChoice\n    } else if (opts?.toolChoice?.type === 'required') {\n      toolChoice = { type: 'any' }\n    } else if (opts?.toolChoice?.type === 'tool') {\n      toolChoice = { type: 'tool', name: opts.toolChoice.name }\n    }\n\n    // done\n    return tools.length ? {\n      tool_choice: toolChoice,\n      tools: tools as Tool[]\n    } as T : {} as T \n  }\n\n  private getAnthropicInternalTools(opts?: LlmCompletionOpts): AnthropicTool[] {\n    return this.getInternalTools(this.getId(), opts).map((internalTool) => {\n      if ('tool' in internalTool) {\n        return internalTool.tool as AnthropicTool\n      }\n\n      if (internalTool.type === 'web_search') {\n        const tool: Record<string, any> = {\n          type: internalTool.version || 'web_search_20250305',\n          name: 'web_search',\n        }\n        if (internalTool.maxUses !== undefined) tool.max_uses = internalTool.maxUses\n        if (internalTool.allowedDomains) tool.allowed_domains = internalTool.allowedDomains\n        if (internalTool.blockedDomains) tool.blocked_domains = internalTool.blockedDomains\n        if (internalTool.userLocation) tool.user_location = internalTool.userLocation\n        return tool as AnthropicTool\n      }\n\n      return internalTool as never\n    })\n  }\n\n  cacheRequest<T extends MessageCreateParamsBase>(model: ChatModel, opts: LlmCompletionOpts, params: T): T {\n\n    // no caching\n    if (!opts.caching) {\n      return params\n    }\n\n    // not all models support caching\n    if (!model.capabilities.caching) {\n      return params\n    }\n\n    // calculate length of description of tool and each properties for each tool\n    const itemsSizes: { name: string, size: number }[] = []\n    for (const tool of params.tools as Tool[] || []) {\n      if (!('description' in tool)) continue\n      const descriptionLength = tool.description ? tool.description.length : 0\n      const propertiesLength = 'input_schema' in tool ? Object.values(tool.input_schema.properties || {}).reduce((propAcc, prop) => {\n        return propAcc + (prop.description ? prop.description.length : 0)\n      }, 0) : 0\n      if (descriptionLength + propertiesLength === 0) continue\n      itemsSizes.push({ name: tool.name, size: descriptionLength + propertiesLength })\n    }\n\n    // add system prompt\n    const systemPromptName = '__system__prompt__'\n    if (typeof params.system === 'string') {\n      itemsSizes.push({ name: systemPromptName, size: params.system.length })\n    }\n\n    const sortedItems = itemsSizes.sort((a, b) => b.size - a.size).slice(0, kAnthropicCachedItems).map(tool => tool.name)\n    for (const item of sortedItems) {\n      if (item === systemPromptName) {\n        params.system = [{\n          type: 'text',\n          text: params.system as string,\n          cache_control: { type: 'ephemeral',  }\n        }]\n\n      } else {\n        const tool = params.tools?.find((t: any) => t.name === item)\n        if (tool) {\n          tool.cache_control = { type: 'ephemeral', }\n        }\n      }\n    }\n\n    // done\n    return params\n\n  }\n\n  async stop(stream: LlmStream): Promise<void> {\n    stream.controller?.abort()\n  }\n\n  syncToolHistoryToThread(context: AnthropicStreamingContext): void {\n    // sync mutations from toolHistory back to thread\n    // Anthropic thread format: { role: 'user', content: [{ type: 'tool_result', tool_use_id, content }] }\n    for (const entry of context.toolHistory) {\n      for (const msg of context.thread) {\n        if (msg.role === 'user' && Array.isArray(msg.content)) {\n          for (const block of msg.content) {\n            if (typeof block === 'object' && 'type' in block && block.type === 'tool_result' && 'tool_use_id' in block && block.tool_use_id === entry.id) {\n              (block as any).content = JSON.stringify(entry.result)\n            }\n          }\n        }\n      }\n    }\n  }\n\n  async *processNativeChunk(chunk: RawMessageStreamEvent, context: AnthropicStreamingContext): AsyncGenerator<LlmChunk> {\n    \n    // log\n    //console.dir(chunk, { depth: null })\n\n    // usage\n    const usage: Usage|MessageDeltaUsage = (chunk as RawMessageStartEvent).message?.usage ?? (chunk as RawMessageDeltaEvent).usage\n    if (context.usage && usage) {\n      if ('input_tokens' in usage) {\n        context.requestUsage.prompt_tokens = (usage as Usage).input_tokens ?? 0\n      }\n      if ('cache_read_input_tokens' in usage && context.requestUsage.prompt_tokens_details?.cached_tokens !== undefined) {\n        context.requestUsage.prompt_tokens_details.cached_tokens = (usage as Usage).cache_read_input_tokens ?? 0\n      }\n      context.requestUsage.completion_tokens = usage.output_tokens ?? 0\n    }\n\n    // done\n    if (chunk.type == 'message_stop') {\n      yield { type: 'content', text: '', done: true }\n      if (context.opts.usage) {\n        context.usage = addUsages(context.usage, context.requestUsage)\n        yield { type: 'usage', usage: context.usage }\n      }\n    }\n\n    // block start\n    if (chunk.type == 'content_block_start') {\n\n      if (chunk.content_block.type == 'text') {\n        if (!context.firstTextBlockStart) {\n          yield { type: 'content', text: '\\n\\n', done: false }\n        }\n        context.firstTextBlockStart = false\n      }\n\n      if (chunk.content_block.type == 'thinking') {\n        context.thinkingBlock = ''\n      }\n\n      if (chunk.content_block.type == 'tool_use') {\n        // New tool call - normalize as 'start'\n        yield* this.processToolCallChunk({\n          type: 'start',\n          id: chunk.content_block.id,\n          name: chunk.content_block.name,\n          args: '',\n        }, context)\n      }\n    }\n\n    // block delta\n    if (chunk.type == 'content_block_delta') {\n\n      // tool use - normalize as 'delta'\n      if (chunk.delta.type === 'input_json_delta' && context.toolCalls.length) {\n        const toolDelta = chunk.delta as InputJSONDelta\n        yield* this.processToolCallChunk({\n          type: 'delta',\n          argumentsDelta: toolDelta.partial_json,\n        }, context)\n      }\n\n      // thinking\n      if (chunk.delta.type === 'thinking_delta') {\n        context.thinkingBlock += chunk.delta.thinking\n        yield { type: 'reasoning', text: chunk.delta.thinking, done: false }\n      }\n\n      // thinking signature\n      if (chunk.delta.type === 'signature_delta') {\n        context.thinkingSignature = chunk.delta.signature\n      }\n\n      // citation\n      if (chunk.delta.type === 'citations_delta') {\n        yield { type: 'content', text: chunk.delta.citation.cited_text, done: false }\n      }\n\n      // text\n      if (chunk.delta.type === 'text_delta') {\n        context.textContentBlock = (context.textContentBlock || '') + chunk.delta.text\n        yield { type: 'content', text: chunk.delta.text, done: false }\n      }\n\n    }\n\n    // tool call?\n    if (chunk.type == 'message_delta') {\n\n      if (chunk.delta.stop_reason == 'tool_use' && context.toolCalls.length) {\n\n        // clear force tool call to avoid infinite loop\n        if (context.opts.toolChoice?.type === 'tool') {\n          delete context.opts.toolChoice\n        }\n\n        // increment round for next iteration\n        context.currentRound++\n\n        // add usage before continuing\n        if (context.opts.usage) {\n          context.usage = addUsages(context.usage, context.requestUsage)\n          context.requestUsage = zeroUsage()\n        }\n\n        // execute tool calls using base class method\n        yield* this.executeToolCallsBatched(context.toolCalls, context, {\n          formatBatchForThread: (completed) => {\n            // build assistant content: thinking + text + tool uses\n            const assistantContent: ContentBlockParam[] = []\n\n            // add thinking block first if present\n            if (context.thinkingBlock) {\n              assistantContent.push({\n                type: 'thinking',\n                thinking: context.thinkingBlock,\n                signature: context.thinkingSignature || ''\n              })\n            }\n\n            // add accumulated text content if present\n            if (context.textContentBlock) {\n              assistantContent.push({\n                type: 'text',\n                text: context.textContentBlock\n              })\n            }\n\n            // add tool uses\n            for (const { tc, args } of completed) {\n              assistantContent.push({\n                type: 'tool_use' as const,\n                id: tc.id,\n                name: tc.function,\n                input: args,\n              })\n            }\n\n            // assistant message with all content\n            const toolUses: MessageParam = {\n              role: 'assistant',\n              content: assistantContent\n            }\n\n            // user message with all tool results\n            const toolResults: MessageParam = {\n              role: 'user',\n              content: completed.map(({ tc, result }) => {\n                // computer tool spreads content, others stringify\n                if (tc.function === 'computer') {\n                  return {\n                    type: 'tool_result' as const,\n                    tool_use_id: tc.id,\n                    ...result,\n                  }\n                }\n                return {\n                  type: 'tool_result' as const,\n                  tool_use_id: tc.id,\n                  content: JSON.stringify(result)\n                }\n              })\n            }\n\n            return [toolUses, toolResults]\n          },\n          createNewStream: async () => this.doStream(context)\n        })\n\n        // done\n        return\n\n      }\n\n    }\n\n  }\n\n  addTextToPayload(model: ChatModel, message: Message, attachment: Attachment, payload: LlmCompletionPayload, opts?: LlmCompletionOpts): void {\n    if (Array.isArray(payload.content)) {\n      payload.content.push({\n        type: 'document',\n        source: {\n          type: 'text',\n          media_type: 'text/plain',\n          data: attachment!.content,\n        },\n        ...(attachment!.title.length ? { title: attachment!.title } : {}),\n        ...(attachment!.context.length ? { context: attachment!.context } : {}),\n        ...(opts ? { citations: { enabled: opts?.citations ?? false } } : {})\n      })\n    }\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  addImageToPayload(model: ChatModel, attachment: Attachment, payload: LlmCompletionPayload, opts?: LlmCompletionOpts) {\n    if (Array.isArray(payload.content)) {\n      payload.content.push({\n        type: 'image',\n        source: {\n          type: 'base64',\n          media_type: attachment!.mimeType as 'image/jpeg' | 'image/png' | 'image/gif' | 'image/webp',\n          data: attachment!.content,\n        }\n      })\n    }\n  }\n\n  buildAnthropicPayload(model: ChatModel, thread: Message[], opts?: LlmCompletionOpts): MessageParam[] {\n\n    const payload = this.buildPayload(model, thread, opts)\n\n    return payload.filter((p) => p.role != 'system').reduce((arr: MessageParam[], item: any) => {\n\n      if (item.role === 'assistant' && item.tool_calls) {\n\n        const message: MessageParam = {\n          role: 'assistant' as const,\n          content: [] as ContentBlockParam[]\n        }\n\n        for (const tc of item.tool_calls) {\n\n          let input = tc.function.arguments\n          try {\n            input = JSON.parse(tc.function.arguments)\n          } catch {\n            // ignore\n          }\n\n          (message.content as any[]).push({\n            type: 'tool_use' as const,\n            id: tc.id,\n            name: tc.function.name,\n            input: input || {},\n          })\n\n        }\n\n        arr.push(message)\n\n      }\n\n      if (item.role === 'tool') {\n\n        const content = {\n          type: 'tool_result' as const,\n          tool_use_id: item.tool_call_id,\n          content: item.content\n        }\n\n        // append to previous user message if possible\n        if (arr.length > 2 && arr[arr.length - 2]?.role === 'user' && Array.isArray(arr[arr.length - 2].content) && (arr[arr.length - 2].content as any[]).every((c: any) => c.type === 'tool_result') ) {\n\n          (arr[arr.length - 2].content as any[]).push(content)\n\n        } else {\n\n          const message: MessageParam = {\n            role: 'user' as const,\n            content: [ content ]\n          }\n\n          const index = arr.findLastIndex((m) => m.role === 'assistant')\n          if (index === -1) {\n            arr.push(message)\n          } else {\n            arr.splice(index, 0, message)\n          }\n\n        }\n\n        return arr\n      }\n      \n      if (typeof item.content == 'string') {\n        arr.push({\n          role: item.role as 'user'|'assistant',\n          content: item.content\n        })\n      } else {\n        arr.push({\n          role: item.role as 'user'|'assistant',\n          content: item.content as ContentBlockParam[]\n        })\n      }\n\n      // done\n      return arr\n\n    }, [])\n  }\n\n}\n","import { ChatCompletionChunk } from 'openai/resources'\nimport Message from '../models/message'\nimport { ChatModel, EngineCreateOpts, Model, ModelCerebras } from '../types/index'\nimport { LlmChunk, LlmRole } from '../types/llm'\nimport { PROVIDER_BASE_URLS } from '../defaults'\nimport OpenAI, { OpenAIStreamingContext } from './openai'\n\n//\n// https://inference-docs.cerebras.ai/introduction\n//\n\nexport default class extends OpenAI {\n\n  constructor(config: EngineCreateOpts) {\n    super(config, {\n      apiKey: config.apiKey,\n      baseURL: config.baseURL || PROVIDER_BASE_URLS.cerebras!,\n    })\n  }\n\n  getId(): string {\n    return 'cerebras'\n  }\n\n  supportsServiceTiering(): boolean {\n    return false\n  }\n  \n  getVisionModels(): string[] {\n    return []\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  modelSupportsTopK(model: Model): boolean {\n    return false\n  }\n  \n  get systemRole(): LlmRole {\n    return 'system'\n  }\n\n  async getModels(): Promise<ModelCerebras[]> {\n    \n    // need an api key\n    if (!this.client.apiKey) {\n      return []\n    }\n\n    // do it\n    return await super.getModels() as ModelCerebras[]\n\n  }\n\n  protected setBaseURL() {\n    // avoid override by super\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  async getAvailableTools(delegate?: any): Promise<any[]> {\n    return []\n  }\n\n  // cerebras supports multiparts for some models but not all\n  // especially qwen-3-32b will fail with\n  // {\n  //   \"message\": \"Failed to apply chat template to messages due to error: 'list object' has no attribute 'startswith'\",\n  //   \"type\": \"invalid_request_error\",\n  //   \"param\": \"messages\",\n  //   \"code\": \"wrong_api_format\"\n  // }\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  requiresFlatTextPayload(model: ChatModel, msg: Message): boolean {\n    return true\n  }\n\n  async *processNativeChunk(chunk: ChatCompletionChunk, context: OpenAIStreamingContext): AsyncGenerator<LlmChunk> {\n\n    // <think/> toggles thinking\n    if (Array.isArray(chunk.choices) && chunk.choices.length > 0 && chunk.choices[0].delta) {\n      if (chunk.choices[0].delta.content === '<think>') {\n        context.thinking = true\n        return\n      } else if (chunk.choices[0].delta.content === '</think>') {\n        context.thinking = false\n        return\n      }\n    }\n    \n    // parent call\n    for await (const c of super.processNativeChunk(chunk, context)) {\n      yield c\n    }\n  }\n}\n","import Message from '../models/message'\nimport { ChatModel, EngineCreateOpts, ModelCapabilities, ModelDeepseek } from '../types/index'\nimport { LlmRole } from '../types/llm'\nimport { PROVIDER_BASE_URLS } from '../defaults'\nimport OpenAI from './openai'\n\n//\n// https://api-docs.deepseek.com\n//\n\nexport default class extends OpenAI {\n\n  constructor(config: EngineCreateOpts) {\n    super(config, {\n      apiKey: config.apiKey,\n      baseURL: config.baseURL || PROVIDER_BASE_URLS.deepseek!,\n    })\n  }\n\n  getId(): string {\n    return 'deepseek'\n  }\n\n  supportsServiceTiering(): boolean {\n    return false\n  }\n  \n  getVisionModels(): string[] {\n    return [ ]\n  }\n\n  getModelCapabilities(model: ModelDeepseek): ModelCapabilities {\n    return {\n      tools: true,\n      vision: false,\n      reasoning: model.id.includes('reason'),\n      caching: false,\n    }\n  }\n  \n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  modelSupportsReasoningEffort(model: ChatModel): boolean {\n    return false\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  modelSupportsStructuredOutput(model: ChatModel): boolean {\n    return false\n  }\n\n  get systemRole(): LlmRole {\n    return 'system'\n  }\n\n  async getModels(): Promise<ModelDeepseek[]> {\n    \n    // need an api key\n    if (!this.client.apiKey) {\n      return []\n    }\n\n    // do it\n    return await super.getModels() as ModelDeepseek[]\n\n  }\n\n  protected setBaseURL() {\n    // avoid override by super\n  }\n\n  requiresFlatTextPayload(model: ChatModel, msg: Message): boolean {\n    if (msg.role === 'assistant' && msg.reasoning) {\n      return false\n    } else {\n      return super.defaultRequiresFlatTextPayload(model, msg)\n    }\n  }\n\n  requiresReasoningContent(): boolean {\n    return true\n  }\n\n}\n","import { Content, Environment, FunctionCallingConfigMode, FunctionDeclaration, FunctionResponse, GenerateContentConfig, GenerateContentResponse, GoogleGenAI, Part, Schema, Type } from '@google/genai'\nimport { minimatch } from 'minimatch'\nimport { zodToJsonSchema } from 'zod-to-json-schema'\nimport LlmEngine from '../engine'\nimport logger from '../logger'\nimport Attachment from '../models/attachment'\nimport Message from '../models/message'\nimport { Plugin } from '../plugin'\nimport { ChatModel, EngineCreateOpts, ModelCapabilities, ModelGoogle } from '../types/index'\nimport { LlmChunk, LlmCompletionOpts, LlmCompletionPayload, LlmCompletionPayloadContent, LLmContentPayloadText, LlmResponse, LlmStream, LlmStreamingContext, LlmStreamingResponse, LlmToolCallInfo, LlmUsage } from '../types/llm'\nimport { PluginExecutionResult, PluginParameter } from '../types/plugin'\nimport { addUsages, zeroUsage } from '../usage'\n\n//\n// https://ai.google.dev/gemini-api/docs\n//\n\ntype GoogleCompletionOpts = LlmCompletionOpts & {\n  instruction?: string\n}\n\nexport interface GoogleComputerToolInfo {\n  plugin: Plugin\n  screenSize(): { width: number, height: number }\n  screenNumber(): number\n}\n\nexport type GoogleStreamingContext = LlmStreamingContext<Content> & {\n  opts: GoogleCompletionOpts\n  requestUsage: LlmUsage\n  textContentBlock?: string\n}\n\nexport default class extends LlmEngine {\n\n  client: GoogleGenAI\n  computerInfo: GoogleComputerToolInfo|null = null\n\n  constructor(config: EngineCreateOpts, computerInfo: GoogleComputerToolInfo|null = null) {\n    super(config)\n    this.client = new GoogleGenAI({\n      apiKey: config.apiKey!,\n      ...(config.baseURL ? { httpOptions: {\n        baseUrl: config.baseURL }\n      } : {}),\n    })\n    this.computerInfo = computerInfo\n  }\n\n  getId(): string {\n    return 'google'\n  }\n\n  // https://ai.google.dev/gemini-api/docs/models/gemini\n\n  getModelCapabilities(model: ModelGoogle): ModelCapabilities {\n\n    const visionGlobs = [\n      'gemma-3*',\n      'gemini-1.5-pro-latest',\n      'gemini-1.5-flash-*',\n      'gemini-2.0-flash-*',\n      'gemini-exp-1206',\n      'gemini-2.0-flash-thinking-*',\n      'gemini-2.5-*',\n      'gemini-3-*',\n    ]\n\n    const excludeVisionGlobs = [\n      'gemma-3-1b*',\n      '*tts',\n    ]\n\n    const reasoningGlobs = [\n      '*thinking*',\n      'gemini-2.5-flash*',\n      'gemini-2.5-pro*',\n      'gemini-3-*',\n    ]\n\n    if (!model.name) {\n      return {\n        tools: true,\n        vision: false,\n        reasoning: false,\n        caching: false,\n      }\n    }\n\n    // calc\n    const modelName = model.name.replace('models/', '')\n    let tools = !modelName.includes('gemma') && !modelName.includes('dialog') && !modelName.includes('tts')\n    let vision = visionGlobs.some((m) => minimatch(modelName, m)) && !excludeVisionGlobs.some((m) => minimatch(modelName, m))\n    let reasoning = reasoningGlobs.some((m) => minimatch(modelName, m))\n\n    // latest aliases have all\n    if (modelName.endsWith('latest') && !modelName.match(/\\d/)) {\n      tools = true\n      vision = true\n      reasoning = true\n    }\n\n    // done\n    return { tools, vision, reasoning, caching: false }\n    \n  }\n\n  isComputerUseModel(model: string): boolean {\n    return ['gemini-2.5-computer-use-preview-10-2025'].includes(model)\n  }\n\n  async getModels(): Promise<ModelGoogle[]> {\n\n    // need an api key\n    if (!this.config.apiKey) {\n      return []\n    }\n\n    // fpr debugging purposes\n    // const actions = new Set<string>()\n\n    // we may have to iterate over multiple pages\n    const models: ModelGoogle[] = []\n    const pager = await this.client.models.list()\n    for await (const model of pager) {\n      // model.supportedActions?.forEach((action) => actions.add(action))\n      if (!model.name) continue\n      //if (model.name.match(/\\d\\d\\d$/)) continue\n      if (model.name.includes('tuning')) continue\n      if (model.description?.includes('deprecated')) continue\n      if (model.description?.includes('discontinued')) continue\n      models.push(model as ModelGoogle)\n    }\n\n    // debugging\n    //console.log(actions)\n\n    // reverse\n    models.reverse()\n\n    // done\n    return models\n\n  }\n\n  async complete(model: ChatModel, thread: Message[], opts?: LlmCompletionOpts): Promise<LlmResponse> {\n    const messages = this.buildGooglePayload(thread, model, opts)\n    const instruction = this.getInstructions(model, thread)\n    return await this.chat(model, messages, {\n      ...opts,\n      instruction\n    })\n  }\n\n  async chat(model: ChatModel, thread: Content[], opts?: GoogleCompletionOpts): Promise<LlmResponse> {\n\n    // save tool calls\n    const toolCallInfo: LlmToolCallInfo[] = []\n    const startTime = Date.now()\n\n    // call\n    logger.log(`[google] prompting model ${model.id}`)\n    const response = await this.client.models.generateContent({\n      model: model.id,\n      contents: thread,\n      config: await this.getGenerationConfig(model, opts),\n    })\n\n    // check for tool calls\n    const toolCalls = response.functionCalls\n    if (toolCalls?.length) {\n\n      // results\n      const results: FunctionResponse[] = []\n\n      for (const toolCall of toolCalls) {\n\n        // need\n        logger.log(`[google] tool call ${toolCall.name} with ${JSON.stringify(toolCall.args)}`)\n\n        // now execute\n        let lastUpdate: PluginExecutionResult|undefined = undefined\n        for await (const update of this.callTool({ model: model.id, abortSignal: opts?.abortSignal }, toolCall.name!, toolCall.args, opts?.toolExecutionDelegate, opts?.toolExecutionValidation)) {\n          if (update.type === 'result') {\n            lastUpdate = update\n          }\n        }\n\n        // process result using helper method\n        const { content, canceled } = this.processToolExecutionResult('google', toolCall.name!, toolCall.args, lastUpdate)\n\n        // if canceled/denied, stop processing\n        if (canceled) {\n          throw new Error('Tool execution was canceled')\n        }\n\n        results.push({\n          name: toolCall.name!,\n          response: content!\n        })\n\n        // save tool call info\n        toolCallInfo.push({\n          name: toolCall.name!,\n          params: toolCall.args,\n          result: content\n        })\n\n      }\n\n      // function call\n      thread.push({\n        role: 'assistant',\n        parts: response.candidates![0].content!.parts,\n      })\n\n      // send\n      thread.push({\n        role: 'tool',\n        parts: results.map((r) => ({ functionResponse: r }) ),\n      })\n\n      // apply cooldown before next request\n      await this.applyCooldown(startTime)\n\n      // prompt again\n      const completion = await this.chat(model, thread, opts)\n\n      // prepend tool call info\n      completion.toolCalls = [\n        ...toolCallInfo,\n        ...completion.toolCalls ?? [],\n      ]\n\n      // cumulate usage\n      if (opts?.usage && response.usageMetadata && completion.usage) {\n        completion.usage.prompt_tokens += response.usageMetadata.promptTokenCount ?? 0\n        completion.usage.completion_tokens += response.usageMetadata.candidatesTokenCount ?? 0\n        completion.usage.completion_tokens += response.usageMetadata.toolUsePromptTokenCount ?? 0\n        completion.usage.completion_tokens_details!.reasoning_tokens! += response.usageMetadata.thoughtsTokenCount ?? 0\n      }\n\n      // done\n      return completion\n\n    }\n\n    // thought signature from reasoning if any\n    const thoughtSignature = response.candidates?.[0].content?.parts?.find(p => p.thoughtSignature)?.thoughtSignature\n\n    // done\n    return {\n      type: 'text',\n      content: response.text,\n      toolCalls: toolCallInfo,\n      ...(thoughtSignature ? { thoughtSignature } : {}),\n      ...(opts?.usage && response.usageMetadata ? response.usageMetadata : {}),\n    }\n  }\n\n  async stream(model: ChatModel, thread: Message[], opts?: LlmCompletionOpts): Promise<LlmStreamingResponse<GoogleStreamingContext>> {\n\n    // model: switch to vision if needed\n    model = this.selectModel(model, thread, opts)\n\n    // add computer plugin if computer use model\n    if (this.computerInfo && this.isComputerUseModel(model.id)) {\n      const computerPlugin = this.plugins.find((p) => p.getName() === this.computerInfo!.plugin.getName())\n      if (!computerPlugin) {\n        this.plugins.push(this.computerInfo.plugin)\n      }\n    }\n\n    // context\n    const context: GoogleStreamingContext = {\n      model: model,\n      thread: this.buildGooglePayload(thread, model, opts),\n      opts: {\n        ...opts,\n        instruction: this.getInstructions(model, thread),\n      },\n      toolCalls: [],\n      toolHistory: [],\n      currentRound: 0,\n      startTime: 0,\n      usage: zeroUsage(),\n      requestUsage: zeroUsage()\n    }\n\n    // do it\n    return {\n      stream: await this.doStream(context),\n      context: context\n    }\n\n  }\n\n  async doStream(context: GoogleStreamingContext): Promise<LlmStream> {\n\n    // reset\n    context.toolCalls = []\n    context.startTime = Date.now()\n    context.requestUsage = zeroUsage()\n    context.textContentBlock = undefined\n\n    logger.log(`[google] prompting model ${context.model.id}`)\n    const response = await this.client.models.generateContentStream({\n      model: context.model.id,\n      contents: context.thread,\n      config: await this.getGenerationConfig(context.model, context.opts),\n    })\n\n    // done\n    return response\n\n  }\n\n  private supportsInstructions(model: ChatModel): boolean {\n    return ['gemini'].some((m) => model.id.includes(m))\n  }\n\n  private supportsStructuredOutput(model: ChatModel): boolean {\n    return ['gemini'].some((m) => model.id.includes(m))\n  }\n\n  private getInstructions(model: ChatModel, thread: Message[]): string|undefined {\n    return (this.supportsInstructions(model) && thread.length > 1 && thread[0].role === 'system') ? thread[0].content : undefined  \n  }\n\n  private typeToSchemaType(type: string, properties?: any): Type {\n    if (type === 'string') return Type.STRING\n    if (type === 'number') return Type.NUMBER\n    if (type === 'boolean') return Type.BOOLEAN\n    if (type === 'array') return Type.ARRAY\n    return properties ? Type.OBJECT : Type.STRING\n  }\n\n  // Convert a single PluginParameter to Google schema format\n  private pluginParamToGoogleSchema(param: PluginParameter): any {\n    const type = param.type || (param.items ? 'array' : 'string')\n    const prop: any = {\n      type: this.typeToSchemaType(type),\n      description: param.description,\n      ...(param.enum ? { enum: param.enum } : {}),\n    }\n    if (type === 'array') {\n      prop.items = this.convertItemsForGoogle(param.items)\n    }\n    return prop\n  }\n\n  // Convert PluginParameter items to Google format\n  private convertItemsForGoogle(items?: { type: string; properties?: any[]; items?: { type: string } }): any {\n    if (!items) return { type: this.typeToSchemaType('string') }\n    if (!items.properties) {\n      if (items.type === 'array' && items.items) {\n        return { type: this.typeToSchemaType('array'), items: { type: this.typeToSchemaType(items.items.type || 'string') } }\n      }\n      return { type: this.typeToSchemaType(items.type) }\n    }\n    // Convert array of PluginParameter to Record for Google\n    const props: Record<string, any> = {}\n    for (const prop of items.properties) {\n      props[prop.name] = this.pluginParamToGoogleSchema(prop)\n    }\n    return {\n      type: this.typeToSchemaType(items.type, items.properties),\n      properties: props,\n    }\n  }\n\n  protected async getGenerationConfig(model: ChatModel, opts?: GoogleCompletionOpts): Promise<GenerateContentConfig|undefined> {\n\n    const config: GenerateContentConfig = {\n      ...(opts?.maxTokens ? { maxOutputTokens: opts?.maxTokens } : {} ),\n      ...(opts?.temperature ? { temperature: opts?.temperature } : {} ),\n      ...(opts?.top_k ? { topK: opts?.top_k } : {} ),\n      ...(opts?.top_p ? { topP: opts?.top_p } : {} ),\n    }\n\n    // add instructions\n    if (opts?.instruction) {\n      config.systemInstruction = opts!.instruction\n    }\n\n    // add reasoning\n    if (model.capabilities.reasoning && typeof opts?.thinkingBudget !== 'undefined') {\n      config.thinkingConfig = {\n        includeThoughts: true,\n        thinkingBudget: opts.thinkingBudget\n      }\n    }\n\n    // add structured output\n    if (this.supportsStructuredOutput(model) && opts?.structuredOutput) {\n      config.responseMimeType = 'application/json'\n      config.responseJsonSchema = zodToJsonSchema(opts.structuredOutput.structure)\n    }\n\n    // add computer use tool\n    if (this.computerInfo && this.isComputerUseModel(model.id)) {\n      config.tools = [{\n        computerUse: {\n          environment: Environment.ENVIRONMENT_BROWSER\n        }\n      }]\n    }\n\n    // add tools\n    else if (opts?.tools !== false && model.capabilities.tools) {\n\n      const tools = await this.getAvailableTools(opts?.toolExecutionDelegate);\n      if (tools.length) {\n\n        const functionDeclarations: FunctionDeclaration[] = [];\n\n        for (const tool of tools) {\n\n          const googleProps: { [k: string]: Schema } = {};\n          const required: string[] = [];\n\n          for (const param of tool.parameters) {\n            const type = param.type || (param.items ? 'array' : 'string')\n            const prop: any = {\n              type: this.typeToSchemaType(type),\n              description: param.description,\n              ...(param.enum ? { enum: param.enum } : {}),\n            }\n            if (type === 'array') {\n              prop.items = this.convertItemsForGoogle(param.items)\n            }\n            googleProps[param.name] = prop as Schema\n            if (param.required) {\n              required.push(param.name)\n            }\n          }\n\n          functionDeclarations.push({\n            name: tool.name,\n            description: tool.description,\n            ...(tool.parameters.length == 0 ? {} : {\n              parameters: {\n                type: Type.OBJECT,\n                properties: googleProps,\n                required: required,\n              }\n            })\n          })\n        }\n\n        // done\n        config.tools = [{ functionDeclarations: functionDeclarations }]\n\n        // tool call options\n        if (opts?.toolChoice?.type === 'none') {\n          config.toolConfig = { functionCallingConfig: { mode: FunctionCallingConfigMode.NONE } }\n        } else if (opts?.toolChoice?.type === 'required') {\n          config.toolConfig = { functionCallingConfig: { mode: FunctionCallingConfigMode.ANY } }\n        } else if (opts?.toolChoice?.type === 'tool') {\n          config.toolConfig = { functionCallingConfig: {\n            mode: FunctionCallingConfigMode.ANY,\n            allowedFunctionNames: [ opts.toolChoice.name! ]\n          }}\n        } else {\n          config.toolConfig = { functionCallingConfig: { mode: FunctionCallingConfigMode.AUTO } }\n        }\n\n      }\n    }\n\n    // done\n    return Object.keys(config).length ? config : undefined\n  }\n\n  requiresFlatTextPayload(model: ChatModel, msg: Message) {\n    if (msg.thoughtSignature) return false\n    else return super.requiresFlatTextPayload(model, msg)\n  }\n\n  public buildGooglePayload(thread: Message[], model: ChatModel, opts?: LlmCompletionOpts): Content[] {\n    const supportsInstructions = this.supportsInstructions(model)\n    const payload = this.buildPayload(model, thread.filter((m) => supportsInstructions ? m.role !== 'system' : true), opts).map((p) => {\n      if (p.role === 'system') p.role = 'user'\n      return p\n    })\n    return payload.map((message) => this.messageToContent(message))\n  }\n\n  private messageToContent(payload: LlmCompletionPayload): Content {\n\n    if (payload.role === 'tool') {\n\n      let response = payload.content\n      try {\n        response = JSON.parse(response)\n      } catch {\n        // ignore\n      }\n\n      return {\n        role: 'tool',\n        parts: [ {\n          functionResponse: {\n            id: payload.name,\n            name: payload.name,\n            response: response as any,\n          }\n        } ],\n      }\n\n    } else {\n\n      const content: Content = {\n        role: payload.role == 'assistant' ? 'model' : payload.role as 'user' | 'model',\n        parts: Array.isArray(payload.content) ? payload.content.map((c) => ({\n          text: (c as LLmContentPayloadText).text,\n          // ...(c as LlmContentPayload).thoughtSignature ? { thoughtSignature: (c as LlmContentPayload).thoughtSignature } : {},\n        })) : [ {\n          text: payload.content as string,\n        } ],\n      }\n\n      if (payload.role === 'assistant' && payload.tool_calls) {\n        for (const tc of payload.tool_calls) {\n          content.parts!.splice(content.parts!.length-1, 0, {\n            functionCall: {\n              name: tc.function.name,\n              args: JSON.parse(tc.function.arguments),\n            },\n            ...(tc.thoughtSignature ? { thoughtSignature: tc.thoughtSignature } : {})\n          })\n        }\n      }\n      \n      // add images\n      for (const index in payload.images) {\n        content.parts!.push({\n          inlineData: {\n            mimeType: 'image/png',\n            data: payload.images[Number(index)],\n          }\n        })\n      }\n      \n      // done\n      return content\n\n    }\n  \n  }\n\n  private addAttachment(parts: Array<string|Part>, attachment: Attachment) {\n\n    // load if no contents\n    if (attachment.content === null || attachment.content === undefined) {\n      console.warn('[google] attachment contents not available. Skipping attachment.')\n    }\n  \n    // add inline\n    if (attachment.isImage()) {\n      parts.push({\n        inlineData: {\n          mimeType: attachment.mimeType,\n          data: attachment.content,\n        }\n      })\n    } else if (attachment.isText()) {\n      parts.push(attachment.content)\n    }\n\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  async stop(stream: LlmStream) {\n    //await stream?.controller?.abort()\n  }\n\n  syncToolHistoryToThread(context: GoogleStreamingContext): void {\n    // sync mutations from toolHistory back to content\n    // Google content format: { role: 'tool', parts: [{ functionResponse: { id, name, response } }] }\n    // Google doesn't manage IDs, so we match by name and index position\n    let historyIndex = 0\n    for (const msg of context.thread) {\n      if (msg.role === 'tool' && msg.parts) {\n        for (const part of msg.parts as Part[]) {\n          const functionResponse = part.functionResponse as FunctionResponse | undefined\n          if (functionResponse && historyIndex < context.toolHistory.length) {\n            const entry = context.toolHistory[historyIndex]\n            if (functionResponse.name === entry.name && functionResponse.response !== entry.result) {\n              functionResponse.response = (typeof entry.result === 'string') ? { result: entry.result } : entry.result\n            }\n            historyIndex++\n          }\n        }\n      }\n    }\n  }\n\n  async *processNativeChunk(chunk: GenerateContentResponse, context: GoogleStreamingContext): AsyncGenerator<LlmChunk> {\n\n    // debug\n    //logger.log('[google] chunk', JSON.stringify(chunk))\n\n    // usage\n    if (chunk.usageMetadata) {\n      context.requestUsage.prompt_tokens = chunk.usageMetadata.promptTokenCount ?? 0\n      context.requestUsage.completion_tokens = chunk.usageMetadata.candidatesTokenCount ?? 0\n      context.requestUsage.completion_tokens += chunk.usageMetadata.toolUsePromptTokenCount ?? 0\n      context.requestUsage.completion_tokens_details!.reasoning_tokens! = chunk.usageMetadata.thoughtsTokenCount ?? 0\n    }\n\n    // tool calls - normalize and process (Google sends complete args, no deltas)\n    const toolParts: Part[] = chunk.candidates?.[0].content?.parts?.filter(p => p.functionCall?.name) || []\n    for (const part of toolParts) {\n      const tc = part.functionCall!\n      yield* this.processToolCallChunk({\n        type: 'start',\n        id: tc.id || crypto.randomUUID(),\n        name: tc.name!,\n        args: JSON.stringify(tc.args),\n        metadata: {\n          thoughtSignature: part.thoughtSignature,\n        }\n      }, context)\n    }\n\n    // check for finish reason and accumulated tool calls\n    const done = !!chunk.candidates?.[0].finishReason\n    if (done && context.toolCalls?.length) {\n\n      // clear force tool call to avoid infinite loop\n      if (context.opts.toolChoice?.type === 'tool') {\n        delete context.opts.toolChoice\n      }\n\n      // increment round for next iteration\n      context.currentRound++\n\n      // add usage before continuing\n      if (context.opts.usage) {\n        context.usage = addUsages(context.usage, context.requestUsage)\n        context.requestUsage = zeroUsage()\n      }\n\n      // execute tool calls using base class method\n      yield* this.executeToolCallsBatched(context.toolCalls, context, {\n        formatBatchForThread: (completed) => {\n          // build assistant parts: text first (if present), then function calls\n          const assistantParts: Part[] = []\n\n          // add accumulated text content if present\n          if (context.textContentBlock) {\n            assistantParts.push({ text: context.textContentBlock })\n          }\n\n          // add function calls\n          for (const { tc, args } of completed) {\n            assistantParts.push({\n              functionCall: {\n                name: tc.function,\n                args: args,\n              },\n              ...(tc.thoughtSignature ? { thoughtSignature: tc.thoughtSignature } : {}),\n            })\n          }\n\n          // assistant message with all content\n          const assistantContent: Content = {\n            role: 'assistant',\n            parts: assistantParts,\n          }\n\n          // tool message with all function responses\n          const toolContent: Content = {\n            role: 'tool',\n            parts: completed.map(({ tc, result }) => ({\n              functionResponse: {\n                id: tc.function,\n                name: tc.function,\n                response: result\n              } as FunctionResponse\n            })),\n          }\n\n          return [assistantContent, toolContent]\n        },\n        createNewStream: async () => this.doStream(context)\n      })\n\n      // done\n      return\n\n    }\n\n    // iterate on candidates (content and reasoning)\n    for (const candidate of chunk.candidates || []) {\n      for (const part of candidate.content?.parts || []) {\n        const text = part.text || ''\n        // accumulate text content (not thought/reasoning)\n        if (!part.thought && text) {\n          context.textContentBlock = (context.textContentBlock || '') + text\n        }\n        yield {\n          type: part.thought ? 'reasoning' : 'content',\n          text: text,\n          ...(part.thoughtSignature ? { thoughtSignature: part.thoughtSignature } : {}),\n          done: done\n        }\n      }\n    }\n\n    // usage\n    if (done && context.opts.usage) {\n      context.usage = addUsages(context.usage, context.requestUsage)\n      yield { type: 'usage', usage: context.usage }\n    }\n  }\n   \n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  addImageToPayload(model: ChatModel, attachment: Attachment, payload: LlmCompletionPayloadContent, opts?: LlmCompletionOpts) {\n    if (!payload.images) payload.images = []\n    payload.images.push(attachment!.content)\n  }\n\n}\n","import Groq from 'groq-sdk'\nimport { ChatCompletionChunk, ChatCompletionMessageParam } from 'groq-sdk/resources/chat'\nimport { ChatCompletionCreateParamsBase } from 'groq-sdk/resources/chat/completions'\nimport { minimatch } from 'minimatch'\nimport LlmEngine from '../engine'\nimport logger from '../logger'\nimport Message from '../models/message'\nimport { ChatModel, EngineCreateOpts, ModelCapabilities, ModelGroq } from '../types/index'\nimport { LlmChunk, LlmCompletionOpts, LlmResponse, LlmStream, LlmStreamingContext, LlmStreamingResponse, LlmToolCall, LlmToolCallInfo } from '../types/llm'\nimport { PluginExecutionResult } from '../types/plugin'\nimport { toOpenAITools } from '../tools'\nimport { zeroUsage } from '../usage'\n\n//\n// https://console.groq.com/docs/api-reference#chat-create\n//\n\nexport type GroqStreamingContext = LlmStreamingContext<ChatCompletionMessageParam> & {\n  textContent?: string\n}\n\nexport default class extends LlmEngine {\n\n  client: Groq\n\n  constructor(config: EngineCreateOpts) {\n    super(config)\n    this.client = new Groq({\n      apiKey: config.apiKey || '',\n      baseURL: config.baseURL,\n      dangerouslyAllowBrowser: true,\n      maxRetries: config.maxRetries\n    })\n  }\n\n  getId(): string {\n    return 'groq'\n  }\n\n  // https://console.groq.com/docs/models\n\n  getModelCapabilities(model: ModelGroq): ModelCapabilities {\n    const visionGlobs = [\n      'meta-llama/llama-4-scout-17b-16e-instruct',\n      'meta-llama/llama-4-maverick-17b-128e-instruct',\n    ]\n    return {\n      tools: true,\n      vision: visionGlobs.some((m) => minimatch(model.id, m)),\n      reasoning: model.id.startsWith('o'),\n      caching: false,\n    }\n  }\n\n\n  async getModels(): Promise<ModelGroq[]> {\n\n    // need an api key\n    if (!this.client.apiKey) {\n      return []\n    }\n\n    // do it\n    const models = await this.client.models.list()\n\n    // filter and transform\n    return models.data\n      .filter((model: any) => model.active)  // active not in SDK types\n      .filter((model) => !model.id.includes('guard'))\n      .filter((model) => !model.id.includes('whisper'))\n      .sort((a, b) => b.created - a.created)\n\n  }\n\n  async chat(model: ChatModel, thread: ChatCompletionMessageParam[], opts?: LlmCompletionOpts): Promise<LlmResponse> {\n\n    // save tool calls\n    const toolCallInfo: LlmToolCallInfo[] = []\n    const startTime = Date.now()\n\n    // call\n    logger.log(`[groq] prompting model ${model.id}`)\n    const response = await this.client.chat.completions.create({\n      model: model.id,\n      messages: thread,\n      ...this.getCompletionOpts(model, opts),\n      ...await this.getToolOpts(model, opts),\n    });\n\n    // get choice\n    const choice = response.choices?.[0]\n\n    // tool call\n    if (choice?.finish_reason === 'tool_calls') {\n\n      const toolCalls = choice.message.tool_calls!\n      for (const toolCall of toolCalls) {\n\n        // log\n        logger.log(`[groq] tool call ${toolCall.function.name} with ${toolCall.function.arguments}`)\n\n        // this can error\n        let args = null\n        try {\n          args = JSON.parse(toolCall.function.arguments)\n        } catch (err) {\n          throw new Error(`[groq] tool call ${toolCall.function.name} with invalid JSON args: \"${toolCall.function.arguments}\"`, { cause: err })\n        }\n        \n        // now execute\n        let lastUpdate: PluginExecutionResult|undefined = undefined\n        for await (const update of this.callTool({ model: model.id, abortSignal: opts?.abortSignal }, toolCall.function.name, args, opts?.toolExecutionDelegate, opts?.toolExecutionValidation)) {\n          if (update.type === 'result') {\n            lastUpdate = update\n          }\n        }\n\n        // process result\n        const { content, canceled } = this.processToolExecutionResult(\n          'groq',\n          toolCall.function.name,\n          args,\n          lastUpdate\n        )\n\n        // log\n        logger.log(`[groq] tool call ${toolCall.function.name} => ${JSON.stringify(content).substring(0, 128)}`)\n\n        // For non-streaming, throw immediately on cancel\n        if (canceled) {\n          throw new Error('Tool execution was canceled')\n        }\n\n        // add tool call message\n        thread.push(choice.message)\n\n        // add tool response message\n        thread.push({\n          role: 'tool',\n          tool_call_id: toolCall.id,\n          content: JSON.stringify(content)\n        })\n\n        // save tool call info\n        toolCallInfo.push({\n          name: toolCall.function.name,\n          params: args,\n          result: content\n        })\n      \n      }\n\n      // apply cooldown before next request\n      await this.applyCooldown(startTime)\n\n      // prompt again\n      const completion = await this.chat(model, thread, opts)\n\n      // prepend tool call info\n      completion.toolCalls = [\n        ...toolCallInfo,\n        ...completion.toolCalls ?? [],\n      ]\n\n      // cumulate usage\n      if (opts?.usage && response.usage && completion.usage) {\n        completion.usage.prompt_tokens += response.usage.prompt_tokens\n        completion.usage.completion_tokens += response.usage.completion_tokens\n      }\n\n      // done\n      return completion\n    \n    }    \n\n    // total tokens is not part of our response\n    if (response.usage?.total_tokens) {\n      // @ts-expect-error \"must be optional\"???\n      delete response.usage.total_tokens\n    }\n\n    // return an object\n    return {\n      type: 'text',\n      content: response.choices?.[0].message.content || '',\n      toolCalls: toolCallInfo,\n      ...(opts?.usage && response.usage ? { usage: response.usage } : {}),\n    }\n  }\n\n  async stream(model: ChatModel, thread: Message[], opts?: LlmCompletionOpts): Promise<LlmStreamingResponse<GroqStreamingContext>> {\n\n    // model: switch to vision if needed\n    model = this.selectModel(model, thread, opts)\n\n    // context\n    const context: GroqStreamingContext = {\n      model: model,\n      thread: this.buildGroqPayload(model, thread, opts),\n      opts: opts || {},\n      toolCalls: [],\n      toolHistory: [],\n      currentRound: 0,\n      startTime: 0,\n      usage: zeroUsage(),\n    }\n\n    // do it\n    return {\n      stream: await this.doStream(context),\n      context: context\n    }\n\n  }\n\n  async doStream(context: GroqStreamingContext): Promise<LlmStream> {\n\n    // reset\n    context.toolCalls = []\n    context.startTime = Date.now()\n    context.textContent = ''\n\n    // call\n    logger.log(`[groq] prompting model ${context.model.id}`)\n    const stream = this.client.chat.completions.create({\n      model: context.model.id,\n      messages: context.thread as ChatCompletionMessageParam[],\n      ...this.getCompletionOpts(context.model, context.opts),\n      ...await this.getToolOpts(context.model, context.opts),\n      stream: true,\n    })\n\n    // done\n    return stream\n\n  }\n\n  getCompletionOpts(model: ChatModel, opts?: LlmCompletionOpts): Omit<ChatCompletionCreateParamsBase, 'model'|'messages'|'stream'> {\n    return {\n      ...(opts?.maxTokens ? { max_tokens: opts?.maxTokens } : {} ),\n      ...(opts?.temperature ? { temperature: opts?.temperature } : {} ),\n      //...(opts?.top_k ? { logprobs: true, top_logprobs: opts?.top_k } : {} ),\n      ...(opts?.top_p ? { top_p: opts?.top_p } : {} ),\n      ...(opts?.structuredOutput ? { response_format: { type: 'json_object' } } : {} ),\n    }\n  }\n\n  async getToolOpts(model: ChatModel, opts?: LlmCompletionOpts): Promise<Omit<ChatCompletionCreateParamsBase, 'model'|'messages'|'stream'>> {\n\n    // disabled?\n    if (opts?.tools === false) {\n      return {}\n    }\n\n    // tools - convert PluginTool[] to OpenAI format for Groq SDK\n    const toolDefs = await this.getAvailableTools(opts?.toolExecutionDelegate)\n    const tools = toOpenAITools(toolDefs)\n    return tools.length ? {\n      tools: tools as any,\n      tool_choice: opts?.toolChoice?.type === 'tool' ? {\n        type: 'function',\n        function: { name: opts.toolChoice.name }\n      } : opts?.toolChoice?.type ?? 'auto',\n    } : {}\n\n  }\n\n  async stop(stream: LlmStream): Promise<void> {\n    stream.controller?.abort()\n  }\n\n  syncToolHistoryToThread(context: GroqStreamingContext): void {\n    // sync mutations from toolHistory back to thread\n    // Groq thread format: { role: 'tool', tool_call_id, name, content }\n    for (const entry of context.toolHistory) {\n      const threadEntry = context.thread.find(\n        (t: any) => t.role === 'tool' && t.tool_call_id === entry.id\n      )\n      if (threadEntry) {\n        threadEntry.content = JSON.stringify(entry.result)\n      }\n    }\n  }\n\n  async *processNativeChunk(chunk: ChatCompletionChunk, context: GroqStreamingContext): AsyncGenerator<LlmChunk> {\n\n    // debug\n    //logger.log('processNativeChunk', JSON.stringify(chunk))\n\n    // usage\n    if (context.opts?.usage && chunk.x_groq?.usage) {\n      context.usage.prompt_tokens += chunk.x_groq.usage.prompt_tokens ?? 0\n      context.usage.completion_tokens += chunk.x_groq.usage.completion_tokens ?? 0\n    }\n\n\n    // tool calls - normalize and process\n    if (chunk.choices[0]?.delta?.tool_calls?.[0].function) {\n      const tool_call = chunk.choices[0].delta.tool_calls[0]\n      const fn = tool_call.function!\n      const hasId = tool_call.id !== null && tool_call.id !== undefined\n\n      if (hasId) {\n        // New tool call - normalize as 'start'\n        yield* this.processToolCallChunk({\n          type: 'start',\n          id: tool_call.id,\n          name: fn.name || '',\n          args: fn.arguments || '',\n          message: chunk.choices[0].delta.tool_calls.map((tc: any) => {\n            delete tc.index\n            return tc\n          }),\n        }, context)\n      } else {\n        // Delta - append to last tool call\n        yield* this.processToolCallChunk({\n          type: 'delta',\n          argumentsDelta: fn.arguments || '',\n        }, context)\n      }\n    }\n\n    // now tool calling\n    if (['tool_calls', 'function_call', 'stop'].includes(chunk.choices[0]?.finish_reason|| '') && context.toolCalls?.length) {\n\n      // clear force tool call to avoid infinite loop\n      if (context.opts.toolChoice?.type === 'tool') {\n        delete context.opts.toolChoice\n      }\n\n      // increment round for next iteration\n      context.currentRound++\n\n      // execute tool calls using base class method\n      yield* this.executeToolCallsSequentially(context.toolCalls, context, {\n        formatToolCallForThread: (tc: LlmToolCall) => ({\n          role: 'assistant' as const,\n          content: context.textContent || '',\n          tool_calls: tc.message\n        }),\n        formatToolResultForThread: (result: any, tc: LlmToolCall) => ({\n          role: 'tool' as const,\n          tool_call_id: tc.id,\n          name: tc.function,\n          content: JSON.stringify(result)\n        }),\n        createNewStream: async () => this.doStream(context)\n      })\n\n      // done\n      return\n\n    }\n\n    // reasoning\n    if (chunk.choices[0].delta.reasoning) {\n      \n      yield {\n        type: 'reasoning',\n        text: chunk.choices[0].delta.reasoning,\n        done: false\n      }\n    \n    } else if (chunk.choices[0].delta.content) {\n      const text = chunk.choices[0].delta.content\n      context.textContent = (context.textContent || '') + text\n\n      yield {\n        type: 'content',\n        text: text,\n        done: false\n      }\n\n    }\n\n    // normal content\n    if (['stop', 'length'].includes(chunk.choices[0].finish_reason || '')) {\n\n      // done\n      yield { type: 'content', text: '', done: true }\n\n      // usage?\n      if (context.opts?.usage) {\n        yield { type: 'usage', usage: context.usage }\n      }\n\n    }\n\n  }\n\n  buildGroqPayload(model: ChatModel, thread: Message[], opts?: LlmCompletionOpts): ChatCompletionMessageParam[] {\n\n    // default\n    let payloads = this.buildPayload<ChatCompletionMessageParam>(model, thread, opts)\n\n    // when using vision models, we cannot use a system prompt (!!)\n    let hasImages = false\n    for (const p of payloads) {\n      if (Array.isArray(p.content)) {\n        for (const m of (p.content as any[])) {\n          if (m.type == 'image_url') {\n            hasImages = true\n            break\n          }\n        }\n      }\n    }\n\n    // remove system prompt\n    if (hasImages) {\n      payloads = payloads.filter((p) => p.role != 'system')\n    }\n\n    // now return\n    return payloads.map((payload) => {\n      return {\n        role: payload.role,\n        content: payload.content,\n        ...((payload as any).tool_calls ? {\n            tool_calls: (payload as any).tool_calls\n        } : {}),\n        ...(payload.role === 'tool' ? {\n          tool_call_id: (payload as any).tool_call_id,\n          name: (payload as any).name\n        } : {})\n      } as ChatCompletionMessageParam\n    })\n  }\n\n}\n","import { ChatCompletionChunk } from 'openai/resources'\nimport Message from '../models/message'\nimport { ChatModel, EngineCreateOpts, ModelCapabilities, ModelGeneric, ModelsList } from '../types/index'\nimport { LlmChunk, LlmRole } from '../types/llm'\nimport { PROVIDER_BASE_URLS } from '../defaults'\nimport OpenAI, { OpenAIStreamingContext } from './openai'\n\nexport const lmStudioBaseURL = PROVIDER_BASE_URLS.lmstudio!\n\nexport default class extends OpenAI {\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  static isConfigured = (engineConfig: EngineCreateOpts): boolean => {\n    return true\n  }\n\n  static isReady = (opts: EngineCreateOpts, models: ModelsList): boolean => {\n    return models?.chat?.length > 0\n  }\n\n  constructor(config: EngineCreateOpts) {\n    super(config, {\n      apiKey: config.apiKey || 'dummy',\n      baseURL: config.baseURL || lmStudioBaseURL,\n    })\n  }\n\n  getId(): string {\n    return 'lmstudio'\n  }\n\n  supportsServiceTiering(): boolean {\n    return false\n  }\n  \n  getModelCapabilities(model: ModelGeneric): ModelCapabilities {\n    \n    const visionModels = [\n      'llava',\n      'llama3.2-vision',\n      'qwen2.5vl',\n      'minicpm-v',\n      'moondream',\n    ]\n\n    // Models that typically support reasoning\n    const reasoningModels = [\n      'qwq',\n      'thinking',\n      'reasoning',\n      'cogito',\n    ]\n\n    // // Models that typically support tools lmstudio.ai/docs/app/api/tools\n    // const toolModels = [\n    //   'qwen2.5',\n    //   'llama3.1',\n    //   'llama-3.2',\n    //   'mistral'\n    // ]\n\n    return {\n      tools: true,//toolModels.some(m => model.id.includes(m)),\n      vision: visionModels.some(m => model.id.includes(m)),\n      reasoning: reasoningModels.some(m => model.id.includes(m)),\n      caching: false,\n    }\n  }\n\n  get systemRole(): LlmRole {\n    return 'system'\n  }\n\n  async getModels(): Promise<ModelGeneric[]> {\n    return await super.getModels() as ModelGeneric[]\n  }\n\n  protected setBaseURL() {\n    // avoid override by super\n  }\n\n  requiresFlatTextPayload(model: ChatModel, msg: Message): boolean {\n    return super.defaultRequiresFlatTextPayload(model, msg)\n  }\n\n  async *processNativeChunk(chunk: ChatCompletionChunk, context: OpenAIStreamingContext): AsyncGenerator<LlmChunk> {\n\n    // <think/> toggles thinking\n    if (Array.isArray(chunk.choices) && chunk.choices.length > 0 && chunk.choices[0].delta) {\n      if (chunk.choices[0].delta.content === '<think>') {\n        context.thinking = true\n        return\n      } else if (chunk.choices[0].delta.content === '</think>') {\n        context.thinking = false\n        return\n      }\n    }\n    \n    // parent call\n    for await (const c of super.processNativeChunk(chunk, context)) {\n      yield c\n    }\n  }\n}\n","import Message from '../models/message'\nimport { ChatModel, EngineCreateOpts, ModelCapabilities, ModelMeta } from '../types/index'\nimport { LlmRole } from '../types/llm'\nimport { PROVIDER_BASE_URLS } from '../defaults'\nimport { minimatch } from 'minimatch'\nimport OpenAI from './openai'\n\n//\n// https://llama.developer.meta.com/docs/overview\n//\n\nexport const metaBaseURL = PROVIDER_BASE_URLS.meta!\n\nexport default class extends OpenAI {\n\n  constructor(config: EngineCreateOpts) {\n    super(config, {\n      apiKey: config.apiKey,\n      baseURL: config.baseURL || metaBaseURL,\n    })\n  }\n\n  getId(): string {\n    return 'meta'\n  }\n\n  supportsServiceTiering(): boolean {\n    return false\n  }\n  \n  getModelCapabilities(model: ModelMeta): ModelCapabilities {\n    const visionGlobs = [ '*Llama-4-*' ]\n    return {\n      tools: true,\n      vision: visionGlobs.some((m) => minimatch(model.id, m)),\n      reasoning: false,\n      caching: false,\n    }\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  modelSupportsStructuredOutput(model: ChatModel): boolean {\n    return false\n  }\n\n  get systemRole(): LlmRole {\n    return 'system'\n  }\n\n  async getModels(): Promise<ModelMeta[]> {\n    // need an api key\n    if (!this.client.apiKey) {\n      return []\n    }\n\n    // do it\n    return await super.getModels() as ModelMeta[]\n\n  }\n\n  protected setBaseURL() {\n    // avoid override by super\n  }\n\n  requiresFlatTextPayload(model: ChatModel, msg: Message): boolean {\n    return super.defaultRequiresFlatTextPayload(model, msg)\n  }\n\n}\n","import { Mistral } from '@mistralai/mistralai'\nimport { AssistantMessage, ChatCompletionStreamRequest, CompletionEvent, SystemMessage, ToolMessage, UserMessage } from '@mistralai/mistralai/models/components'\nimport LlmEngine from '../engine'\nimport logger from '../logger'\nimport Attachment from '../models/attachment'\nimport Message from '../models/message'\nimport { ChatModel, EngineCreateOpts, ModelCapabilities, ModelMistralAI } from '../types/index'\nimport { LlmChunk, LlmCompletionOpts, LlmCompletionPayload, LlmResponse, LlmStream, LlmStreamingContext, LlmStreamingResponse, LlmToolCall, LlmToolCallInfo } from '../types/llm'\nimport { PluginExecutionResult } from '../types/plugin'\nimport { toOpenAITools } from '../tools'\nimport { zeroUsage } from '../usage'\n\ntype MistralMessages = Array<\n| (SystemMessage & { role: \"system\" })\n| (UserMessage & { role: \"user\" })\n| (AssistantMessage & { role: \"assistant\" })\n| (ToolMessage & { role: \"tool\" })\n>\n\n//\n// https://docs.mistral.ai/api/\n//\n\nexport type MistralStreamingContext = LlmStreamingContext<MistralMessages[number]> & {\n  textContent?: string\n}\n\nexport default class extends LlmEngine {\n\n  client: Mistral\n\n  constructor(config: EngineCreateOpts) {\n    super(config)\n    this.client = new Mistral({\n      apiKey: config.apiKey || '',\n      serverURL: config.baseURL,\n    })\n  }\n\n  getId(): string {\n    return 'mistralai'\n  }\n\n  getModelCapabilities(model: ModelMistralAI): ModelCapabilities {\n    return {\n      tools: model.capabilities?.functionCalling ?? false,\n      vision: model.capabilities?.vision ?? false,\n      reasoning: model.id.includes('magistral'),\n      caching: false,\n    }\n  }\n\n  async getModels(): Promise<ModelMistralAI[]> {\n\n    // need an api key\n    // if (!this.client.options$.apiKey) {\n    //   return []\n    // }\n\n    // do it\n    try {\n      const models =  await this.client.models.list()\n      return models.data ?? []\n    } catch (error) {\n      console.error('Error listing models:', error);\n      return []\n    }\n  }\n\n  async chat(model: ChatModel, thread: MistralMessages, opts?: LlmCompletionOpts): Promise<LlmResponse> {\n\n    // save tool calls\n    const toolCallInfo: LlmToolCallInfo[] = []\n    const startTime = Date.now()\n\n    // call\n    logger.log(`[mistralai] prompting model ${model.id}`)\n    const response = await this.client.chat.complete({\n      model: model.id,\n      messages: thread,\n      ...this.getCompletionOpts(model, opts),\n      ...await this.getToolOpts(model, opts),\n    });\n\n    // get choice\n    const choice = response.choices?.[0]\n\n    // tool call\n    if (choice?.finishReason === 'tool_calls') {\n\n      const toolCalls = choice.message.toolCalls!\n      for (const toolCall of toolCalls) {\n\n        // log\n        logger.log(`[mistralai] tool call ${toolCall.function.name} with ${toolCall.function.arguments}`)\n\n        // now execute\n        let lastUpdate: PluginExecutionResult|undefined = undefined\n        for await (const update of this.callTool({ model: model.id, abortSignal: opts?.abortSignal }, toolCall.function.name, toolCall.function.arguments, opts?.toolExecutionDelegate, opts?.toolExecutionValidation)) {\n          if (update.type === 'result') {\n            lastUpdate = update\n          }\n        }\n\n        // process result\n        const { content, canceled } = this.processToolExecutionResult(\n          'mistralai',\n          toolCall.function.name,\n          toolCall.function.arguments,\n          lastUpdate\n        )\n\n        // For non-streaming, throw immediately on cancel\n        if (canceled) {\n          throw new Error('Tool execution was canceled')\n        }\n\n        // add tool call message\n        thread.push({ ...choice.message, role: 'assistant' as const })\n\n        // add tool response message\n        thread.push({\n          role: 'tool' as const,\n          toolCallId: toolCall.id,\n          name: toolCall.function.name,\n          content: JSON.stringify(content)\n        })\n\n        // save tool call info\n        toolCallInfo.push({\n          name: toolCall.function.name,\n          params: toolCall.function.arguments,\n          result: content\n        })\n      }\n\n      // apply cooldown before next request\n      await this.applyCooldown(startTime)\n\n      // prompt again\n      const completion = await this.chat(model, thread, opts)\n\n      // prepend tool call info\n      completion.toolCalls = [\n        ...toolCallInfo,\n        ...completion.toolCalls ?? [],\n      ]\n\n      // cumulate usage\n      if (opts?.usage && response.usage && completion.usage) {\n        completion.usage.prompt_tokens += response.usage.promptTokens ?? 0\n        completion.usage.completion_tokens += response.usage.completionTokens ?? 0\n      }\n\n      // done\n      return completion\n    \n    }    \n\n    // return an object\n    return {\n      type: 'text',\n      content: response.choices?.[0].message.content as string || '',\n      toolCalls: toolCallInfo,\n      ...(opts?.usage ? { usage: {\n        prompt_tokens: response.usage.promptTokens ?? 0,\n        completion_tokens: response.usage.completionTokens ?? 0,\n      } } : {}),\n    }\n  }\n\n  async stream(model: ChatModel, thread: Message[], opts?: LlmCompletionOpts): Promise<LlmStreamingResponse<MistralStreamingContext>> {\n\n    // model: switch to vision if needed\n    model = this.selectModel(model, thread, opts)\n  \n    // context\n    const context: MistralStreamingContext = {\n      model: model,\n      thread: this.buildMistralPayload(model, thread, opts),\n      opts: opts || {},\n      toolCalls: [],\n      toolHistory: [],\n      currentRound: 0,\n      startTime: 0,\n      usage: zeroUsage(),\n    }\n\n    // do it\n    return {\n      stream: await this.doStream(context),\n      context: context\n    }\n\n  }\n\n  async doStream(context: MistralStreamingContext): Promise<LlmStream> {\n\n    // reset\n    context.toolCalls = []\n    context.startTime = Date.now()\n    context.textContent = ''\n\n    // call\n    logger.log(`[mistralai] prompting model ${context.model.id}`)\n    const stream = this.client.chat.stream({\n      model: context.model.id,\n      messages: context.thread,\n      ...this.getCompletionOpts(context.model, context.opts),\n      ...await this.getToolOpts(context.model, context.opts),\n    })\n\n    // done\n    return stream\n\n  }\n\n  getCompletionOpts(model: ChatModel, opts?: LlmCompletionOpts): Omit<ChatCompletionStreamRequest, 'model'|'messages'|'stream'> {\n    return {\n      maxTokens: opts?.maxTokens,\n      temperature: opts?.temperature,\n      topP: opts?.top_p,\n      ...(opts?.structuredOutput ? { responseFormat: { type: 'json_object' } } : {} ),\n    }\n  }\n\n  async getToolOpts(model: ChatModel, opts?: LlmCompletionOpts): Promise<Omit<ChatCompletionStreamRequest, 'model'|'messages'|'stream'>> {\n\n    // disabled?\n    if (opts?.tools === false || !model.capabilities?.tools) {\n      return {}\n    }\n\n    // tools - convert PluginTool[] to OpenAI format for MistralAI SDK\n    const toolDefs = await this.getAvailableTools(opts?.toolExecutionDelegate)\n    const tools = toOpenAITools(toolDefs)\n    return tools.length ? {\n      tools: tools as any,\n      toolChoice: opts?.toolChoice?.type === 'tool' ? {\n        type: 'function',\n        function: { name: opts.toolChoice.name }\n      } : opts?.toolChoice?.type ?? 'auto',\n    } : {}\n\n  }\n   \n  async stop() {\n  }\n\n  syncToolHistoryToThread(context: MistralStreamingContext): void {\n    // sync mutations from toolHistory back to thread\n    // MistralAI thread format: { role: 'tool', tool_call_id, name, content }\n    for (const entry of context.toolHistory) {\n      const threadEntry = context.thread.find(\n        (t: any) => t.role === 'tool' && t.toolCallId === entry.id\n      )\n      if (threadEntry) {\n        threadEntry.content = JSON.stringify(entry.result)\n      }\n    }\n  }\n\n  async *processNativeChunk(chunk: CompletionEvent, context: MistralStreamingContext): AsyncGenerator<LlmChunk> {\n\n    // debug\n    //console.dir(chunk, { depth: null })\n\n    // usage\n    if (context.opts.usage && chunk.data.usage) {\n      context.usage.prompt_tokens += chunk.data.usage.promptTokens ?? 0\n      context.usage.completion_tokens += chunk.data.usage.completionTokens ?? 0\n    }\n\n    // tool calls - normalize and process\n    if (chunk.data.choices[0]?.delta?.toolCalls) {\n      const tool_call = chunk.data.choices[0].delta.toolCalls[0]\n\n      if (tool_call.id) {\n        // New tool call - normalize as 'start'\n        yield* this.processToolCallChunk({\n          type: 'start',\n          id: tool_call.id,\n          name: tool_call.function.name,\n          args: tool_call.function.arguments as string,\n          message: chunk.data.choices[0].delta.toolCalls.map((tc: any) => {\n            delete tc.index\n            return tc\n          }),\n        }, context)\n      } else {\n        // Delta - append to last tool call\n        yield* this.processToolCallChunk({\n          type: 'delta',\n          argumentsDelta: tool_call.function.arguments as string,\n        }, context)\n      }\n    }\n\n    // now tool calling\n    if (chunk.data.choices[0]?.finishReason === 'tool_calls') {\n\n      // clear force tool call to avoid infinite loop\n      if (context.opts.toolChoice?.type === 'tool') {\n        delete context.opts.toolChoice\n      }\n\n      // increment round for next iteration\n      context.currentRound++\n\n      // execute tool calls using base class method\n      yield* this.executeToolCallsSequentially(context.toolCalls, context, {\n        formatToolCallForThread: (tc: LlmToolCall) => ({\n          role: 'assistant' as const,\n          content: context.textContent || '',\n          toolCalls: tc.message\n        }),\n        formatToolResultForThread: (result: any, tc: LlmToolCall) => ({\n          role: 'tool' as const,\n          toolCallId: tc.id,\n          name: tc.function,\n          content: JSON.stringify(result)\n        }),\n        createNewStream: async () => this.doStream(context)\n      })\n\n      // done\n      return\n\n    }\n\n    if (Array.isArray(chunk.data.choices[0]?.delta?.content)) {\n      for (const contentPart of chunk.data.choices[0].delta.content) {\n        if (contentPart.type === 'thinking') {\n\n          let reasongingText = ''\n          for (const t of contentPart.thinking) {\n            if (t.type === 'text') {\n              reasongingText += t.text\n            }\n          }\n\n          yield {\n            type: 'reasoning',\n            text: reasongingText,\n            done: false,\n          }\n        }\n      }\n    } else {\n\n      // default\n      const text = chunk.data.choices[0].delta.content as string || ''\n      context.textContent = (context.textContent || '') + text\n      yield {\n        type: 'content',\n        text: text,\n        done: chunk.data.choices[0].finishReason != null\n      }\n\n    }\n\n    // usage\n    if (context.opts.usage) {\n      yield { type: 'usage', usage: context.usage }\n    }\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  protected addImageToPayload(model: ChatModel, attachment: Attachment, payload: LlmCompletionPayload, opts?: LlmCompletionOpts) {\n\n    // if we have a string content, convert it to an array\n    if (typeof payload.content === 'string') {\n      payload.content = [{\n        type: 'text',\n        text: payload.content,\n      }]\n    }\n\n    // now add the image\n    if (Array.isArray(payload.content)) {\n      payload.content.push({\n        type: 'image_url',\n        imageUrl: { url: `data:${attachment.mimeType};base64,${attachment.content}` }\n      })\n    }\n  }\n\n  buildMistralPayload(model: ChatModel, thread: Message[], opts?: LlmCompletionOpts): MistralMessages {\n\n    const payload = this.buildPayload(model, thread, opts)\n    return payload.reduce((arr: MistralMessages, item: any) => {\n\n      if (item.role === 'assistant' && item.tool_calls) {\n        arr.push({\n          role: 'assistant' as const,\n          prefix: false,\n          toolCalls: item.tool_calls.map((tc: any, index: number) => ({\n            id: tc.id,\n            index,\n            function: {\n              name: tc.function.name,\n              arguments: tc.function.arguments,\n            }\n          }))\n        })\n      }\n\n      if (item.role === 'tool') {\n\n        const message: MistralMessages[number] = {\n          role: 'tool' as const,\n          toolCallId: item.tool_call_id!,\n          name: item.name!,\n          content: item.content\n        }\n\n        const index = arr.findLastIndex((m) => m.role === 'assistant')\n        if (index === -1) {\n          arr.push(message)\n        } else {\n          arr.splice(index, 0, message)\n        }\n\n        return arr\n      }\n\n      if (typeof item.content == 'string') {\n        arr.push({\n          role: item.role as 'user' | 'assistant' | 'system',\n          content: item.content\n        })\n      } else {\n        arr.push({\n          role: item.role as 'user' | 'assistant' | 'system',\n          content: item.content\n        })\n      }\n\n      // done\n      return arr\n\n    }, [])\n  }\n}\n","import LlmEngine from '../engine'\nimport logger from '../logger'\nimport Attachment from '../models/attachment'\nimport Message from '../models/message'\nimport { ChatModel, EngineCreateOpts, ModelCapabilities, ModelOllama, ModelsList } from '../types/index'\nimport { LlmChunk, LlmCompletionOpts, LlmCompletionPayloadContent, LlmResponse, LlmStream, LlmStreamingContext, LlmStreamingResponse, LlmToolCall, LlmToolCallInfo } from '../types/llm'\nimport { PluginExecutionResult } from '../types/plugin'\nimport { toOpenAITools } from '../tools'\n\nimport { minimatch } from 'minimatch'\nimport { ChatRequest, ChatResponse, Ollama, ProgressResponse, ShowResponse } from 'ollama/dist/browser.cjs'\nimport type { A as AbortableAsyncIterator } from 'ollama/dist/shared/ollama.1bfa89da.cjs'\nimport { zodToJsonSchema } from 'zod-to-json-schema'\n\nexport type OllamaMessage = NonNullable<ChatRequest['messages']>[number]\n\nexport type OllamaStreamingContext = LlmStreamingContext<OllamaMessage> & {\n  thinking: boolean\n  textContent?: string\n}\n\nexport type OllamaModelInfo = {\n  details: {\n    family: string\n  }\n  model_info: Record<string, any>\n}\n\nexport default class extends LlmEngine {\n\n  client: Ollama\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  static isConfigured = (engineConfig: EngineCreateOpts): boolean => {\n    return true\n  }\n\n  static isReady = (opts: EngineCreateOpts, models: ModelsList): boolean => {\n    return models?.chat?.length > 0\n  }\n\n  constructor(config: EngineCreateOpts) {\n    super(config)\n    this.client = new Ollama({\n      host: config.baseURL,\n    })\n  }\n\n  getId(): string {\n    return 'ollama'\n  }\n  \n  getModelCapabilities(model: ModelOllama): ModelCapabilities {\n    \n    const toolModels = [\n      'athene-v2',\n      'aya-expanse',\n      'cogito',\n      'command-a',\n      'command-r',\n      'command-r-plus',\n      'command-r7b',\n      'command-r7b-arabic',\n      'deepseek-r1',\n      'deepseek-v3.1',\n      'devstral',\n      'devstral-2',\n      'devstral-small-2',\n      'firefunction-v2',\n      'functiongemma',\n      'glm-4.7-flash',\n      'gpt-oss',\n      'gpt-oss-safeguard',\n      'granite3-dense',\n      'granite3-moe',\n      'granite3.1-dense',\n      'granite3.1-moe',\n      'granite3.2',\n      'granite3.2-vision',\n      'granite3.3',\n      'granite4',\n      'hermes3',\n      'llama3-groq-tool-use',\n      'llama3.1',\n      'llama3.2',\n      'llama3.3',\n      'llama4',\n      'magistral',\n      'ministral-3',\n      'mistral',\n      'mistral-large',\n      'mistral-nemo',\n      'mistral-small',\n      'mistral-small3.1',\n      'mistral-small3.2',\n      'mixtral',\n      'nemotron',\n      'nemotron-mini',\n      'nemotron-3-nano',\n      'olmo-3.1',\n      'phi4-mini',\n      'qwen2',\n      'qwen2.5',\n      'qwen2.5-coder',\n      'qwen3',\n      'qwen3-coder',\n      'qwen3-next',\n      'qwen3-vl',\n      'qwq',\n      'rnj-1',\n      'smollm2',\n    ]\n\n    const visionModels = [\n      'bakllava',\n      'deepseek-ocr',\n      'devstral-small-2',\n      'gemma3',\n      'granite3.2-vision',\n      'llama3.2-vision',\n      'llama4',\n      'llava',\n      'llava-llama3',\n      'llava-phi3',\n      'minicpm-v',\n      'ministral-3',\n      'mistral-small3.1',\n      'mistral-small3.2',\n      'moondream',\n      'qwen2.5vl',\n      'qwen3-vl',\n      'translategemma',\n    ]\n\n    const reasoningModels = [\n      'cogito:*',\n      'deepseek-r1:*',\n      'deepseek-v3.1:*',\n      'glm-4.7-flash:*',\n      'gpt-oss-safeguard:*',\n      'gpt-oss:*',\n      'magistral:*',\n      'nemotron-3-nano:*',\n      'openthinker:*',\n      'phi:*',\n      'qwen3-next:*',\n      'qwen3-vl:*',\n      'qwen3:*',\n      'qwq:*',\n    ]\n\n    return {\n      tools: toolModels.includes(model.name.split(':')[0]),\n      vision: visionModels.some((m) => model.name.match(m)),\n      reasoning: reasoningModels.some((m) => minimatch(model.name, m)),\n      caching: false,\n    }\n\n  }\n\n  async getModels(): Promise<ModelOllama[]> {\n    try {\n      const response = await this.client.list()\n      return response.models\n    } catch (error) {\n      console.error('Error listing models:', error);\n      return [] \n    }\n  }\n\n  async getModelInfo(model: string): Promise<ShowResponse|null> {\n    try {\n      return await this.client.show({ model: model })\n    } catch (error) {\n      console.error('Error listing models:', error);\n      return null\n    }\n  }\n\n  async pullModel(model: string): Promise<AbortableAsyncIterator<ProgressResponse>|null> {\n    try {\n      return this.client.pull({\n        model: model,\n        stream: true\n      })\n    } catch (error) {\n      console.error('Error pulling models:', error);\n      return null\n    }\n  }\n  \n  async deleteModel(model: string): Promise<void> {\n    try {\n      await this.client.delete({ model: model })\n    } catch (error) {\n      console.error('Error deleting model:', error);\n    }\n  }\n\n  async chat(model: ChatModel, thread: OllamaMessage[], opts?: LlmCompletionOpts): Promise<LlmResponse> {\n\n    // save tool calls\n    const toolCallInfo: LlmToolCallInfo[] = []\n    const startTime = Date.now()\n\n    // call\n    logger.log(`[ollama] prompting model ${model.id}`)\n    const response = await this.client.chat({\n      ...this.buildChatOptions({\n        model: model.id,\n        messages: thread,\n        opts: opts || null,\n      }),\n      ...await this.getToolOpts(model, opts || {}),\n      stream: false,\n    })\n\n    // tool class\n    if (response.message.tool_calls?.length) {\n\n      // iterate on each tool\n      for (const toolCall of response.message.tool_calls) {\n\n        // log\n        logger.log(`[ollama] tool call ${toolCall.function.name} with ${JSON.stringify(toolCall.function.arguments)}`)\n\n        // now execute\n        let lastUpdate: PluginExecutionResult|undefined = undefined\n        for await (const update of this.callTool({ model: model.id, abortSignal: opts?.abortSignal }, toolCall.function.name, toolCall.function.arguments, opts?.toolExecutionDelegate, opts?.toolExecutionValidation)) {\n          if (update.type === 'result') {\n            lastUpdate = update\n          }\n        }\n\n        // process result\n        const { content, canceled } = this.processToolExecutionResult('ollama', toolCall.function.name, toolCall.function.arguments, lastUpdate)\n\n        // if canceled/denied, stop processing\n        if (canceled) {\n          throw new Error('Tool execution was canceled')\n        }\n\n        // add tool call message\n        thread.push(response.message)\n\n        // add tool response message\n        thread.push({\n          role: 'tool',\n          content: JSON.stringify(content)\n        })\n\n        // save tool call info\n        toolCallInfo.push({\n          name: toolCall.function.name,\n          params: toolCall.function.arguments,\n          result: content\n        })\n      }\n\n      // apply cooldown before next request\n      await this.applyCooldown(startTime)\n\n      // prompt again\n      const completion = await this.chat(model, thread, opts)\n\n      // prepend tool call info\n      completion.toolCalls = [\n        ...toolCallInfo,\n        ...completion.toolCalls ?? [],\n      ]\n\n      // cumulate usage\n      if (opts?.usage && completion.usage) {\n        completion.usage.prompt_tokens += response.prompt_eval_count ?? 0\n        completion.usage.completion_tokens += response.eval_count ?? 0\n      }\n\n      // done\n      return completion\n\n    }\n\n    // return an object\n    return {\n      type: 'text',\n      content: response.message.content,\n      toolCalls: toolCallInfo,\n      ...(opts?.usage ?  { usage: {\n        prompt_tokens: response.prompt_eval_count,\n        completion_tokens: response.eval_count,\n      } } : {}),\n      ...(opts?.logprobs && response.logprobs ?  { logprobs: response.logprobs } : {})\n    }\n  }\n\n  async stream(model: ChatModel, thread: Message[], opts?: LlmCompletionOpts): Promise<LlmStreamingResponse<OllamaStreamingContext>> {\n\n    // model: switch to vision if needed\n    model = this.selectModel(model, thread, opts)\n\n    // context\n    const context: OllamaStreamingContext = {\n      model: model,\n      thread: this.buildOllamaPayload(model, thread, opts),\n      opts: opts || {},\n      toolCalls: [],\n      toolHistory: [],\n      currentRound: 0,\n      startTime: 0,\n      usage: { prompt_tokens: 0, completion_tokens: 0 },\n      thinking: false,\n    }\n\n    // do it\n    return {\n      stream: await this.doStream(context),\n      context: context\n    }\n  }\n\n  async doStream(context: OllamaStreamingContext): Promise<LlmStream> {\n\n    // reset\n    context.toolCalls = []\n    context.startTime = Date.now()\n    context.thinking = false\n    context.textContent = ''\n\n    // call\n    logger.log(`[ollama] prompting model ${context.model.id}`)\n    const stream = this.client.chat({\n      ...this.buildChatOptions({\n        model: context.model.id,\n        messages: context.thread,\n        opts: context.opts\n      }),\n      ...await this.getToolOpts(context.model, context.opts || {}),\n      stream: true,\n    })\n\n    // done\n    return stream\n\n  }\n\n  buildChatOptions({ model, messages, opts }: { model: string, messages: OllamaMessage[], opts: LlmCompletionOpts|null }): ChatRequest {\n\n    const chatOptions: ChatRequest = {\n      model,\n      messages,\n      options: {}\n    }\n    if (opts?.contextWindowSize) {\n      chatOptions.options!.num_ctx = opts.contextWindowSize\n    }\n    if (opts?.maxTokens) {\n      chatOptions.options!.num_predict = opts.maxTokens\n    }\n    if (opts?.temperature) {\n      chatOptions.options!.temperature = opts.temperature\n    }\n    if (opts?.top_k) {\n      chatOptions.options!.top_k = opts.top_k\n    }\n    if (opts?.top_p) {\n      chatOptions.options!.top_p = opts.top_p\n    }\n    if (opts?.structuredOutput) {\n      chatOptions.format = zodToJsonSchema(opts.structuredOutput.structure, { name: opts.structuredOutput.name })\n    }\n    if (opts?.think !== undefined) {\n      chatOptions.think = opts.think\n    }\n    if (opts?.logprobs !== undefined) {\n      chatOptions.logprobs = opts.logprobs\n    }\n    if (opts?.top_logprobs !== undefined) {\n      chatOptions.top_logprobs = opts.top_logprobs\n    }\n    if (opts?.customOpts) {\n      chatOptions.options = { ...chatOptions.options, ...opts.customOpts }\n    }\n    if (Object.keys(opts || {}).length === 0) {\n      delete chatOptions.options\n    }\n    return chatOptions\n  }\n\n  async getToolOpts(model: ChatModel, opts?: LlmCompletionOpts): Promise<Omit<ChatRequest, 'model'>> {\n\n    // disabled?\n    if (opts?.tools === false || !model.capabilities.tools) {\n      return {}\n    }\n\n    // tools - convert PluginTool[] to OpenAI format for Ollama\n    const toolDefs = await this.getAvailableTools(opts?.toolExecutionDelegate)\n    const tools = toOpenAITools(toolDefs)\n    return tools.length ? {\n      tools: tools as any,\n      //tool_choice: 'auto',\n    } : {}\n\n  }\n\n  async stop() {\n    await this.client.abort()\n  }\n\n  syncToolHistoryToThread(context: OllamaStreamingContext): void {\n    // sync mutations from toolHistory back to thread\n    // Ollama thread format: { role: 'tool', content }\n    // Since Ollama doesn't have tool_call_id, we match by index/order\n    const toolMessages = context.thread.filter((t: any) => t.role === 'tool')\n    for (let i = 0; i < context.toolHistory.length; i++) {\n      const entry = context.toolHistory[i]\n      if (toolMessages[i]) {\n        toolMessages[i].content = JSON.stringify(entry.result)\n      }\n    }\n  }\n\n  async *processNativeChunk(chunk: ChatResponse, context: OllamaStreamingContext): AsyncGenerator<LlmChunk> {\n\n    // debug\n    // console.dir(chunk, { depth: null })\n\n    // add usage\n    if (chunk.done && (chunk.eval_count || chunk.prompt_eval_count)) {\n      context.usage.prompt_tokens += chunk.prompt_eval_count ?? 0\n      context.usage.completion_tokens += chunk.eval_count ?? 0\n    }\n\n    // tool calls\n    if (chunk.message.tool_calls?.length) {\n\n      // debug\n      // console.log('tool calls', JSON.stringify(chunk.message.tool_calls))\n\n      // iterate on each tool\n      for (const tool of chunk.message.tool_calls) {\n\n        // record the tool call\n        const toolCall: LlmToolCall = {\n          id: (tool as any).id || `${context.toolCalls.length}-${Date.now()}`,\n          message: tool,\n          function: tool.function.name,\n          args: JSON.stringify(tool.function.arguments || ''),\n        }\n        context.toolCalls.push(toolCall)\n\n        // first notify prep\n        yield {\n          type: 'tool',\n          id: toolCall.id,\n          name: toolCall.function,\n          state: 'preparing',\n          status: this.getToolPreparationDescription(toolCall.function, JSON.parse(toolCall.args)),\n          done: false\n        }\n\n        // log\n        logger.log(`[ollama] tool call ${toolCall.function} with ${tool}`)\n        const args = JSON.parse(toolCall.args)\n\n        try {\n          // now notify running\n          yield {\n            type: 'tool',\n            id: toolCall.id,\n            name: toolCall.function,\n            state: 'running',\n            status: this.getToolRunningDescription(toolCall.function, args),\n            call: {\n              params: args,\n              result: undefined\n            },\n            done: false\n          }\n\n          // now execute\n          let lastUpdate: PluginExecutionResult|undefined = undefined\n          for await (const update of this.callTool({ model: context.model.id, abortSignal: context.opts?.abortSignal }, toolCall.function, args, context.opts?.toolExecutionDelegate, context.opts?.toolExecutionValidation)) {\n\n            if (update.type === 'status') {\n              yield {\n                type: 'tool',\n                id: toolCall.id,\n                name: toolCall.function,\n                state: 'running',\n                status: update.status,\n                call: {\n                  params: args,\n                  result: undefined\n                },\n                done: false\n              }\n\n            } else if (update.type === 'result') {\n              lastUpdate = update\n            }\n\n          }\n\n          // process result\n          const { content, canceled: toolCallCanceled } = this.processToolExecutionResult('ollama', toolCall.function, args, lastUpdate)\n\n          // done\n          yield {\n            type: 'tool',\n            id: toolCall.id,\n            name: toolCall.function,\n            state: toolCallCanceled ? 'canceled' : 'completed',\n            status: toolCallCanceled\n              ? this.getToolCanceledDescription(toolCall.function, args) || content.error || 'Tool execution was canceled'\n              : this.getToolCompletedDescription(toolCall.function, args, content),\n            done: true,\n            call: {\n              params: args,\n              result: content\n            }\n          }\n\n          // add assistant message for this specific tool call\n          context.thread.push({\n            role: 'assistant',\n            content: context.textContent || '',\n            tool_calls: [tool]\n          })\n\n          // add tool response message\n          context.thread.push({\n            role: 'tool',\n            content: JSON.stringify(content)\n          })\n\n          // add to tool history\n          context.toolHistory.push({\n            id: toolCall.id,\n            name: toolCall.function,\n            args: args,\n            result: content,\n            round: context.currentRound,\n          })\n\n          // Check if canceled\n          if (context.opts?.abortSignal?.aborted) {\n            return  // Stop processing\n          }\n\n        } catch (error) {\n          // Check if this was an abort\n          if (context.opts?.abortSignal?.aborted) {\n            yield {\n              type: 'tool',\n              id: toolCall.id,\n              name: toolCall.function,\n              state: 'canceled',\n              status: this.getToolCanceledDescription(toolCall.function, args),\n              done: true,\n              call: {\n                params: args,\n                result: undefined\n              }\n            }\n            return  // Stop processing\n          }\n          throw error  // Re-throw non-abort errors\n        }\n\n      }\n\n      // clear force tool call to avoid infinite loop\n      if (context.opts.toolChoice?.type === 'tool') {\n        delete context.opts.toolChoice\n      }\n\n      // call hook and sync tool history\n      await this.callHook('beforeToolCallsResponse', context)\n      this.syncToolHistoryToThread(context)\n\n      // increment round for next iteration\n      context.currentRound++\n\n      // switch to new stream\n      yield {\n        type: 'stream',\n        stream: await this.doStream(context),\n      }\n\n      // done\n      return\n\n    }\n\n    // <think/> toggles thinking\n    if (chunk.message.content === '<think>') {\n      context.thinking = true\n      return\n    } else if (chunk.message.content === '</think>') {\n      context.thinking = false\n      return\n    }\n\n    // thinking can be in chunk too\n    if (chunk.message.thinking?.length) {\n      yield {\n        type: 'reasoning',\n        text: chunk.message.thinking,\n        done: chunk.done\n      }\n    }\n    \n    // content\n    if (chunk.message.content?.length || chunk.done) {\n      const text = chunk.message.content || ''\n      // accumulate text content (not thinking/reasoning)\n      if (!context.thinking && text) {\n        context.textContent = (context.textContent || '') + text\n      }\n      yield {\n        type: context.thinking ? 'reasoning' : 'content',\n        text: text,\n        done: chunk.done\n      }\n    }\n\n    // usage\n    if (context.opts.usage && context.usage && chunk.done) {\n      yield {\n        type: 'usage',\n        usage: context.usage\n      }\n    } \n  \n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  requiresFlatTextPayload(model: ChatModel, msg: Message): boolean {\n    return true\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  addImageToPayload(model: ChatModel, attachment: Attachment, payload: LlmCompletionPayloadContent, opts: LlmCompletionOpts) {\n    if (!payload.images) payload.images = []\n    payload.images.push(attachment!.content)\n  }\n\n  buildOllamaPayload(model: ChatModel, thread: Message[], opts?: LlmCompletionOpts): OllamaMessage[] {\n\n    // default\n    const payloads = this.buildPayload<OllamaMessage>(model, thread, opts)\n\n    // now return\n    return payloads.map((payload): OllamaMessage => {\n\n      if ((payload as any).role === 'tool') {\n        return {\n          role: 'tool',\n          content: (payload as any).content,\n        }\n      }\n\n      return {\n        role: (payload as any).role,\n        content: (payload as any).content,\n        ...((payload as any).images ? { images: (payload as any).images } : {}),\n        ...((payload as any).tool_calls ?  {\n            tool_calls: (payload as any).tool_calls.map((tc: any, index: number) => {\n            return {\n              id: tc.id,\n              function: {\n                index,\n                name: tc.function.name,\n                arguments: JSON.parse(tc.function.arguments)\n              }\n            }\n          })\n        } : {}),\n      }\n    })\n  }\n\n}\n","import Message from '../models/message'\nimport { ChatModel, EngineCreateOpts, ModelCapabilities, ModelOpenRouter } from '../types/index'\nimport { LlmRole } from '../types/llm'\nimport { PROVIDER_BASE_URLS } from '../defaults'\nimport OpenAI from './openai'\n\n//\n// https://openrouter.ai/docs/quick-start\n//\n\nexport default class extends OpenAI {\n\n  constructor(config: EngineCreateOpts) {\n    super(config, {\n      apiKey: config.apiKey,\n      baseURL: config.baseURL || PROVIDER_BASE_URLS.openrouter!,\n    })\n  }\n\n  getId(): string {\n    return 'openrouter'\n  }\n\n  supportsServiceTiering(): boolean {\n    return false\n  }\n  \n  async getModels(): Promise<ModelOpenRouter[]> {\n    return await super.getModels() as ModelOpenRouter[]\n  }\n\n  getModelCapabilities(model: ModelOpenRouter): ModelCapabilities {\n\n    let input_modalities: string[] = model.architecture?.input_modalities\n    if (!input_modalities && model.architecture?.modality) {\n      input_modalities = model.architecture.modality.split('->')[0].split('+')\n    }\n\n    return {\n      tools: model.supported_parameters?.includes('tools') ?? false,\n      vision: input_modalities?.includes('image') ?? false,\n      reasoning: model.supported_parameters?.includes('reasoning') ?? false,\n      caching: false,\n    }\n\n  }\n\n  modelSupportsStructuredOutput(model: ChatModel): boolean {\n    const meta: ModelOpenRouter = model.meta as ModelOpenRouter\n    return meta?.supported_parameters?.includes('response_format') ?? false\n  }\n\n  get systemRole(): LlmRole {\n    return 'system'\n  }\n\n  protected setBaseURL() {\n    // avoid override by super\n  }\n\n  requiresFlatTextPayload(model: ChatModel, msg: Message): boolean {\n    return super.defaultRequiresFlatTextPayload(model, msg)\n  }\n\n}\n","import Message from '../models/message'\nimport { ChatModel, EngineCreateOpts, ModelCapabilities, ModelxAI } from '../types/index'\nimport { LlmRole } from '../types/llm'\nimport { PROVIDER_BASE_URLS } from '../defaults'\nimport OpenAI from './openai'\n\n//\n// https://docs.x.ai/docs/introduction#what-is-grok-and-xai-api\n//\n\nexport const xAIBaseURL = PROVIDER_BASE_URLS.xai!\n\nexport default class extends OpenAI {\n\n  constructor(config: EngineCreateOpts) {\n    super(config, {\n      apiKey: config.apiKey,\n      baseURL: config.baseURL || xAIBaseURL,\n    })\n  }\n\n  getId(): string {\n    return 'xai'\n  }\n\n  supportsServiceTiering(): boolean {\n    return false\n  }\n  \n  getModelCapabilities(model: ModelxAI): ModelCapabilities {\n    const vision = model.id.includes('vision')\n    const reasoning = model.id.includes('grok-3-mini')\n    return {\n      tools: !vision,\n      vision: vision,\n      reasoning: reasoning,\n      caching: false,\n    }\n  }\n\n  get systemRole(): LlmRole {\n    return 'system'\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  doesNotSendToolCallFinishReason(model: ChatModel): boolean {\n    return true\n  }\n\n  async getModels(): Promise<ModelxAI[]> {\n    // need an api key\n    if (!this.client.apiKey) {\n      return []\n    }\n\n    // do it\n    return await super.getModels() as ModelxAI[]\n\n  }\n\n  protected setBaseURL() {\n    // avoid override by super\n  }\n\n  requiresFlatTextPayload(model: ChatModel, msg: Message): boolean {\n    return super.defaultRequiresFlatTextPayload(model, msg)\n  }\n\n}\n","\nimport LlmEngine from './engine'\nimport LlmModel from './model'\nimport Anthropic, { AnthropicComputerToolInfo } from './providers/anthropic'\nimport Azure from './providers/azure'\nimport Cerebreas from './providers/cerebras'\nimport DeepSeek from './providers/deepseek'\nimport Google, { GoogleComputerToolInfo } from './providers/google'\nimport Groq from './providers/groq'\nimport LMStudio from './providers/lmstudio'\nimport Meta from './providers/meta'\nimport MistralAI from './providers/mistralai'\nimport Ollama from './providers/ollama'\nimport OpenAI from './providers/openai'\nimport OpenRouter from './providers/openrouter'\nimport XAI from './providers/xai'\nimport { ChatModel, EngineCreateOpts, ModelAnthropic, ModelCerebras, ModelDeepseek, ModelGeneric, ModelGoogle, ModelGroq, ModelMeta, ModelMistralAI, ModelOllama, ModelOpenAI, ModelOpenRouter, ModelsList, ModelTogether, ModelxAI } from './types/index'\n\nexport const staticModelsListEngines = [ ]\n\nexport const igniteEngine = (engine: string, config: EngineCreateOpts): LlmEngine => {\n  if (engine === 'azure') return new Azure(config)\n  if (engine === 'anthropic') return new Anthropic(config)\n  if (engine === 'cerebras') return new Cerebreas(config)\n  if (engine === 'deepseek') return new DeepSeek(config)\n  if (engine === 'google') return new Google(config)\n  if (engine === 'groq') return new Groq(config)\n  if (engine === 'lmstudio') return new LMStudio(config)\n  if (engine === 'meta') return new Meta(config)\n  if (engine === 'mistralai') return new MistralAI(config)\n  if (engine === 'ollama') return new Ollama(config)\n  if (engine === 'openai') return new OpenAI(config)\n  if (engine === 'openrouter') return new OpenRouter(config)\n  if (engine === 'xai') return new XAI(config)\n  throw new Error('Unknown engine: ' + engine)\n}\n\nexport const igniteModel = (engine: string, model: string|ChatModel, config: EngineCreateOpts): LlmModel => {\n  return new LlmModel(igniteEngine(engine, config), model)\n}\n\nexport const loadModels = async (engine: string, config: EngineCreateOpts): Promise<ModelsList|null> => {\n  if (engine === 'azure') return await loadAzureModels(config)\n  if (engine === 'anthropic') return await loadAnthropicModels(config)\n  if (engine === 'cerebras') return await loadCerebrasModels(config)\n  if (engine === 'deepseek') return await loadDeepSeekModels(config)\n  if (engine === 'google') return await loadGoogleModels(config)\n  if (engine === 'groq') return await loadGroqModels(config)\n  if (engine === 'lmstudio') return await loadLMStudioModels(config)\n  if (engine === 'meta') return await loadMetaModels(config)\n  if (engine === 'mistralai') return await loadMistralAIModels(config)\n  if (engine === 'ollama') return await loadOllamaModels(config)\n  if (engine === 'openai') return await loadOpenAIModels(config)\n  if (engine === 'openrouter') return await loadOpenRouterModels(config)\n  if (engine === 'xai') return await loadXAIModels(config)\n  throw new Error('Unknown engine: ' + engine)\n}\n\nexport const loadAnthropicModels = async (engineConfig: EngineCreateOpts, computerInfo: AnthropicComputerToolInfo|null = null): Promise<ModelsList|null> => {\n  \n  const anthropic = new Anthropic(engineConfig, computerInfo)\n  let metas: ModelAnthropic[] = []\n\n  try {\n    metas = await anthropic.getModels()\n  } catch (error) {\n    console.error('Error listing Anthropic models:', error);\n  }\n  if (!metas) {\n    return null\n  }\n\n  // xform\n  const models: ChatModel[] = metas.map(m => ({\n    id: m.id,\n    name: m.display_name,\n    capabilities: anthropic.getModelCapabilities(m),\n    meta: m,\n  })).sort((a, b) => b.meta.created_at.localeCompare(a.meta.created_at))\n\n  const imageModels: ChatModel[] = []\n  const videoModels: ChatModel[] = []\n  const embeddingModels: ChatModel[] = []\n  const computerModels = models.filter(model => anthropic.isComputerUseModel(model.id))\n\n    // chat models are the rest\n    const chatModels = models.filter(model => \n      !imageModels.includes(model) &&\n      !videoModels.includes(model) &&\n      !embeddingModels.includes(model) &&\n      !computerModels.includes(model)\n    )\n\n  // done\n  return {\n    chat: chatModels,\n    image: imageModels,\n    video: videoModels,\n    embedding: embeddingModels,\n    computer: computerModels\n  }\n\n}\n\nexport const loadAzureModels = async (engineConfig: EngineCreateOpts): Promise<ModelsList|null> => {\n\n  const azure = new Azure(engineConfig)\n  let metas: ModelOpenAI[] = []\n\n  // load\n  try {\n    metas = await azure.getModels()\n  } catch (error) {\n    console.error('Error listing Azure models:', error);\n  }\n  if (!metas) {\n    return null\n  }\n\n  // xform\n  const models: ChatModel[] = metas.map(m => ({\n    id: m.id,\n    name: m.id,\n    capabilities: azure.getModelCapabilities(m),\n    meta: m,\n  })).sort((a, b) => a.name.localeCompare(b.name))\n\n  // // debug\n  // for (const model of models) {\n  //   console.log(model.id)\n  // }\n\n  return {\n    chat: models,\n    image: [],\n  }\n\n}\n\nexport const loadCerebrasModels = async (engineConfig: EngineCreateOpts): Promise<ModelsList|null> => {\n  \n  const cerebras = new Cerebreas(engineConfig)\n  let metas: ModelCerebras[] = []\n\n  try {\n    metas = await cerebras.getModels()\n  } catch (error) {\n    console.error('Error listing Cerebras models:', error);\n  }\n  if (!metas) {\n    return null\n  }\n\n  // xform\n  const models: ChatModel[] = metas.map(m => ({\n    id: m.id,\n    name: m.id.split('-').map((s: string) => s.charAt(0).toUpperCase() + s.slice(1)).join(' '),\n    capabilities: cerebras.getModelCapabilities(m),\n    meta: m,\n  })).sort((a, b) => b.meta.created - a.meta.created)\n\n  // done\n  return {\n    chat: models,//.sort((a, b) => a.name.localeCompare(b.name))\n    image: [],\n    embedding: []\n  }\n\n}\n\nexport const loadDeepSeekModels = async (engineConfig: EngineCreateOpts): Promise<ModelsList|null> => {\n  \n  const deepseek = new DeepSeek(engineConfig)\n  let metas: ModelDeepseek[] = []\n\n  try {\n    metas = await deepseek.getModels()\n  } catch (error) {\n    console.error('Error listing DeepSeek models:', error);\n  }\n  if (!metas) {\n    return null\n  }\n\n  // xform\n  const models: ChatModel[] = metas.map(m => ({\n    id: m.id,\n    name: m.id.split('-').map((word: string) => word.charAt(0).toUpperCase() + word.slice(1)).join(' ').replace('Deepseek', 'DeepSeek'),\n    capabilities: deepseek.getModelCapabilities(m),\n    meta: m,\n  }))\n\n  // done\n  return {\n    chat: models,//.sort((a, b) => a.name.localeCompare(b.name))\n    image: [],\n    embedding: []\n  }\n\n}\n\nexport const loadGoogleModels = async (engineConfig: EngineCreateOpts, computerInfo: GoogleComputerToolInfo|null = null): Promise<ModelsList|null> => {\n\n  const google = new Google(engineConfig, computerInfo)\n  let metas: ModelGoogle[] = []\n\n  try {\n    metas = await google.getModels()\n  } catch (error) {\n    console.error('Error listing Google models:', error);\n  }\n  if (!metas) {\n    return null\n  }\n\n  // deduplicate based on version field\n  const uniques: ModelGoogle[] = []\n  const uniqueKeys = new Set<string>()\n  for (const model of metas) {\n\n    // if no version add it\n    if (!model.displayName || !model.version) {\n      uniques.push(model)\n      continue\n    }\n\n    const key = `${model.displayName}-${model.version}`\n\n    // already added\n    if (uniqueKeys.has(key)) {\n      continue\n    }\n\n    // add to uniques\n    uniques.push(model)\n\n    // add version\n    uniqueKeys.add(key)\n  }\n\n  // xform\n  const models: ChatModel[] = uniques.map(m => ({\n    id: m.name.replace('models/', ''),\n    name: m.displayName ?? m.name,\n    capabilities: google.getModelCapabilities(m),\n    meta: m,\n  })).filter(m => !m.id.includes('generation')) // remove generation models\n\n  const realtimeModels = models.filter(model => model.id.includes('dialog'))\n  \n  const imageModels = models.filter((m) => (\n    (m.meta as ModelGoogle).supportedActions?.includes('predict') ||\n    (m.id.includes('nano-banana')) ||\n    (m.id.includes('-image'))\n  ))\n  \n  const videoModels = models.filter((m) => (\n    (m.meta as ModelGoogle).supportedActions?.includes('predictLongRunning')\n  ))\n  const embeddingModels = models.filter((m) => (m.meta as ModelGoogle).supportedActions?.includes('embedContent'))\n\n  const computerModels = models.filter(model => google.isComputerUseModel(model.id))\n\n  const ttsModels = models.filter(model => model.id.endsWith('tts'))\n\n  const chatModels = models\n    .filter((m) => (m.meta as ModelGoogle).supportedActions?.includes('generateContent'))\n    .filter((m) => !(m.meta as ModelGoogle).supportedActions?.includes('bidiGenerateContent'))\n    .filter(model => \n        !imageModels.includes(model) &&\n        !videoModels.includes(model) &&\n        !computerModels.includes(model) &&\n        !embeddingModels.includes(model) &&\n        !realtimeModels.includes(model) &&\n        !ttsModels.includes(model)\n      )\n    .sort((a, b) => {\n      if (a.id.includes('gemini') && !b.id.includes('gemini')) {\n        return -1\n      }\n      return b.name.localeCompare(a.name)\n    })\n\n  // done\n  return {\n    chat: chatModels,\n    image: imageModels,\n    video: videoModels,\n    embedding: embeddingModels,\n    computer: computerModels,\n    realtime: realtimeModels,\n    tts: ttsModels\n  }\n\n}\n\nexport const loadGroqModels = async (engineConfig: EngineCreateOpts): Promise<ModelsList|null> => {\n\n  const groq = new Groq(engineConfig)\n  let metas: ModelGroq[] = []\n\n  try {\n    metas = await groq.getModels()\n  } catch (error) {\n    console.error('Error listing Groq models:', error);\n  }\n  if (!metas) {\n    return null\n  }\n\n  // xform\n  const models: ChatModel[] = metas.map(m => ({\n    id: m.id,\n    name: m.id.split('-').map((s: string) => s.charAt(0).toUpperCase() + s.slice(1)).join(' '),\n    capabilities: groq.getModelCapabilities(m),\n    meta: m,\n  })).sort((a, b) => b.meta.created - a.meta.created)\n\n  // specialized models\n  const ttsModels = models.filter(model => model.id.includes('tts'))\n\n  // chat models are the rest\n  const chatModels = models.filter(model => \n    !ttsModels.includes(model)\n  )\n\n  // done\n  return {\n    chat: chatModels,//.sort((a, b) => a.name.localeCompare(b.name))\n    image: [],\n    embedding: [],\n    realtime: [],\n    computer: [],\n    stt: [],\n    tts: ttsModels,\n  }\n\n}\n\nexport const loadLMStudioModels = async (engineConfig: EngineCreateOpts): Promise<ModelsList|null> => {\n\n  const lmStudio = new LMStudio(engineConfig)\n  let metas: ModelGeneric[] = []\n\n  try {\n    metas = await lmStudio.getModels()\n  } catch (error) {\n    console.error('Error listing LMStudio models:', error);\n  }\n  if (!metas) {\n    return null\n  }\n\n  // xform\n  const models: ChatModel[] = metas.map(m => ({\n    id: m.id,\n    name: m.id.split('-').map((s: string) => s.charAt(0).toUpperCase() + s.slice(1)).join(' '),\n    capabilities: lmStudio.getModelCapabilities(m),\n    meta: m,\n  }))\n  \n  // done\n  return {\n    chat: models,\n    image: [],\n    embedding: []\n  }\n\n}\n\nexport const loadMetaModels = async (engineConfig: EngineCreateOpts): Promise<ModelsList|null> => {\n  \n  const meta = new Meta(engineConfig)\n  let metas: ModelMeta[] = []\n\n  try {\n    metas = await meta.getModels()\n  } catch (error) {\n    console.error('Error listing Meta models:', error);\n  }\n  if (!metas) {\n    return null\n  }\n\n  // xform\n  const models: ChatModel[] = metas.map(m => ({\n    id: m.id,\n    name: m.id.split('-').join(' '),\n    capabilities: meta.getModelCapabilities(m),\n    meta: m,\n  })).sort((a, b) => b.meta.created - a.meta.created)\n\n  // done\n  return {\n    chat: models,\n    image: [],\n    embedding: []\n  }\n\n}\n\nexport const loadMistralAIModels = async (engineConfig: EngineCreateOpts): Promise<ModelsList|null> => {\n\n  const mistralai = new MistralAI(engineConfig)\n  let metas: ModelMistralAI[] = []\n\n  try {\n    metas = await mistralai.getModels()\n  } catch (error) {\n    console.error('Error listing MistralAI models:', error);\n  }\n  if (!metas.length) {\n    return null\n  }\n\n\n  // first deduplicate based on aliases\n  const uniques: ModelMistralAI[] = []\n  const aliases = new Set<string>()\n  for (const model of metas) {\n\n    // already added\n    if (aliases.has(model.id)) {\n      continue\n    }\n\n    // check if there is a latest alias\n    const latest = model.aliases?.filter(alias => alias.endsWith('-latest'))\n    if (latest?.length === 1) {\n      model.id = latest[0]\n      model.name = model.id\n    }\n\n    // add to uniques\n    uniques.push(model)\n\n    // add aliases\n    model.aliases?.forEach(alias => aliases.add(alias))\n\n  }\n\n  // xform\n  const models: ChatModel[] = uniques.map(m => ({\n    id: m.id,\n    name: (m.name || m.id).split('-').map((s: string) => s.charAt(0).toUpperCase() + s.slice(1)).join(' '),\n    capabilities: mistralai.getModelCapabilities(m),\n    meta: m,\n  })).sort((a, b) => {\n    if (a.meta?.created && b.meta?.created && a.meta.created !== b.meta.created) {\n      return b.meta.created - a.meta.created\n    } else {\n      return a.name.localeCompare(b.name)\n    }\n  })\n\n  // done\n  return {\n    chat: models.filter(m => (m.meta as ModelMistralAI)!.capabilities?.completionChat),\n    image: [],\n    embedding: []\n  }\n\n}\n\nexport const loadOllamaModels = async (engineConfig: EngineCreateOpts): Promise<ModelsList|null> => {\n\n  const ollama = new Ollama(engineConfig)\n  let metas: ModelOllama[] = []\n\n  // load\n  try {\n    metas = await ollama.getModels()\n  } catch (error) {\n    console.error('Error listing Ollama models:', error);\n  }\n  if (!metas.length) {\n    return null\n  }\n\n  // xform\n  const models: ChatModel[] = metas.map(m => ({\n    id: m.model,\n    name: m.name,\n    capabilities: ollama.getModelCapabilities(m),\n    meta: m,\n  }))\n\n  // get info\n  const chatModels: string[] = []\n  const embeddingModels: string[] = []\n  for (const model of models) {\n    try {\n\n      const info = await ollama.getModelInfo(model.id)\n      if (!info) {\n        chatModels.push(model.id)\n        continue\n      }\n\n      let isEmbedding = info.details.family.includes('bert')\n\n      if (info && 'capabilities' in info) {\n        const capabilities: string[] = info.capabilities as string[] || []\n        if (capabilities.includes('embedding')) {\n          isEmbedding = true\n        }\n        if (capabilities.includes('tools')) {\n          model.capabilities.tools = true\n        }\n        if (capabilities.includes('vision')) {\n          model.capabilities.vision = true\n        }\n      }\n\n      // add to chat models\n      if (isEmbedding) {\n        embeddingModels.push(model.id)\n      } else {\n        chatModels.push(model.id)\n      }\n\n    } catch (e) {\n      console.error(`Error getting info for model ${model.id}:`, e);\n    }\n  }\n\n  // done\n  return {\n    chat: models\n      .filter(model => chatModels.includes(model.id))\n      .sort((a, b) => a.name.localeCompare(b.name)),\n    image: [],\n    embedding: models\n      .filter(model => embeddingModels.includes(model.id))\n      .sort((a, b) => a.name.localeCompare(b.name)),\n  }\n\n}\n\nexport const loadOpenAIModels = async (engineConfig: EngineCreateOpts): Promise<ModelsList|null> => {\n\n  const openAI = new OpenAI(engineConfig)\n  let metas: ModelOpenAI[] = []\n\n  try {\n    metas = await openAI.getModels() as ModelOpenAI[]\n  } catch (error) {\n    console.error('Error listing OpenAI models:', error);\n  }\n  if (!metas) {\n    return null\n  }\n\n  // xform\n  let models: ChatModel[] = metas.map(m => ({\n    id: m.id,\n    name: m.id,\n    capabilities: openAI.getModelCapabilities(m),\n    meta: m,\n  })).sort((a, b) => b.meta.created - a.meta.created)\n\n  // depends on the provider\n  if (!engineConfig.baseURL || engineConfig.baseURL.includes('api.openai.com')) {\n\n    // // debug\n    // for (const model of models) {\n    //   console.log(model.id)\n    // }\n\n    // filter out some models\n    models = models.filter(model =>\n      !model.id.includes('davinci') &&\n      !model.id.includes('babbage') &&\n      !model.id.includes('moderation') &&\n      !model.id.includes('audio') &&\n      !model.id.includes('search')\n    )\n\n    // assign models\n    const imageModels = models.filter(model => model.id.startsWith('dall-e-') || model.id.includes('image-'))\n    const videoModels = models.filter(model => model.id.includes('sora'))\n    const embeddingModels = models.filter(model => model.id.startsWith('text-embedding-'))\n    const realtimeModels = models.filter(model => model.id.includes('realtime'))\n    const computerModels = models.filter(model => model.id.includes('computer-use'))\n    const sttModels = models.filter(model => model.id.includes('whisper') || model.id.includes('transcribe'))\n    const ttsModels = models.filter(model => model.id.includes('tts'))\n\n    // hack: add gpt-image-1\n    if (!imageModels.map(m => m.id).includes('gpt-image-1')) {\n      imageModels.unshift({ id: 'gpt-image-1', name: 'GPT Image', meta: {\n        id: 'gpt-image-1', object: 'model', created: 0, owned_by: 'system'\n      }, capabilities: { tools: false, vision: false, reasoning: false, caching: false, } });\n    }\n    \n    // chat models are the rest\n    const chatModels = models.filter(model => \n      !imageModels.includes(model) &&\n      !videoModels.includes(model) &&\n      !embeddingModels.includes(model) &&\n      !realtimeModels.includes(model) &&\n      !computerModels.includes(model) &&\n      !sttModels.includes(model) &&\n      !ttsModels.includes(model)\n    )\n\n    return {\n      chat: chatModels,\n      image: imageModels,\n      video: videoModels,\n      embedding: embeddingModels,\n      realtime: realtimeModels,\n      computer: computerModels,\n      stt: sttModels,\n      tts: ttsModels,\n    }\n\n  } else if (engineConfig.baseURL.includes('api.together.xyz')) {\n  \n    // debug\n    // for (const model of models) {\n    //   console.log(`[${model.meta?.type}] ${model.id}`)\n    // }\n\n    return {\n      chat: models.filter(model => ['language', 'chat', 'code'].includes((model.meta as ModelTogether)?.type)),\n      image: models.filter(model => (model.meta as ModelTogether)?.type === 'image'),\n      embedding: models.filter(model => (model.meta as ModelTogether)?.type === 'embedding')\n    }\n\n  } else {\n\n    return {\n      chat: models,\n      image: [],\n      embedding: []\n    }\n\n  }\n\n}\n\nexport const loadOpenRouterModels = async (engineConfig: EngineCreateOpts): Promise<ModelsList|null> => {\n  \n  const openrouter = new OpenRouter(engineConfig)\n  let metas: ModelOpenRouter[] = []\n\n  try {\n    metas = await openrouter.getModels()\n  } catch (error) {\n    console.error('Error listing OpenRouter models:', error);\n  }\n  if (!metas) {\n    return null\n  }\n\n  // xform\n  const models: ChatModel[] = metas.map(m => ({\n    id: m.id,\n    name: m.name,\n    capabilities: openrouter.getModelCapabilities(m),\n    meta: m,\n  }))\n\n  \n  // done\n  return {\n    chat: models.filter((m) => (m.meta as ModelOpenRouter)?.architecture?.modality?.split('>')?.pop()?.includes('text')).sort((a, b) => a.name.localeCompare(b.name)),\n    image: models.filter((m) => (m.meta as ModelOpenRouter)?.architecture?.modality?.split('>')?.pop()?.includes('image')).sort((a, b) => a.name.localeCompare(b.name)),\n    embedding: []\n  }\n\n}\n\nexport const loadXAIModels = async (engineConfig: EngineCreateOpts): Promise<ModelsList|null> => {\n  \n  const xai = new XAI(engineConfig)\n  let metas: ModelxAI[] = []\n\n  try {\n    metas = await xai.getModels()\n  } catch (error) {\n    console.error('Error listing xAI models:', error);\n  }\n  if (!metas) {\n    return null\n  }\n\n  // xform\n  const models: ChatModel[] = metas.map(m => ({\n    id: m.id,\n    name: m.id.split('-').map((s: string) => s.charAt(0).toUpperCase() + s.slice(1)).join(' '),\n    capabilities: xai.getModelCapabilities(m),\n    meta: m,\n  })).sort((a, b) => b.meta.created - a.meta.created)\n  \n  // done\n  return {\n    chat: models.filter((m) => !m.id.includes('image') && !m.id.includes('video')),\n    image: models.filter((m) => m.id.includes('image')), \n    video: models.filter((m) => m.id.includes('video')),\n    embedding: []\n  }\n\n}\n","export * from './types/index'\nexport * from './types/plugin'\nexport * from './types/llm'\n\nimport Attachment, { codeFormats, configFormats, textFormats, imageFormats, extensionToMimeType, mimeTypeToExtension } from './models/attachment'\nimport Message from './models/message'\n\nimport { Plugin, CustomToolPlugin, MultiToolPlugin } from './plugin'\n\nimport {\n  isToolDefinition,\n  isLegacyOpenAITool,\n  normalizeToToolDefinition,\n  toolDefinitionToOpenAI,\n  toOpenAITool,\n  normalizeTools,\n  toOpenAITools,\n} from './tools'\n\nimport { addUsages } from './usage'\n\nimport { PROVIDER_BASE_URLS, getProviderBaseURL } from './defaults'\n\nimport LlmEngine from './engine'\nimport LlmModel from './model'\n\nimport Azure from './providers/azure'\nimport Anthropic from './providers/anthropic'\nimport Cerebras from './providers/cerebras'\nimport DeepSeek from './providers/deepseek'\nimport Google from './providers/google'\nimport Groq from './providers/groq'\nimport LMStudio from './providers/lmstudio'\nimport Meta from './providers/meta'\nimport MistralAI from './providers/mistralai'\nimport Ollama, { OllamaMessage } from './providers/ollama'\nimport OpenAI from './providers/openai'\nimport OpenRouter from './providers/openrouter'\nimport XAI, { xAIBaseURL } from './providers/xai'\n\nexport * from './llm'\n\nimport * as _logger from './logger'\nconst logger = {\n  disable: _logger.default.disableLogger,\n  set: _logger.default.setLogger,\n}\n\nimport { ModelCapabilities } from './types/index'\nconst defaultCapabilities: { capabilities: ModelCapabilities } = {\n  capabilities: {\n    tools: false,\n    vision: false,\n    reasoning: false,\n    caching: false,\n  }\n}\n\nexport {\n  logger,\n  Plugin,\n  CustomToolPlugin,\n  MultiToolPlugin,\n  isToolDefinition,\n  isLegacyOpenAITool,\n  normalizeToToolDefinition,\n  toolDefinitionToOpenAI,\n  toOpenAITool,\n  normalizeTools,\n  toOpenAITools,\n  Message,\n  Attachment,\n  LlmEngine,\n  LlmModel,\n  Azure,\n  Anthropic,\n  Cerebras,\n  DeepSeek,\n  Google,\n  Groq,\n  LMStudio,\n  Meta,\n  MistralAI,\n  Ollama,\n  OllamaMessage,\n  OpenAI,\n  OpenRouter,\n  XAI,\n  xAIBaseURL,\n  PROVIDER_BASE_URLS,\n  getProviderBaseURL,\n  textFormats,\n  codeFormats,\n  configFormats,\n  imageFormats,\n  extensionToMimeType,\n  mimeTypeToExtension,\n  defaultCapabilities,\n  addUsages\n}\n"],"mappings":"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","names":["logger","plugin","minimatch","minimatch","minimatch","minimatch","minimatch","minimatch","minimatch","minimatch","minimatch","zodToJsonSchema"]}