@sriinnu/kosha-discovery 0.6.0 → 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 (123) hide show
  1. package/README.md +53 -221
  2. package/dist/cli-cmd-model.d.ts +48 -0
  3. package/dist/cli-cmd-model.d.ts.map +1 -0
  4. package/dist/cli-cmd-model.js +231 -0
  5. package/dist/cli-cmd-model.js.map +1 -0
  6. package/dist/cli-cmd-query.d.ts +40 -0
  7. package/dist/cli-cmd-query.d.ts.map +1 -0
  8. package/dist/cli-cmd-query.js +303 -0
  9. package/dist/cli-cmd-query.js.map +1 -0
  10. package/dist/cli-commands.d.ts +65 -75
  11. package/dist/cli-commands.d.ts.map +1 -1
  12. package/dist/cli-commands.js +122 -504
  13. package/dist/cli-commands.js.map +1 -1
  14. package/dist/cli-format.d.ts +40 -0
  15. package/dist/cli-format.d.ts.map +1 -1
  16. package/dist/cli-format.js +74 -0
  17. package/dist/cli-format.js.map +1 -1
  18. package/dist/cli-help.d.ts +19 -0
  19. package/dist/cli-help.d.ts.map +1 -0
  20. package/dist/cli-help.js +150 -0
  21. package/dist/cli-help.js.map +1 -0
  22. package/dist/cli.js +5 -1
  23. package/dist/cli.js.map +1 -1
  24. package/dist/discovery/anthropic.d.ts +8 -1
  25. package/dist/discovery/anthropic.d.ts.map +1 -1
  26. package/dist/discovery/anthropic.js +26 -3
  27. package/dist/discovery/anthropic.js.map +1 -1
  28. package/dist/discovery/base.d.ts +26 -0
  29. package/dist/discovery/base.d.ts.map +1 -1
  30. package/dist/discovery/base.js +55 -2
  31. package/dist/discovery/base.js.map +1 -1
  32. package/dist/discovery/free-tier.d.ts +31 -0
  33. package/dist/discovery/free-tier.d.ts.map +1 -0
  34. package/dist/discovery/free-tier.js +47 -0
  35. package/dist/discovery/free-tier.js.map +1 -0
  36. package/dist/discovery/google.d.ts +8 -1
  37. package/dist/discovery/google.d.ts.map +1 -1
  38. package/dist/discovery/google.js +25 -3
  39. package/dist/discovery/google.js.map +1 -1
  40. package/dist/discovery/litellm-seed.d.ts +32 -0
  41. package/dist/discovery/litellm-seed.d.ts.map +1 -0
  42. package/dist/discovery/litellm-seed.js +252 -0
  43. package/dist/discovery/litellm-seed.js.map +1 -0
  44. package/dist/discovery/modelsdev-catalog.d.ts +95 -0
  45. package/dist/discovery/modelsdev-catalog.d.ts.map +1 -0
  46. package/dist/discovery/modelsdev-catalog.js +131 -0
  47. package/dist/discovery/modelsdev-catalog.js.map +1 -0
  48. package/dist/discovery/modelsdev-seed.d.ts +19 -0
  49. package/dist/discovery/modelsdev-seed.d.ts.map +1 -0
  50. package/dist/discovery/modelsdev-seed.js +203 -0
  51. package/dist/discovery/modelsdev-seed.js.map +1 -0
  52. package/dist/discovery/openai-compatible.d.ts.map +1 -1
  53. package/dist/discovery/openai-compatible.js +12 -1
  54. package/dist/discovery/openai-compatible.js.map +1 -1
  55. package/dist/discovery/openai.d.ts +9 -1
  56. package/dist/discovery/openai.d.ts.map +1 -1
  57. package/dist/discovery/openai.js +31 -8
  58. package/dist/discovery/openai.js.map +1 -1
  59. package/dist/discovery/openrouter.d.ts.map +1 -1
  60. package/dist/discovery/openrouter.js +18 -1
  61. package/dist/discovery/openrouter.js.map +1 -1
  62. package/dist/discovery/promo-overrides.d.ts +54 -0
  63. package/dist/discovery/promo-overrides.d.ts.map +1 -0
  64. package/dist/discovery/promo-overrides.js +74 -0
  65. package/dist/discovery/promo-overrides.js.map +1 -0
  66. package/dist/discovery/public-seed.d.ts +30 -0
  67. package/dist/discovery/public-seed.d.ts.map +1 -0
  68. package/dist/discovery/public-seed.js +51 -0
  69. package/dist/discovery/public-seed.js.map +1 -0
  70. package/dist/discovery-contract.d.ts +14 -2
  71. package/dist/discovery-contract.d.ts.map +1 -1
  72. package/dist/discovery-contract.js +28 -0
  73. package/dist/discovery-contract.js.map +1 -1
  74. package/dist/enrichment/litellm-catalog.d.ts +81 -0
  75. package/dist/enrichment/litellm-catalog.d.ts.map +1 -0
  76. package/dist/enrichment/litellm-catalog.js +129 -0
  77. package/dist/enrichment/litellm-catalog.js.map +1 -0
  78. package/dist/enrichment/litellm.d.ts +9 -2
  79. package/dist/enrichment/litellm.d.ts.map +1 -1
  80. package/dist/enrichment/litellm.js +192 -23
  81. package/dist/enrichment/litellm.js.map +1 -1
  82. package/dist/index.d.ts +3 -1
  83. package/dist/index.d.ts.map +1 -1
  84. package/dist/index.js +2 -0
  85. package/dist/index.js.map +1 -1
  86. package/dist/model-features.d.ts +77 -0
  87. package/dist/model-features.d.ts.map +1 -0
  88. package/dist/model-features.js +245 -0
  89. package/dist/model-features.js.map +1 -0
  90. package/dist/normalize.d.ts +13 -0
  91. package/dist/normalize.d.ts.map +1 -1
  92. package/dist/normalize.js +15 -0
  93. package/dist/normalize.js.map +1 -1
  94. package/dist/provider-catalog.d.ts +7 -0
  95. package/dist/provider-catalog.d.ts.map +1 -1
  96. package/dist/provider-catalog.js +4 -0
  97. package/dist/provider-catalog.js.map +1 -1
  98. package/dist/registry-discovery.d.ts.map +1 -1
  99. package/dist/registry-discovery.js +11 -1
  100. package/dist/registry-discovery.js.map +1 -1
  101. package/dist/registry-query.d.ts.map +1 -1
  102. package/dist/registry-query.js +6 -3
  103. package/dist/registry-query.js.map +1 -1
  104. package/dist/registry-runtime.d.ts +39 -1
  105. package/dist/registry-runtime.d.ts.map +1 -1
  106. package/dist/registry-runtime.js +332 -1
  107. package/dist/registry-runtime.js.map +1 -1
  108. package/dist/registry-selection.js +2 -0
  109. package/dist/registry-selection.js.map +1 -1
  110. package/dist/registry.d.ts +9 -0
  111. package/dist/registry.d.ts.map +1 -1
  112. package/dist/registry.js +11 -1
  113. package/dist/registry.js.map +1 -1
  114. package/dist/security.d.ts.map +1 -1
  115. package/dist/security.js +32 -4
  116. package/dist/security.js.map +1 -1
  117. package/dist/tokenizer-family.d.ts +39 -0
  118. package/dist/tokenizer-family.d.ts.map +1 -0
  119. package/dist/tokenizer-family.js +92 -0
  120. package/dist/tokenizer-family.js.map +1 -0
  121. package/dist/types.d.ts +186 -0
  122. package/dist/types.d.ts.map +1 -1
  123. package/package.json +8 -2
