@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.
- package/README.md +66 -26
- package/dist/aliases.d.ts +6 -1
- package/dist/aliases.d.ts.map +1 -1
- package/dist/aliases.js +38 -12
- package/dist/aliases.js.map +1 -1
- package/dist/cache.d.ts.map +1 -1
- package/dist/cache.js +25 -2
- package/dist/cache.js.map +1 -1
- package/dist/claude-generation.d.ts +59 -0
- package/dist/claude-generation.d.ts.map +1 -0
- package/dist/claude-generation.js +117 -0
- package/dist/claude-generation.js.map +1 -0
- package/dist/cli-cmd-doctor.d.ts +17 -0
- package/dist/cli-cmd-doctor.d.ts.map +1 -0
- package/dist/cli-cmd-doctor.js +199 -0
- package/dist/cli-cmd-doctor.js.map +1 -0
- package/dist/cli-cmd-model.js +2 -2
- package/dist/cli-cmd-model.js.map +1 -1
- package/dist/cli-cmd-spend.d.ts +10 -0
- package/dist/cli-cmd-spend.d.ts.map +1 -0
- package/dist/cli-cmd-spend.js +130 -0
- package/dist/cli-cmd-spend.js.map +1 -0
- package/dist/cli-commands.d.ts +4 -1
- package/dist/cli-commands.d.ts.map +1 -1
- package/dist/cli-commands.js +10 -2
- package/dist/cli-commands.js.map +1 -1
- package/dist/cli-format.d.ts.map +1 -1
- package/dist/cli-format.js +2 -1
- package/dist/cli-format.js.map +1 -1
- package/dist/cli-help.d.ts.map +1 -1
- package/dist/cli-help.js +4 -2
- package/dist/cli-help.js.map +1 -1
- package/dist/cli.js +10 -0
- package/dist/cli.js.map +1 -1
- package/dist/context-strategy.d.ts +48 -0
- package/dist/context-strategy.d.ts.map +1 -0
- package/dist/context-strategy.js +274 -0
- package/dist/context-strategy.js.map +1 -0
- package/dist/cost.d.ts +152 -0
- package/dist/cost.d.ts.map +1 -0
- package/dist/cost.js +377 -0
- package/dist/cost.js.map +1 -0
- package/dist/credentials/resolver.d.ts +17 -0
- package/dist/credentials/resolver.d.ts.map +1 -1
- package/dist/credentials/resolver.js +92 -34
- package/dist/credentials/resolver.js.map +1 -1
- package/dist/discovery/anthropic.d.ts +19 -1
- package/dist/discovery/anthropic.d.ts.map +1 -1
- package/dist/discovery/anthropic.js +112 -8
- package/dist/discovery/anthropic.js.map +1 -1
- package/dist/discovery/base.d.ts +7 -0
- package/dist/discovery/base.d.ts.map +1 -1
- package/dist/discovery/base.js +32 -4
- package/dist/discovery/base.js.map +1 -1
- package/dist/discovery/bedrock.d.ts.map +1 -1
- package/dist/discovery/cerebras.d.ts.map +1 -1
- package/dist/discovery/cohere.d.ts.map +1 -1
- package/dist/discovery/deepinfra.d.ts.map +1 -1
- package/dist/discovery/deepseek.d.ts.map +1 -1
- package/dist/discovery/fireworks.d.ts.map +1 -1
- package/dist/discovery/glm.d.ts.map +1 -1
- package/dist/discovery/google.d.ts +3 -1
- package/dist/discovery/google.d.ts.map +1 -1
- package/dist/discovery/google.js +13 -6
- package/dist/discovery/google.js.map +1 -1
- package/dist/discovery/groq.d.ts.map +1 -1
- package/dist/discovery/index.d.ts +3 -0
- package/dist/discovery/index.d.ts.map +1 -1
- package/dist/discovery/index.js +9 -0
- package/dist/discovery/index.js.map +1 -1
- package/dist/discovery/litellm-seed.js +12 -8
- package/dist/discovery/litellm-seed.js.map +1 -1
- package/dist/discovery/llama-cpp.d.ts.map +1 -1
- package/dist/discovery/lmstudio.d.ts +26 -0
- package/dist/discovery/lmstudio.d.ts.map +1 -0
- package/dist/discovery/lmstudio.js +93 -0
- package/dist/discovery/lmstudio.js.map +1 -0
- package/dist/discovery/minimax.d.ts.map +1 -1
- package/dist/discovery/mistral.d.ts.map +1 -1
- package/dist/discovery/modelsdev-seed.js +16 -12
- package/dist/discovery/modelsdev-seed.js.map +1 -1
- package/dist/discovery/moonshot.d.ts.map +1 -1
- package/dist/discovery/nvidia.d.ts.map +1 -1
- package/dist/discovery/ollama.d.ts.map +1 -1
- package/dist/discovery/openai-compatible.d.ts.map +1 -1
- package/dist/discovery/openai.d.ts.map +1 -1
- package/dist/discovery/openrouter.d.ts +29 -5
- package/dist/discovery/openrouter.d.ts.map +1 -1
- package/dist/discovery/openrouter.js +56 -18
- package/dist/discovery/openrouter.js.map +1 -1
- package/dist/discovery/perplexity.d.ts.map +1 -1
- package/dist/discovery/promo-overrides.js.map +1 -1
- package/dist/discovery/static-direct.d.ts +9 -1
- package/dist/discovery/static-direct.d.ts.map +1 -1
- package/dist/discovery/static-direct.js +68 -7
- package/dist/discovery/static-direct.js.map +1 -1
- package/dist/discovery/together.d.ts.map +1 -1
- package/dist/discovery/vercel.d.ts +45 -0
- package/dist/discovery/vercel.d.ts.map +1 -0
- package/dist/discovery/vercel.js +232 -0
- package/dist/discovery/vercel.js.map +1 -0
- package/dist/discovery/vertex.d.ts.map +1 -1
- package/dist/discovery/vllm.d.ts +26 -0
- package/dist/discovery/vllm.d.ts.map +1 -0
- package/dist/discovery/vllm.js +93 -0
- package/dist/discovery/vllm.js.map +1 -0
- package/dist/discovery/zai.d.ts.map +1 -1
- package/dist/discovery-contract.d.ts +8 -1
- package/dist/discovery-contract.d.ts.map +1 -1
- package/dist/discovery-contract.js +28 -1
- package/dist/discovery-contract.js.map +1 -1
- package/dist/discovery-routes.d.ts +9 -0
- package/dist/discovery-routes.d.ts.map +1 -1
- package/dist/discovery-routes.js +106 -18
- package/dist/discovery-routes.js.map +1 -1
- package/dist/enrichment/litellm-catalog.d.ts +1 -0
- package/dist/enrichment/litellm-catalog.d.ts.map +1 -1
- package/dist/enrichment/litellm-catalog.js.map +1 -1
- package/dist/enrichment/litellm.d.ts +1 -1
- package/dist/enrichment/litellm.d.ts.map +1 -1
- package/dist/enrichment/litellm.js +9 -3
- package/dist/enrichment/litellm.js.map +1 -1
- package/dist/entry.d.ts +14 -0
- package/dist/entry.d.ts.map +1 -0
- package/dist/entry.js +26 -0
- package/dist/entry.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp-server.d.ts +207 -2
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +254 -54
- package/dist/mcp-server.js.map +1 -1
- package/dist/model-features.d.ts.map +1 -1
- package/dist/model-features.js +11 -2
- package/dist/model-features.js.map +1 -1
- package/dist/normalize.d.ts +7 -7
- package/dist/normalize.js +8 -8
- package/dist/provider-catalog.d.ts +17 -2
- package/dist/provider-catalog.d.ts.map +1 -1
- package/dist/provider-catalog.js +112 -0
- package/dist/provider-catalog.js.map +1 -1
- package/dist/proxy.d.ts +49 -7
- package/dist/proxy.d.ts.map +1 -1
- package/dist/proxy.js +765 -80
- package/dist/proxy.js.map +1 -1
- package/dist/registry-discovery.d.ts.map +1 -1
- package/dist/registry-discovery.js +4 -4
- package/dist/registry-discovery.js.map +1 -1
- package/dist/registry-query.d.ts +2 -2
- package/dist/registry-query.d.ts.map +1 -1
- package/dist/registry-query.js +60 -9
- package/dist/registry-query.js.map +1 -1
- package/dist/registry-routing.d.ts +65 -0
- package/dist/registry-routing.d.ts.map +1 -0
- package/dist/registry-routing.js +165 -0
- package/dist/registry-routing.js.map +1 -0
- package/dist/registry-runtime.d.ts +2 -0
- package/dist/registry-runtime.d.ts.map +1 -1
- package/dist/registry-runtime.js +167 -15
- package/dist/registry-runtime.js.map +1 -1
- package/dist/registry-selection.d.ts.map +1 -1
- package/dist/registry-selection.js +27 -3
- package/dist/registry-selection.js.map +1 -1
- package/dist/registry.d.ts +69 -0
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +135 -3
- package/dist/registry.js.map +1 -1
- package/dist/resilience.d.ts +15 -0
- package/dist/resilience.d.ts.map +1 -1
- package/dist/resilience.js +23 -1
- package/dist/resilience.js.map +1 -1
- package/dist/security.js +6 -6
- package/dist/security.js.map +1 -1
- package/dist/server.d.ts +44 -2
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +329 -34
- package/dist/server.js.map +1 -1
- package/dist/tally.d.ts +80 -0
- package/dist/tally.d.ts.map +1 -0
- package/dist/tally.js +176 -0
- package/dist/tally.js.map +1 -0
- package/dist/types.d.ts +64 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/wire-anthropic.d.ts +264 -0
- package/dist/wire-anthropic.d.ts.map +1 -0
- package/dist/wire-anthropic.js +960 -0
- package/dist/wire-anthropic.js.map +1 -0
- package/package.json +106 -97
- package/logo.png +0 -0
package/README.md
CHANGED
|
@@ -1,19 +1,10 @@
|
|
|
1
1
|
<p align="center">
|
|
2
|
-
<img src="logo.
|
|
2
|
+
<img src="logo.svg" alt="Kosha — AI Model Discovery" width="140" />
|
|
3
3
|
</p>
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
# kosha-discovery
|
|
6
6
|
|
|
7
|
-
|
|
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
|
|
35
|
-
const cheapest
|
|
36
|
-
const sonnet
|
|
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
|
|
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
|
|
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
|
-
|
|
132
|
-
|
|
133
|
-
|
|
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
|
-
|
|
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
|
|
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
|
/**
|
package/dist/aliases.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aliases.d.ts","sourceRoot":"","sources":["../src/aliases.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH
|
|
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
|
|
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
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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
|
-
"
|
|
21
|
-
"haiku
|
|
22
|
-
|
|
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
|
|
30
|
-
"gemini-pro": "gemini-2.5-pro
|
|
31
|
-
"gemini-flash": "gemini-2.5-flash
|
|
32
|
-
"gemini-flash-lite": "gemini-2.
|
|
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",
|
package/dist/aliases.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aliases.js","sourceRoot":"","sources":["../src/aliases.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH
|
|
1
|
+
{"version":3,"file":"aliases.js","sourceRoot":"","sources":["../src/aliases.ts"],"names":[],"mappings":"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"}
|
package/dist/cache.d.ts.map
CHANGED
|
@@ -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;
|
|
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":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAM,MAAM,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;
|
|
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"}
|