stratifyai 0.1.0__py3-none-any.whl

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 (57) hide show
  1. cli/__init__.py +5 -0
  2. cli/stratifyai_cli.py +1753 -0
  3. stratifyai/__init__.py +113 -0
  4. stratifyai/api_key_helper.py +372 -0
  5. stratifyai/caching.py +279 -0
  6. stratifyai/chat/__init__.py +54 -0
  7. stratifyai/chat/builder.py +366 -0
  8. stratifyai/chat/stratifyai_anthropic.py +194 -0
  9. stratifyai/chat/stratifyai_bedrock.py +200 -0
  10. stratifyai/chat/stratifyai_deepseek.py +194 -0
  11. stratifyai/chat/stratifyai_google.py +194 -0
  12. stratifyai/chat/stratifyai_grok.py +194 -0
  13. stratifyai/chat/stratifyai_groq.py +195 -0
  14. stratifyai/chat/stratifyai_ollama.py +201 -0
  15. stratifyai/chat/stratifyai_openai.py +209 -0
  16. stratifyai/chat/stratifyai_openrouter.py +201 -0
  17. stratifyai/chunking.py +158 -0
  18. stratifyai/client.py +292 -0
  19. stratifyai/config.py +1273 -0
  20. stratifyai/cost_tracker.py +257 -0
  21. stratifyai/embeddings.py +245 -0
  22. stratifyai/exceptions.py +91 -0
  23. stratifyai/models.py +59 -0
  24. stratifyai/providers/__init__.py +5 -0
  25. stratifyai/providers/anthropic.py +330 -0
  26. stratifyai/providers/base.py +183 -0
  27. stratifyai/providers/bedrock.py +634 -0
  28. stratifyai/providers/deepseek.py +39 -0
  29. stratifyai/providers/google.py +39 -0
  30. stratifyai/providers/grok.py +39 -0
  31. stratifyai/providers/groq.py +39 -0
  32. stratifyai/providers/ollama.py +43 -0
  33. stratifyai/providers/openai.py +344 -0
  34. stratifyai/providers/openai_compatible.py +372 -0
  35. stratifyai/providers/openrouter.py +39 -0
  36. stratifyai/py.typed +2 -0
  37. stratifyai/rag.py +381 -0
  38. stratifyai/retry.py +185 -0
  39. stratifyai/router.py +643 -0
  40. stratifyai/summarization.py +179 -0
  41. stratifyai/utils/__init__.py +11 -0
  42. stratifyai/utils/bedrock_validator.py +136 -0
  43. stratifyai/utils/code_extractor.py +327 -0
  44. stratifyai/utils/csv_extractor.py +197 -0
  45. stratifyai/utils/file_analyzer.py +192 -0
  46. stratifyai/utils/json_extractor.py +219 -0
  47. stratifyai/utils/log_extractor.py +267 -0
  48. stratifyai/utils/model_selector.py +324 -0
  49. stratifyai/utils/provider_validator.py +442 -0
  50. stratifyai/utils/token_counter.py +186 -0
  51. stratifyai/vectordb.py +344 -0
  52. stratifyai-0.1.0.dist-info/METADATA +263 -0
  53. stratifyai-0.1.0.dist-info/RECORD +57 -0
  54. stratifyai-0.1.0.dist-info/WHEEL +5 -0
  55. stratifyai-0.1.0.dist-info/entry_points.txt +2 -0
  56. stratifyai-0.1.0.dist-info/licenses/LICENSE +21 -0
  57. stratifyai-0.1.0.dist-info/top_level.txt +2 -0