@@ -0,0 +1,129 @@
1
+ /**
2
+ * kosha-discovery — Shared LiteLLM catalog loader.
3
+ *
4
+ * Single source of truth for the community-maintained LiteLLM model catalog
5
+ * used by both the discovery seed (origin providers without an API key) and
6
+ * the post-discovery pricing enricher.
7
+ *
8
+ * Hardening:
9
+ * - HTTPS-only, fixed source URL — no caller-supplied URLs.
10
+ * - Promise-deduplicated singleton load — concurrent callers share one fetch.
11
+ * - AbortController-bounded fetch with explicit timeout.
12
+ * - Response size cap before parsing to prevent memory bombs.
13
+ * - {@link assertCleanPayload} runs before any field is read.
14
+ * - Entry-count cap after parse to bound downstream work.
15
+ *
16
+ * The catalog source is the same one already trusted by the existing
17
+ * enricher; this module just centralises the load.
18
+ * @module
19
+ */
20
+ import { assertCleanPayload } from "../security.js";
21
+ /** Pinned upstream catalog URL — HTTPS only, no user override. */
22
+ export const LITELLM_CATALOG_URL = "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json";
23
+ /** Maximum response payload size in bytes (8 MB) — current catalog is ~3 MB. */
24
+ const MAX_PAYLOAD_BYTES = 8 * 1024 * 1024;
25
+ /** Maximum entry count in the parsed catalog before we refuse it. */
26
+ const MAX_ENTRIES = 25_000;
27
+ /** Network timeout for the catalog fetch. */
28
+ const FETCH_TIMEOUT_MS = 15_000;
29
+ /** Module-level promise-dedup cache so concurrent callers share one fetch. */
30
+ let inflight = null;
31
+ /**
32
+ * Fetch the LiteLLM catalog with full hardening, returning a defensively
33
+ * filtered map. Concurrent callers share the same in-flight promise.
34
+ */
35
+ export function loadLiteLLMCatalog() {
36
+ if (inflight)
37
+ return inflight;
38
+ inflight = fetchAndValidate().catch((error) => {
39
+ // Reset on failure so a future call can retry instead of memoising the error.
40
+ inflight = null;
41
+ throw error;
42
+ });
43
+ return inflight;
44
+ }
45
+ /**
46
+ * Reset the cached catalog. Test-only helper — callers in production code
47
+ * should rely on the process-lifetime cache.
48
+ */
49
+ export function resetLiteLLMCatalogCache() {
50
+ inflight = null;
51
+ }
52
+ async function fetchAndValidate() {
53
+ const controller = new AbortController();
54
+ const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);
55
+ let response;
56
+ try {
57
+ response = await fetch(LITELLM_CATALOG_URL, { signal: controller.signal });
58
+ }
59
+ finally {
60
+ clearTimeout(timer);
61
+ }
62
+ if (!response.ok) {
63
+ throw new Error(`Failed to fetch litellm data: ${response.status} ${response.statusText}`);
64
+ }
65
+ const text = await readBoundedText(response, MAX_PAYLOAD_BYTES);
66
+ let parsed;
67
+ try {
68
+ parsed = JSON.parse(text);
69
+ }
70
+ catch {
71
+ throw new Error("Failed to parse litellm data: invalid JSON");
72
+ }
73
+ if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
74
+ throw new Error("Failed to parse litellm data: expected an object");
75
+ }
76
+ assertCleanPayload(parsed, "litellm");
77
+ const entries = Object.entries(parsed);
78
+ if (entries.length > MAX_ENTRIES) {
79
+ throw new Error(`LiteLLM catalog exceeds entry cap (${entries.length} > ${MAX_ENTRIES}) — refusing to load`);
80
+ }
81
+ const out = Object.create(null);
82
+ for (const [key, value] of entries) {
83
+ if (value && typeof value === "object" && !Array.isArray(value)) {
84
+ out[key] = value;
85
+ }
86
+ }
87
+ return out;
88
+ }
89
+ /**
90
+ * Read a Response body as text but reject if the body exceeds maxBytes.
91
+ * Streams the body chunk-by-chunk so we never buffer more than the cap.
92
+ */
93
+ async function readBoundedText(response, maxBytes) {
94
+ const contentLength = Number(response.headers.get("content-length") ?? "0");
95
+ if (contentLength > maxBytes) {
96
+ throw new Error(`LiteLLM catalog too large (${contentLength} > ${maxBytes} bytes) — refusing to load`);
97
+ }
98
+ if (!response.body) {
99
+ // No streaming body available — fall back to text() but enforce cap on result.
100
+ const text = await response.text();
101
+ if (text.length > maxBytes) {
102
+ throw new Error(`LiteLLM catalog too large (${text.length} > ${maxBytes} chars) — refusing to load`);
103
+ }
104
+ return text;
105
+ }
106
+ const reader = response.body.getReader();
107
+ const decoder = new TextDecoder("utf-8");
108
+ let received = 0;
109
+ let text = "";
110
+ while (true) {
111
+ const { done, value } = await reader.read();
112
+ if (done)
113
+ break;
114
+ received += value.byteLength;
115
+ if (received > maxBytes) {
116
+ try {
117
+ await reader.cancel();
118
+ }
119
+ catch {
120
+ /* swallow cancel errors; we are already failing */
121
+ }
122
+ throw new Error(`LiteLLM catalog too large (>${maxBytes} bytes) — refusing to load`);
123
+ }
124
+ text += decoder.decode(value, { stream: true });
125
+ }
126
+ text += decoder.decode();
127
+ return text;
128
+ }
129
+ //# sourceMappingURL=litellm-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"litellm-catalog.js","sourceRoot":"","sources":["../../src/enrichment/litellm-catalog.ts"],"names":[],"mappings":"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"}
@@ -15,8 +15,7 @@ import type { Enricher, ModelCard } from "../types.js";
15
15
  */
