@sriinnu/kosha-discovery 1.1.0 → 1.5.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 (191) hide show
  1. package/README.md +66 -26
  2. package/dist/aliases.d.ts +6 -1
  3. package/dist/aliases.d.ts.map +1 -1
  4. package/dist/aliases.js +38 -12
  5. package/dist/aliases.js.map +1 -1
  6. package/dist/cache.d.ts.map +1 -1
  7. package/dist/cache.js +25 -2
  8. package/dist/cache.js.map +1 -1
  9. package/dist/claude-generation.d.ts +59 -0
  10. package/dist/claude-generation.d.ts.map +1 -0
  11. package/dist/claude-generation.js +117 -0
  12. package/dist/claude-generation.js.map +1 -0
  13. package/dist/cli-cmd-doctor.d.ts +17 -0
  14. package/dist/cli-cmd-doctor.d.ts.map +1 -0
  15. package/dist/cli-cmd-doctor.js +199 -0
  16. package/dist/cli-cmd-doctor.js.map +1 -0
  17. package/dist/cli-cmd-model.js +2 -2
  18. package/dist/cli-cmd-model.js.map +1 -1
  19. package/dist/cli-cmd-spend.d.ts +10 -0
  20. package/dist/cli-cmd-spend.d.ts.map +1 -0
  21. package/dist/cli-cmd-spend.js +130 -0
  22. package/dist/cli-cmd-spend.js.map +1 -0
  23. package/dist/cli-commands.d.ts +4 -1
  24. package/dist/cli-commands.d.ts.map +1 -1
  25. package/dist/cli-commands.js +10 -2
  26. package/dist/cli-commands.js.map +1 -1
  27. package/dist/cli-format.d.ts.map +1 -1
  28. package/dist/cli-format.js +2 -1
  29. package/dist/cli-format.js.map +1 -1
  30. package/dist/cli-help.d.ts.map +1 -1
  31. package/dist/cli-help.js +4 -2
  32. package/dist/cli-help.js.map +1 -1
  33. package/dist/cli.js +10 -0
  34. package/dist/cli.js.map +1 -1
  35. package/dist/context-strategy.d.ts +48 -0
  36. package/dist/context-strategy.d.ts.map +1 -0
  37. package/dist/context-strategy.js +274 -0
  38. package/dist/context-strategy.js.map +1 -0
  39. package/dist/cost.d.ts +152 -0
  40. package/dist/cost.d.ts.map +1 -0
  41. package/dist/cost.js +377 -0
  42. package/dist/cost.js.map +1 -0
  43. package/dist/credentials/resolver.d.ts +17 -0
  44. package/dist/credentials/resolver.d.ts.map +1 -1
  45. package/dist/credentials/resolver.js +92 -34
  46. package/dist/credentials/resolver.js.map +1 -1
  47. package/dist/discovery/anthropic.d.ts +19 -1
  48. package/dist/discovery/anthropic.d.ts.map +1 -1
  49. package/dist/discovery/anthropic.js +112 -8
  50. package/dist/discovery/anthropic.js.map +1 -1
  51. package/dist/discovery/base.d.ts +7 -0
  52. package/dist/discovery/base.d.ts.map +1 -1
  53. package/dist/discovery/base.js +32 -4
  54. package/dist/discovery/base.js.map +1 -1
  55. package/dist/discovery/bedrock.d.ts.map +1 -1
  56. package/dist/discovery/cerebras.d.ts.map +1 -1
  57. package/dist/discovery/cohere.d.ts.map +1 -1
  58. package/dist/discovery/deepinfra.d.ts.map +1 -1
  59. package/dist/discovery/deepseek.d.ts.map +1 -1
  60. package/dist/discovery/fireworks.d.ts.map +1 -1
  61. package/dist/discovery/glm.d.ts.map +1 -1
  62. package/dist/discovery/google.d.ts +3 -1
  63. package/dist/discovery/google.d.ts.map +1 -1
  64. package/dist/discovery/google.js +13 -6
  65. package/dist/discovery/google.js.map +1 -1
  66. package/dist/discovery/groq.d.ts.map +1 -1
  67. package/dist/discovery/index.d.ts +3 -0
  68. package/dist/discovery/index.d.ts.map +1 -1
  69. package/dist/discovery/index.js +9 -0
  70. package/dist/discovery/index.js.map +1 -1
  71. package/dist/discovery/litellm-seed.js +12 -8
  72. package/dist/discovery/litellm-seed.js.map +1 -1
  73. package/dist/discovery/llama-cpp.d.ts.map +1 -1
  74. package/dist/discovery/lmstudio.d.ts +26 -0
  75. package/dist/discovery/lmstudio.d.ts.map +1 -0
  76. package/dist/discovery/lmstudio.js +93 -0
  77. package/dist/discovery/lmstudio.js.map +1 -0
  78. package/dist/discovery/minimax.d.ts.map +1 -1
  79. package/dist/discovery/mistral.d.ts.map +1 -1
  80. package/dist/discovery/modelsdev-seed.js +16 -12
  81. package/dist/discovery/modelsdev-seed.js.map +1 -1
  82. package/dist/discovery/moonshot.d.ts.map +1 -1
  83. package/dist/discovery/nvidia.d.ts.map +1 -1
  84. package/dist/discovery/ollama.d.ts.map +1 -1
  85. package/dist/discovery/openai-compatible.d.ts.map +1 -1
  86. package/dist/discovery/openai.d.ts.map +1 -1
  87. package/dist/discovery/openrouter.d.ts +29 -5
  88. package/dist/discovery/openrouter.d.ts.map +1 -1
  89. package/dist/discovery/openrouter.js +56 -18
  90. package/dist/discovery/openrouter.js.map +1 -1
  91. package/dist/discovery/perplexity.d.ts.map +1 -1
  92. package/dist/discovery/promo-overrides.js.map +1 -1
  93. package/dist/discovery/static-direct.d.ts +9 -1
  94. package/dist/discovery/static-direct.d.ts.map +1 -1
  95. package/dist/discovery/static-direct.js +68 -7
  96. package/dist/discovery/static-direct.js.map +1 -1
  97. package/dist/discovery/together.d.ts.map +1 -1
  98. package/dist/discovery/vercel.d.ts +45 -0
  99. package/dist/discovery/vercel.d.ts.map +1 -0
  100. package/dist/discovery/vercel.js +232 -0
  101. package/dist/discovery/vercel.js.map +1 -0
  102. package/dist/discovery/vertex.d.ts.map +1 -1
  103. package/dist/discovery/vllm.d.ts +26 -0
  104. package/dist/discovery/vllm.d.ts.map +1 -0
  105. package/dist/discovery/vllm.js +93 -0
  106. package/dist/discovery/vllm.js.map +1 -0
  107. package/dist/discovery/zai.d.ts.map +1 -1
  108. package/dist/discovery-contract.d.ts +8 -1
  109. package/dist/discovery-contract.d.ts.map +1 -1
  110. package/dist/discovery-contract.js +28 -1
  111. package/dist/discovery-contract.js.map +1 -1
  112. package/dist/discovery-routes.d.ts +9 -0
  113. package/dist/discovery-routes.d.ts.map +1 -1
  114. package/dist/discovery-routes.js +106 -18
  115. package/dist/discovery-routes.js.map +1 -1
  116. package/dist/enrichment/litellm-catalog.d.ts +1 -0
  117. package/dist/enrichment/litellm-catalog.d.ts.map +1 -1
  118. package/dist/enrichment/litellm-catalog.js.map +1 -1
  119. package/dist/enrichment/litellm.d.ts +1 -1
  120. package/dist/enrichment/litellm.d.ts.map +1 -1
  121. package/dist/enrichment/litellm.js +9 -3
  122. package/dist/enrichment/litellm.js.map +1 -1
  123. package/dist/entry.d.ts +14 -0
  124. package/dist/entry.d.ts.map +1 -0
  125. package/dist/entry.js +26 -0
  126. package/dist/entry.js.map +1 -0
  127. package/dist/index.d.ts +10 -0
  128. package/dist/index.d.ts.map +1 -1
  129. package/dist/index.js +5 -0
  130. package/dist/index.js.map +1 -1
  131. package/dist/mcp-server.d.ts +207 -2
  132. package/dist/mcp-server.d.ts.map +1 -1
  133. package/dist/mcp-server.js +254 -54
  134. package/dist/mcp-server.js.map +1 -1
  135. package/dist/model-features.d.ts.map +1 -1
  136. package/dist/model-features.js +11 -2
  137. package/dist/model-features.js.map +1 -1
  138. package/dist/normalize.d.ts +7 -7
  139. package/dist/normalize.js +8 -8
  140. package/dist/provider-catalog.d.ts +17 -2
  141. package/dist/provider-catalog.d.ts.map +1 -1
  142. package/dist/provider-catalog.js +112 -0
  143. package/dist/provider-catalog.js.map +1 -1
  144. package/dist/proxy.d.ts +49 -7
  145. package/dist/proxy.d.ts.map +1 -1
  146. package/dist/proxy.js +765 -80
  147. package/dist/proxy.js.map +1 -1
  148. package/dist/registry-discovery.d.ts.map +1 -1
  149. package/dist/registry-discovery.js +4 -4
  150. package/dist/registry-discovery.js.map +1 -1
  151. package/dist/registry-query.d.ts +2 -2
  152. package/dist/registry-query.d.ts.map +1 -1
  153. package/dist/registry-query.js +60 -9
  154. package/dist/registry-query.js.map +1 -1
  155. package/dist/registry-routing.d.ts +65 -0
  156. package/dist/registry-routing.d.ts.map +1 -0
  157. package/dist/registry-routing.js +165 -0
  158. package/dist/registry-routing.js.map +1 -0
  159. package/dist/registry-runtime.d.ts +2 -0
  160. package/dist/registry-runtime.d.ts.map +1 -1
  161. package/dist/registry-runtime.js +167 -15
  162. package/dist/registry-runtime.js.map +1 -1
  163. package/dist/registry-selection.d.ts.map +1 -1
  164. package/dist/registry-selection.js +27 -3
  165. package/dist/registry-selection.js.map +1 -1
  166. package/dist/registry.d.ts +69 -0
  167. package/dist/registry.d.ts.map +1 -1
  168. package/dist/registry.js +135 -3
  169. package/dist/registry.js.map +1 -1
  170. package/dist/resilience.d.ts +15 -0
  171. package/dist/resilience.d.ts.map +1 -1
  172. package/dist/resilience.js +23 -1
  173. package/dist/resilience.js.map +1 -1
  174. package/dist/security.js +6 -6
  175. package/dist/security.js.map +1 -1
  176. package/dist/server.d.ts +44 -2
  177. package/dist/server.d.ts.map +1 -1
  178. package/dist/server.js +329 -34
  179. package/dist/server.js.map +1 -1
  180. package/dist/tally.d.ts +80 -0
  181. package/dist/tally.d.ts.map +1 -0
  182. package/dist/tally.js +176 -0
  183. package/dist/tally.js.map +1 -0
  184. package/dist/types.d.ts +64 -3
  185. package/dist/types.d.ts.map +1 -1
  186. package/dist/wire-anthropic.d.ts +264 -0
  187. package/dist/wire-anthropic.d.ts.map +1 -0
  188. package/dist/wire-anthropic.js +960 -0
  189. package/dist/wire-anthropic.js.map +1 -0
  190. package/package.json +106 -97
  191. package/logo.png +0 -0
