ai.libx.js 0.2.2 → 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -8,6 +8,7 @@ A unified, stateless API bridge for various AI models including LLMs, image/vide
8
8
  - 🔌 **11 Providers** - OpenAI, Anthropic, Google, Groq, Mistral, Cohere, XAI, DeepSeek, AI21, OpenRouter, Cloudflare
9
9
  - 🌊 **Streaming Support** - Real-time streaming responses from all compatible providers
10
10
  - 📝 **Plain Text Mode** - Raw text output without JSON wrapping
11
+ - 🔍 **Smart Model Resolution** - Use short aliases like `claude`, `gpt4o`, `gemini` instead of full names
11
12
  - 🤖 **Model Normalization** - Intelligent alias resolution (e.g., `gpt-5` → `chatgpt-4o-latest`)
12
13
  - 🧠 **Reasoning Model Support** - Automatic detection and parameter adjustment for o1/o3/R1 models
13
14
  - 📊 **Request Logging** - Built-in metrics tracking with detailed statistics
@@ -41,9 +42,9 @@ const ai = new AIClient({
41
42
  enableLogging: true // Track metrics
42
43
  });
43
44
 
44
- // Non-streaming chat
45
+ // Non-streaming chat (with smart model resolution)
45
46
  const response = await ai.chat({
46
- model: 'openai/gpt-4o',
47
+ model: 'gpt4o', // Short alias instead of 'openai/gpt-4o'
47
48
  messages: [
48
49
  { role: 'user', content: 'Hello!' }
49
50
  ],
@@ -54,7 +55,7 @@ console.log(ai.getStats()); // View metrics
54
55
 
55
56
  // Streaming chat
56
57
  const stream = await ai.chat({
57
- model: 'anthropic/claude-3-5-sonnet-latest',
58
+ model: 'sonnet', // Short alias instead of 'anthropic/claude-3-5-sonnet-latest'
58
59
  messages: [
59
60
  { role: 'user', content: 'Write a story' }
60
61
  ],
@@ -272,6 +273,45 @@ if (isModelSupported('anthropic/claude-3-5-sonnet-latest')) {
272
273
  const provider = getProviderFromModel('openai/gpt-4o'); // "openai"
273
274
  ```
274
275
 
276
+ ### Model Resolution (Fuzzy Matching)
277
+
278
+ Use short aliases or partial names instead of full model identifiers:
279
+
280
+ ```typescript
281
+ import { resolveModel } from 'ai.libx.js';
282
+
283
+ // Common aliases
284
+ resolveModel('claude'); // → 'anthropic/claude-haiku-4-5'
285
+ resolveModel('sonnet'); // → 'anthropic/claude-sonnet-4-5'
286
+ resolveModel('opus'); // → 'anthropic/claude-opus-4-1'
287
+ resolveModel('gpt4o'); // → 'openai/gpt-4o'
288
+ resolveModel('gemini'); // → 'google/models/gemini-2.5-flash'
289
+ resolveModel('llama4'); // → 'groq/meta-llama/llama-4-scout-17b-16e-instruct'
290
+ resolveModel('deepseek'); // → 'deepseek/deepseek-chat'
291
+ resolveModel('grok3'); // → 'xai/grok-3-beta'
292
+
293
+ // Exact matches pass through unchanged
294
+ resolveModel('openai/gpt-4o'); // → 'openai/gpt-4o'
295
+
296
+ // Non-existent models return unchanged
297
+ resolveModel('invalid'); // → 'invalid'
298
+
299
+ // Use directly in chat
300
+ const ai = new AIClient({ apiKeys: {...} });
301
+ await ai.chat({
302
+ model: 'claude', // Automatically resolved to full model name
303
+ messages: [{ role: 'user', content: 'Hello!' }]
304
+ });
305
+ ```
306
+
307
+ **Features:**
308
+ - ✅ Case-insensitive matching
309
+ - ✅ Normalized matching (e.g., `gpt4o` → `gpt-4o`)
310
+ - ✅ Partial name matching
311
+ - ✅ Display name matching
312
+ - ✅ Skips disabled models automatically
313
+ - ✅ Returns original input if no match found (fail-safe)
314
+
275
315
  ### Model Normalization
276
316
 
277
317
  ```typescript
package/build/AIClient.js CHANGED
@@ -35,28 +35,30 @@ class AIClient {
35
35
  return __awaiter(this, void 0, void 0, function* () {
36
36
  var _a, _b;
37
37
  (0, validation_1.validateChatOptions)(options);
38
- const provider = (0, models_1.getProviderFromModel)(options.model);
38
+ const resolvedModel = (0, models_1.resolveModel)(options.model);
39
+ options.model = resolvedModel;
40
+ const provider = (0, models_1.getProviderFromModel)(resolvedModel);
39
41
  if (!provider) {
40
- throw new errors_1.InvalidRequestError(`Invalid model format: "${options.model}". Expected format: "provider/model-name"`);
42
+ throw new errors_1.InvalidRequestError(`Invalid model format: "${resolvedModel}". Expected format: "provider/model-name"`);
41
43
  }
42
- if (!(0, models_1.isModelSupported)(options.model)) {
43
- throw new errors_1.ModelNotFoundError(options.model);
44
+ if (!(0, models_1.isModelSupported)(resolvedModel)) {
45
+ throw new errors_1.ModelNotFoundError(resolvedModel);
44
46
  }
45
- const modelInfo = (0, models_1.getModelInfo)(options.model);
47
+ const modelInfo = (0, models_1.getModelInfo)(resolvedModel);
46
48
  if (modelInfo) {
47
49
  if (modelInfo.enabled === false) {
48
- throw new errors_1.InvalidRequestError(`Model "${options.model}" is disabled and not available for use`);
50
+ throw new errors_1.InvalidRequestError(`Model "${resolvedModel}" is disabled and not available for use`);
49
51
  }
50
52
  if (modelInfo.noChat) {
51
- throw new errors_1.InvalidRequestError(`Model "${options.model}" does not support chat completions (e.g., realtime/audio models)`);
53
+ throw new errors_1.InvalidRequestError(`Model "${resolvedModel}" does not support chat completions (e.g., realtime/audio models)`);
52
54
  }
53
55
  if (modelInfo.knownIssues) {
54
- console.warn(`⚠️ Warning: Model "${options.model}" has known issues: ${modelInfo.knownIssues}`);
56
+ console.warn(`⚠️ Warning: Model "${resolvedModel}" has known issues: ${modelInfo.knownIssues}`);
55
57
  }
56
58
  }
57
59
  const adapter = this.getAdapter(provider);
58
60
  const chatOptions = Object.assign(Object.assign({}, options), { apiKey: options.apiKey || ((_a = this.config.apiKeys) === null || _a === void 0 ? void 0 : _a[provider]) });
59
- const tracker = this.logger.startRequest(provider, options.model);
61
+ const tracker = this.logger.startRequest(provider, resolvedModel);
60
62
  try {
61
63
  const result = yield adapter.chat(chatOptions);
62
64
  if ('content' in result) {
@@ -1 +1 @@
1
- {"version":3,"file":"AIClient.js","sourceRoot":"","sources":["../src/AIClient.ts"],"names":[],"mappings":"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","sourcesContent":["import { ChatOptions, ChatResponse, StreamChunk, ProviderConfig } from './types';\nimport { IProviderAdapter } from './types/provider';\nimport { validateChatOptions } from './utils/validation';\nimport { ModelNotFoundError, InvalidRequestError } from './utils/errors';\nimport { getProviderFromModel, isModelSupported, getModelInfo } from './models';\nimport { RequestLogger, getRequestLogger } from './utils/request-logger';\n\n// Lazy import adapters\nimport { OpenAIAdapter } from './adapters/openai';\nimport { AnthropicAdapter } from './adapters/anthropic';\nimport { GoogleAdapter } from './adapters/google';\nimport { GroqAdapter } from './adapters/groq';\nimport { MistralAdapter } from './adapters/mistral';\nimport { CohereAdapter } from './adapters/cohere';\nimport { XAIAdapter } from './adapters/xai';\nimport { DeepSeekAdapter } from './adapters/deepseek';\nimport { AI21Adapter } from './adapters/ai21';\nimport { OpenRouterAdapter } from './adapters/openrouter';\nimport { CloudflareAdapter } from './adapters/cloudflare';\n\nexport interface AIClientConfig {\n\t/**\n\t * API keys for different providers\n\t * Example: { openai: 'sk-...', anthropic: 'sk-ant-...', google: '...' }\n\t */\n\tapiKeys?: Record<string, string>;\n\n\t/**\n\t * Base URLs for providers (optional, for custom endpoints)\n\t */\n\tbaseUrls?: Record<string, string>;\n\n\t/**\n\t * Cloudflare account ID (required for Cloudflare Workers AI)\n\t */\n\tcloudflareAccountId?: string;\n\n\t/**\n\t * Enable request logging for metrics tracking\n\t */\n\tenableLogging?: boolean;\n}\n\n/**\n * Main AI client class providing unified access to multiple AI providers\n */\nexport class AIClient {\n\tprivate config: AIClientConfig;\n\tprivate adapters: Map<string, IProviderAdapter> = new Map();\n\tprivate logger: RequestLogger;\n\n\tconstructor(config: AIClientConfig = {}) {\n\t\tthis.config = config;\n\t\tthis.logger = getRequestLogger(config.enableLogging || false);\n\t}\n\n\t/**\n\t * Execute a chat completion request\n\t * @param options Chat options including model, messages, and parameters\n\t * @returns ChatResponse for non-streaming, AsyncIterable<StreamChunk> for streaming\n\t */\n\tasync chat(options: ChatOptions): Promise<ChatResponse | AsyncIterable<StreamChunk>> {\n\t\t// Validate options\n\t\tvalidateChatOptions(options);\n\n\t\t// Extract provider from model string\n\t\tconst provider = getProviderFromModel(options.model);\n\t\tif (!provider) {\n\t\t\tthrow new InvalidRequestError(\n\t\t\t\t`Invalid model format: \"${options.model}\". Expected format: \"provider/model-name\"`\n\t\t\t);\n\t\t}\n\n\t\t// Check if model is supported\n\t\tif (!isModelSupported(options.model)) {\n\t\t\tthrow new ModelNotFoundError(options.model);\n\t\t}\n\n\t\t// Check model capabilities and issues\n\t\tconst modelInfo = getModelInfo(options.model);\n\t\tif (modelInfo) {\n\t\t\t// Check if model is enabled\n\t\t\tif (modelInfo.enabled === false) {\n\t\t\t\tthrow new InvalidRequestError(\n\t\t\t\t\t`Model \"${options.model}\" is disabled and not available for use`\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Check if model supports chat\n\t\t\tif (modelInfo.noChat) {\n\t\t\t\tthrow new InvalidRequestError(\n\t\t\t\t\t`Model \"${options.model}\" does not support chat completions (e.g., realtime/audio models)`\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Warn about known issues (but don't block)\n\t\t\tif (modelInfo.knownIssues) {\n\t\t\t\tconsole.warn(`⚠️ Warning: Model \"${options.model}\" has known issues: ${modelInfo.knownIssues}`);\n\t\t\t}\n\t\t}\n\n\t\t// Get or create adapter\n\t\tconst adapter = this.getAdapter(provider);\n\n\t\t// Merge API keys from config if not provided in options\n\t\tconst chatOptions: ChatOptions = {\n\t\t\t...options,\n\t\t\tapiKey: options.apiKey || this.config.apiKeys?.[provider],\n\t\t};\n\n\t\t// Start request tracking\n\t\tconst tracker = this.logger.startRequest(provider, options.model);\n\n\t\ttry {\n\t\t\t// Execute chat\n\t\t\tconst result = await adapter.chat(chatOptions);\n\n\t\t\t// Log successful request\n\t\t\tif ('content' in result) {\n\t\t\t\tconst tokens = result.usage?.totalTokens;\n\t\t\t\tthis.logger.logRequest(tracker, true, tokens);\n\t\t\t} else {\n\t\t\t\t// Streaming - log without token count\n\t\t\t\tthis.logger.logRequest(tracker, true);\n\t\t\t}\n\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\t// Log failed request\n\t\t\tthis.logger.logRequest(\n\t\t\t\ttracker,\n\t\t\t\tfalse,\n\t\t\t\tundefined,\n\t\t\t\terror instanceof Error ? error.message : 'Unknown error'\n\t\t\t);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t/**\n\t * Get adapter for a provider (creates if not exists)\n\t */\n\tprivate getAdapter(provider: string): IProviderAdapter {\n\t\t// Return cached adapter if exists\n\t\tif (this.adapters.has(provider)) {\n\t\t\treturn this.adapters.get(provider)!;\n\t\t}\n\n\t\t// Create adapter config\n\t\tconst adapterConfig: ProviderConfig = {\n\t\t\tapiKey: this.config.apiKeys?.[provider],\n\t\t\tbaseUrl: this.config.baseUrls?.[provider],\n\t\t};\n\n\t\t// Add cloudflare-specific config\n\t\tif (provider === 'cloudflare') {\n\t\t\tadapterConfig.cloudflareAccountId = this.config.cloudflareAccountId;\n\t\t}\n\n\t\t// Create new adapter\n\t\tlet adapter: IProviderAdapter;\n\n\t\tswitch (provider) {\n\t\t\tcase 'openai':\n\t\t\t\tadapter = new OpenAIAdapter(adapterConfig);\n\t\t\t\tbreak;\n\t\t\tcase 'anthropic':\n\t\t\t\tadapter = new AnthropicAdapter(adapterConfig);\n\t\t\t\tbreak;\n\t\t\tcase 'google':\n\t\t\t\tadapter = new GoogleAdapter(adapterConfig);\n\t\t\t\tbreak;\n\t\t\tcase 'groq':\n\t\t\t\tadapter = new GroqAdapter(adapterConfig);\n\t\t\t\tbreak;\n\t\t\tcase 'mistral':\n\t\t\t\tadapter = new MistralAdapter(adapterConfig);\n\t\t\t\tbreak;\n\t\t\tcase 'cohere':\n\t\t\t\tadapter = new CohereAdapter(adapterConfig);\n\t\t\t\tbreak;\n\t\t\tcase 'xai':\n\t\t\t\tadapter = new XAIAdapter(adapterConfig);\n\t\t\t\tbreak;\n\t\t\tcase 'deepseek':\n\t\t\t\tadapter = new DeepSeekAdapter(adapterConfig);\n\t\t\t\tbreak;\n\t\t\tcase 'ai21':\n\t\t\t\tadapter = new AI21Adapter(adapterConfig);\n\t\t\t\tbreak;\n\t\t\tcase 'openrouter':\n\t\t\t\tadapter = new OpenRouterAdapter(adapterConfig);\n\t\t\t\tbreak;\n\t\t\tcase 'cloudflare':\n\t\t\t\tadapter = new CloudflareAdapter(adapterConfig);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow new InvalidRequestError(`Unsupported provider: ${provider}`);\n\t\t}\n\n\t\t// Cache adapter\n\t\tthis.adapters.set(provider, adapter);\n\n\t\treturn adapter;\n\t}\n\n\t/**\n\t * Clear cached adapters (useful for testing or resetting state)\n\t */\n\tclearAdapters(): void {\n\t\tthis.adapters.clear();\n\t}\n\n\t/**\n\t * Get request logger for metrics\n\t */\n\tgetLogger(): RequestLogger {\n\t\treturn this.logger;\n\t}\n\n\t/**\n\t * Get request statistics\n\t */\n\tgetStats() {\n\t\treturn this.logger.getStats();\n\t}\n}\n\n"]}
1
+ {"version":3,"file":"AIClient.js","sourceRoot":"","sources":["../src/AIClient.ts"],"names":[],"mappings":";;;;;;;;;;;;AAEA,mDAAyD;AACzD,2CAAyE;AACzE,qCAA8F;AAC9F,2DAAyE;AAGzE,8CAAkD;AAClD,oDAAwD;AACxD,8CAAkD;AAClD,0CAA8C;AAC9C,gDAAoD;AACpD,8CAAkD;AAClD,wCAA4C;AAC5C,kDAAsD;AACtD,0CAA8C;AAC9C,sDAA0D;AAC1D,sDAA0D;AA4B1D,MAAa,QAAQ;IAKpB,YAAY,SAAyB,EAAE;QAH/B,aAAQ,GAAkC,IAAI,GAAG,EAAE,CAAC;QAI3D,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,IAAA,iCAAgB,EAAC,MAAM,CAAC,aAAa,IAAI,KAAK,CAAC,CAAC;IAC/D,CAAC;IAOK,IAAI,CAAC,OAAoB;;;YAE9B,IAAA,gCAAmB,EAAC,OAAO,CAAC,CAAC;YAG7B,MAAM,aAAa,GAAG,IAAA,qBAAY,EAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAClD,OAAO,CAAC,KAAK,GAAG,aAAa,CAAC;YAG9B,MAAM,QAAQ,GAAG,IAAA,6BAAoB,EAAC,aAAa,CAAC,CAAC;YACrD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACf,MAAM,IAAI,4BAAmB,CAC5B,0BAA0B,aAAa,2CAA2C,CAClF,CAAC;YACH,CAAC;YAGD,IAAI,CAAC,IAAA,yBAAgB,EAAC,aAAa,CAAC,EAAE,CAAC;gBACtC,MAAM,IAAI,2BAAkB,CAAC,aAAa,CAAC,CAAC;YAC7C,CAAC;YAGD,MAAM,SAAS,GAAG,IAAA,qBAAY,EAAC,aAAa,CAAC,CAAC;YAC9C,IAAI,SAAS,EAAE,CAAC;gBAEf,IAAI,SAAS,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;oBACjC,MAAM,IAAI,4BAAmB,CAC5B,UAAU,aAAa,yCAAyC,CAChE,CAAC;gBACH,CAAC;gBAGD,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;oBACtB,MAAM,IAAI,4BAAmB,CAC5B,UAAU,aAAa,mEAAmE,CAC1F,CAAC;gBACH,CAAC;gBAGD,IAAI,SAAS,CAAC,WAAW,EAAE,CAAC;oBAC3B,OAAO,CAAC,IAAI,CAAC,uBAAuB,aAAa,uBAAuB,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;gBAClG,CAAC;YACF,CAAC;YAGD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAG1C,MAAM,WAAW,mCACb,OAAO,KACV,MAAM,EAAE,OAAO,CAAC,MAAM,KAAI,MAAA,IAAI,CAAC,MAAM,CAAC,OAAO,0CAAG,QAAQ,CAAC,CAAA,GACzD,CAAC;YAGF,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;YAElE,IAAI,CAAC;gBAEJ,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAG/C,IAAI,SAAS,IAAI,MAAM,EAAE,CAAC;oBACzB,MAAM,MAAM,GAAG,MAAA,MAAM,CAAC,KAAK,0CAAE,WAAW,CAAC;oBACzC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;gBAC/C,CAAC;qBAAM,CAAC;oBAEP,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBACvC,CAAC;gBAED,OAAO,MAAM,CAAC;YACf,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAEhB,IAAI,CAAC,MAAM,CAAC,UAAU,CACrB,OAAO,EACP,KAAK,EACL,SAAS,EACT,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CACxD,CAAC;gBACF,MAAM,KAAK,CAAC;YACb,CAAC;QACF,CAAC;KAAA;IAKO,UAAU,CAAC,QAAgB;;QAElC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC;QACrC,CAAC;QAGD,MAAM,aAAa,GAAmB;YACrC,MAAM,EAAE,MAAA,IAAI,CAAC,MAAM,CAAC,OAAO,0CAAG,QAAQ,CAAC;YACvC,OAAO,EAAE,MAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,0CAAG,QAAQ,CAAC;SACzC,CAAC;QAGF,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;YAC/B,aAAa,CAAC,mBAAmB,GAAG,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC;QACrE,CAAC;QAGD,IAAI,OAAyB,CAAC;QAE9B,QAAQ,QAAQ,EAAE,CAAC;YAClB,KAAK,QAAQ;gBACZ,OAAO,GAAG,IAAI,sBAAa,CAAC,aAAa,CAAC,CAAC;gBAC3C,MAAM;YACP,KAAK,WAAW;gBACf,OAAO,GAAG,IAAI,4BAAgB,CAAC,aAAa,CAAC,CAAC;gBAC9C,MAAM;YACP,KAAK,QAAQ;gBACZ,OAAO,GAAG,IAAI,sBAAa,CAAC,aAAa,CAAC,CAAC;gBAC3C,MAAM;YACP,KAAK,MAAM;gBACV,OAAO,GAAG,IAAI,kBAAW,CAAC,aAAa,CAAC,CAAC;gBACzC,MAAM;YACP,KAAK,SAAS;gBACb,OAAO,GAAG,IAAI,wBAAc,CAAC,aAAa,CAAC,CAAC;gBAC5C,MAAM;YACP,KAAK,QAAQ;gBACZ,OAAO,GAAG,IAAI,sBAAa,CAAC,aAAa,CAAC,CAAC;gBAC3C,MAAM;YACP,KAAK,KAAK;gBACT,OAAO,GAAG,IAAI,gBAAU,CAAC,aAAa,CAAC,CAAC;gBACxC,MAAM;YACP,KAAK,UAAU;gBACd,OAAO,GAAG,IAAI,0BAAe,CAAC,aAAa,CAAC,CAAC;gBAC7C,MAAM;YACP,KAAK,MAAM;gBACV,OAAO,GAAG,IAAI,kBAAW,CAAC,aAAa,CAAC,CAAC;gBACzC,MAAM;YACP,KAAK,YAAY;gBAChB,OAAO,GAAG,IAAI,8BAAiB,CAAC,aAAa,CAAC,CAAC;gBAC/C,MAAM;YACP,KAAK,YAAY;gBAChB,OAAO,GAAG,IAAI,8BAAiB,CAAC,aAAa,CAAC,CAAC;gBAC/C,MAAM;YACP;gBACC,MAAM,IAAI,4BAAmB,CAAC,yBAAyB,QAAQ,EAAE,CAAC,CAAC;QACrE,CAAC;QAGD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAErC,OAAO,OAAO,CAAC;IAChB,CAAC;IAKD,aAAa;QACZ,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IAKD,SAAS;QACR,OAAO,IAAI,CAAC,MAAM,CAAC;IACpB,CAAC;IAKD,QAAQ;QACP,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;IAC/B,CAAC;CACD;AAxLD,4BAwLC","sourcesContent":["import { ChatOptions, ChatResponse, StreamChunk, ProviderConfig } from './types';\nimport { IProviderAdapter } from './types/provider';\nimport { validateChatOptions } from './utils/validation';\nimport { ModelNotFoundError, InvalidRequestError } from './utils/errors';\nimport { getProviderFromModel, isModelSupported, getModelInfo, resolveModel } from './models';\nimport { RequestLogger, getRequestLogger } from './utils/request-logger';\n\n// Lazy import adapters\nimport { OpenAIAdapter } from './adapters/openai';\nimport { AnthropicAdapter } from './adapters/anthropic';\nimport { GoogleAdapter } from './adapters/google';\nimport { GroqAdapter } from './adapters/groq';\nimport { MistralAdapter } from './adapters/mistral';\nimport { CohereAdapter } from './adapters/cohere';\nimport { XAIAdapter } from './adapters/xai';\nimport { DeepSeekAdapter } from './adapters/deepseek';\nimport { AI21Adapter } from './adapters/ai21';\nimport { OpenRouterAdapter } from './adapters/openrouter';\nimport { CloudflareAdapter } from './adapters/cloudflare';\n\nexport interface AIClientConfig {\n\t/**\n\t * API keys for different providers\n\t * Example: { openai: 'sk-...', anthropic: 'sk-ant-...', google: '...' }\n\t */\n\tapiKeys?: Record<string, string>;\n\n\t/**\n\t * Base URLs for providers (optional, for custom endpoints)\n\t */\n\tbaseUrls?: Record<string, string>;\n\n\t/**\n\t * Cloudflare account ID (required for Cloudflare Workers AI)\n\t */\n\tcloudflareAccountId?: string;\n\n\t/**\n\t * Enable request logging for metrics tracking\n\t */\n\tenableLogging?: boolean;\n}\n\n/**\n * Main AI client class providing unified access to multiple AI providers\n */\nexport class AIClient {\n\tprivate config: AIClientConfig;\n\tprivate adapters: Map<string, IProviderAdapter> = new Map();\n\tprivate logger: RequestLogger;\n\n\tconstructor(config: AIClientConfig = {}) {\n\t\tthis.config = config;\n\t\tthis.logger = getRequestLogger(config.enableLogging || false);\n\t}\n\n\t/**\n\t * Execute a chat completion request\n\t * @param options Chat options including model, messages, and parameters\n\t * @returns ChatResponse for non-streaming, AsyncIterable<StreamChunk> for streaming\n\t */\n\tasync chat(options: ChatOptions): Promise<ChatResponse | AsyncIterable<StreamChunk>> {\n\t\t// Validate options\n\t\tvalidateChatOptions(options);\n\n\t\t// Resolve model name (supports partial/alias matching)\n\t\tconst resolvedModel = resolveModel(options.model);\n\t\toptions.model = resolvedModel;\n\n\t\t// Extract provider from model string\n\t\tconst provider = getProviderFromModel(resolvedModel);\n\t\tif (!provider) {\n\t\t\tthrow new InvalidRequestError(\n\t\t\t\t`Invalid model format: \"${resolvedModel}\". Expected format: \"provider/model-name\"`\n\t\t\t);\n\t\t}\n\n\t\t// Check if model is supported\n\t\tif (!isModelSupported(resolvedModel)) {\n\t\t\tthrow new ModelNotFoundError(resolvedModel);\n\t\t}\n\n\t\t// Check model capabilities and issues\n\t\tconst modelInfo = getModelInfo(resolvedModel);\n\t\tif (modelInfo) {\n\t\t\t// Check if model is enabled\n\t\t\tif (modelInfo.enabled === false) {\n\t\t\t\tthrow new InvalidRequestError(\n\t\t\t\t\t`Model \"${resolvedModel}\" is disabled and not available for use`\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Check if model supports chat\n\t\t\tif (modelInfo.noChat) {\n\t\t\t\tthrow new InvalidRequestError(\n\t\t\t\t\t`Model \"${resolvedModel}\" does not support chat completions (e.g., realtime/audio models)`\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Warn about known issues (but don't block)\n\t\t\tif (modelInfo.knownIssues) {\n\t\t\t\tconsole.warn(`⚠️ Warning: Model \"${resolvedModel}\" has known issues: ${modelInfo.knownIssues}`);\n\t\t\t}\n\t\t}\n\n\t\t// Get or create adapter\n\t\tconst adapter = this.getAdapter(provider);\n\n\t\t// Merge API keys from config if not provided in options\n\t\tconst chatOptions: ChatOptions = {\n\t\t\t...options,\n\t\t\tapiKey: options.apiKey || this.config.apiKeys?.[provider],\n\t\t};\n\n\t\t// Start request tracking\n\t\tconst tracker = this.logger.startRequest(provider, resolvedModel);\n\n\t\ttry {\n\t\t\t// Execute chat\n\t\t\tconst result = await adapter.chat(chatOptions);\n\n\t\t\t// Log successful request\n\t\t\tif ('content' in result) {\n\t\t\t\tconst tokens = result.usage?.totalTokens;\n\t\t\t\tthis.logger.logRequest(tracker, true, tokens);\n\t\t\t} else {\n\t\t\t\t// Streaming - log without token count\n\t\t\t\tthis.logger.logRequest(tracker, true);\n\t\t\t}\n\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\t// Log failed request\n\t\t\tthis.logger.logRequest(\n\t\t\t\ttracker,\n\t\t\t\tfalse,\n\t\t\t\tundefined,\n\t\t\t\terror instanceof Error ? error.message : 'Unknown error'\n\t\t\t);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t/**\n\t * Get adapter for a provider (creates if not exists)\n\t */\n\tprivate getAdapter(provider: string): IProviderAdapter {\n\t\t// Return cached adapter if exists\n\t\tif (this.adapters.has(provider)) {\n\t\t\treturn this.adapters.get(provider)!;\n\t\t}\n\n\t\t// Create adapter config\n\t\tconst adapterConfig: ProviderConfig = {\n\t\t\tapiKey: this.config.apiKeys?.[provider],\n\t\t\tbaseUrl: this.config.baseUrls?.[provider],\n\t\t};\n\n\t\t// Add cloudflare-specific config\n\t\tif (provider === 'cloudflare') {\n\t\t\tadapterConfig.cloudflareAccountId = this.config.cloudflareAccountId;\n\t\t}\n\n\t\t// Create new adapter\n\t\tlet adapter: IProviderAdapter;\n\n\t\tswitch (provider) {\n\t\t\tcase 'openai':\n\t\t\t\tadapter = new OpenAIAdapter(adapterConfig);\n\t\t\t\tbreak;\n\t\t\tcase 'anthropic':\n\t\t\t\tadapter = new AnthropicAdapter(adapterConfig);\n\t\t\t\tbreak;\n\t\t\tcase 'google':\n\t\t\t\tadapter = new GoogleAdapter(adapterConfig);\n\t\t\t\tbreak;\n\t\t\tcase 'groq':\n\t\t\t\tadapter = new GroqAdapter(adapterConfig);\n\t\t\t\tbreak;\n\t\t\tcase 'mistral':\n\t\t\t\tadapter = new MistralAdapter(adapterConfig);\n\t\t\t\tbreak;\n\t\t\tcase 'cohere':\n\t\t\t\tadapter = new CohereAdapter(adapterConfig);\n\t\t\t\tbreak;\n\t\t\tcase 'xai':\n\t\t\t\tadapter = new XAIAdapter(adapterConfig);\n\t\t\t\tbreak;\n\t\t\tcase 'deepseek':\n\t\t\t\tadapter = new DeepSeekAdapter(adapterConfig);\n\t\t\t\tbreak;\n\t\t\tcase 'ai21':\n\t\t\t\tadapter = new AI21Adapter(adapterConfig);\n\t\t\t\tbreak;\n\t\t\tcase 'openrouter':\n\t\t\t\tadapter = new OpenRouterAdapter(adapterConfig);\n\t\t\t\tbreak;\n\t\t\tcase 'cloudflare':\n\t\t\t\tadapter = new CloudflareAdapter(adapterConfig);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow new InvalidRequestError(`Unsupported provider: ${provider}`);\n\t\t}\n\n\t\t// Cache adapter\n\t\tthis.adapters.set(provider, adapter);\n\n\t\treturn adapter;\n\t}\n\n\t/**\n\t * Clear cached adapters (useful for testing or resetting state)\n\t */\n\tclearAdapters(): void {\n\t\tthis.adapters.clear();\n\t}\n\n\t/**\n\t * Get request logger for metrics\n\t */\n\tgetLogger(): RequestLogger {\n\t\treturn this.logger;\n\t}\n\n\t/**\n\t * Get request statistics\n\t */\n\tgetStats() {\n\t\treturn this.logger.getStats();\n\t}\n}\n\n"]}
package/build/index.d.ts CHANGED
@@ -5,7 +5,7 @@ export default AIClient;
5
5
  export type { Message, MessageRole, MessageContent, ContentPart, ChatOptions, ChatResponse, StreamChunk, ModelCapabilities, ModelInfo, ProviderConfig, Tool, FunctionDefinition, ToolChoice, ToolCall, ResponseFormat, ImageFile, LogprobToken, } from './types';
6
6
  export type { IProviderAdapter } from './types/provider';
7
7
  export type { ChatStream } from './types/streaming';
8
- export { supportedModels, getProviderFromModel, getModelInfo, listModels, isModelSupported, } from './models';
8
+ export { supportedModels, getProviderFromModel, getModelInfo, listModels, isModelSupported, resolveModel, } from './models';
9
9
  export { isReasoningModel, supportsSystemMessages, getReasoningModelAdjustments, requiresMaxCompletionTokens, } from './utils/model-normalization';
10
10
  export { RequestLogger, getRequestLogger, } from './utils/request-logger';
11
11
  export type { RequestMetadata, RequestTracker, CompletedRequest, ProviderStats, LoggerStats, } from './utils/request-logger';
package/build/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createMessageWithFiles = exports.createToolMessage = exports.createVisionMessage = exports.createMultimodalMessage = exports.createTextMessage = exports.createMessage = exports.calculateBackoff = exports.sleep = exports.retryWithBackoff = exports.ServerError = exports.ContextLengthExceededError = exports.ProviderError = exports.ModelNotFoundError = exports.RateLimitError = exports.InvalidRequestError = exports.AuthenticationError = exports.AILibError = exports.getRequestLogger = exports.RequestLogger = exports.requiresMaxCompletionTokens = exports.getReasoningModelAdjustments = exports.supportsSystemMessages = exports.isReasoningModel = exports.isModelSupported = exports.listModels = exports.getModelInfo = exports.getProviderFromModel = exports.supportedModels = exports.AIClient = void 0;
3
+ exports.createMessageWithFiles = exports.createToolMessage = exports.createVisionMessage = exports.createMultimodalMessage = exports.createTextMessage = exports.createMessage = exports.calculateBackoff = exports.sleep = exports.retryWithBackoff = exports.ServerError = exports.ContextLengthExceededError = exports.ProviderError = exports.ModelNotFoundError = exports.RateLimitError = exports.InvalidRequestError = exports.AuthenticationError = exports.AILibError = exports.getRequestLogger = exports.RequestLogger = exports.requiresMaxCompletionTokens = exports.getReasoningModelAdjustments = exports.supportsSystemMessages = exports.isReasoningModel = exports.resolveModel = exports.isModelSupported = exports.listModels = exports.getModelInfo = exports.getProviderFromModel = exports.supportedModels = exports.AIClient = void 0;
4
4
  var AIClient_1 = require("./AIClient");
5
5
  Object.defineProperty(exports, "AIClient", { enumerable: true, get: function () { return AIClient_1.AIClient; } });
6
6
  const AIClient_2 = require("./AIClient");
@@ -11,6 +11,7 @@ Object.defineProperty(exports, "getProviderFromModel", { enumerable: true, get:
11
11
  Object.defineProperty(exports, "getModelInfo", { enumerable: true, get: function () { return models_1.getModelInfo; } });
12
12
  Object.defineProperty(exports, "listModels", { enumerable: true, get: function () { return models_1.listModels; } });
13
13
  Object.defineProperty(exports, "isModelSupported", { enumerable: true, get: function () { return models_1.isModelSupported; } });
14
+ Object.defineProperty(exports, "resolveModel", { enumerable: true, get: function () { return models_1.resolveModel; } });
14
15
  var model_normalization_1 = require("./utils/model-normalization");
15
16
  Object.defineProperty(exports, "isReasoningModel", { enumerable: true, get: function () { return model_normalization_1.isReasoningModel; } });
16
17
  Object.defineProperty(exports, "supportsSystemMessages", { enumerable: true, get: function () { return model_normalization_1.supportsSystemMessages; } });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,uCAAsC;AAA7B,oGAAA,QAAQ,OAAA;AAIjB,yCAAsC;AACtC,kBAAe,mBAAQ,CAAC;AA2BxB,mCAMkB;AALd,yGAAA,eAAe,OAAA;AACf,8GAAA,oBAAoB,OAAA;AACpB,sGAAA,YAAY,OAAA;AACZ,oGAAA,UAAU,OAAA;AACV,0GAAA,gBAAgB,OAAA;AAIpB,mEAKqC;AAJjC,uHAAA,gBAAgB,OAAA;AAChB,6HAAA,sBAAsB,OAAA;AACtB,mIAAA,4BAA4B,OAAA;AAC5B,kIAAA,2BAA2B,OAAA;AAI/B,yDAGgC;AAF5B,+GAAA,aAAa,OAAA;AACb,kHAAA,gBAAgB,OAAA;AAYpB,yCAYwB;AAXpB,oGAAA,UAAU,OAAA;AACV,6GAAA,mBAAmB,OAAA;AACnB,6GAAA,mBAAmB,OAAA;AACnB,wGAAA,cAAc,OAAA;AACd,4GAAA,kBAAkB,OAAA;AAClB,uGAAA,aAAa,OAAA;AACb,oHAAA,0BAA0B,OAAA;AAC1B,qGAAA,WAAW,OAAA;AACX,0GAAA,gBAAgB,OAAA;AAChB,+FAAA,KAAK,OAAA;AACL,0GAAA,gBAAgB,OAAA;AAIpB,2DAOiC;AAN7B,gHAAA,aAAa,OAAA;AACb,oHAAA,iBAAiB,OAAA;AACjB,0HAAA,uBAAuB,OAAA;AACvB,sHAAA,mBAAmB,OAAA;AACnB,oHAAA,iBAAiB,OAAA;AACjB,yHAAA,sBAAsB,OAAA","sourcesContent":["// Main export: AIClient\nexport { AIClient } from './AIClient';\nexport type { AIClientConfig } from './AIClient';\n\n// Default export\nimport { AIClient } from './AIClient';\nexport default AIClient;\n\n// Export types\nexport type {\n Message,\n MessageRole,\n MessageContent,\n ContentPart,\n ChatOptions,\n ChatResponse,\n StreamChunk,\n ModelCapabilities,\n ModelInfo,\n ProviderConfig,\n Tool,\n FunctionDefinition,\n ToolChoice,\n ToolCall,\n ResponseFormat,\n ImageFile,\n LogprobToken,\n} from './types';\n\nexport type { IProviderAdapter } from './types/provider';\nexport type { ChatStream } from './types/streaming';\n\n// Export model utilities\nexport {\n supportedModels,\n getProviderFromModel,\n getModelInfo,\n listModels,\n isModelSupported,\n} from './models';\n\n// Export model normalization utilities\nexport {\n isReasoningModel,\n supportsSystemMessages,\n getReasoningModelAdjustments,\n requiresMaxCompletionTokens,\n} from './utils/model-normalization';\n\n// Export request logger\nexport {\n RequestLogger,\n getRequestLogger,\n} from './utils/request-logger';\n\nexport type {\n RequestMetadata,\n RequestTracker,\n CompletedRequest,\n ProviderStats,\n LoggerStats,\n} from './utils/request-logger';\n\n// Export errors\nexport {\n AILibError,\n AuthenticationError,\n InvalidRequestError,\n RateLimitError,\n ModelNotFoundError,\n ProviderError,\n ContextLengthExceededError,\n ServerError,\n retryWithBackoff,\n sleep,\n calculateBackoff,\n} from './utils/errors';\n\n// Export message helpers\nexport {\n createMessage,\n createTextMessage,\n createMultimodalMessage,\n createVisionMessage,\n createToolMessage,\n createMessageWithFiles,\n} from './utils/message-helpers';\n\n// Note: Individual adapters are exported from './adapters' subpath\n// Usage: import { OpenAIAdapter } from 'ai.libx.js/adapters';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,uCAAsC;AAA7B,oGAAA,QAAQ,OAAA;AAIjB,yCAAsC;AACtC,kBAAe,mBAAQ,CAAC;AA2BxB,mCAOkB;AANd,yGAAA,eAAe,OAAA;AACf,8GAAA,oBAAoB,OAAA;AACpB,sGAAA,YAAY,OAAA;AACZ,oGAAA,UAAU,OAAA;AACV,0GAAA,gBAAgB,OAAA;AAChB,sGAAA,YAAY,OAAA;AAIhB,mEAKqC;AAJjC,uHAAA,gBAAgB,OAAA;AAChB,6HAAA,sBAAsB,OAAA;AACtB,mIAAA,4BAA4B,OAAA;AAC5B,kIAAA,2BAA2B,OAAA;AAI/B,yDAGgC;AAF5B,+GAAA,aAAa,OAAA;AACb,kHAAA,gBAAgB,OAAA;AAYpB,yCAYwB;AAXpB,oGAAA,UAAU,OAAA;AACV,6GAAA,mBAAmB,OAAA;AACnB,6GAAA,mBAAmB,OAAA;AACnB,wGAAA,cAAc,OAAA;AACd,4GAAA,kBAAkB,OAAA;AAClB,uGAAA,aAAa,OAAA;AACb,oHAAA,0BAA0B,OAAA;AAC1B,qGAAA,WAAW,OAAA;AACX,0GAAA,gBAAgB,OAAA;AAChB,+FAAA,KAAK,OAAA;AACL,0GAAA,gBAAgB,OAAA;AAIpB,2DAOiC;AAN7B,gHAAA,aAAa,OAAA;AACb,oHAAA,iBAAiB,OAAA;AACjB,0HAAA,uBAAuB,OAAA;AACvB,sHAAA,mBAAmB,OAAA;AACnB,oHAAA,iBAAiB,OAAA;AACjB,yHAAA,sBAAsB,OAAA","sourcesContent":["// Main export: AIClient\nexport { AIClient } from './AIClient';\nexport type { AIClientConfig } from './AIClient';\n\n// Default export\nimport { AIClient } from './AIClient';\nexport default AIClient;\n\n// Export types\nexport type {\n Message,\n MessageRole,\n MessageContent,\n ContentPart,\n ChatOptions,\n ChatResponse,\n StreamChunk,\n ModelCapabilities,\n ModelInfo,\n ProviderConfig,\n Tool,\n FunctionDefinition,\n ToolChoice,\n ToolCall,\n ResponseFormat,\n ImageFile,\n LogprobToken,\n} from './types';\n\nexport type { IProviderAdapter } from './types/provider';\nexport type { ChatStream } from './types/streaming';\n\n// Export model utilities\nexport {\n supportedModels,\n getProviderFromModel,\n getModelInfo,\n listModels,\n isModelSupported,\n resolveModel,\n} from './models';\n\n// Export model normalization utilities\nexport {\n isReasoningModel,\n supportsSystemMessages,\n getReasoningModelAdjustments,\n requiresMaxCompletionTokens,\n} from './utils/model-normalization';\n\n// Export request logger\nexport {\n RequestLogger,\n getRequestLogger,\n} from './utils/request-logger';\n\nexport type {\n RequestMetadata,\n RequestTracker,\n CompletedRequest,\n ProviderStats,\n LoggerStats,\n} from './utils/request-logger';\n\n// Export errors\nexport {\n AILibError,\n AuthenticationError,\n InvalidRequestError,\n RateLimitError,\n ModelNotFoundError,\n ProviderError,\n ContextLengthExceededError,\n ServerError,\n retryWithBackoff,\n sleep,\n calculateBackoff,\n} from './utils/errors';\n\n// Export message helpers\nexport {\n createMessage,\n createTextMessage,\n createMultimodalMessage,\n createVisionMessage,\n createToolMessage,\n createMessageWithFiles,\n} from './utils/message-helpers';\n\n// Note: Individual adapters are exported from './adapters' subpath\n// Usage: import { OpenAIAdapter } from 'ai.libx.js/adapters';\n"]}
package/build/models.d.ts CHANGED
@@ -225,6 +225,10 @@ export declare const supportedModels: {
225
225
  'google/models/chat-bison-001': {
226
226
  displayName: string;
227
227
  };
228
+ 'anthropic/claude-haiku-4-5': {
229
+ displayName: string;
230
+ url: string;
231
+ };
228
232
  'anthropic/claude-opus-4-1': {
229
233
  displayName: string;
230
234
  url: string;
@@ -587,3 +591,4 @@ export declare function getProviderFromModel(model: string): string | null;
587
591
  export declare function getModelInfo(model: string): ModelInfo | undefined;
588
592
  export declare function listModels(provider?: string): string[];
589
593
  export declare function isModelSupported(model: string): boolean;
594
+ export declare function resolveModel(modelInput: string): string;
package/build/models.js CHANGED
@@ -5,6 +5,7 @@ exports.getProviderFromModel = getProviderFromModel;
5
5
  exports.getModelInfo = getModelInfo;
6
6
  exports.listModels = listModels;
7
7
  exports.isModelSupported = isModelSupported;
8
+ exports.resolveModel = resolveModel;
8
9
  exports.supportedModels = {
9
10
  'openai/gpt-5': { displayName: 'GPT-5', usesMaxCompletionTokens: true, reasoning: true, knownIssues: 'Highly unpredictable reasoning token usage (can use 1000+ tokens); recommend 1500+ max_completion_tokens for reliability' },
10
11
  'openai/gpt-5-mini': { displayName: 'GPT-5 mini', usesMaxCompletionTokens: true, reasoning: true },
@@ -70,6 +71,7 @@ exports.supportedModels = {
70
71
  'google/models/gemini-1.0-pro-latest': { displayName: 'Gemini 1.0 Pro' },
71
72
  'google/models/gemini-pro-vision': { displayName: 'Gemini 1.0 Pro Vision' },
72
73
  'google/models/chat-bison-001': { displayName: 'PaLM 2 Chat (Legacy)' },
74
+ 'anthropic/claude-haiku-4-5': { displayName: 'Claude Haiku 4.5', url: 'https://api.anthropic.com/v1/messages' },
73
75
  'anthropic/claude-opus-4-1': { displayName: 'Claude Opus 4.1', url: 'https://api.anthropic.com/v1/messages' },
74
76
  'anthropic/claude-opus-4-0': { displayName: 'Claude Opus 4', url: 'https://api.anthropic.com/v1/messages' },
75
77
  'anthropic/claude-sonnet-4-5': { displayName: 'Claude Sonnet 4.5', url: 'https://api.anthropic.com/v1/messages' },
@@ -194,4 +196,61 @@ function listModels(provider) {
194
196
  function isModelSupported(model) {
195
197
  return model in exports.supportedModels;
196
198
  }
199
+ function resolveModel(modelInput) {
200
+ var _a;
201
+ if (!modelInput)
202
+ return modelInput;
203
+ const models = exports.supportedModels;
204
+ const searchTerm = modelInput.toLowerCase().trim();
205
+ if (models[modelInput]) {
206
+ return modelInput;
207
+ }
208
+ for (const [key] of Object.entries(models)) {
209
+ if (key.toLowerCase() === searchTerm) {
210
+ return key;
211
+ }
212
+ }
213
+ const matches = [];
214
+ const normalize = (str) => str.replace(/[-_.]/g, '').toLowerCase();
215
+ const normalizedSearchTerm = normalize(searchTerm);
216
+ for (const [key, model] of Object.entries(models)) {
217
+ if ('enabled' in model && model.enabled === false)
218
+ continue;
219
+ const keyLower = key.toLowerCase();
220
+ const displayNameLower = (model.displayName || '').toLowerCase();
221
+ const modelPart = ((_a = key.split('/').pop()) === null || _a === void 0 ? void 0 : _a.toLowerCase()) || '';
222
+ const normalizedModelPart = normalize(modelPart);
223
+ const normalizedDisplayName = normalize(displayNameLower);
224
+ let score = 0;
225
+ if (modelPart === searchTerm || normalizedModelPart === normalizedSearchTerm) {
226
+ score = 1000;
227
+ }
228
+ else if (displayNameLower === searchTerm || normalizedDisplayName === normalizedSearchTerm) {
229
+ score = 900;
230
+ }
231
+ else if (modelPart.startsWith(searchTerm) || normalizedModelPart.startsWith(normalizedSearchTerm)) {
232
+ score = 800;
233
+ }
234
+ else if (displayNameLower.startsWith(searchTerm) || normalizedDisplayName.startsWith(normalizedSearchTerm)) {
235
+ score = 700;
236
+ }
237
+ else if (modelPart.includes(searchTerm) || normalizedModelPart.includes(normalizedSearchTerm)) {
238
+ score = 600;
239
+ }
240
+ else if (displayNameLower.includes(searchTerm) || normalizedDisplayName.includes(normalizedSearchTerm)) {
241
+ score = 500;
242
+ }
243
+ else if (keyLower.includes(searchTerm)) {
244
+ score = 400;
245
+ }
246
+ if (score > 0) {
247
+ matches.push({ key, score });
248
+ }
249
+ }
250
+ if (matches.length > 0) {
251
+ matches.sort((a, b) => b.score - a.score);
252
+ return matches[0].key;
253
+ }
254
+ return modelInput;
255
+ }
197
256
  //# sourceMappingURL=models.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"models.js","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"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","sourcesContent":["import { ModelInfo } from './types';\n\n// Import the supported models data\nexport const supportedModels = {\n\t'openai/gpt-5': { displayName: 'GPT-5', usesMaxCompletionTokens: true, reasoning: true, knownIssues: 'Highly unpredictable reasoning token usage (can use 1000+ tokens); recommend 1500+ max_completion_tokens for reliability' },\n\t'openai/gpt-5-mini': { displayName: 'GPT-5 mini', usesMaxCompletionTokens: true, reasoning: true },\n\t'openai/gpt-5-nano': { displayName: 'GPT-5 nano', usesMaxCompletionTokens: true, reasoning: true },\n\t'openai/gpt-5-chat-latest': { displayName: 'GPT-5 Chat', usesMaxCompletionTokens: true },\n\t'openai/gpt-4.1': { displayName: 'GPT 4.1', usesMaxCompletionTokens: true },\n\t'openai/gpt-4.1-mini': { displayName: 'GPT 4.1 mini', usesMaxCompletionTokens: true },\n\t'openai/gpt-4.1-nano': { displayName: 'GPT 4.1 nano', usesMaxCompletionTokens: true },\n\t'openai/gpt-4.5-preview': { displayName: 'gpt 4.5 preview' },\n\t'openai/o3-mini': { displayName: 'gpt o3 mini', noSystem: true, usesMaxCompletionTokens: true },\n\t'openai/gpt-4o-audio-preview': { displayName: 'gpt-4o-audio-preview', enabled: false },\n\t'openai/gpt-4o-mini-audio-preview': { displayName: 'gpt-4o-mini-audio-preview', enabled: false },\n\t'openai/gpt-4o-mini-realtime-preview': { displayName: 'gpt-4o-mini-realtime-preview', noChat: true },\n\t'openai/gpt-4o-realtime-preview': { displayName: 'gpt-4o-realtime-preview', noChat: true },\n\t'openai/o1-preview': { displayName: 'o1-preview', noSystem: true, usesMaxCompletionTokens: true },\n\t'openai/o1-mini': { displayName: 'o1-mini', noSystem: true, usesMaxCompletionTokens: true },\n\t'openai/o1': { displayName: 'o1', noSystem: true, enabled: false, usesMaxCompletionTokens: true },\n\t'openai/chatgpt-4o-latest': { displayName: ' ChatGPT GPT-4o' },\n\t'openai/gpt-4o-mini': { displayName: 'GPT-4o mini' },\n\t'openai/gpt-4o': { displayName: ' GPT-4o' },\n\t'openai/gpt-4o-2024-05-13': { displayName: ' GPT-4o (2024-05-13)' },\n\t'openai/gpt-4-turbo': { displayName: 'GPT-4 Turbo with Vision' },\n\t'openai/gpt-4-turbo-2024-04-09': { displayName: 'GPT-4 Turbo with Vision (2024-04-09)' },\n\t'openai/gpt-4-turbo-preview': { displayName: 'GPT-4 Turbo (gpt-4-turbo-preview)' },\n\t'openai/gpt-4-0125-preview': { displayName: 'GPT-4 25-01 (gpt-4-0125-preview)' },\n\t'openai/gpt-4-1106-preview': { displayName: 'GPT-4 06-11 (gpt-4-1106-preview)' },\n\t'openai/gpt-4-vision-preview': { displayName: 'GPT-4 Vision', enabled: false },\n\t'openai/gpt-4-32k': { displayName: 'gpt-4-32k' },\n\t'openai/gpt-4-0613': { displayName: 'gpt-4-0613' },\n\t'openai/gpt-4-32k-0613': { displayName: 'gpt-4-32k-0613' },\n\t'openai/gpt-4': { displayName: 'gpt-4' },\n\t'openai/gpt-4-0314': { displayName: 'gpt-4-0314' },\n\t'openai/gpt-3.5-turbo': { displayName: 'gpt-3.5-turbo' },\n\t'openai/gpt-3.5-turbo-0125': { displayName: 'gpt-3.5-turbo-0125' },\n\t'openai/gpt-3.5-turbo-1106': { displayName: 'gpt-3.5-turbo-1106' },\n\t'openai/gpt-3.5-turbo-instruct': { displayName: 'gpt-3.5-turbo-instruct' },\n\t'openai/gpt-3.5-turbo-16k': { displayName: 'gpt-3.5-turbo-16k' },\n\t'openai/gpt-3.5-turbo-0613': { displayName: 'gpt-3.5-turbo-0613', enabled: false },\n\t'openai/gpt-3.5-turbo-16k-0613': { displayName: 'gpt-3.5-turbo-16k-0613', enabled: false },\n\t'openai/text-davinci-003': { displayName: 'text-davinci-003' },\n\t'openai/text-davinci-002': { displayName: 'text-davinci-002' },\n\t'google/models/gemini-2.5-flash': { displayName: 'Gemini 2.5 Flash', reasoning: true },\n\t'google/models/gemini-2.5-flash-lite-preview-06-17': { displayName: 'Gemini 2.5 Flash-Lite Preview 06-17', reasoning: true },\n\t'google/models/gemini-2.5-pro': { displayName: 'Gemini 2.5 Pro', reasoning: true },\n\t'google/models/gemini-2.5-pro-exp-03-25': { displayName: 'Gemini 2.5 Pro Experimental 03-25', reasoning: true },\n\t'google/models/gemini-2.0-flash': { displayName: 'Gemini 2.0 Flash' },\n\t'google/models/gemini-2.0-flash-lite': { displayName: 'Gemini 2.0 Flash-Lite' },\n\t'google/models/gemini-2.0-flash-preview-image-generation': { displayName: 'Gemini 2.0 Flash Preview Image Generation', responseModalities: ['Text', 'Image'] },\n\t'google/models/gemini-2.0-pro-exp-02-05': { displayName: 'Gemini 2.0 Pro Experimental 02-05' },\n\t'google/models/gemini-2.0-flash-thinking-exp-01-21': { displayName: 'Gemini 2.0 Flash Thinking Experimental 01-21' },\n\t'google/models/gemini-2.0-flash-exp': { displayName: 'Gemini 2.0 Flash Experimental', responseModalities: ['Text', 'Image'] },\n\t'google/models/gemini-2.0-flash-thinking-exp-1219': { displayName: 'Gemini 2.0 Flash Thinking Mode' },\n\t'google/models/gemma-3n-e4b-it': { displayName: 'Gemma 3n E4B' },\n\t'google/models/gemma-3n-e2b-it': { displayName: 'Gemma 3n E2B' },\n\t'google/models/gemma-3-27b-it': { displayName: 'Gemma 3 27B' },\n\t'google/models/learnlm-1.5-pro-experimental': { displayName: 'LearnLM 1.5 Pro Experimental' },\n\t'google/models/gemini-exp-1206': { displayName: 'Gemini (exp-1206)' },\n\t'google/models/gemini-1.5-flash-8b': { displayName: 'Gemini 1.5 Flash-8B' },\n\t'google/models/gemini-1.5-pro-002': { displayName: 'Gemini 1.5 Pro 2' },\n\t'google/models/gemini-1.5-flash-002': { displayName: 'Gemini 1.5 Flash 2' },\n\t'google/models/gemini-1.5-flash-latest': { displayName: 'Gemini 1.5 Flash' },\n\t'google/models/gemini-1.5-pro-latest': { displayName: 'Gemini 1.5 Pro' },\n\t'google/models/gemini-1.0-pro-latest': { displayName: 'Gemini 1.0 Pro' },\n\t'google/models/gemini-pro-vision': { displayName: 'Gemini 1.0 Pro Vision' },\n\t'google/models/chat-bison-001': { displayName: 'PaLM 2 Chat (Legacy)' },\n\t'anthropic/claude-opus-4-1': { displayName: 'Claude Opus 4.1', url: 'https://api.anthropic.com/v1/messages' },\n\t'anthropic/claude-opus-4-0': { displayName: 'Claude Opus 4', url: 'https://api.anthropic.com/v1/messages' },\n\t'anthropic/claude-sonnet-4-5': { displayName: 'Claude Sonnet 4.5', url: 'https://api.anthropic.com/v1/messages' },\n\t'anthropic/claude-sonnet-4-0': { displayName: 'Claude Sonnet 4', url: 'https://api.anthropic.com/v1/messages' },\n\t'anthropic/claude-3-7-sonnet-latest': { displayName: 'Claude 3.7 Sonnet', url: 'https://api.anthropic.com/v1/messages' },\n\t'anthropic/claude-3-5-sonnet-latest': { displayName: 'Claude 3.5 Sonnet v2', url: 'https://api.anthropic.com/v1/messages' },\n\t'anthropic/claude-3-5-haiku-latest': { displayName: 'Claude 3.5 Haiku', url: 'https://api.anthropic.com/v1/messages' },\n\t'anthropic/claude-3-haiku-20240307': { displayName: 'Claude 3 Haiku', url: 'https://api.anthropic.com/v1/messages' },\n\t'anthropic/claude-3-sonnet-20240229': { displayName: 'Claude 3 Sonnet', url: 'https://api.anthropic.com/v1/messages' },\n\t'anthropic/claude-3-opus-20240229': { displayName: 'Claude 3 Opus', url: 'https://api.anthropic.com/v1/messages' },\n\t'anthropic/claude-2.1': { displayName: 'Claude 2.1' },\n\t'anthropic/claude-instant-1.2': { displayName: 'Claude Instant' },\n\t'ai21/jamba-large': { displayName: 'Jamba Large', enabled: false },\n\t'ai21/jamba-mini': { displayName: 'Jamba Mini', enabled: false },\n\t'ai21/j2-ultra': { displayName: 'Jurassic-2 Ultra', enabled: false },\n\t'ai21/j2-mid': { displayName: 'Jurassic-2 Mid', enabled: false },\n\t'ai21/j2-light': { displayName: 'Jurassic-2 Light', enabled: false },\n\t'xai/grok-4-0709': { displayName: 'Grok 4' },\n\t'xai/grok-3-beta': { displayName: 'Grok 3' },\n\t'xai/grok-3-mini-beta': { displayName: 'Grok 3 Mini' },\n\t'xai/grok-3-fast-beta': { displayName: 'Grok 3 Fast' },\n\t'xai/grok-3-mini-fast-beta': { displayName: 'Grok 3 Mini Fast' },\n\t'xai/grok-2-image-1212': { displayName: 'Grok 2 Image Gen', imageGen: true },\n\t'xai/grok-2-vision-1212': { displayName: 'Grok 2 Vision' },\n\t'xai/grok-2-1212': { displayName: 'Grok 2' },\n\t'xai/grok-vision-beta': { displayName: 'Grok Vision' },\n\t'xai/grok-beta': { displayName: 'Grok Beta' },\n\t'deepseek/deepseek-chat': { displayName: 'Deepseek V3 - Chat' },\n\t'deepseek/deepseek-reasoner': { displayName: 'Deepseek R1 - Reasoner' },\n\t'openai/gpt-oss-120b': { displayName: 'GPT OSS 120B' },\n\t'openai/gpt-oss-20b': { displayName: 'GPT OSS 20B' },\n\t'groq/moonshotai/kimi-k2-instruct': { displayName: 'kimi-k2-instruct' },\n\t'groq/mistral-saba-24b': { displayName: 'mistral-saba-24b' },\n\t'groq/meta-llama/llama-4-scout-17b-16e-instruct': { displayName: 'Llama 4 Scout', imageInput: true },\n\t'groq/meta-llama/llama-4-maverick-17b-128e-instruct': { displayName: 'Llama 4 Maverick', imageInput: true },\n\t'groq/qwen-qwq-32b': { displayName: 'QwQ-32B', reasoning: true },\n\t'groq/deepseek-r1-distill-llama-70b': { displayName: 'DeepSeek R1 70b (llama)', reasoning: true },\n\t'groq/deepseek-r1-distill-qwen-32b': { displayName: 'DeepSeek R1 32b (qwen)', reasoning: true, enabled: false },\n\t'groq/deepseek-r1-distill-llama-70b-specdec': { displayName: 'DeepSeek R1 70b (llama, specdec)', reasoning: true, enabled: false },\n\t'groq/llama-3.3-70b-versatile': { displayName: 'Llama 3.3 70b Versatile' },\n\t'groq/llama-3.2-90b-vision-preview': { displayName: 'Llama 3.2 90b Vision preview', enabled: false },\n\t'groq/llama-3.3-70b-specdec': { displayName: 'Llama 3.3 70B (SpecDec)', enabled: false },\n\t'groq/llama-3.2-11b-vision-preview': { displayName: 'Llama 3.2 11B Vision Preview', enabled: false },\n\t'groq/llama-3.2-3b-preview': { displayName: 'Llama 3.2 3B Preview', enabled: false },\n\t'groq/llama-3.2-1b-preview': { displayName: 'Llama 3.2 1B Preview', enabled: false },\n\t'groq/llama-3.1-8b-instant': { displayName: 'Llama 3.1 8B' },\n\t'groq/llama3-70b-8192': { displayName: 'LLaMA3 70b' },\n\t'groq/llama3-8b-8192': { displayName: 'LLaMA3 8b' },\n\t'groq/llama-guard-3-8b': { displayName: 'Llama 3 Guard 8b' },\n\t'groq/gemma2-9b-it': { displayName: 'Gemma 2 9b' },\n\t'groq/qwen-2.5-coder-32b': { displayName: 'QwQ-2.5 coder 32b', enabled: false },\n\t'groq/qwen-2.5-32b': { displayName: 'QWEN 2.5 32b', enabled: false },\n\t'groq/mixtral-8x7b-32768': { displayName: 'Mixtral-8x7b' },\n\t'groq/llama-3.1-405b-reasoning': { displayName: 'Llama 3.1 405B', enabled: false },\n\t'groq/llama-3.1-70b-versatile': { displayName: 'Llama 3.1 70B', enabled: false },\n\t'groq/llama2-70b-4096': { displayName: 'LLaMA2 70b', enabled: false },\n\t'groq/gemma-7b-it': { displayName: 'Gemma 7B 8K', enabled: false },\n\t'openrouter/qwen/qwen3-coder': { displayName: 'Qwen: Qwen3 Coder' },\n\t'openrouter/qwen/qwen3-235b-a22b-07-25': { displayName: 'Qwen: Qwen3 235B A22B 2507' },\n\t'openrouter/openrouter/optimus-alpha': { displayName: 'Optimus Alpha' },\n\t'openrouter/openrouter/quasar-alpha': { displayName: 'Quasar Alpha', enabled: false },\n\t'openrouter/qwen/qwq-32b': { displayName: 'Qwen: QwQ-32B' },\n\t'openrouter/qwen/qwen-max': { displayName: 'Qwen: Qwen-Max' },\n\t'openrouter/deepseek/deepseek-r1': { displayName: 'DeepSeek: R1 (671B)' },\n\t'openrouter/deepseek/deepseek-chat': { displayName: 'DeepSeek V3' },\n\t'openrouter/meta-llama/llama-3.3-70b-instruct': { displayName: 'Llama 3.3 70B Instruct' },\n\t'openrouter/meta-llama/llama-3.2-90b-vision-instruct': { displayName: 'Llama 3.2 90B Vision model' },\n\t'openrouter/meta-llama/llama-3.2-11b-vision-instruct': { displayName: 'Llama 3.2 11B Vision model' },\n\t'openrouter/mattshumer/reflection-70b': { displayName: 'Reflection 70B' },\n\t'openrouter/meta-llama/llama-3.1-405b-instruct': { displayName: 'Meta: Llama 3.1 405B Instruct' },\n\t'openrouter/meta-llama/llama-3-70b-instruct': { displayName: 'Meta: Llama 3 70B Instruct' },\n\t'openrouter/meta-llama/llama-3-8b-instruct': { displayName: 'Meta: Llama 3 8B Instruct' },\n\t'openrouter/openchat/openchat-7b:free': { displayName: 'Openchat-7b' },\n\t'openrouter/huggingfaceh4/zephyr-7b-beta:free': { displayName: 'HuggingFace: Zephyr 7B' },\n\t'openrouter/openrouter/cinematika-7b:free': { displayName: 'Cinematika 7B' },\n\t'openrouter/mistralai/mistral-7b-instruct:free': { displayName: 'Mistral 7B Instruct' },\n\t'openrouter/nousresearch/nous-capybara-7b:free': { displayName: 'Nous: Capybara 7B' },\n\t'openrouter/google/gemma-7b-it:free': { displayName: 'Google: Gemma 7B' },\n\t'openrouter/mistralai/mixtral-8x7b-instruct': { displayName: 'Mixtral-8x7b-instruct' },\n\t'openrouter/snowflake/snowflake-arctic-instruct': { displayName: 'Snowflake: Arctic Instruct' },\n\t'openrouter/perplexity/sonar-medium-chat': { displayName: 'Perplexity: Sonar 8x7B' },\n\t'openrouter/perplexity/sonar-medium-online': { displayName: 'Perplexity: Sonar 8x7B Online' },\n\t'mistral/devstral-small-2505': { displayName: 'Devstral Small - free' },\n\t'mistral/codestral-latest': { displayName: 'Codestral' },\n\t'mistral/pixtral-large-latest': { displayName: 'Pixtral Large', imageInput: true },\n\t'mistral/pixtral-12b-2409': { displayName: 'Pixtral - free', imageInput: true },\n\t'mistral/mistral-medium-latest': { displayName: 'Mistral Medium 3' },\n\t'mistral/mistral-saba-latest': { displayName: 'Mistral Saba' },\n\t'mistral/ministral-3b-latest': { displayName: 'Ministral 3B' },\n\t'mistral/ministral-8b-latest': { displayName: 'Ministral 8B' },\n\t'mistral/mistral-small-latest': { displayName: 'Mistral Small - latest - free' },\n\t'mistral/mistral-large-2407': { displayName: 'Mistral Large 2' },\n\t'mistral/mistral-large-latest': { displayName: 'Mistral Large' },\n\t'mistral/open-mistral-7b': { displayName: 'Open Mistral 7b' },\n\t'mistral/open-mixtral-8x7b': { displayName: 'Open Mixtral 8x7b' },\n\t'mistral/mistral-tiny': { displayName: 'Mistral Tiny' },\n\t'mistral/mistral-small': { displayName: 'Mistral Small (old)' },\n\t'mistral/mistral-medium': { displayName: 'Mistral Medium' },\n\t'cohere/command-r': { displayName: 'Command-R' },\n\t'cohere/command-r-plus': { displayName: 'Command-R-Plus' },\n\t'cohere/command-light': { displayName: 'Command Light' },\n\t'cohere/c4ai-aya-23': { displayName: 'Aya 23' },\n\t'cloudflare/@cf/deepseek-ai/deepseek-r1-distill-qwen-32b': { displayName: 'deepseek-r1-distill-qwen-32b' },\n\t'cloudflare/@cf/meta/llama-2-7b-chat-fp16': { displayName: 'llama-2-7b-chat' },\n\t'cloudflare/@hf/meta-llama/meta-llama-3-8b-instruct': { displayName: 'llama-3-8b-instruct' },\n\t'cloudflare/@cf/tinyllama/tinyllama-1.1b-chat-v1.0': { displayName: 'tinyllama-1.1b-chat-v1.0' },\n} satisfies Record<string, ModelInfo>;\n\n// Export type for supported model names\nexport type SupportedModelName = keyof typeof supportedModels;\n\n/**\n * Extract provider name from model string (e.g., \"openai/gpt-4\" -> \"openai\")\n */\nexport function getProviderFromModel(model: string): string | null {\n\tconst parts = model.split('/');\n\treturn parts.length > 1 ? parts[0] : null;\n}\n\n/**\n * Get model information\n */\nexport function getModelInfo(model: string): ModelInfo | undefined {\n\treturn supportedModels[model];\n}\n\n/**\n * List all models for a provider\n */\nexport function listModels(provider?: string): string[] {\n\tconst models = Object.keys(supportedModels);\n\tif (!provider) {\n\t\treturn models;\n\t}\n\treturn models.filter((m) => m.startsWith(`${provider}/`));\n}\n\n/**\n * Check if a model exists\n */\nexport function isModelSupported(model: string): boolean {\n\treturn model in supportedModels;\n}\n\n"]}
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":";;;AAuLA,oDAGC;AAKD,oCAEC;AAKD,gCAMC;AAKD,4CAEC;AAQD,oCAkFC;AA1SY,QAAA,eAAe,GAAG;IAC9B,cAAc,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,uBAAuB,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,0HAA0H,EAAE;IACjO,mBAAmB,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,uBAAuB,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE;IAClG,mBAAmB,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,uBAAuB,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE;IAClG,0BAA0B,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,uBAAuB,EAAE,IAAI,EAAE;IACxF,gBAAgB,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,uBAAuB,EAAE,IAAI,EAAE;IAC3E,qBAAqB,EAAE,EAAE,WAAW,EAAE,cAAc,EAAE,uBAAuB,EAAE,IAAI,EAAE;IACrF,qBAAqB,EAAE,EAAE,WAAW,EAAE,cAAc,EAAE,uBAAuB,EAAE,IAAI,EAAE;IACrF,wBAAwB,EAAE,EAAE,WAAW,EAAE,iBAAiB,EAAE;IAC5D,gBAAgB,EAAE,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAE,uBAAuB,EAAE,IAAI,EAAE;IAC/F,6BAA6B,EAAE,EAAE,WAAW,EAAE,sBAAsB,EAAE,OAAO,EAAE,KAAK,EAAE;IACtF,kCAAkC,EAAE,EAAE,WAAW,EAAE,2BAA2B,EAAE,OAAO,EAAE,KAAK,EAAE;IAChG,qCAAqC,EAAE,EAAE,WAAW,EAAE,8BAA8B,EAAE,MAAM,EAAE,IAAI,EAAE;IACpG,gCAAgC,EAAE,EAAE,WAAW,EAAE,yBAAyB,EAAE,MAAM,EAAE,IAAI,EAAE;IAC1F,mBAAmB,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,uBAAuB,EAAE,IAAI,EAAE;IACjG,gBAAgB,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,uBAAuB,EAAE,IAAI,EAAE;IAC3F,WAAW,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,uBAAuB,EAAE,IAAI,EAAE;IACjG,0BAA0B,EAAE,EAAE,WAAW,EAAE,iBAAiB,EAAE;IAC9D,oBAAoB,EAAE,EAAE,WAAW,EAAE,aAAa,EAAE;IACpD,eAAe,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE;IAC3C,0BAA0B,EAAE,EAAE,WAAW,EAAE,sBAAsB,EAAE;IACnE,oBAAoB,EAAE,EAAE,WAAW,EAAE,yBAAyB,EAAE;IAChE,+BAA+B,EAAE,EAAE,WAAW,EAAE,sCAAsC,EAAE;IACxF,4BAA4B,EAAE,EAAE,WAAW,EAAE,mCAAmC,EAAE;IAClF,2BAA2B,EAAE,EAAE,WAAW,EAAE,kCAAkC,EAAE;IAChF,2BAA2B,EAAE,EAAE,WAAW,EAAE,kCAAkC,EAAE;IAChF,6BAA6B,EAAE,EAAE,WAAW,EAAE,cAAc,EAAE,OAAO,EAAE,KAAK,EAAE;IAC9E,kBAAkB,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE;IAChD,mBAAmB,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE;IAClD,uBAAuB,EAAE,EAAE,WAAW,EAAE,gBAAgB,EAAE;IAC1D,cAAc,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE;IACxC,mBAAmB,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE;IAClD,sBAAsB,EAAE,EAAE,WAAW,EAAE,eAAe,EAAE;IACxD,2BAA2B,EAAE,EAAE,WAAW,EAAE,oBAAoB,EAAE;IAClE,2BAA2B,EAAE,EAAE,WAAW,EAAE,oBAAoB,EAAE;IAClE,+BAA+B,EAAE,EAAE,WAAW,EAAE,wBAAwB,EAAE;IAC1E,0BAA0B,EAAE,EAAE,WAAW,EAAE,mBAAmB,EAAE;IAChE,2BAA2B,EAAE,EAAE,WAAW,EAAE,oBAAoB,EAAE,OAAO,EAAE,KAAK,EAAE;IAClF,+BAA+B,EAAE,EAAE,WAAW,EAAE,wBAAwB,EAAE,OAAO,EAAE,KAAK,EAAE;IAC1F,yBAAyB,EAAE,EAAE,WAAW,EAAE,kBAAkB,EAAE;IAC9D,yBAAyB,EAAE,EAAE,WAAW,EAAE,kBAAkB,EAAE;IAC9D,gCAAgC,EAAE,EAAE,WAAW,EAAE,kBAAkB,EAAE,SAAS,EAAE,IAAI,EAAE;IACtF,mDAAmD,EAAE,EAAE,WAAW,EAAE,qCAAqC,EAAE,SAAS,EAAE,IAAI,EAAE;IAC5H,8BAA8B,EAAE,EAAE,WAAW,EAAE,gBAAgB,EAAE,SAAS,EAAE,IAAI,EAAE;IAClF,wCAAwC,EAAE,EAAE,WAAW,EAAE,mCAAmC,EAAE,SAAS,EAAE,IAAI,EAAE;IAC/G,gCAAgC,EAAE,EAAE,WAAW,EAAE,kBAAkB,EAAE;IACrE,qCAAqC,EAAE,EAAE,WAAW,EAAE,uBAAuB,EAAE;IAC/E,yDAAyD,EAAE,EAAE,WAAW,EAAE,2CAA2C,EAAE,kBAAkB,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE;IAC9J,wCAAwC,EAAE,EAAE,WAAW,EAAE,mCAAmC,EAAE;IAC9F,mDAAmD,EAAE,EAAE,WAAW,EAAE,8CAA8C,EAAE;IACpH,oCAAoC,EAAE,EAAE,WAAW,EAAE,+BAA+B,EAAE,kBAAkB,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE;IAC7H,kDAAkD,EAAE,EAAE,WAAW,EAAE,gCAAgC,EAAE;IACrG,+BAA+B,EAAE,EAAE,WAAW,EAAE,cAAc,EAAE;IAChE,+BAA+B,EAAE,EAAE,WAAW,EAAE,cAAc,EAAE;IAChE,8BAA8B,EAAE,EAAE,WAAW,EAAE,aAAa,EAAE;IAC9D,4CAA4C,EAAE,EAAE,WAAW,EAAE,8BAA8B,EAAE;IAC7F,+BAA+B,EAAE,EAAE,WAAW,EAAE,mBAAmB,EAAE;IACrE,mCAAmC,EAAE,EAAE,WAAW,EAAE,qBAAqB,EAAE;IAC3E,kCAAkC,EAAE,EAAE,WAAW,EAAE,kBAAkB,EAAE;IACvE,oCAAoC,EAAE,EAAE,WAAW,EAAE,oBAAoB,EAAE;IAC3E,uCAAuC,EAAE,EAAE,WAAW,EAAE,kBAAkB,EAAE;IAC5E,qCAAqC,EAAE,EAAE,WAAW,EAAE,gBAAgB,EAAE;IACxE,qCAAqC,EAAE,EAAE,WAAW,EAAE,gBAAgB,EAAE;IACxE,iCAAiC,EAAE,EAAE,WAAW,EAAE,uBAAuB,EAAE;IAC3E,8BAA8B,EAAE,EAAE,WAAW,EAAE,sBAAsB,EAAE;IACvE,4BAA4B,EAAE,EAAE,WAAW,EAAE,kBAAkB,EAAE,GAAG,EAAE,uCAAuC,EAAE;IAC/G,2BAA2B,EAAE,EAAE,WAAW,EAAE,iBAAiB,EAAE,GAAG,EAAE,uCAAuC,EAAE;IAC7G,2BAA2B,EAAE,EAAE,WAAW,EAAE,eAAe,EAAE,GAAG,EAAE,uCAAuC,EAAE;IAC3G,6BAA6B,EAAE,EAAE,WAAW,EAAE,mBAAmB,EAAE,GAAG,EAAE,uCAAuC,EAAE;IACjH,6BAA6B,EAAE,EAAE,WAAW,EAAE,iBAAiB,EAAE,GAAG,EAAE,uCAAuC,EAAE;IAC/G,oCAAoC,EAAE,EAAE,WAAW,EAAE,mBAAmB,EAAE,GAAG,EAAE,uCAAuC,EAAE;IACxH,oCAAoC,EAAE,EAAE,WAAW,EAAE,sBAAsB,EAAE,GAAG,EAAE,uCAAuC,EAAE;IAC3H,mCAAmC,EAAE,EAAE,WAAW,EAAE,kBAAkB,EAAE,GAAG,EAAE,uCAAuC,EAAE;IACtH,mCAAmC,EAAE,EAAE,WAAW,EAAE,gBAAgB,EAAE,GAAG,EAAE,uCAAuC,EAAE;IACpH,oCAAoC,EAAE,EAAE,WAAW,EAAE,iBAAiB,EAAE,GAAG,EAAE,uCAAuC,EAAE;IACtH,kCAAkC,EAAE,EAAE,WAAW,EAAE,eAAe,EAAE,GAAG,EAAE,uCAAuC,EAAE;IAClH,sBAAsB,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE;IACrD,8BAA8B,EAAE,EAAE,WAAW,EAAE,gBAAgB,EAAE;IACjE,kBAAkB,EAAE,EAAE,WAAW,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE;IAClE,iBAAiB,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE;IAChE,eAAe,EAAE,EAAE,WAAW,EAAE,kBAAkB,EAAE,OAAO,EAAE,KAAK,EAAE;IACpE,aAAa,EAAE,EAAE,WAAW,EAAE,gBAAgB,EAAE,OAAO,EAAE,KAAK,EAAE;IAChE,eAAe,EAAE,EAAE,WAAW,EAAE,kBAAkB,EAAE,OAAO,EAAE,KAAK,EAAE;IACpE,iBAAiB,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE;IAC5C,iBAAiB,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE;IAC5C,sBAAsB,EAAE,EAAE,WAAW,EAAE,aAAa,EAAE;IACtD,sBAAsB,EAAE,EAAE,WAAW,EAAE,aAAa,EAAE;IACtD,2BAA2B,EAAE,EAAE,WAAW,EAAE,kBAAkB,EAAE;IAChE,uBAAuB,EAAE,EAAE,WAAW,EAAE,kBAAkB,EAAE,QAAQ,EAAE,IAAI,EAAE;IAC5E,wBAAwB,EAAE,EAAE,WAAW,EAAE,eAAe,EAAE;IAC1D,iBAAiB,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE;IAC5C,sBAAsB,EAAE,EAAE,WAAW,EAAE,aAAa,EAAE;IACtD,eAAe,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE;IAC7C,wBAAwB,EAAE,EAAE,WAAW,EAAE,oBAAoB,EAAE;IAC/D,4BAA4B,EAAE,EAAE,WAAW,EAAE,wBAAwB,EAAE;IACvE,qBAAqB,EAAE,EAAE,WAAW,EAAE,cAAc,EAAE;IACtD,oBAAoB,EAAE,EAAE,WAAW,EAAE,aAAa,EAAE;IACpD,kCAAkC,EAAE,EAAE,WAAW,EAAE,kBAAkB,EAAE;IACvE,uBAAuB,EAAE,EAAE,WAAW,EAAE,kBAAkB,EAAE;IAC5D,gDAAgD,EAAE,EAAE,WAAW,EAAE,eAAe,EAAE,UAAU,EAAE,IAAI,EAAE;IACpG,oDAAoD,EAAE,EAAE,WAAW,EAAE,kBAAkB,EAAE,UAAU,EAAE,IAAI,EAAE;IAC3G,mBAAmB,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE;IAChE,oCAAoC,EAAE,EAAE,WAAW,EAAE,yBAAyB,EAAE,SAAS,EAAE,IAAI,EAAE;IACjG,mCAAmC,EAAE,EAAE,WAAW,EAAE,wBAAwB,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE;IAC/G,4CAA4C,EAAE,EAAE,WAAW,EAAE,kCAAkC,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE;IAClI,8BAA8B,EAAE,EAAE,WAAW,EAAE,yBAAyB,EAAE;IAC1E,mCAAmC,EAAE,EAAE,WAAW,EAAE,8BAA8B,EAAE,OAAO,EAAE,KAAK,EAAE;IACpG,4BAA4B,EAAE,EAAE,WAAW,EAAE,yBAAyB,EAAE,OAAO,EAAE,KAAK,EAAE;IACxF,mCAAmC,EAAE,EAAE,WAAW,EAAE,8BAA8B,EAAE,OAAO,EAAE,KAAK,EAAE;IACpG,2BAA2B,EAAE,EAAE,WAAW,EAAE,sBAAsB,EAAE,OAAO,EAAE,KAAK,EAAE;IACpF,2BAA2B,EAAE,EAAE,WAAW,EAAE,sBAAsB,EAAE,OAAO,EAAE,KAAK,EAAE;IACpF,2BAA2B,EAAE,EAAE,WAAW,EAAE,cAAc,EAAE;IAC5D,sBAAsB,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE;IACrD,qBAAqB,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE;IACnD,uBAAuB,EAAE,EAAE,WAAW,EAAE,kBAAkB,EAAE;IAC5D,mBAAmB,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE;IAClD,yBAAyB,EAAE,EAAE,WAAW,EAAE,mBAAmB,EAAE,OAAO,EAAE,KAAK,EAAE;IAC/E,mBAAmB,EAAE,EAAE,WAAW,EAAE,cAAc,EAAE,OAAO,EAAE,KAAK,EAAE;IACpE,yBAAyB,EAAE,EAAE,WAAW,EAAE,cAAc,EAAE;IAC1D,+BAA+B,EAAE,EAAE,WAAW,EAAE,gBAAgB,EAAE,OAAO,EAAE,KAAK,EAAE;IAClF,8BAA8B,EAAE,EAAE,WAAW,EAAE,eAAe,EAAE,OAAO,EAAE,KAAK,EAAE;IAChF,sBAAsB,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE;IACrE,kBAAkB,EAAE,EAAE,WAAW,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE;IAClE,6BAA6B,EAAE,EAAE,WAAW,EAAE,mBAAmB,EAAE;IACnE,uCAAuC,EAAE,EAAE,WAAW,EAAE,4BAA4B,EAAE;IACtF,qCAAqC,EAAE,EAAE,WAAW,EAAE,eAAe,EAAE;IACvE,oCAAoC,EAAE,EAAE,WAAW,EAAE,cAAc,EAAE,OAAO,EAAE,KAAK,EAAE;IACrF,yBAAyB,EAAE,EAAE,WAAW,EAAE,eAAe,EAAE;IAC3D,0BAA0B,EAAE,EAAE,WAAW,EAAE,gBAAgB,EAAE;IAC7D,iCAAiC,EAAE,EAAE,WAAW,EAAE,qBAAqB,EAAE;IACzE,mCAAmC,EAAE,EAAE,WAAW,EAAE,aAAa,EAAE;IACnE,8CAA8C,EAAE,EAAE,WAAW,EAAE,wBAAwB,EAAE;IACzF,qDAAqD,EAAE,EAAE,WAAW,EAAE,4BAA4B,EAAE;IACpG,qDAAqD,EAAE,EAAE,WAAW,EAAE,4BAA4B,EAAE;IACpG,sCAAsC,EAAE,EAAE,WAAW,EAAE,gBAAgB,EAAE;IACzE,+CAA+C,EAAE,EAAE,WAAW,EAAE,+BAA+B,EAAE;IACjG,4CAA4C,EAAE,EAAE,WAAW,EAAE,4BAA4B,EAAE;IAC3F,2CAA2C,EAAE,EAAE,WAAW,EAAE,2BAA2B,EAAE;IACzF,sCAAsC,EAAE,EAAE,WAAW,EAAE,aAAa,EAAE;IACtE,8CAA8C,EAAE,EAAE,WAAW,EAAE,wBAAwB,EAAE;IACzF,0CAA0C,EAAE,EAAE,WAAW,EAAE,eAAe,EAAE;IAC5E,+CAA+C,EAAE,EAAE,WAAW,EAAE,qBAAqB,EAAE;IACvF,+CAA+C,EAAE,EAAE,WAAW,EAAE,mBAAmB,EAAE;IACrF,oCAAoC,EAAE,EAAE,WAAW,EAAE,kBAAkB,EAAE;IACzE,4CAA4C,EAAE,EAAE,WAAW,EAAE,uBAAuB,EAAE;IACtF,gDAAgD,EAAE,EAAE,WAAW,EAAE,4BAA4B,EAAE;IAC/F,yCAAyC,EAAE,EAAE,WAAW,EAAE,wBAAwB,EAAE;IACpF,2CAA2C,EAAE,EAAE,WAAW,EAAE,+BAA+B,EAAE;IAC7F,6BAA6B,EAAE,EAAE,WAAW,EAAE,uBAAuB,EAAE;IACvE,0BAA0B,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE;IACxD,8BAA8B,EAAE,EAAE,WAAW,EAAE,eAAe,EAAE,UAAU,EAAE,IAAI,EAAE;IAClF,0BAA0B,EAAE,EAAE,WAAW,EAAE,gBAAgB,EAAE,UAAU,EAAE,IAAI,EAAE;IAC/E,+BAA+B,EAAE,EAAE,WAAW,EAAE,kBAAkB,EAAE;IACpE,6BAA6B,EAAE,EAAE,WAAW,EAAE,cAAc,EAAE;IAC9D,6BAA6B,EAAE,EAAE,WAAW,EAAE,cAAc,EAAE;IAC9D,6BAA6B,EAAE,EAAE,WAAW,EAAE,cAAc,EAAE;IAC9D,8BAA8B,EAAE,EAAE,WAAW,EAAE,+BAA+B,EAAE;IAChF,4BAA4B,EAAE,EAAE,WAAW,EAAE,iBAAiB,EAAE;IAChE,8BAA8B,EAAE,EAAE,WAAW,EAAE,eAAe,EAAE;IAChE,yBAAyB,EAAE,EAAE,WAAW,EAAE,iBAAiB,EAAE;IAC7D,2BAA2B,EAAE,EAAE,WAAW,EAAE,mBAAmB,EAAE;IACjE,sBAAsB,EAAE,EAAE,WAAW,EAAE,cAAc,EAAE;IACvD,uBAAuB,EAAE,EAAE,WAAW,EAAE,qBAAqB,EAAE;IAC/D,wBAAwB,EAAE,EAAE,WAAW,EAAE,gBAAgB,EAAE;IAC3D,kBAAkB,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE;IAChD,uBAAuB,EAAE,EAAE,WAAW,EAAE,gBAAgB,EAAE;IAC1D,sBAAsB,EAAE,EAAE,WAAW,EAAE,eAAe,EAAE;IACxD,oBAAoB,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE;IAC/C,yDAAyD,EAAE,EAAE,WAAW,EAAE,8BAA8B,EAAE;IAC1G,0CAA0C,EAAE,EAAE,WAAW,EAAE,iBAAiB,EAAE;IAC9E,oDAAoD,EAAE,EAAE,WAAW,EAAE,qBAAqB,EAAE;IAC5F,mDAAmD,EAAE,EAAE,WAAW,EAAE,0BAA0B,EAAE;CAC5D,CAAC;AAQtC,SAAgB,oBAAoB,CAAC,KAAa;IACjD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/B,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3C,CAAC;AAKD,SAAgB,YAAY,CAAC,KAAa;IACzC,OAAO,uBAAe,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAKD,SAAgB,UAAU,CAAC,QAAiB;IAC3C,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,uBAAe,CAAC,CAAC;IAC5C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACf,OAAO,MAAM,CAAC;IACf,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC;AAC3D,CAAC;AAKD,SAAgB,gBAAgB,CAAC,KAAa;IAC7C,OAAO,KAAK,IAAI,uBAAe,CAAC;AACjC,CAAC;AAQD,SAAgB,YAAY,CAAC,UAAkB;;IAC9C,IAAI,CAAC,UAAU;QAAE,OAAO,UAAU,CAAC;IAEnC,MAAM,MAAM,GAAG,uBAAe,CAAC;IAC/B,MAAM,UAAU,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IAGnD,IAAI,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;QACxB,OAAO,UAAU,CAAC;IACnB,CAAC;IAGD,KAAK,MAAM,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5C,IAAI,GAAG,CAAC,WAAW,EAAE,KAAK,UAAU,EAAE,CAAC;YACtC,OAAO,GAAG,CAAC;QACZ,CAAC;IACF,CAAC;IAOD,MAAM,OAAO,GAAY,EAAE,CAAC;IAG5B,MAAM,SAAS,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC3E,MAAM,oBAAoB,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;IAEnD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACnD,IAAI,SAAS,IAAI,KAAK,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK;YAAE,SAAS;QAE5D,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;QACnC,MAAM,gBAAgB,GAAG,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QACjE,MAAM,SAAS,GAAG,CAAA,MAAA,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,0CAAE,WAAW,EAAE,KAAI,EAAE,CAAC;QAC5D,MAAM,mBAAmB,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;QACjD,MAAM,qBAAqB,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAE1D,IAAI,KAAK,GAAG,CAAC,CAAC;QAGd,IAAI,SAAS,KAAK,UAAU,IAAI,mBAAmB,KAAK,oBAAoB,EAAE,CAAC;YAC9E,KAAK,GAAG,IAAI,CAAC;QACd,CAAC;aAEI,IAAI,gBAAgB,KAAK,UAAU,IAAI,qBAAqB,KAAK,oBAAoB,EAAE,CAAC;YAC5F,KAAK,GAAG,GAAG,CAAC;QACb,CAAC;aAEI,IAAI,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,mBAAmB,CAAC,UAAU,CAAC,oBAAoB,CAAC,EAAE,CAAC;YACnG,KAAK,GAAG,GAAG,CAAC;QACb,CAAC;aAEI,IAAI,gBAAgB,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,qBAAqB,CAAC,UAAU,CAAC,oBAAoB,CAAC,EAAE,CAAC;YAC5G,KAAK,GAAG,GAAG,CAAC;QACb,CAAC;aAEI,IAAI,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,mBAAmB,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC;YAC/F,KAAK,GAAG,GAAG,CAAC;QACb,CAAC;aAEI,IAAI,gBAAgB,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,qBAAqB,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC;YACxG,KAAK,GAAG,GAAG,CAAC;QACb,CAAC;aAEI,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YACxC,KAAK,GAAG,GAAG,CAAC;QACb,CAAC;QAED,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9B,CAAC;IACF,CAAC;IAGD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QAC1C,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACvB,CAAC;IAGD,OAAO,UAAU,CAAC;AACnB,CAAC","sourcesContent":["import { ModelInfo } from './types';\n\n// Import the supported models data\nexport const supportedModels = {\n\t'openai/gpt-5': { displayName: 'GPT-5', usesMaxCompletionTokens: true, reasoning: true, knownIssues: 'Highly unpredictable reasoning token usage (can use 1000+ tokens); recommend 1500+ max_completion_tokens for reliability' },\n\t'openai/gpt-5-mini': { displayName: 'GPT-5 mini', usesMaxCompletionTokens: true, reasoning: true },\n\t'openai/gpt-5-nano': { displayName: 'GPT-5 nano', usesMaxCompletionTokens: true, reasoning: true },\n\t'openai/gpt-5-chat-latest': { displayName: 'GPT-5 Chat', usesMaxCompletionTokens: true },\n\t'openai/gpt-4.1': { displayName: 'GPT 4.1', usesMaxCompletionTokens: true },\n\t'openai/gpt-4.1-mini': { displayName: 'GPT 4.1 mini', usesMaxCompletionTokens: true },\n\t'openai/gpt-4.1-nano': { displayName: 'GPT 4.1 nano', usesMaxCompletionTokens: true },\n\t'openai/gpt-4.5-preview': { displayName: 'gpt 4.5 preview' },\n\t'openai/o3-mini': { displayName: 'gpt o3 mini', noSystem: true, usesMaxCompletionTokens: true },\n\t'openai/gpt-4o-audio-preview': { displayName: 'gpt-4o-audio-preview', enabled: false },\n\t'openai/gpt-4o-mini-audio-preview': { displayName: 'gpt-4o-mini-audio-preview', enabled: false },\n\t'openai/gpt-4o-mini-realtime-preview': { displayName: 'gpt-4o-mini-realtime-preview', noChat: true },\n\t'openai/gpt-4o-realtime-preview': { displayName: 'gpt-4o-realtime-preview', noChat: true },\n\t'openai/o1-preview': { displayName: 'o1-preview', noSystem: true, usesMaxCompletionTokens: true },\n\t'openai/o1-mini': { displayName: 'o1-mini', noSystem: true, usesMaxCompletionTokens: true },\n\t'openai/o1': { displayName: 'o1', noSystem: true, enabled: false, usesMaxCompletionTokens: true },\n\t'openai/chatgpt-4o-latest': { displayName: ' ChatGPT GPT-4o' },\n\t'openai/gpt-4o-mini': { displayName: 'GPT-4o mini' },\n\t'openai/gpt-4o': { displayName: ' GPT-4o' },\n\t'openai/gpt-4o-2024-05-13': { displayName: ' GPT-4o (2024-05-13)' },\n\t'openai/gpt-4-turbo': { displayName: 'GPT-4 Turbo with Vision' },\n\t'openai/gpt-4-turbo-2024-04-09': { displayName: 'GPT-4 Turbo with Vision (2024-04-09)' },\n\t'openai/gpt-4-turbo-preview': { displayName: 'GPT-4 Turbo (gpt-4-turbo-preview)' },\n\t'openai/gpt-4-0125-preview': { displayName: 'GPT-4 25-01 (gpt-4-0125-preview)' },\n\t'openai/gpt-4-1106-preview': { displayName: 'GPT-4 06-11 (gpt-4-1106-preview)' },\n\t'openai/gpt-4-vision-preview': { displayName: 'GPT-4 Vision', enabled: false },\n\t'openai/gpt-4-32k': { displayName: 'gpt-4-32k' },\n\t'openai/gpt-4-0613': { displayName: 'gpt-4-0613' },\n\t'openai/gpt-4-32k-0613': { displayName: 'gpt-4-32k-0613' },\n\t'openai/gpt-4': { displayName: 'gpt-4' },\n\t'openai/gpt-4-0314': { displayName: 'gpt-4-0314' },\n\t'openai/gpt-3.5-turbo': { displayName: 'gpt-3.5-turbo' },\n\t'openai/gpt-3.5-turbo-0125': { displayName: 'gpt-3.5-turbo-0125' },\n\t'openai/gpt-3.5-turbo-1106': { displayName: 'gpt-3.5-turbo-1106' },\n\t'openai/gpt-3.5-turbo-instruct': { displayName: 'gpt-3.5-turbo-instruct' },\n\t'openai/gpt-3.5-turbo-16k': { displayName: 'gpt-3.5-turbo-16k' },\n\t'openai/gpt-3.5-turbo-0613': { displayName: 'gpt-3.5-turbo-0613', enabled: false },\n\t'openai/gpt-3.5-turbo-16k-0613': { displayName: 'gpt-3.5-turbo-16k-0613', enabled: false },\n\t'openai/text-davinci-003': { displayName: 'text-davinci-003' },\n\t'openai/text-davinci-002': { displayName: 'text-davinci-002' },\n\t'google/models/gemini-2.5-flash': { displayName: 'Gemini 2.5 Flash', reasoning: true },\n\t'google/models/gemini-2.5-flash-lite-preview-06-17': { displayName: 'Gemini 2.5 Flash-Lite Preview 06-17', reasoning: true },\n\t'google/models/gemini-2.5-pro': { displayName: 'Gemini 2.5 Pro', reasoning: true },\n\t'google/models/gemini-2.5-pro-exp-03-25': { displayName: 'Gemini 2.5 Pro Experimental 03-25', reasoning: true },\n\t'google/models/gemini-2.0-flash': { displayName: 'Gemini 2.0 Flash' },\n\t'google/models/gemini-2.0-flash-lite': { displayName: 'Gemini 2.0 Flash-Lite' },\n\t'google/models/gemini-2.0-flash-preview-image-generation': { displayName: 'Gemini 2.0 Flash Preview Image Generation', responseModalities: ['Text', 'Image'] },\n\t'google/models/gemini-2.0-pro-exp-02-05': { displayName: 'Gemini 2.0 Pro Experimental 02-05' },\n\t'google/models/gemini-2.0-flash-thinking-exp-01-21': { displayName: 'Gemini 2.0 Flash Thinking Experimental 01-21' },\n\t'google/models/gemini-2.0-flash-exp': { displayName: 'Gemini 2.0 Flash Experimental', responseModalities: ['Text', 'Image'] },\n\t'google/models/gemini-2.0-flash-thinking-exp-1219': { displayName: 'Gemini 2.0 Flash Thinking Mode' },\n\t'google/models/gemma-3n-e4b-it': { displayName: 'Gemma 3n E4B' },\n\t'google/models/gemma-3n-e2b-it': { displayName: 'Gemma 3n E2B' },\n\t'google/models/gemma-3-27b-it': { displayName: 'Gemma 3 27B' },\n\t'google/models/learnlm-1.5-pro-experimental': { displayName: 'LearnLM 1.5 Pro Experimental' },\n\t'google/models/gemini-exp-1206': { displayName: 'Gemini (exp-1206)' },\n\t'google/models/gemini-1.5-flash-8b': { displayName: 'Gemini 1.5 Flash-8B' },\n\t'google/models/gemini-1.5-pro-002': { displayName: 'Gemini 1.5 Pro 2' },\n\t'google/models/gemini-1.5-flash-002': { displayName: 'Gemini 1.5 Flash 2' },\n\t'google/models/gemini-1.5-flash-latest': { displayName: 'Gemini 1.5 Flash' },\n\t'google/models/gemini-1.5-pro-latest': { displayName: 'Gemini 1.5 Pro' },\n\t'google/models/gemini-1.0-pro-latest': { displayName: 'Gemini 1.0 Pro' },\n\t'google/models/gemini-pro-vision': { displayName: 'Gemini 1.0 Pro Vision' },\n\t'google/models/chat-bison-001': { displayName: 'PaLM 2 Chat (Legacy)' },\n\t'anthropic/claude-haiku-4-5': { displayName: 'Claude Haiku 4.5', url: 'https://api.anthropic.com/v1/messages' },\n\t'anthropic/claude-opus-4-1': { displayName: 'Claude Opus 4.1', url: 'https://api.anthropic.com/v1/messages' },\n\t'anthropic/claude-opus-4-0': { displayName: 'Claude Opus 4', url: 'https://api.anthropic.com/v1/messages' },\n\t'anthropic/claude-sonnet-4-5': { displayName: 'Claude Sonnet 4.5', url: 'https://api.anthropic.com/v1/messages' },\n\t'anthropic/claude-sonnet-4-0': { displayName: 'Claude Sonnet 4', url: 'https://api.anthropic.com/v1/messages' },\n\t'anthropic/claude-3-7-sonnet-latest': { displayName: 'Claude 3.7 Sonnet', url: 'https://api.anthropic.com/v1/messages' },\n\t'anthropic/claude-3-5-sonnet-latest': { displayName: 'Claude 3.5 Sonnet v2', url: 'https://api.anthropic.com/v1/messages' },\n\t'anthropic/claude-3-5-haiku-latest': { displayName: 'Claude 3.5 Haiku', url: 'https://api.anthropic.com/v1/messages' },\n\t'anthropic/claude-3-haiku-20240307': { displayName: 'Claude 3 Haiku', url: 'https://api.anthropic.com/v1/messages' },\n\t'anthropic/claude-3-sonnet-20240229': { displayName: 'Claude 3 Sonnet', url: 'https://api.anthropic.com/v1/messages' },\n\t'anthropic/claude-3-opus-20240229': { displayName: 'Claude 3 Opus', url: 'https://api.anthropic.com/v1/messages' },\n\t'anthropic/claude-2.1': { displayName: 'Claude 2.1' },\n\t'anthropic/claude-instant-1.2': { displayName: 'Claude Instant' },\n\t'ai21/jamba-large': { displayName: 'Jamba Large', enabled: false },\n\t'ai21/jamba-mini': { displayName: 'Jamba Mini', enabled: false },\n\t'ai21/j2-ultra': { displayName: 'Jurassic-2 Ultra', enabled: false },\n\t'ai21/j2-mid': { displayName: 'Jurassic-2 Mid', enabled: false },\n\t'ai21/j2-light': { displayName: 'Jurassic-2 Light', enabled: false },\n\t'xai/grok-4-0709': { displayName: 'Grok 4' },\n\t'xai/grok-3-beta': { displayName: 'Grok 3' },\n\t'xai/grok-3-mini-beta': { displayName: 'Grok 3 Mini' },\n\t'xai/grok-3-fast-beta': { displayName: 'Grok 3 Fast' },\n\t'xai/grok-3-mini-fast-beta': { displayName: 'Grok 3 Mini Fast' },\n\t'xai/grok-2-image-1212': { displayName: 'Grok 2 Image Gen', imageGen: true },\n\t'xai/grok-2-vision-1212': { displayName: 'Grok 2 Vision' },\n\t'xai/grok-2-1212': { displayName: 'Grok 2' },\n\t'xai/grok-vision-beta': { displayName: 'Grok Vision' },\n\t'xai/grok-beta': { displayName: 'Grok Beta' },\n\t'deepseek/deepseek-chat': { displayName: 'Deepseek V3 - Chat' },\n\t'deepseek/deepseek-reasoner': { displayName: 'Deepseek R1 - Reasoner' },\n\t'openai/gpt-oss-120b': { displayName: 'GPT OSS 120B' },\n\t'openai/gpt-oss-20b': { displayName: 'GPT OSS 20B' },\n\t'groq/moonshotai/kimi-k2-instruct': { displayName: 'kimi-k2-instruct' },\n\t'groq/mistral-saba-24b': { displayName: 'mistral-saba-24b' },\n\t'groq/meta-llama/llama-4-scout-17b-16e-instruct': { displayName: 'Llama 4 Scout', imageInput: true },\n\t'groq/meta-llama/llama-4-maverick-17b-128e-instruct': { displayName: 'Llama 4 Maverick', imageInput: true },\n\t'groq/qwen-qwq-32b': { displayName: 'QwQ-32B', reasoning: true },\n\t'groq/deepseek-r1-distill-llama-70b': { displayName: 'DeepSeek R1 70b (llama)', reasoning: true },\n\t'groq/deepseek-r1-distill-qwen-32b': { displayName: 'DeepSeek R1 32b (qwen)', reasoning: true, enabled: false },\n\t'groq/deepseek-r1-distill-llama-70b-specdec': { displayName: 'DeepSeek R1 70b (llama, specdec)', reasoning: true, enabled: false },\n\t'groq/llama-3.3-70b-versatile': { displayName: 'Llama 3.3 70b Versatile' },\n\t'groq/llama-3.2-90b-vision-preview': { displayName: 'Llama 3.2 90b Vision preview', enabled: false },\n\t'groq/llama-3.3-70b-specdec': { displayName: 'Llama 3.3 70B (SpecDec)', enabled: false },\n\t'groq/llama-3.2-11b-vision-preview': { displayName: 'Llama 3.2 11B Vision Preview', enabled: false },\n\t'groq/llama-3.2-3b-preview': { displayName: 'Llama 3.2 3B Preview', enabled: false },\n\t'groq/llama-3.2-1b-preview': { displayName: 'Llama 3.2 1B Preview', enabled: false },\n\t'groq/llama-3.1-8b-instant': { displayName: 'Llama 3.1 8B' },\n\t'groq/llama3-70b-8192': { displayName: 'LLaMA3 70b' },\n\t'groq/llama3-8b-8192': { displayName: 'LLaMA3 8b' },\n\t'groq/llama-guard-3-8b': { displayName: 'Llama 3 Guard 8b' },\n\t'groq/gemma2-9b-it': { displayName: 'Gemma 2 9b' },\n\t'groq/qwen-2.5-coder-32b': { displayName: 'QwQ-2.5 coder 32b', enabled: false },\n\t'groq/qwen-2.5-32b': { displayName: 'QWEN 2.5 32b', enabled: false },\n\t'groq/mixtral-8x7b-32768': { displayName: 'Mixtral-8x7b' },\n\t'groq/llama-3.1-405b-reasoning': { displayName: 'Llama 3.1 405B', enabled: false },\n\t'groq/llama-3.1-70b-versatile': { displayName: 'Llama 3.1 70B', enabled: false },\n\t'groq/llama2-70b-4096': { displayName: 'LLaMA2 70b', enabled: false },\n\t'groq/gemma-7b-it': { displayName: 'Gemma 7B 8K', enabled: false },\n\t'openrouter/qwen/qwen3-coder': { displayName: 'Qwen: Qwen3 Coder' },\n\t'openrouter/qwen/qwen3-235b-a22b-07-25': { displayName: 'Qwen: Qwen3 235B A22B 2507' },\n\t'openrouter/openrouter/optimus-alpha': { displayName: 'Optimus Alpha' },\n\t'openrouter/openrouter/quasar-alpha': { displayName: 'Quasar Alpha', enabled: false },\n\t'openrouter/qwen/qwq-32b': { displayName: 'Qwen: QwQ-32B' },\n\t'openrouter/qwen/qwen-max': { displayName: 'Qwen: Qwen-Max' },\n\t'openrouter/deepseek/deepseek-r1': { displayName: 'DeepSeek: R1 (671B)' },\n\t'openrouter/deepseek/deepseek-chat': { displayName: 'DeepSeek V3' },\n\t'openrouter/meta-llama/llama-3.3-70b-instruct': { displayName: 'Llama 3.3 70B Instruct' },\n\t'openrouter/meta-llama/llama-3.2-90b-vision-instruct': { displayName: 'Llama 3.2 90B Vision model' },\n\t'openrouter/meta-llama/llama-3.2-11b-vision-instruct': { displayName: 'Llama 3.2 11B Vision model' },\n\t'openrouter/mattshumer/reflection-70b': { displayName: 'Reflection 70B' },\n\t'openrouter/meta-llama/llama-3.1-405b-instruct': { displayName: 'Meta: Llama 3.1 405B Instruct' },\n\t'openrouter/meta-llama/llama-3-70b-instruct': { displayName: 'Meta: Llama 3 70B Instruct' },\n\t'openrouter/meta-llama/llama-3-8b-instruct': { displayName: 'Meta: Llama 3 8B Instruct' },\n\t'openrouter/openchat/openchat-7b:free': { displayName: 'Openchat-7b' },\n\t'openrouter/huggingfaceh4/zephyr-7b-beta:free': { displayName: 'HuggingFace: Zephyr 7B' },\n\t'openrouter/openrouter/cinematika-7b:free': { displayName: 'Cinematika 7B' },\n\t'openrouter/mistralai/mistral-7b-instruct:free': { displayName: 'Mistral 7B Instruct' },\n\t'openrouter/nousresearch/nous-capybara-7b:free': { displayName: 'Nous: Capybara 7B' },\n\t'openrouter/google/gemma-7b-it:free': { displayName: 'Google: Gemma 7B' },\n\t'openrouter/mistralai/mixtral-8x7b-instruct': { displayName: 'Mixtral-8x7b-instruct' },\n\t'openrouter/snowflake/snowflake-arctic-instruct': { displayName: 'Snowflake: Arctic Instruct' },\n\t'openrouter/perplexity/sonar-medium-chat': { displayName: 'Perplexity: Sonar 8x7B' },\n\t'openrouter/perplexity/sonar-medium-online': { displayName: 'Perplexity: Sonar 8x7B Online' },\n\t'mistral/devstral-small-2505': { displayName: 'Devstral Small - free' },\n\t'mistral/codestral-latest': { displayName: 'Codestral' },\n\t'mistral/pixtral-large-latest': { displayName: 'Pixtral Large', imageInput: true },\n\t'mistral/pixtral-12b-2409': { displayName: 'Pixtral - free', imageInput: true },\n\t'mistral/mistral-medium-latest': { displayName: 'Mistral Medium 3' },\n\t'mistral/mistral-saba-latest': { displayName: 'Mistral Saba' },\n\t'mistral/ministral-3b-latest': { displayName: 'Ministral 3B' },\n\t'mistral/ministral-8b-latest': { displayName: 'Ministral 8B' },\n\t'mistral/mistral-small-latest': { displayName: 'Mistral Small - latest - free' },\n\t'mistral/mistral-large-2407': { displayName: 'Mistral Large 2' },\n\t'mistral/mistral-large-latest': { displayName: 'Mistral Large' },\n\t'mistral/open-mistral-7b': { displayName: 'Open Mistral 7b' },\n\t'mistral/open-mixtral-8x7b': { displayName: 'Open Mixtral 8x7b' },\n\t'mistral/mistral-tiny': { displayName: 'Mistral Tiny' },\n\t'mistral/mistral-small': { displayName: 'Mistral Small (old)' },\n\t'mistral/mistral-medium': { displayName: 'Mistral Medium' },\n\t'cohere/command-r': { displayName: 'Command-R' },\n\t'cohere/command-r-plus': { displayName: 'Command-R-Plus' },\n\t'cohere/command-light': { displayName: 'Command Light' },\n\t'cohere/c4ai-aya-23': { displayName: 'Aya 23' },\n\t'cloudflare/@cf/deepseek-ai/deepseek-r1-distill-qwen-32b': { displayName: 'deepseek-r1-distill-qwen-32b' },\n\t'cloudflare/@cf/meta/llama-2-7b-chat-fp16': { displayName: 'llama-2-7b-chat' },\n\t'cloudflare/@hf/meta-llama/meta-llama-3-8b-instruct': { displayName: 'llama-3-8b-instruct' },\n\t'cloudflare/@cf/tinyllama/tinyllama-1.1b-chat-v1.0': { displayName: 'tinyllama-1.1b-chat-v1.0' },\n} satisfies Record<string, ModelInfo>;\n\n// Export type for supported model names\nexport type SupportedModelName = keyof typeof supportedModels;\n\n/**\n * Extract provider name from model string (e.g., \"openai/gpt-4\" -> \"openai\")\n */\nexport function getProviderFromModel(model: string): string | null {\n\tconst parts = model.split('/');\n\treturn parts.length > 1 ? parts[0] : null;\n}\n\n/**\n * Get model information\n */\nexport function getModelInfo(model: string): ModelInfo | undefined {\n\treturn supportedModels[model];\n}\n\n/**\n * List all models for a provider\n */\nexport function listModels(provider?: string): string[] {\n\tconst models = Object.keys(supportedModels);\n\tif (!provider) {\n\t\treturn models;\n\t}\n\treturn models.filter((m) => m.startsWith(`${provider}/`));\n}\n\n/**\n * Check if a model exists\n */\nexport function isModelSupported(model: string): boolean {\n\treturn model in supportedModels;\n}\n\n/**\n * Resolves a model name by searching through the supported models list.\n * Supports partial matching on model keys and display names.\n * @param modelInput - The model name to resolve (can be partial or alias)\n * @returns The full model key (provider/model) or original input if no match found\n */\nexport function resolveModel(modelInput: string): string {\n\tif (!modelInput) return modelInput;\n\n\tconst models = supportedModels;\n\tconst searchTerm = modelInput.toLowerCase().trim();\n\n\t// 1. Check if input is already a valid model key (exact match)\n\tif (models[modelInput]) {\n\t\treturn modelInput;\n\t}\n\n\t// 2. Check for exact match (case-insensitive) in model keys\n\tfor (const [key] of Object.entries(models)) {\n\t\tif (key.toLowerCase() === searchTerm) {\n\t\t\treturn key;\n\t\t}\n\t}\n\n\t// 3. Build list of potential matches with scoring\n\tinterface Match {\n\t\tkey: string;\n\t\tscore: number;\n\t}\n\tconst matches: Match[] = [];\n\n\t// Normalize function to remove hyphens, underscores, dots for flexible matching\n\tconst normalize = (str: string) => str.replace(/[-_.]/g, '').toLowerCase();\n\tconst normalizedSearchTerm = normalize(searchTerm);\n\n\tfor (const [key, model] of Object.entries(models)) {\n\t\tif ('enabled' in model && model.enabled === false) continue; // Skip disabled models\n\n\t\tconst keyLower = key.toLowerCase();\n\t\tconst displayNameLower = (model.displayName || '').toLowerCase();\n\t\tconst modelPart = key.split('/').pop()?.toLowerCase() || '';\n\t\tconst normalizedModelPart = normalize(modelPart);\n\t\tconst normalizedDisplayName = normalize(displayNameLower);\n\n\t\tlet score = 0;\n\n\t\t// Exact match in model part (highest priority)\n\t\tif (modelPart === searchTerm || normalizedModelPart === normalizedSearchTerm) {\n\t\t\tscore = 1000;\n\t\t}\n\t\t// Exact match in display name\n\t\telse if (displayNameLower === searchTerm || normalizedDisplayName === normalizedSearchTerm) {\n\t\t\tscore = 900;\n\t\t}\n\t\t// Model part starts with search term\n\t\telse if (modelPart.startsWith(searchTerm) || normalizedModelPart.startsWith(normalizedSearchTerm)) {\n\t\t\tscore = 800;\n\t\t}\n\t\t// Display name starts with search term\n\t\telse if (displayNameLower.startsWith(searchTerm) || normalizedDisplayName.startsWith(normalizedSearchTerm)) {\n\t\t\tscore = 700;\n\t\t}\n\t\t// Model part contains search term\n\t\telse if (modelPart.includes(searchTerm) || normalizedModelPart.includes(normalizedSearchTerm)) {\n\t\t\tscore = 600;\n\t\t}\n\t\t// Display name contains search term\n\t\telse if (displayNameLower.includes(searchTerm) || normalizedDisplayName.includes(normalizedSearchTerm)) {\n\t\t\tscore = 500;\n\t\t}\n\t\t// Full key contains search term\n\t\telse if (keyLower.includes(searchTerm)) {\n\t\t\tscore = 400;\n\t\t}\n\n\t\tif (score > 0) {\n\t\t\tmatches.push({ key, score });\n\t\t}\n\t}\n\n\t// Sort by score (descending) and return the best match\n\tif (matches.length > 0) {\n\t\tmatches.sort((a, b) => b.score - a.score);\n\t\treturn matches[0].key;\n\t}\n\n\t// 4. No match found, return original input\n\treturn modelInput;\n}\n\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ai.libx.js",
3
- "version": "0.2.2",
3
+ "version": "0.2.4",
4
4
  "description": "Unified API bridge for various AI models (LLMs, image/video generation, TTS, STT) - stateless, edge-compatible",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",
package/src/AIClient.ts CHANGED
@@ -2,7 +2,7 @@ import { ChatOptions, ChatResponse, StreamChunk, ProviderConfig } from './types'
2
2
  import { IProviderAdapter } from './types/provider';
3
3
  import { validateChatOptions } from './utils/validation';
4
4
  import { ModelNotFoundError, InvalidRequestError } from './utils/errors';
5
- import { getProviderFromModel, isModelSupported, getModelInfo } from './models';
5
+ import { getProviderFromModel, isModelSupported, getModelInfo, resolveModel } from './models';
6
6
  import { RequestLogger, getRequestLogger } from './utils/request-logger';
7
7
 
8
8
  // Lazy import adapters
@@ -63,39 +63,43 @@ export class AIClient {
63
63
  // Validate options
64
64
  validateChatOptions(options);
65
65
 
66
+ // Resolve model name (supports partial/alias matching)
67
+ const resolvedModel = resolveModel(options.model);
68
+ options.model = resolvedModel;
69
+
66
70
  // Extract provider from model string
67
- const provider = getProviderFromModel(options.model);
71
+ const provider = getProviderFromModel(resolvedModel);
68
72
  if (!provider) {
69
73
  throw new InvalidRequestError(
70
- `Invalid model format: "${options.model}". Expected format: "provider/model-name"`
74
+ `Invalid model format: "${resolvedModel}". Expected format: "provider/model-name"`
71
75
  );
72
76
  }
73
77
 
74
78
  // Check if model is supported
75
- if (!isModelSupported(options.model)) {
76
- throw new ModelNotFoundError(options.model);
79
+ if (!isModelSupported(resolvedModel)) {
80
+ throw new ModelNotFoundError(resolvedModel);
77
81
  }
78
82
 
79
83
  // Check model capabilities and issues
80
- const modelInfo = getModelInfo(options.model);
84
+ const modelInfo = getModelInfo(resolvedModel);
81
85
  if (modelInfo) {
82
86
  // Check if model is enabled
83
87
  if (modelInfo.enabled === false) {
84
88
  throw new InvalidRequestError(
85
- `Model "${options.model}" is disabled and not available for use`
89
+ `Model "${resolvedModel}" is disabled and not available for use`
86
90
  );
87
91
  }
88
92
 
89
93
  // Check if model supports chat
90
94
  if (modelInfo.noChat) {
91
95
  throw new InvalidRequestError(
92
- `Model "${options.model}" does not support chat completions (e.g., realtime/audio models)`
96
+ `Model "${resolvedModel}" does not support chat completions (e.g., realtime/audio models)`
93
97
  );
94
98
  }
95
99
 
96
100
  // Warn about known issues (but don't block)
97
101
  if (modelInfo.knownIssues) {
98
- console.warn(`⚠️ Warning: Model "${options.model}" has known issues: ${modelInfo.knownIssues}`);
102
+ console.warn(`⚠️ Warning: Model "${resolvedModel}" has known issues: ${modelInfo.knownIssues}`);
99
103
  }
100
104
  }
101
105
 
@@ -109,7 +113,7 @@ export class AIClient {
109
113
  };
110
114
 
111
115
  // Start request tracking
112
- const tracker = this.logger.startRequest(provider, options.model);
116
+ const tracker = this.logger.startRequest(provider, resolvedModel);
113
117
 
114
118
  try {
115
119
  // Execute chat
package/src/index.ts CHANGED
@@ -37,6 +37,7 @@ export {
37
37
  getModelInfo,
38
38
  listModels,
39
39
  isModelSupported,
40
+ resolveModel,
40
41
  } from './models';
41
42
 
42
43
  // Export model normalization utilities
package/src/models.ts CHANGED
@@ -66,6 +66,7 @@ export const supportedModels = {
66
66
  'google/models/gemini-1.0-pro-latest': { displayName: 'Gemini 1.0 Pro' },
67
67
  'google/models/gemini-pro-vision': { displayName: 'Gemini 1.0 Pro Vision' },
68
68
  'google/models/chat-bison-001': { displayName: 'PaLM 2 Chat (Legacy)' },
69
+ 'anthropic/claude-haiku-4-5': { displayName: 'Claude Haiku 4.5', url: 'https://api.anthropic.com/v1/messages' },
69
70
  'anthropic/claude-opus-4-1': { displayName: 'Claude Opus 4.1', url: 'https://api.anthropic.com/v1/messages' },
70
71
  'anthropic/claude-opus-4-0': { displayName: 'Claude Opus 4', url: 'https://api.anthropic.com/v1/messages' },
71
72
  'anthropic/claude-sonnet-4-5': { displayName: 'Claude Sonnet 4.5', url: 'https://api.anthropic.com/v1/messages' },
@@ -210,3 +211,93 @@ export function isModelSupported(model: string): boolean {
210
211
  return model in supportedModels;
211
212
  }
212
213
 
214
+ /**
215
+ * Resolves a model name by searching through the supported models list.
216
+ * Supports partial matching on model keys and display names.
217
+ * @param modelInput - The model name to resolve (can be partial or alias)
218
+ * @returns The full model key (provider/model) or original input if no match found
219
+ */
220
+ export function resolveModel(modelInput: string): string {
221
+ if (!modelInput) return modelInput;
222
+
223
+ const models = supportedModels;
224
+ const searchTerm = modelInput.toLowerCase().trim();
225
+
226
+ // 1. Check if input is already a valid model key (exact match)
227
+ if (models[modelInput]) {
228
+ return modelInput;
229
+ }
230
+
231
+ // 2. Check for exact match (case-insensitive) in model keys
232
+ for (const [key] of Object.entries(models)) {
233
+ if (key.toLowerCase() === searchTerm) {
234
+ return key;
235
+ }
236
+ }
237
+
238
+ // 3. Build list of potential matches with scoring
239
+ interface Match {
240
+ key: string;
241
+ score: number;
242
+ }
243
+ const matches: Match[] = [];
244
+
245
+ // Normalize function to remove hyphens, underscores, dots for flexible matching
246
+ const normalize = (str: string) => str.replace(/[-_.]/g, '').toLowerCase();
247
+ const normalizedSearchTerm = normalize(searchTerm);
248
+
249
+ for (const [key, model] of Object.entries(models)) {
250
+ if ('enabled' in model && model.enabled === false) continue; // Skip disabled models
251
+
252
+ const keyLower = key.toLowerCase();
253
+ const displayNameLower = (model.displayName || '').toLowerCase();
254
+ const modelPart = key.split('/').pop()?.toLowerCase() || '';
255
+ const normalizedModelPart = normalize(modelPart);
256
+ const normalizedDisplayName = normalize(displayNameLower);
257
+
258
+ let score = 0;
259
+
260
+ // Exact match in model part (highest priority)
261
+ if (modelPart === searchTerm || normalizedModelPart === normalizedSearchTerm) {
262
+ score = 1000;
263
+ }
264
+ // Exact match in display name
265
+ else if (displayNameLower === searchTerm || normalizedDisplayName === normalizedSearchTerm) {
266
+ score = 900;
267
+ }
268
+ // Model part starts with search term
269
+ else if (modelPart.startsWith(searchTerm) || normalizedModelPart.startsWith(normalizedSearchTerm)) {
270
+ score = 800;
271
+ }
272
+ // Display name starts with search term
273
+ else if (displayNameLower.startsWith(searchTerm) || normalizedDisplayName.startsWith(normalizedSearchTerm)) {
274
+ score = 700;
275
+ }
276
+ // Model part contains search term
277
+ else if (modelPart.includes(searchTerm) || normalizedModelPart.includes(normalizedSearchTerm)) {
278
+ score = 600;
279
+ }
280
+ // Display name contains search term
281
+ else if (displayNameLower.includes(searchTerm) || normalizedDisplayName.includes(normalizedSearchTerm)) {
282
+ score = 500;
283
+ }
284
+ // Full key contains search term
285
+ else if (keyLower.includes(searchTerm)) {
286
+ score = 400;
287
+ }
288
+
289
+ if (score > 0) {
290
+ matches.push({ key, score });
291
+ }
292
+ }
293
+
294
+ // Sort by score (descending) and return the best match
295
+ if (matches.length > 0) {
296
+ matches.sort((a, b) => b.score - a.score);
297
+ return matches[0].key;
298
+ }
299
+
300
+ // 4. No match found, return original input
301
+ return modelInput;
302
+ }
303
+