@sriinnu/kosha-discovery 1.13.0 → 1.15.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 (119) hide show
  1. package/README.md +88 -78
  2. package/dist/cli-cmd-doctor.d.ts.map +1 -1
  3. package/dist/cli-cmd-doctor.js +69 -18
  4. package/dist/cli-cmd-doctor.js.map +1 -1
  5. package/dist/cli-cmd-model.d.ts.map +1 -1
  6. package/dist/cli-cmd-model.js +18 -7
  7. package/dist/cli-cmd-model.js.map +1 -1
  8. package/dist/cli-cmd-query.d.ts.map +1 -1
  9. package/dist/cli-cmd-query.js +17 -0
  10. package/dist/cli-cmd-query.js.map +1 -1
  11. package/dist/cli-cmd-registry.d.ts +2 -1
  12. package/dist/cli-cmd-registry.d.ts.map +1 -1
  13. package/dist/cli-cmd-registry.js +30 -1
  14. package/dist/cli-cmd-registry.js.map +1 -1
  15. package/dist/cli-commands.d.ts +4 -0
  16. package/dist/cli-commands.d.ts.map +1 -1
  17. package/dist/cli-commands.js +43 -5
  18. package/dist/cli-commands.js.map +1 -1
  19. package/dist/cli-help.d.ts.map +1 -1
  20. package/dist/cli-help.js +4 -1
  21. package/dist/cli-help.js.map +1 -1
  22. package/dist/cli.js +1 -1
  23. package/dist/cli.js.map +1 -1
  24. package/dist/cost.d.ts +16 -1
  25. package/dist/cost.d.ts.map +1 -1
  26. package/dist/cost.js +73 -14
  27. package/dist/cost.js.map +1 -1
  28. package/dist/credentials/resolver.d.ts +0 -1
  29. package/dist/credentials/resolver.d.ts.map +1 -1
  30. package/dist/credentials/resolver.js +10 -46
  31. package/dist/credentials/resolver.js.map +1 -1
  32. package/dist/discovery/catalog-only.d.ts.map +1 -1
  33. package/dist/discovery/catalog-only.js +8 -1
  34. package/dist/discovery/catalog-only.js.map +1 -1
  35. package/dist/discovery/free-tier.d.ts +2 -0
  36. package/dist/discovery/free-tier.d.ts.map +1 -1
  37. package/dist/discovery/free-tier.js +4 -0
  38. package/dist/discovery/free-tier.js.map +1 -1
  39. package/dist/discovery/generic-openai.d.ts +27 -0
  40. package/dist/discovery/generic-openai.d.ts.map +1 -1
  41. package/dist/discovery/generic-openai.js +109 -5
  42. package/dist/discovery/generic-openai.js.map +1 -1
  43. package/dist/discovery/modelsdev-seed.d.ts.map +1 -1
  44. package/dist/discovery/modelsdev-seed.js +21 -6
  45. package/dist/discovery/modelsdev-seed.js.map +1 -1
  46. package/dist/discovery/openai-compatible.d.ts +2 -0
  47. package/dist/discovery/openai-compatible.d.ts.map +1 -1
  48. package/dist/discovery/openai-compatible.js +19 -11
  49. package/dist/discovery/openai-compatible.js.map +1 -1
  50. package/dist/discovery/snapshot-catalog.d.ts +18 -0
  51. package/dist/discovery/snapshot-catalog.d.ts.map +1 -1
  52. package/dist/discovery/snapshot-catalog.js +83 -3
  53. package/dist/discovery/snapshot-catalog.js.map +1 -1
  54. package/dist/discovery/vercel.d.ts.map +1 -1
  55. package/dist/discovery/vercel.js +19 -0
  56. package/dist/discovery/vercel.js.map +1 -1
  57. package/dist/discovery-contract.d.ts +8 -3
  58. package/dist/discovery-contract.d.ts.map +1 -1
  59. package/dist/discovery-contract.js.map +1 -1
  60. package/dist/enrichment/catalog.js +2 -2
  61. package/dist/enrichment/catalog.js.map +1 -1
  62. package/dist/enrichment/litellm.d.ts.map +1 -1
  63. package/dist/enrichment/litellm.js +18 -16
  64. package/dist/enrichment/litellm.js.map +1 -1
  65. package/dist/index.d.ts +3 -1
  66. package/dist/index.d.ts.map +1 -1
  67. package/dist/index.js +2 -1
  68. package/dist/index.js.map +1 -1
  69. package/dist/lifecycle.d.ts +13 -0
  70. package/dist/lifecycle.d.ts.map +1 -0
  71. package/dist/lifecycle.js +19 -0
  72. package/dist/lifecycle.js.map +1 -0
  73. package/dist/mcp-server.d.ts +1 -1
  74. package/dist/mcp-server.d.ts.map +1 -1
  75. package/dist/mcp-server.js +8 -1
  76. package/dist/mcp-server.js.map +1 -1
  77. package/dist/price-trust.d.ts +12 -0
  78. package/dist/price-trust.d.ts.map +1 -1
  79. package/dist/price-trust.js +72 -0
  80. package/dist/price-trust.js.map +1 -1
  81. package/dist/provider-catalog.d.ts +48 -0
  82. package/dist/provider-catalog.d.ts.map +1 -1
  83. package/dist/provider-catalog.js +114 -6
  84. package/dist/provider-catalog.js.map +1 -1
  85. package/dist/proxy.d.ts +9 -0
  86. package/dist/proxy.d.ts.map +1 -1
  87. package/dist/proxy.js +196 -31
  88. package/dist/proxy.js.map +1 -1
  89. package/dist/registry-discovery.js +7 -1
  90. package/dist/registry-discovery.js.map +1 -1
  91. package/dist/registry-query.d.ts.map +1 -1
  92. package/dist/registry-query.js +20 -8
  93. package/dist/registry-query.js.map +1 -1
  94. package/dist/registry-routing.d.ts.map +1 -1
  95. package/dist/registry-routing.js +2 -1
  96. package/dist/registry-routing.js.map +1 -1
  97. package/dist/registry-runtime.d.ts +34 -2
  98. package/dist/registry-runtime.d.ts.map +1 -1
  99. package/dist/registry-runtime.js +499 -67
  100. package/dist/registry-runtime.js.map +1 -1
  101. package/dist/registry.d.ts +5 -1
  102. package/dist/registry.d.ts.map +1 -1
  103. package/dist/registry.js +22 -4
  104. package/dist/registry.js.map +1 -1
  105. package/dist/server.d.ts.map +1 -1
  106. package/dist/server.js +21 -6
  107. package/dist/server.js.map +1 -1
  108. package/dist/snapshot-gate.d.ts +50 -0
  109. package/dist/snapshot-gate.d.ts.map +1 -0
  110. package/dist/snapshot-gate.js +128 -0
  111. package/dist/snapshot-gate.js.map +1 -0
  112. package/dist/subscription-plans.d.ts +63 -0
  113. package/dist/subscription-plans.d.ts.map +1 -0
  114. package/dist/subscription-plans.js +261 -0
  115. package/dist/subscription-plans.js.map +1 -0
  116. package/dist/types.d.ts +22 -0
  117. package/dist/types.d.ts.map +1 -1
  118. package/package.json +8 -8
  119. package/server.json +2 -2
