@sriinnu/kosha-discovery 1.0.0 → 1.2.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 (74) hide show
  1. package/README.md +51 -3
  2. package/dist/cli-format.d.ts.map +1 -1
  3. package/dist/cli-format.js +2 -1
  4. package/dist/cli-format.js.map +1 -1
  5. package/dist/context-strategy.d.ts +48 -0
  6. package/dist/context-strategy.d.ts.map +1 -0
  7. package/dist/context-strategy.js +274 -0
  8. package/dist/context-strategy.js.map +1 -0
  9. package/dist/credentials/resolver.d.ts +7 -0
  10. package/dist/credentials/resolver.d.ts.map +1 -1
  11. package/dist/credentials/resolver.js +28 -3
  12. package/dist/credentials/resolver.js.map +1 -1
  13. package/dist/discovery/index.d.ts +4 -6
  14. package/dist/discovery/index.d.ts.map +1 -1
  15. package/dist/discovery/index.js +39 -55
  16. package/dist/discovery/index.js.map +1 -1
  17. package/dist/discovery/litellm-seed.js +12 -8
  18. package/dist/discovery/litellm-seed.js.map +1 -1
  19. package/dist/discovery/modelsdev-seed.js +16 -12
  20. package/dist/discovery/modelsdev-seed.js.map +1 -1
  21. package/dist/discovery/promo-overrides.js +3 -3
  22. package/dist/discovery/promo-overrides.js.map +1 -1
  23. package/dist/discovery/vercel.d.ts +45 -0
  24. package/dist/discovery/vercel.d.ts.map +1 -0
  25. package/dist/discovery/vercel.js +232 -0
  26. package/dist/discovery/vercel.js.map +1 -0
  27. package/dist/discovery-contract.d.ts +1 -1
  28. package/dist/discovery-contract.d.ts.map +1 -1
  29. package/dist/discovery-contract.js +28 -1
  30. package/dist/discovery-contract.js.map +1 -1
  31. package/dist/enrichment/litellm-catalog.d.ts +1 -0
  32. package/dist/enrichment/litellm-catalog.d.ts.map +1 -1
  33. package/dist/enrichment/litellm-catalog.js.map +1 -1
  34. package/dist/enrichment/litellm.d.ts.map +1 -1
  35. package/dist/enrichment/litellm.js +6 -0
  36. package/dist/enrichment/litellm.js.map +1 -1
  37. package/dist/mcp-server.d.ts +18 -0
  38. package/dist/mcp-server.d.ts.map +1 -0
  39. package/dist/mcp-server.js +341 -0
  40. package/dist/mcp-server.js.map +1 -0
  41. package/dist/provider-catalog.d.ts +19 -2
  42. package/dist/provider-catalog.d.ts.map +1 -1
  43. package/dist/provider-catalog.js +104 -0
  44. package/dist/provider-catalog.js.map +1 -1
  45. package/dist/proxy.d.ts +31 -0
  46. package/dist/proxy.d.ts.map +1 -0
  47. package/dist/proxy.js +213 -0
  48. package/dist/proxy.js.map +1 -0
  49. package/dist/registry-discovery.d.ts.map +1 -1
  50. package/dist/registry-discovery.js +5 -5
  51. package/dist/registry-discovery.js.map +1 -1
  52. package/dist/registry-query.d.ts +2 -2
  53. package/dist/registry-query.d.ts.map +1 -1
  54. package/dist/registry-query.js +58 -7
  55. package/dist/registry-query.js.map +1 -1
  56. package/dist/registry-runtime.d.ts +20 -0
  57. package/dist/registry-runtime.d.ts.map +1 -1
  58. package/dist/registry-runtime.js +231 -39
  59. package/dist/registry-runtime.js.map +1 -1
  60. package/dist/registry-selection.d.ts.map +1 -1
  61. package/dist/registry-selection.js +21 -3
  62. package/dist/registry-selection.js.map +1 -1
  63. package/dist/registry.js +2 -2
  64. package/dist/registry.js.map +1 -1
  65. package/dist/security.js +6 -6
  66. package/dist/security.js.map +1 -1
  67. package/dist/server.d.ts +2 -0
  68. package/dist/server.d.ts.map +1 -1
  69. package/dist/server.js +7 -1
  70. package/dist/server.js.map +1 -1
  71. package/dist/types.d.ts +42 -2
  72. package/dist/types.d.ts.map +1 -1
  73. package/logo.png +0 -0
  74. package/package.json +102 -91
package/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  <p align="center">
2
- <img src="logo-icon.svg" alt="Kosha — AI Model Discovery" width="120" />
2
+ <img src="logo.png" alt="Kosha — AI Model Discovery" width="140" />
3
3
  </p>
4
4
 
5
5
  <h1 align="center">kosha-discovery — कोश</h1>
@@ -13,7 +13,7 @@
13
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
14
  </p>
15
15
 
16
- Kosha (कोश — *treasury*) discovers AI models across providers, resolves credentials, enriches with pricing, and exposes the catalog through a library, CLI, and HTTP API. One source of truth for model identity, pricing, and routing — so your app doesn't break when providers ship new SKUs or change rates.
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.
17
17
 
18
18
  ## Install
19
19
 
@@ -63,6 +63,53 @@ GET /api/providers GET /api/roles
63
63
  POST /api/refresh GET /health
