@agentick/shared 0.0.1

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 (85) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +322 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/.tsbuildinfo.build +1 -0
  5. package/dist/block-types.d.ts +85 -0
  6. package/dist/block-types.d.ts.map +1 -0
  7. package/dist/block-types.js +98 -0
  8. package/dist/block-types.js.map +1 -0
  9. package/dist/blocks.d.ts +396 -0
  10. package/dist/blocks.d.ts.map +1 -0
  11. package/dist/blocks.js +209 -0
  12. package/dist/blocks.js.map +1 -0
  13. package/dist/devtools.d.ts +672 -0
  14. package/dist/devtools.d.ts.map +1 -0
  15. package/dist/devtools.js +445 -0
  16. package/dist/devtools.js.map +1 -0
  17. package/dist/errors.d.ts +335 -0
  18. package/dist/errors.d.ts.map +1 -0
  19. package/dist/errors.js +529 -0
  20. package/dist/errors.js.map +1 -0
  21. package/dist/identity.d.ts +99 -0
  22. package/dist/identity.d.ts.map +1 -0
  23. package/dist/identity.js +116 -0
  24. package/dist/identity.js.map +1 -0
  25. package/dist/index.d.ts +56 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +56 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/input.d.ts +55 -0
  30. package/dist/input.d.ts.map +1 -0
  31. package/dist/input.js +83 -0
  32. package/dist/input.js.map +1 -0
  33. package/dist/messages.d.ts +98 -0
  34. package/dist/messages.d.ts.map +1 -0
  35. package/dist/messages.js +81 -0
  36. package/dist/messages.js.map +1 -0
  37. package/dist/model-catalog.d.ts +144 -0
  38. package/dist/model-catalog.d.ts.map +1 -0
  39. package/dist/model-catalog.js +861 -0
  40. package/dist/model-catalog.js.map +1 -0
  41. package/dist/models.d.ts +173 -0
  42. package/dist/models.d.ts.map +1 -0
  43. package/dist/models.js +10 -0
  44. package/dist/models.js.map +1 -0
  45. package/dist/protocol.d.ts +257 -0
  46. package/dist/protocol.d.ts.map +1 -0
  47. package/dist/protocol.js +41 -0
  48. package/dist/protocol.js.map +1 -0
  49. package/dist/streaming.d.ts +635 -0
  50. package/dist/streaming.d.ts.map +1 -0
  51. package/dist/streaming.js +134 -0
  52. package/dist/streaming.js.map +1 -0
  53. package/dist/testing/fixtures.d.ts +250 -0
  54. package/dist/testing/fixtures.d.ts.map +1 -0
  55. package/dist/testing/fixtures.js +827 -0
  56. package/dist/testing/fixtures.js.map +1 -0
  57. package/dist/testing/helpers.d.ts +95 -0
  58. package/dist/testing/helpers.d.ts.map +1 -0
  59. package/dist/testing/helpers.js +271 -0
  60. package/dist/testing/helpers.js.map +1 -0
  61. package/dist/testing/index.d.ts +42 -0
  62. package/dist/testing/index.d.ts.map +1 -0
  63. package/dist/testing/index.js +70 -0
  64. package/dist/testing/index.js.map +1 -0
  65. package/dist/timeline.d.ts +59 -0
  66. package/dist/timeline.d.ts.map +1 -0
  67. package/dist/timeline.js +11 -0
  68. package/dist/timeline.js.map +1 -0
  69. package/dist/tools.d.ts +220 -0
  70. package/dist/tools.d.ts.map +1 -0
  71. package/dist/tools.js +63 -0
  72. package/dist/tools.js.map +1 -0
  73. package/dist/utils/entity-ids.d.ts +26 -0
  74. package/dist/utils/entity-ids.d.ts.map +1 -0
  75. package/dist/utils/entity-ids.js +44 -0
  76. package/dist/utils/entity-ids.js.map +1 -0
  77. package/dist/utils/index.d.ts +3 -0
  78. package/dist/utils/index.d.ts.map +1 -0
  79. package/dist/utils/index.js +3 -0
  80. package/dist/utils/index.js.map +1 -0
  81. package/dist/utils/merge-deep.d.ts +10 -0
  82. package/dist/utils/merge-deep.d.ts.map +1 -0
  83. package/dist/utils/merge-deep.js +33 -0
  84. package/dist/utils/merge-deep.js.map +1 -0
  85. package/package.json +84 -0
