{"version":3,"file":"index.mjs","sources":["webpack://@tarko/llm-client/./src/models.ts","webpack://@tarko/llm-client/./src/handlers/types.ts","webpack://@tarko/llm-client/./src/handlers/base.ts","webpack://@tarko/llm-client/./src/handlers/ai21.ts","webpack://@tarko/llm-client/./src/handlers/anthropic.ts","webpack://@tarko/llm-client/./src/handlers/gemini.ts","webpack://@tarko/llm-client/./src/handlers/groq.ts","webpack://@tarko/llm-client/./src/handlers/mistral.ts","webpack://@tarko/llm-client/./src/handlers/openai-compatible.ts","webpack://@tarko/llm-client/./src/handlers/openai.ts","webpack://@tarko/llm-client/./src/handlers/openai-non-streaming.ts","webpack://@tarko/llm-client/./src/handlers/openrouter.ts","webpack://@tarko/llm-client/./src/handlers/perplexity.ts","webpack://@tarko/llm-client/./src/handlers/azure-openai.ts","webpack://@tarko/llm-client/./src/handlers/utils.ts","webpack://@tarko/llm-client/./src/chat/index.ts","webpack://@tarko/llm-client/./src/index.ts"],"sourcesContent":["/**\n * The following code is modified based on\n * https://github.com/token-js/token.js/blob/main/src/models.ts\n *\n * MIT License\n * Copyright (c) 2024 RPate97\n * https://github.com/token-js/token.js/blob/main/LICENSE\n */\n\nexport const TableDisplayNames = {\n  models: 'Model',\n  supportsCompletion: 'Chat Completion',\n  supportsStreaming: 'Streaming',\n  supportsJSON: 'JSON Output',\n  supportsImages: 'Image Input',\n  supportsToolCalls: 'Function Calling',\n  supportsN: 'N > 1',\n};\nexport const models = {\n  openai: {\n    models: [\n      // https://platform.openai.com/docs/models/gpt-image-1\n      'gpt-image-1',\n      'gpt-4.5-preview',\n      'gpt-4.5-preview-2025-02-27',\n      'gpt-4.1',\n      'gpt-4.1-2025-04-14',\n      'gpt-4o',\n      'gpt-4o-mini',\n      'gpt-4o-2024-05-13',\n      'gpt-4o-2024-08-06',\n      'gpt-4-turbo',\n      'gpt-4-turbo-2024-04-09',\n      'gpt-4-0125-preview',\n      'gpt-4-turbo-preview',\n      'gpt-4-1106-preview',\n      'gpt-4-vision-preview',\n      'gpt-4',\n      'gpt-4-0314',\n      'gpt-4-0613',\n      'gpt-4-32k',\n      'gpt-4-32k-0314',\n      'gpt-4-32k-0613',\n      'gpt-3.5-turbo',\n      'gpt-3.5-turbo-16k',\n      'gpt-3.5-turbo-0301',\n      'gpt-3.5-turbo-0613',\n      'gpt-3.5-turbo-1106',\n      'gpt-3.5-turbo-0125',\n      'gpt-3.5-turbo-16k-0613',\n      'o3-mini',\n      'o1-mini',\n      'o1-mini-2024-09-12',\n      'o1-preview',\n      'o1-preview-2024-09-12',\n    ] as const,\n    supportsCompletion: true,\n    supportsStreaming: [\n      'gpt-4.1',\n      'gpt-4.1-2025-04-14',\n      'gpt-4.5-preview',\n      'gpt-4.5-preview-2025-02-27',\n      'gpt-4o',\n      'gpt-4o-mini',\n      'gpt-4o-2024-05-13',\n      'gpt-4o-2024-08-06',\n      'gpt-4-turbo',\n      'gpt-4-turbo-2024-04-09',\n      'gpt-4-0125-preview',\n      'gpt-4-turbo-preview',\n      'gpt-4-1106-preview',\n      'gpt-4-vision-preview',\n      'gpt-4',\n      'gpt-4-0314',\n      'gpt-4-0613',\n      'gpt-4-32k',\n      'gpt-4-32k-0314',\n      'gpt-4-32k-0613',\n      'gpt-3.5-turbo',\n      'gpt-3.5-turbo-16k',\n      'gpt-3.5-turbo-0301',\n      'gpt-3.5-turbo-0613',\n      'gpt-3.5-turbo-1106',\n      'gpt-3.5-turbo-0125',\n      'gpt-3.5-turbo-16k-0613',\n      'o3-mini',\n    ] as const,\n    supportsJSON: [\n      'gpt-4.1',\n      'gpt-4.1-2025-04-14',\n      'gpt-4.5-preview',\n      'gpt-4.5-preview-2025-02-27',\n      'gpt-4o',\n      'gpt-4o-mini',\n      'gpt-4o-2024-05-13',\n      'gpt-4o-2024-08-06',\n      'gpt-4-turbo',\n      'gpt-4-turbo-2024-04-09',\n      'gpt-4-0125-preview',\n      'gpt-4-turbo-preview',\n      'gpt-4-1106-preview',\n      'gpt-4-vision-preview',\n      'gpt-3.5-turbo',\n      'gpt-3.5-turbo-1106',\n      'gpt-3.5-turbo-0125',\n      'o3-mini',\n    ] as const,\n    supportsImages: [\n      'gpt-4.1',\n      'gpt-4.1-2025-04-14',\n      'gpt-4.5-preview',\n      'gpt-4.5-preview-2025-02-27',\n      'gpt-4o',\n      'gpt-4o-mini',\n      'gpt-4o-2024-05-13',\n      'gpt-4o-2024-08-06',\n      'gpt-4-turbo',\n      'gpt-4-turbo-2024-04-09',\n      'gpt-4-0125-preview',\n      'gpt-4-turbo-preview',\n      'gpt-4-1106-preview',\n      'gpt-4-vision-preview',\n    ] as const,\n    supportsToolCalls: [\n      'gpt-4.1',\n      'gpt-4.1-2025-04-14',\n      'gpt-4.5-preview',\n      'gpt-4.5-preview-2025-02-27',\n      'gpt-4o',\n      'gpt-4o-mini',\n      'gpt-4o-2024-05-13',\n      'gpt-4o-2024-08-06',\n      'gpt-4-turbo',\n      'gpt-4-turbo-2024-04-09',\n      'gpt-4-turbo-preview',\n      'gpt-4-0125-preview',\n      'gpt-4-1106-preview',\n      'gpt-4',\n      'gpt-4-0613',\n      'gpt-3.5-turbo',\n      'gpt-3.5-turbo-0125',\n      'gpt-3.5-turbo-1106',\n      'gpt-3.5-turbo-0613',\n      'o3-mini',\n    ] as const,\n    supportsN: true,\n    generateDocs: true,\n  },\n  'openai-non-streaming': {\n    models: [\n      'gpt-image-1', // Example model that might not support streaming natively\n      'o1-mini',\n      'o1-mini-2024-09-12',\n      'o1-preview',\n      'o1-preview-2024-09-12',\n    ] as const,\n    supportsCompletion: true,\n    // All models are marked false for native streaming since we're simulating it\n    supportsStreaming: [] as const,\n    supportsJSON: ['o1-mini', 'o1-mini-2024-09-12', 'o1-preview', 'o1-preview-2024-09-12'] as const,\n    supportsImages: ['gpt-image-1'] as const,\n    supportsToolCalls: [\n      'o1-mini',\n      'o1-mini-2024-09-12',\n      'o1-preview',\n      'o1-preview-2024-09-12',\n    ] as const,\n    supportsN: true,\n    generateDocs: true,\n  },\n  ai21: {\n    models: ['jamba-instruct'] as const,\n    supportsCompletion: true,\n    supportsStreaming: ['jamba-instruct'] as const,\n    supportsJSON: [] as const,\n    supportsImages: [] as const,\n    supportsToolCalls: [] as const,\n    supportsN: true,\n    generateDocs: true,\n  },\n  anthropic: {\n    models: [\n      'claude-3-7-sonnet-latest',\n      'claude-3-7-sonnet-20250219',\n      'claude-3-5-sonnet-latest',\n      'claude-3-5-sonnet-20240620',\n      'claude-3-5-haiku-20241022',\n      'claude-3-opus-20240229',\n      'claude-3-sonnet-20240229',\n      'claude-3-haiku-20240307',\n      'claude-2.1',\n      'claude-2.0',\n      'claude-instant-1.2',\n    ] as const,\n    supportsCompletion: true,\n    supportsStreaming: [\n      'claude-3-7-sonnet-latest',\n      'claude-3-7-sonnet-20250219',\n      'claude-3-5-sonnet-latest',\n      'claude-3-5-sonnet-20240620',\n      'claude-3-5-haiku-20241022',\n      'claude-3-opus-20240229',\n      'claude-3-sonnet-20240229',\n      'claude-3-haiku-20240307',\n      'claude-2.1',\n      'claude-2.0',\n      'claude-instant-1.2',\n    ] as const,\n    supportsJSON: [] as const,\n    supportsImages: [\n      'claude-3-7-sonnet-latest',\n      'claude-3-7-sonnet-20250219',\n      'claude-3-5-sonnet-latest',\n      'claude-3-5-sonnet-20240620',\n      'claude-3-opus-20240229',\n      'claude-3-sonnet-20240229',\n      'claude-3-haiku-20240307',\n    ] as const,\n    supportsToolCalls: [\n      'claude-3-7-sonnet-latest',\n      'claude-3-7-sonnet-20250219',\n      'claude-3-5-sonnet-latest',\n      'claude-3-5-sonnet-20240620',\n      'claude-3-5-haiku-20241022',\n      'claude-3-opus-20240229',\n      'claude-3-sonnet-20240229',\n      'claude-3-haiku-20240307',\n    ] as const,\n    supportsN: false,\n    generateDocs: true,\n  },\n  gemini: {\n    models: [\n      'gemini-2.0-flash-001',\n      'gemini-2.0-flash-lite-preview-02-05',\n      'gemini-1.5-pro',\n      'gemini-1.5-flash',\n      'gemini-1.5-flash-8b',\n      'gemini-1.0-pro',\n    ] as const,\n    supportsCompletion: true,\n    supportsStreaming: [\n      'gemini-2.0-flash-001',\n      'gemini-2.0-flash-lite-preview-02-05',\n      'gemini-1.5-pro',\n      'gemini-1.5-flash',\n      'gemini-1.5-flash-8b',\n      'gemini-1.0-pro',\n    ] as const,\n    supportsJSON: [\n      'gemini-2.0-flash-001',\n      'gemini-2.0-flash-lite-preview-02-05',\n      'gemini-1.5-pro',\n      'gemini-1.5-flash',\n      'gemini-1.5-flash-8b',\n    ] as const,\n    supportsImages: [\n      'gemini-2.0-flash-001',\n      'gemini-2.0-flash-lite-preview-02-05',\n      'gemini-1.5-pro',\n      'gemini-1.5-flash',\n      'gemini-1.5-flash-8b',\n    ] as const,\n    supportsToolCalls: [\n      'gemini-2.0-flash-001',\n      'gemini-1.5-pro',\n      'gemini-1.5-flash',\n      'gemini-1.5-flash-8b',\n      'gemini-1.0-pro',\n    ] as const,\n    supportsN: true,\n    generateDocs: true,\n  },\n  mistral: {\n    models: [\n      'open-mistral-7b',\n      'mistral-tiny-2312',\n      'open-mixtral-8x7b',\n      'mistral-small-2312',\n      'open-mixtral-8x22b',\n      'open-mixtral-8x22b-2404',\n      'mistral-small-latest',\n      'mistral-small-2402',\n      'mistral-medium-latest',\n      'mistral-medium-2312',\n      'mistral-large-latest',\n      'mistral-large-2402',\n      'codestral-latest',\n      'codestral-2405',\n      'codestral-mamba-2407',\n    ] as const,\n    supportsCompletion: true,\n    supportsStreaming: [\n      'open-mistral-7b',\n      'mistral-tiny-2312',\n      'open-mixtral-8x7b',\n      'mistral-small-2312',\n      'open-mixtral-8x22b',\n      'open-mixtral-8x22b-2404',\n      'mistral-small-latest',\n      'mistral-small-2402',\n      'mistral-medium-latest',\n      'mistral-medium-2312',\n      'mistral-large-latest',\n      'mistral-large-2402',\n      'codestral-latest',\n      'codestral-2405',\n      'codestral-mamba-2407',\n    ] as const,\n    // Mistral claims that all of its models support JSON, but several of their weaker models either\n    // fail to produce valid JSON or produce very low quality results for the following prompt:\n    // \"Generate a JSON that maps ten athletes to their jersey numbers\". We removed these models\n    // from the list to ensure that we only support models that reliably produce decent results.\n    supportsJSON: [\n      'open-mistral-7b',\n      'mistral-tiny-2312',\n      'open-mixtral-8x22b',\n      'open-mixtral-8x22b-2404',\n      'mistral-large-latest',\n      'mistral-large-2402',\n      'codestral-latest',\n      'codestral-2405',\n      'codestral-mamba-2407',\n    ] as const,\n    supportsImages: [] as const,\n    supportsToolCalls: [\n      'open-mixtral-8x22b',\n      'open-mixtral-8x22b-2404',\n      'mistral-small-latest',\n      'mistral-small-2402',\n      'mistral-large-latest',\n      'mistral-large-2402',\n      'codestral-mamba-2407',\n    ] as const,\n    supportsN: false,\n    generateDocs: true,\n  },\n  groq: {\n    models: [\n      'llama-3.3-70b-versatile',\n      'llama-3.1-8b-instant',\n      'llama3-8b-8192',\n      'llama3-70b-8192',\n      'mixtral-8x7b-32768',\n      'gemma-7b-it',\n      'gemma2-9b-it',\n    ] as const,\n    supportsCompletion: true,\n    supportsStreaming: [\n      'llama-3.3-70b-versatile',\n      'llama-3.1-8b-instant',\n      'llama3-8b-8192',\n      'llama3-70b-8192',\n      'mixtral-8x7b-32768',\n      'gemma-7b-it',\n      'gemma2-9b-it',\n    ] as const,\n    // Groq claims that all of its models support JSON, but some of the weaker models either fail to\n    // produce valid JSON or produce very low quality results for the following prompt: \"Generate a\n    // JSON that maps ten athletes to their jersey numbers\". We removed these models from the list\n    // to ensure that we only support models that reliably produce decent results.\n    supportsJSON: [\n      'llama-3.3-70b-versatile',\n      'llama-3.1-8b-instant',\n      'llama3-70b-8192',\n      'gemma-7b-it',\n      'gemma2-9b-it',\n    ] as const,\n    supportsImages: [] as const,\n    supportsToolCalls: [] as const,\n    supportsN: false,\n    generateDocs: true,\n  },\n  perplexity: {\n    models: [\n      'llama-3.1-sonar-small-128k-online',\n      'llama-3.1-sonar-large-128k-online',\n      'llama-3.1-sonar-huge-128k-online',\n    ] as const,\n    supportsCompletion: true,\n    supportsStreaming: [\n      'llama-3.1-sonar-small-128k-online',\n      'llama-3.1-sonar-large-128k-online',\n      'llama-3.1-sonar-huge-128k-online',\n    ] as const,\n    supportsJSON: [] as const,\n    supportsImages: [] as const,\n    supportsToolCalls: [] as const,\n    supportsN: false,\n    generateDocs: true,\n  },\n  openrouter: {\n    models: true,\n    supportsCompletion: true,\n    supportsStreaming: true,\n    supportsJSON: true,\n    supportsImages: true,\n    supportsToolCalls: true,\n    supportsN: true,\n    generateDocs: false,\n  },\n  'openai-compatible': {\n    models: true,\n    supportsCompletion: true,\n    supportsStreaming: true,\n    supportsJSON: true,\n    supportsImages: true,\n    supportsToolCalls: true,\n    supportsN: true,\n    generateDocs: false,\n  },\n  'azure-openai': {\n    models: true,\n    supportsCompletion: true,\n    supportsStreaming: true,\n    supportsJSON: true,\n    supportsImages: true,\n    supportsToolCalls: true,\n    supportsN: true,\n    generateDocs: false,\n  },\n};\n","/**\n * The following code is modified based on\n * https://github.com/token-js/token.js/blob/main/src/handlers/types.ts\n *\n * MIT License\n * Copyright (c) 2024 RPate97\n * https://github.com/token-js/token.js/blob/main/LICENSE\n */\n\nexport type MessageRole = 'system' | 'user' | 'assistant' | 'tool' | 'function' | 'developer';\nexport type MIMEType = 'image/jpeg' | 'image/png' | 'image/gif' | 'image/webp';\n\nexport class InputError extends Error {\n  constructor(message: string) {\n    super(message);\n    this.name = this.constructor.name;\n    Error.captureStackTrace(this, this.constructor);\n  }\n}\n\nexport class InvariantError extends Error {\n  constructor(message: string) {\n    super(`${message}\\n` + `Should never happen. Please report this error to the developers.`);\n    this.name = 'InvariantError';\n    Error.captureStackTrace(this, this.constructor);\n  }\n}\n","/**\n * The following code is modified based on\n * https://github.com/token-js/token.js/blob/main/src/handlers/base.ts\n *\n * MIT License\n * Copyright (c) 2024 RPate97\n * https://github.com/token-js/token.js/blob/main/LICENSE\n */\n\nimport { CompletionParams, LLMChatModel } from '../chat/index.js';\nimport { CompletionResponse, ConfigOptions, StreamCompletionResponse } from '../userTypes/index.js';\nimport { InputError } from './types.js';\n\nexport abstract class BaseHandler<T extends LLMChatModel> {\n  opts: ConfigOptions;\n  protected models: readonly T[] | boolean;\n  protected supportsJSON: readonly T[] | boolean;\n  protected supportsImages: readonly T[] | boolean;\n  protected supportsToolCalls: readonly T[] | boolean;\n  protected supportsN: readonly T[] | boolean;\n  protected supportsStreamingMessages: readonly T[] | boolean;\n\n  constructor(\n    opts: ConfigOptions,\n    models: readonly T[] | boolean,\n    supportsJSON: readonly T[] | boolean,\n    supportsImages: readonly T[] | boolean,\n    supportsToolCalls: readonly T[] | boolean,\n    suportsN: readonly T[] | boolean,\n    supportsStreamingMessages: readonly T[] | boolean,\n  ) {\n    this.opts = opts;\n    this.models = models;\n    this.supportsJSON = supportsJSON;\n    this.supportsImages = supportsImages;\n    this.supportsToolCalls = supportsToolCalls;\n    this.supportsN = suportsN;\n    this.supportsStreamingMessages = supportsStreamingMessages;\n  }\n\n  abstract create(body: CompletionParams): Promise<CompletionResponse | StreamCompletionResponse>;\n\n  protected validateInputs(body: CompletionParams): void {\n    // We remove the provider key from the body just in case the provider does validation which errors due to it.\n    // This can only occur on OpenAI compatible providers, but we do it for all providers for consistency.\n    delete (body as any).provider;\n\n    if (!this.isSupportedModel(body.model)) {\n      throw new InputError(`Invalid 'model' field: ${body.model}.`);\n    }\n\n    if (body.stream && !this.supportsStreaming(body.model)) {\n      throw new Error(\n        `Detected 'stream: true', but the following model does not support streaming: ${body.model}`,\n      );\n    }\n\n    if (body.tools !== undefined && !this.supportsTools(body.model)) {\n      throw new InputError(\n        `Detected a 'tools' parameter, but the following model does not support tools: ${body.model}`,\n      );\n    }\n\n    if (body.tool_choice !== undefined && !this.supportsTools(body.model)) {\n      throw new InputError(\n        `Detected a 'tool_choice' parameter, but the following model does not support tools: ${body.model}`,\n      );\n    }\n\n    if (typeof body.temperature === 'number' && body.temperature > 2) {\n      throw new InputError(\n        `Expected a temperature less than or equal to 2, but got: ${body.temperature}`,\n      );\n    }\n\n    if (typeof body.top_p === 'number' && body.top_p > 1) {\n      throw new InputError(`Expected a top_p less than or equal to 1.0, but got: ${body.top_p}`);\n    }\n\n    for (const message of body.messages) {\n      if (message.role === 'function') {\n        throw new InputError(\n          `The 'function' role is deprecated. Please use the 'tool' role instead.`,\n        );\n      }\n\n      if (message.role === 'user') {\n        if (Array.isArray(message.content)) {\n          for (const content of message.content) {\n            if (content.type === 'image_url' && !this.supportsImageMessages(body.model)) {\n              throw new InputError(\n                `Detected an image in the 'messages' array, but the following model does not support images: ${body.model}`,\n              );\n            }\n          }\n        }\n      }\n    }\n\n    if (typeof body.n === 'number' && body.n > 1 && !this.supportsNGreaterThanOne(body.model)) {\n      throw new InputError(`The model ${body.model} does not support setting 'n' greater than 1.`);\n    }\n\n    if (body.response_format?.type === 'json_object') {\n      if (!this.supportsJSONMode(body.model)) {\n        throw new InputError(\n          `The model ${body.model} does not support the 'response_format' type 'json_object'.`,\n        );\n      }\n\n      // Check if the user specified the string 'json' somewhere in the prompt. OpenAI throws an\n      // error if the user doesn't include this string in the prompt, so we enforce this for every\n      // provider for consistency.\n      let containsJSONString = false;\n      for (const message of body.messages) {\n        if (typeof message.content === 'string') {\n          if (message.content.toLowerCase().includes('json')) {\n            containsJSONString = true;\n            break;\n          }\n        } else if (Array.isArray(message.content)) {\n          for (const e of message.content) {\n            if (e.type === 'text') {\n              if (e.text.toLowerCase().includes('json')) {\n                containsJSONString = true;\n                break;\n              }\n            }\n          }\n        }\n      }\n\n      if (!containsJSONString) {\n        throw new InputError(\n          `You must include the string 'JSON' somewhere in your prompt when the 'response_format' type is 'json_object'.`,\n        );\n      }\n    }\n  }\n\n  protected isSupportedFeature(featureSupport: readonly T[] | boolean, model: T): boolean {\n    if (typeof featureSupport === 'boolean') {\n      return featureSupport;\n    } else {\n      return featureSupport.includes(model);\n    }\n  }\n\n  // We make this public so that we can mock it in tests, which is fine because the `BaseHandler`\n  // class isn't exposed to the user.\n  public isSupportedModel(model: string): model is T {\n    return this.isSupportedFeature(this.models, model as T);\n  }\n\n  protected supportsJSONMode(model: T): boolean {\n    return this.isSupportedFeature(this.supportsJSON, model);\n  }\n\n  protected supportsImageMessages(model: T): boolean {\n    return this.isSupportedFeature(this.supportsImages, model);\n  }\n\n  protected supportsNGreaterThanOne(model: T): boolean {\n    return this.isSupportedFeature(this.supportsN, model);\n  }\n\n  protected supportsTools(model: T): boolean {\n    return this.isSupportedFeature(this.supportsToolCalls, model);\n  }\n\n  protected supportsStreaming(model: T): boolean {\n    return this.isSupportedFeature(this.supportsStreamingMessages, model);\n  }\n}\n","/**\n * The following code is modified based on\n * https://github.com/token-js/token.js/blob/main/src/handlers/ai21.ts\n *\n * MIT License\n * Copyright (c) 2024 RPate97\n * https://github.com/token-js/token.js/blob/main/LICENSE\n */\n\nimport {\n  AI21Model,\n  CompletionParams,\n  LLMChatModel,\n  ProviderCompletionParams,\n} from '../chat/index.js';\nimport { CompletionResponse, StreamCompletionResponse } from '../userTypes/index.js';\nimport { BaseHandler } from './base.js';\nimport { InputError } from './types.js';\nimport { convertMessageContentToString, getTimestamp } from './utils.js';\n\ntype AI21ChatCompletionParams = {\n  model: string;\n  messages: {\n    role: 'user' | 'assistant' | 'system';\n    content: string;\n  }[];\n  max_tokens?: number;\n  temperature?: number;\n  top_p?: number;\n  stop?: string | string[];\n  n?: number;\n  stream?: boolean;\n  logprobs?: never;\n  top_logprobs?: never;\n};\n\ntype AI21ChatCompletionResponseNonStreaming = {\n  id: string;\n  choices: {\n    index: number;\n    message: {\n      role: 'assistant';\n      content: string;\n    };\n    finish_reason: 'stop' | 'length';\n  }[];\n  usage: {\n    prompt_tokens: number;\n    completion_tokens: number;\n    total_tokens: number;\n  };\n};\n\ntype AI21ChatCompletionResponseStreaming = {\n  id: string;\n  choices: [\n    {\n      index: number;\n      delta: { role?: 'assistant'; content?: string };\n      finish_reason: 'stop' | 'length' | null;\n    },\n  ];\n  usage?: {\n    prompt_tokens: number;\n    completion_tokens: number;\n    total_tokens: number;\n  };\n};\n\nconst convertMessages = (\n  messages: CompletionParams['messages'],\n): AI21ChatCompletionParams['messages'] => {\n  const output: AI21ChatCompletionParams['messages'] = [];\n\n  let previousRole: 'user' | 'assistant' = 'user';\n  let currentMessages: Array<string> = [];\n  for (let i = 0; i < messages.length; i++) {\n    const message = messages[i];\n    if (i === 0 && message.role === 'system') {\n      output.push({\n        role: 'system',\n        content: convertMessageContentToString(message.content),\n      });\n    } else if (\n      message.role === 'user' ||\n      message.role === 'assistant' ||\n      message.role === 'system'\n    ) {\n      // AI21's documentation says to only use the `system` role for the first\n      // message in their `messages` array. If the user defines system messages later in their\n      // prompt, we replace it with the `user` role and prepend 'System: ' to its content. We do\n      // this instead of putting every system message in AI21's `system` string parameter so that\n      // the order of the user-defined `messages` remains the same, even when the system messages\n      // are interspersed with messages from other roles.\n      const newRole = message.role === 'user' || message.role === 'system' ? 'user' : 'assistant';\n\n      if (previousRole !== newRole) {\n        output.push({\n          role: previousRole,\n          content: currentMessages.join('\\n'),\n        });\n        currentMessages = [];\n      }\n\n      if (typeof message.content === 'string') {\n        const text = message.role === 'system' ? `System: ${message.content}` : message.content;\n        currentMessages.push(text);\n      } else if (Array.isArray(message.content)) {\n        const convertedContent = message.content.map((e) => {\n          if (e.type === 'text') {\n            const text = message.role === 'system' ? `System: ${e.text}` : e.text;\n            return text;\n          } else {\n            throw new InputError(`AI21 does not support images.`);\n          }\n        });\n        currentMessages.push(...convertedContent);\n      }\n\n      previousRole = newRole;\n    }\n  }\n\n  if (currentMessages.length > 0) {\n    output.push({\n      role: previousRole,\n      content: currentMessages.join('\\n'),\n    });\n  }\n\n  return output;\n};\n\nasync function* createCompletionResponseStreaming(\n  responseStream: ReadableStream<Uint8Array>,\n  model: LLMChatModel,\n  created: number,\n): StreamCompletionResponse {\n  const reader = responseStream.getReader();\n  const decoder = new TextDecoder();\n  let buffer = '';\n\n  try {\n    while (true) {\n      const { done, value } = await reader.read();\n      if (done) {\n        break;\n      }\n\n      buffer += decoder.decode(value, { stream: true });\n      const lines = buffer.split('\\n');\n      buffer = lines.pop() || '';\n\n      for (const line of lines) {\n        if (line.trim() === 'data: [DONE]') {\n          return;\n        }\n\n        if (line.trim().startsWith('data:')) {\n          const response: AI21ChatCompletionResponseStreaming = JSON.parse(\n            line.replace(/^data:\\s*/, '').trim(),\n          );\n\n          let content = '';\n          for (const choice of response.choices) {\n            if (typeof choice.delta.content === 'string') {\n              content += choice.delta.content;\n            }\n          }\n\n          const { id, choices } = response;\n          const finish_reason = choices[0].finish_reason;\n\n          yield {\n            choices: [\n              {\n                index: 0,\n                finish_reason,\n                logprobs: null,\n                delta: {\n                  role: 'assistant',\n                  content,\n                },\n              },\n            ],\n            id,\n            created,\n            model,\n            object: 'chat.completion.chunk',\n          };\n        }\n      }\n    }\n  } finally {\n    reader.releaseLock();\n  }\n}\n\nexport class AI21Handler extends BaseHandler<AI21Model> {\n  validateInputs(body: CompletionParams): void {\n    super.validateInputs(body);\n\n    if (typeof body.n === 'number' && (body.n > 16 || body.n < 0)) {\n      throw new InputError(\n        `AI21 requires that the 'n' parameter is a value between 0 and 16, inclusive. Instead, got: ${body.n}`,\n      );\n    }\n\n    if (typeof body.n === 'number' && body.stream === true && body.n > 1) {\n      throw new InputError(\n        `AI21 requires that 'n' equals '1' when streaming is enabled. Received an 'n' value of: ${body.n}`,\n      );\n    }\n  }\n\n  async create(\n    body: ProviderCompletionParams<'ai21'>,\n  ): Promise<CompletionResponse | StreamCompletionResponse> {\n    this.validateInputs(body);\n\n    const apiKey = this.opts.apiKey ?? process.env.AI21_API_KEY;\n    if (apiKey === undefined) {\n      throw new InputError(\n        \"No AI21 API key detected. Please define an 'AI21_API_KEY' environment variable or supply the API key using the 'apiKey' parameter.\",\n      );\n    }\n\n    const messages = convertMessages(body.messages);\n\n    const params: AI21ChatCompletionParams = {\n      max_tokens: body.max_tokens ?? undefined,\n      messages,\n      model: body.model,\n      n: body.n ?? undefined,\n      stop: body.stop ?? undefined,\n      temperature: body.temperature ?? undefined,\n      top_p: body.top_p ?? undefined,\n      stream: body.stream ?? undefined,\n    };\n\n    const created = getTimestamp();\n    const response = await fetch('https://api.ai21.com/studio/v1/chat/completions', {\n      method: 'POST',\n      headers: {\n        Authorization: `Bearer ${apiKey}`,\n        'Content-Type': 'application/json',\n      },\n      body: JSON.stringify(params),\n    });\n\n    if (!response.ok) {\n      throw new Error(`HTTP error! status: ${response.status}`);\n    }\n\n    if (body.stream === true) {\n      return createCompletionResponseStreaming(\n        response.body as ReadableStream<Uint8Array>,\n        body.model,\n        created,\n      );\n    } else {\n      const data: AI21ChatCompletionResponseNonStreaming = await response.json();\n\n      const convertedChoices = data.choices.map((choice) => {\n        return {\n          ...choice,\n          message: {\n            ...choice.message,\n            refusal: null,\n          },\n          logprobs: null,\n        };\n      });\n      const convertedResponse: CompletionResponse = {\n        choices: convertedChoices,\n        id: data.id,\n        usage: data.usage,\n        created,\n        model: body.model,\n        object: 'chat.completion',\n      };\n\n      return convertedResponse;\n    }\n  }\n}\n","/**\n * The following code is modified based on\n * https://github.com/token-js/token.js/blob/main/src/handlers/anthropic.ts\n *\n * MIT License\n * Copyright (c) 2024 RPate97\n * https://github.com/token-js/token.js/blob/main/LICENSE\n */\n\nimport Anthropic from '@anthropic-ai/sdk';\nimport {\n  ContentBlock,\n  ImageBlockParam,\n  Message,\n  MessageCreateParamsNonStreaming,\n  MessageCreateParamsStreaming,\n  MessageStream,\n  TextBlock,\n  TextBlockParam,\n  ToolResultBlockParam,\n  ToolUseBlock,\n  ToolUseBlockParam,\n} from '@anthropic-ai/sdk/resources/messages';\nimport { ChatCompletionMessageToolCall } from 'openai/resources/index';\n\nimport { AnthropicModel, CompletionParams, ProviderCompletionParams } from '../chat/index.js';\nimport {\n  CompletionResponse,\n  CompletionResponseChunk,\n  StreamCompletionResponse,\n} from '../userTypes/index.js';\nimport { BaseHandler } from './base.js';\nimport { InputError, InvariantError } from './types.js';\nimport {\n  consoleWarn,\n  convertMessageContentToString,\n  fetchThenParseImage,\n  getTimestamp,\n  isEmptyObject,\n} from './utils.js';\n\nexport const createCompletionResponseNonStreaming = (\n  response: Message,\n  created: number,\n  toolChoice: CompletionParams['tool_choice'],\n): CompletionResponse => {\n  const finishReason = toFinishReasonNonStreaming(response.stop_reason);\n  const chatMessage = toChatCompletionChoiceMessage(response.content, response.role, toolChoice);\n  const choice = {\n    index: 0,\n    logprobs: null,\n    message: chatMessage,\n    finish_reason: finishReason,\n  };\n  const converted: CompletionResponse = {\n    id: response.id,\n    choices: [choice],\n    created,\n    model: response.model,\n    object: 'chat.completion',\n    usage: {\n      prompt_tokens: response.usage.input_tokens,\n      completion_tokens: response.usage.output_tokens,\n      total_tokens: response.usage.input_tokens + response.usage.output_tokens,\n    },\n  };\n\n  return converted;\n};\n\nexport async function* createCompletionResponseStreaming(\n  response: MessageStream,\n  created: number,\n): StreamCompletionResponse {\n  let message: Message | undefined;\n\n  // We manually keep track of the tool call index because some providers, like Anthropic, start\n  // with a tool call index of 1 because they're preceded by a text block that has an index of 0 in\n  // the `response`. Since OpenAI's tool call index starts with 0, we also enforce that convention\n  // here for consistency.\n  let initialToolCallIndex: number | null = null;\n\n  for await (const chunk of response) {\n    if (chunk.type === 'message_start') {\n      message = chunk.message;\n      // Yield the first element\n      yield {\n        choices: [\n          {\n            index: 0,\n            finish_reason: toFinishReasonStreaming(chunk.message.stop_reason),\n            logprobs: null,\n            delta: {\n              role: chunk.message.role,\n            },\n          },\n        ],\n        created,\n        model: message.model,\n        id: message.id,\n        object: 'chat.completion.chunk',\n      };\n    }\n\n    if (message === undefined) {\n      throw new InvariantError(`Message is undefined.`);\n    }\n\n    let newStopReason: Message['stop_reason'] | undefined;\n\n    let delta: CompletionResponseChunk['choices'][0]['delta'] = {};\n    if (chunk.type === 'content_block_start') {\n      if (chunk.content_block.type === 'text') {\n        delta = {\n          content: chunk.content_block.text,\n        };\n      } else {\n        if (initialToolCallIndex === null) {\n          initialToolCallIndex = chunk.index;\n        }\n\n        delta = {\n          tool_calls: [\n            {\n              index: chunk.index - initialToolCallIndex,\n              id: chunk.content_block.id,\n              type: 'function',\n              function: {\n                name: chunk.content_block.name,\n                arguments: isEmptyObject(chunk.content_block.input)\n                  ? ''\n                  : JSON.stringify(chunk.content_block.input),\n              },\n            },\n          ],\n        };\n      }\n    } else if (chunk.type === 'content_block_delta') {\n      if (chunk.delta.type === 'input_json_delta') {\n        if (initialToolCallIndex === null) {\n          // We assign the initial tool call index in the `content_block_start` event, which should\n          // always come before a `content_block_delta` event, so this variable should never be null.\n          throw new InvariantError(\n            `Content block delta event came before a content block start event.`,\n          );\n        }\n\n        delta = {\n          tool_calls: [\n            {\n              index: chunk.index - initialToolCallIndex,\n              function: {\n                arguments: chunk.delta.partial_json,\n              },\n            },\n          ],\n        };\n      } else {\n        delta = {\n          content: chunk.delta.text,\n        };\n      }\n    } else if (chunk.type === 'message_delta') {\n      newStopReason = chunk.delta.stop_reason;\n    }\n\n    const stopReason = newStopReason !== undefined ? newStopReason : message.stop_reason;\n    const finishReason = toFinishReasonStreaming(stopReason);\n\n    const chunkChoice = {\n      index: 0,\n      finish_reason: finishReason,\n      logprobs: null,\n      delta,\n    };\n\n    yield {\n      choices: [chunkChoice],\n      created,\n      model: message.model,\n      id: message.id,\n      object: 'chat.completion.chunk',\n      // Our SDK doesn't currently support OpenAI's `stream_options`, so we don't include a `usage`\n      // field here.\n    };\n  }\n}\n\nconst isTextBlock = (contentBlock: ContentBlock): contentBlock is TextBlock => {\n  return contentBlock.type === 'text';\n};\n\nconst isToolUseBlock = (contentBlock: ContentBlock): contentBlock is ToolUseBlock => {\n  return contentBlock.type === 'tool_use';\n};\n\nconst toChatCompletionChoiceMessage = (\n  content: Message['content'],\n  role: Message['role'],\n  toolChoice: CompletionParams['tool_choice'],\n): CompletionResponse['choices'][0]['message'] => {\n  const textBlocks = content.filter(isTextBlock);\n  if (textBlocks.length > 1) {\n    consoleWarn(\n      `Received multiple text blocks from Anthropic, which is unexpected. Concatenating the text blocks into a single string.`,\n    );\n  }\n\n  let toolUseBlocks: Anthropic.Messages.ToolUseBlock[];\n  if (typeof toolChoice !== 'string' && toolChoice?.type === 'function') {\n    // When the user-defined tool_choice type is 'function', OpenAI always returns a single tool use\n    // block, but Anthropic can return multiple tool use blocks. We select just one of these blocks\n    // to conform to OpenAI's API.\n    const selected = content\n      .filter(isToolUseBlock)\n      .find((block) => block.name === toolChoice.function.name);\n    if (!selected) {\n      throw new InvariantError(\n        `Did not receive a tool use block from Anthropic for the function: ${toolChoice.function.name}`,\n      );\n    }\n    toolUseBlocks = [selected];\n  } else {\n    toolUseBlocks = content.filter(isToolUseBlock);\n  }\n\n  let toolCalls: Array<ChatCompletionMessageToolCall> | undefined;\n  if (toolUseBlocks.length > 0) {\n    toolCalls = toolUseBlocks.map((toolUse) => {\n      return {\n        id: toolUse.id,\n        function: {\n          name: toolUse.name,\n          arguments: JSON.stringify(toolUse.input),\n        },\n        type: 'function',\n      };\n    });\n  }\n\n  if (textBlocks.length === 0) {\n    // There can be zero text blocks if either of these scenarios happen:\n    // - A stop sequence is immediately hit, in which case Anthropic's `content` array is empty. In this\n    //   scenario, OpenAI returns an empty string `content` field.\n    // - There's only tool call responses. In this scenario, OpenAI returns a `content` field of `null`.\n    const messageContent = content.every(isToolUseBlock) ? null : '';\n    return {\n      role,\n      refusal: null,\n      content: messageContent,\n      tool_calls: toolCalls,\n    };\n  } else {\n    return {\n      role,\n      refusal: null,\n      content: textBlocks.map((textBlock) => textBlock.text).join('\\n'),\n      tool_calls: toolCalls,\n    };\n  }\n};\n\nconst toFinishReasonNonStreaming = (\n  stopReason: Message['stop_reason'],\n): CompletionResponse['choices'][0]['finish_reason'] => {\n  if (stopReason === null) {\n    // Anthropic's documentation says that the `stop_reason` will never be `null` for non-streaming\n    // calls.\n    throw new InvariantError(\n      `Detected a 'stop_reason' value of 'null' during a non-streaming call.`,\n    );\n  }\n\n  if (stopReason === 'end_turn' || stopReason === 'stop_sequence') {\n    return 'stop';\n  } else if (stopReason === 'max_tokens') {\n    return 'length';\n  } else if (stopReason === 'tool_use') {\n    return 'tool_calls';\n  } else {\n    return 'unknown';\n  }\n};\n\nexport const convertToolParams = (\n  toolChoice: CompletionParams['tool_choice'],\n  tools: CompletionParams['tools'],\n): {\n  toolChoice: MessageCreateParamsNonStreaming['tool_choice'];\n  tools: MessageCreateParamsNonStreaming['tools'];\n} => {\n  if (tools === undefined || toolChoice === 'none') {\n    return { toolChoice: undefined, tools: undefined };\n  }\n\n  const convertedTools: MessageCreateParamsNonStreaming['tools'] = tools.map((tool) => {\n    return {\n      name: tool.function.name,\n      description: tool.function.description,\n      input_schema: { type: 'object', ...tool.function.parameters },\n    };\n  });\n\n  let convertedToolChoice: MessageCreateParamsNonStreaming['tool_choice'];\n  if (toolChoice === undefined || toolChoice === 'auto') {\n    convertedToolChoice = { type: 'auto' };\n  } else if (toolChoice === 'required') {\n    convertedToolChoice = { type: 'any' };\n  } else {\n    convertedToolChoice = { type: 'tool', name: toolChoice.function.name };\n  }\n\n  return { toolChoice: convertedToolChoice, tools: convertedTools };\n};\n\nconst toFinishReasonStreaming = (\n  stopReason: Message['stop_reason'],\n): CompletionResponseChunk['choices'][0]['finish_reason'] => {\n  if (stopReason === null) {\n    return null;\n  } else if (stopReason === 'end_turn' || stopReason === 'stop_sequence') {\n    return 'stop';\n  } else if (stopReason === 'max_tokens') {\n    return 'length';\n  } else if (stopReason === 'tool_use') {\n    return 'tool_calls';\n  } else {\n    return 'unknown';\n  }\n};\n\nexport const getDefaultMaxTokens = (model: string): number => {\n  if (\n    model === 'claude-3-5-sonnet-20240620' ||\n    model === 'claude-3-opus-20240229' ||\n    model === 'claude-3-sonnet-20240229' ||\n    model === 'claude-3-haiku-20240307' ||\n    model === 'claude-2.1' ||\n    model === 'claude-2.0' ||\n    model === 'claude-instant-1.2'\n  ) {\n    return 4096;\n  } else if (\n    model === 'claude-3-5-sonnet-latest' ||\n    model === 'claude-3-5-sonnet-20241022' ||\n    model === 'claude-3-7-sonnet-latest' ||\n    model === 'claude-3-7-sonnet-20250219' ||\n    model === 'claude-3-5-haiku-20241022'\n  ) {\n    return 8192;\n  } else {\n    // We default to 8192 when the model is not specifically handled here to avoid throwing errors\n    return 8192;\n  }\n};\n\nexport const convertMessages = async (\n  messages: CompletionParams['messages'],\n): Promise<{\n  messages: MessageCreateParamsNonStreaming['messages'];\n  systemMessage: string | undefined;\n}> => {\n  const output: MessageCreateParamsNonStreaming['messages'] = [];\n  const clonedMessages = structuredClone(messages);\n\n  // Pop the first element from the user-defined `messages` array if it begins with a 'system'\n  // message. The returned element will be used for Anthropic's `system` parameter. We only pop the\n  // system message if it's the first element in the array so that the order of the messages remains\n  // unchanged.\n  let systemMessage: string | undefined;\n  if (clonedMessages.length > 0 && clonedMessages[0].role === 'system') {\n    systemMessage = convertMessageContentToString(clonedMessages[0].content);\n    clonedMessages.shift();\n  }\n\n  // Anthropic requires that the first message in the array is from a 'user' role, so we inject a\n  // placeholder user message if the array doesn't already begin with a message from a 'user' role.\n  if (clonedMessages[0].role !== 'user' && clonedMessages[0].role !== 'system') {\n    clonedMessages.unshift({\n      role: 'user',\n      content: 'Empty',\n    });\n  }\n\n  let previousRole: 'user' | 'assistant' = 'user';\n  let currentParams: Array<\n    TextBlockParam | ImageBlockParam | ToolUseBlockParam | ToolResultBlockParam\n  > = [];\n  for (const message of clonedMessages) {\n    // Anthropic doesn't support the `system` role in their `messages` array, so if the user\n    // defines system messages, we replace it with the `user` role and prepend 'System: ' to its\n    // content. We do this instead of putting every system message in Anthropic's `system` string\n    // parameter so that the order of the user-defined `messages` remains the same, even when the\n    // system messages are interspersed with messages from other roles.\n    const newRole =\n      message.role === 'user' || message.role === 'system' || message.role === 'tool'\n        ? 'user'\n        : 'assistant';\n\n    if (previousRole !== newRole) {\n      output.push({\n        role: previousRole,\n        content: currentParams,\n      });\n      currentParams = [];\n    }\n\n    if (message.role === 'tool') {\n      const toolResult: ToolResultBlockParam = {\n        tool_use_id: message.tool_call_id,\n        content: message.content,\n        type: 'tool_result',\n      };\n      currentParams.push(toolResult);\n    } else if (message.role === 'assistant') {\n      if (typeof message.content === 'string') {\n        currentParams.push({\n          text: message.content,\n          type: 'text',\n        });\n      }\n\n      if (Array.isArray(message.tool_calls)) {\n        const convertedContent: Array<ToolUseBlockParam> = message.tool_calls.map((toolCall) => {\n          return {\n            id: toolCall.id,\n            input: JSON.parse(toolCall.function.arguments),\n            name: toolCall.function.name,\n            type: 'tool_use',\n          };\n        });\n        currentParams.push(...convertedContent);\n      }\n    } else if (typeof message.content === 'string') {\n      const text = message.role === 'system' ? `System: ${message.content}` : message.content;\n      currentParams.push({\n        type: 'text',\n        text,\n      });\n    } else if (Array.isArray(message.content)) {\n      const convertedContent: Array<TextBlockParam | ImageBlockParam> = await Promise.all(\n        message.content.map(async (e) => {\n          if (e.type === 'text') {\n            const text = message.role === 'system' ? `System: ${e.text}` : e.text;\n            return {\n              type: 'text',\n              text,\n            } as TextBlockParam;\n          } else {\n            // @ts-expect-error\n            // FIXME: Property 'image_url' does not exist on type 'ChatCompletionContentPartImage | ChatCompletionContentPartInputAudio | File'.\n            const parsedImage = await fetchThenParseImage(e.image_url.url);\n            return {\n              type: 'image',\n              source: {\n                data: parsedImage.content,\n                media_type: parsedImage.mimeType,\n                type: 'base64',\n              },\n            } as ImageBlockParam;\n          }\n        }),\n      );\n      currentParams.push(...convertedContent);\n    }\n\n    previousRole = newRole;\n  }\n\n  if (currentParams.length > 0) {\n    output.push({\n      role: previousRole,\n      content: currentParams,\n    });\n  }\n\n  return { messages: output, systemMessage };\n};\n\nexport const convertStopSequences = (\n  stop?: CompletionParams['stop'],\n): Array<string> | undefined => {\n  if (stop === null || stop === undefined) {\n    return undefined;\n  } else if (typeof stop === 'string') {\n    return [stop];\n  } else if (Array.isArray(stop) && stop.every((e) => typeof e === 'string')) {\n    return stop;\n  } else {\n    throw new Error(`Unknown stop sequence: ${stop}`);\n  }\n};\n\nconst getApiKey = (apiKey?: string): string | undefined => {\n  return apiKey ?? process.env.ANTHROPIC_API_KEY;\n};\n\nexport class AnthropicHandler extends BaseHandler<AnthropicModel> {\n  validateInputs(body: ProviderCompletionParams<'anthropic'>): void {\n    super.validateInputs(body);\n\n    let logImageDetailWarning = false;\n    for (const message of body.messages) {\n      if (Array.isArray(message.content)) {\n        for (const e of message.content) {\n          if (e.type === 'image_url') {\n            if (e.image_url.detail !== undefined && e.image_url.detail !== 'auto') {\n              logImageDetailWarning = true;\n            }\n\n            if (\n              body.model === 'claude-instant-1.2' ||\n              body.model === 'claude-2.0' ||\n              body.model === 'claude-2.1'\n            ) {\n              throw new InputError(\n                `Model '${body.model}' does not support images. Remove any images from the prompt or use Claude version 3 or later.`,\n              );\n            }\n          }\n        }\n      }\n    }\n\n    if (logImageDetailWarning) {\n      consoleWarn(\n        `Anthropic does not support the 'detail' field for images. The default image quality will be used.`,\n      );\n    }\n  }\n\n  async create(\n    body: ProviderCompletionParams<'anthropic'>,\n  ): Promise<CompletionResponse | StreamCompletionResponse> {\n    this.validateInputs(body);\n\n    const apiKey = getApiKey(this.opts.apiKey);\n    if (apiKey === undefined) {\n      throw new InputError(\n        \"No Anthropic API key detected. Please define an 'ANTHROPIC_API_KEY' environment variable or supply the API key using the 'apiKey' parameter.\",\n      );\n    }\n\n    const stream = typeof body.stream === 'boolean' ? body.stream : undefined;\n    const maxTokens = body.max_tokens ?? getDefaultMaxTokens(body.model);\n    const client = new Anthropic({ \n      apiKey: getApiKey(this.opts.apiKey)!,\n      defaultHeaders: this.opts.defaultHeaders,\n    });\n    const stopSequences = convertStopSequences(body.stop);\n    const topP = typeof body.top_p === 'number' ? body.top_p : undefined;\n    const temperature =\n      typeof body.temperature === 'number'\n        ? // We divide by two because Anthropic's temperature range is 0 to 1, unlike OpenAI's, which is\n          // 0 to 2.\n          body.temperature / 2\n        : undefined;\n    const { messages, systemMessage } = await convertMessages(body.messages);\n    const { toolChoice, tools } = convertToolParams(body.tool_choice, body.tools);\n\n    if (stream === true) {\n      const convertedBody: MessageCreateParamsStreaming = {\n        max_tokens: maxTokens,\n        messages,\n        model: body.model,\n        stop_sequences: stopSequences,\n        temperature,\n        top_p: topP,\n        stream,\n        system: systemMessage,\n        tools,\n        tool_choice: toolChoice,\n      };\n      const created = getTimestamp();\n      const response = client.messages.stream(convertedBody);\n\n      return createCompletionResponseStreaming(response, created);\n    } else {\n      const convertedBody: MessageCreateParamsNonStreaming = {\n        max_tokens: maxTokens,\n        messages,\n        model: body.model,\n        stop_sequences: stopSequences,\n        temperature,\n        top_p: topP,\n        system: systemMessage,\n        tools,\n        tool_choice: toolChoice,\n      };\n\n      const created = getTimestamp();\n      const response = await client.messages.create(convertedBody);\n      return createCompletionResponseNonStreaming(response, created, body.tool_choice);\n    }\n  }\n}\n","/**\n * The following code is modified based on\n * https://github.com/token-js/token.js/blob/main/src/handlers/gemini.ts\n *\n * MIT License\n * Copyright (c) 2024 RPate97\n * https://github.com/token-js/token.js/blob/main/LICENSE\n */\n\nimport {\n  Content,\n  EnhancedGenerateContentResponse,\n  FinishReason,\n  FunctionCallPart,\n  FunctionCallingMode,\n  FunctionDeclarationSchema,\n  GenerateContentCandidate,\n  GenerateContentRequest,\n  GenerateContentResult,\n  GenerateContentStreamResult,\n  GoogleGenerativeAI,\n  InlineDataPart,\n  Part,\n  TextPart,\n  Tool,\n  ToolConfig,\n  UsageMetadata,\n} from '@google/generative-ai';\nimport { nanoid } from 'nanoid';\nimport OpenAI from 'openai';\nimport { ChatCompletionChunk, ChatCompletionContentPart } from 'openai/resources/index';\nimport { ChatCompletionMessageToolCall } from 'openai/src/resources/index.js';\n\nimport { GeminiModel, ProviderCompletionParams } from '../chat/index.js';\nimport { CompletionResponse, StreamCompletionResponse } from '../userTypes/index.js';\nimport { BaseHandler } from './base.js';\nimport { InputError } from './types.js';\nimport {\n  consoleWarn,\n  convertMessageContentToString,\n  fetchThenParseImage,\n  getTimestamp,\n} from './utils.js';\n\n// Google's `GenerateContentCandidate.content` field should be optional, but it's a required field\n// in Google's types. This field can be undefined if a content filter is triggered when the user\n// requests a JSON response via `response_format: { type: 'json_object'}`. The types below are\n// identical to Google's types except the `content` field is optional. Manually defining these types\n// is necessary to prevent this edge case from causing a bug in our SDK. The bug was caused by\n// 'gemini-1.5-pro' with the following prompt: \"Generate a JSON that represents a person, with name\n// and age. Give a concise answer.\"\ntype EnhancedResponseWithOptionalContent = Omit<EnhancedGenerateContentResponse, 'candidates'> & {\n  candidates?: GenerateContentCandidateWithOptionalContent[];\n};\ntype GenerateContentCandidateWithOptionalContent = Omit<GenerateContentCandidate, 'content'> & {\n  content?: Content;\n};\ntype GenerateContentResultWithOptionalContent = Omit<GenerateContentResult, 'response'> & {\n  response: EnhancedResponseWithOptionalContent;\n};\ntype GenerateContentStreamResultWithOptionalContent = Omit<\n  GenerateContentStreamResult,\n  'stream' | 'response'\n> & {\n  stream: AsyncGenerator<EnhancedResponseWithOptionalContent>;\n  response: Promise<EnhancedResponseWithOptionalContent>;\n};\n\nexport const convertContentsToParts = async (\n  contents: Array<ChatCompletionContentPart> | string | null | undefined,\n  systemPrefix: string,\n): Promise<Part[]> => {\n  if (contents === null || contents === undefined) {\n    return [];\n  }\n\n  if (typeof contents === 'string') {\n    return [\n      {\n        text: `${systemPrefix}${contents}`,\n      },\n    ];\n  } else {\n    const allParts: Promise<Part>[] = contents.map(async (part) => {\n      if (part.type === 'text') {\n        return {\n          text: `${systemPrefix}${part.text}`,\n        } as TextPart;\n      } else if (part.type === 'image_url') {\n        const imageData = await fetchThenParseImage(part.image_url.url);\n        return {\n          inlineData: {\n            mimeType: imageData.mimeType,\n            data: imageData.content,\n          },\n        } satisfies InlineDataPart;\n      } else {\n        throw new InputError(\n          `Invalid content part type: ${(part as any).type}. Must be \"text\" or \"image_url\".`,\n        );\n      }\n    });\n    return Promise.all(allParts);\n  }\n};\n\n// Google only supports the `model` and `user` roles, so we map everything else to `user`\n// We handle the `system` role similarly to Anthropic where the first message is placed in the systemInstruction field\n// if it is a system message, and the rest are treated as user messages but with a \"System:\" prefix.\nexport const convertRole = (role: 'function' | 'system' | 'user' | 'assistant' | 'tool') => {\n  switch (role) {\n    case 'assistant':\n      return 'model';\n    case 'function':\n    case 'tool':\n    case 'user':\n    case 'system':\n      return 'user';\n    default:\n      throw new InputError(`Unexpected message role: ${role}`);\n  }\n};\n\nexport const convertAssistantMessage = (\n  message: OpenAI.Chat.Completions.ChatCompletionMessage,\n): Content => {\n  const parts: (FunctionCallPart | TextPart)[] = message.tool_calls\n    ? message.tool_calls.map((call): FunctionCallPart => {\n        return {\n          functionCall: {\n            name: call.function.name,\n            args: JSON.parse(call.function.arguments),\n          },\n        };\n      })\n    : [];\n\n  if (message.content !== null) {\n    parts.push({\n      text: message.content,\n    });\n  }\n\n  return {\n    role: convertRole(message.role),\n    parts,\n  };\n};\n\nexport const convertMessageToContent = async (\n  message: OpenAI.Chat.Completions.ChatCompletionMessageParam,\n  includeSystemPrefix: boolean,\n): Promise<Content> => {\n  switch (message.role) {\n    case 'tool':\n      return {\n        role: convertRole(message.role),\n        parts: [\n          {\n            functionResponse: {\n              name: message.tool_call_id,\n              response: JSON.parse(convertMessageContentToString(message.content)),\n            },\n          },\n        ],\n      };\n    case 'assistant':\n      // Casting to the ChatCompletionMessage type here is fine because the role will only ever be\n      // assistant if the object is a ChatCompletionMessage\n      return convertAssistantMessage(message as OpenAI.Chat.Completions.ChatCompletionMessage);\n    case 'user':\n    case 'system':\n      const systemPrefix = message.role === 'system' && includeSystemPrefix ? 'System:\\n' : '';\n      return {\n        role: convertRole(message.role),\n        parts: await convertContentsToParts(message.content, systemPrefix),\n      };\n    default:\n      throw new InputError(`Unexpected message role: ${message.role}`);\n  }\n};\n\nexport const convertMessagesToContents = async (\n  messages: OpenAI.Chat.Completions.ChatCompletionMessageParam[],\n): Promise<{\n  contents: Content[];\n  systemInstruction: Content | undefined;\n}> => {\n  const clonedMessages = structuredClone(messages);\n\n  // Pop the first element from the user-defined `messages` array if it begins with a 'system'\n  // message. The returned element will be used for Gemini's `systemInstruction` parameter. We only pop the\n  // system message if it's the first element in the array so that the order of the messages remains\n  // unchanged.\n  let systemInstruction: Content | undefined;\n  if (clonedMessages.length > 0 && clonedMessages[0].role === 'system') {\n    const systemMessage = clonedMessages.shift();\n    systemInstruction =\n      systemMessage !== undefined ? await convertMessageToContent(systemMessage, false) : undefined;\n  }\n\n  const converted: Array<Content> = [];\n  for (const message of clonedMessages) {\n    if (message.role === 'system' || message.role === 'user') {\n      converted.push(await convertMessageToContent(message, true));\n    } else if (message.role === 'assistant') {\n      converted.push(await convertMessageToContent(message, true));\n      if (message.tool_calls !== undefined) {\n        for (const assistantToolCall of message.tool_calls) {\n          const toolResult = clonedMessages.find(\n            (m) => m.role === 'tool' && m.tool_call_id === assistantToolCall.id,\n          );\n          if (toolResult === undefined) {\n            throw new Error(`Could not find tool message with the id: ${assistantToolCall.id}`);\n          }\n          converted.push(await convertMessageToContent(toolResult, true));\n        }\n      }\n    }\n  }\n\n  return {\n    contents: converted,\n    systemInstruction,\n  };\n};\n\nexport const convertFinishReason = (\n  finishReason: FinishReason,\n  parts: Part[] | undefined,\n): 'stop' | 'length' | 'tool_calls' | 'content_filter' | 'function_call' => {\n  if (parts?.some((part) => part.functionCall !== undefined)) {\n    return 'tool_calls';\n  }\n\n  switch (finishReason) {\n    case FinishReason.STOP:\n      return 'stop';\n    case FinishReason.MAX_TOKENS:\n      return 'length';\n    case FinishReason.SAFETY:\n      return 'content_filter';\n    case FinishReason.OTHER:\n    case FinishReason.FINISH_REASON_UNSPECIFIED:\n    case FinishReason.RECITATION:\n      return 'stop';\n    default:\n      return 'stop';\n  }\n};\n\nexport const convertToolCalls = (\n  candidate: GenerateContentCandidateWithOptionalContent,\n): Array<ChatCompletionMessageToolCall> | undefined => {\n  const toolCalls = candidate.content?.parts\n    .filter((part) => part.functionCall !== undefined)\n    .map((part, index) => {\n      return {\n        id: nanoid(),\n        index,\n        function: {\n          arguments: JSON.stringify(part.functionCall!.args),\n          name: part.functionCall!.name,\n        },\n        // Casting as 'function' just fixes a minor type issue\n        type: 'function' as const,\n      };\n    });\n\n  if (toolCalls !== undefined && toolCalls.length > 0) {\n    return toolCalls;\n  } else {\n    return undefined;\n  }\n};\n\nexport const convertStreamToolCalls = (\n  candidate: GenerateContentCandidateWithOptionalContent,\n): Array<ChatCompletionChunk.Choice.Delta.ToolCall> | undefined => {\n  return convertToolCalls(candidate)?.map((toolCall, index) => {\n    return {\n      ...toolCall,\n      index,\n    };\n  });\n};\n\nexport const convertResponseMessage = (\n  candidate: GenerateContentCandidateWithOptionalContent,\n): CompletionResponse['choices'][number]['message'] => {\n  return {\n    content: candidate.content?.parts.map((part) => part.text).join('') ?? null,\n    role: 'assistant',\n    tool_calls: convertToolCalls(candidate),\n    refusal: null,\n  };\n};\n\nexport const convertUsageData = (usageMetadata: UsageMetadata): CompletionResponse['usage'] => {\n  return {\n    completion_tokens: usageMetadata.candidatesTokenCount,\n    prompt_tokens: usageMetadata.promptTokenCount,\n    total_tokens: usageMetadata.totalTokenCount,\n  };\n};\n\nexport const convertToolConfig = (\n  toolChoice: OpenAI.Chat.Completions.ChatCompletionToolChoiceOption | undefined,\n  tools: OpenAI.Chat.Completions.ChatCompletionTool[] | undefined,\n): ToolConfig => {\n  // If tool choise is an object, then it is a required specific function\n  if (typeof toolChoice === 'object') {\n    return {\n      functionCallingConfig: {\n        mode: FunctionCallingMode.ANY,\n        allowedFunctionNames: [toolChoice.function.name],\n      },\n    };\n  }\n\n  switch (toolChoice) {\n    case 'auto':\n      return {\n        functionCallingConfig: {\n          mode: FunctionCallingMode.AUTO,\n        },\n      };\n    case 'none':\n      return {\n        functionCallingConfig: {\n          mode: FunctionCallingMode.NONE,\n        },\n      };\n    case 'required':\n      return {\n        functionCallingConfig: {\n          mode: FunctionCallingMode.ANY,\n        },\n      };\n    default:\n      return {\n        functionCallingConfig: {\n          mode: tools && tools?.length > 0 ? FunctionCallingMode.AUTO : FunctionCallingMode.NONE,\n        },\n      };\n  }\n};\n\nexport const convertTools = (\n  tools: OpenAI.Chat.Completions.ChatCompletionTool[] | undefined,\n): Tool[] | undefined => {\n  if (tools === undefined) {\n    return undefined;\n  }\n\n  return tools.map((tool) => {\n    return {\n      functionDeclarations: [\n        {\n          name: tool.function.name,\n          description: tool.function.description,\n          // We can cast this directly to Google's type because they both use JSON Schema\n          // OpenAI just uses a generic Record<string, unknown> type for this.\n          parameters: tool.function.parameters as any as FunctionDeclarationSchema,\n        },\n      ],\n    };\n  });\n};\n\nexport const convertResponse = async (\n  result: GenerateContentResultWithOptionalContent,\n  model: string,\n  timestamp: number,\n): Promise<CompletionResponse> => {\n  return {\n    id: null,\n    object: 'chat.completion',\n    created: timestamp,\n    model,\n    choices:\n      result.response.candidates?.map((candidate) => {\n        return {\n          index: candidate.index,\n          finish_reason: candidate.finishReason\n            ? convertFinishReason(candidate.finishReason, candidate.content?.parts)\n            : 'stop',\n          message: convertResponseMessage(candidate),\n          // Google does not support logprobs\n          logprobs: null,\n          // There are also some other fields that Google returns that are not supported in the OpenAI format such as citations and safety ratings\n        };\n      }) ?? [],\n    usage: result.response.usageMetadata\n      ? convertUsageData(result.response.usageMetadata)\n      : undefined,\n  };\n};\n\nasync function* convertStreamResponse(\n  result: GenerateContentStreamResultWithOptionalContent,\n  model: string,\n  timestamp: number,\n): StreamCompletionResponse {\n  for await (const chunk of result.stream) {\n    const text = chunk.text();\n    yield {\n      id: null,\n      object: 'chat.completion.chunk',\n      created: timestamp,\n      model,\n      choices:\n        chunk.candidates?.map((candidate) => {\n          return {\n            index: candidate.index,\n            finish_reason: candidate.finishReason\n              ? convertFinishReason(candidate.finishReason, candidate.content?.parts)\n              : 'stop',\n            delta: {\n              content: text,\n              tool_calls: convertStreamToolCalls(candidate),\n              role: 'assistant',\n            },\n            logprobs: null,\n          };\n        }) ?? [],\n      usage: chunk.usageMetadata ? convertUsageData(chunk.usageMetadata) : undefined,\n    };\n  }\n}\n\n// To support a new provider, we just create a handler for them extending the BaseHandler class and implement the create method.\n// Then we update the Handlers object in src/handlers/utils.ts to include the new handler.\nexport class GeminiHandler extends BaseHandler<GeminiModel> {\n  async create(\n    body: ProviderCompletionParams<'gemini'>,\n  ): Promise<CompletionResponse | StreamCompletionResponse> {\n    this.validateInputs(body);\n\n    const apiKey = this.opts.apiKey ?? process.env.GEMINI_API_KEY;\n    if (apiKey === undefined) {\n      throw new InputError(\n        'API key is required for Gemini, define GEMINI_API_KEY in your environment or specifty the apiKey option.',\n      );\n    }\n\n    if (this.opts.baseURL) {\n      consoleWarn(\n        `The 'baseUrl' will be ignored by Gemini because it does not support this field.`,\n      );\n    }\n\n    const responseMimeType =\n      body.response_format?.type === 'json_object' ? 'application/json' : undefined;\n    const stop = typeof body.stop === 'string' ? [body.stop] : body.stop;\n    const genAI = new GoogleGenerativeAI(apiKey);\n    const model = genAI.getGenerativeModel({\n      model: body.model,\n      generationConfig: {\n        maxOutputTokens: body.max_tokens ?? undefined,\n        temperature: body.temperature ?? undefined,\n        topP: body.top_p ?? undefined,\n        stopSequences: stop ?? undefined,\n        candidateCount: body.n ?? undefined,\n        responseMimeType,\n      },\n      // Google also supports configurable safety settings which do not fit into the OpenAI format (this was an issue for us in the past, so we'll likely need to address it at some point)\n      // Google also supports cached content which does not fit into the OpenAI format\n    });\n\n    const { contents, systemInstruction } = await convertMessagesToContents(body.messages);\n    const params: GenerateContentRequest = {\n      contents,\n      toolConfig: convertToolConfig(body.tool_choice, body.tools),\n      tools: convertTools(body.tools),\n      systemInstruction,\n    };\n\n    const timestamp = getTimestamp();\n    if (body.stream) {\n      const result = (await model.generateContentStream(\n        params,\n      )) as GenerateContentStreamResultWithOptionalContent;\n      return convertStreamResponse(result, body.model, timestamp);\n    } else {\n      const result = (await model.generateContent(\n        params,\n      )) as GenerateContentResultWithOptionalContent;\n      return convertResponse(result, body.model, timestamp);\n    }\n  }\n}\n","/**\n * The following code is modified based on\n * https://github.com/token-js/token.js/blob/main/src/handlers/groq.ts\n *\n * MIT License\n * Copyright (c) 2024 RPate97\n * https://github.com/token-js/token.js/blob/main/LICENSE\n */\n\nimport OpenAI from 'openai';\n\nimport { GroqModel, ProviderCompletionParams } from '../chat/index.js';\nimport { CompletionResponse, StreamCompletionResponse } from '../userTypes/index.js';\nimport { BaseHandler } from './base.js';\nimport { InputError } from './types.js';\n\n// Groq is very compatible with OpenAI's API, so we could likely reuse the OpenAI SDK for this handler\n// to reducee the bundle size.\nexport class GroqHandler extends BaseHandler<GroqModel> {\n  validateInputs(body: ProviderCompletionParams<'groq'>): void {\n    super.validateInputs(body);\n\n    if (body.response_format?.type === 'json_object') {\n      if (body.stream) {\n        throw new InputError(\n          `Groq does not support streaming when the 'response_format' is 'json_object'.`,\n        );\n      }\n\n      if (body.stop !== null && body.stop !== undefined) {\n        throw new InputError(\n          `Groq does not support the 'stop' parameter when the 'response_format' is 'json_object'.`,\n        );\n      }\n    }\n  }\n\n  async create(\n    body: ProviderCompletionParams<'groq'>,\n  ): Promise<CompletionResponse | StreamCompletionResponse> {\n    this.validateInputs(body);\n\n    const apiKey = this.opts.apiKey ?? process.env.GROQ_API_KEY;\n    const client = new OpenAI({\n      apiKey,\n      baseURL: 'https://api.groq.com/openai/v1',\n      defaultHeaders: this.opts.defaultHeaders,\n    });\n\n    if (apiKey === undefined) {\n      throw new InputError(\n        'API key is required for Groq, define GROQ_API_KEY in your environment or specifty the apiKey option.',\n      );\n    }\n\n    return client.chat.completions.create(body);\n  }\n}\n","/**\n * The following code is modified based on\n * https://github.com/token-js/token.js/blob/main/src/handlers/mistral.ts\n *\n * MIT License\n * Copyright (c) 2024 RPate97\n * https://github.com/token-js/token.js/blob/main/LICENSE\n */\n\nimport MistralClient, {\n  ChatCompletionResponse,\n  ChatCompletionResponseChoice,\n  ChatCompletionResponseChunk,\n  ChatRequest,\n  Message,\n  ResponseFormat,\n  ToolCalls,\n} from '@mistralai/mistralai';\nimport {\n  ChatCompletionChunk,\n  ChatCompletionMessage,\n  ChatCompletionMessageParam,\n  ChatCompletionMessageToolCall,\n} from 'openai/resources/index';\nimport { ChatCompletionContentPartText } from 'openai/src/resources/index.js';\n\nimport { CompletionParams, MistralModel, ProviderCompletionParams } from '../chat/index.js';\nimport { CompletionResponse, StreamCompletionResponse } from '../userTypes/index.js';\nimport { BaseHandler } from './base.js';\nimport { InputError } from './types.js';\nimport { convertMessageContentToString } from './utils.js';\n\nexport const findLinkedToolCallName = (\n  messages: ChatCompletionMessage[],\n  toolCallId: string,\n): string => {\n  for (const message of messages) {\n    for (const toolCall of message?.tool_calls ?? []) {\n      if (toolCall.id === toolCallId) {\n        return toolCall.function.name;\n      }\n    }\n  }\n\n  throw new InputError(`Tool call with id ${toolCallId} not found in messages`);\n};\n\nexport const convertMessages = (\n  messages: (ChatCompletionMessageParam | ChatCompletionMessage)[],\n): Array<Message | ChatCompletionResponseChoice['message']> => {\n  return messages.map((message) => {\n    const messageContent = convertMessageContentToString(message.content);\n    if (message.role === 'tool') {\n      const name = findLinkedToolCallName(\n        messages as ChatCompletionMessage[],\n        message.tool_call_id,\n      );\n\n      return {\n        name,\n        role: 'tool',\n        content: messageContent,\n        tool_call_id: message.tool_call_id,\n      };\n    }\n\n    if (message.role === 'system') {\n      return {\n        role: message.role,\n        content: messageContent,\n      };\n    } else if (message.role === 'assistant') {\n      return {\n        role: message.role,\n        content: messageContent,\n        tool_calls: message.tool_calls ?? null,\n      };\n    } else if (message.role === 'user') {\n      const content =\n        typeof message.content === 'string'\n          ? message.content\n          : message.content?.map((m) => (m as ChatCompletionContentPartText).text);\n      return {\n        role: message.role,\n        content,\n      };\n    } else {\n      throw new Error('Function messages are deprecated.');\n    }\n  });\n};\n\nexport const convertTools = (\n  tools: CompletionParams['tools'],\n  specificFunctionName?: string,\n): ChatRequest['tools'] => {\n  if (!tools) {\n    return undefined;\n  }\n\n  const specifiedTool = tools.filter((tool) => {\n    if (specificFunctionName === undefined) {\n      return true;\n    } else {\n      return tool.function.name === specificFunctionName;\n    }\n  });\n\n  if (specificFunctionName !== undefined && specifiedTool.length === 0) {\n    throw new InputError(`Tool with name ${specificFunctionName} not found in tool list`);\n  }\n\n  return specifiedTool.map((tool) => {\n    return {\n      type: 'function',\n      function: {\n        name: tool.function.name,\n        description: tool.function.description ?? '',\n        parameters: tool.function.parameters ?? {},\n      },\n    };\n  });\n};\n\nexport const convertToolConfig = (\n  toolChoice: CompletionParams['tool_choice'],\n  tools: CompletionParams['tools'],\n): {\n  toolChoice: ChatRequest['toolChoice'];\n  tools: ChatRequest['tools'];\n} => {\n  // If tool choise is an object, then it is a required specific function\n  if (typeof toolChoice === 'object') {\n    return {\n      // Mistral does not fields that allow for specifying a specific tool out of a list, so instead we\n      // use the toolChoice `any` to force a tool to be used, and then we filter the tool list to only include\n      // the function that was specified.\n      toolChoice: 'any',\n      tools: convertTools(tools, toolChoice.function.name),\n    };\n  }\n\n  switch (toolChoice) {\n    case 'auto':\n      return {\n        toolChoice: 'auto',\n        tools: convertTools(tools),\n      };\n    case 'none':\n      return {\n        toolChoice: 'none',\n        tools: convertTools(tools),\n      };\n    case 'required':\n      return {\n        toolChoice: 'any',\n        tools: convertTools(tools),\n      };\n    case undefined:\n      return {\n        toolChoice: undefined,\n        tools: convertTools(tools),\n      };\n    default:\n      throw new InputError(`Invalid tool choice: ${toolChoice}`);\n  }\n};\n\nexport const convertToolCalls = (\n  toolResponse: ToolCalls[] | null | undefined,\n): ChatCompletionMessageToolCall[] | undefined => {\n  if (!toolResponse) {\n    return undefined;\n  }\n\n  return toolResponse.map((tool) => {\n    return {\n      id: tool.id,\n      type: 'function',\n      function: {\n        name: tool.function.name,\n        arguments: tool.function.arguments,\n      },\n    };\n  });\n};\n\nexport const convertStreamToolCalls = (\n  toolResponse: ToolCalls[] | null | undefined,\n): Array<ChatCompletionChunk.Choice.Delta.ToolCall> | undefined => {\n  if (!toolResponse) {\n    return undefined;\n  }\n\n  return convertToolCalls(toolResponse)?.map((toolCall, index) => {\n    return {\n      ...toolCall,\n      index,\n    };\n  });\n};\n\nasync function* toStreamResponse(\n  result: AsyncGenerator<ChatCompletionResponseChunk, void, unknown>,\n): StreamCompletionResponse {\n  for await (const chunk of result) {\n    yield {\n      id: chunk.id,\n      created: chunk.created,\n      object: chunk.object,\n      model: chunk.model,\n      choices: chunk.choices.map((choice) => {\n        return {\n          index: choice.index,\n          delta: {\n            role: 'assistant',\n            content: choice.delta.content,\n            tool_calls: convertStreamToolCalls(choice.delta.tool_calls),\n          },\n          finish_reason: choice.finish_reason as any,\n          logprobs: null,\n        };\n      }),\n      usage: chunk.usage ?? undefined,\n    };\n  }\n}\n\nconst toCompletionResponse = (result: ChatCompletionResponse): CompletionResponse => {\n  return {\n    id: result.id,\n    created: result.created,\n    object: result.object,\n    model: result.model,\n    choices: result.choices.map((choice) => {\n      return {\n        index: choice.index,\n        message: {\n          role: 'assistant',\n          refusal: null,\n          content: choice.message.content,\n          tool_calls: convertToolCalls(choice.message.tool_calls),\n        },\n        finish_reason: choice.finish_reason as any,\n        logprobs: null,\n      };\n    }),\n    usage: result.usage,\n  };\n};\n\nexport class MistralHandler extends BaseHandler<MistralModel> {\n  async create(\n    body: ProviderCompletionParams<'mistral'>,\n  ): Promise<CompletionResponse | StreamCompletionResponse> {\n    this.validateInputs(body);\n\n    const apiKey = this.opts.apiKey ?? process.env.MISTRAL_API_KEY;\n\n    if (apiKey === undefined) {\n      throw new InputError(\n        'API key is required for Mistral, define MISTRAL_API_KEY in your environment or specifty the apiKey option.',\n      );\n    }\n\n    const endpoint = this.opts.baseURL ?? undefined;\n    const client = new MistralClient(apiKey, endpoint);\n    const responseFormat: ResponseFormat | undefined =\n      body.response_format?.type === 'json_object'\n        ? {\n            type: 'json_object',\n          }\n        : undefined;\n\n    const temperature =\n      typeof body.temperature === 'number'\n        ? // We divide by two because Mistral's temperature range is 0 to 1 and the input temperature\n          // range is 0 to 2.\n          body.temperature / 2\n        : undefined;\n\n    const { toolChoice, tools } = convertToolConfig(body.tool_choice, body.tools);\n\n    const messages = convertMessages(body.messages);\n\n    const options: ChatRequest = {\n      model: body.model,\n      messages: messages as Message[],\n      temperature,\n      maxTokens: body.max_tokens ?? undefined,\n      topP: body.top_p ?? undefined,\n      responseFormat,\n      toolChoice,\n      tools,\n      // Mistral does not support `stop`\n    };\n\n    if (body.stream) {\n      const chatResponseStream = client.chatStream(options);\n      return toStreamResponse(chatResponseStream);\n    } else {\n      const chatResponse = await client.chat(options);\n      return toCompletionResponse(chatResponse);\n    }\n  }\n}\n","/**\n * The following code is modified based on\n * https://github.com/token-js/token.js/blob/main/src/handlers/openai-compatible.ts\n *\n * MIT License\n * Copyright (c) 2024 RPate97\n * https://github.com/token-js/token.js/blob/main/LICENSE\n */\n\nimport OpenAI from 'openai';\nimport { Stream } from 'openai/streaming';\n\nimport {\n  CompletionParams,\n  OpenAICompatibleModel,\n  ProviderCompletionParams,\n} from '../chat/index.js';\nimport { CompletionResponse, StreamCompletionResponse } from '../userTypes/index.js';\nimport { BaseHandler } from './base.js';\nimport { InputError } from './types.js';\n\nasync function* streamOpenAI(\n  response: Stream<OpenAI.Chat.Completions.ChatCompletionChunk>,\n): StreamCompletionResponse {\n  for await (const chunk of response) {\n    yield chunk;\n  }\n}\n\n// To support a new provider, we just create a handler for them extending the BaseHandler class and implement the create method.\n// Then we update the Handlers object in src/handlers/utils.ts to include the new handler.\nexport class OpenAICompatibleHandler extends BaseHandler<OpenAICompatibleModel> {\n  protected validateInputs(body: CompletionParams): void {\n    super.validateInputs(body);\n\n    if (!this.opts.baseURL) {\n      throw new InputError(\n        'No baseURL option provided for openai compatible provider. You must define a baseURL option to use a generic openai compatible API with Token.js',\n      );\n    }\n  }\n\n  determineAPIKey = () => {\n    if (this.opts.apiKey) {\n      return this.opts.apiKey;\n    } else if (process.env.OPENAI_COMPATIBLE_API_KEY) {\n      return process.env.OPENAI_COMPATIBLE_API_KEY;\n    } else {\n      /**\n       * We hardcode an empty API key if none is defined because the OpenAI SDK throws an error if we do not do this.\n       * There are plenty of reasonable cases where an API is not required by an openai compartible model provider (locally\n       * hosted models for example), so we want to avoid runtime errors in those situations.\n       * See this issue for an example: https://github.com/twinnydotdev/twinny/issues/440\n       *\n       * However, the tradeoff with this is that if the underlying provider requires an API key and the user does not provide one,\n       * they may get an unpredictable error. We deem this tradeoff acceptable in this case because using an unvetted openai-compatible\n       * model provider is inherently less safe than using a provider officially integrated and supported by Token.js. If users often,\n       * report errors related to this, we should consider officially supporting the behavior of the underlying provider that is causing issues.\n       *\n       * For example, we may want to officially support ollama local models if users often report problems related to using that provider via this\n       * generic implementation.\n       */\n      return '';\n    }\n  };\n\n  async create(\n    body: ProviderCompletionParams<'openai'>,\n  ): Promise<CompletionResponse | StreamCompletionResponse> {\n    this.validateInputs(body);\n\n    // Uses the OPENAI_API_KEY environment variable, if the apiKey is not provided.\n    // This makes the UX better for switching between providers because you can just\n    // define all the environment variables and then change the model field without doing anything else.\n    const apiKey = this.determineAPIKey();\n    const openai = new OpenAI({\n      ...this.opts,\n      apiKey,\n      defaultHeaders: this.opts.defaultHeaders,\n    });\n\n    // We have to delete the provider field because it's not a valid parameter for the OpenAI API.\n    const params: any = body;\n    delete params.provider;\n\n    if (body.stream) {\n      const stream = await openai.chat.completions.create(body);\n      return streamOpenAI(stream);\n    } else {\n      return openai.chat.completions.create(body);\n    }\n  }\n}\n","/**\n * The following code is modified based on\n * https://github.com/token-js/token.js/blob/main/src/handlers/openai.ts\n *\n * MIT License\n * Copyright (c) 2024 RPate97\n * https://github.com/token-js/token.js/blob/main/LICENSE\n */\n\nimport OpenAI from 'openai';\nimport { Stream } from 'openai/streaming';\n\nimport { OpenAIModel, ProviderCompletionParams } from '../chat/index.js';\nimport { CompletionResponse, StreamCompletionResponse } from '../userTypes/index.js';\nimport { BaseHandler } from './base.js';\n\nasync function* streamOpenAI(\n  response: Stream<OpenAI.Chat.Completions.ChatCompletionChunk>,\n): StreamCompletionResponse {\n  for await (const chunk of response) {\n    yield chunk;\n  }\n}\n\n// To support a new provider, we just create a handler for them extending the BaseHandler class and implement the create method.\n// Then we update the Handlers object in src/handlers/utils.ts to include the new handler.\nexport class OpenAIHandler extends BaseHandler<OpenAIModel> {\n  async create(\n    body: ProviderCompletionParams<'openai'>,\n  ): Promise<CompletionResponse | StreamCompletionResponse> {\n    this.validateInputs(body);\n\n    // Uses the OPENAI_API_KEY environment variable, if the apiKey is not provided.\n    // This makes the UX better for switching between providers because you can just\n    // define all the environment variables and then change the model field without doing anything else.\n    const apiKey = this.opts.apiKey ?? process.env.OPENAI_API_KEY;\n    const openai = new OpenAI({\n      ...this.opts,\n      apiKey,\n      defaultHeaders: this.opts.defaultHeaders,\n    });\n\n    // We have to delete the provider field because it's not a valid parameter for the OpenAI API.\n    const params: any = body;\n    delete params.provider;\n\n    if (body.stream) {\n      const stream = await openai.chat.completions.create(body);\n      return streamOpenAI(stream);\n    } else {\n      return openai.chat.completions.create(body);\n    }\n  }\n}\n","/**\n * This handler is designed to work with OpenAI models that don't natively support streaming,\n * but exposes a streaming interface to maintain API compatibility with streaming handlers.\n */\n\nimport OpenAI from 'openai';\nimport { ChatCompletion } from 'openai/resources';\n\nimport { OpenAIModel, ProviderCompletionParams } from '../chat/index.js';\nimport { CompletionResponse, StreamCompletionResponse } from '../userTypes/index.js';\nimport { BaseHandler } from './base.js';\n\n/**\n * Creates a synthetic stream from a non-streaming response\n * This allows applications to use a unified streaming interface\n * even when the underlying model doesn't support streaming\n */\nasync function* createSyntheticStream(response: ChatCompletion): StreamCompletionResponse {\n  // First chunk with role information\n  yield {\n    id: response.id,\n    object: 'chat.completion.chunk',\n    created: response.created,\n    model: response.model,\n    choices: [\n      {\n        index: 0,\n        delta: { role: 'assistant' },\n        finish_reason: null,\n        logprobs: null,\n      },\n    ],\n    usage: undefined,\n  };\n\n  // For each choice in the response\n  for (const choice of response.choices) {\n    const content = choice.message.content;\n\n    // If there's content, yield it as a content delta\n    if (content) {\n      yield {\n        id: response.id,\n        object: 'chat.completion.chunk',\n        created: response.created,\n        model: response.model,\n        choices: [\n          {\n            index: choice.index,\n            delta: { content },\n            finish_reason: null,\n            logprobs: null,\n          },\n        ],\n        usage: undefined,\n      };\n    }\n\n    // If there are tool calls, yield each one\n    if (choice.message.tool_calls) {\n      for (const toolCall of choice.message.tool_calls) {\n        yield {\n          id: response.id,\n          object: 'chat.completion.chunk',\n          created: response.created,\n          model: response.model,\n          choices: [\n            {\n              index: choice.index,\n              delta: {\n                tool_calls: [\n                  {\n                    index: 0,\n                    id: toolCall.id,\n                    type: toolCall.type,\n                    function: toolCall.function,\n                  },\n                ],\n              },\n              finish_reason: null,\n              logprobs: null,\n            },\n          ],\n          usage: undefined,\n        };\n      }\n    }\n\n    // Final chunk with finish reason\n    yield {\n      id: response.id,\n      object: 'chat.completion.chunk',\n      created: response.created,\n      model: response.model,\n      choices: [\n        {\n          index: choice.index,\n          delta: {},\n          finish_reason: choice.finish_reason,\n          logprobs: null,\n        },\n      ],\n      usage: response.usage,\n    };\n  }\n}\n\nexport class OpenAINonStreamingHandler extends BaseHandler<OpenAIModel> {\n  async create(\n    body: ProviderCompletionParams<'openai'>,\n  ): Promise<CompletionResponse | StreamCompletionResponse> {\n    this.validateInputs(body);\n\n    // Uses the OPENAI_API_KEY environment variable if not provided\n    const apiKey = this.opts.apiKey ?? process.env.OPENAI_API_KEY;\n    const openai = new OpenAI({\n      ...this.opts,\n      apiKey,\n      defaultHeaders: this.opts.defaultHeaders,\n    });\n\n    // We have to delete the provider field because it's not a valid parameter for the OpenAI API\n    const params = { ...body };\n    delete (params as any).provider;\n\n    // If streaming is requested, make a non-streaming call and convert to synthetic stream\n    if (body.stream) {\n      const nonStreamingParams = { ...params, stream: false };\n      const response = await openai.chat.completions.create(nonStreamingParams);\n      return createSyntheticStream(response as unknown as ChatCompletion);\n    } else {\n      // For non-streaming requests, just pass through\n      return openai.chat.completions.create(params);\n    }\n  }\n}\n","/**\n * The following code is modified based on\n * https://github.com/token-js/token.js/blob/main/src/handlers/openrouter.ts\n *\n * MIT License\n * Copyright (c) 2024 RPate97\n * https://github.com/token-js/token.js/blob/main/LICENSE\n */\n\nimport OpenAI from 'openai';\n\nimport { OpenRouterModel, ProviderCompletionParams } from '../chat/index.js';\nimport { CompletionResponse, StreamCompletionResponse } from '../userTypes/index.js';\nimport { BaseHandler } from './base.js';\nimport { InputError } from './types.js';\n\n// Groq is very compatible with OpenAI's API, so we could likely reuse the OpenAI SDK for this handler\n// to reducee the bundle size.\nexport class OpenRouterHandler extends BaseHandler<OpenRouterModel> {\n  validateInputs(body: ProviderCompletionParams<'openrouter'>): void {\n    super.validateInputs(body);\n  }\n\n  async create(\n    body: ProviderCompletionParams<'openrouter'>,\n  ): Promise<CompletionResponse | StreamCompletionResponse> {\n    this.validateInputs(body);\n\n    console.log('open router');\n\n    const apiKey = this.opts.apiKey ?? process.env.OPENROUTER_API_KEY;\n    const client = new OpenAI({\n      apiKey,\n      baseURL: 'https://openrouter.ai/api/v1',\n      defaultHeaders: {\n        'HTTP-Referer': 'docs.tokenjs.ai',\n        'X-Title': 'Token.js',\n        ...this.opts.defaultHeaders,\n      },\n    });\n\n    if (apiKey === undefined) {\n      throw new InputError(\n        'API key is required for OpenRouter, define OPENROUTER_API_KEY in your environment or specifty the apiKey option.',\n      );\n    }\n\n    return client.chat.completions.create(body);\n  }\n}\n","/**\n * The following code is modified based on\n * https://github.com/token-js/token.js/blob/main/src/handlers/perplexity.ts\n *\n * MIT License\n * Copyright (c) 2024 RPate97\n * https://github.com/token-js/token.js/blob/main/LICENSE\n */\n\nimport OpenAI from 'openai';\nimport { Stream } from 'openai/streaming';\n\nimport { PerplexityModel, ProviderCompletionParams } from '../chat/index.js';\nimport { CompletionResponse, StreamCompletionResponse } from '../userTypes/index.js';\nimport { BaseHandler } from './base.js';\nimport { InputError } from './types.js';\n\nexport const PERPLEXITY_PREFIX = 'perplexity/';\n\nasync function* streamPerplexity(\n  response: Stream<OpenAI.Chat.Completions.ChatCompletionChunk>,\n): StreamCompletionResponse {\n  for await (const chunk of response) {\n    yield chunk;\n  }\n}\n\nexport class PerplexityHandler extends BaseHandler<PerplexityModel> {\n  async create(\n    body: ProviderCompletionParams<'perplexity'>,\n  ): Promise<CompletionResponse | StreamCompletionResponse> {\n    this.validateInputs(body);\n    const apiKey = this.opts.apiKey ?? process.env.PERPLEXITY_API_KEY;\n\n    if (apiKey === undefined) {\n      throw new InputError(\n        'API key is required for Perplexity, define PERPLEXITY_API_KEY in your environment or specifty the apiKey option.',\n      );\n    }\n\n    const openai = new OpenAI({\n      ...this.opts,\n      baseURL: 'https://api.perplexity.ai',\n      apiKey,\n      defaultHeaders: this.opts.defaultHeaders,\n    });\n\n    const model = body.model.replace(PERPLEXITY_PREFIX, '');\n    // Perplexity throws an error if the temperature equals two, so if the user sets it to 2, we\n    // assign it to a marginally lower value.\n    const temperature = body.temperature === 2 ? 2 - Number.EPSILON : body.temperature;\n\n    const options = {\n      ...body,\n      model,\n      temperature,\n    };\n\n    if (options.stream) {\n      const stream = await openai.chat.completions.create(options);\n      return streamPerplexity(stream);\n    } else {\n      return openai.chat.completions.create(options);\n    }\n  }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { OpenAI, AzureOpenAI } from 'openai';\nimport { Stream } from 'openai/streaming';\n\nimport { AzureOpenAIModel, ProviderCompletionParams } from '../chat/index.js';\nimport { CompletionResponse, StreamCompletionResponse } from '../userTypes/index.js';\nimport { BaseHandler } from './base.js';\nimport { InputError } from './types.js';\n\nasync function* streamOpenAI(\n  response: Stream<OpenAI.Chat.Completions.ChatCompletionChunk>,\n): StreamCompletionResponse {\n  for await (const chunk of response) {\n    yield chunk;\n  }\n}\n\nexport class AzureOpenAIHandler extends BaseHandler<AzureOpenAIModel> {\n  async create(\n    body: ProviderCompletionParams<'azure-openai'>,\n  ): Promise<CompletionResponse | StreamCompletionResponse> {\n    this.validateInputs(body);\n\n    // Azure OpenAI requires apiVersion and endpoint\n\n    const apiVersion = this.opts.azure?.apiVersion || '2024-10-01-preview';\n    const endpoint = this.opts.azure?.endpoint ?? this.opts.baseURL;\n\n    if (!endpoint) {\n      throw new InputError('Azure OpenAI endpoint is required.');\n    }\n\n    // Support for Azure AD authentication using token provider\n    const azureADTokenProvider = this.opts.azure?.azureADTokenProvider;\n\n    // Support for API key authentication\n    const apiKey = this.opts.apiKey ?? process.env.AZURE_OPENAI_API_KEY;\n\n    if (!apiKey && !azureADTokenProvider) {\n      throw new InputError(\n        'Either an API key or an Azure AD token provider must be provided for Azure OpenAI',\n      );\n    }\n\n    const azureOpenAI = new AzureOpenAI({\n      apiKey,\n      azureADTokenProvider,\n      apiVersion,\n      endpoint,\n      defaultHeaders: this.opts.defaultHeaders,\n    });\n\n    // We have to delete the provider field because it's not a valid parameter for the OpenAI API.\n    const params: any = body;\n    delete params.provider;\n\n    if (body.stream) {\n      const stream = await azureOpenAI.chat.completions.create(body);\n      return streamOpenAI(stream);\n    } else {\n      return azureOpenAI.chat.completions.create(body);\n    }\n  }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/**\n * The following code is modified based on\n * https://github.com/token-js/token.js/blob/main/src/handlers/utils.ts\n *\n * MIT License\n * Copyright (c) 2024 RPate97\n * https://github.com/token-js/token.js/blob/main/LICENSE\n */\n\n// @ts-nocheck FIXME: this file has too many type errors.\n\nimport { lookup } from 'mime-types';\nimport OpenAI from 'openai';\n\nimport { LLMChatModel, LLMProvider } from '../chat/index.js';\nimport { models } from '../models.js';\nimport { ConfigOptions } from '../userTypes/index.js';\nimport { AI21Handler } from './ai21.js';\nimport { AnthropicHandler } from './anthropic.js';\nimport { BaseHandler } from './base.js';\n\nimport { GeminiHandler } from './gemini.js';\nimport { GroqHandler } from './groq.js';\nimport { MistralHandler } from './mistral.js';\nimport { OpenAICompatibleHandler } from './openai-compatible.js';\nimport { OpenAIHandler } from './openai.js';\nimport { OpenAINonStreamingHandler } from './openai-non-streaming.js';\nimport { OpenRouterHandler } from './openrouter.js';\nimport { PerplexityHandler } from './perplexity.js';\nimport { InputError, MIMEType } from './types.js';\nimport { AzureOpenAIHandler } from './azure-openai.js';\n\nexport const Handlers: Record<string, (opts: ConfigOptions) => any> = {\n  ['openai']: (opts: ConfigOptions) =>\n    new OpenAIHandler(\n      opts,\n      models.openai.models,\n      models.openai.supportsJSON,\n      models.openai.supportsImages,\n      models.openai.supportsToolCalls,\n      models.openai.supportsN,\n      models.openai.supportsStreaming,\n    ),\n  ['openai-non-streaming']: (opts: ConfigOptions) =>\n    new OpenAINonStreamingHandler(\n      opts,\n      models['openai-non-streaming'].models,\n      models['openai-non-streaming'].supportsJSON,\n      models['openai-non-streaming'].supportsImages,\n      models['openai-non-streaming'].supportsToolCalls,\n      models['openai-non-streaming'].supportsN,\n      // All models are treated as supporting streaming through simulation\n      true,\n    ),\n  ['anthropic']: (opts: ConfigOptions) =>\n    new AnthropicHandler(\n      opts,\n      models.anthropic.models,\n      models.anthropic.supportsJSON,\n      models.anthropic.supportsImages,\n      models.anthropic.supportsToolCalls,\n      models.anthropic.supportsN,\n      models.anthropic.supportsStreaming,\n    ),\n  ['gemini']: (opts: ConfigOptions) =>\n    new GeminiHandler(\n      opts,\n      models.gemini.models,\n      models.gemini.supportsJSON,\n      models.gemini.supportsImages,\n      models.gemini.supportsToolCalls,\n      models.gemini.supportsN,\n      models.gemini.supportsStreaming,\n    ),\n  ['mistral']: (opts: ConfigOptions) =>\n    new MistralHandler(\n      opts,\n      models.mistral.models,\n      models.mistral.supportsJSON,\n      models.mistral.supportsImages,\n      models.mistral.supportsToolCalls,\n      models.mistral.supportsN,\n      models.mistral.supportsStreaming,\n    ),\n  ['groq']: (opts: ConfigOptions) =>\n    new GroqHandler(\n      opts,\n      models.groq.models,\n      models.groq.supportsJSON,\n      models.groq.supportsImages,\n      models.groq.supportsToolCalls,\n      models.groq.supportsN,\n      models.groq.supportsStreaming,\n    ),\n  ['ai21']: (opts: ConfigOptions) =>\n    new AI21Handler(\n      opts,\n      models.ai21.models,\n      models.ai21.supportsJSON,\n      models.ai21.supportsImages,\n      models.ai21.supportsToolCalls,\n      models.ai21.supportsN,\n      models.ai21.supportsStreaming,\n    ),\n  ['perplexity']: (opts: ConfigOptions) =>\n    new PerplexityHandler(\n      opts,\n      models.perplexity.models,\n      models.perplexity.supportsJSON,\n      models.perplexity.supportsImages,\n      models.perplexity.supportsToolCalls,\n      models.perplexity.supportsN,\n      models.perplexity.supportsStreaming,\n    ),\n  ['openrouter']: (opts: ConfigOptions) =>\n    new OpenRouterHandler(\n      opts,\n      models.openrouter.models,\n      models.openrouter.supportsJSON,\n      models.openrouter.supportsImages,\n      models.openrouter.supportsToolCalls,\n      models.openrouter.supportsN,\n      models.openrouter.supportsStreaming,\n    ),\n  ['openai-compatible']: (opts: ConfigOptions) =>\n    new OpenAICompatibleHandler(\n      opts,\n      models.openrouter.models,\n      models.openrouter.supportsJSON,\n      models.openrouter.supportsImages,\n      models.openrouter.supportsToolCalls,\n      models.openrouter.supportsN,\n      models.openrouter.supportsStreaming,\n    ),\n  ['azure-openai']: (opts: ConfigOptions) =>\n    new AzureOpenAIHandler(\n      opts,\n      models['azure-openai'].models,\n      models['azure-openai'].supportsJSON,\n      models['azure-openai'].supportsImages,\n      models['azure-openai'].supportsToolCalls,\n      models['azure-openai'].supportsN,\n      models['azure-openai'].supportsStreaming,\n    ),\n};\n\nexport const getHandler = (provider: LLMProvider, opts: ConfigOptions): BaseHandler<any> => {\n  for (const handlerKey in Handlers) {\n    if (provider === handlerKey) {\n      return Handlers[handlerKey](opts);\n    }\n  }\n\n  throw new Error(\n    `Could not find provider for model. Are you sure the model name is correct and the provider is supported?`,\n  );\n};\n\nexport const getTimestamp = () => {\n  return Math.floor(new Date().getTime() / 1000);\n};\n\nexport const fetchImageAsBase64 = async (url: string): Promise<string> => {\n  const response = await fetch(url);\n  const arrayBuffer = await response.arrayBuffer();\n  return btoa(String.fromCharCode.apply(null, new Uint8Array(arrayBuffer)));\n};\n\nexport const getMimeType = (url: string): string => {\n  const parsedUrl = new URL(url);\n  const pathname = parsedUrl.pathname;\n  const extension = pathname.split('.').pop();\n  return lookup(extension);\n};\n\nconst isUrl = (input: string): boolean => {\n  try {\n    const url = new URL(input);\n    return url.protocol === 'http:' || url.protocol === 'https:';\n  } catch (_) {\n    return false;\n  }\n};\n\nconst isBase64Image = (input: string): boolean => /^data:image\\/[a-zA-Z]+;base64,/.test(input);\n\nexport const fetchThenParseImage = async (\n  urlOrBase64Image: string,\n): Promise<{ content: string; mimeType: MIMEType }> => {\n  if (isUrl(urlOrBase64Image)) {\n    const content = await fetchImageAsBase64(urlOrBase64Image);\n    const mimeType = getMimeType(urlOrBase64Image);\n    if (mimeType === null) {\n      throw new Error(`Failed to get the mime type for the URL: ${urlOrBase64Image}`);\n    }\n    if (!isSupportedMIMEType(mimeType)) {\n      throw new InputError(`Unsupported MIME type: ${mimeType}`);\n    }\n\n    return {\n      content,\n      mimeType,\n    };\n  } else if (isBase64Image(urlOrBase64Image)) {\n    return parseImage(urlOrBase64Image);\n  } else {\n    throw new InputError('Invalid image URL.');\n  }\n};\n\nexport const isSupportedMIMEType = (value: string): value is MIMEType => {\n  return (\n    value === 'image/jpeg' ||\n    value === 'image/png' ||\n    value === 'image/gif' ||\n    value === 'image/webp'\n  );\n};\n\nexport const parseImage = (image: string): { content: string; mimeType: MIMEType } => {\n  const parts = image.split(';base64,');\n  if (parts.length === 2) {\n    const mimeType = parts[0].replace('data:', '').toLowerCase();\n    if (!isSupportedMIMEType(mimeType)) {\n      throw new InputError(`Unsupported MIME type: ${mimeType}`);\n    }\n    return {\n      content: parts[1],\n      mimeType,\n    };\n  } else {\n    throw new InputError('Invalid image URL.');\n  }\n};\n\nexport const consoleWarn = (message: string): void => {\n  console.warn(`Warning: ${message}\\n`);\n};\n\nexport const isEmptyObject = (variable: any): boolean => {\n  return (\n    variable &&\n    typeof variable === 'object' &&\n    variable.constructor === Object &&\n    Object.keys(variable).length === 0\n  );\n};\n\nexport const isObject = (variable: any): boolean => {\n  return variable && typeof variable === 'object' && variable.constructor === Object;\n};\n\nexport const convertMessageContentToString = (\n  messageContent: OpenAI.Chat.Completions.ChatCompletionMessageParam['content'],\n): string => {\n  if (!messageContent) {\n    return '';\n  }\n\n  return (\n    (typeof messageContent === 'string'\n      ? messageContent\n      : messageContent\n          .map((m: OpenAI.Chat.Completions.ChatCompletionContentPartText) => m.text)\n          .join('\\n')) ?? ''\n  );\n};\n","/**\n * The following code is modified based on\n * https://github.com/token-js/token.js/blob/main/src/chat/index.ts\n *\n * MIT License\n * Copyright (c) 2024 RPate97\n * https://github.com/token-js/token.js/blob/main/LICENSE\n */\n\nimport { ChatCompletionCreateParamsBase } from 'openai/resources/chat/completions';\n\nimport { getHandler } from '../handlers/utils.js';\nimport { models } from '../models.js';\nimport { CompletionResponse, ConfigOptions, StreamCompletionResponse } from '../userTypes/index.js';\n\nexport type OpenAIModel = (typeof models.openai.models)[number];\nexport type OpenAINonStreamingModel = (typeof models)['openai-non-streaming']['models'][number];\nexport type AI21Model = (typeof models.ai21.models)[number];\nexport type AnthropicModel = (typeof models.anthropic.models)[number];\nexport type GeminiModel = (typeof models.gemini.models)[number];\nexport type MistralModel = (typeof models.mistral.models)[number];\nexport type PerplexityModel = (typeof models.perplexity.models)[number];\nexport type GroqModel = (typeof models.groq.models)[number];\nexport type OpenRouterModel = string;\nexport type OpenAICompatibleModel = string;\nexport type AzureOpenAIModel = string;\n\nexport type LLMChatModel =\n  | OpenAIModel\n  | OpenAINonStreamingModel\n  | AI21Model\n  | AnthropicModel\n  | GeminiModel\n  | MistralModel\n  | PerplexityModel\n  | GroqModel\n  | OpenRouterModel\n  | OpenAICompatibleModel;\n\nexport type LLMProvider = keyof typeof models;\n\ntype ProviderModelMap = {\n  openai: OpenAIModel;\n  'openai-non-streaming': OpenAINonStreamingModel;\n  ai21: AI21Model;\n  anthropic: AnthropicModel;\n  gemini: GeminiModel;\n  mistral: MistralModel;\n  perplexity: PerplexityModel;\n  groq: GroqModel;\n  openrouter: OpenRouterModel;\n  'openai-compatible': OpenAICompatibleModel;\n  'azure-openai': AzureOpenAIModel;\n};\n\ntype CompletionBase<P extends LLMProvider> = Pick<\n  ChatCompletionCreateParamsBase,\n  | 'temperature'\n  | 'top_p'\n  | 'stop'\n  | 'n'\n  | 'messages'\n  | 'max_tokens'\n  | 'response_format'\n  | 'tools'\n  | 'tool_choice'\n> & {\n  provider: P;\n  model: ProviderModelMap[P];\n};\n\nexport type CompletionStreaming<P extends LLMProvider> = CompletionBase<P> & {\n  stream: true;\n};\n\nexport type CompletionNonStreaming<P extends LLMProvider> = CompletionBase<P> & {\n  stream?: false | null;\n};\n\nexport type ProviderCompletionParams<P extends LLMProvider> =\n  | CompletionStreaming<P>\n  | CompletionNonStreaming<P>;\n\nexport type CompletionParams = {\n  [P in LLMProvider]: CompletionStreaming<P> | CompletionNonStreaming<P>;\n}[LLMProvider];\n\nexport class LLMCompletions {\n  private opts: ConfigOptions;\n\n  constructor(opts: ConfigOptions) {\n    this.opts = opts;\n  }\n\n  create<P extends LLMProvider>(body: CompletionNonStreaming<P>): Promise<CompletionResponse>;\n  create<P extends LLMProvider>(body: CompletionStreaming<P>): Promise<StreamCompletionResponse>;\n  create<P extends LLMProvider>(\n    body: CompletionBase<P>,\n  ): Promise<CompletionResponse | StreamCompletionResponse>;\n  create(body: CompletionParams): Promise<CompletionResponse | StreamCompletionResponse> {\n    const handler = getHandler(body.provider, this.opts);\n    return handler.create(body);\n  }\n}\n\nexport class LLMChat {\n  completions: LLMCompletions;\n\n  constructor(opts: ConfigOptions) {\n    this.completions = new LLMCompletions(opts);\n  }\n}\n","/**\n * The following code is modified based on\n * https://github.com/token-js/token.js/blob/main/src/index.ts\n *\n * MIT License\n * Copyright (c) 2024 RPate97\n * https://github.com/token-js/token.js/blob/main/LICENSE\n */\n\nimport { LLMChat, LLMProvider } from './chat/index.js';\nimport { InputError } from './handlers/types.js';\nimport { models } from './models.js';\nimport { ConfigOptions } from './userTypes/index.js';\nexport * from './models.js';\nexport * from './userTypes/index.js';\n\n// Extract the public interface from OpenAI, including both properties and methods\n// type PublicInterface<T> = {\n//   [K in keyof T]: T[K] extends (...args: any[]) => any ? T[K] : T[K]\n// }\n\n// Pick the properties we want to expose from OpenAI and use them to construct our own client interface\n\n// We omit the _client property from the completions object because it is not needed\n// type Completions = Omit<\n//   Pick<PublicInterface<OpenAI>['chat'], 'completions'>['completions'],\n//   '_client'\n// >\n\n// type Chat = {\n//   completions: Completions\n// }\n\ntype TokenJSInterface = {\n  chat: LLMChat;\n  extendModelList<P extends Exclude<LLMProvider, 'openrouter' | 'openai-compatible'>>(\n    provider: P,\n    name: string,\n    featureSupport: extendedModelFeatureSupport<P>,\n  ): void;\n};\n\nexport type extendedModelFeatureSupport<P extends LLMProvider> =\n  | ((typeof models)[P]['models'] extends readonly string[]\n      ? (typeof models)[P]['models'][number]\n      : never)\n  | {\n      streaming: boolean;\n      json: boolean;\n      toolCalls: boolean;\n      images: boolean;\n    };\n\ntype extendedModelList = Array<{\n  provider: LLMProvider;\n  name: string;\n  featureSupport: extendedModelFeatureSupport<any>;\n}>;\n\nexport class TokenJS implements TokenJSInterface {\n  private opts: ConfigOptions;\n  public static extendedModelList: Readonly<extendedModelList> = [];\n  chat: LLMChat;\n\n  constructor({ ...opts }: ConfigOptions = {}) {\n    this.opts = opts;\n\n    // We pass a reference to the LLM instance to the LLMChat instance so that the completions object can access the opts\n    this.chat = new LLMChat(opts);\n  }\n\n  /**\n   * Checks if a model exists in the extended model list for a given provider\n   *\n   * @param provider - The LLM provider to check\n   * @param name - The model name to check\n   * @returns boolean indicating if the model exists\n   */\n  extendedModelExist<P extends Exclude<LLMProvider, 'openrouter' | 'openai-compatible'>>(\n    provider: P,\n    name: string,\n  ): boolean {\n    return TokenJS.extendedModelList.some(\n      (model) => model.provider === provider && model.name === name,\n    );\n  }\n\n  /**\n   * Extends the predefined model list by adding a new model with specified features.\n   *\n   * @param provider - The LLM provider (e.g., 'openai', 'anthropic')\n   * @param name - The model name/identifier to add\n   * @param featureSupport - Either:\n   * - A string matching an existing model name from the same provider to copy its feature support\n   * - An object specifying which features the model supports:\n   * | Feature    | Type    | Description                                  |\n   * |------------|---------|----------------------------------------------|\n   * | streaming  | boolean | Whether the model supports streaming responses|\n   * | json       | boolean | Whether the model supports JSON mode         |\n   * | toolCalls  | boolean | Whether the model supports function calling  |\n   * | images     | boolean | Whether the model supports image inputs      |\n   * @returns The TokenJS instance for chaining\n   *\n   * @example\n   * ```typescript\n   * // Example in 2 steps: Adding a custom Anthropic model\n   * const tokenjs = new TokenJS();\n   *\n   * // Step 1: Register the new model name\n   * tokenjs.extendModelList(\n   *   \"anthropic\",\n   *   'claude-3-5-custom',\n   *   \"claude-3-sonnet-20240229\" // Copy features from existing model\n   * );\n   *\n   * // Step 2: Using the extended model in a chat completion\n   * const result = await tokenjs.chat.completions.create({\n   *   stream: true,\n   *   provider: 'anthropic',\n   *   model: 'claude-3-5-custom' as any, // Note: Type casting as 'any' required\n   *   messages: [\n   *     {\n   *       role: 'user',\n   *       content: 'Tell me about yourself.',\n   *     },\n   *   ],\n   * });\n   * ```\n   *\n   * Note: When using extended models, type casting (`as any`) is required\n   */\n  extendModelList<P extends Exclude<LLMProvider, 'openrouter' | 'openai-compatible'>>(\n    provider: P,\n    name: string,\n    featureSupport: extendedModelFeatureSupport<P>,\n  ) {\n    // Do nothing if the model already added in the extendedModeList\n    if (this.extendedModelExist(provider, name)) {\n      return this;\n    }\n\n    // FIXME: find a better solution for it.\n    // If a model name is pre-defined, there is a conflict so we throw an error\n    // if (Array.isArray(models[provider].models) && models[provider].models.includes(name)) {\n    //   throw new InputError(\n    //     `You tried to add the following custom model name: \"${name}\", for provider: \"${provider}\". But it conflicts with an existing pre-defined model name. Please try again using different name e.g.: \"${name}-custom\"`,\n    //   );\n    // }\n\n    const modelsRef = models[provider] as any;\n    modelsRef['models'] = [...(models as any)[provider]['models'], name];\n\n    const isSupportedFeature = (_featureSupport: readonly string[] | boolean, model: string) => {\n      if (typeof _featureSupport === 'boolean') {\n        return _featureSupport;\n      }\n      return _featureSupport.includes(model);\n    };\n\n    if (typeof featureSupport == 'string') {\n      // Copy feature support from existing model\n      if (isSupportedFeature(modelsRef.supportsJSON, featureSupport)) {\n        modelsRef['supportsJSON'] = [...modelsRef.supportsJSON, name];\n      }\n      if (isSupportedFeature(modelsRef.supportsStreaming, featureSupport)) {\n        modelsRef['supportsStreaming'] = [...modelsRef.supportsStreaming, name];\n      }\n      if (isSupportedFeature(modelsRef.supportsImages, featureSupport)) {\n        modelsRef['supportsImages'] = [...modelsRef.supportsImages, name];\n      }\n      if (isSupportedFeature(modelsRef.supportsToolCalls, featureSupport)) {\n        modelsRef['supportsToolCalls'] = [...modelsRef.supportsToolCalls, name];\n      }\n    } else {\n      // Use explicit feature support object\n      if (featureSupport.json) {\n        modelsRef['supportsJSON'] = [...modelsRef.supportsJSON, name];\n      }\n      if (featureSupport.streaming) {\n        modelsRef['supportsStreaming'] = [...modelsRef.supportsStreaming, name];\n      }\n      if (featureSupport.toolCalls) {\n        modelsRef['supportsToolCalls'] = [...modelsRef.supportsToolCalls, name];\n      }\n      if (featureSupport.images) {\n        modelsRef['supportsImages'] = [...modelsRef.supportsImages, name];\n      }\n    }\n    (TokenJS.extendedModelList as extendedModelList).push({\n      provider,\n      name,\n      featureSupport,\n    });\n    return this;\n  }\n}\n"],"names":["TableDisplayNames","models","InputError","Error","message","InvariantError","BaseHandler","body","_body_response_format","undefined","Array","content","containsJSONString","e","featureSupport","model","opts","supportsJSON","supportsImages","supportsToolCalls","suportsN","supportsStreamingMessages","convertMessages","messages","output","previousRole","currentMessages","i","convertMessageContentToString","newRole","text","convertedContent","createCompletionResponseStreaming","responseStream","created","reader","decoder","TextDecoder","buffer","done","value","lines","line","response","JSON","choice","id","choices","finish_reason","AI21Handler","apiKey","process","params","getTimestamp","fetch","data","convertedChoices","convertedResponse","createCompletionResponseNonStreaming","toolChoice","finishReason","toFinishReasonNonStreaming","chatMessage","toChatCompletionChoiceMessage","converted","initialToolCallIndex","chunk","toFinishReasonStreaming","newStopReason","delta","isEmptyObject","stopReason","chunkChoice","isTextBlock","contentBlock","isToolUseBlock","role","textBlocks","consoleWarn","toolUseBlocks","selected","block","toolCalls","toolUse","textBlock","messageContent","convertToolParams","tools","convertedTools","tool","convertedToolChoice","getDefaultMaxTokens","clonedMessages","structuredClone","systemMessage","currentParams","toolResult","toolCall","Promise","parsedImage","fetchThenParseImage","convertStopSequences","stop","getApiKey","AnthropicHandler","logImageDetailWarning","stream","maxTokens","client","Anthropic","stopSequences","topP","temperature","convertedBody","convertContentsToParts","contents","systemPrefix","allParts","part","imageData","convertRole","convertAssistantMessage","parts","call","convertMessageToContent","includeSystemPrefix","convertMessagesToContents","systemInstruction","assistantToolCall","m","convertFinishReason","FinishReason","convertToolCalls","candidate","_candidate_content","index","nanoid","convertStreamToolCalls","_convertToolCalls","convertResponseMessage","convertUsageData","usageMetadata","convertToolConfig","FunctionCallingMode","convertTools","convertResponse","result","timestamp","_result_response_candidates","convertStreamResponse","_chunk_candidates","GeminiHandler","responseMimeType","genAI","GoogleGenerativeAI","GroqHandler","OpenAI","findLinkedToolCallName","toolCallId","name","_message_content","specificFunctionName","specifiedTool","toolResponse","toStreamResponse","toCompletionResponse","MistralHandler","endpoint","MistralClient","responseFormat","options","chatResponseStream","chatResponse","streamOpenAI","OpenAICompatibleHandler","openai","OpenAIHandler","createSyntheticStream","OpenAINonStreamingHandler","nonStreamingParams","OpenRouterHandler","console","PERPLEXITY_PREFIX","streamPerplexity","PerplexityHandler","Number","AzureOpenAIHandler","_this_opts_azure","_this_opts_azure1","_this_opts_azure2","apiVersion","azureADTokenProvider","azureOpenAI","AzureOpenAI","Handlers","getHandler","provider","handlerKey","Math","Date","fetchImageAsBase64","url","arrayBuffer","btoa","String","Uint8Array","getMimeType","parsedUrl","URL","pathname","extension","lookup","isUrl","input","_","isBase64Image","urlOrBase64Image","mimeType","isSupportedMIMEType","parseImage","image","variable","Object","LLMCompletions","handler","LLMChat","TokenJS","modelsRef","isSupportedFeature","_featureSupport"],"mappings":";;;;;;;;;;AASO,MAAMA,oBAAoB;IAC/B,QAAQ;IACR,oBAAoB;IACpB,mBAAmB;IACnB,cAAc;IACd,gBAAgB;IAChB,mBAAmB;IACnB,WAAW;AACb;AACO,MAAMC,gBAAS;IACpB,QAAQ;QACN,QAAQ;YAEN;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;SACD;QACD,oBAAoB;QACpB,mBAAmB;YACjB;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;SACD;QACD,cAAc;YACZ;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;SACD;QACD,gBAAgB;YACd;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;SACD;QACD,mBAAmB;YACjB;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;SACD;QACD,WAAW;QACX,cAAc;IAChB;IACA,wBAAwB;QACtB,QAAQ;YACN;YACA;YACA;YACA;YACA;SACD;QACD,oBAAoB;QAEpB,mBAAmB,EAAE;QACrB,cAAc;YAAC;YAAW;YAAsB;YAAc;SAAwB;QACtF,gBAAgB;YAAC;SAAc;QAC/B,mBAAmB;YACjB;YACA;YACA;YACA;SACD;QACD,WAAW;QACX,cAAc;IAChB;IACA,MAAM;QACJ,QAAQ;YAAC;SAAiB;QAC1B,oBAAoB;QACpB,mBAAmB;YAAC;SAAiB;QACrC,cAAc,EAAE;QAChB,gBAAgB,EAAE;QAClB,mBAAmB,EAAE;QACrB,WAAW;QACX,cAAc;IAChB;IACA,WAAW;QACT,QAAQ;YACN;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;SACD;QACD,oBAAoB;QACpB,mBAAmB;YACjB;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;SACD;QACD,cAAc,EAAE;QAChB,gBAAgB;YACd;YACA;YACA;YACA;YACA;YACA;YACA;SACD;QACD,mBAAmB;YACjB;YACA;YACA;YACA;YACA;YACA;YACA;YACA;SACD;QACD,WAAW;QACX,cAAc;IAChB;IACA,QAAQ;QACN,QAAQ;YACN;YACA;YACA;YACA;YACA;YACA;SACD;QACD,oBAAoB;QACpB,mBAAmB;YACjB;YACA;YACA;YACA;YACA;YACA;SACD;QACD,cAAc;YACZ;YACA;YACA;YACA;YACA;SACD;QACD,gBAAgB;YACd;YACA;YACA;YACA;YACA;SACD;QACD,mBAAmB;YACjB;YACA;YACA;YACA;YACA;SACD;QACD,WAAW;QACX,cAAc;IAChB;IACA,SAAS;QACP,QAAQ;YACN;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;SACD;QACD,oBAAoB;QACpB,mBAAmB;YACjB;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;SACD;QAKD,cAAc;YACZ;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;SACD;QACD,gBAAgB,EAAE;QAClB,mBAAmB;YACjB;YACA;YACA;YACA;YACA;YACA;YACA;SACD;QACD,WAAW;QACX,cAAc;IAChB;IACA,MAAM;QACJ,QAAQ;YACN;YACA;YACA;YACA;YACA;YACA;YACA;SACD;QACD,oBAAoB;QACpB,mBAAmB;YACjB;YACA;YACA;YACA;YACA;YACA;YACA;SACD;QAKD,cAAc;YACZ;YACA;YACA;YACA;YACA;SACD;QACD,gBAAgB,EAAE;QAClB,mBAAmB,EAAE;QACrB,WAAW;QACX,cAAc;IAChB;IACA,YAAY;QACV,QAAQ;YACN;YACA;YACA;SA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"}