64
64
  ```
65
65
 
66
+ ### Proxy
67
+
68
+ Kosha runs as an OpenAI-compatible proxy. Point your SDK at `http://localhost:3000/proxy/v1` and it resolves the model, picks the right provider, injects credentials, and forwards — streaming included.
69
+
70
+ ```bash
71
+ kosha serve # start on :3000
72
+ ```
73
+
74
+ ```typescript
75
+ import OpenAI from "openai";
76
+
77
+ const client = new OpenAI({
78
+ baseURL: "http://localhost:3000/proxy/v1",
79
+ apiKey: "not-used", // kosha resolves credentials from env
80
+ });
81
+
82
+ // Use any canonical model ID or alias
83
+ const res = await client.chat.completions.create({
84
+ model: "sonnet",
85
+ messages: [{ role: "user", content: "hello" }],
86
+ });
87
+
88
+ // Let kosha pick the cheapest model you have a key for
89
+ const cheap = await client.chat.completions.create({
90
+ model: "kosha:cheapest",
91
+ messages: [{ role: "user", content: "hello" }],
92
+ });
93
+
94
+ // Cheapest model with tool_use and at least 128k context
95
+ const routed = await client.chat.completions.create({
96
+ model: "kosha:cheapest[tool_use,128k]",
97
+ messages: [{ role: "user", content: "hello" }],
98
+ });
99
+ ```
100
+
101
+ **`kosha:cheapest` filter syntax** (comma-separated, combinable):
102
+
103
+ | Filter | Example | Meaning |
104
+ |--------|---------|---------|
105
+ | capability | `tool_use`, `vision` | model must have this tag |
106
+ | `<N>k` | `128k`, `200k` | minimum context window |
107
+ | `provider:<id>` | `provider:groq` | pin to a specific provider |
108
+
109
+ The response always includes `x-kosha-model`, `x-kosha-provider`, and `x-kosha-requested` headers so the caller knows exactly what ran.
110
+
111
+ Supported transports: `openai`, `openai-compatible-http`, `ollama`. Anthropic, Google, Bedrock, and Vertex require wire-format translation — not yet proxied.
112
+
66
113
  ## Supported providers
67
114
 
68
115
  | Provider | Discovery | Credential sources |
@@ -74,6 +121,7 @@ POST /api/refresh GET /health
74
121
  | Vertex AI | API + gcloud | `GOOGLE_APPLICATION_CREDENTIALS`, ADC |
75
122
  | Ollama | local API | — (local) |
76
123
  | OpenRouter | API | `OPENROUTER_API_KEY` *(optional)* |
124
+ | Vercel AI Gateway | `/v1/models` | `AI_GATEWAY_API_KEY`, `VERCEL_OIDC_TOKEN` *(public discovery, required for execution)* |
77
125
  | NVIDIA / Together / Fireworks / Groq / Cerebras / Cohere / DeepInfra / Perplexity | API | provider key env var |
78
126
  | DeepSeek / Mistral / Moonshot (Kimi) / GLM (Zhipu) / Z.AI / MiniMax | API | provider key env var |
79
127
 
@@ -85,7 +133,7 @@ Full credential setup: [docs/credentials.md](docs/credentials.md).
85
133
  <img src="architecture.svg" alt="Kosha Architecture" width="720" />
86
134
  </p>
87
135
 
88
- 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.
136
+ 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.
89
137
 
90
138
  ## Docs
91
139
 