@@ -0,0 +1,861 @@
1
+ /**
2
+ * Model Catalog
3
+ *
4
+ * Reference data for known models including context windows and capabilities.
5
+ * This is a best-effort catalog - actual limits may change.
6
+ *
7
+ * Architecture:
8
+ * - MODEL_CATALOG is static reference data (defaults)
9
+ * - Adapters are source of truth and can override via ModelMetadata
10
+ * - Runtime additions via registerModel() for dynamic discovery
11
+ * - Lookup order: runtime > static catalog
12
+ *
13
+ * Sources (as of February 2026):
14
+ * - Anthropic: https://platform.claude.com/docs/en/about-claude/models/overview
15
+ * - OpenAI: https://platform.openai.com/docs/models
16
+ * - Google: https://ai.google.dev/gemini-api/docs/models
17
+ * - Mistral: https://mistral.ai/models
18
+ * - Meta: https://www.llama.com/models/llama-4/
19
+ */
20
+ /**
21
+ * Runtime model registry for dynamic additions.
22
+ * Takes precedence over MODEL_CATALOG.
23
+ */
24
+ const runtimeRegistry = new Map();
25
+ /**
26
+ * Register a model at runtime.
27
+ * Use this for models discovered dynamically or provided by adapters.
28
+ *
29
+ * @param modelId - The model ID
30
+ * @param info - Model information
31
+ */
32
+ export function registerModel(modelId, info) {
33
+ runtimeRegistry.set(modelId.toLowerCase(), info);
34
+ }
35
+ /**
36
+ * Register multiple models at once.
37
+ *
38
+ * @param models - Map of model ID to model info
39
+ */
40
+ export function registerModels(models) {
41
+ for (const [id, info] of Object.entries(models)) {
42
+ registerModel(id, info);
43
+ }
44
+ }
45
+ /**
46
+ * Clear all runtime-registered models.
47
+ * Primarily for testing.
48
+ */
49
+ export function clearRuntimeModels() {
50
+ runtimeRegistry.clear();
51
+ }
52
+ /**
53
+ * Get all runtime-registered models.
54
+ */
55
+ export function getRuntimeModels() {
56
+ return new Map(runtimeRegistry);
57
+ }
58
+ /**
59
+ * Known model context windows and capabilities.
60
+ *
61
+ * Keys are model IDs (case-insensitive matching recommended).
62
+ * Includes common aliases and versioned names.
63
+ *
64
+ * Last updated: February 2026
65
+ */
66
+ export const MODEL_CATALOG = {
67
+ // ════════════════════════════════════════════════════════════════════════════
68
+ // Anthropic Claude Models
69
+ // https://platform.claude.com/docs/en/about-claude/models/overview
70
+ // ════════════════════════════════════════════════════════════════════════════
71
+ // Claude 4 Series (2025)
72
+ "claude-opus-4-20250514": {
73
+ name: "Claude Opus 4",
74
+ provider: "anthropic",
75
+ contextWindow: 200000,
76
+ maxOutputTokens: 32000,
77
+ supportsVision: true,
78
+ supportsToolUse: true,
79
+ },
80
+ "claude-opus-4": {
81
+ name: "Claude Opus 4",
82
+ provider: "anthropic",
83
+ contextWindow: 200000,
84
+ maxOutputTokens: 32000,
85
+ supportsVision: true,
86
+ supportsToolUse: true,
87
+ },
88
+ "claude-opus-4-5-20251101": {
89
+ name: "Claude Opus 4.5",
90
+ provider: "anthropic",
91
+ contextWindow: 200000, // 1M available for tier 4+
92
+ maxOutputTokens: 32000,
93
+ supportsVision: true,
94
+ supportsToolUse: true,
95
+ },
96
+ "claude-opus-4.5": {
97
+ name: "Claude Opus 4.5",
98
+ provider: "anthropic",
99
+ contextWindow: 200000,
100
+ maxOutputTokens: 32000,
101
+ supportsVision: true,
102
+ supportsToolUse: true,
103
+ },
104
+ "claude-sonnet-4-20250514": {
105
+ name: "Claude Sonnet 4",
106
+ provider: "anthropic",
107
+ contextWindow: 200000, // 1M available for tier 4+
108
+ maxOutputTokens: 16384,
109
+ supportsVision: true,
110
+ supportsToolUse: true,
111
+ },
112
+ "claude-sonnet-4": {
113
+ name: "Claude Sonnet 4",
114
+ provider: "anthropic",
115
+ contextWindow: 200000,
116
+ maxOutputTokens: 16384,
117
+ supportsVision: true,
118
+ supportsToolUse: true,
119
+ },
120
+ // Claude 3.5 Series
121
+ "claude-3-5-sonnet-20241022": {
122
+ name: "Claude 3.5 Sonnet",
123
+ provider: "anthropic",
124
+ contextWindow: 200000,
125
+ maxOutputTokens: 8192,
126
+ supportsVision: true,
127
+ supportsToolUse: true,
128
+ },
129
+ "claude-3-5-sonnet-latest": {
130
+ name: "Claude 3.5 Sonnet",
131
+ provider: "anthropic",
132
+ contextWindow: 200000,
133
+ maxOutputTokens: 8192,
134
+ supportsVision: true,
135
+ supportsToolUse: true,
136
+ },
137
+ "claude-3-5-sonnet": {
138
+ name: "Claude 3.5 Sonnet",
139
+ provider: "anthropic",
140
+ contextWindow: 200000,
141
+ maxOutputTokens: 8192,
142
+ supportsVision: true,
143
+ supportsToolUse: true,
144
+ },
145
+ "claude-3-5-haiku-20241022": {
146
+ name: "Claude 3.5 Haiku",
147
+ provider: "anthropic",
148
+ contextWindow: 200000,
149
+ maxOutputTokens: 8192,
150
+ supportsVision: true,
151
+ supportsToolUse: true,
152
+ },
153
+ "claude-3-5-haiku-latest": {
154
+ name: "Claude 3.5 Haiku",
155
+ provider: "anthropic",
156
+ contextWindow: 200000,
157
+ maxOutputTokens: 8192,
158
+ supportsVision: true,
159
+ supportsToolUse: true,
160
+ },
161
+ // Claude 3 Series (legacy)
162
+ "claude-3-opus-20240229": {
163
+ name: "Claude 3 Opus",
164
+ provider: "anthropic",
165
+ contextWindow: 200000,
166
+ maxOutputTokens: 4096,
167
+ supportsVision: true,
168
+ supportsToolUse: true,
169
+ },
170
+ "claude-3-sonnet-20240229": {
171
+ name: "Claude 3 Sonnet",
172
+ provider: "anthropic",
173
+ contextWindow: 200000,
174
+ maxOutputTokens: 4096,
175
+ supportsVision: true,
176
+ supportsToolUse: true,
177
+ },
178
+ "claude-3-haiku-20240307": {
179
+ name: "Claude 3 Haiku",
180
+ provider: "anthropic",
181
+ contextWindow: 200000,
182
+ maxOutputTokens: 4096,
183
+ supportsVision: true,
184
+ supportsToolUse: true,
185
+ },
186
+ // ════════════════════════════════════════════════════════════════════════════
187
+ // OpenAI GPT Models
188
+ // https://platform.openai.com/docs/models
189
+ // ════════════════════════════════════════════════════════════════════════════
190
+ // GPT-5.2 "Garlic" (December 2025)
191
+ "gpt-5.2": {
192
+ name: "GPT-5.2",
193
+ provider: "openai",
194
+ contextWindow: 400000,
195
+ maxOutputTokens: 128000,
196
+ supportsVision: true,
197
+ supportsToolUse: true,
198
+ },
199
+ "gpt-5.2-turbo": {
200
+ name: "GPT-5.2 Turbo",
201
+ provider: "openai",
202
+ contextWindow: 400000,
203
+ maxOutputTokens: 128000,
204
+ supportsVision: true,
205
+ supportsToolUse: true,
206
+ },
207
+ // GPT-5
208
+ "gpt-5": {
209
+ name: "GPT-5",
210
+ provider: "openai",
211
+ contextWindow: 400000,
212
+ maxOutputTokens: 32768,
213
+ supportsVision: true,
214
+ supportsToolUse: true,
215
+ },
216
+ // GPT-4.1 (1M context)
217
+ "gpt-4.1": {
218
+ name: "GPT-4.1",
219
+ provider: "openai",
220
+ contextWindow: 1047576, // ~1M
221
+ maxOutputTokens: 32768,
222
+ supportsVision: true,
223
+ supportsToolUse: true,
224
+ },
225
+ "gpt-4.1-mini": {
226
+ name: "GPT-4.1 Mini",
227
+ provider: "openai",
228
+ contextWindow: 1047576,
229
+ maxOutputTokens: 16384,
230
+ supportsVision: true,
231
+ supportsToolUse: true,
232
+ },
233
+ // GPT-4o
234
+ "gpt-4o": {
235
+ name: "GPT-4o",
236
+ provider: "openai",
237
+ contextWindow: 128000,
238
+ maxOutputTokens: 16384,
239
+ supportsVision: true,
240
+ supportsToolUse: true,
241
+ },
242
+ "gpt-4o-2024-11-20": {
243
+ name: "GPT-4o",
244
+ provider: "openai",
245
+ contextWindow: 128000,
246
+ maxOutputTokens: 16384,
247
+ supportsVision: true,
248
+ supportsToolUse: true,
249
+ },
250
+ "gpt-4o-2024-08-06": {
251
+ name: "GPT-4o",
252
+ provider: "openai",
253
+ contextWindow: 128000,
254
+ maxOutputTokens: 16384,
255
+ supportsVision: true,
256
+ supportsToolUse: true,
257
+ },
258
+ "gpt-4o-2024-05-13": {
259
+ name: "GPT-4o",
260
+ provider: "openai",
261
+ contextWindow: 128000,
262
+ maxOutputTokens: 4096,
263
+ supportsVision: true,
264
+ supportsToolUse: true,
265
+ },
266
+ // GPT-4o Mini
267
+ "gpt-4o-mini": {
268
+ name: "GPT-4o Mini",
269
+ provider: "openai",
270
+ contextWindow: 128000,
271
+ maxOutputTokens: 16384,
272
+ supportsVision: true,
273
+ supportsToolUse: true,
274
+ },
275
+ "gpt-4o-mini-2024-07-18": {
276
+ name: "GPT-4o Mini",
277
+ provider: "openai",
278
+ contextWindow: 128000,
279
+ maxOutputTokens: 16384,
280
+ supportsVision: true,
281
+ supportsToolUse: true,
282
+ },
283
+ // GPT-4 Turbo
284
+ "gpt-4-turbo": {
285
+ name: "GPT-4 Turbo",
286
+ provider: "openai",
287
+ contextWindow: 128000,
288
+ maxOutputTokens: 4096,
289
+ supportsVision: true,
290
+ supportsToolUse: true,
291
+ },
292
+ "gpt-4-turbo-2024-04-09": {
293
+ name: "GPT-4 Turbo",
294
+ provider: "openai",
295
+ contextWindow: 128000,
296
+ maxOutputTokens: 4096,
297
+ supportsVision: true,
298
+ supportsToolUse: true,
299
+ },
300
+ // GPT-4 (legacy)
301
+ "gpt-4": {
302
+ name: "GPT-4",
303
+ provider: "openai",
304
+ contextWindow: 8192,
305
+ maxOutputTokens: 4096,
306
+ supportsVision: false,
307
+ supportsToolUse: true,
308
+ },
309
+ "gpt-4-32k": {
310
+ name: "GPT-4 32K",
311
+ provider: "openai",
312
+ contextWindow: 32768,
313
+ maxOutputTokens: 4096,
314
+ supportsVision: false,
315
+ supportsToolUse: true,
316
+ },
317
+ // GPT-3.5 Turbo (legacy)
318
+ "gpt-3.5-turbo": {
319
+ name: "GPT-3.5 Turbo",
320
+ provider: "openai",
321
+ contextWindow: 16385,
322
+ maxOutputTokens: 4096,
323
+ supportsVision: false,
324
+ supportsToolUse: true,
325
+ },
326
+ // o-Series (Reasoning models)
327
+ o1: {
328
+ name: "o1",
329
+ provider: "openai",
330
+ contextWindow: 200000,
331
+ maxOutputTokens: 100000,
332
+ supportsVision: true,
333
+ supportsToolUse: true,
334
+ isReasoningModel: true,
335
+ },
336
+ "o1-2024-12-17": {
337
+ name: "o1",
338
+ provider: "openai",
339
+ contextWindow: 200000,
340
+ maxOutputTokens: 100000,
341
+ supportsVision: true,
342
+ supportsToolUse: true,
343
+ isReasoningModel: true,
344
+ },
345
+ "o1-preview": {
346
+ name: "o1 Preview",
347
+ provider: "openai",
348
+ contextWindow: 128000,
349
+ maxOutputTokens: 32768,
350
+ supportsVision: false,
351
+ supportsToolUse: false,
352
+ isReasoningModel: true,
353
+ },
354
+ "o1-mini": {
355
+ name: "o1 Mini",
356
+ provider: "openai",
357
+ contextWindow: 128000,
358
+ maxOutputTokens: 65536,
359
+ supportsVision: false,
360
+ supportsToolUse: false,
361
+ isReasoningModel: true,
362
+ },
363
+ "o3-mini": {
364
+ name: "o3 Mini",
365
+ provider: "openai",
366
+ contextWindow: 200000,
367
+ maxOutputTokens: 100000,
368
+ supportsVision: false,
369
+ supportsToolUse: true,
370
+ isReasoningModel: true,
371
+ },
372
+ // ════════════════════════════════════════════════════════════════════════════
373
+ // Google Gemini Models
374
+ // https://ai.google.dev/gemini-api/docs/models
375
+ // ════════════════════════════════════════════════════════════════════════════
376
+ // Gemini 3 (Latest - 2026)
377
+ "gemini-3-pro": {
378
+ name: "Gemini 3 Pro",
379
+ provider: "google",
380
+ contextWindow: 1000000, // 1M
381
+ maxOutputTokens: 65536,
382
+ supportsVision: true,
383
+ supportsToolUse: true,
384
+ },
385
+ "gemini-3-pro-latest": {
386
+ name: "Gemini 3 Pro",
387
+ provider: "google",
388
+ contextWindow: 1000000,
389
+ maxOutputTokens: 65536,
390
+ supportsVision: true,
391
+ supportsToolUse: true,
392
+ },
393
+ "gemini-3-flash": {
394
+ name: "Gemini 3 Flash",
395
+ provider: "google",
396
+ contextWindow: 200000,
397
+ maxOutputTokens: 32768,
398
+ supportsVision: true,
399
+ supportsToolUse: true,
400
+ },
401
+ "gemini-3-flash-latest": {
402
+ name: "Gemini 3 Flash",
403
+ provider: "google",
404
+ contextWindow: 200000,
405
+ maxOutputTokens: 32768,
406
+ supportsVision: true,
407
+ supportsToolUse: true,
408
+ },
409
+ // Gemini 2.5 Pro
410
+ "gemini-2.5-pro": {
411
+ name: "Gemini 2.5 Pro",
412
+ provider: "google",
413
+ contextWindow: 1000000,
414
+ maxOutputTokens: 65536,
415
+ supportsVision: true,
416
+ supportsToolUse: true,
417
+ },
418
+ "gemini-2.5-pro-latest": {
419
+ name: "Gemini 2.5 Pro",
420
+ provider: "google",
421
+ contextWindow: 1000000,
422
+ maxOutputTokens: 65536,
423
+ supportsVision: true,
424
+ supportsToolUse: true,
425
+ },
426
+ // Gemini 2.0 Flash (deprecated March 3, 2026)
427
+ "gemini-2.0-flash": {
428
+ name: "Gemini 2.0 Flash",
429
+ provider: "google",
430
+ contextWindow: 1048576,
431
+ maxOutputTokens: 8192,
432
+ supportsVision: true,
433
+ supportsToolUse: true,
434
+ },
435
+ "gemini-2.0-flash-exp": {
436
+ name: "Gemini 2.0 Flash Experimental",
437
+ provider: "google",
438
+ contextWindow: 1048576,
439
+ maxOutputTokens: 8192,
440
+ supportsVision: true,
441
+ supportsToolUse: true,
442
+ },
443
+ // Gemini 1.5 Pro (deprecated)
444
+ "gemini-1.5-pro": {
445
+ name: "Gemini 1.5 Pro",
446
+ provider: "google",
447
+ contextWindow: 2097152, // 2M
448
+ maxOutputTokens: 8192,
449
+ supportsVision: true,
450
+ supportsToolUse: true,
451
+ },
452
+ "gemini-1.5-pro-latest": {
453
+ name: "Gemini 1.5 Pro",
454
+ provider: "google",
455
+ contextWindow: 2097152,
456
+ maxOutputTokens: 8192,
457
+ supportsVision: true,
458
+ supportsToolUse: true,
459
+ },
460
+ // Gemini 1.5 Flash (deprecated)
461
+ "gemini-1.5-flash": {
462
+ name: "Gemini 1.5 Flash",
463
+ provider: "google",
464
+ contextWindow: 1048576,
465
+ maxOutputTokens: 8192,
466
+ supportsVision: true,
467
+ supportsToolUse: true,
468
+ },
469
+ "gemini-1.5-flash-latest": {
470
+ name: "Gemini 1.5 Flash",
471
+ provider: "google",
472
+ contextWindow: 1048576,
473
+ maxOutputTokens: 8192,
474
+ supportsVision: true,
475
+ supportsToolUse: true,
476
+ },
477
+ // ════════════════════════════════════════════════════════════════════════════
478
+ // Mistral AI Models
479
+ // https://mistral.ai/models
480
+ // ════════════════════════════════════════════════════════════════════════════
481
+ // Mistral Large 3 (December 2025)
482
+ "mistral-large-3": {
483
+ name: "Mistral Large 3",
484
+ provider: "mistral",
485
+ contextWindow: 256000,
486
+ maxOutputTokens: 8192,
487
+ supportsVision: true,
488
+ supportsToolUse: true,
489
+ },
490
+ "mistral-large-latest": {
491
+ name: "Mistral Large 3",
492
+ provider: "mistral",
493
+ contextWindow: 256000,
494
+ maxOutputTokens: 8192,
495
+ supportsVision: true,
496
+ supportsToolUse: true,
497
+ },
498
+ // Devstral 2 (December 2025)
499
+ "devstral-2": {
500
+ name: "Devstral 2",
501
+ provider: "mistral",
502
+ contextWindow: 256000,
503
+ maxOutputTokens: 8192,
504
+ supportsVision: false,
505
+ supportsToolUse: true,
506
+ },
507
+ "devstral-small-2": {
508
+ name: "Devstral Small 2",
509
+ provider: "mistral",
510
+ contextWindow: 256000,
511
+ maxOutputTokens: 8192,
512
+ supportsVision: false,
513
+ supportsToolUse: true,
514
+ },
515
+ // Mistral Small 3.1
516
+ "mistral-small-3.1": {
517
+ name: "Mistral Small 3.1",
518
+ provider: "mistral",
519
+ contextWindow: 128000,
520
+ maxOutputTokens: 8192,
521
+ supportsVision: true,
522
+ supportsToolUse: true,
523
+ },
524
+ "mistral-small-latest": {
525
+ name: "Mistral Small 3.1",
526
+ provider: "mistral",
527
+ contextWindow: 128000,
528
+ maxOutputTokens: 8192,
529
+ supportsVision: true,
530
+ supportsToolUse: true,
531
+ },
532
+ // Ministral 3 Family
533
+ "ministral-3-3b": {
534
+ name: "Ministral 3 3B",
535
+ provider: "mistral",
536
+ contextWindow: 128000,
537
+ maxOutputTokens: 4096,
538
+ supportsVision: false,
539
+ supportsToolUse: true,
540
+ },
541
+ "ministral-3-8b": {
542
+ name: "Ministral 3 8B",
543
+ provider: "mistral",
544
+ contextWindow: 128000,
545
+ maxOutputTokens: 4096,
546
+ supportsVision: false,
547
+ supportsToolUse: true,
548
+ },
549
+ "ministral-3-14b": {
550
+ name: "Ministral 3 14B",
551
+ provider: "mistral",
552
+ contextWindow: 256000,
553
+ maxOutputTokens: 4096,
554
+ supportsVision: false,
555
+ supportsToolUse: true,
556
+ },
557
+ // Codestral
558
+ codestral: {
559
+ name: "Codestral",
560
+ provider: "mistral",
561
+ contextWindow: 256000,
562
+ maxOutputTokens: 8192,
563
+ supportsVision: false,
564
+ supportsToolUse: true,
565
+ },
566
+ "codestral-latest": {
567
+ name: "Codestral",
568
+ provider: "mistral",
569
+ contextWindow: 256000,
570
+ maxOutputTokens: 8192,
571
+ supportsVision: false,
572
+ supportsToolUse: true,
573
+ },
574
+ // Legacy models
575
+ "mistral-large-2": {
576
+ name: "Mistral Large 2",
577
+ provider: "mistral",
578
+ contextWindow: 128000,
579
+ maxOutputTokens: 4096,
580
+ supportsVision: false,
581
+ supportsToolUse: true,
582
+ },
583
+ "mistral-medium": {
584
+ name: "Mistral Medium",
585
+ provider: "mistral",
586
+ contextWindow: 32768,
587
+ maxOutputTokens: 4096,
588
+ supportsVision: false,
589
+ supportsToolUse: true,
590
+ },
591
+ "mistral-nemo": {
592
+ name: "Mistral NeMo",
593
+ provider: "mistral",
594
+ contextWindow: 128000,
595
+ maxOutputTokens: 4096,
596
+ supportsVision: false,
597
+ supportsToolUse: true,
598
+ },
599
+ "mixtral-8x7b": {
600
+ name: "Mixtral 8x7B",
601
+ provider: "mistral",
602
+ contextWindow: 32768,
603
+ maxOutputTokens: 4096,
604
+ supportsVision: false,
605
+ supportsToolUse: true,
606
+ },
607
+ // ════════════════════════════════════════════════════════════════════════════
608
+ // Meta Llama Models
609
+ // https://www.llama.com/models/llama-4/
610
+ // ════════════════════════════════════════════════════════════════════════════
611
+ // Llama 4 (2026)
612
+ "llama-4-scout": {
613
+ name: "Llama 4 Scout",
614
+ provider: "meta",
615
+ contextWindow: 10000000, // 10M tokens!
616
+ maxOutputTokens: 8192,
617
+ supportsVision: true,
618
+ supportsToolUse: true,
619
+ },
620
+ "llama-4-scout-17b-16e": {
621
+ name: "Llama 4 Scout 17B",
622
+ provider: "meta",
623
+ contextWindow: 10000000,
624
+ maxOutputTokens: 8192,
625
+ supportsVision: true,
626
+ supportsToolUse: true,
627
+ },
628
+ "llama-4-maverick": {
629
+ name: "Llama 4 Maverick",
630
+ provider: "meta",
631
+ contextWindow: 512000,
632
+ maxOutputTokens: 8192,
633
+ supportsVision: true,
634
+ supportsToolUse: true,
635
+ },
636
+ "llama-4-maverick-17b-128e": {
637
+ name: "Llama 4 Maverick",
638
+ provider: "meta",
639
+ contextWindow: 512000,
640
+ maxOutputTokens: 8192,
641
+ supportsVision: true,
642
+ supportsToolUse: true,
643
+ },
644
+ // Llama 3.1 (legacy)
645
+ "llama-3.1-405b": {
646
+ name: "Llama 3.1 405B",
647
+ provider: "meta",
648
+ contextWindow: 128000,
649
+ maxOutputTokens: 4096,
650
+ supportsVision: false,
651
+ supportsToolUse: true,
652
+ },
653
+ "llama-3.1-70b": {
654
+ name: "Llama 3.1 70B",
655
+ provider: "meta",
656
+ contextWindow: 128000,
657
+ maxOutputTokens: 4096,
658
+ supportsVision: false,
659
+ supportsToolUse: true,
660
+ },
661
+ "llama-3.1-8b": {
662
+ name: "Llama 3.1 8B",
663
+ provider: "meta",
664
+ contextWindow: 128000,
665
+ maxOutputTokens: 4096,
666
+ supportsVision: false,
667
+ supportsToolUse: true,
668
+ },
669
+ // ════════════════════════════════════════════════════════════════════════════
670
+ // DeepSeek Models
671
+ // ════════════════════════════════════════════════════════════════════════════
672
+ "deepseek-chat": {
673
+ name: "DeepSeek Chat",
674
+ provider: "deepseek",
675
+ contextWindow: 64000,
676
+ maxOutputTokens: 8192,
677
+ supportsVision: false,
678
+ supportsToolUse: true,
679
+ },
680
+ "deepseek-coder": {
681
+ name: "DeepSeek Coder",
682
+ provider: "deepseek",
683
+ contextWindow: 64000,
684
+ maxOutputTokens: 8192,
685
+ supportsVision: false,
686
+ supportsToolUse: true,
687
+ },
688
+ "deepseek-reasoner": {
689
+ name: "DeepSeek Reasoner",
690
+ provider: "deepseek",
691
+ contextWindow: 64000,
692
+ maxOutputTokens: 8192,
693
+ supportsVision: false,
694
+ supportsToolUse: true,
695
+ isReasoningModel: true,
696
+ },
697
+ };
698
+ /**
699
+ * Get model info by ID.
700
+ * Checks runtime registry first, then static catalog.
701
+ * Uses case-insensitive and partial matching.
702
+ *
703
+ * @param modelId - The model ID to look up
704
+ * @returns Model info or undefined if not found
705
+ */
706
+ export function getModelInfo(modelId) {
707
+ const lowerModelId = modelId.toLowerCase();
708
+ // Check runtime registry first (exact match)
709
+ if (runtimeRegistry.has(lowerModelId)) {
710
+ return runtimeRegistry.get(lowerModelId);
711
+ }
712
+ // Check runtime registry (partial match)
713
+ for (const [key, value] of runtimeRegistry) {
714
+ if (lowerModelId.startsWith(key) || key.startsWith(lowerModelId)) {
715
+ return value;
716
+ }
717
+ }
718
+ // Try exact match in static catalog
719
+ if (MODEL_CATALOG[modelId]) {
720
+ return MODEL_CATALOG[modelId];
721
+ }
722
+ // Try lowercase match in static catalog
723
+ for (const [key, value] of Object.entries(MODEL_CATALOG)) {
724
+ if (key.toLowerCase() === lowerModelId) {
725
+ return value;
726
+ }
727
+ }
728
+ // Try partial match in static catalog (for versioned model names)
729
+ for (const [key, value] of Object.entries(MODEL_CATALOG)) {
730
+ if (lowerModelId.startsWith(key.toLowerCase()) || key.toLowerCase().startsWith(lowerModelId)) {
731
+ return value;
732
+ }
733
+ }
734
+ return undefined;
735
+ }
736
+ /**
737
+ * Get the context window size for a model.
738
+ *
739
+ * @param modelId - The model ID
740
+ * @returns Context window in tokens, or undefined if unknown
741
+ */
742
+ export function getContextWindow(modelId) {
743
+ return getModelInfo(modelId)?.contextWindow;
744
+ }
745
+ /**
746
+ * Calculate context utilization percentage.
747
+ *
748
+ * @param modelId - The model ID
749
+ * @param usedTokens - Number of tokens used
750
+ * @returns Utilization percentage (0-100), or undefined if model not found
751
+ */
752
+ export function getContextUtilization(modelId, usedTokens) {
753
+ const contextWindow = getContextWindow(modelId);
754
+ if (!contextWindow)
755
+ return undefined;
756
+ return Math.min(100, (usedTokens / contextWindow) * 100);
757
+ }
758
+ /**
759
+ * Format context window for display.
760
+ *
761
+ * @param tokens - Number of tokens
762
+ * @returns Formatted string like "128K" or "1M" or "10M"
763
+ */
764
+ export function formatContextWindow(tokens) {
765
+ if (tokens >= 1000000) {
766
+ const millions = tokens / 1000000;
767
+ return millions % 1 === 0 ? `${millions}M` : `${millions.toFixed(1)}M`;
768
+ }
769
+ if (tokens >= 1000) {
770
+ const thousands = tokens / 1000;
771
+ return thousands % 1 === 0 ? `${thousands}K` : `${thousands.toFixed(1)}K`;
772
+ }
773
+ return tokens.toString();
774
+ }
775
+ /**
776
+ * Create ModelInfo from partial data with sensible defaults.
777
+ * Useful for adapters that want to register models.
778
+ */
779
+ export function createModelInfo(partial) {
780
+ return {
781
+ contextWindow: 128000, // sensible default
782
+ maxOutputTokens: 4096,
783
+ supportsVision: false,
784
+ supportsToolUse: true,
785
+ ...partial,
786
+ };
787
+ }
788
+ /**
789
+ * Get effective model info by merging adapter metadata with catalog.
790
+ *
791
+ * Priority:
792
+ * 1. Adapter-provided values (source of truth)
793
+ * 2. Runtime registry
794
+ * 3. Static MODEL_CATALOG
795
+ *
796
+ * @param adapterMetadata - Metadata from the adapter (if available)
797
+ * @param modelId - Model ID to look up in catalog (fallback)
798
+ * @returns Merged model info, or undefined if nothing found
799
+ */
800
+ export function getEffectiveModelInfo(adapterMetadata, modelId) {
801
+ // Determine which model ID to use for catalog lookup
802
+ const lookupId = modelId || adapterMetadata?.model || adapterMetadata?.id;
803
+ // Get catalog info as base
804
+ const catalogInfo = lookupId ? getModelInfo(lookupId) : undefined;
805
+ // If no adapter metadata, return catalog info
806
+ if (!adapterMetadata) {
807
+ return catalogInfo;
808
+ }
809
+ // If no catalog info and adapter has context window, create from adapter
810
+ if (!catalogInfo && adapterMetadata.contextWindow) {
811
+ return {
812
+ name: adapterMetadata.model || adapterMetadata.id || "Unknown",
813
+ provider: adapterMetadata.provider || "unknown",
814
+ contextWindow: adapterMetadata.contextWindow,
815
+ maxOutputTokens: adapterMetadata.maxOutputTokens,
816
+ supportsVision: adapterMetadata.supportsVision,
817
+ supportsToolUse: adapterMetadata.supportsToolUse,
818
+ isReasoningModel: adapterMetadata.isReasoningModel,
819
+ };
820
+ }
821
+ // Merge: adapter values override catalog values
822
+ if (catalogInfo) {
823
+ return {
824
+ ...catalogInfo,
825
+ // Adapter overrides
826
+ ...(adapterMetadata.contextWindow !== undefined && {
827
+ contextWindow: adapterMetadata.contextWindow,
828
+ }),
829
+ ...(adapterMetadata.maxOutputTokens !== undefined && {
830
+ maxOutputTokens: adapterMetadata.maxOutputTokens,
831
+ }),
832
+ ...(adapterMetadata.supportsVision !== undefined && {
833
+ supportsVision: adapterMetadata.supportsVision,
834
+ }),
835
+ ...(adapterMetadata.supportsToolUse !== undefined && {
836
+ supportsToolUse: adapterMetadata.supportsToolUse,
837
+ }),
838
+ ...(adapterMetadata.isReasoningModel !== undefined && {
839
+ isReasoningModel: adapterMetadata.isReasoningModel,
840
+ }),
841
+ };
842
+ }
843
+ return undefined;
844
+ }
845
+ /**
846
+ * Get effective context window, prioritizing adapter metadata.
847
+ *
848
+ * @param adapterMetadata - Metadata from the adapter
849
+ * @param modelId - Model ID for catalog lookup
850
+ * @returns Context window size, or undefined if unknown
851
+ */
852
+ export function getEffectiveContextWindow(adapterMetadata, modelId) {
853
+ // Adapter is source of truth
854
+ if (adapterMetadata?.contextWindow) {
855
+ return adapterMetadata.contextWindow;
856
+ }
857
+ // Fall back to catalog
858
+ const lookupId = modelId || adapterMetadata?.model || adapterMetadata?.id;
859
+ return lookupId ? getContextWindow(lookupId) : undefined;
860
+ }
861
+ //# sourceMappingURL=model-catalog.js.map