@sudobility/shapeshyft_engine 1.0.0

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.
Files changed (83) hide show
  1. package/CLAUDE.md +27 -0
  2. package/README.md +11 -0
  3. package/dist/config/providers.d.ts +111 -0
  4. package/dist/config/providers.d.ts.map +1 -0
  5. package/dist/config/providers.js +1535 -0
  6. package/dist/config/providers.js.map +1 -0
  7. package/dist/index.d.ts +27 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +27 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/lib/api-helper.d.ts +35 -0
  12. package/dist/lib/api-helper.d.ts.map +1 -0
  13. package/dist/lib/api-helper.js +123 -0
  14. package/dist/lib/api-helper.js.map +1 -0
  15. package/dist/lib/capability-validator.d.ts +36 -0
  16. package/dist/lib/capability-validator.d.ts.map +1 -0
  17. package/dist/lib/capability-validator.js +140 -0
  18. package/dist/lib/capability-validator.js.map +1 -0
  19. package/dist/lib/media-constants.d.ts +55 -0
  20. package/dist/lib/media-constants.d.ts.map +1 -0
  21. package/dist/lib/media-constants.js +166 -0
  22. package/dist/lib/media-constants.js.map +1 -0
  23. package/dist/lib/media-conversion.d.ts +36 -0
  24. package/dist/lib/media-conversion.d.ts.map +1 -0
  25. package/dist/lib/media-conversion.js +87 -0
  26. package/dist/lib/media-conversion.js.map +1 -0
  27. package/dist/lib/media-utils.d.ts +35 -0
  28. package/dist/lib/media-utils.d.ts.map +1 -0
  29. package/dist/lib/media-utils.js +173 -0
  30. package/dist/lib/media-utils.js.map +1 -0
  31. package/dist/lib/output-limit.d.ts +38 -0
  32. package/dist/lib/output-limit.d.ts.map +1 -0
  33. package/dist/lib/output-limit.js +54 -0
  34. package/dist/lib/output-limit.js.map +1 -0
  35. package/dist/lib/prompt-builder.d.ts +94 -0
  36. package/dist/lib/prompt-builder.d.ts.map +1 -0
  37. package/dist/lib/prompt-builder.js +408 -0
  38. package/dist/lib/prompt-builder.js.map +1 -0
  39. package/dist/lib/reserved-fields.d.ts +41 -0
  40. package/dist/lib/reserved-fields.d.ts.map +1 -0
  41. package/dist/lib/reserved-fields.js +47 -0
  42. package/dist/lib/reserved-fields.js.map +1 -0
  43. package/dist/services/llm/anthropic.d.ts +16 -0
  44. package/dist/services/llm/anthropic.d.ts.map +1 -0
  45. package/dist/services/llm/anthropic.js +154 -0
  46. package/dist/services/llm/anthropic.js.map +1 -0
  47. package/dist/services/llm/custom.d.ts +51 -0
  48. package/dist/services/llm/custom.d.ts.map +1 -0
  49. package/dist/services/llm/custom.js +419 -0
  50. package/dist/services/llm/custom.js.map +1 -0
  51. package/dist/services/llm/extract-json.d.ts +17 -0
  52. package/dist/services/llm/extract-json.d.ts.map +1 -0
  53. package/dist/services/llm/extract-json.js +60 -0
  54. package/dist/services/llm/extract-json.js.map +1 -0
  55. package/dist/services/llm/finish-reason.d.ts +21 -0
  56. package/dist/services/llm/finish-reason.d.ts.map +1 -0
  57. package/dist/services/llm/finish-reason.js +55 -0
  58. package/dist/services/llm/finish-reason.js.map +1 -0
  59. package/dist/services/llm/gemini.d.ts +26 -0
  60. package/dist/services/llm/gemini.d.ts.map +1 -0
  61. package/dist/services/llm/gemini.js +178 -0
  62. package/dist/services/llm/gemini.js.map +1 -0
  63. package/dist/services/llm/groq.d.ts +28 -0
  64. package/dist/services/llm/groq.d.ts.map +1 -0
  65. package/dist/services/llm/groq.js +237 -0
  66. package/dist/services/llm/groq.js.map +1 -0
  67. package/dist/services/llm/index.d.ts +19 -0
  68. package/dist/services/llm/index.d.ts.map +1 -0
  69. package/dist/services/llm/index.js +88 -0
  70. package/dist/services/llm/index.js.map +1 -0
  71. package/dist/services/llm/openai.d.ts +101 -0
  72. package/dist/services/llm/openai.d.ts.map +1 -0
  73. package/dist/services/llm/openai.js +561 -0
  74. package/dist/services/llm/openai.js.map +1 -0
  75. package/dist/services/llm/types.d.ts +110 -0
  76. package/dist/services/llm/types.d.ts.map +1 -0
  77. package/dist/services/llm/types.js +16 -0
  78. package/dist/services/llm/types.js.map +1 -0
  79. package/dist/types/index.d.ts +812 -0
  80. package/dist/types/index.d.ts.map +1 -0
  81. package/dist/types/index.js +366 -0
  82. package/dist/types/index.js.map +1 -0
  83. package/package.json +93 -0
