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 +43 -3
- package/build/AIClient.js +11 -9
- package/build/AIClient.js.map +1 -1
- package/build/index.d.ts +1 -1
- package/build/index.js +2 -1
- package/build/index.js.map +1 -1
- package/build/models.d.ts +5 -0
- package/build/models.js +59 -0
- package/build/models.js.map +1 -1
- package/package.json +1 -1
- package/src/AIClient.ts +14 -10
- package/src/index.ts +1 -0
- package/src/models.ts +91 -0
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
|
|
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: "${
|
|
42
|
+
throw new errors_1.InvalidRequestError(`Invalid model format: "${resolvedModel}". Expected format: "provider/model-name"`);
|
|
41
43
|
}
|
|
42
|
-
if (!(0, models_1.isModelSupported)(
|
|
43
|
-
throw new errors_1.ModelNotFoundError(
|
|
44
|
+
if (!(0, models_1.isModelSupported)(resolvedModel)) {
|
|
45
|
+
throw new errors_1.ModelNotFoundError(resolvedModel);
|
|
44
46
|
}
|
|
45
|
-
const modelInfo = (0, models_1.getModelInfo)(
|
|
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 "${
|
|
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 "${
|
|
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 "${
|
|
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,
|
|
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) {
|
package/build/AIClient.js.map
CHANGED
|
@@ -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":"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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, 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; } });
|
package/build/index.js.map
CHANGED
|
@@ -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,
|
|
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
|
package/build/models.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models.js","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":";;;AAsLA,oDAGC;AAKD,oCAEC;AAKD,gCAMC;AAKD,4CAEC;AA/MY,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,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","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":"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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-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
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(
|
|
71
|
+
const provider = getProviderFromModel(resolvedModel);
|
|
68
72
|
if (!provider) {
|
|
69
73
|
throw new InvalidRequestError(
|
|
70
|
-
`Invalid model format: "${
|
|
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(
|
|
76
|
-
throw new ModelNotFoundError(
|
|
79
|
+
if (!isModelSupported(resolvedModel)) {
|
|
80
|
+
throw new ModelNotFoundError(resolvedModel);
|
|
77
81
|
}
|
|
78
82
|
|
|
79
83
|
// Check model capabilities and issues
|
|
80
|
-
const modelInfo = getModelInfo(
|
|
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 "${
|
|
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 "${
|
|
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 "${
|
|
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,
|
|
116
|
+
const tracker = this.logger.startRequest(provider, resolvedModel);
|
|
113
117
|
|
|
114
118
|
try {
|
|
115
119
|
// Execute chat
|
package/src/index.ts
CHANGED
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
|
+
|