package/README.md CHANGED
@@ -1,19 +1,10 @@
1
1
  <p align="center">
2
- <img src="logo.png" alt="Kosha — AI Model Discovery" width="140" />
2
+ <img src="logo.svg" alt="Kosha — AI Model Discovery" width="140" />
3
3
  </p>
4
4
 
5
- <h1 align="center">kosha-discovery — कोश</h1>
5
+ # kosha-discovery
6
6
 
7
- <p align="center"><strong>AI Model & Provider Discovery Registry</strong></p>
8
-
9
- <p align="center">
10
- <a href="https://www.npmjs.com/package/@sriinnu/kosha-discovery"><img src="https://img.shields.io/npm/v/%40sriinnu%2Fkosha-discovery?color=7C3AED&label=npm" alt="npm version" /></a>
11
- <a href="https://www.npmjs.com/package/@sriinnu/kosha-discovery"><img src="https://img.shields.io/npm/dm/%40sriinnu%2Fkosha-discovery?color=0EA5E9&label=downloads" alt="npm downloads" /></a>
12
- <a href="https://github.com/sriinnu/kosha-discovery/blob/main/LICENSE"><img src="https://img.shields.io/github/license/sriinnu/kosha-discovery?color=F59E0B" alt="license" /></a>
13
- <a href="https://www.npmjs.com/package/@sriinnu/kosha-discovery"><img src="https://img.shields.io/node/v/%40sriinnu%2Fkosha-discovery?color=5B21B6" alt="node version" /></a>
14
- </p>
15
-
16
- Kosha (कोश — *treasury*) discovers AI models across providers, resolves credentials, enriches with pricing, and exposes the catalog through a library, CLI, HTTP API, and a built-in OpenAI-compatible proxy. One source of truth for model identity, pricing, and routing — so your app doesn't break when providers ship new SKUs or change rates.
7
+ AI model and provider discovery registry. Discovers models across providers, resolves credentials, enriches with pricing, and exposes the catalog through a library, CLI, HTTP API, and an OpenAI-compatible proxy.
17
8
 
