@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/dist/provider-catalog.js
CHANGED
|
@@ -24,8 +24,17 @@ export const PROVIDER_CATALOG = [
|
|
|
24
24
|
defaultBaseUrl: "https://api.anthropic.com",
|
|
25
25
|
credentialRequired: true,
|
|
26
26
|
credentialEnvVars: ["ANTHROPIC_API_KEY"],
|
|
27
|
+
primaryCredentialEnvVar: "ANTHROPIC_API_KEY",
|
|
27
28
|
// Anthropic prompt cache requires ≥1024 tokens for most Claude models.
|
|
28
29
|
minCachePrefixTokens: 1024,
|
|
30
|
+
cacheBehavior: {
|
|
31
|
+
mode: "explicit",
|
|
32
|
+
ttlTiers: ["5m", "1h"],
|
|
33
|
+
defaultTtlSeconds: 300,
|
|
34
|
+
maxTtlSeconds: 3600,
|
|
35
|
+
documented: true,
|
|
36
|
+
notes: "Set per cache_control block; 1h tier requires extended-cache beta header.",
|
|
37
|
+
},
|
|
29
38
|
},
|
|
30
39
|
{
|
|
31
40
|
providerId: "openai",
|
|
@@ -38,8 +47,15 @@ export const PROVIDER_CATALOG = [
|
|
|
38
47
|
defaultBaseUrl: "https://api.openai.com",
|
|
39
48
|
credentialRequired: true,
|
|
40
49
|
credentialEnvVars: ["OPENAI_API_KEY"],
|
|
50
|
+
primaryCredentialEnvVar: "OPENAI_API_KEY",
|
|
41
51
|
// OpenAI prompt cache engages for prefixes ≥1024 tokens.
|
|
42
52
|
minCachePrefixTokens: 1024,
|
|
53
|
+
cacheBehavior: {
|
|
54
|
+
mode: "automatic",
|
|
55
|
+
approximateTtlSeconds: 600,
|
|
56
|
+
documented: true,
|
|
57
|
+
notes: "Provider-managed; typically 5–10 minutes, may extend up to an hour under load.",
|
|
58
|
+
},
|
|
43
59
|
},
|
|
44
60
|
{
|
|
45
61
|
providerId: "google",
|
|
@@ -52,6 +68,14 @@ export const PROVIDER_CATALOG = [
|
|
|
52
68
|
defaultBaseUrl: "https://generativelanguage.googleapis.com",
|
|
53
69
|
credentialRequired: true,
|
|
54
70
|
credentialEnvVars: ["GOOGLE_API_KEY", "GEMINI_API_KEY"],
|
|
71
|
+
primaryCredentialEnvVar: "GOOGLE_API_KEY",
|
|
72
|
+
cacheBehavior: {
|
|
73
|
+
mode: "explicit",
|
|
74
|
+
defaultTtlSeconds: 3600,
|
|
75
|
+
maxTtlSeconds: 604_800,
|
|
76
|
+
documented: true,
|
|
77
|
+
notes: "Gemini Context Caching: create a CachedContent with TTL up to 7 days; billed for storage + reads.",
|
|
78
|
+
},
|
|
55
79
|
},
|
|
56
80
|
{
|
|
57
81
|
providerId: "openrouter",
|
|
@@ -63,7 +87,33 @@ export const PROVIDER_CATALOG = [
|
|
|
63
87
|
transport: "openai-compatible-http",
|
|
64
88
|
defaultBaseUrl: "https://openrouter.ai/api/v1",
|
|
65
89
|
credentialRequired: false,
|
|
90
|
+
executionCredentialRequired: true,
|
|
66
91
|
credentialEnvVars: ["OPENROUTER_API_KEY"],
|
|
92
|
+
primaryCredentialEnvVar: "OPENROUTER_API_KEY",
|
|
93
|
+
cacheBehavior: {
|
|
94
|
+
mode: "passthrough",
|
|
95
|
+
documented: true,
|
|
96
|
+
notes: "Forwards cache_control to the underlying provider; TTL inherits from the routed model.",
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
providerId: "vercel",
|
|
101
|
+
canonicalProviderId: "vercel",
|
|
102
|
+
aliases: ["ai-gateway", "ai_gateway", "vercel-ai", "vercel-ai-gateway"],
|
|
103
|
+
name: "Vercel AI Gateway",
|
|
104
|
+
origin: "proxy",
|
|
105
|
+
isLocal: false,
|
|
106
|
+
transport: "openai-compatible-http",
|
|
107
|
+
defaultBaseUrl: "https://ai-gateway.vercel.sh/v1",
|
|
108
|
+
credentialRequired: false,
|
|
109
|
+
executionCredentialRequired: true,
|
|
110
|
+
credentialEnvVars: ["AI_GATEWAY_API_KEY", "VERCEL_OIDC_TOKEN"],
|
|
111
|
+
primaryCredentialEnvVar: "AI_GATEWAY_API_KEY",
|
|
112
|
+
cacheBehavior: {
|
|
113
|
+
mode: "passthrough",
|
|
114
|
+
documented: true,
|
|
115
|
+
notes: "Gateway forwards cache_control to the underlying provider; TTL inherits from the routed model.",
|
|
116
|
+
},
|
|
67
117
|
},
|
|
68
118
|
{
|
|
69
119
|
providerId: "ollama",
|
|
@@ -76,6 +126,7 @@ export const PROVIDER_CATALOG = [
|
|
|
76
126
|
defaultBaseUrl: "http://localhost:11434",
|
|
77
127
|
credentialRequired: false,
|
|
78
128
|
credentialEnvVars: [],
|
|
129
|
+
cacheBehavior: { mode: "none", documented: true, notes: "Local runtime — KV-cache is in-process, not a billable prompt cache." },
|
|
79
130
|
},
|
|
80
131
|
{
|
|
81
132
|
providerId: "llama.cpp",
|
|
@@ -88,6 +139,7 @@ export const PROVIDER_CATALOG = [
|
|
|
88
139
|
defaultBaseUrl: "http://127.0.0.1:8080",
|
|
89
140
|
credentialRequired: false,
|
|
90
141
|
credentialEnvVars: [],
|
|
142
|
+
cacheBehavior: { mode: "none", documented: true, notes: "Local runtime — KV-cache is in-process, not a billable prompt cache." },
|
|
91
143
|
},
|
|
92
144
|
{
|
|
93
145
|
providerId: "bedrock",
|
|
@@ -100,6 +152,11 @@ export const PROVIDER_CATALOG = [
|
|
|
100
152
|
defaultBaseUrl: "https://bedrock-runtime.amazonaws.com",
|
|
101
153
|
credentialRequired: true,
|
|
102
154
|
credentialEnvVars: ["AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY"],
|
|
155
|
+
cacheBehavior: {
|
|
156
|
+
mode: "passthrough",
|
|
157
|
+
documented: true,
|
|
158
|
+
notes: "Inherits underlying model: Anthropic-on-Bedrock supports cache_control with the same 5m/1h tiers.",
|
|
159
|
+
},
|
|
103
160
|
},
|
|
104
161
|
{
|
|
105
162
|
providerId: "vertex",
|
|
@@ -112,6 +169,11 @@ export const PROVIDER_CATALOG = [
|
|
|
112
169
|
defaultBaseUrl: "https://aiplatform.googleapis.com",
|
|
113
170
|
credentialRequired: true,
|
|
114
171
|
credentialEnvVars: ["GOOGLE_APPLICATION_CREDENTIALS", "GOOGLE_CLOUD_PROJECT"],
|
|
172
|
+
cacheBehavior: {
|
|
173
|
+
mode: "passthrough",
|
|
174
|
+
documented: true,
|
|
175
|
+
notes: "Inherits Gemini Context Caching when routing to Gemini models.",
|
|
176
|
+
},
|
|
115
177
|
},
|
|
116
178
|
{
|
|
117
179
|
providerId: "nvidia",
|
|
@@ -124,6 +186,7 @@ export const PROVIDER_CATALOG = [
|
|
|
124
186
|
defaultBaseUrl: "https://integrate.api.nvidia.com/v1",
|
|
125
187
|
credentialRequired: true,
|
|
126
188
|
credentialEnvVars: ["NVIDIA_API_KEY"],
|
|
189
|
+
primaryCredentialEnvVar: "NVIDIA_API_KEY",
|
|
127
190
|
},
|
|
128
191
|
{
|
|
129
192
|
providerId: "together",
|
|
@@ -136,6 +199,7 @@ export const PROVIDER_CATALOG = [
|
|
|
136
199
|
defaultBaseUrl: "https://api.together.xyz/v1",
|
|
137
200
|
credentialRequired: true,
|
|
138
201
|
credentialEnvVars: ["TOGETHER_API_KEY"],
|
|
202
|
+
primaryCredentialEnvVar: "TOGETHER_API_KEY",
|
|
139
203
|
},
|
|
140
204
|
{
|
|
141
205
|
providerId: "fireworks",
|
|
@@ -148,6 +212,7 @@ export const PROVIDER_CATALOG = [
|
|
|
148
212
|
defaultBaseUrl: "https://api.fireworks.ai/inference/v1",
|
|
149
213
|
credentialRequired: true,
|
|
150
214
|
credentialEnvVars: ["FIREWORKS_API_KEY"],
|
|
215
|
+
primaryCredentialEnvVar: "FIREWORKS_API_KEY",
|
|
151
216
|
},
|
|
152
217
|
{
|
|
153
218
|
providerId: "groq",
|
|
@@ -160,6 +225,8 @@ export const PROVIDER_CATALOG = [
|
|
|
160
225
|
defaultBaseUrl: "https://api.groq.com/openai/v1",
|
|
161
226
|
credentialRequired: true,
|
|
162
227
|
credentialEnvVars: ["GROQ_API_KEY"],
|
|
228
|
+
primaryCredentialEnvVar: "GROQ_API_KEY",
|
|
229
|
+
cacheBehavior: { mode: "none", documented: true },
|
|
163
230
|
},
|
|
164
231
|
{
|
|
165
232
|
providerId: "mistral",
|
|
@@ -172,6 +239,8 @@ export const PROVIDER_CATALOG = [
|
|
|
172
239
|
defaultBaseUrl: "https://api.mistral.ai/v1",
|
|
173
240
|
credentialRequired: true,
|
|
174
241
|
credentialEnvVars: ["MISTRAL_API_KEY"],
|
|
242
|
+
primaryCredentialEnvVar: "MISTRAL_API_KEY",
|
|
243
|
+
cacheBehavior: { mode: "none", documented: true },
|
|
175
244
|
},
|
|
176
245
|
{
|
|
177
246
|
providerId: "deepinfra",
|
|
@@ -184,6 +253,7 @@ export const PROVIDER_CATALOG = [
|
|
|
184
253
|
defaultBaseUrl: "https://api.deepinfra.com/v1/openai",
|
|
185
254
|
credentialRequired: true,
|
|
186
255
|
credentialEnvVars: ["DEEPINFRA_API_KEY"],
|
|
256
|
+
primaryCredentialEnvVar: "DEEPINFRA_API_KEY",
|
|
187
257
|
},
|
|
188
258
|
{
|
|
189
259
|
providerId: "cohere",
|
|
@@ -196,6 +266,8 @@ export const PROVIDER_CATALOG = [
|
|
|
196
266
|
defaultBaseUrl: "https://api.cohere.com",
|
|
197
267
|
credentialRequired: true,
|
|
198
268
|
credentialEnvVars: ["CO_API_KEY"],
|
|
269
|
+
primaryCredentialEnvVar: "CO_API_KEY",
|
|
270
|
+
cacheBehavior: { mode: "none", documented: true },
|
|
199
271
|
},
|
|
200
272
|
{
|
|
201
273
|
providerId: "cerebras",
|
|
@@ -208,6 +280,8 @@ export const PROVIDER_CATALOG = [
|
|
|
208
280
|
defaultBaseUrl: "https://api.cerebras.ai/v1",
|
|
209
281
|
credentialRequired: true,
|
|
210
282
|
credentialEnvVars: ["CEREBRAS_API_KEY"],
|
|
283
|
+
primaryCredentialEnvVar: "CEREBRAS_API_KEY",
|
|
284
|
+
cacheBehavior: { mode: "none", documented: true },
|
|
211
285
|
},
|
|
212
286
|
{
|
|
213
287
|
providerId: "perplexity",
|
|
@@ -220,6 +294,8 @@ export const PROVIDER_CATALOG = [
|
|
|
220
294
|
defaultBaseUrl: "https://api.perplexity.ai",
|
|
221
295
|
credentialRequired: true,
|
|
222
296
|
credentialEnvVars: ["PERPLEXITY_API_KEY"],
|
|
297
|
+
primaryCredentialEnvVar: "PERPLEXITY_API_KEY",
|
|
298
|
+
cacheBehavior: { mode: "none", documented: true },
|
|
223
299
|
},
|
|
224
300
|
{
|
|
225
301
|
providerId: "deepseek",
|
|
@@ -232,6 +308,13 @@ export const PROVIDER_CATALOG = [
|
|
|
232
308
|
defaultBaseUrl: "https://api.deepseek.com",
|
|
233
309
|
credentialRequired: true,
|
|
234
310
|
credentialEnvVars: ["DEEPSEEK_API_KEY"],
|
|
311
|
+
primaryCredentialEnvVar: "DEEPSEEK_API_KEY",
|
|
312
|
+
cacheBehavior: {
|
|
313
|
+
mode: "automatic",
|
|
314
|
+
approximateTtlSeconds: 3600,
|
|
315
|
+
documented: true,
|
|
316
|
+
notes: "Automatic context caching; provider reports ~hours of retention but no strict guarantee.",
|
|
317
|
+
},
|
|
235
318
|
},
|
|
236
319
|
{
|
|
237
320
|
providerId: "moonshot",
|
|
@@ -244,6 +327,13 @@ export const PROVIDER_CATALOG = [
|
|
|
244
327
|
defaultBaseUrl: "https://api.moonshot.cn",
|
|
245
328
|
credentialRequired: true,
|
|
246
329
|
credentialEnvVars: ["MOONSHOT_API_KEY", "KIMI_API_KEY"],
|
|
330
|
+
primaryCredentialEnvVar: "MOONSHOT_API_KEY",
|
|
331
|
+
cacheBehavior: {
|
|
332
|
+
mode: "automatic",
|
|
333
|
+
approximateTtlSeconds: 3600,
|
|
334
|
+
documented: true,
|
|
335
|
+
notes: "Kimi prompt cache is automatic on repeat prefixes; documented as long-lived but TTL not formally specified.",
|
|
336
|
+
},
|
|
247
337
|
},
|
|
248
338
|
{
|
|
249
339
|
providerId: "glm",
|
|
@@ -256,6 +346,7 @@ export const PROVIDER_CATALOG = [
|
|
|
256
346
|
defaultBaseUrl: "https://open.bigmodel.cn/api/paas/v4",
|
|
257
347
|
credentialRequired: true,
|
|
258
348
|
credentialEnvVars: ["GLM_API_KEY", "ZHIPUAI_API_KEY"],
|
|
349
|
+
primaryCredentialEnvVar: "GLM_API_KEY",
|
|
259
350
|
},
|
|
260
351
|
{
|
|
261
352
|
providerId: "zai",
|
|
@@ -268,6 +359,7 @@ export const PROVIDER_CATALOG = [
|
|
|
268
359
|
defaultBaseUrl: "https://api.z.ai/api/paas/v4",
|
|
269
360
|
credentialRequired: true,
|
|
270
361
|
credentialEnvVars: ["ZAI_API_KEY"],
|
|
362
|
+
primaryCredentialEnvVar: "ZAI_API_KEY",
|
|
271
363
|
},
|
|
272
364
|
{
|
|
273
365
|
providerId: "minimax",
|
|
@@ -280,6 +372,7 @@ export const PROVIDER_CATALOG = [
|
|
|
280
372
|
defaultBaseUrl: "https://api.minimax.io",
|
|
281
373
|
credentialRequired: true,
|
|
282
374
|
credentialEnvVars: ["MINIMAX_API_KEY"],
|
|
375
|
+
primaryCredentialEnvVar: "MINIMAX_API_KEY",
|
|
283
376
|
},
|
|
284
377
|
];
|
|
285
378
|
const PROVIDER_LOOKUP = new Map();
|
|
@@ -326,6 +419,17 @@ export function getProviderConfig(config, providerId) {
|
|
|
326
419
|
config.providers[descriptor.canonicalProviderId] ??
|
|
327
420
|
descriptor.aliases.map((alias) => config.providers?.[alias]).find(Boolean);
|
|
328
421
|
}
|
|
422
|
+
/** Return true when model execution through this provider needs auth. */
|
|
423
|
+
export function providerExecutionCredentialRequired(descriptor) {
|
|
424
|
+
return descriptor.executionCredentialRequired ?? descriptor.credentialRequired;
|
|
425
|
+
}
|
|
426
|
+
/**
|
|
427
|
+
* Return the curated prompt-cache behavior for a provider, or `undefined`
|
|
428
|
+
* if the policy has not been curated yet.
|
|
429
|
+
*/
|
|
430
|
+
export function getProviderCacheBehavior(providerId) {
|
|
431
|
+
return getProviderDescriptor(providerId)?.cacheBehavior;
|
|
432
|
+
}
|
|
329
433
|
/**
|
|
330
434
|
* True when the provider is a local runtime.
|
|
331
435
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-catalog.js","sourceRoot":"","sources":["../src/provider-catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"provider-catalog.js","sourceRoot":"","sources":["../src/provider-catalog.ts"],"names":[],"mappings":"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"}
|
package/dist/proxy.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kosha-discovery — OpenAI-compatible model proxy.
|
|
3
|
+
*
|
|
4
|
+
* Adds POST /proxy/v1/chat/completions to the Hono server.
|
|
5
|
+
* The caller sets `model` to one of:
|
|
6
|
+
*
|
|
7
|
+
* "claude-opus-4-7" — any canonical model ID or alias
|
|
8
|
+
* "kosha:cheapest" — cheapest forwardable chat model
|
|
9
|
+
* "kosha:cheapest[tool_use]" — cheapest with that capability
|
|
10
|
+
* "kosha:cheapest[128k,vision]" — cheapest with min context + capability
|
|
11
|
+
* "kosha:cheapest[provider:groq]" — cheapest on a specific provider
|
|
12
|
+
*
|
|
13
|
+
* Filters inside brackets are comma-separated and combinable:
|
|
14
|
+
* <capability> any tag in the model card (tool_use, vision, code, …)
|
|
15
|
+
* <N>k minimum context window in tokens
|
|
16
|
+
* provider:<id> pin to a specific serving-layer provider
|
|
17
|
+
*
|
|
18
|
+
* Supported transports: openai, openai-compatible-http, ollama.
|
|
19
|
+
* Anthropic, Google, Cohere, Bedrock, Vertex speak different wire formats
|
|
20
|
+
* and are not yet proxied.
|
|
21
|
+
*
|
|
22
|
+
* Response headers added by the proxy:
|
|
23
|
+
* x-kosha-model — resolved model ID
|
|
24
|
+
* x-kosha-provider — resolved provider
|
|
25
|
+
* x-kosha-requested — original model string from the caller
|
|
26
|
+
* @module
|
|
27
|
+
*/
|
|
28
|
+
import type { Hono } from "hono";
|
|
29
|
+
import type { ModelRegistry } from "./registry.js";
|
|
30
|
+
export declare function registerProxyRoutes(app: Hono, registry: ModelRegistry): void;
|
|
31
|
+
//# sourceMappingURL=proxy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAEjC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AA8GnD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI,CAoG5E"}
|
package/dist/proxy.js
ADDED
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kosha-discovery — OpenAI-compatible model proxy.
|
|
3
|
+
*
|
|
4
|
+
* Adds POST /proxy/v1/chat/completions to the Hono server.
|
|
5
|
+
* The caller sets `model` to one of:
|
|
6
|
+
*
|
|
7
|
+
* "claude-opus-4-7" — any canonical model ID or alias
|
|
8
|
+
* "kosha:cheapest" — cheapest forwardable chat model
|
|
9
|
+
* "kosha:cheapest[tool_use]" — cheapest with that capability
|
|
10
|
+
* "kosha:cheapest[128k,vision]" — cheapest with min context + capability
|
|
11
|
+
* "kosha:cheapest[provider:groq]" — cheapest on a specific provider
|
|
12
|
+
*
|
|
13
|
+
* Filters inside brackets are comma-separated and combinable:
|
|
14
|
+
* <capability> any tag in the model card (tool_use, vision, code, …)
|
|
15
|
+
* <N>k minimum context window in tokens
|
|
16
|
+
* provider:<id> pin to a specific serving-layer provider
|
|
17
|
+
*
|
|
18
|
+
* Supported transports: openai, openai-compatible-http, ollama.
|
|
19
|
+
* Anthropic, Google, Cohere, Bedrock, Vertex speak different wire formats
|
|
20
|
+
* and are not yet proxied.
|
|
21
|
+
*
|
|
22
|
+
* Response headers added by the proxy:
|
|
23
|
+
* x-kosha-model — resolved model ID
|
|
24
|
+
* x-kosha-provider — resolved provider
|
|
25
|
+
* x-kosha-requested — original model string from the caller
|
|
26
|
+
* @module
|
|
27
|
+
*/
|
|
28
|
+
import { getProviderDescriptor, providerExecutionCredentialRequired } from "./provider-catalog.js";
|
|
29
|
+
import { fallbackRegistryCredential, getRegistryCredentialResolver } from "./registry-runtime.js";
|
|
30
|
+
// native-http providers that speak the OpenAI wire format natively.
|
|
31
|
+
// All openai-compatible-http providers are implicitly forwardable.
|
|
32
|
+
const NATIVE_OPENAI_WIRE = new Set(["openai", "ollama"]);
|
|
33
|
+
function parseKoshaHint(model) {
|
|
34
|
+
if (!model.startsWith("kosha:cheapest"))
|
|
35
|
+
return null;
|
|
36
|
+
const m = /\[([^\]]*)\]/.exec(model);
|
|
37
|
+
if (!m)
|
|
38
|
+
return {};
|
|
39
|
+
const hint = {};
|
|
40
|
+
for (const part of m[1].split(",").map((s) => s.trim()).filter(Boolean)) {
|
|
41
|
+
if (part.startsWith("provider:")) {
|
|
42
|
+
hint.provider = part.slice(9);
|
|
43
|
+
}
|
|
44
|
+
else if (/^\d+k$/i.test(part)) {
|
|
45
|
+
hint.minContext = Number.parseInt(part, 10) * 1_000;
|
|
46
|
+
}
|
|
47
|
+
else if (!hint.capability) {
|
|
48
|
+
hint.capability = part;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return hint;
|
|
52
|
+
}
|
|
53
|
+
// ---------------------------------------------------------------------------
|
|
54
|
+
// Model resolution
|
|
55
|
+
// ---------------------------------------------------------------------------
|
|
56
|
+
function isForwardable(model) {
|
|
57
|
+
const descriptor = getProviderDescriptor(model.provider);
|
|
58
|
+
if (!descriptor)
|
|
59
|
+
return false;
|
|
60
|
+
if (descriptor.transport === "openai-compatible-http")
|
|
61
|
+
return true;
|
|
62
|
+
if (descriptor.transport === "native-http")
|
|
63
|
+
return NATIVE_OPENAI_WIRE.has(model.provider);
|
|
64
|
+
return false; // cloud-sdk (bedrock, vertex) needs per-SDK translation
|
|
65
|
+
}
|
|
66
|
+
function isExecutableRoute(registry, model) {
|
|
67
|
+
if (!isForwardable(model))
|
|
68
|
+
return false;
|
|
69
|
+
const descriptor = getProviderDescriptor(model.provider);
|
|
70
|
+
if (!descriptor || !providerExecutionCredentialRequired(descriptor))
|
|
71
|
+
return true;
|
|
72
|
+
return registry.provider(model.provider)?.authenticated === true;
|
|
73
|
+
}
|
|
74
|
+
function resolveProxyModel(registry, requested) {
|
|
75
|
+
const hint = parseKoshaHint(requested);
|
|
76
|
+
if (hint !== null) {
|
|
77
|
+
const result = registry.cheapestModels({
|
|
78
|
+
mode: "chat",
|
|
79
|
+
capability: hint.capability,
|
|
80
|
+
provider: hint.provider,
|
|
81
|
+
limit: 20,
|
|
82
|
+
});
|
|
83
|
+
const candidates = hint.minContext
|
|
84
|
+
? result.matches.filter((m) => m.model.contextWindow >= hint.minContext)
|
|
85
|
+
: result.matches;
|
|
86
|
+
// Only pick a provider we can actually forward to.
|
|
87
|
+
return candidates.find((m) => isExecutableRoute(registry, m.model))?.model ??
|
|
88
|
+
candidates.find((m) => isForwardable(m.model))?.model ??
|
|
89
|
+
null;
|
|
90
|
+
}
|
|
91
|
+
// For a specific model ID or alias, prefer the canonical card but fall back
|
|
92
|
+
// to any forwardable route if the primary provider isn't proxiable (e.g.
|
|
93
|
+
// "claude-sonnet-4-6" resolves to Anthropic by default, but if the caller
|
|
94
|
+
// only has an OpenRouter key, we should route through OpenRouter instead).
|
|
95
|
+
const primary = registry.model(requested);
|
|
96
|
+
if (primary && isExecutableRoute(registry, primary))
|
|
97
|
+
return primary;
|
|
98
|
+
const routes = registry.modelRoutes(requested);
|
|
99
|
+
return routes.find((route) => isExecutableRoute(registry, route)) ??
|
|
100
|
+
(primary && isForwardable(primary) ? primary : undefined) ??
|
|
101
|
+
routes.find(isForwardable) ??
|
|
102
|
+
primary ??
|
|
103
|
+
null;
|
|
104
|
+
}
|
|
105
|
+
// ---------------------------------------------------------------------------
|
|
106
|
+
// URL builder
|
|
107
|
+
// ---------------------------------------------------------------------------
|
|
108
|
+
function buildUpstreamUrl(model, registry) {
|
|
109
|
+
const info = registry.provider(model.provider);
|
|
110
|
+
const descriptor = getProviderDescriptor(model.provider);
|
|
111
|
+
const base = (descriptor?.isLocal
|
|
112
|
+
? info?.baseUrl ?? descriptor.defaultBaseUrl
|
|
113
|
+
: descriptor?.defaultBaseUrl ?? info?.baseUrl ?? "").replace(/\/$/, "");
|
|
114
|
+
// Some native/local roots expose the OpenAI-compatible layer under /v1.
|
|
115
|
+
if ((model.provider === "openai" || model.provider === "ollama" || model.provider === "llama.cpp") && !base.endsWith("/v1")) {
|
|
116
|
+
return `${base}/v1/chat/completions`;
|
|
117
|
+
}
|
|
118
|
+
return `${base}/chat/completions`;
|
|
119
|
+
}
|
|
120
|
+
// ---------------------------------------------------------------------------
|
|
121
|
+
// Route registration
|
|
122
|
+
// ---------------------------------------------------------------------------
|
|
123
|
+
export function registerProxyRoutes(app, registry) {
|
|
124
|
+
// OpenAI-compatible model list — returns all models the proxy can forward.
|
|
125
|
+
// Required for SDK compatibility: OpenAI clients call this before chat requests.
|
|
126
|
+
app.get("/proxy/v1/models", (ctx) => {
|
|
127
|
+
const models = registry.models({ mode: "chat" }).filter(isForwardable);
|
|
128
|
+
return ctx.json({
|
|
129
|
+
object: "list",
|
|
130
|
+
data: models.map((m) => ({
|
|
131
|
+
id: m.id,
|
|
132
|
+
object: "model",
|
|
133
|
+
created: Math.floor((m.discoveredAt ?? Date.now()) / 1000),
|
|
134
|
+
owned_by: m.originProvider ?? m.provider,
|
|
135
|
+
})),
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
app.post("/proxy/v1/chat/completions", async (ctx) => {
|
|
139
|
+
// ── Parse request ──────────────────────────────────────────────
|
|
140
|
+
let body;
|
|
141
|
+
try {
|
|
142
|
+
body = (await ctx.req.json());
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
return ctx.json({ error: "request body must be valid JSON" }, 400);
|
|
146
|
+
}
|
|
147
|
+
const requested = typeof body.model === "string" ? body.model : undefined;
|
|
148
|
+
if (!requested) {
|
|
149
|
+
return ctx.json({ error: "missing required field: model" }, 400);
|
|
150
|
+
}
|
|
151
|
+
// ── Resolve model ──────────────────────────────────────────────
|
|
152
|
+
const model = resolveProxyModel(registry, requested);
|
|
153
|
+
if (!model) {
|
|
154
|
+
return ctx.json({ error: `no model found for '${requested}'` }, 404);
|
|
155
|
+
}
|
|
156
|
+
if (!isForwardable(model)) {
|
|
157
|
+
const descriptor = getProviderDescriptor(model.provider);
|
|
158
|
+
return ctx.json({
|
|
159
|
+
error: `provider '${model.provider}' uses '${descriptor?.transport ?? "unknown"}' transport — proxy not yet supported`,
|
|
160
|
+
resolvedModel: model.id,
|
|
161
|
+
resolvedProvider: model.provider,
|
|
162
|
+
}, 422);
|
|
163
|
+
}
|
|
164
|
+
// ── Resolve credential ─────────────────────────────────────────
|
|
165
|
+
// Use the full 5-tier CredentialResolver (CLI files, ADC, OAuth, env vars)
|
|
166
|
+
// so the proxy honours the same credential sources as discovery.
|
|
167
|
+
const resolver = await getRegistryCredentialResolver();
|
|
168
|
+
const credential = resolver
|
|
169
|
+
? await resolver.resolve(model.provider)
|
|
170
|
+
: fallbackRegistryCredential(model.provider);
|
|
171
|
+
const bearerToken = credential.apiKey ?? credential.accessToken;
|
|
172
|
+
const credentialDescriptor = getProviderDescriptor(model.provider);
|
|
173
|
+
if (credentialDescriptor && providerExecutionCredentialRequired(credentialDescriptor) && !bearerToken) {
|
|
174
|
+
const envHint = credentialDescriptor.credentialEnvVars.length
|
|
175
|
+
? credentialDescriptor.credentialEnvVars.join(" or ")
|
|
176
|
+
: credentialDescriptor.primaryCredentialEnvVar;
|
|
177
|
+
return ctx.json({
|
|
178
|
+
error: `no credential found for '${model.provider}'`,
|
|
179
|
+
hint: envHint ? `set ${envHint}` : "configure credentials for this provider",
|
|
180
|
+
resolvedModel: model.id,
|
|
181
|
+
resolvedProvider: model.provider,
|
|
182
|
+
}, 401);
|
|
183
|
+
}
|
|
184
|
+
// ── Forward ────────────────────────────────────────────────────
|
|
185
|
+
const upstreamUrl = buildUpstreamUrl(model, registry);
|
|
186
|
+
const upstreamHeaders = { "content-type": "application/json" };
|
|
187
|
+
if (bearerToken)
|
|
188
|
+
upstreamHeaders.authorization = `Bearer ${bearerToken}`;
|
|
189
|
+
let upstream;
|
|
190
|
+
try {
|
|
191
|
+
upstream = await fetch(upstreamUrl, {
|
|
192
|
+
method: "POST",
|
|
193
|
+
headers: upstreamHeaders,
|
|
194
|
+
body: JSON.stringify({ ...body, model: model.id }),
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
catch (err) {
|
|
198
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
199
|
+
return ctx.json({ error: `upstream unreachable: ${message}`, resolvedProvider: model.provider }, 502);
|
|
200
|
+
}
|
|
201
|
+
// ── Stream response back ───────────────────────────────────────
|
|
202
|
+
const responseHeaders = new Headers({
|
|
203
|
+
"x-kosha-model": model.id,
|
|
204
|
+
"x-kosha-provider": model.provider,
|
|
205
|
+
"x-kosha-requested": requested,
|
|
206
|
+
});
|
|
207
|
+
const ct = upstream.headers.get("content-type");
|
|
208
|
+
if (ct)
|
|
209
|
+
responseHeaders.set("content-type", ct);
|
|
210
|
+
return new Response(upstream.body, { status: upstream.status, headers: responseHeaders });
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=proxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry-discovery.d.ts","sourceRoot":"","sources":["../src/registry-discovery.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,OAAO,KAAK,EACX,gBAAgB,EAChB,qBAAqB,EACrB,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"registry-discovery.d.ts","sourceRoot":"","sources":["../src/registry-discovery.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,OAAO,KAAK,EACX,gBAAgB,EAChB,qBAAqB,EACrB,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,MAAM,yBAAyB,CAAC;AASjC,OAAO,KAAK,EAAE,SAAS,EAA4B,MAAM,YAAY,CAAC;AACtE,OAAO,KAAK,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAE9E;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,aAAa,GAAG,mBAAmB,GAAG,IAAI,CAIzF;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,aAAa,GAAG,mBAAmB,CAInF;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACrC,KAAK,EAAE,aAAa,EACpB,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACvC,gBAAgB,CAiDlB;AAED;;GAEG;AACH,wBAAuB,sBAAsB,CAC5C,KAAK,EAAE,aAAa,EACpB,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACvC,cAAc,CAAC,gBAAgB,EAAE,IAAI,EAAE,IAAI,CAAC,CA6B9C;AAED;;GAEG;AACH,wBAAgB,+BAA+B,CAC9C,KAAK,EAAE,aAAa,EACpB,gBAAgB,EAAE,mBAAmB,GAAG,IAAI,GAC1C,IAAI,CAoBN;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAE/D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,mBAAmB,CAuB/F;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,GAAG,mBAAmB,CAsBvG;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,GAAG,gBAAgB,CA2C/F;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,GAAG,qBAAqB,CAmCzG;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACxC,KAAK,EAAE,aAAa,EACpB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAA;CAAE,GAC3E,IAAI,CAkBN;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,mBAAmB,CAAC,eAAe,CAAC,CAehG"}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* @module
|
|
7
7
|
*/
|
|
8
8
|
import { DISCOVERY_SCHEMA_VERSION, discoveryRoles, makeModelKey, rawCapabilitiesForModel, trustedCapabilitiesForModel, } from "./discovery-contract.js";
|
|
9
|
-
import { getProviderConfig, listProviderDescriptors, normalizeProviderId } from "./provider-catalog.js";
|
|
9
|
+
import { getProviderConfig, listProviderDescriptors, normalizeProviderId, providerExecutionCredentialRequired, } from "./provider-catalog.js";
|
|
10
10
|
import { diffSnapshots, fullSnapshotChanges } from "./registry-delta.js";
|
|
11
11
|
import { registryModels, registryProviderDescriptor } from "./registry-query.js";
|
|
12
12
|
/**
|
|
@@ -179,7 +179,7 @@ export function registrySerializeProvider(state, providerId) {
|
|
|
179
179
|
authenticated: provider?.authenticated ?? false,
|
|
180
180
|
credentialSource: provider?.credentialSource ?? null,
|
|
181
181
|
credentialsPresent: provider?.authenticated ?? false,
|
|
182
|
-
credentialsRequired: descriptor
|
|
182
|
+
credentialsRequired: providerExecutionCredentialRequired(descriptor),
|
|
183
183
|
credentialEnvVars: [...descriptor.credentialEnvVars],
|
|
184
184
|
modelCount: provider?.models.length ?? 0,
|
|
185
185
|
lastRefreshed: provider?.lastRefreshed ?? null,
|
|
@@ -308,7 +308,7 @@ export function registryClassifyError(errorMessage) {
|
|
|
308
308
|
if (lower.includes("timed out") || lower.includes("timeout") || lower.includes("abort")) {
|
|
309
309
|
return "timeout";
|
|
310
310
|
}
|
|
311
|
-
if (lower.includes("network") || lower.includes("econn") || lower.includes("fetch failed") || lower
|
|
311
|
+
if (lower.includes("network") || lower.includes("econn") || lower.includes("fetch failed") || /\b5\d{2}\b/.test(lower)) {
|
|
312
312
|
return "transport";
|
|
313
313
|
}
|
|
314
314
|
return "unknown";
|
|
@@ -317,7 +317,7 @@ function catalogCredentialPrompts(state) {
|
|
|
317
317
|
const prompts = [];
|
|
318
318
|
for (const descriptor of listProviderDescriptors()) {
|
|
319
319
|
const provider = state.providerMap.get(descriptor.providerId);
|
|
320
|
-
if (!descriptor
|
|
320
|
+
if (!providerExecutionCredentialRequired(descriptor) || provider?.authenticated) {
|
|
321
321
|
continue;
|
|
322
322
|
}
|
|
323
323
|
const envHint = descriptor.credentialEnvVars.length > 0
|
|
@@ -328,7 +328,7 @@ function catalogCredentialPrompts(state) {
|
|
|
328
328
|
providerName: descriptor.name,
|
|
329
329
|
required: true,
|
|
330
330
|
envVars: descriptor.credentialEnvVars,
|
|
331
|
-
message: `${envHint} to enable ${descriptor.name} model discovery.`,
|
|
331
|
+
message: `${envHint} to enable ${descriptor.name} ${descriptor.credentialRequired ? "model discovery and requests" : "model requests"}.`,
|
|
332
332
|
});
|
|
333
333
|
}
|
|
334
334
|
return prompts.sort((a, b) => a.providerId.localeCompare(b.providerId));
|