package/README.md CHANGED
@@ -6,24 +6,29 @@
6
6
 
7
7
  **Tells your agent — or your code — which model to use and what it costs.**
8
8
 
9
+ **Website:** [kosha.srinivas.dev](https://kosha.srinivas.dev)
10
+
9
11
  [![Sponsor](https://img.shields.io/badge/sponsor-%E2%9D%A4-ea4aaa?logo=githubsponsors&logoColor=white)](https://github.com/sponsors/sriinnu)
10
12
  [![Buy Me a Coffee](https://img.shields.io/badge/buy%20me%20a%20coffee-FFDD00?logo=buymeacoffee&logoColor=black)](https://buymeacoffee.com/sriinnu)
11
13
 
12
- kosha discovers models across 46 providers and local runtimes, finds your API keys
14
+ kosha discovers models across 46 providers and local runtimes, plus 22 subscription
15
+ plans (token and coding plans) when you hold a key for one. It finds your API keys
13
16
  wherever they already live (env vars, Claude CLI, Codex, gcloud ADC, AWS SSO), fills
14
17
  in pricing and context limits, and answers questions like *the cheapest model with
15
18
  tool use and 128k context that I actually hold a key for*. It ships as a TypeScript
16
19
  library, a CLI, an HTTP API, an OpenAI-compatible proxy with a spend ledger, and an
17
20
  MCP server.
18
21
 
19
- It works with no API keys at all — discovery falls back to the public models.dev and
20
- LiteLLM catalogs, so `kosha list` is useful on a fresh machine.
22
+ It works with no API keys at all: discovery falls back to the public models.dev and
23
+ LiteLLM catalogs, so `kosha list` is useful on a fresh machine. Pass `keyless: true`
24
+ to `createKosha()` to skip credential lookup entirely.
21
25
 
22
26
  ## Install
23
27
 
24
28
  ```bash
25
29
  npm install @sriinnu/kosha-discovery # library / server
26
30
  npm install -g @sriinnu/kosha-discovery # global `kosha` CLI
31
+ brew install sriinnu/tap/kosha # same CLI and MCP server, via Homebrew
27
32
  ```
28
33
 
29
34
  Requires Node.js 22+.
@@ -40,26 +45,30 @@ const kosha = await createKosha();
40
45
  const models = kosha.models(); // ModelCard[] across every provider
41
46
  const cheapest = kosha.cheapestModels({ role: "image" }); // ranked by price, with missingCredentials
42
47
  const sonnet = kosha.model("sonnet"); // alias → canonical ID; undefined if unknown
43
- console.log(sonnet?.pricing); // { inputPerMillion: 2, outputPerMillion: 10, cacheReadPerMillion: 0.2, ... }
48
+ console.log(sonnet?.pricing); // { inputPerMillion, outputPerMillion, cacheReadPerMillion, ... } in USD per 1M tokens
44
49
  ```
45
50
 
46
51
  ### CLI
47
52
 
48
53
  ```bash
49
- kosha discover # query every provider; writes ~/.kosha/cache and the manifest
54
+ kosha discover # load the 24 h cache, or query every provider when it's cold
50
55
  kosha list --provider anthropic # read from the local cache
51
56
  kosha model sonnet # one model, alias-aware
52
57
  kosha routes claude-opus-5-5 # every serving route for a model (direct, OpenRouter, Bedrock, …)
53
58
  kosha cheapest --role embeddings # rank by price for a role
54
59
  kosha doctor --ci --model opus,gpt6 # fail CI if a model you pin is deprecated, retiring, or gone
55
60
  kosha spend --since 2026-09-01 # roll up the proxy's spend ledger
56
- kosha refresh # bypass the cache and re-discover
61
+ kosha ranked --strategy fastest # routes in the order kosha:<strategy> tries them
62
+ kosha providers # every provider, with credential status
63
+ kosha refresh # bypass the cache and re-discover (alias: update)
64
+ kosha registry accept openai/gpt-6.1-sol # release a held price once you've checked it
65
+ kosha registry export --output catalog.json # the catalog as a file, for local mode
57
66
  kosha serve --port 3000 # HTTP API + proxy; binds 127.0.0.1 (see Proxy below)
58
67
  ```
59
68
 
60
- Every command takes `--json`. `kosha --help` lists the rest.
69
+ Every query command takes `--json`. `kosha --help` lists the rest.
61
70
 
62
- After each discovery, a stable v1 manifest lands at `~/.kosha/registry.json`:
71
+ After each live discovery (not a cache hit), a stable v1 manifest lands at `~/.kosha/registry.json`:
63
72
 
64
73
  ```bash
65
74
  jq '.models[] | select(.pricing.inputPerMillion < 0.1) | .modelId' ~/.kosha/registry.json
@@ -75,7 +84,7 @@ or listed by no provider any more:
75
84
  with:
76
85
  models: |
77
86
  claude-opus-5-5
78
- gpt-6-sol
87
+ gpt-6.1-sol
79
88
  sonnet
80
89
  ```
81
90
 
@@ -89,6 +98,33 @@ model. A reseller retiring one of its routes is reported but does not fail the
89
98
  build while the model's own provider still serves it; `deprecation-window`
90
99
  (default 30 days) sets how far ahead a sunset counts.
91
100
 
101
+ ### Why trust the prices
102
+
103
+ Prices come from the provider's own API where it publishes them, then models.dev
104
+ and LiteLLM, then kosha's weekly snapshot. `pricingSource` on each card says which.
105
+ Catalogs are sometimes wrong, so kosha doesn't take a new price on faith:
106
+
107
+ - A rate that moves 75% or more in one step is held at the old price and the row
108
+ is tagged `pricing_quarantined`. The new price is accepted after 1 to 7 days,
109
+ depending on whether its sources agree.
110
+ - A price under half, or over 4×, the highest price of the last 30 days is held
111
+ too, so it can't walk down in small steps.
112
+ - A billed rate that falls to `$0`, or under 1% of the last one, is never released
113
+ by waiting. A catalog `$0` is never ranked cheapest and is refused under a budget.
114
+ - While a price is held or its sources disagree, kosha routes and budgets on the
115
+ highest rate anyone reports, so a suspect rise applies at once and a cut waits.
116
+ - Negative, NaN and infinite rates are dropped.
117
+
118
+ Checked a held price against the provider's pricing page? Release it:
119
+
120
+ ```bash
121
+ kosha registry accept <provider>/<model>
122
+ kosha update
123
+ ```
124
+
125
+ The weekly snapshot gets the same gate. Details:
126
+ [docs/operations.md](docs/operations.md#clear-a-quarantined-price).
127
+
92
128
  ### Public snapshot
93
129
 
94
130
  A weekly discovery run publishes a full snapshot — every provider, model, price
@@ -99,14 +135,11 @@ curl -sL https://github.com/sriinnu/kosha-discovery/releases/download/snapshot-l
99
135
  | jq '.modelCount, .providerCount'
100
136
  ```
101
137
 
102
- It is a release asset rather than a file in the repository: at ~2.8 MB growing
103
- with every provider added, committing it weekly would put roughly 150 MB of
104
- already-stale data a year into a repo people are meant to clone. Dated
105
- `snapshot-YYYY-MM-DD` pre-releases keep a short trail for diffing, pruned to the
106
- two most recent, and an older one is only removed once a newer one exists.
107
-
108
- Each snapshot's release notes list what changed since the previous one — new
109
- models, repricings, new deprecations, removals. The same diff runs locally with
138
+ It's signed: kosha checks `kosha-latest.json.sig` against a built-in key before
139
+ using it. Dated `snapshot-YYYY-MM-DD` pre-releases keep a short trail for diffing, pruned to
140
+ the two most recent. Each snapshot's release notes list what changed since the
141
+ previous one (new models, repricings, deprecations, removals) and any price the
142
+ gate is holding. The same diff runs locally with
110
143
  `pnpm snapshot:diff old.json new.json`.
111
144
 
112
145
  ### HTTP API
@@ -137,7 +170,7 @@ import OpenAI from "openai";
137
170
 
138
171
  const client = new OpenAI({
139
172
  baseURL: "http://localhost:3000/proxy/v1",
140
- apiKey: "not-used", // kosha resolves credentials from env
173
+ apiKey: "not-used", // ignored on loopback; set it to KOSHA_PROXY_TOKEN when one is configured
141
174
  });
142
175
 
143
176
  // Use any canonical model ID or alias
@@ -169,18 +202,26 @@ const routed = await client.chat.completions.create({
169
202
 
170
203
  `kosha:fastest`, `kosha:reliable`, and `kosha:balanced` take the same filters and rank on observed latency and circuit-breaker state instead of price.
171
204
 
172
- Every response carries `x-kosha-model`, `x-kosha-provider`, `x-kosha-requested`, `x-kosha-attempt-chain`, and `x-kosha-estimated-cost-usd`; non-streaming responses add `x-kosha-actual-cost-usd` when the upstream returned a usage block.
205
+ Every response carries `x-kosha-model`, `x-kosha-provider`, `x-kosha-requested` and `x-kosha-attempt-chain`, plus `x-kosha-estimated-cost-usd` except on plan-billed routes. Non-streaming responses add `x-kosha-actual-cost-usd` when the upstream returned a usage block. The full list, including `x-kosha-usage-source` and `x-kosha-wire-notes`, is in [docs/operations.md](docs/operations.md).
173
206
 
174
207
  What the proxy can forward:
175
208
 
176
209
  | Upstream wire format | Providers | Support |
177
210
  |---|---|---|
178
211
  | OpenAI-compatible | OpenAI, Ollama, OpenRouter, Vercel, Groq, Together, Fireworks, DeepInfra, … | passthrough, streaming included |
179
- | Anthropic Messages | Anthropic | translated: streaming, tools, `image_url`, `response_format`, `reasoning_effort`; audio input and non-function tools fail over to an OpenAI-compatible route for the same model |
212
+ | Anthropic Messages | Anthropic, MiniMax Token Plan | translated: streaming, tools, `image_url`, `response_format`, `reasoning_effort`; audio input and non-function tools fail over to an OpenAI-compatible route for the same model |
180
213
  | Cloud SDKs | Google, Bedrock, Vertex | discovery only, not proxied yet |
181
214
  | Non-chat / other wire | TypeSafe, Thinking Machines | discovery only — TypeSafe's System One endpoint is not a chat API, and Tinker's Anthropic-wire path differs from Anthropic's own |
182
215
 
183
- Defaults that matter before you expose it: the server binds `127.0.0.1`. Pass `--host 0.0.0.0` (or `KOSHA_HOST`) to listen on a network interface, and set `KOSHA_PROXY_TOKEN` so `/proxy/*` and `POST /api/refresh` require `Authorization: Bearer <token>` or `x-kosha-token`. `KOSHA_MONTHLY_BUDGET_USD` caps spend per calendar month. Reference: [docs/api.md](docs/api.md#openai-compatible-proxy), [docs/operations.md](docs/operations.md).
216
+ Defaults that matter before you expose it:
217
+
218
+ - The server binds `127.0.0.1`. Pass `--host 0.0.0.0` (or `KOSHA_HOST`) to listen on a network interface.
219
+ - Set `KOSHA_PROXY_TOKEN` so `/proxy/*` and `POST /api/refresh` require `Authorization: Bearer <token>` or `x-kosha-token`.
220
+ - `/metrics` is open unless `KOSHA_METRICS_TOKEN` is set. `KOSHA_ALLOWED_HOSTS` restricts which `Host` names are answered.
221
+ - `KOSHA_MONTHLY_BUDGET_USD` caps spend per calendar month and `KOSHA_TENANT_BUDGET_USD` per tenant. `0` lets nothing paid through; a value that isn't a plain amount stops `kosha serve`.
222
+ - The proxy never forwards a Claude subscription OAuth token, and a key is only sent to the host it belongs to.
223
+
224
+ Reference: [docs/api.md](docs/api.md#openai-compatible-proxy), [docs/operations.md](docs/operations.md), [docs/security.md](docs/security.md).
184
225
 
185
226
  ### MCP server
186
227
 
@@ -194,17 +235,14 @@ It is published to the [MCP registry](https://github.com/modelcontextprotocol/re
194
235
  as `io.github.sriinnu/kosha-discovery`, so clients that read the registry can
195
236
  install it without a manual command. The manifest is [`server.json`](server.json).
196
237
 
197
- Every provider key is optional. With no credentials at all the server still
198
- answers from the public models.dev and LiteLLM catalogs plus a curated offline
199
- list, so it is useful on a fresh machine.
200
-
201
238
  Tools and protocol details: [docs/mcp.md](docs/mcp.md).
202
239
 
203
240
  ## Supported providers
204
241
 
205
- 46 providers. Each has a descriptor in `src/provider-catalog.ts`; most OpenAI-compatible
206
- ones are driven from `GENERIC_OPENAI_PROVIDERS` in `src/discovery/generic-openai.ts`
207
- rather than a hand-written class.
242
+ 46 pay-as-you-go providers and local runtimes, plus 22 subscription plans generated
243
+ from `src/subscription-plans.ts`. Each has a descriptor in `src/provider-catalog.ts`;
244
+ most OpenAI-compatible ones are driven from `GENERIC_OPENAI_PROVIDERS` in
245
+ `src/discovery/generic-openai.ts` rather than a hand-written class.
208
246
 
209
247
  | Provider | Discovery | Credential sources |
210
248
  |----------|-----------|--------------------|
@@ -224,11 +262,20 @@ rather than a hand-written class.
224
262
  | Alibaba Model Studio (Qwen), Volcengine Ark (Doubao), Inception (Mercury), AI21 (Jamba), Upstage (Solar), StepFun, Meta (Muse Spark) | OpenAI-compatible API | `DASHSCOPE_API_KEY`, `ARK_API_KEY`, `INCEPTION_API_KEY`, `AI21_API_KEY`, `UPSTAGE_API_KEY`, `STEPFUN_API_KEY`, `META_MODEL_API_KEY` |
225
263
  | Baseten, Nebius Token Factory, Novita AI, SiliconFlow, Hugging Face, Ollama Cloud | OpenAI-compatible API | `<PROVIDER>_API_KEY`, `HF_TOKEN` |
226
264
 
265
+ ### Subscription plans
266
+
267
+ A token or coding plan (MiniMax, Moonshot, GLM, Alibaba and others) is listed as
268
+ its own provider, but only when a key for it resolves. A plan route has no
269
+ per-token price: `kosha cheapest` shows it in an "Included in your plans" group
270
+ (`includedInPlans` in the library), and the proxy prefers a plan route you hold.
271
+ A plan can borrow the provider's pay-as-you-go key; `KOSHA_PLAN_KEY_PROBE=off`
272
+ keeps each plan to its own env vars.
273
+
227
274
  ### Regional pairs
228
275
 
229
276
  Several providers run separate hosts for international and mainland-China
230
- traffic, with separate keys and **separate price sheets** — Qwen 2.5 72B is
231
- $1.40/M input internationally against $0.574/M in China. Merging them would make
277
+ traffic, with separate keys and **separate price sheets**: the same model can
278
+ cost several times more on one host than the other. Merging them would make
232
279
  a model's price depend on which host answered last, so each region is its own
233
280
  provider:
234
281
 
@@ -244,7 +291,9 @@ provider:
244
291
  `kosha routes <model>` lists every region a model is served from, so you can
245
292
  compare prices across them directly.
246
293
 
247
- Without a key, providers fall back to the public models.dev + LiteLLM catalog, then to kosha's own weekly [snapshot](#public-snapshot) if those are unreachable, then to a curated static list, so `kosha list` works on a fresh machine. The same fallback applies when a key is present but rejected: the provider stays listed from the public catalog, shows as unauthenticated, and the error is kept for `kosha doctor`. Exact env var names: [docs/credentials.md](docs/credentials.md).
294
+ Without a key, providers fall back to the public models.dev + LiteLLM catalog, then to kosha's own weekly [snapshot](#public-snapshot) if those are unreachable, then to a curated static list. The same fallback applies when a key is present but rejected: the provider stays listed from the public catalog, shows as unauthenticated, and the error is kept for `kosha doctor`. Exact env var names: [docs/credentials.md](docs/credentials.md).
295
+
296
+ Config lives in `~/.kosharc.json`, with a per-project `kosha.config.json`. The project file can only make kosha stricter, never point keys somewhere else. See [docs/configuration.md](docs/configuration.md).
248
297
 
249
298
  To take models.dev and LiteLLM out of the loop, set `KOSHA_CATALOG_SOURCE=pinned` (kosha's snapshot only) or `local` (a file from `kosha registry export`, no network). See [Catalog Source](docs/configuration.md#catalog-source).
250
299
 
@@ -259,7 +308,7 @@ to one would be a category error.
259
308
 
260
309
  ```bash
261
310
  kosha cheapest --role judgment # rank judgment models by price
262
- kosha model jev # mode: judgment, $0.042/M in, $0 out
311
+ kosha model jev # mode: judgment
263
312
  ```
264
313
 
265
314
  ## How it works
@@ -291,48 +340,7 @@ hand. `aliases:check` compares it against a snapshot, and the weekly snapshot
291
340
  run annotates itself with the result, so a bare alias like `opus` falling behind
292
341
  shows up there rather than in a bug report.
293
342
 
294
- ### Project layout
295
-
296
- ```
297
- src/
298
- cli.ts # CLI entry point and arg parsing
299
- cli-commands.ts # command implementations (+ cli-cmd-*.ts for the larger ones)
300
- registry.ts # ModelRegistry public API
301
- registry-runtime.ts # discovery orchestration, enrichment, cache, manifest export
302
- registry-query.ts # model / role / capability queries
303
- registry-selection.ts # cheapest candidates, binding hints
304
- registry-routing.ts # cheapest / fastest / reliable / balanced ranking
305
- discovery/ # one discoverer per provider + static and public-seed catalogs
306
- enrichment/ # models.dev + LiteLLM pricing enrichment
307
- credentials/ # credential resolution (env, CLI files, ADC, OAuth)
308
- provider-catalog.ts # provider descriptors: base URLs, transport, env var names
309
- aliases.ts # built-in short names → canonical model IDs
310
- claude-generation.ts # which Claude generation accepts which API parameters
311
- model-features.ts # tool dialect / structured-output inference per model
312
- proxy.ts # OpenAI-compatible proxy: routing, failover, ledger
313
- wire-anthropic.ts # OpenAI ↔ Anthropic request / response / SSE translation
314
- cost.ts # spend ledger, budget gates, usage reconciliation
315
- tally.ts # zero-dependency token usage + USD tally (also exported as ./tally)
316
- server.ts # Hono HTTP API + operator token gate
317
- mcp-server.ts # MCP stdio server
318
- types.ts # shared types
319
- ```
320
-
321
- ### Adding a provider
322
-
323
- For an OpenAI-compatible provider — most of them — it is two table entries:
324
-
325
- 1. Add a descriptor to `PROVIDER_CATALOG` in `src/provider-catalog.ts` (id, base URL, transport, credential env vars).
326
- 2. Add a spec to `GENERIC_OPENAI_PROVIDERS` in `src/discovery/generic-openai.ts`. It registers its own discoverer, resolves credentials from the descriptor's `credentialEnvVars`, and falls back to the public catalog when there is no key.
327
- 3. Map the provider to its models.dev / LiteLLM slug in `src/discovery/modelsdev-seed.ts` and `litellm-seed.ts` so keyless discovery works. **Check the slug** — GLM is published as `zhipuai`, and a missing mapping means no keyless models at all.
328
- 4. Add a case to `test/discovery/generic-openai.test.ts` and document the env vars in `docs/credentials.md`.
329
-
330
- Write a discoverer class only when classification genuinely needs code — per-route pricing (OpenRouter), a non-OpenAI response envelope (TypeSafe), or origin remapping (Vercel):
331
-
332
- 1. Create `src/discovery/<provider>.ts` extending `BaseDiscoverer` or `OpenAICompatibleDiscoverer`; `fetchJSON` and `makeCard` are provided.
333
- 2. Export it from `src/discovery/index.ts` and add a factory entry to `DISCOVERER_REGISTRY`.
334
- 3. Add a resolver branch in `src/credentials/resolver.ts` only for a bespoke search order (CLI files, OAuth, ADC, SSO). A plain API key in env vars needs no branch — the descriptor covers it.
335
- 4. Add `test/discovery/<provider>.test.ts` (mock `fetch`; see `typesafe.test.ts`).
343
+ Contributing, the project layout and adding a provider: [CONTRIBUTING.md](CONTRIBUTING.md).
336
344
 
337
345
  ## Docs
338
346
 
@@ -346,19 +354,19 @@ Write a discoverer class only when classification genuinely needs code — per-r
346
354
  | [Architecture](docs/architecture.md) | Discovery flow, module map, adding providers |
347
355
  | [Resilience](docs/resilience.md) | Circuit breakers, stale cache, health |
348
356
  | [Operations](docs/operations.md) | Deployment sizing, metrics, spend ledger, recovery recipes |
349
- | [Security](docs/security.md) | Threat catalogue, runtime scanning, pre-commit hook |
357
+ | [Security](docs/security.md) | Threat catalogue, runtime scanning, pre-commit hook; report issues per [SECURITY.md](SECURITY.md) |
350
358
  | [Discovery Plane v1](docs/discovery-plane-v1.md) | Stable daemon contract (deltas, SSE watch, binding hints) |
351
359
 
352
360
  The same pages are mirrored to the [wiki](https://github.com/sriinnu/kosha-discovery/wiki), alongside guides that only live there (troubleshooting, the release runbook). `docs/` is the source: the mirror is regenerated on every push to `main`, so edit here, not there.
353
361
 
354
362
  ## Release
355
363
 
356
- 1. Bump `version` in `package.json` and `server.json` (both places), and date the `[Unreleased]` section in `CHANGELOG.md`; merge that as a PR.
364
+ 1. Bump the version in `package.json`, in `server.json` (twice: top level and `packages[0]`), and the `default` in `action.yml`. Date the `[Unreleased]` section in `CHANGELOG.md`, and merge that as a PR.
357
365
  2. Tag and push:
358
366
 
359
367
  ```bash
360
368
  git tag -s vX.Y.Z -m "vX.Y.Z" && git push origin vX.Y.Z
361
- gh workflow run release-npm.yml --ref vX.Y.Z -f tag=vX.Y.Z
369
+ gh workflow run release-npm.yml --ref vX.Y.Z -f tag=vX.Y.Z -f publish_mcp=false
362
370
  ```
363
371
 
364
372
  The workflow checks that the tag matches `package.json`, runs lint / build / test, stages the package on npm with provenance, and creates the GitHub Release. Staging authenticates through npm trusted publishing (OIDC); there is no npm token. The version goes live only after a maintainer approves it with 2FA:
@@ -366,9 +374,11 @@ The workflow checks that the tag matches `package.json`, runs lint / build / tes
366
374
  ```bash
367
375
  npm stage list @sriinnu/kosha-discovery
368
376
  npm stage approve <id>
369
- gh workflow run release-npm.yml --ref vX.Y.Z -f tag=vX.Y.Z -f publish_npm=false -f create_github_release=false # then publish to the MCP registry
377
+ gh workflow run release-npm.yml --ref vX.Y.Z -f tag=vX.Y.Z -f publish_npm=false -f create_github_release=false # publish to the MCP registry once npm is live
370
378
  ```
371
379
 
380
+ Every step, with the parts that are easy to forget: the [release runbook](https://github.com/sriinnu/kosha-discovery/wiki/Release-Runbook).
381
+
372
382
  ## Support
373
383
 
374
384
  kosha is free and open source. If it helps you pick cheaper models, consider sponsoring its upkeep:
@@ -1 +1 @@
1
- {"version":3,"file":"cli-cmd-doctor.d.ts","sourceRoot":"","sources":["../src/cli-cmd-doctor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAmBnD,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,CA+C/G;AA2OD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMzE"}
1
+ {"version":3,"file":"cli-cmd-doctor.d.ts","sourceRoot":"","sources":["../src/cli-cmd-doctor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAmBnD,6EAA6E;AAC7E,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAErC,gFAAgF;AAChF,eAAO,MAAM,iCAAiC,KAAK,CAAC;AAgCpD,wBAAsB,SAAS,CAAC,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAoD/G;AA8RD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMzE"}
@@ -9,6 +9,7 @@
9
9
  * @module
10
10
  */
11
11
  import { describeCatalog } from "./catalog-source.js";
12
+ import { degradedHint, truncateReason } from "./cli-commands.js";
12
13
  import { CYAN, c, DIM, GREEN, RED, YELLOW } from "./cli-format.js";
13
14
  import { extractOriginProvider, matchableModelId } from "./normalize.js";
14
15
  /** Exit code `doctor` uses to fail a CI run without looking like a crash. */
@@ -40,11 +41,13 @@ export async function cmdDoctor(registry, flags) {
40
41
  const healthFindings = providers
41
42
  .map((providerId) => projectHealth(registry, providerId))
42
43
  .filter((row) => row !== null);
44
+ const credentials = collectCredentialFindings(registry);
43
45
  if (f.json) {
44
- process.stdout.write(`${JSON.stringify({ catalog, deprecations, health: healthFindings }, null, 2)}\n`);
46
+ process.stdout.write(`${JSON.stringify({ catalog, credentials, deprecations, health: healthFindings }, null, 2)}\n`);
45
47
  }
46
48
  else {
47
49
  renderCatalog(catalog);
50
+ renderCredentials(credentials);
48
51
  renderDeprecations(deprecations);
49
52
  renderHealth(healthFindings);
50
53
  }
@@ -232,38 +235,78 @@ function projectHealth(registry, providerId) {
232
235
  reliabilityScore: h.reliabilityScore,
233
236
  p95LatencyMs: h.p95LatencyMs,
234
237
  timeoutRate: h.timeoutRate,
238
+ samples: h.samples,
235
239
  };
236
240
  }
237
241
  catch {
238
242
  return null;
239
243
  }
240
244
  }
245
+ /**
246
+ * Providers the last discovery listed without a working live call. Read from
247
+ * the cached providers, so `doctor` reports it without calling anyone.
248
+ */
249
+ function collectCredentialFindings(registry) {
250
+ return registry
251
+ .providers_list()
252
+ .filter((p) => typeof p.degradedReason === "string" && p.degradedReason.length > 0)
253
+ .map((p) => ({ providerId: p.id, name: p.name, reason: p.degradedReason, source: p.degradedSource }))
254
+ .sort((a, b) => a.providerId.localeCompare(b.providerId));
255
+ }
256
+ function renderCredentials(findings) {
257
+ process.stdout.write(`${c(CYAN, "Credentials")}\n`);
258
+ if (findings.length === 0) {
259
+ process.stdout.write(c(DIM, " Every provider with a key answered its live call.\n\n"));
260
+ return;
261
+ }
262
+ for (const f of findings) {
263
+ process.stdout.write(` ${c(YELLOW, degradedHint(f.reason, f.source))} ${f.providerId}\n`);
264
+ process.stdout.write(`${c(DIM, ` ${truncateReason(f.reason)}`)}\n`);
265
+ }
266
+ process.stdout.write("\n");
267
+ }
268
+ /** Lifecycle rows shown before `doctor` summarises the rest. */
269
+ const LIFECYCLE_ROWS_SHOWN = 25;
270
+ function lifecycleTag(f) {
271
+ const days = f.daysUntilSunset;
272
+ if (f.status === "missing")
273
+ return { tag: c(RED, "missing"), rank: 0, kind: "missing" };
274
+ if (days !== null && days < 0)
275
+ return { tag: c(RED, `sunset ${-days}d ago`), rank: 1, kind: "past sunset" };
276
+ if (f.status === "retired")
277
+ return { tag: c(RED, "retired"), rank: 2, kind: "retired" };
278
+ if (days !== null && days <= 14)
279
+ return { tag: c(RED, `sunsets in ${days}d`), rank: 3, kind: "sunsetting" };
280
+ if (days !== null && days <= 60)
281
+ return { tag: c(YELLOW, `sunsets in ${days}d`), rank: 4, kind: "sunsetting" };
282
+ if (f.status === "deprecated")
283
+ return { tag: c(YELLOW, "deprecated"), rank: 5, kind: "deprecated" };
284
+ if (days !== null)
285
+ return { tag: c(DIM, `sunsets in ${days}d`), rank: 6, kind: "sunsetting" };
286
+ return { tag: c(DIM, f.status ?? "unknown"), rank: 7, kind: f.status ?? "unknown" };
287
+ }
241
288
  function renderDeprecations(findings) {
242
289
  process.stdout.write(`${c(CYAN, "Model lifecycle")}\n`);
243
290
  if (findings.length === 0) {
244
291
  process.stdout.write(c(DIM, " No deprecation signals from any provider catalogue.\n\n"));
245
292
  return;
246
293
  }
247
- for (const f of findings) {
248
- const days = f.daysUntilSunset;
249
- let tag;
250
- if (f.status === "retired")
251
- tag = c(RED, "retired");
252
- else if (f.status === "missing")
253
- tag = c(RED, "missing");
254
- else if (days !== null && days <= 14)
255
- tag = c(RED, `sunsets in ${days}d`);
256
- else if (days !== null && days <= 60)
257
- tag = c(YELLOW, `sunsets in ${days}d`);
258
- else if (f.status === "deprecated")
259
- tag = c(YELLOW, "deprecated");
260
- else if (days !== null)
261
- tag = c(DIM, `sunsets in ${days}d`);
262
- else
263
- tag = c(DIM, f.status ?? "unknown");
294
+ // Most urgent first, stable within a rank; a full catalog has hundreds of
295
+ // rows, so show the top ones and count the rest.
296
+ const rows = findings
297
+ .map((f, i) => ({ f, i, ...lifecycleTag(f) }))
298
+ .sort((a, b) => a.rank - b.rank || (a.f.daysUntilSunset ?? 0) - (b.f.daysUntilSunset ?? 0) || a.i - b.i);
299
+ const counts = new Map();
300
+ for (const row of rows)
301
+ counts.set(row.kind, (counts.get(row.kind) ?? 0) + 1);
302
+ process.stdout.write(c(DIM, ` ${[...counts].map(([kind, n]) => `${n} ${kind}`).join(", ")}\n`));
303
+ for (const { f, tag } of rows.slice(0, LIFECYCLE_ROWS_SHOWN)) {
264
304
  const replacement = f.replacedBy ? c(DIM, ` -> ${f.replacedBy}`) : "";
265
305
  process.stdout.write(` ${tag} ${f.provider}/${f.modelId}${replacement}\n`);
266
306
  }
307
+ if (rows.length > LIFECYCLE_ROWS_SHOWN) {
308
+ process.stdout.write(c(DIM, ` …and ${rows.length - LIFECYCLE_ROWS_SHOWN} more; \`kosha doctor --json\` lists every one.\n`));
309
+ }
267
310
  process.stdout.write("\n");
268
311
  }
269
312
  function renderHealth(findings) {
@@ -272,12 +315,20 @@ function renderHealth(findings) {
272
315
  process.stdout.write(c(DIM, " No providers in the registry yet — run `kosha discover`.\n"));
273
316
  return;
274
317
  }
318
+ // A provider kosha has never called has no health to report; "ok, 100%"
319
+ // would be a claim with no data behind it.
320
+ const unused = findings.filter((h) => h.samples === 0 && h.available);
275
321
  for (const h of findings) {
322
+ if (h.samples === 0 && h.available)
323
+ continue;
276
324
  const tag = h.available ? (h.reliabilityScore >= 0.95 ? c(GREEN, "ok") : c(YELLOW, "degraded")) : c(RED, "open");
277
325
  const p95 = h.p95LatencyMs !== null ? `${h.p95LatencyMs}ms` : "no samples";
278
326
  const reliability = (h.reliabilityScore * 100).toFixed(0);
279
327
  process.stdout.write(` ${tag} ${h.providerId.padEnd(14)} ${c(DIM, `reliability=${reliability}%`)} ${c(DIM, `p95=${p95}`)}\n`);
280
328
  }
329
+ if (unused.length > 0) {
330
+ process.stdout.write(c(DIM, ` no calls yet (${unused.length}): ${unused.map((h) => h.providerId).join(", ")}\n`));
331
+ }
281
332
  }
282
333
  /**
283
334
  * Whole days from `nowMs` to `isoDate`, counted on the UTC calendar.
@@ -1 +1 @@
1
- {"version":3,"file":"cli-cmd-doctor.js","sourceRoot":"","sources":["../src/cli-cmd-doctor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli-cmd-doctor.js","sourceRoot":"","sources":["../src/cli-cmd-doctor.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"cli-cmd-model.d.ts","sourceRoot":"","sources":["../src/cli-cmd-model.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAWnD;;;;;;;;;;GAUG;AACH,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CA6EjI;AAID;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CA6D/H;AAID;;;;;;;;;;;;GAYG;AACH,wBAAsB,SAAS,CAAC,QAAQ,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CA2ChI"}
1
+ {"version":3,"file":"cli-cmd-model.d.ts","sourceRoot":"","sources":["../src/cli-cmd-model.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAoBH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAInD;;;;;;;;;;GAUG;AACH,wBAAsB,QAAQ,CAC7B,QAAQ,EAAE,aAAa,EACvB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GACrC,OAAO,CAAC,IAAI,CAAC,CA8Ff;AAID;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAC/B,QAAQ,EAAE,aAAa,EACvB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GACrC,OAAO,CAAC,IAAI,CAAC,CAoEf;AAID;;;;;;;;;;;;GAYG;AACH,wBAAsB,SAAS,CAC9B,QAAQ,EAAE,aAAa,EACvB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GACrC,OAAO,CAAC,IAAI,CAAC,CA4Df"}
@@ -9,8 +9,10 @@
9
9
  *
10
10
  * @module cli-cmd-model
11
11
  */
12
- import { BOLD, CYAN, DIM, GREEN, RED, YELLOW, c, formatBatchDiscount, formatNumber, formatPrice, formatTimestamp, renderTable, } from "./cli-format.js";
13
12
  import { ensureDiscovered } from "./cli-commands.js";
13
+ import { BOLD, CYAN, c, DIM, formatBatchDiscount, formatNumber, formatPrice, formatTimestamp, GREEN, RED, renderTable, YELLOW, } from "./cli-format.js";
14
+ import { isPlanBilled } from "./discovery/free-tier.js";
15
+ import { isRetired } from "./lifecycle.js";
14
16
  // ── model (detail view) ─────────────────────────────────────────────────
15
17
  /**
16
18
  * Show detailed information for a single model identified by id or alias.
@@ -34,7 +36,9 @@ export async function cmdModel(registry, idOrAlias, flags) {
34
36
  // Fuzzy fallback — substring match across id, name, and aliases so users
35
37
  // can type fragments like "sonnet" without knowing the full canonical ID.
36
38
  const needle = idOrAlias.toLowerCase();
37
- const fuzzy = registry.models().filter((m) => m.id.toLowerCase().includes(needle) ||
39
+ const fuzzy = registry
40
+ .models()
41
+ .filter((m) => m.id.toLowerCase().includes(needle) ||
38
42
  m.name.toLowerCase().includes(needle) ||
39
43
  m.aliases.some((a) => a.toLowerCase().includes(needle)));
40
44
  if (fuzzy.length === 1)
@@ -55,7 +59,9 @@ export async function cmdModel(registry, idOrAlias, flags) {
55
59
  const providerName = registry.provider(model.provider)?.name ?? model.provider;
56
60
  const pricingStr = model.pricing
57
61
  ? `${formatPrice(model.pricing.inputPerMillion)} / ${formatPrice(model.pricing.outputPerMillion)} per million tokens (in/out)`
58
- : c(DIM, "unknown");
62
+ : isPlanBilled(model)
63
+ ? c(DIM, "included in the subscription plan (no per-token price)")
64
+ : c(DIM, "unknown");
59
65
  // Cache pricing is optional — only displayed when the model has it
60
66
  const cacheStr = model.pricing?.cacheReadPerMillion !== undefined
61
67
  ? `\nCache Pricing: ${formatPrice(model.pricing.cacheReadPerMillion)} read / ${formatPrice(model.pricing.cacheWritePerMillion)} write per million tokens`
@@ -71,10 +77,11 @@ export async function cmdModel(registry, idOrAlias, flags) {
71
77
  : "";
72
78
  const originPricingStr = model.originPricing
73
79
  ? `\nOrigin Pricing: ${formatPrice(model.originPricing.inputPerMillion)} / ${formatPrice(model.originPricing.outputPerMillion)} per million tokens (in/out)` +
74
- ((model.originPricing.reasoningInputPerMillion !== undefined || model.originPricing.reasoningOutputPerMillion !== undefined)
80
+ (model.originPricing.reasoningInputPerMillion !== undefined ||
81
+ model.originPricing.reasoningOutputPerMillion !== undefined
75
82
  ? `\nOrigin Reasoning Pricing: ${formatPrice(model.originPricing.reasoningInputPerMillion)} in / ${formatPrice(model.originPricing.reasoningOutputPerMillion)} out per million tokens`
76
83
  : "") +
77
- ((model.originPricing.batchInputPerMillion !== undefined || model.originPricing.batchOutputPerMillion !== undefined)
84
+ (model.originPricing.batchInputPerMillion !== undefined || model.originPricing.batchOutputPerMillion !== undefined
78
85
  ? `\nOrigin Batch Pricing: ${formatPrice(model.originPricing.batchInputPerMillion)} in / ${formatPrice(model.originPricing.batchOutputPerMillion)} out per million tokens`
79
86
  : "")
80
87
  : "";
@@ -91,7 +98,7 @@ ${c(BOLD, "Name:")} ${model.name}
91
98
  ${c(BOLD, "Provider:")} ${providerName}${originLine}${regionLine}${projectLine}
92
99
  ${c(BOLD, "Mode:")} ${model.mode}
93
100
  ${c(BOLD, "Aliases:")} ${model.aliases.length > 0 ? model.aliases.join(", ") : c(DIM, "none")}
94
- ${c(BOLD, "Context Window:")} ${model.contextWindow > 0 ? formatNumber(model.contextWindow) + " tokens" : c(DIM, "unknown")}
101
+ ${c(BOLD, "Context Window:")} ${model.contextWindow > 0 ? `${formatNumber(model.contextWindow)} tokens` : c(DIM, model.source === "api" ? "unknown (the provider doesn't say, and no catalog lists it yet)" : "unknown")}
95
102
  ${c(BOLD, "Max Output:")} ${model.maxOutputTokens > 0 ? formatNumber(model.maxOutputTokens) + " tokens" : c(DIM, "unknown")}${model.dimensions ? `\n${c(BOLD, "Dimensions:")} ${formatNumber(model.dimensions)}` : ""}
96
103
  ${c(BOLD, "Capabilities:")} ${model.capabilities.join(", ")}
97
104
  ${c(BOLD, "Pricing:")} ${pricingStr}${cacheStr}${reasoningStr}${batchStr}${originPricingStr}
@@ -211,7 +218,7 @@ export async function cmdRoutes(registry, modelId, flags) {
211
218
  { header: "$/M out", width: 8, align: "right" },
212
219
  ];
213
220
  const rows = routes.map((route) => [
214
- route.isPreferred ? c(GREEN, "*") : route.isDirect ? c(CYAN, "\u00B7") : " ",
221
+ isRetired(route.model) ? c(RED, "x") : route.isPreferred ? c(GREEN, "*") : route.isDirect ? c(CYAN, "\u00B7") : " ",
215
222
  c(CYAN, route.provider),
216
223
  route.model.id,
217
224
  route.model.region ?? c(DIM, "\u2014"),
@@ -227,5 +234,9 @@ export async function cmdRoutes(registry, modelId, flags) {
227
234
  if (preferred) {
228
235
  console.log(c(DIM, `\nPreferred route: ${preferred.provider} (${preferred.baseUrl ?? "base URL unknown"})`));
229
236
  }
237
+ const retired = routes.filter((route) => isRetired(route.model)).length;
238
+ if (retired > 0) {
239
+ console.log(c(DIM, `${retired === routes.length ? "Every route" : `${retired} route(s)`} marked x is past its sunset and no longer served.`));
240
+ }
230
241
  }
231
242
  //# sourceMappingURL=cli-cmd-model.js.map