16
16
  export declare class LiteLLMEnricher implements Enricher {
17
17
  private data;
18
- private readonly url;
19
- /** Fetch and cache the litellm pricing JSON. Safe to call multiple times. */
18
+ /** Fetch and cache the litellm pricing JSON via the shared catalog loader. */
20
19
  load(): Promise<void>;
21
20
  /**
22
21
  * Enrich an array of ModelCards with litellm data.
@@ -27,6 +26,14 @@ export declare class LiteLLMEnricher implements Enricher {
27
26
  */
28
27
  enrich(models: ModelCard[]): Promise<ModelCard[]>;
29
28
  private enrichOne;
29
+ /**
30
+ * Best-effort lifecycle status from a deprecation-date string.
31
+ *
32
+ * Returns `"retired"` when the date has already passed,
33
+ * `"deprecated"` when one is set but still in the future,
34
+ * and `"active"` when no date is present.
35
+ */
36
+ private inferStatus;
30
37
  /**
31
38
  * Look up a model in the litellm pricing catalogue using a tiered set of
32
39
  * key strategies. Later strategies use `originProvider` to handle models
@@ -1 +1 @@
1
- {"version":3,"file":"litellm.d.ts","sourceRoot":"","sources":["../../src/enrichment/litellm.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAA2B,MAAM,aAAa,CAAC;AAkChF;;;;;GAKG;AACH,qBAAa,eAAgB,YAAW,QAAQ;IAC/C,OAAO,CAAC,IAAI,CAAkD;IAC9D,OAAO,CAAC,QAAQ,CAAC,GAAG,CAC2E;IAE/F,6EAA6E;IACvE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAY3B;;;;;;OAMG;IACG,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IASvD,OAAO,CAAC,SAAS;IAoEjB;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,WAAW;IA6CnB,8DAA8D;IAC9D,OAAO,CAAC,cAAc;IA0CtB;;;OAGG;IACH,OAAO,CAAC,WAAW;IASnB,sDAAsD;IACtD,OAAO,CAAC,OAAO;CAkBf"}
1
+ {"version":3,"file":"litellm.d.ts","sourceRoot":"","sources":["../../src/enrichment/litellm.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAwC,MAAM,aAAa,CAAC;AAc7F;;;;;GAKG;AACH,qBAAa,eAAgB,YAAW,QAAQ;IAC/C,OAAO,CAAC,IAAI,CAAkD;IAE9D,8EAA8E;IACxE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B;;;;;;OAMG;IACG,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IASvD,OAAO,CAAC,SAAS;IAwKjB;;;;;;OAMG;IACH,OAAO,CAAC,WAAW;IAOnB;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,WAAW;IA6CnB,8DAA8D;IAC9D,OAAO,CAAC,cAAc;IAuHtB;;;OAGG;IACH,OAAO,CAAC,WAAW;IASnB,sDAAsD;IACtD,OAAO,CAAC,OAAO;CAkBf"}
@@ -6,8 +6,11 @@
6
6
  * flags on already-discovered {@link ModelCard} objects.
7
7
  * @module
8
8
  */
9
+ import { applyFreeTierFlag } from "../discovery/free-tier.js";
9
10
  import { normalizeModelId } from "../normalize.js";
10
- import { assertCleanPayload } from "../security.js";
11
+ import { inferParallelToolCalls, inferStructuredOutputModes, inferToolDialect } from "../model-features.js";
12
+ import { inferTokenizerFamily } from "../tokenizer-family.js";
13
+ import { loadLiteLLMCatalog } from "./litellm-catalog.js";
11
14
  /**
12
15
  * Multiplier to convert litellm's per-token costs into our standard
13
16
  * per-million-token pricing. litellm stores costs as cost-per-single-token,
@@ -22,18 +25,11 @@ const PER_MILLION = 1_000_000;
22
25
  */
23
26
  export class LiteLLMEnricher {
24
27
  data = null;
25
- url = "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json";
26
- /** Fetch and cache the litellm pricing JSON. Safe to call multiple times. */
28
+ /** Fetch and cache the litellm pricing JSON via the shared catalog loader. */
27
29
  async load() {
28
30
  if (this.data)
29
31
  return;
30
- const response = await fetch(this.url);
31
- if (!response.ok) {
32
- throw new Error(`Failed to fetch litellm data: ${response.status} ${response.statusText}`);
33
- }
34
- const raw = (await response.json());
35
- assertCleanPayload(raw, "litellm");
36
- this.data = raw;
32
+ this.data = await loadLiteLLMCatalog();
37
33
  }
38
34
  /**
39
35
  * Enrich an array of ModelCards with litellm data.
@@ -44,7 +40,7 @@ export class LiteLLMEnricher {
44
40
  */
45
41
  async enrich(models) {
46
42
  await this.load();
47
- return models.map((model) => this.enrichOne(model));
43
+ return models.map((model) => applyFreeTierFlag(this.enrichOne(model)));
48
44
  }
49
45
  // ---------------------------------------------------------------------------
50
46
  // Private
@@ -54,10 +50,45 @@ export class LiteLLMEnricher {
54
50
  if (!entry)
55
51
  return { ...model };
56
52
  const enriched = { ...model };
57
- // Pricing — only when the model has no pricing yet
53
+ // Pricing — fill in base pricing when missing, AND top up cache rates
54
+ // even when base pricing already exists. The discoverer (e.g. OpenRouter)
55
+ // often provides input/output rates but skips cache_read/cache_write,
56
+ // while litellm has them — so I merge per-field rather than all-or-nothing.
58
57
  const entryPricing = this.extractPricing(entry);
59
- if (!enriched.pricing && entryPricing) {
60
- enriched.pricing = entryPricing;
58
+ if (entryPricing) {
59
+ if (!enriched.pricing) {
60
+ enriched.pricing = entryPricing;
61
+ }
62
+ else {
63
+ if (enriched.pricing.cacheReadPerMillion === undefined &&
64
+ entryPricing.cacheReadPerMillion !== undefined) {
65
+ enriched.pricing = {
66
+ ...enriched.pricing,
67
+ cacheReadPerMillion: entryPricing.cacheReadPerMillion,
68
+ };
69
+ }
70
+ if (enriched.pricing.cacheWritePerMillion === undefined &&
71
+ entryPricing.cacheWritePerMillion !== undefined) {
72
+ enriched.pricing = {
73
+ ...enriched.pricing,
74
+ cacheWritePerMillion: entryPricing.cacheWritePerMillion,
75
+ };
76
+ }
77
+ if (enriched.pricing.batchInputPerMillion === undefined &&
78
+ entryPricing.batchInputPerMillion !== undefined) {
79
+ enriched.pricing = {
80
+ ...enriched.pricing,
81
+ batchInputPerMillion: entryPricing.batchInputPerMillion,
82
+ };
83
+ }
84
+ if (enriched.pricing.batchOutputPerMillion === undefined &&
85
+ entryPricing.batchOutputPerMillion !== undefined) {
86
+ enriched.pricing = {
87
+ ...enriched.pricing,
88
+ batchOutputPerMillion: entryPricing.batchOutputPerMillion,
89
+ };
90
+ }
91
+ }
61
92
  }
62
93
  // Preserve proxy-route pricing while surfacing direct-origin reference pricing.
63
94
  if (entryPricing && enriched.originProvider && enriched.originProvider !== enriched.provider && !enriched.originPricing) {
@@ -106,8 +137,80 @@ export class LiteLLMEnricher {
106
137
  if (entry.supports_prompt_caching && !enriched.capabilities.includes("prompt_caching")) {
107
138
  enriched.capabilities.push("prompt_caching");
108
139
  }
140
+ if (entry.supports_audio_input && !enriched.capabilities.includes("audio_input")) {
141
+ enriched.capabilities.push("audio_input");
142
+ }
143
+ if (entry.supports_audio_output && !enriched.capabilities.includes("audio_output")) {
144
+ enriched.capabilities.push("audio_output");
145
+ }
146
+ if (entry.supports_video_input && !enriched.capabilities.includes("video_input")) {
147
+ enriched.capabilities.push("video_input");
148
+ }
149
+ if (entry.supports_reasoning && !enriched.capabilities.includes("reasoning")) {
150
+ enriched.capabilities.push("reasoning");
151
+ }
152
+ if (entry.supports_response_schema && !enriched.capabilities.includes("structured_output")) {
153
+ enriched.capabilities.push("structured_output");
154
+ }
155
+ // Tokenizer family — only fill when missing. Prefer a local-runtime value
156
+ // when the discoverer already supplied one; fall back to heuristic inference
157
+ // based on origin provider and model ID.
158
+ if (!enriched.tokenizerFamily) {
159
+ const localFamily = enriched.localRuntime?.tokenizerFamily;
160
+ enriched.tokenizerFamily =
161
+ localFamily ?? inferTokenizerFamily(enriched.originProvider, enriched.id);
162
+ }
163
+ // Tool dialect — only fill when missing. The discoverer might know the
164
+ // canonical dialect for managed proxy endpoints; we only infer when it
165
+ // didn't come through.
166
+ if (enriched.toolDialect === undefined) {
167
+ const dialect = inferToolDialect(enriched.originProvider, enriched.id);
168
+ if (dialect !== undefined)
169
+ enriched.toolDialect = dialect;
170
+ }
171
+ // Structured output modes — only fill when the discoverer hasn't set them.
172
+ if (enriched.structuredOutputModes === undefined) {
173
+ const modes = inferStructuredOutputModes(enriched.originProvider, enriched.id);
174
+ if (modes.length > 0)
175
+ enriched.structuredOutputModes = modes;
176
+ }
177
+ // Parallel tool calls — litellm's flag takes precedence when present,
178
+ // otherwise fall back to the heuristic from the dialect / model ID.
179
+ if (enriched.supportsParallelToolCalls === undefined) {
180
+ if (entry.supports_parallel_function_calling !== undefined) {
181
+ enriched.supportsParallelToolCalls = entry.supports_parallel_function_calling;
182
+ }
183
+ else {
184
+ const parallel = inferParallelToolCalls(enriched.originProvider, enriched.id);
185
+ if (parallel !== undefined)
186
+ enriched.supportsParallelToolCalls = parallel;
187
+ }
188
+ }
189
+ // Deprecation metadata — only fill when missing; litellm publishes
190
+ // `deprecation_date` as an ISO string for models with announced sunset.
191
+ if (!enriched.deprecationDate && entry.deprecation_date) {
192
+ enriched.deprecationDate = entry.deprecation_date;
193
+ }
194
+ if (!enriched.status) {
195
+ enriched.status = this.inferStatus(enriched.deprecationDate);
196
+ }
109
197
  return enriched;
110
198
  }
199
+ /**
200
+ * Best-effort lifecycle status from a deprecation-date string.
201
+ *
202
+ * Returns `"retired"` when the date has already passed,
203
+ * `"deprecated"` when one is set but still in the future,
204
+ * and `"active"` when no date is present.
205
+ */
206
+ inferStatus(deprecationDate) {
207
+ if (!deprecationDate)
208
+ return "active";
209
+ const ts = Date.parse(deprecationDate);
210
+ if (Number.isNaN(ts))
211
+ return "active";
212
+ return ts <= Date.now() ? "retired" : "deprecated";
213
+ }
111
214
  /**
112
215
  * Look up a model in the litellm pricing catalogue using a tiered set of
113
216
  * key strategies. Later strategies use `originProvider` to handle models
@@ -171,18 +274,31 @@ export class LiteLLMEnricher {
171
274
  extractPricing(entry) {
172
275
  const reasoningInputCost = this.firstFinite(entry.input_cost_per_reasoning_token, entry.reasoning_input_cost_per_token);
173
276
  const reasoningOutputCost = this.firstFinite(entry.output_cost_per_reasoning_token, entry.reasoning_output_cost_per_token);
174
- const hasAnyPriceSignal = entry.input_cost_per_token !== undefined ||
175
- entry.output_cost_per_token !== undefined ||
176
- entry.cache_read_input_token_cost !== undefined ||
177
- entry.cache_creation_input_token_cost !== undefined ||
178
- reasoningInputCost !== undefined ||
179
- reasoningOutputCost !== undefined;
180
- if (!hasAnyPriceSignal) {
277
+ const baseInput = this.firstFinite(entry.input_cost_per_token);
278
+ const baseOutput = this.firstFinite(entry.output_cost_per_token);
279
+ const hasBaseTokenPricing = baseInput !== undefined && baseOutput !== undefined;
280
+ // Multimodal-only entries (TTS by-the-second, image generation, per-character
281
+ // Vertex models) legitimately publish no token-billed pricing — synthesizing
282
+ // 0/0 base on those is honest, and downstream free_tier detection skips
283
+ // non-chat modes. Cache-only / batch-only / reasoning-only entries, on the
284
+ // other hand, are incomplete catalog rows: synthesizing 0/0 base from them
285
+ // would falsely flag the model as free_tier, so we refuse.
286
+ const hasNonTokenPricing = entry.input_cost_per_image !== undefined ||
287
+ entry.output_cost_per_image !== undefined ||
288
+ entry.input_cost_per_audio_token !== undefined ||
289
+ entry.output_cost_per_audio_token !== undefined ||
290
+ entry.input_cost_per_audio_per_second !== undefined ||
291
+ entry.output_cost_per_audio_per_second !== undefined ||
292
+ entry.input_cost_per_video_per_second !== undefined ||
293
+ entry.input_cost_per_video_token !== undefined ||
294
+ entry.input_cost_per_character !== undefined ||
295
+ entry.output_cost_per_character !== undefined;
296
+ if (!hasBaseTokenPricing && !hasNonTokenPricing) {
181
297
  return undefined;
182
298
  }
183
299
  const pricing = {
184
- inputPerMillion: (entry.input_cost_per_token ?? 0) * PER_MILLION,
185
- outputPerMillion: (entry.output_cost_per_token ?? 0) * PER_MILLION,
300
+ inputPerMillion: (baseInput ?? 0) * PER_MILLION,
301
+ outputPerMillion: (baseOutput ?? 0) * PER_MILLION,
186
302
  };
187
303
  if (reasoningInputCost !== undefined) {
188
304
  pricing.reasoningInputPerMillion = reasoningInputCost * PER_MILLION;
@@ -196,6 +312,59 @@ export class LiteLLMEnricher {
196
312
  if (entry.cache_creation_input_token_cost !== undefined) {
197
313
  pricing.cacheWritePerMillion = entry.cache_creation_input_token_cost * PER_MILLION;
198
314
  }
315
+ if (entry.input_cost_per_token_batches !== undefined) {
316
+ pricing.batchInputPerMillion = entry.input_cost_per_token_batches * PER_MILLION;
317
+ }
318
+ if (entry.output_cost_per_token_batches !== undefined) {
319
+ pricing.batchOutputPerMillion = entry.output_cost_per_token_batches * PER_MILLION;
320
+ }
321
+ // Multimodal — images are already per-unit; audio/video tokens go through PER_MILLION.
322
+ if (entry.input_cost_per_image !== undefined) {
323
+ pricing.imageInputPerImage = entry.input_cost_per_image;
324
+ }
325
+ if (entry.output_cost_per_image !== undefined) {
326
+ pricing.imageOutputPerImage = entry.output_cost_per_image;
327
+ }
328
+ if (entry.input_cost_per_audio_token !== undefined) {
329
+ pricing.audioInputPerMillion = entry.input_cost_per_audio_token * PER_MILLION;
330
+ }
331
+ if (entry.output_cost_per_audio_token !== undefined) {
332
+ pricing.audioOutputPerMillion = entry.output_cost_per_audio_token * PER_MILLION;
333
+ }
334
+ if (entry.input_cost_per_audio_per_second !== undefined) {
335
+ pricing.audioInputPerSecond = entry.input_cost_per_audio_per_second;
336
+ }
337
+ if (entry.output_cost_per_audio_per_second !== undefined) {
338
+ pricing.audioOutputPerSecond = entry.output_cost_per_audio_per_second;
339
+ }
340
+ if (entry.input_cost_per_video_per_second !== undefined) {
341
+ pricing.videoInputPerSecond = entry.input_cost_per_video_per_second;
342
+ }
343
+ if (entry.input_cost_per_video_token !== undefined) {
344
+ pricing.videoInputPerMillion = entry.input_cost_per_video_token * PER_MILLION;
345
+ }
346
+ // Character-billed providers (Vertex AI, Azure).
347
+ if (entry.input_cost_per_character !== undefined) {
348
+ pricing.inputPerMillionCharacters = entry.input_cost_per_character * PER_MILLION;
349
+ }
350
+ if (entry.output_cost_per_character !== undefined) {
351
+ pricing.outputPerMillionCharacters = entry.output_cost_per_character * PER_MILLION;
352
+ }
353
+ // Tiered long-context pricing — prefer 128k, fall back to 200k (Claude-style).
354
+ const tieredIn = this.firstFinite(entry.input_cost_per_token_above_128k_tokens, entry.input_cost_per_token_above_200k_tokens);
355
+ const tieredOut = this.firstFinite(entry.output_cost_per_token_above_128k_tokens, entry.output_cost_per_token_above_200k_tokens);
356
+ if (tieredIn !== undefined) {
357
+ pricing.longContextInputPerMillion = tieredIn * PER_MILLION;
358
+ }
359
+ if (tieredOut !== undefined) {
360
+ pricing.longContextOutputPerMillion = tieredOut * PER_MILLION;
361
+ }
362
+ if (entry.input_cost_per_token_above_128k_tokens !== undefined || entry.output_cost_per_token_above_128k_tokens !== undefined) {
363
+ pricing.longContextThresholdTokens = 128_000;
364
+ }
365
+ else if (entry.input_cost_per_token_above_200k_tokens !== undefined || entry.output_cost_per_token_above_200k_tokens !== undefined) {
366
+ pricing.longContextThresholdTokens = 200_000;
367
+ }
199
368
  return pricing;
200
369
  }
201
370
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"litellm.js","sourceRoot":"","sources":["../../src/enrichment/litellm.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"litellm.js","sourceRoot":"","sources":["../../src/enrichment/litellm.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -11,9 +11,11 @@ export { KoshaCache } from "./cache.js";
11
11
  export { DISCOVERY_SCHEMA_VERSION, discoveryRoles, makeModelKey, rawCapabilitiesForModel, trustedCapabilitiesForModel, } from "./discovery-contract.js";
12
12
  export type { DiscoveryBindingHintsV1, DiscoveryBindingQuery, DiscoveryChangeV1, DiscoveryCheapestCandidateV1, DiscoveryCheapestResultV1, DiscoveryCredentialPrompt, DiscoveryDeltaV1, DiscoveryHealthRecord, DiscoveryModelV1, DiscoveryProviderV1, DiscoveryRoleDefinition, DiscoverySnapshotV1, TrustedCapability, } from "./discovery-contract.js";
13
13
  export { extractModelVersion, extractOriginProvider, normalizeModelId } from "./normalize.js";
14
+ export { inferTokenizerFamily } from "./tokenizer-family.js";
15
+ export { inferParallelToolCalls, inferStructuredOutputModes, inferToolDialect } from "./model-features.js";
14
16
  export { getProviderDescriptor, isLocalProvider, listProviderDescriptors, normalizeProviderId, PROVIDER_CATALOG, } from "./provider-catalog.js";
15
17
  export type { ProviderDescriptor } from "./provider-catalog.js";
16
- export type { ComputeTarget, LocalRuntimeMetadata, ModelCard, ProviderInfo, ProviderRoleInfo, DiscoveryError, DiscoveryOptions, KoshaConfig, LatestDiscoveryOptions, LatestDiscoveryResult, ModelMode, ModelPricing, ModelRoleCard, RoleQueryOptions, CheapestModelOptions, CheapestModelMatch, CheapestModelResult, ProviderCredentialPrompt, PricingMetric, ModelRouteInfo, CapabilitySummary, CredentialResult, ProviderDiscoverer, Enricher, ProviderOrigin, ProviderTransport, } from "./types.js";
18
+ export type { ComputeTarget, LocalRuntimeMetadata, ModelCard, ModelStatus, ProviderInfo, ProviderRoleInfo, DiscoveryError, DiscoveryOptions, KoshaConfig, LatestDiscoveryOptions, LatestDiscoveryResult, ModelMode, ModelPricing, ModelRoleCard, RoleQueryOptions, CheapestModelOptions, CheapestModelMatch, CheapestModelResult, ProviderCredentialPrompt, PricingMetric, ModelRouteInfo, CapabilitySummary, CredentialResult, ProviderDiscoverer, Enricher, ProviderOrigin, ProviderTransport, StructuredOutputMode, ToolDialect, } from "./types.js";
17
19
  /**
18
20
  * Convenience factory: creates a ModelRegistry and runs discovery in one call.
19
21
  *
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EACN,wBAAwB,EACxB,cAAc,EACd,YAAY,EACZ,uBAAuB,EACvB,2BAA2B,GAC3B,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACX,uBAAuB,EACvB,qBAAqB,EACrB,iBAAiB,EACjB,4BAA4B,EAC5B,yBAAyB,EACzB,yBAAyB,EACzB,gBAAgB,EAChB,qBAAqB,EACrB,gBAAgB,EAChB,mBAAmB,EACnB,uBAAuB,EACvB,mBAAmB,EACnB,iBAAiB,GACjB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC9F,OAAO,EACN,qBAAqB,EACrB,eAAe,EACf,uBAAuB,EACvB,mBAAmB,EACnB,gBAAgB,GAChB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAChE,YAAY,EACX,aAAa,EACb,oBAAoB,EACpB,SAAS,EACT,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,WAAW,EACX,sBAAsB,EACtB,qBAAqB,EACrB,SAAS,EACT,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,wBAAwB,EACxB,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,QAAQ,EACR,cAAc,EACd,iBAAiB,GACjB,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;;;GAWG;AACH,wBAAsB,WAAW,CAAC,MAAM,CAAC,EAAE,OAAO,YAAY,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,eAAe,EAAE,aAAa,CAAC,CAM3H"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EACN,wBAAwB,EACxB,cAAc,EACd,YAAY,EACZ,uBAAuB,EACvB,2BAA2B,GAC3B,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACX,uBAAuB,EACvB,qBAAqB,EACrB,iBAAiB,EACjB,4BAA4B,EAC5B,yBAAyB,EACzB,yBAAyB,EACzB,gBAAgB,EAChB,qBAAqB,EACrB,gBAAgB,EAChB,mBAAmB,EACnB,uBAAuB,EACvB,mBAAmB,EACnB,iBAAiB,GACjB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC9F,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC3G,OAAO,EACN,qBAAqB,EACrB,eAAe,EACf,uBAAuB,EACvB,mBAAmB,EACnB,gBAAgB,GAChB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAChE,YAAY,EACX,aAAa,EACb,oBAAoB,EACpB,SAAS,EACT,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,WAAW,EACX,sBAAsB,EACtB,qBAAqB,EACrB,SAAS,EACT,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,wBAAwB,EACxB,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,QAAQ,EACR,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,WAAW,GACX,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;;;GAWG;AACH,wBAAsB,WAAW,CAAC,MAAM,CAAC,EAAE,OAAO,YAAY,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,eAAe,EAAE,aAAa,CAAC,CAM3H"}
package/dist/index.js CHANGED
@@ -10,6 +10,8 @@ export { AliasResolver, DEFAULT_ALIASES } from "./aliases.js";
10
10
  export { KoshaCache } from "./cache.js";
11
11
  export { DISCOVERY_SCHEMA_VERSION, discoveryRoles, makeModelKey, rawCapabilitiesForModel, trustedCapabilitiesForModel, } from "./discovery-contract.js";
12
12
  export { extractModelVersion, extractOriginProvider, normalizeModelId } from "./normalize.js";
13
+ export { inferTokenizerFamily } from "./tokenizer-family.js";
14
+ export { inferParallelToolCalls, inferStructuredOutputModes, inferToolDialect } from "./model-features.js";
13
15
  export { getProviderDescriptor, isLocalProvider, listProviderDescriptors, normalizeProviderId, PROVIDER_CATALOG, } from "./provider-catalog.js";
14
16
  /**
15
17
  * Convenience factory: creates a ModelRegistry and runs discovery in one call.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EACN,wBAAwB,EACxB,cAAc,EACd,YAAY,EACZ,uBAAuB,EACvB,2BAA2B,GAC3B,MAAM,yBAAyB,CAAC;AAgBjC,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC9F,OAAO,EACN,qBAAqB,EACrB,eAAe,EACf,uBAAuB,EACvB,mBAAmB,EACnB,gBAAgB,GAChB,MAAM,uBAAuB,CAAC;AA+B/B;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAyC;IAC1E,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;IAClE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAC1B,OAAO,QAAQ,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EACN,wBAAwB,EACxB,cAAc,EACd,YAAY,EACZ,uBAAuB,EACvB,2BAA2B,GAC3B,MAAM,yBAAyB,CAAC;AAgBjC,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC9F,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC3G,OAAO,EACN,qBAAqB,EACrB,eAAe,EACf,uBAAuB,EACvB,mBAAmB,EACnB,gBAAgB,GAChB,MAAM,uBAAuB,CAAC;AAkC/B;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAyC;IAC1E,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;IAClE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAC1B,OAAO,QAAQ,CAAC;AACjB,CAAC"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * kosha-discovery — Tool-dialect and structured-output inference.
3
+ *
4
+ * Tool calling and structured output are two surfaces where every frontier
5
+ * provider has settled on a *different* JSON shape. A consumer that wants
6
+ * to route a single workload across multiple providers has to pick the
7
+ * right adapter per model, and the registry is the natural place to tag
8
+ * that. These helpers return best-effort hints inferred from the origin
9
+ * provider plus the model ID — downstream callers treat them as defaults
10
+ * and override with direct API probes when precision matters.
11
+ * @module
12
+ */
13
+ import type { StructuredOutputMode, ToolDialect } from "./types.js";
14
+ /**
15
+ * Infer the tool-calling dialect a model natively speaks.
16
+ *
17
+ * The return value describes the wire format a consumer must emit to
18
+ * invoke tools on this model. Returns `undefined` when the provider is
19
+ * unknown and the model ID gives no signal — the caller should then
20
+ * fall back to `"openai-tools"` (the de-facto compatibility dialect).
21
+ *
22
+ * Mapping summary:
23
+ * - OpenAI GPT-4.1 / GPT-5 / o-series → `"openai-responses"` (new API)
24
+ * - OpenAI GPT-4 / GPT-4o / GPT-3.5 → `"openai-tools"`
25
+ * - Anthropic Claude 3+ → `"anthropic-tools"`
26
+ * - Google Gemini 1.5+ → `"gemini-functions"`
27
+ * - Cohere Command R / R+ → `"cohere-tools"`
28
+ * - Mistral Large / Small → `"mistral-tools"`
29
+ * - Meta Llama 3.1+ (instruct variants) → `"llama3-tools"`
30
+ * - Embedding / image / audio-only models → `"none"`
31
+ *
32
+ * NOTE on serving-layer proxies: this helper infers the model's *native*
33
+ * dialect from its origin provider. Managed serving layers such as Groq,
34
+ * Together, Fireworks, and OpenRouter expose open-weight models behind
35
+ * an OpenAI-compatible tools API regardless of the underlying family —
36
+ * so if you are calling a Llama 3.1 model through Groq, you should use
37
+ * `"openai-tools"` on the wire, not the `"llama3-tools"` hint returned
38
+ * here. Callers that care about the serving-layer wire format should
39
+ * check `ModelCard.provider` (the serving slug) first and fall back to
40
+ * this inference only for direct-origin routes. A future revision may
41
+ * take `servingProvider` as a second argument.
42
+ *
43
+ * @param originProvider - Model creator slug (e.g. `"anthropic"`).
44
+ * @param modelId - Provider-canonical model ID.
45
+ * @returns Best-effort dialect tag, or `undefined` when no safe guess exists.
46
+ */
47
+ export declare function inferToolDialect(originProvider: string | undefined, modelId: string): ToolDialect | undefined;
48
+ /**
49
+ * Infer the structured-output modes a model supports.
50
+ *
51
+ * Returns an ordered list with the most precise mode first. An empty
52
+ * array means no structured-output enforcement is available and the
53
+ * caller must fall back to prompt-level coercion.
54
+ *
55
+ * Precision ranking: `json-schema` > `response-schema` > `grammar`
56
+ * > `json-mode` > `response-format` > `tool-choice` > `xml`.
57
+ *
58
+ * @param originProvider - Model creator slug.
59
+ * @param modelId - Provider-canonical model ID.
60
+ * @returns Ordered list of supported modes (empty when unknown).
61
+ */
62
+ export declare function inferStructuredOutputModes(originProvider: string | undefined, modelId: string): StructuredOutputMode[];
63
+ /**
64
+ * Best-effort inference for whether a model supports parallel tool calls
65
+ * (multiple tool invocations emitted in a single assistant turn).
66
+ *
67
+ * Frontier models (GPT-4o, Claude 3.5+, Gemini 1.5+) all support this;
68
+ * older tool-capable models (GPT-3.5, early Claude 3) emit tool calls
69
+ * serially. Returns `undefined` when the model does not appear to support
70
+ * tool calling at all.
71
+ *
72
+ * @param originProvider - Model creator slug.
73
+ * @param modelId - Provider-canonical model ID.
74
+ * @returns `true`, `false`, or `undefined` when not tool-capable.
75
+ */
76
+ export declare function inferParallelToolCalls(originProvider: string | undefined, modelId: string): boolean | undefined;
77
+ //# sourceMappingURL=model-features.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-features.d.ts","sourceRoot":"","sources":["../src/model-features.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEpE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,gBAAgB,CAC/B,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,OAAO,EAAE,MAAM,GACb,WAAW,GAAG,SAAS,CA0EzB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,0BAA0B,CACzC,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,OAAO,EAAE,MAAM,GACb,oBAAoB,EAAE,CA+ExB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CACrC,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,OAAO,EAAE,MAAM,GACb,OAAO,GAAG,SAAS,CA0BrB"}