18
9
  ## Install
19
10
 
@@ -22,6 +13,8 @@ npm install @sriinnu/kosha-discovery # library / server
22
13
  npm install -g @sriinnu/kosha-discovery # global `kosha` CLI
23
14
  ```
24
15
 
16
+ Requires Node.js 22+.
17
+
25
18
  ## Quick start
26
19
 
27
20
  ### Library
@@ -31,9 +24,9 @@ import { createKosha } from "@sriinnu/kosha-discovery";
31
24
 
32
25
  const kosha = await createKosha();
33
26
 
34
- const models = kosha.models(); // all
35
- const cheapest = kosha.cheapestModels({ role: "image" }); // ranked
36
- const sonnet = kosha.model("sonnet"); // alias resolves
27
+ const models = kosha.models(); // all discovered models
28
+ const cheapest = kosha.cheapestModels({ role: "image" }); // ranked by price
29
+ const sonnet = kosha.model("sonnet"); // alias resolves to canonical ID
37
30
  console.log(sonnet.pricing); // { inputPerMillion: 3, outputPerMillion: 15, ... }
38
31
  ```
39
32
 
@@ -45,10 +38,10 @@ kosha list --provider anthropic # filter from local cache
45
38
  kosha model sonnet # details for one model (alias-aware)
46
39
  kosha cheapest --role embeddings # rank cheapest for a role
47
40
  kosha update # force a fresh fetch
48
- kosha serve --port 3000 # HTTP API
41
+ kosha serve --port 3000 # HTTP API (binds 127.0.0.1; --host 0.0.0.0 + KOSHA_PROXY_TOKEN to expose)
49
42
  ```
50
43
 
51
- After each discovery, a stable v1 manifest lands at `~/.kosha/registry.json` — any tool that reads JSON can consume it:
44
+ After each discovery, a stable v1 manifest lands at `~/.kosha/registry.json`:
52
45
 
53
46
  ```bash
54
47
  jq '.models[] | select(.pricing.inputPerMillion < 0.1) | .modelId' ~/.kosha/registry.json