stratifyai/config.py ADDED
@@ -0,0 +1,1273 @@
1
+ """Configuration and model metadata for all providers."""
2
+
3
+ from typing import Dict, Any
4
+
5
+ # OpenAI Model Catalog
6
+ OPENAI_MODELS: Dict[str, Dict[str, Any]] = {
7
+ # Current production models
8
+ "gpt-4o": {
9
+ "context": 128000,
10
+ "cost_input": 2.5,
11
+ "cost_output": 10.0,
12
+ "cost_cache_write": 1.25,
13
+ "cost_cache_read": 1.25,
14
+ "supports_vision": True,
15
+ "supports_tools": True,
16
+ "supports_caching": True,
17
+ },
18
+ "gpt-4o-mini": {
19
+ "context": 128000,
20
+ "cost_input": 0.15,
21
+ "cost_output": 0.60,
22
+ "cost_cache_write": 0.075,
23
+ "cost_cache_read": 0.075,
24
+ "supports_vision": True,
25
+ "supports_tools": True,
26
+ "supports_caching": True,
27
+ },
28
+ "gpt-4-turbo": {
29
+ "context": 128000,
30
+ "cost_input": 10.0,
31
+ "cost_output": 30.0,
32
+ "supports_vision": True,
33
+ "supports_tools": True,
34
+ },
35
+ "gpt-4": {
36
+ "context": 8192,
37
+ "cost_input": 30.0,
38
+ "cost_output": 60.0,
39
+ "supports_vision": False,
40
+ "supports_tools": True,
41
+ },
42
+ "gpt-3.5-turbo": {
43
+ "context": 16385,
44
+ "cost_input": 0.50,
45
+ "cost_output": 1.50,
46
+ "supports_vision": False,
47
+ "supports_tools": True,
48
+ },
49
+ # Future models (placeholders)
50
+ "gpt-5": {
51
+ "context": 128000,
52
+ "cost_input": 10.0, # Per 1M tokens
53
+ "cost_output": 30.0,
54
+ "cost_cache_write": 12.5, # 25% more than input
55
+ "cost_cache_read": 1.0, # 90% discount on input
56
+ "supports_vision": True,
57
+ "supports_tools": True,
58
+ "supports_caching": True,
59
+ "fixed_temperature": 1.0,
60
+ },
61
+ "gpt-5-mini": {
62
+ "context": 128000,
63
+ "cost_input": 2.0,
64
+ "cost_output": 6.0,
65
+ "cost_cache_write": 2.5,
66
+ "cost_cache_read": 0.2,
67
+ "supports_vision": True,
68
+ "supports_tools": True,
69
+ "supports_caching": True,
70
+ },
71
+ "gpt-5-nano": {
72
+ "context": 128000,
73
+ "cost_input": 1.0,
74
+ "cost_output": 3.0,
75
+ "supports_vision": False,
76
+ "supports_tools": True,
77
+ },
78
+ "gpt-4.1": {
79
+ "context": 128000,
80
+ "cost_input": 2.5,
81
+ "cost_output": 10.0,
82
+ "cost_cache_write": 3.125,
83
+ "cost_cache_read": 0.25,
84
+ "supports_vision": True,
85
+ "supports_tools": True,
86
+ "supports_caching": True,
87
+ },
88
+ "gpt-4.1-mini": {
89
+ "context": 128000,
90
+ "cost_input": 0.15,
91
+ "cost_output": 0.60,
92
+ "cost_cache_write": 0.1875,
93
+ "cost_cache_read": 0.015,
94
+ "supports_vision": True,
95
+ "supports_tools": True,
96
+ "supports_caching": True,
97
+ },
98
+ "o1": {
99
+ "context": 200000,
100
+ "cost_input": 15.0,
101
+ "cost_output": 60.0,
102
+ "supports_vision": False,
103
+ "supports_tools": False,
104
+ "reasoning_model": True,
105
+ "fixed_temperature": 1.0,
106
+ },
107
+ "o1-mini": {
108
+ "context": 128000,
109
+ "cost_input": 3.0,
110
+ "cost_output": 12.0,
111
+ "supports_vision": False,
112
+ "supports_tools": False,
113
+ "reasoning_model": True,
114
+ "fixed_temperature": 1.0,
115
+ },
116
+ "o3-mini": {
117
+ "context": 200000,
118
+ "cost_input": 1.1,
119
+ "cost_output": 4.4,
120
+ "supports_vision": False,
121
+ "supports_tools": False,
122
+ "reasoning_model": True,
123
+ "fixed_temperature": 1.0,
124
+ },
125
+ "o1-preview": {
126
+ "context": 128000,
127
+ "cost_input": 15.0,
128
+ "cost_output": 60.0,
129
+ "supports_vision": False,
130
+ "supports_tools": False,
131
+ "reasoning_model": True,
132
+ "fixed_temperature": 1.0,
133
+ },
134
+ "o1-2024-12-17": {
135
+ "context": 200000,
136
+ "cost_input": 15.0,
137
+ "cost_output": 60.0,
138
+ "supports_vision": False,
139
+ "supports_tools": False,
140
+ "reasoning_model": True,
141
+ "fixed_temperature": 1.0,
142
+ },
143
+ "o1-mini-2024-09-12": {
144
+ "context": 128000,
145
+ "cost_input": 3.0,
146
+ "cost_output": 12.0,
147
+ "supports_vision": False,
148
+ "supports_tools": False,
149
+ "reasoning_model": True,
150
+ "fixed_temperature": 1.0,
151
+ },
152
+ }
153
+
154
+ # Provider-specific constraints
155
+ PROVIDER_CONSTRAINTS: Dict[str, Dict[str, Any]] = {
156
+ "anthropic": {
157
+ "min_temperature": 0.0,
158
+ "max_temperature": 1.0,
159
+ },
160
+ "openai": {
161
+ "min_temperature": 0.0,
162
+ "max_temperature": 2.0,
163
+ },
164
+ "google": {
165
+ "min_temperature": 0.0,
166
+ "max_temperature": 2.0,
167
+ },
168
+ "deepseek": {
169
+ "min_temperature": 0.0,
170
+ "max_temperature": 2.0,
171
+ },
172
+ "groq": {
173
+ "min_temperature": 0.0,
174
+ "max_temperature": 2.0,
175
+ },
176
+ "grok": {
177
+ "min_temperature": 0.0,
178
+ "max_temperature": 2.0,
179
+ },
180
+ "openrouter": {
181
+ "min_temperature": 0.0,
182
+ "max_temperature": 2.0,
183
+ },
184
+ "ollama": {
185
+ "min_temperature": 0.0,
186
+ "max_temperature": 2.0,
187
+ },
188
+ "bedrock": {
189
+ "min_temperature": 0.0,
190
+ "max_temperature": 1.0,
191
+ },
192
+ }
193
+
194
+ # Anthropic Model Catalog
195
+ ANTHROPIC_MODELS: Dict[str, Dict[str, Any]] = {
196
+ # Claude 4.5 Models (Latest - November 2025)
197
+ "claude-sonnet-4-5-20250929": {
198
+ "context": 200000,
199
+ "cost_input": 3.0,
200
+ "cost_output": 15.0,
201
+ "cost_cache_write": 3.75, # 25% more than input
202
+ "cost_cache_read": 0.30, # 90% discount on input
203
+ "supports_vision": True,
204
+ "supports_tools": True,
205
+ "supports_caching": True,
206
+ },
207
+ "claude-sonnet-4-5": { # Alias for latest Sonnet 4.5
208
+ "context": 200000,
209
+ "cost_input": 3.0,
210
+ "cost_output": 15.0,
211
+ "cost_cache_write": 3.75,
212
+ "cost_cache_read": 0.30,
213
+ "supports_vision": True,
214
+ "supports_tools": True,
215
+ "supports_caching": True,
216
+ },
217
+ "claude-opus-4-5-20251101": {
218
+ "context": 1000000,
219
+ "api_max_input": 200000, # API enforces 200k input limit despite 1M context
220
+ "cost_input": 5.0,
221
+ "cost_output": 25.0,
222
+ "cost_cache_write": 6.25,
223
+ "cost_cache_read": 0.50,
224
+ "supports_vision": True,
225
+ "supports_tools": True,
226
+ "supports_caching": True,
227
+ },
228
+ "claude-opus-4-5": { # Alias for latest Opus 4.5
229
+ "context": 1000000,
230
+ "api_max_input": 200000, # API enforces 200k input limit despite 1M context
231
+ "cost_input": 5.0,
232
+ "cost_output": 25.0,
233
+ "cost_cache_write": 6.25,
234
+ "cost_cache_read": 0.50,
235
+ "supports_vision": True,
236
+ "supports_tools": True,
237
+ "supports_caching": True,
238
+ },
239
+ "claude-haiku-4-5-20251001": {
240
+ "context": 200000,
241
+ "cost_input": 1.0,
242
+ "cost_output": 5.0,
243
+ "cost_cache_write": 1.25,
244
+ "cost_cache_read": 0.10,
245
+ "supports_vision": True,
246
+ "supports_tools": True,
247
+ "supports_caching": True,
248
+ },
249
+ "claude-haiku-4-5": { # Alias for latest Haiku 4.5
250
+ "context": 200000,
251
+ "cost_input": 1.0,
252
+ "cost_output": 5.0,
253
+ "cost_cache_write": 1.25,
254
+ "cost_cache_read": 0.10,
255
+ "supports_vision": True,
256
+ "supports_tools": True,
257
+ "supports_caching": True,
258
+ },
259
+ # Claude 4.1 Models (August 2025)
260
+ "claude-opus-4-1-20250805": {
261
+ "context": 200000,
262
+ "cost_input": 15.0,
263
+ "cost_output": 75.0,
264
+ "cost_cache_write": 18.75,
265
+ "cost_cache_read": 1.50,
266
+ "supports_vision": True,
267
+ "supports_tools": True,
268
+ "supports_caching": True,
269
+ },
270
+ # Claude 4 Models (May 2025)
271
+ "claude-sonnet-4-20250514": {
272
+ "context": 200000,
273
+ "cost_input": 3.0,
274
+ "cost_output": 15.0,
275
+ "cost_cache_write": 3.75,
276
+ "cost_cache_read": 0.30,
277
+ "supports_vision": True,
278
+ "supports_tools": True,
279
+ "supports_caching": True,
280
+ },
281
+ "claude-opus-4-20250514": {
282
+ "context": 200000,
283
+ "cost_input": 15.0,
284
+ "cost_output": 75.0,
285
+ "cost_cache_write": 18.75,
286
+ "cost_cache_read": 1.50,
287
+ "supports_vision": True,
288
+ "supports_tools": True,
289
+ "supports_caching": True,
290
+ },
291
+ # Claude 3.7 Sonnet (February 2025)
292
+ "claude-3-7-sonnet-20250219": {
293
+ "context": 200000,
294
+ "cost_input": 3.0,
295
+ "cost_output": 15.0,
296
+ "cost_cache_write": 3.75,
297
+ "cost_cache_read": 0.30,
298
+ "supports_vision": True,
299
+ "supports_tools": True,
300
+ "supports_caching": True,
301
+ },
302
+ # Claude 3.5 Models (October 2024) - Legacy but still available
303
+ "claude-3-5-sonnet-20241022": {
304
+ "context": 200000,
305
+ "cost_input": 3.0,
306
+ "cost_output": 15.0,
307
+ "cost_cache_write": 3.75,
308
+ "cost_cache_read": 0.30,
309
+ "supports_vision": True,
310
+ "supports_tools": True,
311
+ "supports_caching": True,
312
+ },
313
+ "claude-3-5-haiku-20241022": {
314
+ "context": 200000,
315
+ "cost_input": 1.0,
316
+ "cost_output": 5.0,
317
+ "cost_cache_write": 1.25,
318
+ "cost_cache_read": 0.10,
319
+ "supports_vision": False,
320
+ "supports_tools": True,
321
+ "supports_caching": True,
322
+ },
323
+ }
324
+
325
+ # Google Gemini Model Catalog (OpenAI-compatible)
326
+ GOOGLE_MODELS: Dict[str, Dict[str, Any]] = {
327
+ "gemini-2.5-pro": {
328
+ "context": 1000000,
329
+ "cost_input": 1.25,
330
+ "cost_output": 5.0,
331
+ "cost_cache_write": 1.5625,
332
+ "cost_cache_read": 0.125,
333
+ "supports_vision": True,
334
+ "supports_tools": True,
335
+ "supports_caching": True,
336
+ },
337
+ "gemini-2.5-flash": {
338
+ "context": 1000000,
339
+ "cost_input": 0.075,
340
+ "cost_output": 0.30,
341
+ "cost_cache_write": 0.09375,
342
+ "cost_cache_read": 0.0075,
343
+ "supports_vision": True,
344
+ "supports_tools": True,
345
+ "supports_caching": True,
346
+ },
347
+ "gemini-2.5-flash-lite": {
348
+ "context": 1000000,
349
+ "cost_input": 0.0,
350
+ "cost_output": 0.0,
351
+ "supports_vision": False,
352
+ "supports_tools": False,
353
+ },
354
+ }
355
+
356
+ # DeepSeek Model Catalog (OpenAI-compatible)
357
+ DEEPSEEK_MODELS: Dict[str, Dict[str, Any]] = {
358
+ "deepseek-chat": {
359
+ "context": 64000,
360
+ "cost_input": 0.14,
361
+ "cost_output": 0.28,
362
+ "supports_vision": False,
363
+ "supports_tools": True,
364
+ },
365
+ "deepseek-reasoner": {
366
+ "context": 64000,
367
+ "cost_input": 0.55,
368
+ "cost_output": 2.19,
369
+ "supports_vision": False,
370
+ "supports_tools": False,
371
+ "reasoning_model": True,
372
+ "fixed_temperature": 1.0,
373
+ },
374
+ }
375
+
376
+ # Groq Model Catalog (OpenAI-compatible)
377
+ GROQ_MODELS: Dict[str, Dict[str, Any]] = {
378
+ # Llama 3.3 Models (Production)
379
+ "llama-3.3-70b-versatile": {
380
+ "context": 128000,
381
+ "cost_input": 0.59,
382
+ "cost_output": 0.79,
383
+ "supports_vision": False,
384
+ "supports_tools": True,
385
+ },
386
+ "llama-3.3-70b-specdec": {
387
+ "context": 128000,
388
+ "cost_input": 0.59,
389
+ "cost_output": 0.79,
390
+ "supports_vision": False,
391
+ "supports_tools": True,
392
+ },
393
+ # Llama 3.1 Models (Legacy - maintained for compatibility)
394
+ "llama-3.1-70b-versatile": {
395
+ "context": 128000,
396
+ "cost_input": 0.59,
397
+ "cost_output": 0.79,
398
+ "supports_vision": False,
399
+ "supports_tools": True,
400
+ },
401
+ "llama-3.1-8b-instant": {
402
+ "context": 128000,
403
+ "cost_input": 0.05,
404
+ "cost_output": 0.08,
405
+ "supports_vision": False,
406
+ "supports_tools": True,
407
+ },
408
+ # Groq Tool Use Models
409
+ "llama-3-groq-70b-tool-use": {
410
+ "context": 8192,
411
+ "cost_input": 0.89,
412
+ "cost_output": 0.89,
413
+ "supports_vision": False,
414
+ "supports_tools": True,
415
+ },
416
+ "llama-3-groq-8b-tool-use": {
417
+ "context": 8192,
418
+ "cost_input": 0.19,
419
+ "cost_output": 0.19,
420
+ "supports_vision": False,
421
+ "supports_tools": True,
422
+ },
423
+ # GPT-OSS Models (OpenAI's open-weight models)
424
+ "openai/gpt-oss-120b": {
425
+ "context": 128000,
426
+ "cost_input": 0.59,
427
+ "cost_output": 0.79,
428
+ "supports_vision": False,
429
+ "supports_tools": True,
430
+ "reasoning_model": True,
431
+ },
432
+ "openai/gpt-oss-20b": {
433
+ "context": 128000,
434
+ "cost_input": 0.05,
435
+ "cost_output": 0.08,
436
+ "supports_vision": False,
437
+ "supports_tools": True,
438
+ "reasoning_model": True,
439
+ },
440
+ # Compound AI System
441
+ "groq/compound": {
442
+ "context": 128000,
443
+ "cost_input": 0.59,
444
+ "cost_output": 0.79,
445
+ "supports_vision": False,
446
+ "supports_tools": True,
447
+ },
448
+ }
449
+
450
+ # Grok (X.AI) Model Catalog (OpenAI-compatible)
451
+ GROK_MODELS: Dict[str, Dict[str, Any]] = {
452
+ "grok-beta": {
453
+ "context": 131072,
454
+ "cost_input": 5.0,
455
+ "cost_output": 15.0,
456
+ "supports_vision": False,
457
+ "supports_tools": True,
458
+ },
459
+ }
460
+
461
+ # OpenRouter Model Catalog (Supports many models)
462
+ OPENROUTER_MODELS: Dict[str, Dict[str, Any]] = {
463
+ # Anthropic Claude Models
464
+ "anthropic/claude-opus-4-5": {
465
+ "context": 1000000,
466
+ "cost_input": 5.0,
467
+ "cost_output": 25.0,
468
+ "supports_vision": True,
469
+ "supports_tools": True,
470
+ "supports_caching": True,
471
+ },
472
+ "anthropic/claude-sonnet-4-5": {
473
+ "context": 200000,
474
+ "cost_input": 3.0,
475
+ "cost_output": 15.0,
476
+ "supports_vision": True,
477
+ "supports_tools": True,
478
+ "supports_caching": True,
479
+ },
480
+ "anthropic/claude-haiku-4-5": {
481
+ "context": 200000,
482
+ "cost_input": 0.80,
483
+ "cost_output": 4.0,
484
+ "supports_vision": True,
485
+ "supports_tools": True,
486
+ "supports_caching": True,
487
+ },
488
+ "anthropic/claude-3-7-sonnet": {
489
+ "context": 200000,
490
+ "cost_input": 3.0,
491
+ "cost_output": 15.0,
492
+ "supports_vision": True,
493
+ "supports_tools": True,
494
+ "supports_caching": True,
495
+ },
496
+ "anthropic/claude-3-5-sonnet": {
497
+ "context": 200000,
498
+ "cost_input": 3.0,
499
+ "cost_output": 15.0,
500
+ "supports_vision": True,
501
+ "supports_tools": True,
502
+ },
503
+ # OpenAI Models
504
+ "openai/gpt-5.2": {
505
+ "context": 400000,
506
+ "cost_input": 10.0,
507
+ "cost_output": 30.0,
508
+ "supports_vision": True,
509
+ "supports_tools": True,
510
+ "supports_caching": True,
511
+ },
512
+ "openai/gpt-5.1": {
513
+ "context": 200000,
514
+ "cost_input": 10.0,
515
+ "cost_output": 30.0,
516
+ "supports_vision": True,
517
+ "supports_tools": True,
518
+ },
519
+ "openai/gpt-4o": {
520
+ "context": 128000,
521
+ "cost_input": 2.5,
522
+ "cost_output": 10.0,
523
+ "supports_vision": True,
524
+ "supports_tools": True,
525
+ "supports_caching": True,
526
+ },
527
+ "openai/gpt-4o-mini": {
528
+ "context": 128000,
529
+ "cost_input": 0.15,
530
+ "cost_output": 0.60,
531
+ "supports_vision": True,
532
+ "supports_tools": True,
533
+ "supports_caching": True,
534
+ },
535
+ "openai/gpt-4-turbo": {
536
+ "context": 128000,
537
+ "cost_input": 10.0,
538
+ "cost_output": 30.0,
539
+ "supports_vision": True,
540
+ "supports_tools": True,
541
+ },
542
+ "openai/gpt-4": {
543
+ "context": 8192,
544
+ "cost_input": 30.0,
545
+ "cost_output": 60.0,
546
+ "supports_vision": False,
547
+ "supports_tools": True,
548
+ },
549
+ "openai/gpt-3.5-turbo": {
550
+ "context": 16385,
551
+ "cost_input": 0.50,
552
+ "cost_output": 1.50,
553
+ "supports_vision": False,
554
+ "supports_tools": True,
555
+ },
556
+ "openai/o1": {
557
+ "context": 200000,
558
+ "cost_input": 15.0,
559
+ "cost_output": 60.0,
560
+ "supports_vision": False,
561
+ "supports_tools": False,
562
+ "reasoning_model": True,
563
+ "fixed_temperature": 1.0,
564
+ },
565
+ "openai/o1-mini": {
566
+ "context": 128000,
567
+ "cost_input": 3.0,
568
+ "cost_output": 12.0,
569
+ "supports_vision": False,
570
+ "supports_tools": False,
571
+ "reasoning_model": True,
572
+ "fixed_temperature": 1.0,
573
+ },
574
+ "openai/o3-mini": {
575
+ "context": 200000,
576
+ "cost_input": 1.1,
577
+ "cost_output": 4.4,
578
+ "supports_vision": False,
579
+ "supports_tools": False,
580
+ "reasoning_model": True,
581
+ "fixed_temperature": 1.0,
582
+ },
583
+ # Google Gemini Models
584
+ "google/gemini-3": {
585
+ "context": 1000000,
586
+ "cost_input": 2.5,
587
+ "cost_output": 10.0,
588
+ "supports_vision": True,
589
+ "supports_tools": True,
590
+ "supports_caching": True,
591
+ },
592
+ "google/gemini-2.5-pro": {
593
+ "context": 1000000,
594
+ "cost_input": 1.25,
595
+ "cost_output": 5.0,
596
+ "supports_vision": True,
597
+ "supports_tools": True,
598
+ "supports_caching": True,
599
+ },
600
+ "google/gemini-2.5-flash": {
601
+ "context": 1000000,
602
+ "cost_input": 0.075,
603
+ "cost_output": 0.30,
604
+ "supports_vision": True,
605
+ "supports_tools": True,
606
+ "supports_caching": True,
607
+ },
608
+ "google/gemini-2.5-flash-lite": {
609
+ "context": 1000000,
610
+ "cost_input": 0.0,
611
+ "cost_output": 0.0,
612
+ "supports_vision": False,
613
+ "supports_tools": False,
614
+ "free": True,
615
+ },
616
+ "google/gemini-2.0-flash-exp:free": {
617
+ "context": 1000000,
618
+ "cost_input": 0.0,
619
+ "cost_output": 0.0,
620
+ "supports_vision": True,
621
+ "supports_tools": True,
622
+ "free": True,
623
+ },
624
+ # Meta Llama Models
625
+ "meta-llama/llama-4-maverick:free": {
626
+ "context": 512000,
627
+ "cost_input": 0.0,
628
+ "cost_output": 0.0,
629
+ "supports_vision": True,
630
+ "supports_tools": True,
631
+ "free": True,
632
+ },
633
+ "meta-llama/llama-4-scout:free": {
634
+ "context": 512000,
635
+ "cost_input": 0.0,
636
+ "cost_output": 0.0,
637
+ "supports_vision": True,
638
+ "supports_tools": True,
639
+ "free": True,
640
+ },
641
+ "meta-llama/llama-3.3-70b-instruct": {
642
+ "context": 128000,
643
+ "cost_input": 0.35,
644
+ "cost_output": 0.40,
645
+ "supports_vision": False,
646
+ "supports_tools": True,
647
+ },
648
+ "meta-llama/llama-3.3-70b-instruct:free": {
649
+ "context": 128000,
650
+ "cost_input": 0.0,
651
+ "cost_output": 0.0,
652
+ "supports_vision": False,
653
+ "supports_tools": True,
654
+ "free": True,
655
+ },
656
+ "meta-llama/llama-3.1-70b-versatile": {
657
+ "context": 131072,
658
+ "cost_input": 0.59,
659
+ "cost_output": 0.79,
660
+ "supports_vision": False,
661
+ "supports_tools": True,
662
+ },
663
+ "meta-llama/llama-3.1-8b-instant": {
664
+ "context": 131072,
665
+ "cost_input": 0.05,
666
+ "cost_output": 0.08,
667
+ "supports_vision": False,
668
+ "supports_tools": True,
669
+ },
670
+ # DeepSeek Models
671
+ "deepseek/deepseek-v3.2": {
672
+ "context": 64000,
673
+ "cost_input": 0.14,
674
+ "cost_output": 0.28,
675
+ "supports_vision": False,
676
+ "supports_tools": True,
677
+ },
678
+ "deepseek/deepseek-chat": {
679
+ "context": 64000,
680
+ "cost_input": 0.14,
681
+ "cost_output": 0.28,
682
+ "supports_vision": False,
683
+ "supports_tools": True,
684
+ },
685
+ "deepseek/deepseek-chat-v3-0324:free": {
686
+ "context": 64000,
687
+ "cost_input": 0.0,
688
+ "cost_output": 0.0,
689
+ "supports_vision": False,
690
+ "supports_tools": True,
691
+ "free": True,
692
+ },
693
+ "deepseek/deepseek-reasoner": {
694
+ "context": 64000,
695
+ "cost_input": 0.55,
696
+ "cost_output": 2.19,
697
+ "supports_vision": False,
698
+ "supports_tools": False,
699
+ "reasoning_model": True,
700
+ "fixed_temperature": 1.0,
701
+ },
702
+ "deepseek/deepseek-r1": {
703
+ "context": 64000,
704
+ "cost_input": 0.55,
705
+ "cost_output": 2.19,
706
+ "supports_vision": False,
707
+ "supports_tools": False,
708
+ "reasoning_model": True,
709
+ "fixed_temperature": 1.0,
710
+ },
711
+ "deepseek/deepseek-r1-zero:free": {
712
+ "context": 64000,
713
+ "cost_input": 0.0,
714
+ "cost_output": 0.0,
715
+ "supports_vision": False,
716
+ "supports_tools": False,
717
+ "reasoning_model": True,
718
+ "fixed_temperature": 1.0,
719
+ "free": True,
720
+ },
721
+ "deepseek/deepseek-v3-base:free": {
722
+ "context": 64000,
723
+ "cost_input": 0.0,
724
+ "cost_output": 0.0,
725
+ "supports_vision": False,
726
+ "supports_tools": True,
727
+ "free": True,
728
+ },
729
+ # Mistral Models
730
+ "mistralai/mistral-large-3": {
731
+ "context": 128000,
732
+ "cost_input": 2.0,
733
+ "cost_output": 6.0,
734
+ "supports_vision": False,
735
+ "supports_tools": True,
736
+ },
737
+ "mistralai/mistral-small-3.1-24b-instruct:free": {
738
+ "context": 128000,
739
+ "cost_input": 0.0,
740
+ "cost_output": 0.0,
741
+ "supports_vision": False,
742
+ "supports_tools": True,
743
+ "free": True,
744
+ },
745
+ "mistralai/devstral-2:free": {
746
+ "context": 256000,
747
+ "cost_input": 0.0,
748
+ "cost_output": 0.0,
749
+ "supports_vision": False,
750
+ "supports_tools": True,
751
+ "free": True,
752
+ },
753
+ "mistralai/mixtral-8x7b-32768": {
754
+ "context": 32768,
755
+ "cost_input": 0.24,
756
+ "cost_output": 0.24,
757
+ "supports_vision": False,
758
+ "supports_tools": True,
759
+ },
760
+ # Qwen Models
761
+ "qwen/qwen-3-32b": {
762
+ "context": 128000,
763
+ "cost_input": 0.40,
764
+ "cost_output": 0.60,
765
+ "supports_vision": False,
766
+ "supports_tools": True,
767
+ },
768
+ "qwen/qwen2.5-vl-3b-instruct:free": {
769
+ "context": 32000,
770
+ "cost_input": 0.0,
771
+ "cost_output": 0.0,
772
+ "supports_vision": True,
773
+ "supports_tools": False,
774
+ "free": True,
775
+ },
776
+ # X.AI Grok Models
777
+ "x-ai/grok-4.1-fast": {
778
+ "context": 1800000,
779
+ "cost_input": 5.0,
780
+ "cost_output": 15.0,
781
+ "supports_vision": True,
782
+ "supports_tools": True,
783
+ },
784
+ "x-ai/grok-beta": {
785
+ "context": 131072,
786
+ "cost_input": 5.0,
787
+ "cost_output": 15.0,
788
+ "supports_vision": False,
789
+ "supports_tools": True,
790
+ },
791
+ # NVIDIA Models
792
+ "nvidia/llama-3.1-nemotron-nano-8b-v1:free": {
793
+ "context": 128000,
794
+ "cost_input": 0.0,
795
+ "cost_output": 0.0,
796
+ "supports_vision": False,
797
+ "supports_tools": True,
798
+ "free": True,
799
+ },
800
+ "nvidia/nemotron-nano-2-vl:free": {
801
+ "context": 128000,
802
+ "cost_input": 0.0,
803
+ "cost_output": 0.0,
804
+ "supports_vision": True,
805
+ "supports_tools": False,
806
+ "free": True,
807
+ },
808
+ # Moonshot AI Models
809
+ "moonshotai/kimi-vl-a3b-thinking:free": {
810
+ "context": 128000,
811
+ "cost_input": 0.0,
812
+ "cost_output": 0.0,
813
+ "supports_vision": True,
814
+ "supports_tools": False,
815
+ "reasoning_model": True,
816
+ "free": True,
817
+ },
818
+ # Zhipu AI (GLM) Models
819
+ "zhipuai/glm-4.5-air:free": {
820
+ "context": 128000,
821
+ "cost_input": 0.0,
822
+ "cost_output": 0.0,
823
+ "supports_vision": False,
824
+ "supports_tools": True,
825
+ "free": True,
826
+ },
827
+ "zhipuai/glm-4-32b": {
828
+ "context": 128000,
829
+ "cost_input": 0.50,
830
+ "cost_output": 0.50,
831
+ "supports_vision": False,
832
+ "supports_tools": True,
833
+ },
834
+ # Nous Research Models
835
+ "nousresearch/deephermes-3-llama-3-8b-preview:free": {
836
+ "context": 8192,
837
+ "cost_input": 0.0,
838
+ "cost_output": 0.0,
839
+ "supports_vision": False,
840
+ "supports_tools": False,
841
+ "free": True,
842
+ },
843
+ # Arcee Models
844
+ "arcee/trinity-large-preview:free": {
845
+ "context": 128000,
846
+ "cost_input": 0.0,
847
+ "cost_output": 0.0,
848
+ "supports_vision": False,
849
+ "supports_tools": True,
850
+ "free": True,
851
+ },
852
+ # OpenRouter Native Models
853
+ "openrouter/optimus-alpha": {
854
+ "context": 128000,
855
+ "cost_input": 0.0,
856
+ "cost_output": 0.0,
857
+ "supports_vision": False,
858
+ "supports_tools": True,
859
+ "free": True,
860
+ },
861
+ "openrouter/quasar-alpha": {
862
+ "context": 128000,
863
+ "cost_input": 0.0,
864
+ "cost_output": 0.0,
865
+ "supports_vision": False,
866
+ "supports_tools": True,
867
+ "free": True,
868
+ },
869
+ }
870
+
871
+ # Ollama Model Catalog (Local models)
872
+ OLLAMA_MODELS: Dict[str, Dict[str, Any]] = {
873
+ "llama3.2": {
874
+ "context": 128000,
875
+ "cost_input": 0.0,
876
+ "cost_output": 0.0,
877
+ "supports_vision": False,
878
+ "supports_tools": False,
879
+ },
880
+ "mistral": {
881
+ "context": 32768,
882
+ "cost_input": 0.0,
883
+ "cost_output": 0.0,
884
+ "supports_vision": False,
885
+ "supports_tools": False,
886
+ },
887
+ "codellama": {
888
+ "context": 16384,
889
+ "cost_input": 0.0,
890
+ "cost_output": 0.0,
891
+ "supports_vision": False,
892
+ "supports_tools": False,
893
+ },
894
+ }
895
+
896
+ # AWS Bedrock Model Catalog (Native SDK)
897
+ BEDROCK_MODELS: Dict[str, Dict[str, Any]] = {
898
+ # Anthropic Claude 3.5 Models
899
+ "anthropic.claude-3-5-sonnet-20241022-v2:0": {
900
+ "context": 200000,
901
+ "cost_input": 3.0,
902
+ "cost_output": 15.0,
903
+ "supports_vision": True,
904
+ "supports_tools": True,
905
+ "supports_caching": False, # Bedrock doesn't support prompt caching yet
906
+ },
907
+ "anthropic.claude-3-5-haiku-20241022-v1:0": {
908
+ "context": 200000,
909
+ "cost_input": 1.0,
910
+ "cost_output": 5.0,
911
+ "supports_vision": True,
912
+ "supports_tools": True,
913
+ "supports_caching": False,
914
+ },
915
+ # Anthropic Claude 3 Models
916
+ "anthropic.claude-3-opus-20240229-v1:0": {
917
+ "context": 200000,
918
+ "cost_input": 15.0,
919
+ "cost_output": 75.0,
920
+ "supports_vision": True,
921
+ "supports_tools": True,
922
+ "supports_caching": False,
923
+ },
924
+ "anthropic.claude-3-sonnet-20240229-v1:0": {
925
+ "context": 200000,
926
+ "cost_input": 3.0,
927
+ "cost_output": 15.0,
928
+ "supports_vision": True,
929
+ "supports_tools": True,
930
+ "supports_caching": False,
931
+ },
932
+ "anthropic.claude-3-haiku-20240307-v1:0": {
933
+ "context": 200000,
934
+ "cost_input": 0.25,
935
+ "cost_output": 1.25,
936
+ "supports_vision": True,
937
+ "supports_tools": True,
938
+ "supports_caching": False,
939
+ },
940
+ # Meta Llama Models
941
+ "meta.llama3-3-70b-instruct-v1:0": {
942
+ "context": 128000,
943
+ "cost_input": 0.99,
944
+ "cost_output": 0.99,
945
+ "supports_vision": False,
946
+ "supports_tools": False,
947
+ },
948
+ "meta.llama3-2-90b-instruct-v1:0": {
949
+ "context": 128000,
950
+ "cost_input": 1.20,
951
+ "cost_output": 1.20,
952
+ "supports_vision": False,
953
+ "supports_tools": False,
954
+ },
955
+ "meta.llama3-1-70b-instruct-v1:0": {
956
+ "context": 128000,
957
+ "cost_input": 0.99,
958
+ "cost_output": 0.99,
959
+ "supports_vision": False,
960
+ "supports_tools": False,
961
+ },
962
+ "meta.llama3-1-8b-instruct-v1:0": {
963
+ "context": 128000,
964
+ "cost_input": 0.22,
965
+ "cost_output": 0.22,
966
+ "supports_vision": False,
967
+ "supports_tools": False,
968
+ },
969
+ # Mistral AI Models
970
+ "mistral.mistral-large-2402-v1:0": {
971
+ "context": 128000,
972
+ "cost_input": 3.0,
973
+ "cost_output": 9.0,
974
+ "supports_vision": False,
975
+ "supports_tools": True,
976
+ },
977
+ "mistral.mistral-small-2402-v1:0": {
978
+ "context": 32000,
979
+ "cost_input": 1.0,
980
+ "cost_output": 3.0,
981
+ "supports_vision": False,
982
+ "supports_tools": True,
983
+ },
984
+ # Amazon Nova Models (current generation)
985
+ "amazon.nova-pro-v1:0": {
986
+ "context": 300000,
987
+ "cost_input": 0.80,
988
+ "cost_output": 3.20,
989
+ "supports_vision": True,
990
+ "supports_tools": False,
991
+ },
992
+ "amazon.nova-lite-v1:0": {
993
+ "context": 300000,
994
+ "cost_input": 0.06,
995
+ "cost_output": 0.24,
996
+ "supports_vision": True,
997
+ "supports_tools": False,
998
+ },
999
+ "amazon.nova-micro-v1:0": {
1000
+ "context": 128000,
1001
+ "cost_input": 0.035,
1002
+ "cost_output": 0.14,
1003
+ "supports_vision": False,
1004
+ "supports_tools": False,
1005
+ },
1006
+ # Cohere Models
1007
+ "cohere.command-r-plus-v1:0": {
1008
+ "context": 128000,
1009
+ "cost_input": 3.0,
1010
+ "cost_output": 15.0,
1011
+ "supports_vision": False,
1012
+ "supports_tools": True,
1013
+ },
1014
+ "cohere.command-r-v1:0": {
1015
+ "context": 128000,
1016
+ "cost_input": 0.50,
1017
+ "cost_output": 1.50,
1018
+ "supports_vision": False,
1019
+ "supports_tools": True,
1020
+ },
1021
+ }
1022
+
1023
+ # =============================================================================
1024
+ # CURATED INTERACTIVE MODELS (validated at runtime)
1025
+ # These provide the best balance of quality, cost, and availability for each provider
1026
+ # =============================================================================
1027
+
1028
+ # OpenAI - 5 curated models
1029
+ INTERACTIVE_OPENAI_MODELS: Dict[str, Dict[str, Any]] = {
1030
+ "gpt-4o": {
1031
+ "display_name": "GPT-4o",
1032
+ "description": "Best quality, vision/tools support",
1033
+ "category": "Current Models",
1034
+ },
1035
+ "gpt-4o-mini": {
1036
+ "display_name": "GPT-4o Mini",
1037
+ "description": "BEST VALUE - fast & affordable",
1038
+ "category": "Current Models",
1039
+ },
1040
+ "o3-mini": {
1041
+ "display_name": "o3-mini",
1042
+ "description": "Cost-effective reasoning",
1043
+ "category": "Reasoning Models",
1044
+ },
1045
+ "o1": {
1046
+ "display_name": "o1",
1047
+ "description": "Premium reasoning model",
1048
+ "category": "Reasoning Models",
1049
+ },
1050
+ "gpt-4-turbo": {
1051
+ "display_name": "GPT-4 Turbo",
1052
+ "description": "Legacy flagship, vision support",
1053
+ "category": "Legacy Models",
1054
+ },
1055
+ }
1056
+
1057
+ # Anthropic - 5 curated models
1058
+ INTERACTIVE_ANTHROPIC_MODELS: Dict[str, Dict[str, Any]] = {
1059
+ "claude-sonnet-4-5": {
1060
+ "display_name": "Claude Sonnet 4.5",
1061
+ "description": "Latest flagship, best balance",
1062
+ "category": "Claude 4.5 (Latest)",
1063
+ },
1064
+ "claude-haiku-4-5": {
1065
+ "display_name": "Claude Haiku 4.5",
1066
+ "description": "Fast & affordable",
1067
+ "category": "Claude 4.5 (Latest)",
1068
+ },
1069
+ "claude-opus-4-5": {
1070
+ "display_name": "Claude Opus 4.5",
1071
+ "description": "Premium quality, 1M context",
1072
+ "category": "Claude 4.5 (Latest)",
1073
+ },
1074
+ "claude-3-5-sonnet-20241022": {
1075
+ "display_name": "Claude 3.5 Sonnet",
1076
+ "description": "Proven stable, vision/tools",
1077
+ "category": "Claude 3.5 (Stable)",
1078
+ },
1079
+ "claude-3-5-haiku-20241022": {
1080
+ "display_name": "Claude 3.5 Haiku",
1081
+ "description": "Budget option",
1082
+ "category": "Claude 3.5 (Stable)",
1083
+ },
1084
+ }
1085
+
1086
+ # Google - 3 curated models
1087
+ INTERACTIVE_GOOGLE_MODELS: Dict[str, Dict[str, Any]] = {
1088
+ "gemini-2.5-pro": {
1089
+ "display_name": "Gemini 2.5 Pro",
1090
+ "description": "Best quality, 1M context",
1091
+ "category": "Gemini 2.5",
1092
+ },
1093
+ "gemini-2.5-flash": {
1094
+ "display_name": "Gemini 2.5 Flash",
1095
+ "description": "BEST VALUE - fast & cheap",
1096
+ "category": "Gemini 2.5",
1097
+ },
1098
+ "gemini-2.5-flash-lite": {
1099
+ "display_name": "Gemini 2.5 Flash Lite",
1100
+ "description": "FREE tier option",
1101
+ "category": "Gemini 2.5",
1102
+ },
1103
+ }
1104
+
1105
+ # DeepSeek - 2 curated models
1106
+ INTERACTIVE_DEEPSEEK_MODELS: Dict[str, Dict[str, Any]] = {
1107
+ "deepseek-chat": {
1108
+ "display_name": "DeepSeek Chat",
1109
+ "description": "General purpose, tools support",
1110
+ "category": "DeepSeek",
1111
+ },
1112
+ "deepseek-reasoner": {
1113
+ "display_name": "DeepSeek Reasoner",
1114
+ "description": "Reasoning model (R1)",
1115
+ "category": "DeepSeek",
1116
+ },
1117
+ }
1118
+
1119
+ # Groq - 4 curated models
1120
+ INTERACTIVE_GROQ_MODELS: Dict[str, Dict[str, Any]] = {
1121
+ "llama-3.3-70b-versatile": {
1122
+ "display_name": "Llama 3.3 70B",
1123
+ "description": "Best quality open model",
1124
+ "category": "Llama Models",
1125
+ },
1126
+ "llama-3.1-8b-instant": {
1127
+ "display_name": "Llama 3.1 8B",
1128
+ "description": "FASTEST - ultra low latency",
1129
+ "category": "Llama Models",
1130
+ },
1131
+ "openai/gpt-oss-120b": {
1132
+ "display_name": "GPT-OSS 120B",
1133
+ "description": "OpenAI open-weight reasoning",
1134
+ "category": "Reasoning Models",
1135
+ },
1136
+ "groq/compound": {
1137
+ "display_name": "Compound AI",
1138
+ "description": "Multi-model system",
1139
+ "category": "Groq Native",
1140
+ },
1141
+ }
1142
+
1143
+ # Grok (X.AI) - 1 curated model
1144
+ INTERACTIVE_GROK_MODELS: Dict[str, Dict[str, Any]] = {
1145
+ "grok-beta": {
1146
+ "display_name": "Grok Beta",
1147
+ "description": "X.AI flagship model",
1148
+ "category": "Grok",
1149
+ },
1150
+ }
1151
+
1152
+ # OpenRouter - 7 curated models (mix of free and paid)
1153
+ INTERACTIVE_OPENROUTER_MODELS: Dict[str, Dict[str, Any]] = {
1154
+ "anthropic/claude-sonnet-4-5": {
1155
+ "display_name": "Claude Sonnet 4.5",
1156
+ "description": "Best Anthropic model",
1157
+ "category": "Premium Models",
1158
+ },
1159
+ "openai/gpt-4o": {
1160
+ "display_name": "GPT-4o",
1161
+ "description": "Best OpenAI model",
1162
+ "category": "Premium Models",
1163
+ },
1164
+ "google/gemini-2.5-flash": {
1165
+ "display_name": "Gemini 2.5 Flash",
1166
+ "description": "Best value option",
1167
+ "category": "Premium Models",
1168
+ },
1169
+ "meta-llama/llama-3.3-70b-instruct:free": {
1170
+ "display_name": "Llama 3.3 70B",
1171
+ "description": "FREE - best open model",
1172
+ "category": "Free Models",
1173
+ },
1174
+ "deepseek/deepseek-chat-v3-0324:free": {
1175
+ "display_name": "DeepSeek V3",
1176
+ "description": "FREE - excellent quality",
1177
+ "category": "Free Models",
1178
+ },
1179
+ "deepseek/deepseek-r1": {
1180
+ "display_name": "DeepSeek R1",
1181
+ "description": "Reasoning model",
1182
+ "category": "Reasoning Models",
1183
+ },
1184
+ "mistralai/mistral-large-3": {
1185
+ "display_name": "Mistral Large 3",
1186
+ "description": "European alternative",
1187
+ "category": "Premium Models",
1188
+ },
1189
+ }
1190
+
1191
+ # Ollama - 3 curated models (local)
1192
+ INTERACTIVE_OLLAMA_MODELS: Dict[str, Dict[str, Any]] = {
1193
+ "llama3.2": {
1194
+ "display_name": "Llama 3.2",
1195
+ "description": "Best local model",
1196
+ "category": "Local Models",
1197
+ },
1198
+ "mistral": {
1199
+ "display_name": "Mistral",
1200
+ "description": "Fast & efficient",
1201
+ "category": "Local Models",
1202
+ },
1203
+ "codellama": {
1204
+ "display_name": "Code Llama",
1205
+ "description": "Code specialist",
1206
+ "category": "Local Models",
1207
+ },
1208
+ }
1209
+
1210
+ # Bedrock - 5 curated models
1211
+ INTERACTIVE_BEDROCK_MODELS: Dict[str, Dict[str, Any]] = {
1212
+ "anthropic.claude-3-sonnet-20240229-v1:0": {
1213
+ "display_name": "Claude 3 Sonnet",
1214
+ "description": "High quality, vision/tools",
1215
+ "category": "Anthropic Claude 3",
1216
+ },
1217
+ "anthropic.claude-3-haiku-20240307-v1:0": {
1218
+ "display_name": "Claude 3 Haiku",
1219
+ "description": "Fast & cheap Claude",
1220
+ "category": "Anthropic Claude 3",
1221
+ },
1222
+ "amazon.nova-pro-v1:0": {
1223
+ "display_name": "Nova Pro",
1224
+ "description": "Best Nova quality, vision",
1225
+ "category": "Amazon Nova",
1226
+ },
1227
+ "amazon.nova-lite-v1:0": {
1228
+ "display_name": "Nova Lite",
1229
+ "description": "BEST VALUE - 96% cheaper",
1230
+ "category": "Amazon Nova",
1231
+ },
1232
+ "amazon.nova-micro-v1:0": {
1233
+ "display_name": "Nova Micro",
1234
+ "description": "FASTEST/CHEAPEST",
1235
+ "category": "Amazon Nova",
1236
+ },
1237
+ }
1238
+
1239
+ # Unified model catalog
1240
+ MODEL_CATALOG: Dict[str, Dict[str, Dict[str, Any]]] = {
1241
+ "openai": OPENAI_MODELS,
1242
+ "anthropic": ANTHROPIC_MODELS,
1243
+ "google": GOOGLE_MODELS,
1244
+ "deepseek": DEEPSEEK_MODELS,
1245
+ "groq": GROQ_MODELS,
1246
+ "grok": GROK_MODELS,
1247
+ "openrouter": OPENROUTER_MODELS,
1248
+ "ollama": OLLAMA_MODELS,
1249
+ "bedrock": BEDROCK_MODELS,
1250
+ }
1251
+
1252
+ # Provider base URLs for OpenAI-compatible providers
1253
+ PROVIDER_BASE_URLS: Dict[str, str] = {
1254
+ "google": "https://generativelanguage.googleapis.com/v1beta/openai/",
1255
+ "deepseek": "https://api.deepseek.com/v1",
1256
+ "groq": "https://api.groq.com/openai/v1",
1257
+ "grok": "https://api.x.ai/v1",
1258
+ "openrouter": "https://openrouter.ai/api/v1",
1259
+ "ollama": "http://localhost:11434/v1",
1260
+ }
1261
+
1262
+ # Environment variable names for API keys
1263
+ PROVIDER_ENV_VARS: Dict[str, str] = {
1264
+ "openai": "OPENAI_API_KEY",
1265
+ "anthropic": "ANTHROPIC_API_KEY",
1266
+ "google": "GOOGLE_API_KEY",
1267
+ "deepseek": "DEEPSEEK_API_KEY",
1268
+ "groq": "GROQ_API_KEY",
1269
+ "grok": "GROK_API_KEY",
1270
+ "openrouter": "OPENROUTER_API_KEY",
1271
+ "ollama": "OLLAMA_API_KEY",
1272
+ "bedrock": "AWS_ACCESS_KEY_ID", # AWS credentials (also uses AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN)
1273
+ }