@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.
- package/README.md +51 -3
- 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/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/credentials/resolver.d.ts +7 -0
- package/dist/credentials/resolver.d.ts.map +1 -1
- package/dist/credentials/resolver.js +28 -3
- package/dist/credentials/resolver.js.map +1 -1
- package/dist/discovery/index.d.ts +4 -6
- package/dist/discovery/index.d.ts.map +1 -1
- package/dist/discovery/index.js +39 -55
- 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/modelsdev-seed.js +16 -12
- package/dist/discovery/modelsdev-seed.js.map +1 -1
- package/dist/discovery/promo-overrides.js +3 -3
- package/dist/discovery/promo-overrides.js.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-contract.d.ts +1 -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/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.map +1 -1
- package/dist/enrichment/litellm.js +6 -0
- package/dist/enrichment/litellm.js.map +1 -1
- package/dist/mcp-server.d.ts +18 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +341 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/provider-catalog.d.ts +19 -2
- package/dist/provider-catalog.d.ts.map +1 -1
- package/dist/provider-catalog.js +104 -0
- package/dist/provider-catalog.js.map +1 -1
- package/dist/proxy.d.ts +31 -0
- package/dist/proxy.d.ts.map +1 -0
- package/dist/proxy.js +213 -0
- package/dist/proxy.js.map +1 -0
- package/dist/registry-discovery.d.ts.map +1 -1
- package/dist/registry-discovery.js +5 -5
- 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 +58 -7
- package/dist/registry-query.js.map +1 -1
- package/dist/registry-runtime.d.ts +20 -0
- package/dist/registry-runtime.d.ts.map +1 -1
- package/dist/registry-runtime.js +231 -39
- package/dist/registry-runtime.js.map +1 -1
- package/dist/registry-selection.d.ts.map +1 -1
- package/dist/registry-selection.js +21 -3
- package/dist/registry-selection.js.map +1 -1
- package/dist/registry.js +2 -2
- package/dist/registry.js.map +1 -1
- package/dist/security.js +6 -6
- package/dist/security.js.map +1 -1
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +7 -1
- package/dist/server.js.map +1 -1
- package/dist/types.d.ts +42 -2
- package/dist/types.d.ts.map +1 -1
- package/logo.png +0 -0
- package/package.json +102 -91
package/README.md
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<p align="center">
|
|
2
|
-
<img src="logo
|
|
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
|
|
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
|
|
package/dist/cli-format.d.ts.map
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/cli-format.js
CHANGED
|
@@ -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
|
|
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);
|
package/dist/cli-format.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-format.js","sourceRoot":"","sources":["../src/cli-format.ts"],"names":[],"mappings":"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"}
|
|
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;
|
|
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
|
|
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")
|
|
356
|
-
this.parseAwsIniSection(configText, "default")
|
|
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
|
}
|