@@ -0,0 +1,1535 @@
1
+ /**
2
+ * LLM Provider and Model Configuration
3
+ *
4
+ * This configuration is served via API endpoints so it can be updated
5
+ * without requiring frontend package updates.
6
+ *
7
+ * ## Supported Providers
8
+ *
9
+ * Catalog verified against provider documentation on 2026-08-18.
10
+ *
11
+ * - **openai**: GPT-5.6 (Sol/Terra/Luna), GPT-5.5, GPT-5.4, GPT-5, GPT-4.1, GPT-4o
12
+ * - **anthropic**: Claude Fable 5, Opus 5, Sonnet 5, Haiku 4.5 (+ Opus 4.8/4.7/4.6, Sonnet 4.6)
13
+ * - **gemini**: Gemini 3.7/3.6/3.5/3.1 and 2.5, Nano Banana image models, Veo 3.1 video
14
+ * - **mistral**: Mistral Large 3, Medium 3.5, Small 4, Ministral 3, Codestral, OCR
15
+ * - **cohere**: Command A+, Command A (reasoning/vision/translate), Command R
16
+ * - **groq**: GPT-OSS, Qwen3.6, MiniMax M2.7, Compound, Whisper
17
+ * - **xai**: Grok 4.6, 4.5, 4.3, Grok 4.20 variants, Grok Build
18
+ * - **deepseek**: DeepSeek V4 Pro and V4 Flash
19
+ * - **perplexity**: Sonar models with live web search grounding
20
+ * - **lm_studio**: Local LLM server (LM Studio or any OpenAI-compatible endpoint)
21
+ *
22
+ * ## Keeping this current
23
+ *
24
+ * Model lineups turn over every few weeks and retired IDs fail at the provider,
25
+ * not here -- `MODEL_CAPABILITIES` and `MODEL_PRICING` fall back to permissive
26
+ * defaults for anything unknown, so a stale entry surfaces as a runtime error in
27
+ * a user's endpoint. When updating, work from each provider's own model and
28
+ * pricing pages (linked above each section below), and check the provider's
29
+ * deprecation page for retirements: Groq retired `llama-3.3-70b-versatile` and
30
+ * `llama-3.1-8b-instant` on 2026-08-16, and both were listed here until then.
31
+ *
32
+ * Pricing is in **cents per 1M tokens** (image per image, audio/video per minute).
33
+ *
34
+ * ## LM Studio Model Identifiers
35
+ *
36
+ * LM Studio uses the OpenAI-compatible API format. When specifying models:
37
+ *
38
+ * - **API requests** use just the model name (e.g., `"qwen2.5-vl-7b-instruct"`)
39
+ * - **Downloading models** uses publisher/name format (e.g., `lmstudio-community/Qwen2.5-VL-7B-Instruct-GGUF`)
40
+ *
41
+ * The model identifier in API requests matches what's returned by `GET /v1/models`.
42
+ * Example response:
43
+ * ```json
44
+ * { "id": "qwen2.5-vl-7b-instruct", "object": "model" }
45
+ * ```
46
+ *
47
+ * To discover available models on a running LM Studio server:
48
+ * ```bash
49
+ * curl http://localhost:1234/v1/models
50
+ * ```
51
+ *
52
+ * For multi-variant models, you can specify quantization with `@`:
53
+ * ```
54
+ * google/gemma-3-12b@q3_k_l
55
+ * google/gemma-3-12b@4bit
56
+ * ```
57
+ *
58
+ * ## Vision Models
59
+ *
60
+ * Vision-capable models can process images in addition to text:
61
+ * - Qwen2.5-VL series: Excellent object recognition, 128k context window
62
+ * - Gemma 3 series: Google's multimodal models
63
+ * - GLM-4V: Optimized for local deployment
64
+ * - Pixtral: Mistral's vision model
65
+ * - olmOCR: Specialized for OCR tasks
66
+ * - Janus-Pro: Visual QA and scene interpretation
67
+ *
68
+ * Note: Vision models are not optimal for text-only tasks. For text-only
69
+ * workloads, use dedicated text models like Qwen3 or Mistral.
70
+ *
71
+ * @see https://lmstudio.ai/docs/developer/openai-compat
72
+ * @see https://lmstudio.ai/docs/developer/openai-compat/models
73
+ */
74
+ // =============================================================================
75
+ // Provider Configuration
76
+ // =============================================================================
77
+ export const PROVIDERS = [
78
+ {
79
+ id: "openai",
80
+ name: "OpenAI",
81
+ description: "GPT-5.6 (Sol, Terra, Luna), GPT-5.5, GPT-5.4, GPT-4.1 models",
82
+ allowsCustomModel: false,
83
+ defaultModel: "gpt-5.6-terra",
84
+ requiresEndpointUrl: false,
85
+ },
86
+ {
87
+ id: "anthropic",
88
+ name: "Anthropic",
89
+ description: "Claude Fable 5, Opus 5, Sonnet 5, Haiku 4.5 models",
90
+ allowsCustomModel: false,
91
+ defaultModel: "claude-sonnet-5",
92
+ requiresEndpointUrl: false,
93
+ },
94
+ {
95
+ id: "gemini",
96
+ name: "Google Gemini",
97
+ description: "Gemini 3.7, 3.6, 3.5, 3.1 and 2.5 models, plus Nano Banana image models",
98
+ allowsCustomModel: false,
99
+ defaultModel: "gemini-3.7-flash",
100
+ requiresEndpointUrl: false,
101
+ },
102
+ {
103
+ id: "mistral",
104
+ name: "Mistral AI",
105
+ description: "Mistral Large 3, Medium 3.5, Small 4, Ministral 3, Codestral models",
106
+ allowsCustomModel: false,
107
+ defaultModel: "mistral-medium-latest",
108
+ requiresEndpointUrl: false,
109
+ },
110
+ {
111
+ id: "cohere",
112
+ name: "Cohere",
113
+ description: "Command A+, Command A, Command R models",
114
+ allowsCustomModel: false,
115
+ defaultModel: "command-a-plus-05-2026",
116
+ requiresEndpointUrl: false,
117
+ },
118
+ {
119
+ id: "groq",
120
+ name: "Groq",
121
+ description: "Fast inference with GPT-OSS, Qwen, MiniMax, Compound, and Whisper",
122
+ allowsCustomModel: false,
123
+ defaultModel: "openai/gpt-oss-120b",
124
+ requiresEndpointUrl: false,
125
+ },
126
+ {
127
+ id: "xai",
128
+ name: "xAI",
129
+ description: "Grok 4.6, 4.5, 4.3 and Grok Build models",
130
+ allowsCustomModel: false,
131
+ defaultModel: "grok-4.6",
132
+ requiresEndpointUrl: false,
133
+ },
134
+ {
135
+ id: "deepseek",
136
+ name: "DeepSeek",
137
+ description: "DeepSeek V4 Pro and V4 Flash models",
138
+ allowsCustomModel: false,
139
+ defaultModel: "deepseek-v4-flash",
140
+ requiresEndpointUrl: false,
141
+ },
142
+ {
143
+ id: "perplexity",
144
+ name: "Perplexity",
145
+ description: "Sonar models with live web search grounding",
146
+ allowsCustomModel: false,
147
+ defaultModel: "sonar",
148
+ requiresEndpointUrl: false,
149
+ },
150
+ {
151
+ id: "lm_studio",
152
+ name: "LM Studio / Custom",
153
+ description: "Local LLM server or custom OpenAI-compatible endpoint",
154
+ allowsCustomModel: true,
155
+ defaultModel: "qwen3-8b",
156
+ requiresEndpointUrl: true,
157
+ },
158
+ ];
159
+ // =============================================================================
160
+ // Models per Provider
161
+ // =============================================================================
162
+ export const PROVIDER_MODELS = {
163
+ openai: [
164
+ // GPT-5.6 family (July 2026) - 1.05M context
165
+ "gpt-5.6-sol",
166
+ "gpt-5.6-terra",
167
+ "gpt-5.6-luna",
168
+ // GPT-5.5 / 5.4
169
+ "gpt-5.5",
170
+ "gpt-5.4",
171
+ "gpt-5.4-mini",
172
+ "gpt-5.4-nano",
173
+ // GPT-5
174
+ "gpt-5",
175
+ "gpt-5-mini",
176
+ "gpt-5-nano",
177
+ // GPT-4 family
178
+ "gpt-4.1",
179
+ "gpt-4.1-mini",
180
+ "gpt-4.1-nano",
181
+ "gpt-4o",
182
+ "gpt-4o-mini",
183
+ ],
184
+ anthropic: [
185
+ // Current generation
186
+ "claude-fable-5",
187
+ "claude-opus-5",
188
+ "claude-sonnet-5",
189
+ "claude-haiku-4-5",
190
+ // Still available, superseded
191
+ "claude-opus-4-8",
192
+ "claude-opus-4-7",
193
+ "claude-opus-4-6",
194
+ "claude-sonnet-4-6",
195
+ "claude-opus-4-5-20251101",
196
+ "claude-sonnet-4-5-20250929",
197
+ ],
198
+ gemini: [
199
+ // Gemini 3 series (stable)
200
+ "gemini-3.7-flash",
201
+ "gemini-3.6-flash",
202
+ "gemini-3.5-flash",
203
+ "gemini-3.5-flash-lite",
204
+ "gemini-3.1-flash-lite",
205
+ // Preview
206
+ "gemini-3.1-pro-preview",
207
+ "gemini-3-flash-preview",
208
+ // Image generation (Nano Banana)
209
+ "gemini-3.1-flash-image",
210
+ "gemini-3.1-flash-lite-image",
211
+ "gemini-3-pro-image",
212
+ // Gemini 2.5 series
213
+ "gemini-2.5-pro",
214
+ "gemini-2.5-flash",
215
+ "gemini-2.5-flash-lite",
216
+ "gemini-2.5-flash-image",
217
+ "gemini-2.5-flash-native-audio-preview-12-2025",
218
+ // Video generation
219
+ "veo-3.1-generate-preview",
220
+ "veo-3.1-lite-generate-preview",
221
+ ],
222
+ mistral: [
223
+ "mistral-large-latest",
224
+ "mistral-large-2512",
225
+ "mistral-medium-latest",
226
+ "mistral-small-latest",
227
+ "mistral-small-2603",
228
+ "ministral-14b-2512",
229
+ "ministral-8b-2512",
230
+ "ministral-3b-2512",
231
+ "codestral-latest",
232
+ "codestral-2508",
233
+ "mistral-ocr-latest",
234
+ ],
235
+ cohere: [
236
+ "command-a-plus-05-2026",
237
+ "command-a-03-2025",
238
+ "command-a-reasoning-08-2025",
239
+ "command-a-vision-07-2025",
240
+ "command-a-translate-08-2025",
241
+ "command-r7b-12-2024",
242
+ "command-r-plus-08-2024",
243
+ "command-r-08-2024",
244
+ ],
245
+ groq: [
246
+ "openai/gpt-oss-120b",
247
+ "openai/gpt-oss-20b",
248
+ "qwen/qwen3.6-27b",
249
+ "minimaxai/minimax-m2.7",
250
+ "groq/compound",
251
+ "groq/compound-mini",
252
+ // Audio transcription (two-stage pipeline with transcription_extraction_model)
253
+ "whisper-large-v3",
254
+ "whisper-large-v3-turbo",
255
+ ],
256
+ xai: [
257
+ "grok-4.6",
258
+ "grok-4.5",
259
+ "grok-4.3",
260
+ "grok-4.20-0309-reasoning",
261
+ "grok-4.20-0309-non-reasoning",
262
+ "grok-4.20-multi-agent-0309",
263
+ "grok-build-0.1",
264
+ ],
265
+ deepseek: ["deepseek-v4-pro", "deepseek-v4-flash"],
266
+ perplexity: [
267
+ "sonar",
268
+ "sonar-pro",
269
+ "sonar-pro-search",
270
+ "sonar-reasoning-pro",
271
+ "sonar-deep-research",
272
+ ],
273
+ /**
274
+ * LM Studio Model Identifiers
275
+ *
276
+ * IMPORTANT: LM Studio API uses just the model name as the identifier, NOT the
277
+ * full publisher/model path used for downloading models.
278
+ *
279
+ * - Download format: `lmstudio-community/Qwen2.5-VL-7B-Instruct-GGUF`
280
+ * - API request format: `qwen2.5-vl-7b-instruct`
281
+ *
282
+ * These identifiers match what's returned by `GET /v1/models` on your LM Studio server.
283
+ * If you have different models loaded, you can use `allowsCustomModel: true` to enter
284
+ * any model name, or query your server directly: `curl http://localhost:1234/v1/models`
285
+ *
286
+ * Multi-model loading: LM Studio supports loading multiple models simultaneously
287
+ * (since v0.2.17). You can have both text and vision models loaded at once.
288
+ */
289
+ lm_studio: [
290
+ // -------------------------------------------------------------------------
291
+ // Text Models - Use for text-only tasks (faster, lower memory)
292
+ // -------------------------------------------------------------------------
293
+ "qwen3-8b", // Qwen3 8B - excellent general purpose
294
+ "qwen3-14b", // Qwen3 14B - better reasoning
295
+ "qwen3-30b-a3b", // Qwen3 30B MoE (3B active) - efficiency sweet spot
296
+ "qwen2.5-coder-14b-instruct", // Code-specialized
297
+ "mistral-7b-instruct-v0.3", // Fast, good for simple tasks
298
+ "deepseek-r1-distill-qwen-7b", // Reasoning-focused
299
+ // -------------------------------------------------------------------------
300
+ // Vision Models - Process images + text (higher memory, slower)
301
+ // -------------------------------------------------------------------------
302
+ // Google Gemma 3 - state-of-the-art multimodal from Google
303
+ "gemma-3-4b-it", // Lightweight vision
304
+ "gemma-3-12b-it", // Balanced
305
+ "gemma-3-27b-it", // Best quality
306
+ // Qwen2.5-VL - excellent object recognition, 128k context window
307
+ "qwen2.5-vl-3b-instruct", // Lightweight
308
+ "qwen2.5-vl-7b-instruct", // Recommended for most use cases
309
+ "qwen2.5-vl-32b-instruct", // High quality
310
+ "qwen2.5-vl-72b-instruct", // Best quality (requires significant VRAM)
311
+ // Other vision models
312
+ "glm-4v-9b", // GLM-4V - optimized for local deployment
313
+ "pixtral-12b-2409", // Mistral's vision model
314
+ "olmocr-2-7b-1025", // olmOCR 2 - specialized for OCR (Oct 2025)
315
+ "janus-pro-7b", // DeepSeek Janus-Pro - visual QA, scene interpretation
316
+ ],
317
+ };
318
+ // =============================================================================
319
+ // Model Capabilities
320
+ // =============================================================================
321
+ export const MODEL_CAPABILITIES = {
322
+ // OpenAI — https://developers.openai.com/api/docs/models
323
+ "gpt-5.6-sol": {
324
+ visionInput: true,
325
+ audioInput: false,
326
+ videoInput: false,
327
+ imageOutput: false,
328
+ audioOutput: false,
329
+ videoOutput: false,
330
+ webSearch: true,
331
+ mediaFormats: { imageFormats: ["url", "base64"] },
332
+ },
333
+ "gpt-5.6-terra": {
334
+ visionInput: true,
335
+ audioInput: false,
336
+ videoInput: false,
337
+ imageOutput: false,
338
+ audioOutput: false,
339
+ videoOutput: false,
340
+ webSearch: true,
341
+ mediaFormats: { imageFormats: ["url", "base64"] },
342
+ },
343
+ "gpt-5.6-luna": {
344
+ visionInput: true,
345
+ audioInput: false,
346
+ videoInput: false,
347
+ imageOutput: false,
348
+ audioOutput: false,
349
+ videoOutput: false,
350
+ webSearch: true,
351
+ mediaFormats: { imageFormats: ["url", "base64"] },
352
+ },
353
+ "gpt-5.5": {
354
+ visionInput: true,
355
+ audioInput: false,
356
+ videoInput: false,
357
+ imageOutput: false,
358
+ audioOutput: false,
359
+ videoOutput: false,
360
+ webSearch: true,
361
+ mediaFormats: { imageFormats: ["url", "base64"] },
362
+ },
363
+ "gpt-5.4": {
364
+ visionInput: true,
365
+ audioInput: false,
366
+ videoInput: false,
367
+ imageOutput: false,
368
+ audioOutput: false,
369
+ videoOutput: false,
370
+ webSearch: true,
371
+ mediaFormats: { imageFormats: ["url", "base64"] },
372
+ },
373
+ "gpt-5.4-mini": {
374
+ visionInput: true,
375
+ audioInput: false,
376
+ videoInput: false,
377
+ imageOutput: false,
378
+ audioOutput: false,
379
+ videoOutput: false,
380
+ webSearch: true,
381
+ mediaFormats: { imageFormats: ["url", "base64"] },
382
+ },
383
+ "gpt-5.4-nano": {
384
+ visionInput: true,
385
+ audioInput: false,
386
+ videoInput: false,
387
+ imageOutput: false,
388
+ audioOutput: false,
389
+ videoOutput: false,
390
+ mediaFormats: { imageFormats: ["url", "base64"] },
391
+ },
392
+ "gpt-5": {
393
+ visionInput: true,
394
+ audioInput: false,
395
+ videoInput: false,
396
+ imageOutput: false,
397
+ audioOutput: false,
398
+ videoOutput: false,
399
+ webSearch: true,
400
+ mediaFormats: { imageFormats: ["url", "base64"] },
401
+ },
402
+ "gpt-5-mini": {
403
+ visionInput: true,
404
+ audioInput: false,
405
+ videoInput: false,
406
+ imageOutput: false,
407
+ audioOutput: false,
408
+ videoOutput: false,
409
+ webSearch: true,
410
+ mediaFormats: { imageFormats: ["url", "base64"] },
411
+ },
412
+ "gpt-5-nano": {
413
+ visionInput: true,
414
+ audioInput: false,
415
+ videoInput: false,
416
+ imageOutput: false,
417
+ audioOutput: false,
418
+ videoOutput: false,
419
+ mediaFormats: { imageFormats: ["url", "base64"] },
420
+ },
421
+ "gpt-4.1": {
422
+ visionInput: true,
423
+ audioInput: false,
424
+ videoInput: false,
425
+ imageOutput: false,
426
+ audioOutput: false,
427
+ videoOutput: false,
428
+ webSearch: true,
429
+ mediaFormats: { imageFormats: ["url", "base64"] },
430
+ },
431
+ "gpt-4.1-mini": {
432
+ visionInput: true,
433
+ audioInput: false,
434
+ videoInput: false,
435
+ imageOutput: false,
436
+ audioOutput: false,
437
+ videoOutput: false,
438
+ mediaFormats: { imageFormats: ["url", "base64"] },
439
+ },
440
+ "gpt-4.1-nano": {
441
+ visionInput: true,
442
+ audioInput: false,
443
+ videoInput: false,
444
+ imageOutput: false,
445
+ audioOutput: false,
446
+ videoOutput: false,
447
+ mediaFormats: { imageFormats: ["url", "base64"] },
448
+ },
449
+ "gpt-4o": {
450
+ visionInput: true,
451
+ audioInput: false,
452
+ videoInput: false,
453
+ imageOutput: false,
454
+ audioOutput: false,
455
+ videoOutput: false,
456
+ webSearch: true,
457
+ mediaFormats: { imageFormats: ["url", "base64"] },
458
+ },
459
+ "gpt-4o-mini": {
460
+ visionInput: true,
461
+ audioInput: false,
462
+ videoInput: false,
463
+ imageOutput: false,
464
+ audioOutput: false,
465
+ videoOutput: false,
466
+ mediaFormats: { imageFormats: ["url", "base64"] },
467
+ },
468
+ // Anthropic — https://platform.claude.com/docs/en/about-claude/models/overview
469
+ "claude-fable-5": {
470
+ visionInput: true,
471
+ audioInput: false,
472
+ videoInput: false,
473
+ imageOutput: false,
474
+ audioOutput: false,
475
+ videoOutput: false,
476
+ mediaFormats: { imageFormats: ["url", "base64"] },
477
+ },
478
+ "claude-opus-5": {
479
+ visionInput: true,
480
+ audioInput: false,
481
+ videoInput: false,
482
+ imageOutput: false,
483
+ audioOutput: false,
484
+ videoOutput: false,
485
+ mediaFormats: { imageFormats: ["url", "base64"] },
486
+ },
487
+ "claude-sonnet-5": {
488
+ visionInput: true,
489
+ audioInput: false,
490
+ videoInput: false,
491
+ imageOutput: false,
492
+ audioOutput: false,
493
+ videoOutput: false,
494
+ mediaFormats: { imageFormats: ["url", "base64"] },
495
+ },
496
+ "claude-haiku-4-5": {
497
+ visionInput: true,
498
+ audioInput: false,
499
+ videoInput: false,
500
+ imageOutput: false,
501
+ audioOutput: false,
502
+ videoOutput: false,
503
+ mediaFormats: { imageFormats: ["url", "base64"] },
504
+ },
505
+ "claude-opus-4-8": {
506
+ visionInput: true,
507
+ audioInput: false,
508
+ videoInput: false,
509
+ imageOutput: false,
510
+ audioOutput: false,
511
+ videoOutput: false,
512
+ mediaFormats: { imageFormats: ["url", "base64"] },
513
+ },
514
+ "claude-opus-4-7": {
515
+ visionInput: true,
516
+ audioInput: false,
517
+ videoInput: false,
518
+ imageOutput: false,
519
+ audioOutput: false,
520
+ videoOutput: false,
521
+ mediaFormats: { imageFormats: ["url", "base64"] },
522
+ },
523
+ "claude-opus-4-6": {
524
+ visionInput: true,
525
+ audioInput: false,
526
+ videoInput: false,
527
+ imageOutput: false,
528
+ audioOutput: false,
529
+ videoOutput: false,
530
+ mediaFormats: { imageFormats: ["url", "base64"] },
531
+ },
532
+ "claude-sonnet-4-6": {
533
+ visionInput: true,
534
+ audioInput: false,
535
+ videoInput: false,
536
+ imageOutput: false,
537
+ audioOutput: false,
538
+ videoOutput: false,
539
+ mediaFormats: { imageFormats: ["url", "base64"] },
540
+ },
541
+ "claude-opus-4-5-20251101": {
542
+ visionInput: true,
543
+ audioInput: false,
544
+ videoInput: false,
545
+ imageOutput: false,
546
+ audioOutput: false,
547
+ videoOutput: false,
548
+ mediaFormats: { imageFormats: ["url", "base64"] },
549
+ },
550
+ "claude-sonnet-4-5-20250929": {
551
+ visionInput: true,
552
+ audioInput: false,
553
+ videoInput: false,
554
+ imageOutput: false,
555
+ audioOutput: false,
556
+ videoOutput: false,
557
+ mediaFormats: { imageFormats: ["url", "base64"] },
558
+ },
559
+ // Google Gemini — https://ai.google.dev/gemini-api/docs/models
560
+ "gemini-3.7-flash": {
561
+ visionInput: true,
562
+ audioInput: true,
563
+ videoInput: true,
564
+ imageOutput: false,
565
+ audioOutput: false,
566
+ videoOutput: false,
567
+ webSearch: true,
568
+ mediaFormats: {
569
+ imageFormats: ["url", "base64", "gcs"],
570
+ audioFormats: ["url", "base64", "gcs"],
571
+ videoFormats: ["url", "base64", "gcs"],
572
+ },
573
+ },
574
+ "gemini-3.6-flash": {
575
+ visionInput: true,
576
+ audioInput: true,
577
+ videoInput: true,
578
+ imageOutput: false,
579
+ audioOutput: false,
580
+ videoOutput: false,
581
+ webSearch: true,
582
+ mediaFormats: {
583
+ imageFormats: ["url", "base64", "gcs"],
584
+ audioFormats: ["url", "base64", "gcs"],
585
+ videoFormats: ["url", "base64", "gcs"],
586
+ },
587
+ },
588
+ "gemini-3.5-flash": {
589
+ visionInput: true,
590
+ audioInput: true,
591
+ videoInput: true,
592
+ imageOutput: false,
593
+ audioOutput: false,
594
+ videoOutput: false,
595
+ webSearch: true,
596
+ mediaFormats: {
597
+ imageFormats: ["url", "base64", "gcs"],
598
+ audioFormats: ["url", "base64", "gcs"],
599
+ videoFormats: ["url", "base64", "gcs"],
600
+ },
601
+ },
602
+ "gemini-3.5-flash-lite": {
603
+ visionInput: true,
604
+ audioInput: true,
605
+ videoInput: true,
606
+ imageOutput: false,
607
+ audioOutput: false,
608
+ videoOutput: false,
609
+ mediaFormats: {
610
+ imageFormats: ["url", "base64", "gcs"],
611
+ audioFormats: ["url", "base64", "gcs"],
612
+ videoFormats: ["url", "base64", "gcs"],
613
+ },
614
+ },
615
+ "gemini-3.1-flash-lite": {
616
+ visionInput: true,
617
+ audioInput: true,
618
+ videoInput: true,
619
+ imageOutput: false,
620
+ audioOutput: false,
621
+ videoOutput: false,
622
+ mediaFormats: {
623
+ imageFormats: ["url", "base64", "gcs"],
624
+ audioFormats: ["url", "base64", "gcs"],
625
+ videoFormats: ["url", "base64", "gcs"],
626
+ },
627
+ },
628
+ "gemini-3.1-pro-preview": {
629
+ visionInput: true,
630
+ audioInput: true,
631
+ videoInput: true,
632
+ imageOutput: false,
633
+ audioOutput: false,
634
+ videoOutput: false,
635
+ webSearch: true,
636
+ mediaFormats: {
637
+ imageFormats: ["url", "base64", "gcs"],
638
+ audioFormats: ["url", "base64", "gcs"],
639
+ videoFormats: ["url", "base64", "gcs"],
640
+ },
641
+ },
642
+ "gemini-3-flash-preview": {
643
+ visionInput: true,
644
+ audioInput: true,
645
+ videoInput: true,
646
+ imageOutput: false,
647
+ audioOutput: false,
648
+ videoOutput: false,
649
+ mediaFormats: {
650
+ imageFormats: ["url", "base64", "gcs"],
651
+ audioFormats: ["url", "base64", "gcs"],
652
+ videoFormats: ["url", "base64", "gcs"],
653
+ },
654
+ },
655
+ "gemini-3.1-flash-image": {
656
+ visionInput: true,
657
+ audioInput: false,
658
+ videoInput: false,
659
+ imageOutput: true,
660
+ audioOutput: false,
661
+ videoOutput: false,
662
+ mediaFormats: { imageFormats: ["url", "base64", "gcs"] },
663
+ },
664
+ "gemini-3.1-flash-lite-image": {
665
+ visionInput: true,
666
+ audioInput: false,
667
+ videoInput: false,
668
+ imageOutput: true,
669
+ audioOutput: false,
670
+ videoOutput: false,
671
+ mediaFormats: { imageFormats: ["url", "base64", "gcs"] },
672
+ },
673
+ "gemini-3-pro-image": {
674
+ visionInput: true,
675
+ audioInput: false,
676
+ videoInput: false,
677
+ imageOutput: true,
678
+ audioOutput: false,
679
+ videoOutput: false,
680
+ mediaFormats: { imageFormats: ["url", "base64", "gcs"] },
681
+ },
682
+ "gemini-2.5-pro": {
683
+ visionInput: true,
684
+ audioInput: true,
685
+ videoInput: true,
686
+ imageOutput: false,
687
+ audioOutput: false,
688
+ videoOutput: false,
689
+ mediaFormats: {
690
+ imageFormats: ["url", "base64", "gcs"],
691
+ audioFormats: ["url", "base64", "gcs"],
692
+ videoFormats: ["url", "base64", "gcs"],
693
+ },
694
+ },
695
+ "gemini-2.5-flash": {
696
+ visionInput: true,
697
+ audioInput: true,
698
+ videoInput: true,
699
+ imageOutput: false,
700
+ audioOutput: false,
701
+ videoOutput: false,
702
+ mediaFormats: {
703
+ imageFormats: ["url", "base64", "gcs"],
704
+ audioFormats: ["url", "base64", "gcs"],
705
+ videoFormats: ["url", "base64", "gcs"],
706
+ },
707
+ },
708
+ "gemini-2.5-flash-lite": {
709
+ visionInput: true,
710
+ audioInput: true,
711
+ videoInput: true,
712
+ imageOutput: false,
713
+ audioOutput: false,
714
+ videoOutput: false,
715
+ mediaFormats: {
716
+ imageFormats: ["url", "base64", "gcs"],
717
+ audioFormats: ["url", "base64", "gcs"],
718
+ videoFormats: ["url", "base64", "gcs"],
719
+ },
720
+ },
721
+ "gemini-2.5-flash-image": {
722
+ visionInput: true,
723
+ audioInput: false,
724
+ videoInput: false,
725
+ imageOutput: true,
726
+ audioOutput: false,
727
+ videoOutput: false,
728
+ mediaFormats: { imageFormats: ["url", "base64", "gcs"] },
729
+ },
730
+ "gemini-2.5-flash-native-audio-preview-12-2025": {
731
+ visionInput: true,
732
+ audioInput: true,
733
+ videoInput: false,
734
+ imageOutput: false,
735
+ audioOutput: true,
736
+ videoOutput: false,
737
+ mediaFormats: {
738
+ imageFormats: ["url", "base64", "gcs"],
739
+ audioFormats: ["url", "base64", "gcs"],
740
+ },
741
+ },
742
+ "veo-3.1-generate-preview": {
743
+ visionInput: true,
744
+ audioInput: false,
745
+ videoInput: false,
746
+ imageOutput: false,
747
+ audioOutput: false,
748
+ videoOutput: true,
749
+ mediaFormats: { imageFormats: ["url", "base64", "gcs"] },
750
+ },
751
+ "veo-3.1-lite-generate-preview": {
752
+ visionInput: true,
753
+ audioInput: false,
754
+ videoInput: false,
755
+ imageOutput: false,
756
+ audioOutput: false,
757
+ videoOutput: true,
758
+ mediaFormats: { imageFormats: ["url", "base64", "gcs"] },
759
+ },
760
+ // Mistral — https://docs.mistral.ai/getting-started/models/models_overview/
761
+ "mistral-large-latest": {
762
+ visionInput: true,
763
+ audioInput: false,
764
+ videoInput: false,
765
+ imageOutput: false,
766
+ audioOutput: false,
767
+ videoOutput: false,
768
+ mediaFormats: { imageFormats: ["url", "base64"] },
769
+ },
770
+ "mistral-large-2512": {
771
+ visionInput: true,
772
+ audioInput: false,
773
+ videoInput: false,
774
+ imageOutput: false,
775
+ audioOutput: false,
776
+ videoOutput: false,
777
+ mediaFormats: { imageFormats: ["url", "base64"] },
778
+ },
779
+ "mistral-medium-latest": {
780
+ visionInput: true,
781
+ audioInput: false,
782
+ videoInput: false,
783
+ imageOutput: false,
784
+ audioOutput: false,
785
+ videoOutput: false,
786
+ mediaFormats: { imageFormats: ["url", "base64"] },
787
+ },
788
+ "mistral-small-latest": {
789
+ visionInput: false,
790
+ audioInput: false,
791
+ videoInput: false,
792
+ imageOutput: false,
793
+ audioOutput: false,
794
+ videoOutput: false,
795
+ },
796
+ "mistral-small-2603": {
797
+ visionInput: false,
798
+ audioInput: false,
799
+ videoInput: false,
800
+ imageOutput: false,
801
+ audioOutput: false,
802
+ videoOutput: false,
803
+ },
804
+ "ministral-14b-2512": {
805
+ visionInput: true,
806
+ audioInput: false,
807
+ videoInput: false,
808
+ imageOutput: false,
809
+ audioOutput: false,
810
+ videoOutput: false,
811
+ mediaFormats: { imageFormats: ["url", "base64"] },
812
+ },
813
+ "ministral-8b-2512": {
814
+ visionInput: true,
815
+ audioInput: false,
816
+ videoInput: false,
817
+ imageOutput: false,
818
+ audioOutput: false,
819
+ videoOutput: false,
820
+ mediaFormats: { imageFormats: ["url", "base64"] },
821
+ },
822
+ "ministral-3b-2512": {
823
+ visionInput: true,
824
+ audioInput: false,
825
+ videoInput: false,
826
+ imageOutput: false,
827
+ audioOutput: false,
828
+ videoOutput: false,
829
+ mediaFormats: { imageFormats: ["url", "base64"] },
830
+ },
831
+ "codestral-latest": {
832
+ visionInput: false,
833
+ audioInput: false,
834
+ videoInput: false,
835
+ imageOutput: false,
836
+ audioOutput: false,
837
+ videoOutput: false,
838
+ },
839
+ "codestral-2508": {
840
+ visionInput: false,
841
+ audioInput: false,
842
+ videoInput: false,
843
+ imageOutput: false,
844
+ audioOutput: false,
845
+ videoOutput: false,
846
+ },
847
+ "mistral-ocr-latest": {
848
+ visionInput: true,
849
+ audioInput: false,
850
+ videoInput: false,
851
+ imageOutput: false,
852
+ audioOutput: false,
853
+ videoOutput: false,
854
+ mediaFormats: { imageFormats: ["url", "base64"] },
855
+ },
856
+ // Cohere — https://docs.cohere.com/docs/models
857
+ "command-a-plus-05-2026": {
858
+ visionInput: true,
859
+ audioInput: false,
860
+ videoInput: false,
861
+ imageOutput: false,
862
+ audioOutput: false,
863
+ videoOutput: false,
864
+ mediaFormats: { imageFormats: ["url", "base64"] },
865
+ },
866
+ "command-a-03-2025": {
867
+ visionInput: false,
868
+ audioInput: false,
869
+ videoInput: false,
870
+ imageOutput: false,
871
+ audioOutput: false,
872
+ videoOutput: false,
873
+ },
874
+ "command-a-reasoning-08-2025": {
875
+ visionInput: false,
876
+ audioInput: false,
877
+ videoInput: false,
878
+ imageOutput: false,
879
+ audioOutput: false,
880
+ videoOutput: false,
881
+ },
882
+ "command-a-vision-07-2025": {
883
+ visionInput: true,
884
+ audioInput: false,
885
+ videoInput: false,
886
+ imageOutput: false,
887
+ audioOutput: false,
888
+ videoOutput: false,
889
+ mediaFormats: { imageFormats: ["url", "base64"] },
890
+ },
891
+ "command-a-translate-08-2025": {
892
+ visionInput: false,
893
+ audioInput: false,
894
+ videoInput: false,
895
+ imageOutput: false,
896
+ audioOutput: false,
897
+ videoOutput: false,
898
+ },
899
+ "command-r7b-12-2024": {
900
+ visionInput: false,
901
+ audioInput: false,
902
+ videoInput: false,
903
+ imageOutput: false,
904
+ audioOutput: false,
905
+ videoOutput: false,
906
+ },
907
+ "command-r-plus-08-2024": {
908
+ visionInput: false,
909
+ audioInput: false,
910
+ videoInput: false,
911
+ imageOutput: false,
912
+ audioOutput: false,
913
+ videoOutput: false,
914
+ },
915
+ "command-r-08-2024": {
916
+ visionInput: false,
917
+ audioInput: false,
918
+ videoInput: false,
919
+ imageOutput: false,
920
+ audioOutput: false,
921
+ videoOutput: false,
922
+ },
923
+ // Groq — https://console.groq.com/docs/models
924
+ "openai/gpt-oss-120b": {
925
+ visionInput: true,
926
+ audioInput: false,
927
+ videoInput: false,
928
+ imageOutput: false,
929
+ audioOutput: false,
930
+ videoOutput: false,
931
+ mediaFormats: { imageFormats: ["url", "base64"] },
932
+ },
933
+ "openai/gpt-oss-20b": {
934
+ visionInput: true,
935
+ audioInput: false,
936
+ videoInput: false,
937
+ imageOutput: false,
938
+ audioOutput: false,
939
+ videoOutput: false,
940
+ mediaFormats: { imageFormats: ["url", "base64"] },
941
+ },
942
+ "qwen/qwen3.6-27b": {
943
+ visionInput: false,
944
+ audioInput: false,
945
+ videoInput: false,
946
+ imageOutput: false,
947
+ audioOutput: false,
948
+ videoOutput: false,
949
+ },
950
+ "minimaxai/minimax-m2.7": {
951
+ visionInput: false,
952
+ audioInput: false,
953
+ videoInput: false,
954
+ imageOutput: false,
955
+ audioOutput: false,
956
+ videoOutput: false,
957
+ },
958
+ "groq/compound": {
959
+ visionInput: true,
960
+ audioInput: false,
961
+ videoInput: false,
962
+ imageOutput: false,
963
+ audioOutput: false,
964
+ videoOutput: false,
965
+ webSearch: true,
966
+ mediaFormats: { imageFormats: ["url", "base64"] },
967
+ },
968
+ "groq/compound-mini": {
969
+ visionInput: true,
970
+ audioInput: false,
971
+ videoInput: false,
972
+ imageOutput: false,
973
+ audioOutput: false,
974
+ videoOutput: false,
975
+ webSearch: true,
976
+ mediaFormats: { imageFormats: ["url", "base64"] },
977
+ },
978
+ "whisper-large-v3": {
979
+ visionInput: false,
980
+ audioInput: true,
981
+ videoInput: false,
982
+ imageOutput: false,
983
+ audioOutput: false,
984
+ videoOutput: false,
985
+ mediaFormats: { audioFormats: ["file"] },
986
+ },
987
+ "whisper-large-v3-turbo": {
988
+ visionInput: false,
989
+ audioInput: true,
990
+ videoInput: false,
991
+ imageOutput: false,
992
+ audioOutput: false,
993
+ videoOutput: false,
994
+ mediaFormats: { audioFormats: ["file"] },
995
+ },
996
+ // xAI — https://docs.x.ai/docs/models
997
+ "grok-4.6": {
998
+ visionInput: true,
999
+ audioInput: false,
1000
+ videoInput: false,
1001
+ imageOutput: false,
1002
+ audioOutput: false,
1003
+ videoOutput: false,
1004
+ webSearch: true,
1005
+ mediaFormats: { imageFormats: ["url", "base64"] },
1006
+ },
1007
+ "grok-4.5": {
1008
+ visionInput: true,
1009
+ audioInput: false,
1010
+ videoInput: false,
1011
+ imageOutput: false,
1012
+ audioOutput: false,
1013
+ videoOutput: false,
1014
+ webSearch: true,
1015
+ mediaFormats: { imageFormats: ["url", "base64"] },
1016
+ },
1017
+ "grok-4.3": {
1018
+ visionInput: true,
1019
+ audioInput: false,
1020
+ videoInput: false,
1021
+ imageOutput: false,
1022
+ audioOutput: false,
1023
+ videoOutput: false,
1024
+ webSearch: true,
1025
+ mediaFormats: { imageFormats: ["url", "base64"] },
1026
+ },
1027
+ "grok-4.20-0309-reasoning": {
1028
+ visionInput: true,
1029
+ audioInput: false,
1030
+ videoInput: false,
1031
+ imageOutput: false,
1032
+ audioOutput: false,
1033
+ videoOutput: false,
1034
+ webSearch: true,
1035
+ mediaFormats: { imageFormats: ["url", "base64"] },
1036
+ },
1037
+ "grok-4.20-0309-non-reasoning": {
1038
+ visionInput: true,
1039
+ audioInput: false,
1040
+ videoInput: false,
1041
+ imageOutput: false,
1042
+ audioOutput: false,
1043
+ videoOutput: false,
1044
+ webSearch: true,
1045
+ mediaFormats: { imageFormats: ["url", "base64"] },
1046
+ },
1047
+ "grok-4.20-multi-agent-0309": {
1048
+ visionInput: true,
1049
+ audioInput: false,
1050
+ videoInput: false,
1051
+ imageOutput: false,
1052
+ audioOutput: false,
1053
+ videoOutput: false,
1054
+ webSearch: true,
1055
+ mediaFormats: { imageFormats: ["url", "base64"] },
1056
+ },
1057
+ "grok-build-0.1": {
1058
+ visionInput: true,
1059
+ audioInput: false,
1060
+ videoInput: false,
1061
+ imageOutput: false,
1062
+ audioOutput: false,
1063
+ videoOutput: false,
1064
+ webSearch: true,
1065
+ mediaFormats: { imageFormats: ["url", "base64"] },
1066
+ },
1067
+ // DeepSeek — https://api-docs.deepseek.com/quick_start/pricing (standard, cache miss)
1068
+ "deepseek-v4-pro": {
1069
+ visionInput: false,
1070
+ audioInput: false,
1071
+ videoInput: false,
1072
+ imageOutput: false,
1073
+ audioOutput: false,
1074
+ videoOutput: false,
1075
+ },
1076
+ "deepseek-v4-flash": {
1077
+ visionInput: false,
1078
+ audioInput: false,
1079
+ videoInput: false,
1080
+ imageOutput: false,
1081
+ audioOutput: false,
1082
+ videoOutput: false,
1083
+ },
1084
+ // Perplexity — https://docs.perplexity.ai (per-request search fees are billed separately)
1085
+ sonar: {
1086
+ visionInput: false,
1087
+ audioInput: false,
1088
+ videoInput: false,
1089
+ imageOutput: false,
1090
+ audioOutput: false,
1091
+ videoOutput: false,
1092
+ webSearch: true,
1093
+ },
1094
+ "sonar-pro": {
1095
+ visionInput: false,
1096
+ audioInput: false,
1097
+ videoInput: false,
1098
+ imageOutput: false,
1099
+ audioOutput: false,
1100
+ videoOutput: false,
1101
+ webSearch: true,
1102
+ },
1103
+ "sonar-pro-search": {
1104
+ visionInput: false,
1105
+ audioInput: false,
1106
+ videoInput: false,
1107
+ imageOutput: false,
1108
+ audioOutput: false,
1109
+ videoOutput: false,
1110
+ webSearch: true,
1111
+ },
1112
+ "sonar-reasoning-pro": {
1113
+ visionInput: false,
1114
+ audioInput: false,
1115
+ videoInput: false,
1116
+ imageOutput: false,
1117
+ audioOutput: false,
1118
+ videoOutput: false,
1119
+ webSearch: true,
1120
+ },
1121
+ "sonar-deep-research": {
1122
+ visionInput: false,
1123
+ audioInput: false,
1124
+ videoInput: false,
1125
+ imageOutput: false,
1126
+ audioOutput: false,
1127
+ videoOutput: false,
1128
+ webSearch: true,
1129
+ },
1130
+ // LM Studio / custom OpenAI-compatible servers — self-hosted, no per-token cost
1131
+ "qwen3-8b": {
1132
+ visionInput: false,
1133
+ audioInput: false,
1134
+ videoInput: false,
1135
+ imageOutput: false,
1136
+ audioOutput: false,
1137
+ videoOutput: false,
1138
+ },
1139
+ "qwen3-14b": {
1140
+ visionInput: false,
1141
+ audioInput: false,
1142
+ videoInput: false,
1143
+ imageOutput: false,
1144
+ audioOutput: false,
1145
+ videoOutput: false,
1146
+ },
1147
+ "qwen3-30b-a3b": {
1148
+ visionInput: false,
1149
+ audioInput: false,
1150
+ videoInput: false,
1151
+ imageOutput: false,
1152
+ audioOutput: false,
1153
+ videoOutput: false,
1154
+ },
1155
+ "qwen2.5-coder-14b-instruct": {
1156
+ visionInput: false,
1157
+ audioInput: false,
1158
+ videoInput: false,
1159
+ imageOutput: false,
1160
+ audioOutput: false,
1161
+ videoOutput: false,
1162
+ },
1163
+ "mistral-7b-instruct-v0.3": {
1164
+ visionInput: false,
1165
+ audioInput: false,
1166
+ videoInput: false,
1167
+ imageOutput: false,
1168
+ audioOutput: false,
1169
+ videoOutput: false,
1170
+ },
1171
+ "deepseek-r1-distill-qwen-7b": {
1172
+ visionInput: false,
1173
+ audioInput: false,
1174
+ videoInput: false,
1175
+ imageOutput: false,
1176
+ audioOutput: false,
1177
+ videoOutput: false,
1178
+ },
1179
+ "gemma-3-4b-it": {
1180
+ visionInput: true,
1181
+ audioInput: false,
1182
+ videoInput: false,
1183
+ imageOutput: false,
1184
+ audioOutput: false,
1185
+ videoOutput: false,
1186
+ mediaFormats: { imageFormats: ["base64"] },
1187
+ },
1188
+ "gemma-3-12b-it": {
1189
+ visionInput: true,
1190
+ audioInput: false,
1191
+ videoInput: false,
1192
+ imageOutput: false,
1193
+ audioOutput: false,
1194
+ videoOutput: false,
1195
+ mediaFormats: { imageFormats: ["base64"] },
1196
+ },
1197
+ "gemma-3-27b-it": {
1198
+ visionInput: true,
1199
+ audioInput: false,
1200
+ videoInput: false,
1201
+ imageOutput: false,
1202
+ audioOutput: false,
1203
+ videoOutput: false,
1204
+ mediaFormats: { imageFormats: ["base64"] },
1205
+ },
1206
+ "qwen2.5-vl-3b-instruct": {
1207
+ visionInput: true,
1208
+ audioInput: false,
1209
+ videoInput: false,
1210
+ imageOutput: false,
1211
+ audioOutput: false,
1212
+ videoOutput: false,
1213
+ mediaFormats: { imageFormats: ["base64"] },
1214
+ },
1215
+ "qwen2.5-vl-7b-instruct": {
1216
+ visionInput: true,
1217
+ audioInput: false,
1218
+ videoInput: false,
1219
+ imageOutput: false,
1220
+ audioOutput: false,
1221
+ videoOutput: false,
1222
+ mediaFormats: { imageFormats: ["base64"] },
1223
+ },
1224
+ "qwen2.5-vl-32b-instruct": {
1225
+ visionInput: true,
1226
+ audioInput: false,
1227
+ videoInput: false,
1228
+ imageOutput: false,
1229
+ audioOutput: false,
1230
+ videoOutput: false,
1231
+ mediaFormats: { imageFormats: ["base64"] },
1232
+ },
1233
+ "qwen2.5-vl-72b-instruct": {
1234
+ visionInput: true,
1235
+ audioInput: false,
1236
+ videoInput: false,
1237
+ imageOutput: false,
1238
+ audioOutput: false,
1239
+ videoOutput: false,
1240
+ mediaFormats: { imageFormats: ["base64"] },
1241
+ },
1242
+ "glm-4v-9b": {
1243
+ visionInput: true,
1244
+ audioInput: false,
1245
+ videoInput: false,
1246
+ imageOutput: false,
1247
+ audioOutput: false,
1248
+ videoOutput: false,
1249
+ mediaFormats: { imageFormats: ["base64"] },
1250
+ },
1251
+ "pixtral-12b-2409": {
1252
+ visionInput: true,
1253
+ audioInput: false,
1254
+ videoInput: false,
1255
+ imageOutput: false,
1256
+ audioOutput: false,
1257
+ videoOutput: false,
1258
+ mediaFormats: { imageFormats: ["base64"] },
1259
+ },
1260
+ "olmocr-2-7b-1025": {
1261
+ visionInput: true,
1262
+ audioInput: false,
1263
+ videoInput: false,
1264
+ imageOutput: false,
1265
+ audioOutput: false,
1266
+ videoOutput: false,
1267
+ mediaFormats: { imageFormats: ["base64"] },
1268
+ },
1269
+ "janus-pro-7b": {
1270
+ visionInput: true,
1271
+ audioInput: false,
1272
+ videoInput: false,
1273
+ imageOutput: false,
1274
+ audioOutput: false,
1275
+ videoOutput: false,
1276
+ mediaFormats: { imageFormats: ["base64"] },
1277
+ },
1278
+ };
1279
+ // =============================================================================
1280
+ // Model Pricing (cents per 1M tokens)
1281
+ // =============================================================================
1282
+ export const MODEL_PRICING = {
1283
+ // OpenAI — https://developers.openai.com/api/docs/models
1284
+ "gpt-5.6-sol": { input: 500, output: 3000 },
1285
+ "gpt-5.6-terra": { input: 200, output: 1200 },
1286
+ "gpt-5.6-luna": { input: 20, output: 120 },
1287
+ "gpt-5.5": { input: 500, output: 3000 },
1288
+ "gpt-5.4": { input: 250, output: 1500 },
1289
+ "gpt-5.4-mini": { input: 75, output: 450 },
1290
+ "gpt-5.4-nano": { input: 20, output: 125 },
1291
+ "gpt-5": { input: 125, output: 1000 },
1292
+ "gpt-5-mini": { input: 25, output: 200 },
1293
+ "gpt-5-nano": { input: 5, output: 40 },
1294
+ "gpt-4.1": { input: 200, output: 800 },
1295
+ "gpt-4.1-mini": { input: 40, output: 160 },
1296
+ "gpt-4.1-nano": { input: 10, output: 40 },
1297
+ "gpt-4o": { input: 250, output: 1000 },
1298
+ "gpt-4o-mini": { input: 15, output: 60 },
1299
+ // Anthropic — https://platform.claude.com/docs/en/about-claude/models/overview
1300
+ "claude-fable-5": { input: 1000, output: 5000 },
1301
+ "claude-opus-5": { input: 500, output: 2500 },
1302
+ "claude-sonnet-5": { input: 200, output: 1000 },
1303
+ "claude-haiku-4-5": { input: 100, output: 500 },
1304
+ "claude-opus-4-8": { input: 500, output: 2500 },
1305
+ "claude-opus-4-7": { input: 500, output: 2500 },
1306
+ "claude-opus-4-6": { input: 500, output: 2500 },
1307
+ "claude-sonnet-4-6": { input: 300, output: 1500 },
1308
+ "claude-opus-4-5-20251101": { input: 500, output: 2500 },
1309
+ "claude-sonnet-4-5-20250929": { input: 300, output: 1500 },
1310
+ // Google Gemini — https://ai.google.dev/gemini-api/docs/models
1311
+ "gemini-3.7-flash": {
1312
+ input: 75,
1313
+ output: 375,
1314
+ imageInput: 39,
1315
+ audioInput: 10,
1316
+ videoInput: 39,
1317
+ },
1318
+ "gemini-3.6-flash": {
1319
+ input: 75,
1320
+ output: 375,
1321
+ imageInput: 39,
1322
+ audioInput: 10,
1323
+ videoInput: 39,
1324
+ },
1325
+ "gemini-3.5-flash": {
1326
+ input: 150,
1327
+ output: 900,
1328
+ imageInput: 39,
1329
+ audioInput: 10,
1330
+ videoInput: 39,
1331
+ },
1332
+ "gemini-3.5-flash-lite": {
1333
+ input: 30,
1334
+ output: 250,
1335
+ imageInput: 30,
1336
+ audioInput: 50,
1337
+ videoInput: 30,
1338
+ },
1339
+ "gemini-3.1-flash-lite": {
1340
+ input: 25,
1341
+ output: 150,
1342
+ imageInput: 25,
1343
+ audioInput: 50,
1344
+ videoInput: 25,
1345
+ },
1346
+ "gemini-3.1-pro-preview": {
1347
+ input: 200,
1348
+ output: 1200,
1349
+ imageInput: 32.9,
1350
+ audioInput: 10,
1351
+ videoInput: 32.9,
1352
+ },
1353
+ "gemini-3-flash-preview": {
1354
+ input: 75,
1355
+ output: 375,
1356
+ imageInput: 39,
1357
+ audioInput: 10,
1358
+ videoInput: 39,
1359
+ },
1360
+ "gemini-3.1-flash-image": {
1361
+ input: 75,
1362
+ output: 375,
1363
+ imageInput: 39,
1364
+ imageOutput: 3.9,
1365
+ }, // Nano Banana 2
1366
+ "gemini-3.1-flash-lite-image": {
1367
+ input: 25,
1368
+ output: 150,
1369
+ imageInput: 25,
1370
+ imageOutput: 2.4,
1371
+ }, // Nano Banana 2 Lite
1372
+ "gemini-3-pro-image": {
1373
+ input: 125,
1374
+ output: 1000,
1375
+ imageInput: 32.9,
1376
+ imageOutput: 12,
1377
+ }, // Nano Banana Pro
1378
+ "gemini-2.5-pro": {
1379
+ input: 125,
1380
+ output: 1000,
1381
+ imageInput: 32.9,
1382
+ audioInput: 10,
1383
+ videoInput: 32.9,
1384
+ },
1385
+ "gemini-2.5-flash": {
1386
+ input: 30,
1387
+ output: 250,
1388
+ imageInput: 30,
1389
+ audioInput: 100,
1390
+ videoInput: 30,
1391
+ },
1392
+ "gemini-2.5-flash-lite": {
1393
+ input: 10,
1394
+ output: 40,
1395
+ imageInput: 10,
1396
+ audioInput: 30,
1397
+ videoInput: 10,
1398
+ },
1399
+ "gemini-2.5-flash-image": {
1400
+ input: 30,
1401
+ output: 250,
1402
+ imageInput: 30,
1403
+ imageOutput: 3.9,
1404
+ },
1405
+ "gemini-2.5-flash-native-audio-preview-12-2025": {
1406
+ input: 30,
1407
+ output: 250,
1408
+ audioInput: 100,
1409
+ audioOutput: 200,
1410
+ },
1411
+ "veo-3.1-generate-preview": { input: 0, output: 0, videoOutput: 4000 }, // priced per second of video
1412
+ "veo-3.1-lite-generate-preview": { input: 0, output: 0, videoOutput: 1500 }, // priced per second of video
1413
+ // Mistral — https://docs.mistral.ai/getting-started/models/models_overview/
1414
+ "mistral-large-latest": { input: 50, output: 150 },
1415
+ "mistral-large-2512": { input: 50, output: 150 },
1416
+ "mistral-medium-latest": { input: 150, output: 750 },
1417
+ "mistral-small-latest": { input: 15, output: 60 },
1418
+ "mistral-small-2603": { input: 15, output: 60 },
1419
+ "ministral-14b-2512": { input: 20, output: 20 },
1420
+ "ministral-8b-2512": { input: 15, output: 15 },
1421
+ "ministral-3b-2512": { input: 10, output: 10 },
1422
+ "codestral-latest": { input: 30, output: 90 },
1423
+ "codestral-2508": { input: 30, output: 90 },
1424
+ "mistral-ocr-latest": { input: 100, output: 300 }, // document OCR
1425
+ // Cohere — https://docs.cohere.com/docs/models
1426
+ "command-a-plus-05-2026": { input: 250, output: 1000 },
1427
+ "command-a-03-2025": { input: 250, output: 1000 },
1428
+ "command-a-reasoning-08-2025": { input: 250, output: 1000 },
1429
+ "command-a-vision-07-2025": { input: 250, output: 1000 },
1430
+ "command-a-translate-08-2025": { input: 250, output: 1000 },
1431
+ "command-r7b-12-2024": { input: 3.75, output: 15 },
1432
+ "command-r-plus-08-2024": { input: 250, output: 1000 },
1433
+ "command-r-08-2024": { input: 15, output: 60 },
1434
+ // Groq — https://console.groq.com/docs/models
1435
+ "openai/gpt-oss-120b": { input: 15, output: 75 },
1436
+ "openai/gpt-oss-20b": { input: 10, output: 50 },
1437
+ "qwen/qwen3.6-27b": { input: 29, output: 59 },
1438
+ "minimaxai/minimax-m2.7": { input: 29, output: 115 },
1439
+ "groq/compound": { input: 15, output: 75 },
1440
+ "groq/compound-mini": { input: 10, output: 50 },
1441
+ "whisper-large-v3": { input: 11, output: 0 }, // per hour of audio
1442
+ "whisper-large-v3-turbo": { input: 4, output: 0 }, // per hour of audio
1443
+ // xAI — https://docs.x.ai/docs/models
1444
+ "grok-4.6": { input: 200, output: 600 },
1445
+ "grok-4.5": { input: 200, output: 600 },
1446
+ "grok-4.3": { input: 125, output: 250 },
1447
+ "grok-4.20-0309-reasoning": { input: 125, output: 250 },
1448
+ "grok-4.20-0309-non-reasoning": { input: 125, output: 250 },
1449
+ "grok-4.20-multi-agent-0309": { input: 125, output: 250 },
1450
+ "grok-build-0.1": { input: 100, output: 200 },
1451
+ // DeepSeek — https://api-docs.deepseek.com/quick_start/pricing (standard, cache miss)
1452
+ "deepseek-v4-pro": { input: 66, output: 198 },
1453
+ "deepseek-v4-flash": { input: 22, output: 66 },
1454
+ // Perplexity — https://docs.perplexity.ai (per-request search fees are billed separately)
1455
+ sonar: { input: 100, output: 100 },
1456
+ "sonar-pro": { input: 300, output: 1500 },
1457
+ "sonar-pro-search": { input: 300, output: 1500 },
1458
+ "sonar-reasoning-pro": { input: 200, output: 800 },
1459
+ "sonar-deep-research": { input: 200, output: 800 },
1460
+ // LM Studio / custom OpenAI-compatible servers — self-hosted, no per-token cost
1461
+ "qwen3-8b": { input: 0, output: 0 },
1462
+ "qwen3-14b": { input: 0, output: 0 },
1463
+ "qwen3-30b-a3b": { input: 0, output: 0 },
1464
+ "qwen2.5-coder-14b-instruct": { input: 0, output: 0 },
1465
+ "mistral-7b-instruct-v0.3": { input: 0, output: 0 },
1466
+ "deepseek-r1-distill-qwen-7b": { input: 0, output: 0 },
1467
+ "gemma-3-4b-it": { input: 0, output: 0 },
1468
+ "gemma-3-12b-it": { input: 0, output: 0 },
1469
+ "gemma-3-27b-it": { input: 0, output: 0 },
1470
+ "qwen2.5-vl-3b-instruct": { input: 0, output: 0 },
1471
+ "qwen2.5-vl-7b-instruct": { input: 0, output: 0 },
1472
+ "qwen2.5-vl-32b-instruct": { input: 0, output: 0 },
1473
+ "qwen2.5-vl-72b-instruct": { input: 0, output: 0 },
1474
+ "glm-4v-9b": { input: 0, output: 0 },
1475
+ "pixtral-12b-2409": { input: 0, output: 0 },
1476
+ "olmocr-2-7b-1025": { input: 0, output: 0 },
1477
+ "janus-pro-7b": { input: 0, output: 0 },
1478
+ };
1479
+ // Default pricing for unknown models
1480
+ export const DEFAULT_MODEL_PRICING = { input: 100, output: 300 };
1481
+ // =============================================================================
1482
+ // Helper Functions
1483
+ // =============================================================================
1484
+ /**
1485
+ * Get provider configuration by ID.
1486
+ * @param providerId - The provider identifier (e.g., "openai", "anthropic")
1487
+ * @returns The provider config or undefined if not found
1488
+ */
1489
+ export function getProviderById(providerId) {
1490
+ return PROVIDERS.find(p => p.id === providerId);
1491
+ }
1492
+ /**
1493
+ * Get the list of model IDs for a given provider.
1494
+ * @param providerId - The provider identifier
1495
+ * @returns Array of model ID strings
1496
+ */
1497
+ export function getModelsForProvider(providerId) {
1498
+ return PROVIDER_MODELS[providerId] ?? [];
1499
+ }
1500
+ /**
1501
+ * Get capabilities for a specific model (vision, audio, video I/O).
1502
+ * Returns empty object for unknown models (permissive by default).
1503
+ * @param model - The model identifier
1504
+ * @returns Model capabilities
1505
+ */
1506
+ export function getModelCapabilities(model) {
1507
+ return MODEL_CAPABILITIES[model] ?? {};
1508
+ }
1509
+ /**
1510
+ * Get pricing for a specific model (cents per 1M tokens).
1511
+ * Returns DEFAULT_MODEL_PRICING for unknown models.
1512
+ * @param model - The model identifier
1513
+ * @returns Model pricing
1514
+ */
1515
+ export function getModelPricing(model) {
1516
+ // Try exact match first, then strip date suffix (e.g., "gpt-4.1-mini-2025-04-14" -> "gpt-4.1-mini")
1517
+ if (MODEL_PRICING[model])
1518
+ return MODEL_PRICING[model];
1519
+ const baseModel = model.replace(/-\d{4}-\d{2}-\d{2}$/, "");
1520
+ return MODEL_PRICING[baseModel] ?? DEFAULT_MODEL_PRICING;
1521
+ }
1522
+ /**
1523
+ * Get the provider for a given model name.
1524
+ * Searches through PROVIDER_MODELS to find which provider owns this model.
1525
+ */
1526
+ export function getProviderForModel(model) {
1527
+ for (const [provider, models] of Object.entries(PROVIDER_MODELS)) {
1528
+ if (models.includes(model)) {
1529
+ return provider;
1530
+ }
1531
+ }
1532
+ // Default to openai for unknown models (OpenAI-compatible format)
1533
+ return "openai";
1534
+ }
1535
+ //# sourceMappingURL=providers.js.map