@@ -108,7 +101,19 @@ const routed = await client.chat.completions.create({
108
101
 
109
102
  The response always includes `x-kosha-model`, `x-kosha-provider`, and `x-kosha-requested` headers so the caller knows exactly what ran.
110
103
 
111
- Supported transports: `openai`, `openai-compatible-http`, `ollama`. Anthropic, Google, Bedrock, and Vertex require wire-format translation not yet proxied.
104
+ Supported transports: `openai`, `openai-compatible-http`, `ollama`, and `anthropic`. Anthropic is bridged through a built-in OpenAI ↔ Anthropic wire-format translator that carries streaming, tools and tool calls, `image_url` parts, `response_format`, and `reasoning_effort`; anything it can't map faithfully (audio input, non-function tools) fails over to a native OpenAI-compatible route. Google, Bedrock, and Vertex speak SDK-specific wire formats and are not yet proxied.
105
+
106
+ The server binds `127.0.0.1` by default. To expose it, run `kosha serve --host 0.0.0.0` **with** `KOSHA_PROXY_TOKEN` set; the proxy then requires `Authorization: Bearer <token>` (or `x-kosha-token`). Full reference: [docs/api.md](docs/api.md#openai-compatible-proxy).
107
+
108
+ ### MCP server
109
+
110
+ `kosha-mcp` exposes the registry to AI agents over the Model Context Protocol on stdio: model lookup, cheapest / strategy-ranked routes, provider health, and context-management advice.
111
+
112
+ ```bash
113
+ claude mcp add kosha -- kosha-mcp
114
+ ```
115
+
116
+ Tools and protocol details: [docs/mcp.md](docs/mcp.md).
112
117
 
113
118
  ## Supported providers
114
119
 
@@ -121,6 +126,7 @@ Supported transports: `openai`, `openai-compatible-http`, `ollama`. Anthropic, G
121
126
  | Vertex AI | API + gcloud | `GOOGLE_APPLICATION_CREDENTIALS`, ADC |
122
127
  | Ollama | local API | — (local) |
123
128
  | OpenRouter | API | `OPENROUTER_API_KEY` *(optional)* |
129
+ | Vercel AI Gateway | `/v1/models` | `AI_GATEWAY_API_KEY`, `VERCEL_OIDC_TOKEN` *(public discovery, required for execution)* |
124
130
  | NVIDIA / Together / Fireworks / Groq / Cerebras / Cohere / DeepInfra / Perplexity | API | provider key env var |
125
131
  | DeepSeek / Mistral / Moonshot (Kimi) / GLM (Zhipu) / Z.AI / MiniMax | API | provider key env var |
126
132
 
@@ -128,11 +134,47 @@ Full credential setup: [docs/credentials.md](docs/credentials.md).
128
134
 
129
135
  ## Architecture
130
136
 
131
- <p align="center">
132
- <img src="architecture.svg" alt="Kosha Architecture" width="720" />
133
- </p>
137
+ Discovery layer talks to provider APIs and local catalogs. Enrichment layer fills pricing and context windows from the LiteLLM catalog and models.dev. Resilience layer (circuit breaker + stale-cache fallback + health tracker) keeps a flaky provider a degraded read, never a crash. Manifest layer writes a v1-stable JSON snapshot so downstream consumers read prices from one source instead of inventing their own. Proxy layer exposes an OpenAI-compatible endpoint that resolves `kosha:cheapest[…]` hints at request time, injects credentials, and forwards to the winning provider.
138
+
139
+ ## Development
140
+
141
+ ```bash
142
+ pnpm install
143
+ pnpm run build # compile to dist/
144
+ pnpm run typecheck # tsc --noEmit
145
+ pnpm run lint # biome lint
146
+ pnpm test # vitest run
147
+ pnpm run check # lint + build + test
148
+ ```
149
+
150
+ ### Project layout
134
151
 
135
- Discovery layer talks to provider APIs and local catalogs. Enrichment layer fills pricing and context windows from the LiteLLM catalog and models.dev. Resilience layer (circuit breaker + stale-cache fallback + health tracker) keeps a flaky provider a degraded read, never a crash. Manifest layer writes a v1-stable JSON snapshot so downstream consumers — `tokmeter`, `chitragupta`, `ayuh` — read prices from one source instead of inventing their own. Proxy layer exposes an OpenAI-compatible endpoint that resolves `kosha:cheapest[…]` hints at request time, injects credentials, and forwards to the winning provider.
152
+ ```
153
+ src/
154
+ cli.ts # CLI entry point
155
+ cli-commands.ts # command implementations
156
+ registry.ts # ModelRegistry public API
157
+ registry-runtime.ts # discovery, enrichment, cache, manifest export
158
+ registry-query.ts # model/role/capability queries
159
+ registry-selection.ts # cheapest candidates, binding hints
160
+ registry-routing.ts # route ranking strategies
161
+ discovery/ # provider discoverers
162
+ enrichment/ # LiteLLM pricing enrichment
163
+ credentials/ # credential resolution
164
+ proxy.ts # OpenAI-compatible proxy
165
+ server.ts # HTTP API server
166
+ mcp-server.ts # MCP server
167
+ tally.ts # zero-dependency token usage + cost tally
168
+ cost.ts # ledger I/O, budget gates
169
+ types.ts # shared types
170
+ ```
171
+
172
+ ### Adding a provider
173
+
174
+ 1. Create `src/discovery/<provider>.ts` implementing `ProviderDiscoverer`.
175
+ 2. Register it in `src/discovery/index.ts` `DISCOVERER_REGISTRY`.
176
+ 3. Add credential env vars to `src/provider-catalog.ts`.
177
+ 4. Add tests in `test/discovery/<provider>.test.ts`.
136
178
 
137
179
  ## Docs
138
180
 
@@ -141,9 +183,11 @@ Discovery layer talks to provider APIs and local catalogs. Enrichment layer fill
141
183
  | [Credentials](docs/credentials.md) | Env vars, CLI tools, and config files for every provider |
142
184
  | [CLI](docs/cli.md) | Commands, flags, examples |
143
185
  | [HTTP API](docs/api.md) | Endpoints, parameters, response schemas |
186
+ | [MCP server](docs/mcp.md) | Tools, protocol negotiation, client setup |
144
187
  | [Configuration](docs/configuration.md) | Aliases, routing, enrichment, programmatic config |
145
188
  | [Architecture](docs/architecture.md) | Discovery flow, module map, adding providers |
146
189
  | [Resilience](docs/resilience.md) | Circuit breakers, stale cache, health |
190
+ | [Operations](docs/operations.md) | Deployment sizing, metrics, spend ledger, recovery recipes |
147
191
  | [Security](docs/security.md) | Threat catalogue, runtime scanning, pre-commit hook |
148
192
  | [Discovery Plane v1](docs/discovery-plane-v1.md) | Stable daemon contract (deltas, SSE watch, binding hints) |
149
193
 
@@ -158,10 +202,6 @@ git tag -s vX.Y.Z -m "vX.Y.Z" && git push origin vX.Y.Z
158
202
 
159
203
  The workflow checks tag ↔ package.json match, builds, tests, publishes to npm, and creates the GitHub Release. Requires the `NPM_TOKEN` secret.
160
204
 
161
- ## Credits
162
-
163
- [litellm](https://github.com/BerriAI/litellm) (pricing data) · [openrouter](https://openrouter.ai) · [ollama](https://ollama.ai) · [chitragupta](https://github.com/sriinnu/chitragupta) (registry patterns) · [takumi](https://github.com/sriinnu/takumi) (routing needs that drove kosha's creation).
164
-
165
205
  ## License
166
206
 
167
207
  MIT
package/dist/aliases.d.ts CHANGED
@@ -9,7 +9,12 @@
9
9
  * Curated default aliases mapping short names to canonical model IDs.
10
10
  *
11
11
  * These are production-ready and cover the most commonly referenced
12
- * models across major providers. Updated February 2026.
12
+ * models across major providers. Updated September 2026.
13
+ *
14
+ * Convention: a bare family name (`opus`, `sonnet`, `gemini-pro`) always
15
+ * tracks the newest generally-available model in that family; a suffixed
16
+ * form (`opus-4.8`, `sonnet-4`) pins a generation and is kept for
17
+ * backward compatibility when the bare alias moves on.
13
18
  */
14
19
  export declare const DEFAULT_ALIASES: Readonly<Record<string, string>>;
15
20
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"aliases.d.ts","sourceRoot":"","sources":["../src/aliases.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;GAKG;AACH,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAgD5D,CAAC;AAEF;;;;;GAKG;AACH,qBAAa,aAAa;IACzB,sEAAsE;IACtE,OAAO,CAAC,OAAO,CAAsB;IAErC;;;OAGG;gBACS,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAUlD;;;OAGG;IACH,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAIpC;;OAEG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAUzC;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAI9C;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIhC;;OAEG;IACH,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAG7B"}
1
+ {"version":3,"file":"aliases.d.ts","sourceRoot":"","sources":["../src/aliases.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;;;;;GAUG;AACH,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAsE5D,CAAC;AAEF;;;;;GAKG;AACH,qBAAa,aAAa;IACzB,sEAAsE;IACtE,OAAO,CAAC,OAAO,CAAsB;IAErC;;;OAGG;IACH,YAAY,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAQjD;IAED;;;OAGG;IACH,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEnC;IAED;;OAEG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAQxC;IAED;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAE7C;IAED;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAE/B;IAED;;OAEG;IACH,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAE5B;CACD"}
package/dist/aliases.js CHANGED
@@ -9,27 +9,53 @@
9
9
  * Curated default aliases mapping short names to canonical model IDs.
10
10
  *
11
11
  * These are production-ready and cover the most commonly referenced
12
- * models across major providers. Updated February 2026.
12
+ * models across major providers. Updated September 2026.
13
+ *
14
+ * Convention: a bare family name (`opus`, `sonnet`, `gemini-pro`) always
15
+ * tracks the newest generally-available model in that family; a suffixed
16
+ * form (`opus-4.8`, `sonnet-4`) pins a generation and is kept for
17
+ * backward compatibility when the bare alias moves on.
13
18
  */
14
19
  export const DEFAULT_ALIASES = {
15
- // ── Anthropic — Claude 4.6 family (latest as of Feb 2026) ──
16
- "opus": "claude-opus-4-6",
17
- "opus-4": "claude-opus-4-6",
18
- "sonnet": "claude-sonnet-4-6",
20
+ // ── Anthropic — Claude 5 family (latest as of Sep 2026) ──
21
+ // Bare IDs, never date-suffixed: `claude-haiku-4-5` is the canonical
22
+ // form; the dated `claude-haiku-4-5-20251001` snapshot still resolves via
23
+ // normalizeModelId() for callers that pinned it.
24
+ "fable": "claude-fable-5-1",
25
+ "fable-5.1": "claude-fable-5-1",
26
+ "fable-5": "claude-fable-5",
27
+ "mythos": "claude-mythos-5-1",
28
+ "mythos-5.1": "claude-mythos-5-1",
29
+ "opus": "claude-opus-5",
30
+ "opus-5": "claude-opus-5",
31
+ "opus-4": "claude-opus-4-8",
32
+ "opus-4.8": "claude-opus-4-8",
33
+ "opus-4.7": "claude-opus-4-7",
34
+ "sonnet": "claude-sonnet-5",
35
+ "sonnet-5": "claude-sonnet-5",
19
36
  "sonnet-4": "claude-sonnet-4-6",
20
- "haiku": "claude-haiku-4-5-20251001",
21
- "haiku-4.5": "claude-haiku-4-5-20251001",
22
- // ── OpenAI — latest reasoning and chat models ──
37
+ "sonnet-4.6": "claude-sonnet-4-6",
38
+ "haiku": "claude-haiku-4-5",
39
+ "haiku-4.5": "claude-haiku-4-5",
40
+ // ── OpenAI — GPT-5 family, GPT-4o, and o-series reasoning ──
41
+ "gpt5": "gpt-5",
42
+ "gpt5-mini": "gpt-5-mini",
43
+ "gpt5-nano": "gpt-5-nano",
44
+ "gpt5-pro": "gpt-5-pro",
45
+ "gpt4.1": "gpt-4.1",
23
46
  "gpt4o": "gpt-4o",
24
47
  "gpt4o-mini": "gpt-4o-mini",
25
48
  "o1": "o1",
26
49
  "o3": "o3",
27
50
  "o3-mini": "o3-mini",
28
51
  "o4-mini": "o4-mini",
29
- // ── Google — Gemini 2.5 series ──
30
- "gemini-pro": "gemini-2.5-pro-preview-05-06",
31
- "gemini-flash": "gemini-2.5-flash-preview-04-17",
32
- "gemini-flash-lite": "gemini-2.0-flash-lite",
52
+ // ── Google — Gemini 2.5 GA IDs (the dated -preview- IDs are retired) ──
53
+ "gemini-pro": "gemini-2.5-pro",
54
+ "gemini-flash": "gemini-2.5-flash",
55
+ "gemini-flash-lite": "gemini-2.5-flash-lite",
56
+ // ── Moonshot — Kimi family ──
57
+ "kimi": "kimi-k3",
58
+ "kimi-k3": "kimi-k3",
33
59
  // ── Local — latest popular open-weight models for Ollama ──
34
60
  "qwen": "qwen3:8b",
35
61
  "llama": "llama3.3:latest",
@@ -1 +1 @@
1
- {"version":3,"file":"aliases.js","sourceRoot":"","sources":["../src/aliases.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,eAAe,GAAqC;IAChE,8DAA8D;IAC9D,MAAM,EAAE,iBAAiB;IACzB,QAAQ,EAAE,iBAAiB;IAC3B,QAAQ,EAAE,mBAAmB;IAC7B,UAAU,EAAE,mBAAmB;IAC/B,OAAO,EAAE,2BAA2B;IACpC,WAAW,EAAE,2BAA2B;IAExC,kDAAkD;IAClD,OAAO,EAAE,QAAQ;IACjB,YAAY,EAAE,aAAa;IAC3B,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,SAAS,EAAE,SAAS;IACpB,SAAS,EAAE,SAAS;IAEpB,mCAAmC;IACnC,YAAY,EAAE,8BAA8B;IAC5C,cAAc,EAAE,gCAAgC;IAChD,mBAAmB,EAAE,uBAAuB;IAE5C,6DAA6D;IAC7D,MAAM,EAAE,UAAU;IAClB,OAAO,EAAE,iBAAiB;IAC1B,WAAW,EAAE,kBAAkB;IAC/B,UAAU,EAAE,oBAAoB;IAEhC,sDAAsD;IACtD,gBAAgB,EAAE,yCAAyC;IAC3D,gBAAgB,EAAE,wCAAwC;IAC1D,eAAe,EAAE,sCAAsC;IAEvD,mCAAmC;IACnC,eAAe,EAAE,sBAAsB;IACvC,eAAe,EAAE,sBAAsB;IACvC,mBAAmB,EAAE,kBAAkB;IACvC,SAAS,EAAE,sBAAsB;IAEjC,8BAA8B;IAC9B,YAAY,EAAE,yBAAyB;IACvC,cAAc,EAAE,oBAAoB;IAEpC,gEAAgE;IAChE,aAAa,EAAE,wBAAwB;IACvC,aAAa,EAAE,wBAAwB;IACvC,OAAO,EAAE,kBAAkB;IAC3B,cAAc,EAAE,sBAAsB;CACtC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,OAAO,aAAa;IACzB,sEAAsE;IAC9D,OAAO,CAAsB;IAErC;;;OAGG;IACH,YAAY,aAAsC;QACjD,IAAI,CAAC,OAAO,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC;QAExD,IAAI,aAAa,EAAE,CAAC;YACnB,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;gBAC9D,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAClC,CAAC;QACF,CAAC;IACF,CAAC;IAED;;;OAGG;IACH,OAAO,CAAC,WAAmB;QAC1B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,WAAW,CAAC;IACrD,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,OAAe;QAC7B,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC5C,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;gBACxB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpB,CAAC;QACF,CAAC;QACD,OAAO,MAAM,CAAC;IACf,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,KAAa,EAAE,OAAe;QACtC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,KAAa;QACxB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,GAAG;QACF,OAAO,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;CACD"}
1
+ {"version":3,"file":"aliases.js","sourceRoot":"","sources":["../src/aliases.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,UAAU,UAAU,CAAC,CAAC;IACrB,IAAI,EAAE,CAAC,CAAC;IACR,SAAS,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,qBAAa,UAAU;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEtB,QAAQ,CAAC,EAAE,MAAM;IAI7B;;;OAGG;IACG,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAmBxD;;;;;OAKG;IACG,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBjD;;OAEG;IACG,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS5C;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAY5B;;OAEG;IACH,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IAQpD;;;OAGG;IACH,OAAO,CAAC,SAAS;IAKjB;;OAEG;YACW,SAAS;CAGvB"}
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,UAAU,UAAU,CAAC,CAAC;IACrB,IAAI,EAAE,CAAC,CAAC;IACR,SAAS,EAAE,MAAM,CAAC;CAClB;AAqBD;;;;;GAKG;AACH,qBAAa,UAAU;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAElC,YAAY,QAAQ,CAAC,EAAE,MAAM,EAE5B;IAED;;;OAGG;IACG,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAyBvD;IAED;;;;;OAKG;IACG,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAehD;IAED;;OAEG;IACG,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAO3C;IAED;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAU3B;IAED;;OAEG;IACH,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAEnD;IAMD;;;OAGG;IACH,OAAO,CAAC,SAAS;IAKjB;;OAEG;YACW,SAAS;CAGvB"}
package/dist/cache.js CHANGED
@@ -6,11 +6,28 @@
6
6
  * Each cache key maps to a `{key}.json` file inside the cache directory.
7
7
  * @module
8
8
  */
9
- import { mkdir, readFile, readdir, rename, unlink, writeFile } from "fs/promises";
9
+ import { mkdir, readFile, readdir, rename, stat, unlink, writeFile } from "fs/promises";
10
10
  import { randomBytes } from "crypto";
11
11
  import { homedir } from "os";
12
12
  import { join } from "path";
13
13
  import { assertCleanPayload } from "./security.js";
14
+ /**
15
+ * Hard ceiling on a single cache file before we even attempt to parse it.
16
+ * A legitimate full-registry snapshot is a few hundred KB; anything past
17
+ * this is either corruption or a hostile payload crafted to exhaust memory
18
+ * (a "JSON bomb"). We reject it as a cache miss rather than feeding it to
19
+ * `JSON.parse`, which buffers and parses the whole string eagerly.
20
+ */
21
+ const MAX_CACHE_FILE_BYTES = 25 * 1024 * 1024;
22
+ /**
23
+ * Strip CR/LF (and other control chars) from a cache key before it is
24
+ * interpolated into a log line. A key can derive from a CLI/HTTP-supplied
25
+ * provider id (`provider_<id>`), so logging it verbatim would let crafted
26
+ * input forge extra log records (log injection / CWE-117).
27
+ */
28
+ function sanitizeKeyForLog(key) {
29
+ return key.replace(/[\r\n\t]/g, "").slice(0, 200);
30
+ }
14
31
  /**
15
32
  * Simple file-based JSON cache with TTL support.
16
33
  * Stores discovered provider data to avoid re-fetching on every startup.
@@ -29,6 +46,12 @@ export class KoshaCache {
29
46
  async get(key) {
30
47
  try {
31
48
  const filePath = this.keyToPath(key);
49
+ const { size } = await stat(filePath);
50
+ if (size > MAX_CACHE_FILE_BYTES) {
51
+ console.warn(`KoshaCache: cache file for key "${sanitizeKeyForLog(key)}" is ${size} bytes (> ${MAX_CACHE_FILE_BYTES}); refusing to parse and invalidating`);
52
+ await this.invalidate(key);
53
+ return null;
54
+ }
32
55
  const raw = await readFile(filePath, "utf-8");
33
56
  const entry = JSON.parse(raw);
34
57
  assertCleanPayload(entry, `cache/${key}`);
@@ -41,7 +64,7 @@ export class KoshaCache {
41
64
  await this.invalidate(key);
42
65
  }
43
66
  else if (err instanceof SyntaxError) {
44
- console.warn(`KoshaCache: corrupted cache file for key "${key}"`);
67
+ console.warn(`KoshaCache: corrupted cache file for key "${sanitizeKeyForLog(key)}"`);
45
68
  }
46
69
  return null;
47
70
  }
package/dist/cache.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * kosha-discovery — Claude generation parsing and per-generation behaviour.
3
+ *
4
+ * One source of truth for "which Claude is this and what does it accept",
5
+ * shared by the catalog feature inference (`model-features.ts`) and the
6
+ * proxy's wire translator (`wire-anthropic.ts`). Keeping it in one module
7
+ * means an OpenRouter-style `anthropic/claude-sonnet-4.6`, a Bedrock-style
8
+ * `anthropic.claude-opus-4-8-v1:0`, and the bare `claude-opus-4-8` all
9
+ * classify identically everywhere.
10
+ * @module
11
+ */
12
+ export interface ClaudeGeneration {
13
+ family: "opus" | "sonnet" | "haiku" | "fable" | "mythos";
14
+ major: number;
15
+ minor: number;
16
+ }
17
+ /**
18
+ * Parse the generation out of a family-first Claude ID such as
19
+ * `claude-opus-4-8`, `claude-sonnet-5`, `claude-fable-5-1`, a dated
20
+ * `claude-haiku-4-5-20251001`, or a prefixed / dotted variant. Legacy
21
+ * version-first IDs (`claude-3-5-sonnet-…`, `claude-2.1`) and non-Claude IDs
22
+ * return `undefined`.
23
+ */
24
+ export declare function parseClaudeGeneration(modelId: string): ClaudeGeneration | undefined;
25
+ /** How a Claude model treats `temperature` / `top_p`. */
26
+ export type SamplingSupport = "both" | "one" | "none";
27
+ /**
28
+ * Sampling parameters were removed on Opus 4.7 and every later model (Opus
29
+ * 4.8, Opus 5, Sonnet 5, Fable, Mythos): sending them returns a 400. Every
30
+ * Claude 4.x model accepts at most one of `temperature` / `top_p` (sending
31
+ * both is a 400). Claude 3.x and unrecognized IDs accept both.
32
+ */
33
+ export declare function claudeSamplingSupport(modelId: string): SamplingSupport;
34
+ /** Anthropic's accepted `temperature` range; OpenAI's is 0..2. */
35
+ export declare const CLAUDE_TEMPERATURE_MAX = 1;
36
+ export type ClaudeEffort = "low" | "medium" | "high" | "xhigh" | "max";
37
+ /**
38
+ * Effort levels a generation accepts under `output_config.effort`; empty when
39
+ * effort is unsupported. `xhigh` arrived with Opus 4.7; `max` with 4.6; in
40
+ * the 4.5 generation only Opus 4.5 had an effort parameter at all (Sonnet
41
+ * 4.5 and Haiku 4.5 reject it).
42
+ */
43
+ export declare function claudeEffortLadder(modelId: string): readonly ClaudeEffort[];
44
+ /**
45
+ * Last-assistant-turn prefill returns a 400 on Opus 4.6 / Sonnet 4.6 and every
46
+ * later model. Older generations still accept a trailing assistant message.
47
+ */
48
+ export declare function claudeSupportsPrefill(modelId: string): boolean;
49
+ /**
50
+ * Native JSON-schema structured outputs (`output_config.format`) shipped with
51
+ * the 4.5 generation (Sonnet 4.5, Haiku 4.5, Opus 4.1) and every model since.
52
+ */
53
+ export declare function claudeSupportsNativeJsonSchema(modelId: string): boolean;
54
+ /**
55
+ * Claude Fable 5.1 and Claude Mythos 5.1 return a 400 for forced tool use
56
+ * (`tool_choice` `any` / `tool`); everything else still honours it.
57
+ */
58
+ export declare function claudeSupportsForcedToolChoice(modelId: string): boolean;
59
+ //# sourceMappingURL=claude-generation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-generation.d.ts","sourceRoot":"","sources":["../src/claude-generation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,gBAAgB;IAChC,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;IACzD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACd;AAgBD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAUnF;AAMD,yDAAyD;AACzD,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AAEtD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,CAMtE;AAED,kEAAkE;AAClE,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAExC,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC;AAEvE;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,YAAY,EAAE,CAO3E;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAI9D;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAKvE;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAKvE"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * kosha-discovery — Claude generation parsing and per-generation behaviour.
3
+ *
4
+ * One source of truth for "which Claude is this and what does it accept",
5
+ * shared by the catalog feature inference (`model-features.ts`) and the
6
+ * proxy's wire translator (`wire-anthropic.ts`). Keeping it in one module
7
+ * means an OpenRouter-style `anthropic/claude-sonnet-4.6`, a Bedrock-style
8
+ * `anthropic.claude-opus-4-8-v1:0`, and the bare `claude-opus-4-8` all
9
+ * classify identically everywhere.
10
+ * @module
11
+ */
12
+ /**
13
+ * Normalize the many spellings of a Claude ID down to the bare family-first
14
+ * form: strip a `vendor/` or `anthropic.` prefix, a Bedrock `-v1:0` suffix,
15
+ * and turn dotted versions (`4.6`) into dashed (`4-6`).
16
+ */
17
+ function normalizeClaudeId(modelId) {
18
+ return modelId
19
+ .toLowerCase()
20
+ .replace(/^.*\//, "")
21
+ .replace(/^anthropic\./, "")
22
+ .replace(/-v\d+:\d+$/, "")
23
+ .replace(/\./g, "-");
24
+ }
25
+ /**
26
+ * Parse the generation out of a family-first Claude ID such as
27
+ * `claude-opus-4-8`, `claude-sonnet-5`, `claude-fable-5-1`, a dated
28
+ * `claude-haiku-4-5-20251001`, or a prefixed / dotted variant. Legacy
29
+ * version-first IDs (`claude-3-5-sonnet-…`, `claude-2.1`) and non-Claude IDs
30
+ * return `undefined`.
31
+ */
32
+ export function parseClaudeGeneration(modelId) {
33
+ // Minor is 1-2 digits so an 8-digit date suffix (`-20250514`) is never
34
+ // mistaken for a minor version.
35
+ const m = /^claude-(opus|sonnet|haiku|fable|mythos)-(\d+)(?:-(\d{1,2}))?(?:-\d{8})?$/.exec(normalizeClaudeId(modelId));
36
+ if (!m)
37
+ return undefined;
38
+ return {
39
+ family: m[1],
40
+ major: Number(m[2]),
41
+ minor: m[3] !== undefined ? Number(m[3]) : 0,
42
+ };
43
+ }
44
+ function atLeast(gen, major, minor) {
45
+ return gen.major > major || (gen.major === major && gen.minor >= minor);
46
+ }
47
+ /**
48
+ * Sampling parameters were removed on Opus 4.7 and every later model (Opus
49
+ * 4.8, Opus 5, Sonnet 5, Fable, Mythos): sending them returns a 400. Every
50
+ * Claude 4.x model accepts at most one of `temperature` / `top_p` (sending
51
+ * both is a 400). Claude 3.x and unrecognized IDs accept both.
52
+ */
53
+ export function claudeSamplingSupport(modelId) {
54
+ const gen = parseClaudeGeneration(modelId);
55
+ if (!gen)
56
+ return "both";
57
+ if (atLeast(gen, 4, 7))
58
+ return "none";
59
+ if (gen.major >= 4)
60
+ return "one";
61
+ return "both";
62
+ }
63
+ /** Anthropic's accepted `temperature` range; OpenAI's is 0..2. */
64
+ export const CLAUDE_TEMPERATURE_MAX = 1;
65
+ /**
66
+ * Effort levels a generation accepts under `output_config.effort`; empty when
67
+ * effort is unsupported. `xhigh` arrived with Opus 4.7; `max` with 4.6; in
68
+ * the 4.5 generation only Opus 4.5 had an effort parameter at all (Sonnet
69
+ * 4.5 and Haiku 4.5 reject it).
70
+ */
71
+ export function claudeEffortLadder(modelId) {
72
+ const gen = parseClaudeGeneration(modelId);
73
+ if (!gen)
74
+ return [];
75
+ if (atLeast(gen, 4, 7))
76
+ return ["low", "medium", "high", "xhigh", "max"];
77
+ if (atLeast(gen, 4, 6))
78
+ return ["low", "medium", "high", "max"];
79
+ if (atLeast(gen, 4, 5))
80
+ return gen.family === "opus" ? ["low", "medium", "high"] : [];
81
+ return [];
82
+ }
83
+ /**
84
+ * Last-assistant-turn prefill returns a 400 on Opus 4.6 / Sonnet 4.6 and every
85
+ * later model. Older generations still accept a trailing assistant message.
86
+ */
87
+ export function claudeSupportsPrefill(modelId) {
88
+ const gen = parseClaudeGeneration(modelId);
89
+ if (!gen)
90
+ return true;
91
+ return !atLeast(gen, 4, 6);
92
+ }
93
+ /**
94
+ * Native JSON-schema structured outputs (`output_config.format`) shipped with
95
+ * the 4.5 generation (Sonnet 4.5, Haiku 4.5, Opus 4.1) and every model since.
96
+ */
97
+ export function claudeSupportsNativeJsonSchema(modelId) {
98
+ const gen = parseClaudeGeneration(modelId);
99
+ if (!gen)
100
+ return false;
101
+ if (atLeast(gen, 4, 5))
102
+ return true;
103
+ return gen.family === "opus" && gen.major === 4 && gen.minor === 1;
104
+ }
105
+ /**
106
+ * Claude Fable 5.1 and Claude Mythos 5.1 return a 400 for forced tool use
107
+ * (`tool_choice` `any` / `tool`); everything else still honours it.
108
+ */
109
+ export function claudeSupportsForcedToolChoice(modelId) {
110
+ const gen = parseClaudeGeneration(modelId);
111
+ if (!gen)
112
+ return true;
113
+ if (gen.family !== "fable" && gen.family !== "mythos")
114
+ return true;
115
+ return !atLeast(gen, 5, 1);
116
+ }
117
+ //# sourceMappingURL=claude-generation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-generation.js","sourceRoot":"","sources":["../src/claude-generation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * `kosha doctor` — surface deprecation warnings and provider health at a
3
+ * glance. Pure projection over the registry: it reports what kosha already
4
+ * knows (deprecationDate, replacedBy, breaker state, routing reliability)
5
+ * without making any extra network calls.
6
+ *
7
+ * Pair with `kosha refresh` if you want the freshest deprecation metadata
8
+ * from each provider.
9
+ * @module
10
+ */
11
+ import type { ModelRegistry } from "./registry.js";
12
+ /** Exit code `doctor` uses to fail a CI run without looking like a crash. */
13
+ export declare const DOCTOR_CI_EXIT_CODE = 2;
14
+ /** Default deprecation window in days when `--deprecation-window` is absent. */
15
+ export declare const DOCTOR_DEFAULT_DEPRECATION_WINDOW = 30;
16
+ export declare function cmdDoctor(registry: ModelRegistry, flags: Record<string, string | boolean>): Promise<void>;
17
+ //# sourceMappingURL=cli-cmd-doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-cmd-doctor.d.ts","sourceRoot":"","sources":["../src/cli-cmd-doctor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAanD,6EAA6E;AAC7E,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAErC,gFAAgF;AAChF,eAAO,MAAM,iCAAiC,KAAK,CAAC;AAsBpD,wBAAsB,SAAS,CAAC,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAyC/G"}