@@ -1 +1 @@
1
- {"version":3,"file":"cli-format.d.ts","sourceRoot":"","sources":["../src/cli-format.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAYH,+EAA+E;AAC/E,eAAO,MAAM,QAAQ,SAAyB,CAAC;AAE/C,4BAA4B;AAC5B,eAAO,MAAM,IAAI,cAAY,CAAC;AAE9B,mCAAmC;AACnC,eAAO,MAAM,GAAG,cAAY,CAAC;AAE7B,uCAAuC;AACvC,eAAO,MAAM,KAAK,cAAY,CAAC;AAE/B,mCAAmC;AACnC,eAAO,MAAM,KAAK,eAAa,CAAC;AAEhC,iCAAiC;AACjC,eAAO,MAAM,GAAG,eAAa,CAAC;AAE9B,oCAAoC;AACpC,eAAO,MAAM,MAAM,eAAa,CAAC;AAEjC,kCAAkC;AAClC,eAAO,MAAM,IAAI,eAAa,CAAC;AAE/B,yDAAyD;AACzD,eAAO,MAAM,OAAO,eAAa,CAAC;AAMlC;;;;;;;;;GASG;AACH,wBAAgB,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpD;AAMD;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAK1D;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAI7D;AAED,wFAAwF;AACxF,UAAU,WAAW;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,GAAG,MAAM,CAO1E;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAgBxF;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAElD;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,MAAM,CAW/E;AAMD;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAKzD;AAED;;;;;;GAMG;AACH,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAEtD;AAMD;;GAEG;AACH,MAAM,WAAW,MAAM;IACtB,2BAA2B;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACzB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,CAuBvE"}
1
+ {"version":3,"file":"cli-format.d.ts","sourceRoot":"","sources":["../src/cli-format.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAYH,+EAA+E;AAC/E,eAAO,MAAM,QAAQ,SAAyB,CAAC;AAE/C,4BAA4B;AAC5B,eAAO,MAAM,IAAI,cAAY,CAAC;AAE9B,mCAAmC;AACnC,eAAO,MAAM,GAAG,cAAY,CAAC;AAE7B,uCAAuC;AACvC,eAAO,MAAM,KAAK,cAAY,CAAC;AAE/B,mCAAmC;AACnC,eAAO,MAAM,KAAK,eAAa,CAAC;AAEhC,iCAAiC;AACjC,eAAO,MAAM,GAAG,eAAa,CAAC;AAE9B,oCAAoC;AACpC,eAAO,MAAM,MAAM,eAAa,CAAC;AAEjC,kCAAkC;AAClC,eAAO,MAAM,IAAI,eAAa,CAAC;AAE/B,yDAAyD;AACzD,eAAO,MAAM,OAAO,eAAa,CAAC;AAMlC;;;;;;;;;GASG;AACH,wBAAgB,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpD;AAMD;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAK1D;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAI7D;AAED,wFAAwF;AACxF,UAAU,WAAW;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,GAAG,MAAM,CAO1E;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAgBxF;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAElD;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,MAAM,CAW/E;AAMD;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAMzD;AAED;;;;;;GAMG;AACH,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAEtD;AAMD;;GAEG;AACH,MAAM,WAAW,MAAM;IACtB,2BAA2B;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACzB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,CAuBvE"}
@@ -196,7 +196,8 @@ export function formatRelativeTime(ts, now = Date.now()) {
196
196
  */
197
197
  export function padRight(str, len) {
198
198
  // Strip ANSI codes for length calculation
199
- const plainLen = str.replace(/\x1b\[[0-9;]*m/g, "").length;
199
+ const ansiEscapePattern = new RegExp(`${String.fromCharCode(27)}\\[[0-9;]*m`, "g");
200
+ const plainLen = str.replace(ansiEscapePattern, "").length;
200
201
  if (plainLen >= len)
201
202
  return str;
202
203
  return str + " ".repeat(len - plainLen);
@@ -1 +1 @@
1
- {"version":3,"file":"cli-format.js","sourceRoot":"","sources":["../src/cli-format.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,8EAA8E;AAC9E,8BAA8B;AAC9B,EAAE;AACF,wEAAwE;AACxE,sEAAsE;AACtE,2DAA2D;AAC3D,EAAE;AACF,wEAAwE;AACxE,8EAA8E;AAE9E,+EAA+E;AAC/E,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;AAE/C,4BAA4B;AAC5B,MAAM,CAAC,MAAM,IAAI,GAAG,SAAS,CAAC;AAE9B,mCAAmC;AACnC,MAAM,CAAC,MAAM,GAAG,GAAG,SAAS,CAAC;AAE7B,uCAAuC;AACvC,MAAM,CAAC,MAAM,KAAK,GAAG,SAAS,CAAC;AAE/B,mCAAmC;AACnC,MAAM,CAAC,MAAM,KAAK,GAAG,UAAU,CAAC;AAEhC,iCAAiC;AACjC,MAAM,CAAC,MAAM,GAAG,GAAG,UAAU,CAAC;AAE9B,oCAAoC;AACpC,MAAM,CAAC,MAAM,MAAM,GAAG,UAAU,CAAC;AAEjC,kCAAkC;AAClC,MAAM,CAAC,MAAM,IAAI,GAAG,UAAU,CAAC;AAE/B,yDAAyD;AACzD,MAAM,CAAC,MAAM,OAAO,GAAG,UAAU,CAAC;AAElC,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E;;;;;;;;;GASG;AACH,MAAM,UAAU,CAAC,CAAC,IAAY,EAAE,IAAY;IAC3C,OAAO,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC;AAC9C,CAAC;AAED,8EAA8E;AAC9E,oCAAoC;AACpC,8EAA8E;AAE9E;;;;;;;;;GASG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAc;IACjD,IAAI,CAAC,MAAM,IAAI,MAAM,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC7C,IAAI,MAAM,IAAI,SAAS;QAAE,OAAO,GAAG,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACrG,IAAI,MAAM,IAAI,KAAK;QAAE,OAAO,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACzF,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC;AACvB,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,WAAW,CAAC,KAAyB;IACpD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,QAAQ,CAAC;IAC3D,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAC/B,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;AAC/B,CAAC;AAUD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAgC;IACjE,IAAI,CAAC,OAAO;QAAE,OAAO,CAAC,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,OAAO,CAAC,eAAe,KAAK,CAAC,IAAI,OAAO,CAAC,gBAAgB,KAAK,CAAC,CAAC;IAC/E,IAAI,MAAM;QAAE,OAAO,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG,OAAO,CAAC,oBAAoB,KAAK,SAAS,IAAI,OAAO,CAAC,qBAAqB,KAAK,SAAS,CAAC;IAC3G,IAAI,QAAQ;QAAE,OAAO,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACtC,OAAO,EAAE,CAAC;AACX,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAgC;IACnE,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,eAAe,CAAC;IACtC,MAAM,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IACxC,MAAM,OAAO,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAC7C,MAAM,QAAQ,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAC/C,IAAI,OAAO,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAEtE,MAAM,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;IAC9B,IAAI,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAEnC,MAAM,QAAQ,GAAG,CAAC,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,QAAQ,IAAI,MAAM,CAAC,CAAC;IAC3D,MAAM,QAAQ,GAAG,CAAC,GAAG,QAAQ,GAAG,MAAM,CAAC;IACvC,IAAI,QAAQ,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAEpC,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;AAC/C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,CAAS;IACrC,OAAO,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;AAClC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,EAAU;IACzC,OAAO,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;AACnC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,EAAU,EAAE,MAAc,IAAI,CAAC,GAAG,EAAE;IACtE,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAC3C,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,UAAU,CAAC;IACpC,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,GAAG,OAAO,OAAO,CAAC;IAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACzC,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,GAAG,OAAO,OAAO,CAAC;IAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACvC,IAAI,KAAK,GAAG,EAAE;QAAE,OAAO,GAAG,KAAK,OAAO,CAAC;IACvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;IACpC,OAAO,GAAG,IAAI,OAAO,CAAC;AACvB,CAAC;AAED,8EAA8E;AAC9E,0BAA0B;AAC1B,8EAA8E;AAE9E;;;;;;;;;GASG;AACH,MAAM,UAAU,QAAQ,CAAC,GAAW,EAAE,GAAW;IAChD,0CAA0C;IAC1C,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC;IAC3D,IAAI,QAAQ,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC;IAChC,OAAO,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,QAAQ,CAAC,CAAC;AACzC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,IAAI,CAAC,IAAY,EAAE,GAAW;IAC7C,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC;AAkBD;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,WAAW,CAAC,OAAiB,EAAE,IAAgB;IAC9D,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,6CAA6C;IAC7C,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CACvC,GAAG,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CACjG,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAElC,kEAAkE;IAClE,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IACjE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAEvC,YAAY;IACZ,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YACpC,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC1B,OAAO,GAAG,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;QACrF,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC"}
1
+ {"version":3,"file":"cli-format.js","sourceRoot":"","sources":["../src/cli-format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * kosha-discovery — Context-management strategy advisor.
3
+ *
4
+ * Pure synthesis over the model + provider catalog: given where a caller is
5
+ * in their conversation, return ranked options (continue / cache / compact /
6
+ * switch model / long-context tier / batch offload) with rough cost math.
7
+ *
8
+ * No tokenization, no model inference — just arithmetic over the registry.
9
+ * @module
10
+ */
11
+ import type { ModelCard, ProviderCacheBehavior } from "./types.js";
12
+ export interface ContextStrategyInput {
13
+ model: ModelCard;
14
+ currentTokens: number;
15
+ expectedRemainingTurns?: number;
16
+ expectedOutputTokens?: number;
17
+ candidateAlternatives?: ModelCard[];
18
+ }
19
+ export interface ContextSituation {
20
+ tokensUsed: number;
21
+ contextWindow: number;
22
+ headroomTokens: number;
23
+ headroomPercent: number;
24
+ inLongContextTier: boolean;
25
+ longContextThresholdTokens?: number;
26
+ }
27
+ export interface StrategyOption {
28
+ strategy: "continue" | "enable_prompt_cache" | "compact_and_continue" | "switch_to_long_context_tier" | "switch_model" | "batch_offload";
29
+ viable: boolean;
30
+ costPerTurnUsd?: number;
31
+ savingsPerTurnUsd?: number;
32
+ notes: string;
33
+ details?: Record<string, unknown>;
34
+ }
35
+ export interface ContextStrategy {
36
+ model: {
37
+ id: string;
38
+ provider: string;
39
+ contextWindow: number;
40
+ };
41
+ situation: ContextSituation;
42
+ cacheBehavior?: ProviderCacheBehavior;
43
+ options: StrategyOption[];
44
+ recommended: StrategyOption["strategy"];
45
+ }
46
+ /** Compute ranked context-management options for the given conversation state. */
47
+ export declare function computeContextStrategy(input: ContextStrategyInput): ContextStrategy;
48
+ //# sourceMappingURL=context-strategy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-strategy.d.ts","sourceRoot":"","sources":["../src/context-strategy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAgB,qBAAqB,EAAE,MAAM,YAAY,CAAC;AASjF,MAAM,WAAW,oBAAoB;IACpC,KAAK,EAAE,SAAS,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,qBAAqB,CAAC,EAAE,SAAS,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,gBAAgB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,0BAA0B,CAAC,EAAE,MAAM,CAAC;CACpC;AAED,MAAM,WAAW,cAAc;IAC9B,QAAQ,EACL,UAAU,GACV,qBAAqB,GACrB,sBAAsB,GACtB,6BAA6B,GAC7B,cAAc,GACd,eAAe,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,eAAe;IAC/B,KAAK,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/D,SAAS,EAAE,gBAAgB,CAAC;IAC5B,aAAa,CAAC,EAAE,qBAAqB,CAAC;IACtC,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,WAAW,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;CACxC;AAED,kFAAkF;AAClF,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,oBAAoB,GAAG,eAAe,CA6CnF"}
@@ -0,0 +1,274 @@
1
+ /**
2
+ * kosha-discovery — Context-management strategy advisor.
3
+ *
4
+ * Pure synthesis over the model + provider catalog: given where a caller is
5
+ * in their conversation, return ranked options (continue / cache / compact /
6
+ * switch model / long-context tier / batch offload) with rough cost math.
7
+ *
8
+ * No tokenization, no model inference — just arithmetic over the registry.
9
+ * @module
10
+ */
11
+ import { getProviderCacheBehavior } from "./provider-catalog.js";
12
+ const DEFAULT_EXPECTED_OUTPUT_TOKENS = 1024;
13
+ const DEFAULT_EXPECTED_REMAINING_TURNS = 5;
14
+ const HEADROOM_WARN_PERCENT = 20;
15
+ const HEADROOM_CRITICAL_PERCENT = 10;
16
+ const COMPACTION_TARGET_PERCENT = 25;
17
+ const CACHE_READ_DISCOUNT_FLOOR = 0.5;
18
+ /** Compute ranked context-management options for the given conversation state. */
19
+ export function computeContextStrategy(input) {
20
+ const { model, currentTokens, expectedRemainingTurns = DEFAULT_EXPECTED_REMAINING_TURNS, expectedOutputTokens = DEFAULT_EXPECTED_OUTPUT_TOKENS, candidateAlternatives = [], } = input;
21
+ const tokensUsed = Math.max(0, Math.floor(currentTokens));
22
+ const headroomTokens = Math.max(0, model.contextWindow - tokensUsed);
23
+ const headroomPercent = model.contextWindow > 0 ? (headroomTokens / model.contextWindow) * 100 : 0;
24
+ const longThreshold = model.pricing?.longContextThresholdTokens;
25
+ const inLongContextTier = longThreshold !== undefined && tokensUsed >= longThreshold;
26
+ const situation = {
27
+ tokensUsed,
28
+ contextWindow: model.contextWindow,
29
+ headroomTokens,
30
+ headroomPercent: round(headroomPercent, 2),
31
+ inLongContextTier,
32
+ ...(longThreshold !== undefined ? { longContextThresholdTokens: longThreshold } : {}),
33
+ };
34
+ const cacheBehavior = getProviderCacheBehavior(model.provider);
35
+ const baselineCost = perTurnCost(model.pricing, tokensUsed, expectedOutputTokens, inLongContextTier);
36
+ const options = [];
37
+ options.push(buildContinueOption(situation, baselineCost, expectedRemainingTurns));
38
+ options.push(buildPromptCacheOption(model, tokensUsed, expectedOutputTokens, baselineCost, cacheBehavior));
39
+ options.push(buildLongContextTierOption(model, situation, baselineCost, expectedOutputTokens));
40
+ options.push(buildCompactionOption(model, situation, baselineCost, expectedOutputTokens, candidateAlternatives));
41
+ options.push(buildSwitchModelOption(model, tokensUsed, expectedOutputTokens, baselineCost, candidateAlternatives));
42
+ options.push(buildBatchOffloadOption(model, tokensUsed, expectedOutputTokens, baselineCost));
43
+ const recommended = pickRecommended(options, situation);
44
+ return {
45
+ model: { id: model.id, provider: model.provider, contextWindow: model.contextWindow },
46
+ situation,
47
+ ...(cacheBehavior ? { cacheBehavior } : {}),
48
+ options,
49
+ recommended,
50
+ };
51
+ }
52
+ function buildContinueOption(situation, baselineCost, expectedRemainingTurns) {
53
+ const viable = situation.headroomPercent > 0;
54
+ const tone = situation.headroomPercent < HEADROOM_CRITICAL_PERCENT
55
+ ? `Only ${situation.headroomPercent.toFixed(1)}% headroom — likely to overflow within 1–2 turns.`
56
+ : situation.headroomPercent < HEADROOM_WARN_PERCENT
57
+ ? `${situation.headroomPercent.toFixed(1)}% headroom — comfortable for a few more turns.`
58
+ : `${situation.headroomPercent.toFixed(1)}% headroom — no pressure.`;
59
+ return {
60
+ strategy: "continue",
61
+ viable,
62
+ ...(baselineCost !== undefined ? { costPerTurnUsd: round(baselineCost, 6) } : {}),
63
+ notes: tone,
64
+ details: {
65
+ projectedCostForRemainingTurnsUsd: baselineCost !== undefined ? round(baselineCost * expectedRemainingTurns, 6) : undefined,
66
+ inLongContextTier: situation.inLongContextTier,
67
+ },
68
+ };
69
+ }
70
+ function buildPromptCacheOption(model, currentTokens, expectedOutputTokens, baselineCost, cacheBehavior) {
71
+ if (!cacheBehavior || cacheBehavior.mode === "none") {
72
+ return {
73
+ strategy: "enable_prompt_cache",
74
+ viable: false,
75
+ notes: cacheBehavior?.mode === "none"
76
+ ? "Provider has no documented prompt cache."
77
+ : "Cache behavior for this provider has not been curated yet.",
78
+ };
79
+ }
80
+ const cacheReadRate = model.pricing?.cacheReadPerMillion;
81
+ const inputRate = model.pricing?.inputPerMillion;
82
+ const outputRate = model.pricing?.outputPerMillion;
83
+ const canEstimate = cacheReadRate !== undefined && inputRate !== undefined && outputRate !== undefined;
84
+ const cachedTurnCost = canEstimate
85
+ ? (currentTokens * cacheReadRate + expectedOutputTokens * outputRate) / 1_000_000
86
+ : undefined;
87
+ const savings = baselineCost !== undefined && cachedTurnCost !== undefined ? baselineCost - cachedTurnCost : undefined;
88
+ const ttlGuidance = cacheBehavior.mode === "explicit"
89
+ ? cacheBehavior.ttlTiers
90
+ ? `Pick a TTL from: ${cacheBehavior.ttlTiers.join(", ")}.`
91
+ : cacheBehavior.maxTtlSeconds
92
+ ? `Set TTL up to ${cacheBehavior.maxTtlSeconds}s (default ${cacheBehavior.defaultTtlSeconds ?? "provider-defined"}).`
93
+ : "Caller picks TTL."
94
+ : cacheBehavior.mode === "automatic"
95
+ ? `Provider manages TTL${cacheBehavior.approximateTtlSeconds ? ` (~${cacheBehavior.approximateTtlSeconds}s typical)` : ""}.`
96
+ : "Gateway forwards cache_control to the routed model — TTL inherits from the underlying provider.";
97
+ return {
98
+ strategy: "enable_prompt_cache",
99
+ viable: true,
100
+ ...(cachedTurnCost !== undefined ? { costPerTurnUsd: round(cachedTurnCost, 6) } : {}),
101
+ ...(savings !== undefined ? { savingsPerTurnUsd: round(savings, 6) } : {}),
102
+ notes: cacheReadRate !== undefined &&
103
+ inputRate !== undefined &&
104
+ inputRate > 0 &&
105
+ cacheReadRate / inputRate < CACHE_READ_DISCOUNT_FLOOR
106
+ ? `Cache reads cost ${round((cacheReadRate / inputRate) * 100, 1)}% of base input — meaningful savings on a stable prefix. ${ttlGuidance}`
107
+ : `Mode: ${cacheBehavior.mode}. ${ttlGuidance}`,
108
+ details: {
109
+ cacheMode: cacheBehavior.mode,
110
+ ttlTiers: cacheBehavior.ttlTiers,
111
+ defaultTtlSeconds: cacheBehavior.defaultTtlSeconds,
112
+ maxTtlSeconds: cacheBehavior.maxTtlSeconds,
113
+ approximateTtlSeconds: cacheBehavior.approximateTtlSeconds,
114
+ cacheReadRatePerMillion: cacheReadRate,
115
+ documented: cacheBehavior.documented,
116
+ },
117
+ };
118
+ }
119
+ function buildLongContextTierOption(model, situation, baselineCost, expectedOutputTokens) {
120
+ const threshold = model.pricing?.longContextThresholdTokens;
121
+ const longIn = model.pricing?.longContextInputPerMillion;
122
+ const longOut = model.pricing?.longContextOutputPerMillion;
123
+ if (threshold === undefined || longIn === undefined || longOut === undefined) {
124
+ return {
125
+ strategy: "switch_to_long_context_tier",
126
+ viable: false,
127
+ notes: "Model does not publish a tiered long-context price — single rate applies regardless of size.",
128
+ };
129
+ }
130
+ const tieredCost = (situation.tokensUsed * longIn + expectedOutputTokens * longOut) / 1_000_000;
131
+ const delta = baselineCost !== undefined ? tieredCost - baselineCost : undefined;
132
+ return {
133
+ strategy: "switch_to_long_context_tier",
134
+ viable: true,
135
+ costPerTurnUsd: round(tieredCost, 6),
136
+ ...(delta !== undefined ? { savingsPerTurnUsd: round(-delta, 6) } : {}),
137
+ notes: situation.inLongContextTier
138
+ ? `Already in long-context tier (>${threshold} tokens). Cost is what it is — consider compaction or a smaller-context-priced model instead.`
139
+ : `You're under the ${threshold}-token threshold; growing past it triggers tiered pricing (input ${longIn}/M, output ${longOut}/M).`,
140
+ details: { thresholdTokens: threshold, longInputPerMillion: longIn, longOutputPerMillion: longOut },
141
+ };
142
+ }
143
+ function buildCompactionOption(model, situation, baselineCost, expectedOutputTokens, candidateAlternatives) {
144
+ if (situation.tokensUsed === 0) {
145
+ return { strategy: "compact_and_continue", viable: false, notes: "Nothing to compact yet." };
146
+ }
147
+ const targetTokens = Math.max(1024, Math.floor(model.contextWindow * (COMPACTION_TARGET_PERCENT / 100)));
148
+ const tokensReclaimed = Math.max(0, situation.tokensUsed - targetTokens);
149
+ const summarizer = pickCheapestChatModel(candidateAlternatives, model);
150
+ const summarizationCost = summarizer?.pricing?.inputPerMillion !== undefined
151
+ ? (situation.tokensUsed * summarizer.pricing.inputPerMillion +
152
+ targetTokens * (summarizer.pricing.outputPerMillion ?? 0)) /
153
+ 1_000_000
154
+ : undefined;
155
+ const postCompactionTurnCost = model.pricing?.inputPerMillion !== undefined && model.pricing?.outputPerMillion !== undefined
156
+ ? (targetTokens * model.pricing.inputPerMillion + expectedOutputTokens * model.pricing.outputPerMillion) / 1_000_000
157
+ : undefined;
158
+ const savings = baselineCost !== undefined && postCompactionTurnCost !== undefined ? baselineCost - postCompactionTurnCost : undefined;
159
+ return {
160
+ strategy: "compact_and_continue",
161
+ viable: tokensReclaimed > 0,
162
+ ...(postCompactionTurnCost !== undefined ? { costPerTurnUsd: round(postCompactionTurnCost, 6) } : {}),
163
+ ...(savings !== undefined ? { savingsPerTurnUsd: round(savings, 6) } : {}),
164
+ notes: summarizer
165
+ ? `Summarize older turns down to ~${targetTokens} tokens using ${summarizer.id}; reclaims ${tokensReclaimed} tokens.`
166
+ : `Summarize older turns down to ~${targetTokens} tokens; reclaims ${tokensReclaimed} tokens. No cheap summarizer in candidate set.`,
167
+ details: {
168
+ targetTokens,
169
+ tokensReclaimed,
170
+ summarizerModelId: summarizer?.id,
171
+ summarizationCostUsd: summarizationCost !== undefined ? round(summarizationCost, 6) : undefined,
172
+ },
173
+ };
174
+ }
175
+ function buildSwitchModelOption(currentModel, currentTokens, expectedOutputTokens, baselineCost, candidateAlternatives) {
176
+ const candidates = candidateAlternatives
177
+ .filter((m) => m.id !== currentModel.id && m.contextWindow >= currentTokens && m.pricing?.inputPerMillion !== undefined)
178
+ .map((m) => ({
179
+ model: m,
180
+ cost: perTurnCost(m.pricing, currentTokens, expectedOutputTokens, false) ?? Number.POSITIVE_INFINITY,
181
+ }))
182
+ .sort((a, b) => a.cost - b.cost)
183
+ .slice(0, 3);
184
+ if (candidates.length === 0) {
185
+ return {
186
+ strategy: "switch_model",
187
+ viable: false,
188
+ notes: "No alternative model in the candidate set fits the current context size.",
189
+ };
190
+ }
191
+ const best = candidates[0];
192
+ const savings = baselineCost !== undefined ? baselineCost - best.cost : undefined;
193
+ return {
194
+ strategy: "switch_model",
195
+ viable: true,
196
+ costPerTurnUsd: round(best.cost, 6),
197
+ ...(savings !== undefined ? { savingsPerTurnUsd: round(savings, 6) } : {}),
198
+ notes: `Cheapest fit: ${best.model.id} (${best.model.contextWindow} context). ${candidates.length - 1} other option(s) considered.`,
199
+ details: {
200
+ alternatives: candidates.map((c) => ({
201
+ id: c.model.id,
202
+ provider: c.model.provider,
203
+ contextWindow: c.model.contextWindow,
204
+ costPerTurnUsd: Number.isFinite(c.cost) ? round(c.cost, 6) : null,
205
+ })),
206
+ },
207
+ };
208
+ }
209
+ function buildBatchOffloadOption(model, currentTokens, expectedOutputTokens, baselineCost) {
210
+ const batchIn = model.pricing?.batchInputPerMillion;
211
+ const batchOut = model.pricing?.batchOutputPerMillion;
212
+ if (batchIn === undefined || batchOut === undefined) {
213
+ return {
214
+ strategy: "batch_offload",
215
+ viable: false,
216
+ notes: "Model does not publish Batch API pricing.",
217
+ };
218
+ }
219
+ const batchCost = (currentTokens * batchIn + expectedOutputTokens * batchOut) / 1_000_000;
220
+ const savings = baselineCost !== undefined ? baselineCost - batchCost : undefined;
221
+ return {
222
+ strategy: "batch_offload",
223
+ viable: true,
224
+ costPerTurnUsd: round(batchCost, 6),
225
+ ...(savings !== undefined ? { savingsPerTurnUsd: round(savings, 6) } : {}),
226
+ notes: "Batch API trades latency (typically 24h SLO) for cheaper tokens — only viable if the workload is not real-time.",
227
+ details: { batchInputPerMillion: batchIn, batchOutputPerMillion: batchOut },
228
+ };
229
+ }
230
+ function pickRecommended(options, situation) {
231
+ const viable = options.filter((o) => o.viable);
232
+ if (viable.length === 0)
233
+ return "continue";
234
+ if (situation.headroomPercent < HEADROOM_CRITICAL_PERCENT) {
235
+ const compact = viable.find((o) => o.strategy === "compact_and_continue");
236
+ if (compact)
237
+ return "compact_and_continue";
238
+ const switchModel = viable.find((o) => o.strategy === "switch_model");
239
+ if (switchModel)
240
+ return "switch_model";
241
+ }
242
+ const withSavings = viable
243
+ .filter((o) => o.strategy !== "continue" && typeof o.savingsPerTurnUsd === "number" && o.savingsPerTurnUsd > 0)
244
+ .sort((a, b) => (b.savingsPerTurnUsd ?? 0) - (a.savingsPerTurnUsd ?? 0));
245
+ if (withSavings.length > 0)
246
+ return withSavings[0].strategy;
247
+ return "continue";
248
+ }
249
+ function pickCheapestChatModel(candidates, currentModel) {
250
+ return candidates
251
+ .filter((m) => m.id !== currentModel.id &&
252
+ m.mode === "chat" &&
253
+ typeof m.pricing?.inputPerMillion === "number" &&
254
+ typeof m.pricing?.outputPerMillion === "number")
255
+ .sort((a, b) => (a.pricing?.inputPerMillion ?? 0) - (b.pricing?.inputPerMillion ?? 0))[0];
256
+ }
257
+ function perTurnCost(pricing, inputTokens, outputTokens, useLongContextTier) {
258
+ if (!pricing)
259
+ return undefined;
260
+ const inputRate = useLongContextTier
261
+ ? (pricing.longContextInputPerMillion ?? pricing.inputPerMillion)
262
+ : pricing.inputPerMillion;
263
+ const outputRate = useLongContextTier
264
+ ? (pricing.longContextOutputPerMillion ?? pricing.outputPerMillion)
265
+ : pricing.outputPerMillion;
266
+ if (inputRate === undefined || outputRate === undefined)
267
+ return undefined;
268
+ return (inputTokens * inputRate + outputTokens * outputRate) / 1_000_000;
269
+ }
270
+ function round(n, digits) {
271
+ const factor = 10 ** digits;
272
+ return Math.round(n * factor) / factor;
273
+ }
274
+ //# sourceMappingURL=context-strategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-strategy.js","sourceRoot":"","sources":["../src/context-strategy.ts"],"names":[],"mappings":"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"}
@@ -71,6 +71,13 @@ export declare class CredentialResolver {
71
71
  * (No known CLI tool stores OpenRouter keys on disk.)
72
72
  */
73
73
  private resolveOpenRouter;
74
+ /**
75
+ * Search hierarchy for Vercel AI Gateway credentials:
76
+ * 1. Explicit config key
77
+ * 2. `AI_GATEWAY_API_KEY` env var
78
+ * 3. `VERCEL_OIDC_TOKEN` env var (available on Vercel deployments)
79
+ */
80
+ private resolveVercelAIGateway;
74
81
  /**
75
82
  * Ollama runs locally and never requires authentication.
76
83
  * Returns `{ source: "none" }` unconditionally.
@@ -1 +1 @@
1
- {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/credentials/resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAMH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGpD;;;;;;;;;;GAUG;AACH,qBAAa,kBAAkB;IAC9B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA0B;IAEpD;;;;;;;OAOG;IACG,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAuDlF;;;;;;;;OAQG;YACW,gBAAgB;IAuD9B;;;;;;OAMG;YACW,aAAa;IA2C3B;;;;;;OAMG;YACW,aAAa;IAkD3B;;;;;OAKG;YACW,iBAAiB;IAoB/B;;;OAGG;IACH,OAAO,CAAC,aAAa;IAQrB;;;;;;;;;;;;;OAaG;YACW,wBAAwB;IAqDtC;;;;;;;;;OASG;YACW,gBAAgB;IAsB9B;;;;;;;;;;OAUG;IACH,OAAO,CAAC,kBAAkB;IAkC1B;;;;;;;;;;;;;;OAcG;YACW,uBAAuB;IA0CrC;;;;;;;OAOG;YACW,qBAAqB;IAkBnC;;;OAGG;IACH,OAAO,CAAC,eAAe;IAavB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAkBzB;;;OAGG;IACH,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,mBAAmB;IAa3B,OAAO,CAAC,kBAAkB;IAmB1B,oEAAoE;YACtD,QAAQ;IAStB,sEAAsE;YACxD,YAAY;IAQ1B,8DAA8D;IAC9D,OAAO,CAAC,eAAe;IAiBvB,6CAA6C;IAC7C,OAAO,CAAC,cAAc;IAetB,8EAA8E;IAC9E,OAAO,CAAC,mBAAmB;CAS3B"}
1
+ {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/credentials/resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAMH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGpD;;;;;;;;;;GAUG;AACH,qBAAa,kBAAkB;IAC9B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA0B;IAEpD;;;;;;;OAOG;IACG,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAyDlF;;;;;;;;OAQG;YACW,gBAAgB;IAuD9B;;;;;;OAMG;YACW,aAAa;IA2C3B;;;;;;OAMG;YACW,aAAa;IAkD3B;;;;;OAKG;YACW,iBAAiB;IAoB/B;;;;;OAKG;YACW,sBAAsB;IAsBpC;;;OAGG;IACH,OAAO,CAAC,aAAa;IAQrB;;;;;;;;;;;;;OAaG;YACW,wBAAwB;IAqDtC;;;;;;;;;OASG;YACW,gBAAgB;IAsB9B;;;;;;;;;;OAUG;IACH,OAAO,CAAC,kBAAkB;IAkC1B;;;;;;;;;;;;;;OAcG;YACW,uBAAuB;IA0CrC;;;;;;;OAOG;YACW,qBAAqB;IAkBnC;;;OAGG;IACH,OAAO,CAAC,eAAe;IAavB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAkBzB;;;OAGG;IACH,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,mBAAmB;IAa3B,OAAO,CAAC,kBAAkB;IAmB1B,oEAAoE;YACtD,QAAQ;IAStB,sEAAsE;YACxD,YAAY;IAQ1B,8DAA8D;IAC9D,OAAO,CAAC,eAAe;IAiBvB,6CAA6C;IAC7C,OAAO,CAAC,cAAc;IAetB,8EAA8E;IAC9E,OAAO,CAAC,mBAAmB;CAS3B"}
@@ -52,6 +52,8 @@ export class CredentialResolver {
52
52
  return this.resolveGoogle(explicitKey);
53
53
  case "openrouter":
54
54
  return this.resolveOpenRouter(explicitKey);
55
+ case "vercel":
56
+ return this.resolveVercelAIGateway(explicitKey);
55
57
  case "ollama":
56
58
  case "llama.cpp":
57
59
  return this.resolveOllama();
@@ -259,6 +261,29 @@ export class CredentialResolver {
259
261
  return { source: "none" };
260
262
  }
261
263
  // ---------------------------------------------------------------------------
264
+ // Vercel AI Gateway
265
+ // ---------------------------------------------------------------------------
266
+ /**
267
+ * Search hierarchy for Vercel AI Gateway credentials:
268
+ * 1. Explicit config key
269
+ * 2. `AI_GATEWAY_API_KEY` env var
270
+ * 3. `VERCEL_OIDC_TOKEN` env var (available on Vercel deployments)
271
+ */
272
+ async resolveVercelAIGateway(explicitKey) {
273
+ if (explicitKey) {
274
+ return { apiKey: explicitKey, source: "config" };
275
+ }
276
+ const apiKey = process.env.AI_GATEWAY_API_KEY;
277
+ if (apiKey) {
278
+ return { apiKey, source: "env" };
279
+ }
280
+ const oidcToken = process.env.VERCEL_OIDC_TOKEN;
281
+ if (oidcToken) {
282
+ return { accessToken: oidcToken, source: "env" };
283
+ }
284
+ return { source: "none" };
285
+ }
286
+ // ---------------------------------------------------------------------------
262
287
  // Ollama (no auth needed)
263
288
  // ---------------------------------------------------------------------------
264
289
  /**
@@ -309,7 +334,7 @@ export class CredentialResolver {
309
334
  const awsCredentialsRaw = await this.readTextFile(awsCredentialsPath);
310
335
  if (awsCredentialsRaw !== null) {
311
336
  const defaultProfile = this.parseAwsIniSection(awsCredentialsRaw, "default");
312
- const keyId = defaultProfile["aws_access_key_id"];
337
+ const keyId = defaultProfile.aws_access_key_id;
313
338
  if (keyId) {
314
339
  const region = await this.resolveAwsRegion();
315
340
  return { apiKey: keyId, source: "cli", path: awsCredentialsPath, metadata: { region } };
@@ -352,8 +377,8 @@ export class CredentialResolver {
352
377
  const configText = awsConfigRaw ?? (await this.readTextFile(join(this.home, ".aws", "config")));
353
378
  if (configText !== null) {
354
379
  // AWS config uses [profile default] for non-default profiles and [default] for the default
355
- const section = this.parseAwsIniSection(configText, "profile default")["region"] ??
356
- this.parseAwsIniSection(configText, "default")["region"];
380
+ const section = this.parseAwsIniSection(configText, "profile default").region ??
381
+ this.parseAwsIniSection(configText, "default").region;
357
382
  if (section) {
358
383
  return section;
359
384
  }