@sriinnu/kosha-discovery 0.6.1 → 1.1.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 +95 -263
- package/dist/cli-cmd-model.d.ts +48 -0
- package/dist/cli-cmd-model.d.ts.map +1 -0
- package/dist/cli-cmd-model.js +231 -0
- package/dist/cli-cmd-model.js.map +1 -0
- package/dist/cli-cmd-query.d.ts +40 -0
- package/dist/cli-cmd-query.d.ts.map +1 -0
- package/dist/cli-cmd-query.js +303 -0
- package/dist/cli-cmd-query.js.map +1 -0
- package/dist/cli-commands.d.ts +65 -75
- package/dist/cli-commands.d.ts.map +1 -1
- package/dist/cli-commands.js +93 -543
- package/dist/cli-commands.js.map +1 -1
- package/dist/cli-format.d.ts +32 -0
- package/dist/cli-format.d.ts.map +1 -1
- package/dist/cli-format.js +51 -0
- package/dist/cli-format.js.map +1 -1
- package/dist/cli-help.d.ts +19 -0
- package/dist/cli-help.d.ts.map +1 -0
- package/dist/cli-help.js +150 -0
- package/dist/cli-help.js.map +1 -0
- package/dist/cli.js +4 -1
- package/dist/cli.js.map +1 -1
- package/dist/discovery/anthropic.d.ts +8 -1
- package/dist/discovery/anthropic.d.ts.map +1 -1
- package/dist/discovery/anthropic.js +26 -3
- package/dist/discovery/anthropic.js.map +1 -1
- package/dist/discovery/base.d.ts +26 -0
- package/dist/discovery/base.d.ts.map +1 -1
- package/dist/discovery/base.js +55 -2
- package/dist/discovery/base.js.map +1 -1
- package/dist/discovery/free-tier.d.ts +31 -0
- package/dist/discovery/free-tier.d.ts.map +1 -0
- package/dist/discovery/free-tier.js +47 -0
- package/dist/discovery/free-tier.js.map +1 -0
- package/dist/discovery/google.d.ts +8 -1
- package/dist/discovery/google.d.ts.map +1 -1
- package/dist/discovery/google.js +25 -3
- package/dist/discovery/google.js.map +1 -1
- package/dist/discovery/index.d.ts +3 -6
- package/dist/discovery/index.d.ts.map +1 -1
- package/dist/discovery/index.js +36 -55
- package/dist/discovery/index.js.map +1 -1
- package/dist/discovery/litellm-seed.d.ts +32 -0
- package/dist/discovery/litellm-seed.d.ts.map +1 -0
- package/dist/discovery/litellm-seed.js +252 -0
- package/dist/discovery/litellm-seed.js.map +1 -0
- package/dist/discovery/modelsdev-catalog.d.ts +95 -0
- package/dist/discovery/modelsdev-catalog.d.ts.map +1 -0
- package/dist/discovery/modelsdev-catalog.js +131 -0
- package/dist/discovery/modelsdev-catalog.js.map +1 -0
- package/dist/discovery/modelsdev-seed.d.ts +19 -0
- package/dist/discovery/modelsdev-seed.d.ts.map +1 -0
- package/dist/discovery/modelsdev-seed.js +203 -0
- package/dist/discovery/modelsdev-seed.js.map +1 -0
- package/dist/discovery/openai-compatible.d.ts.map +1 -1
- package/dist/discovery/openai-compatible.js +12 -1
- package/dist/discovery/openai-compatible.js.map +1 -1
- package/dist/discovery/openai.d.ts +9 -1
- package/dist/discovery/openai.d.ts.map +1 -1
- package/dist/discovery/openai.js +31 -8
- package/dist/discovery/openai.js.map +1 -1
- package/dist/discovery/promo-overrides.d.ts +54 -0
- package/dist/discovery/promo-overrides.d.ts.map +1 -0
- package/dist/discovery/promo-overrides.js +74 -0
- package/dist/discovery/promo-overrides.js.map +1 -0
- package/dist/discovery/public-seed.d.ts +30 -0
- package/dist/discovery/public-seed.d.ts.map +1 -0
- package/dist/discovery/public-seed.js +51 -0
- package/dist/discovery/public-seed.js.map +1 -0
- package/dist/discovery-contract.d.ts +14 -2
- package/dist/discovery-contract.d.ts.map +1 -1
- package/dist/discovery-contract.js +28 -0
- package/dist/discovery-contract.js.map +1 -1
- package/dist/enrichment/litellm-catalog.d.ts +81 -0
- package/dist/enrichment/litellm-catalog.d.ts.map +1 -0
- package/dist/enrichment/litellm-catalog.js +129 -0
- package/dist/enrichment/litellm-catalog.js.map +1 -0
- package/dist/enrichment/litellm.d.ts +9 -2
- package/dist/enrichment/litellm.d.ts.map +1 -1
- package/dist/enrichment/litellm.js +168 -20
- package/dist/enrichment/litellm.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.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 +293 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/model-features.d.ts +77 -0
- package/dist/model-features.d.ts.map +1 -0
- package/dist/model-features.js +245 -0
- package/dist/model-features.js.map +1 -0
- package/dist/provider-catalog.d.ts +9 -0
- package/dist/provider-catalog.d.ts.map +1 -1
- package/dist/provider-catalog.js +22 -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 +193 -0
- package/dist/proxy.js.map +1 -0
- package/dist/registry-discovery.d.ts.map +1 -1
- package/dist/registry-discovery.js +12 -2
- package/dist/registry-discovery.js.map +1 -1
- package/dist/registry-runtime.d.ts +40 -1
- package/dist/registry-runtime.d.ts.map +1 -1
- package/dist/registry-runtime.js +502 -30
- package/dist/registry-runtime.js.map +1 -1
- package/dist/registry-selection.js +2 -0
- package/dist/registry-selection.js.map +1 -1
- package/dist/registry.d.ts +9 -0
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +11 -1
- package/dist/registry.js.map +1 -1
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +6 -0
- package/dist/server.js.map +1 -1
- package/dist/tokenizer-family.d.ts +39 -0
- package/dist/tokenizer-family.d.ts.map +1 -0
- package/dist/tokenizer-family.js +92 -0
- package/dist/tokenizer-family.js.map +1 -0
- package/dist/types.d.ts +186 -0
- package/dist/types.d.ts.map +1 -1
- package/logo.png +0 -0
- package/package.json +15 -3
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kosha-discovery — models.dev public-catalog seed.
|
|
3
|
+
*
|
|
4
|
+
* Translates the keyless models.dev catalog into normalized {@link ModelCard}
|
|
5
|
+
* arrays per kosha provider. Same defensive posture as the LiteLLM seed:
|
|
6
|
+
* strict ID charset, length cap, model-count cap, no spreading of arbitrary
|
|
7
|
+
* fields into ModelCard.
|
|
8
|
+
*
|
|
9
|
+
* models.dev publishes pricing already in per-million-tokens, so the
|
|
10
|
+
* conversion done by the LiteLLM seed is unnecessary here.
|
|
11
|
+
* @module
|
|
12
|
+
*/
|
|
13
|
+
import { applyFreeTierFlag } from "./free-tier.js";
|
|
14
|
+
import { loadModelsDevCatalog, } from "./modelsdev-catalog.js";
|
|
15
|
+
/** Maximum models seeded for a single provider. */
|
|
16
|
+
const MAX_MODELS_PER_SEED = 1_000;
|
|
17
|
+
/** Strict charset for model IDs. */
|
|
18
|
+
const SAFE_ID_PATTERN = /^[A-Za-z0-9._:/\-]+$/;
|
|
19
|
+
/** Maximum length we accept for a model ID. */
|
|
20
|
+
const MAX_ID_LENGTH = 256;
|
|
21
|
+
/**
|
|
22
|
+
* Map kosha provider IDs to models.dev provider slugs.
|
|
23
|
+
*
|
|
24
|
+
* Several models.dev slugs differ from kosha's canonical ones (`togetherai`,
|
|
25
|
+
* `fireworks-ai`, `moonshotai`, etc.); aliasing here avoids polluting each
|
|
26
|
+
* discoverer with the same translation logic.
|
|
27
|
+
*/
|
|
28
|
+
const PROVIDER_SLUG_ALIASES = {
|
|
29
|
+
anthropic: ["anthropic"],
|
|
30
|
+
openai: ["openai"],
|
|
31
|
+
google: ["google"],
|
|
32
|
+
deepseek: ["deepseek"],
|
|
33
|
+
zai: ["zai"],
|
|
34
|
+
minimax: ["minimax"],
|
|
35
|
+
moonshot: ["moonshotai", "moonshotai-cn"],
|
|
36
|
+
mistral: ["mistral"],
|
|
37
|
+
cohere: ["cohere"],
|
|
38
|
+
groq: ["groq"],
|
|
39
|
+
together: ["togetherai"],
|
|
40
|
+
fireworks: ["fireworks-ai"],
|
|
41
|
+
perplexity: ["perplexity"],
|
|
42
|
+
cerebras: ["cerebras"],
|
|
43
|
+
deepinfra: ["deepinfra"],
|
|
44
|
+
xai: ["xai"],
|
|
45
|
+
nvidia: ["nvidia"],
|
|
46
|
+
vertex: ["google-vertex", "google-vertex-anthropic"],
|
|
47
|
+
bedrock: ["amazon-bedrock"],
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Build seed {@link ModelCard}s for the given kosha provider, sourced from
|
|
51
|
+
* models.dev. Returns `[]` if the provider has no entries.
|
|
52
|
+
*/
|
|
53
|
+
export async function getModelsDevSeed(providerId) {
|
|
54
|
+
const slugs = PROVIDER_SLUG_ALIASES[providerId];
|
|
55
|
+
if (!slugs || slugs.length === 0)
|
|
56
|
+
return [];
|
|
57
|
+
const catalog = await loadModelsDevCatalog();
|
|
58
|
+
const seeds = [];
|
|
59
|
+
const seenIds = new Set();
|
|
60
|
+
for (const slug of slugs) {
|
|
61
|
+
const provider = catalog[slug];
|
|
62
|
+
if (!provider || typeof provider !== "object")
|
|
63
|
+
continue;
|
|
64
|
+
const models = provider.models;
|
|
65
|
+
if (!models || typeof models !== "object")
|
|
66
|
+
continue;
|
|
67
|
+
for (const [rawId, entry] of Object.entries(models)) {
|
|
68
|
+
if (seeds.length >= MAX_MODELS_PER_SEED)
|
|
69
|
+
break;
|
|
70
|
+
if (!entry || typeof entry !== "object")
|
|
71
|
+
continue;
|
|
72
|
+
const id = sanitiseId(rawId);
|
|
73
|
+
if (!id || seenIds.has(id))
|
|
74
|
+
continue;
|
|
75
|
+
seenIds.add(id);
|
|
76
|
+
const card = buildSeedCard(id, providerId, entry);
|
|
77
|
+
if (card)
|
|
78
|
+
seeds.push(card);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return seeds;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Validate and clean an incoming model ID. Returns null if the ID violates
|
|
85
|
+
* length or charset rules so a hostile catalog cannot smuggle injection
|
|
86
|
+
* shapes through.
|
|
87
|
+
*/
|
|
88
|
+
function sanitiseId(rawId) {
|
|
89
|
+
if (typeof rawId !== "string" || rawId.length === 0 || rawId.length > MAX_ID_LENGTH) {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
// Drop deployment suffix (e.g. `claude-opus-4-7@default`).
|
|
93
|
+
const at = rawId.indexOf("@");
|
|
94
|
+
const id = at > 0 ? rawId.slice(0, at) : rawId;
|
|
95
|
+
if (!SAFE_ID_PATTERN.test(id))
|
|
96
|
+
return null;
|
|
97
|
+
return id;
|
|
98
|
+
}
|
|
99
|
+
/** Convert a single models.dev entry into a ModelCard. */
|
|
100
|
+
function buildSeedCard(id, providerId, entry) {
|
|
101
|
+
const mode = inferMode(entry);
|
|
102
|
+
const capabilities = inferCapabilities(entry, mode);
|
|
103
|
+
const pricing = extractPricing(entry);
|
|
104
|
+
const contextWindow = pickPositive(entry.limit?.context) ?? 0;
|
|
105
|
+
const maxOutputTokens = pickPositive(entry.limit?.output) ?? 0;
|
|
106
|
+
const maxInputTokens = pickPositive(entry.limit?.input);
|
|
107
|
+
const card = {
|
|
108
|
+
id,
|
|
109
|
+
name: typeof entry.name === "string" && entry.name.length > 0 ? entry.name : id,
|
|
110
|
+
provider: providerId,
|
|
111
|
+
originProvider: providerId,
|
|
112
|
+
mode,
|
|
113
|
+
capabilities,
|
|
114
|
+
rawCapabilities: [...capabilities],
|
|
115
|
+
contextWindow,
|
|
116
|
+
maxOutputTokens,
|
|
117
|
+
maxInputTokens,
|
|
118
|
+
pricing,
|
|
119
|
+
aliases: [],
|
|
120
|
+
discoveredAt: Date.now(),
|
|
121
|
+
// Tagged as litellm in the ModelCard.source union for downstream
|
|
122
|
+
// stability — kosha consumers only need to know "came from a public
|
|
123
|
+
// community catalog" vs "came from a live API".
|
|
124
|
+
source: "litellm",
|
|
125
|
+
};
|
|
126
|
+
return applyFreeTierFlag(card);
|
|
127
|
+
}
|
|
128
|
+
function pickPositive(value) {
|
|
129
|
+
return typeof value === "number" && Number.isFinite(value) && value > 0 ? value : undefined;
|
|
130
|
+
}
|
|
131
|
+
/** Map models.dev modality flags to a kosha ModelMode. */
|
|
132
|
+
function inferMode(entry) {
|
|
133
|
+
const inputs = entry.modalities?.input ?? [];
|
|
134
|
+
const outputs = entry.modalities?.output ?? [];
|
|
135
|
+
if (outputs.includes("audio") && !outputs.includes("text"))
|
|
136
|
+
return "audio";
|
|
137
|
+
if (outputs.includes("image") && !outputs.includes("text"))
|
|
138
|
+
return "image";
|
|
139
|
+
if (outputs.includes("embedding") || (Array.isArray(outputs) && outputs.length === 0 && inputs.includes("text"))) {
|
|
140
|
+
// Heuristic: if there is no text *output* declared but text input,
|
|
141
|
+
// treat as embedding (rare in models.dev). Default below covers chat.
|
|
142
|
+
return "embedding";
|
|
143
|
+
}
|
|
144
|
+
if (entry.id.toLowerCase().includes("embed"))
|
|
145
|
+
return "embedding";
|
|
146
|
+
return "chat";
|
|
147
|
+
}
|
|
148
|
+
/** Build kosha capability flags from models.dev structured booleans. */
|
|
149
|
+
function inferCapabilities(entry, mode) {
|
|
150
|
+
if (mode === "embedding")
|
|
151
|
+
return ["embedding"];
|
|
152
|
+
if (mode === "image")
|
|
153
|
+
return ["image_generation"];
|
|
154
|
+
if (mode === "audio")
|
|
155
|
+
return ["audio"];
|
|
156
|
+
const caps = new Set(["chat"]);
|
|
157
|
+
const inputs = entry.modalities?.input ?? [];
|
|
158
|
+
if (inputs.includes("image") || inputs.includes("pdf") || entry.attachment)
|
|
159
|
+
caps.add("vision");
|
|
160
|
+
if (entry.tool_call)
|
|
161
|
+
caps.add("function_calling");
|
|
162
|
+
if (entry.reasoning)
|
|
163
|
+
caps.add("reasoning");
|
|
164
|
+
if (entry.structured_output)
|
|
165
|
+
caps.add("structured_output");
|
|
166
|
+
if (entry.cost?.cache_read !== undefined || entry.cost?.cache_write !== undefined) {
|
|
167
|
+
caps.add("prompt_caching");
|
|
168
|
+
}
|
|
169
|
+
caps.add("code");
|
|
170
|
+
caps.add("nlu");
|
|
171
|
+
return Array.from(caps);
|
|
172
|
+
}
|
|
173
|
+
/** Translate models.dev cost block into kosha ModelPricing. */
|
|
174
|
+
function extractPricing(entry) {
|
|
175
|
+
const cost = entry.cost;
|
|
176
|
+
if (!cost)
|
|
177
|
+
return undefined;
|
|
178
|
+
const hasSignal = isFinite(cost.input) ||
|
|
179
|
+
isFinite(cost.output) ||
|
|
180
|
+
isFinite(cost.cache_read) ||
|
|
181
|
+
isFinite(cost.cache_write) ||
|
|
182
|
+
isFinite(cost.batch?.input) ||
|
|
183
|
+
isFinite(cost.batch?.output);
|
|
184
|
+
if (!hasSignal)
|
|
185
|
+
return undefined;
|
|
186
|
+
const pricing = {
|
|
187
|
+
inputPerMillion: cost.input ?? 0,
|
|
188
|
+
outputPerMillion: cost.output ?? 0,
|
|
189
|
+
};
|
|
190
|
+
if (isFinite(cost.cache_read))
|
|
191
|
+
pricing.cacheReadPerMillion = cost.cache_read;
|
|
192
|
+
if (isFinite(cost.cache_write))
|
|
193
|
+
pricing.cacheWritePerMillion = cost.cache_write;
|
|
194
|
+
if (isFinite(cost.batch?.input))
|
|
195
|
+
pricing.batchInputPerMillion = cost.batch.input;
|
|
196
|
+
if (isFinite(cost.batch?.output))
|
|
197
|
+
pricing.batchOutputPerMillion = cost.batch.output;
|
|
198
|
+
return pricing;
|
|
199
|
+
}
|
|
200
|
+
function isFinite(value) {
|
|
201
|
+
return typeof value === "number" && Number.isFinite(value);
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=modelsdev-seed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modelsdev-seed.js","sourceRoot":"","sources":["../../src/discovery/modelsdev-seed.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-compatible.d.ts","sourceRoot":"","sources":["../../src/discovery/openai-compatible.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"openai-compatible.d.ts","sourceRoot":"","sources":["../../src/discovery/openai-compatible.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAG3C,gFAAgF;AAChF,MAAM,WAAW,qBAAqB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wDAAwD;IACxD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,uDAAuD;IACvD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,6DAA6D;IAC7D,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,qDAAqD;AACrD,MAAM,WAAW,4BAA4B;IAC5C,IAAI,EAAE,qBAAqB,EAAE,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;CACf;AAED,+DAA+D;AAC/D,MAAM,WAAW,mBAAmB;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,SAAS,CAAC;IAChB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,8BAAsB,0BAA2B,SAAQ,cAAc;IACtE;;;;;OAKG;IACG,QAAQ,CAAC,UAAU,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IA2ClG;;;;;OAKG;IACH,SAAS,CAAC,kBAAkB,IAAI,MAAM,EAAE;IAIxC;;;;;OAKG;IACH,SAAS,CAAC,eAAe,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO;IAIjE;;;;;OAKG;IACH,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,EAAE,qBAAqB,GAAG,mBAAmB;IAMnF;;;OAGG;IACH,SAAS,CAAC,mBAAmB,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM;IASrG;;;;;;OAMG;IACH,SAAS,CAAC,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IAOrG,mEAAmE;IACnE,SAAS,CAAC,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAIpD,+DAA+D;IAC/D,SAAS,CAAC,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAMjD,6DAA6D;IAC7D,SAAS,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAK/C,sEAAsE;IACtE,SAAS,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAIhD,qEAAqE;IACrE,SAAS,CAAC,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAQjD,+DAA+D;IAC/D,OAAO,CAAC,MAAM;CAed"}
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
* @module
|
|
14
14
|
*/
|
|
15
15
|
import { BaseDiscoverer } from "./base.js";
|
|
16
|
+
import { getPublicSeed } from "./public-seed.js";
|
|
16
17
|
/**
|
|
17
18
|
* Base class for providers that expose an OpenAI-compatible `/v1/models` endpoint.
|
|
18
19
|
*
|
|
@@ -43,7 +44,17 @@ export class OpenAICompatibleDiscoverer extends BaseDiscoverer {
|
|
|
43
44
|
async discover(credential, options) {
|
|
44
45
|
const apiKey = credential.apiKey ?? credential.accessToken;
|
|
45
46
|
if (!apiKey) {
|
|
46
|
-
|
|
47
|
+
// Discovery is a public-data question — fall back to the public
|
|
48
|
+
// seed catalogs (models.dev primary, with LiteLLM as filler) so
|
|
49
|
+
// kosha returns the latest models even without a provider key.
|
|
50
|
+
// Empty seed simply means the catalogs have no entries for this
|
|
51
|
+
// provider yet (e.g. nvidia, glm, qwen).
|
|
52
|
+
try {
|
|
53
|
+
return await getPublicSeed(this.providerId);
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return [];
|
|
57
|
+
}
|
|
47
58
|
}
|
|
48
59
|
const timeoutMs = this.validateTimeout(options?.timeout);
|
|
49
60
|
const headers = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-compatible.js","sourceRoot":"","sources":["../../src/discovery/openai-compatible.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"openai-compatible.js","sourceRoot":"","sources":["../../src/discovery/openai-compatible.ts"],"names":[],"mappings":"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"}
|
|
@@ -58,7 +58,15 @@ export declare class OpenAIDiscoverer extends BaseDiscoverer {
|
|
|
58
58
|
* - GPT-4o-mini lacks vision but retains function_calling.
|
|
59
59
|
*/
|
|
60
60
|
private inferCapabilities;
|
|
61
|
-
/**
|
|
61
|
+
/**
|
|
62
|
+
* No-key fallback: source the latest merged public seed for this provider
|
|
63
|
+
* via {@link getPublicSeed}. That seed may combine multiple public inputs
|
|
64
|
+
* (for example models.dev, LiteLLM, and promo overrides) using the
|
|
65
|
+
* priority rules defined in `getPublicSeed()`. Falls back to the curated
|
|
66
|
+
* static list if the public seed fetch fails or yields no models.
|
|
67
|
+
*/
|
|
68
|
+
private publicCatalogFallback;
|
|
69
|
+
/** Return curated fallback models when both API and public catalog are unavailable. */
|
|
62
70
|
private staticFallbackModels;
|
|
63
71
|
}
|
|
64
72
|
//# sourceMappingURL=openai.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/discovery/openai.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAa,MAAM,aAAa,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/discovery/openai.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAa,MAAM,aAAa,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAkB3C;;;;;;;GAOG;AACH,qBAAa,gBAAiB,SAAQ,cAAc;IACnD,QAAQ,CAAC,UAAU,YAAY;IAC/B,QAAQ,CAAC,YAAY,YAAY;IACjC,QAAQ,CAAC,OAAO,4BAA4B;IAE5C;;;;OAIG;IACG,QAAQ,CAAC,UAAU,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAsBlG;;;;;;;OAOG;IACH,OAAO,CAAC,eAAe;IAwBvB,8DAA8D;IAC9D,OAAO,CAAC,WAAW;IAUnB,6DAA6D;IAC7D,OAAO,CAAC,gBAAgB;IAIxB,6EAA6E;IAC7E,OAAO,CAAC,YAAY;IAIpB,yEAAyE;IACzE,OAAO,CAAC,YAAY;IAIpB,0EAA0E;IAC1E,OAAO,CAAC,WAAW;IAcnB,uDAAuD;IACvD,OAAO,CAAC,SAAS;IAOjB;;;;;;;;OAQG;IACH,OAAO,CAAC,iBAAiB;IA+CzB;;;;;;OAMG;YACW,qBAAqB;IAUnC,uFAAuF;IACvF,OAAO,CAAC,oBAAoB;CAe5B"}
|
package/dist/discovery/openai.js
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* @module
|
|
7
7
|
*/
|
|
8
8
|
import { BaseDiscoverer } from "./base.js";
|
|
9
|
+
import { getPublicSeed } from "./public-seed.js";
|
|
9
10
|
import { STATIC_OPENAI_MODELS } from "./static-direct.js";
|
|
10
11
|
/**
|
|
11
12
|
* Discovers models available through the OpenAI API.
|
|
@@ -27,16 +28,20 @@ export class OpenAIDiscoverer extends BaseDiscoverer {
|
|
|
27
28
|
async discover(credential, options) {
|
|
28
29
|
const apiKey = credential.apiKey ?? credential.accessToken;
|
|
29
30
|
if (!apiKey) {
|
|
30
|
-
return this.
|
|
31
|
+
return this.publicCatalogFallback();
|
|
31
32
|
}
|
|
32
33
|
const timeoutMs = this.validateTimeout(options?.timeout);
|
|
33
34
|
const headers = {
|
|
34
35
|
Authorization: `Bearer ${apiKey}`,
|
|
35
36
|
};
|
|
36
37
|
const response = await this.fetchJSON(`${this.baseUrl}/v1/models`, headers, timeoutMs);
|
|
37
|
-
|
|
38
|
+
const apiCards = response.data
|
|
38
39
|
.filter((model) => this.isRelevantModel(model.id))
|
|
39
40
|
.map((model) => this.toModelCard(model));
|
|
41
|
+
// Merge public catalog so models that exist via OpenAI but aren't in
|
|
42
|
+
// /v1/models (preview tiers, deprecated-but-still-priced SKUs) keep
|
|
43
|
+
// their pricing in the registry. API wins on `id` collision.
|
|
44
|
+
return this.mergeWithPublicSeed(apiCards);
|
|
40
45
|
}
|
|
41
46
|
/**
|
|
42
47
|
* Determine whether a model ID represents a model we want to track.
|
|
@@ -53,14 +58,14 @@ export class OpenAIDiscoverer extends BaseDiscoverer {
|
|
|
53
58
|
return false;
|
|
54
59
|
}
|
|
55
60
|
// Skip legacy completions-era models that predate the chat API
|
|
56
|
-
if (lower.startsWith("babbage") ||
|
|
61
|
+
if (lower.startsWith("babbage") ||
|
|
62
|
+
lower.startsWith("davinci") ||
|
|
63
|
+
lower.startsWith("curie") ||
|
|
64
|
+
lower.startsWith("ada")) {
|
|
57
65
|
return false;
|
|
58
66
|
}
|
|
59
67
|
// Keep chat, embedding, image, and audio models
|
|
60
|
-
return (this.isChatModel(lower) ||
|
|
61
|
-
this.isEmbeddingModel(lower) ||
|
|
62
|
-
this.isImageModel(lower) ||
|
|
63
|
-
this.isAudioModel(lower));
|
|
68
|
+
return (this.isChatModel(lower) || this.isEmbeddingModel(lower) || this.isImageModel(lower) || this.isAudioModel(lower));
|
|
64
69
|
}
|
|
65
70
|
/** Check if the model ID belongs to the chat model family. */
|
|
66
71
|
isChatModel(id) {
|
|
@@ -154,7 +159,25 @@ export class OpenAIDiscoverer extends BaseDiscoverer {
|
|
|
154
159
|
}
|
|
155
160
|
return ["chat"];
|
|
156
161
|
}
|
|
157
|
-
/**
|
|
162
|
+
/**
|
|
163
|
+
* No-key fallback: source the latest merged public seed for this provider
|
|
164
|
+
* via {@link getPublicSeed}. That seed may combine multiple public inputs
|
|
165
|
+
* (for example models.dev, LiteLLM, and promo overrides) using the
|
|
166
|
+
* priority rules defined in `getPublicSeed()`. Falls back to the curated
|
|
167
|
+
* static list if the public seed fetch fails or yields no models.
|
|
168
|
+
*/
|
|
169
|
+
async publicCatalogFallback() {
|
|
170
|
+
try {
|
|
171
|
+
const seeds = await getPublicSeed(this.providerId);
|
|
172
|
+
if (seeds.length > 0)
|
|
173
|
+
return seeds;
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
/* fall through to static fallback */
|
|
177
|
+
}
|
|
178
|
+
return this.staticFallbackModels();
|
|
179
|
+
}
|
|
180
|
+
/** Return curated fallback models when both API and public catalog are unavailable. */
|
|
158
181
|
staticFallbackModels() {
|
|
159
182
|
return STATIC_OPENAI_MODELS.map((model) => this.makeCard({
|
|
160
183
|
id: model.id,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/discovery/openai.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAgB1D;;;;;;;GAOG;AACH,MAAM,OAAO,gBAAiB,SAAQ,cAAc;IAC1C,UAAU,GAAG,QAAQ,CAAC;IACtB,YAAY,GAAG,QAAQ,CAAC;IACxB,OAAO,GAAG,wBAAwB,CAAC;IAE5C;;;;OAIG;IACH,KAAK,CAAC,QAAQ,CAAC,UAA4B,EAAE,OAA8B;QAC1E,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,IAAI,UAAU,CAAC,WAAW,CAAC;QAC3D,IAAI,CAAC,MAAM,EAAE,CAAC;YACb,OAAO,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/discovery/openai.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kosha-discovery — Public promotional pricing overrides.
|
|
3
|
+
*
|
|
4
|
+
* Hand-curated list of known active promotional discounts that the public
|
|
5
|
+
* catalogs (models.dev, LiteLLM) have not yet picked up. Each entry has a
|
|
6
|
+
* hard expiry date and is automatically ignored once `Date.now() > endsAt`,
|
|
7
|
+
* so this file does not need cleanup after a promo ends — stale entries
|
|
8
|
+
* become no-ops.
|
|
9
|
+
*
|
|
10
|
+
* This is a deliberate, narrow seam. The default discovery flow stays
|
|
11
|
+
* keyless-first via the public catalogs; overrides only step in when a
|
|
12
|
+
* provider has publicly announced a discount that the upstream catalogs
|
|
13
|
+
* are slower to reflect.
|
|
14
|
+
*
|
|
15
|
+
* Adding an entry:
|
|
16
|
+
* 1. Confirm the promo is publicly announced on the provider's site.
|
|
17
|
+
* 2. Find the canonical model id used in kosha (e.g. `deepseek-v4-pro`).
|
|
18
|
+
* 3. Add an entry below with the explicit end timestamp.
|
|
19
|
+
* 4. Cite the source URL in `reason` so a future reader can verify it.
|
|
20
|
+
*
|
|
21
|
+
* Removing or letting an entry expire requires no action — the override
|
|
22
|
+
* silently goes inert once the clock passes `endsAt`.
|
|
23
|
+
* @module
|
|
24
|
+
*/
|
|
25
|
+
import type { ModelCard, ModelPricing } from "../types.js";
|
|
26
|
+
/**
|
|
27
|
+
* A single promotional override. Matches by `(providerId, modelId)` and
|
|
28
|
+
* applies the given pricing when `Date.now() < endsAt.getTime()`.
|
|
29
|
+
*/
|
|
30
|
+
export interface PromoOverride {
|
|
31
|
+
/** kosha provider id (e.g. "deepseek"). */
|
|
32
|
+
providerId: string;
|
|
33
|
+
/** Exact model id as it appears in kosha (e.g. "deepseek-v4-pro"). */
|
|
34
|
+
modelId: string;
|
|
35
|
+
/** Replacement pricing applied while the promo is active. */
|
|
36
|
+
pricing: ModelPricing;
|
|
37
|
+
/** Hard expiry. The override has no effect once this passes. */
|
|
38
|
+
endsAt: Date;
|
|
39
|
+
/** Free-form note for humans — should cite the source URL. */
|
|
40
|
+
reason: string;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Built-in promo overrides. Keep small and well-cited.
|
|
44
|
+
*/
|
|
45
|
+
export declare const PROMO_OVERRIDES: readonly PromoOverride[];
|
|
46
|
+
/**
|
|
47
|
+
* Apply any active promo overrides to the given cards in place. Returns the
|
|
48
|
+
* same array (with patched cards) so callers can chain. Cards without a
|
|
49
|
+
* matching active override are unchanged.
|
|
50
|
+
*
|
|
51
|
+
* Idempotent — re-running on already-overridden cards yields the same result.
|
|
52
|
+
*/
|
|
53
|
+
export declare function applyPromoOverrides(cards: ModelCard[], now?: Date): ModelCard[];
|
|
54
|
+
//# sourceMappingURL=promo-overrides.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promo-overrides.d.ts","sourceRoot":"","sources":["../../src/discovery/promo-overrides.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3D;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC7B,2CAA2C;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,sEAAsE;IACtE,OAAO,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,OAAO,EAAE,YAAY,CAAC;IACtB,gEAAgE;IAChE,MAAM,EAAE,IAAI,CAAC;IACb,8DAA8D;IAC9D,MAAM,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,SAAS,aAAa,EAenD,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,GAAG,GAAE,IAAiB,GAAG,SAAS,EAAE,CAoB3F"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kosha-discovery — Public promotional pricing overrides.
|
|
3
|
+
*
|
|
4
|
+
* Hand-curated list of known active promotional discounts that the public
|
|
5
|
+
* catalogs (models.dev, LiteLLM) have not yet picked up. Each entry has a
|
|
6
|
+
* hard expiry date and is automatically ignored once `Date.now() > endsAt`,
|
|
7
|
+
* so this file does not need cleanup after a promo ends — stale entries
|
|
8
|
+
* become no-ops.
|
|
9
|
+
*
|
|
10
|
+
* This is a deliberate, narrow seam. The default discovery flow stays
|
|
11
|
+
* keyless-first via the public catalogs; overrides only step in when a
|
|
12
|
+
* provider has publicly announced a discount that the upstream catalogs
|
|
13
|
+
* are slower to reflect.
|
|
14
|
+
*
|
|
15
|
+
* Adding an entry:
|
|
16
|
+
* 1. Confirm the promo is publicly announced on the provider's site.
|
|
17
|
+
* 2. Find the canonical model id used in kosha (e.g. `deepseek-v4-pro`).
|
|
18
|
+
* 3. Add an entry below with the explicit end timestamp.
|
|
19
|
+
* 4. Cite the source URL in `reason` so a future reader can verify it.
|
|
20
|
+
*
|
|
21
|
+
* Removing or letting an entry expire requires no action — the override
|
|
22
|
+
* silently goes inert once the clock passes `endsAt`.
|
|
23
|
+
* @module
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* Built-in promo overrides. Keep small and well-cited.
|
|
27
|
+
*/
|
|
28
|
+
export const PROMO_OVERRIDES = [
|
|
29
|
+
{
|
|
30
|
+
providerId: "deepseek",
|
|
31
|
+
modelId: "deepseek-v4-pro",
|
|
32
|
+
// 75% off the standard $1.74/$3.48 input/output rates.
|
|
33
|
+
// Cache hit also discounted 75% from $0.0145/M to $0.003625/M.
|
|
34
|
+
pricing: {
|
|
35
|
+
inputPerMillion: 0.435,
|
|
36
|
+
outputPerMillion: 0.87,
|
|
37
|
+
cacheReadPerMillion: 0.003625,
|
|
38
|
+
},
|
|
39
|
+
endsAt: new Date("2026-05-31T15:59:00Z"),
|
|
40
|
+
reason: "DeepSeek 75% off promo on deepseek-v4-pro, extended to 2026-05-31 — https://api-docs.deepseek.com/quick_start/pricing/",
|
|
41
|
+
},
|
|
42
|
+
];
|
|
43
|
+
/**
|
|
44
|
+
* Apply any active promo overrides to the given cards in place. Returns the
|
|
45
|
+
* same array (with patched cards) so callers can chain. Cards without a
|
|
46
|
+
* matching active override are unchanged.
|
|
47
|
+
*
|
|
48
|
+
* Idempotent — re-running on already-overridden cards yields the same result.
|
|
49
|
+
*/
|
|
50
|
+
export function applyPromoOverrides(cards, now = new Date()) {
|
|
51
|
+
if (cards.length === 0)
|
|
52
|
+
return cards;
|
|
53
|
+
const active = PROMO_OVERRIDES.filter((promo) => promo.endsAt.getTime() > now.getTime());
|
|
54
|
+
if (active.length === 0)
|
|
55
|
+
return cards;
|
|
56
|
+
for (let i = 0; i < cards.length; i += 1) {
|
|
57
|
+
const card = cards[i];
|
|
58
|
+
const match = active.find((promo) => promo.providerId === card.provider && promo.modelId === card.id);
|
|
59
|
+
if (!match)
|
|
60
|
+
continue;
|
|
61
|
+
cards[i] = {
|
|
62
|
+
...card,
|
|
63
|
+
pricing: { ...card.pricing, ...match.pricing },
|
|
64
|
+
// Preserve a record of why this row diverges from the public catalog
|
|
65
|
+
// rate so consumers can trace the override.
|
|
66
|
+
rawCapabilities: dedupe([...(card.rawCapabilities ?? card.capabilities), "promo_override"]),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
return cards;
|
|
70
|
+
}
|
|
71
|
+
function dedupe(values) {
|
|
72
|
+
return Array.from(new Set(values));
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=promo-overrides.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promo-overrides.js","sourceRoot":"","sources":["../../src/discovery/promo-overrides.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAqBH;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAA6B;IACxD;QACC,UAAU,EAAE,UAAU;QACtB,OAAO,EAAE,iBAAiB;QAC1B,uDAAuD;QACvD,+DAA+D;QAC/D,OAAO,EAAE;YACR,eAAe,EAAE,KAAK;YACtB,gBAAgB,EAAE,IAAI;YACtB,mBAAmB,EAAE,QAAQ;SAC7B;QACD,MAAM,EAAE,IAAI,IAAI,CAAC,sBAAsB,CAAC;QACxC,MAAM,EACL,wHAAwH;KACzH;CACD,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAkB,EAAE,MAAY,IAAI,IAAI,EAAE;IAC7E,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACrC,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IACzF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CACxB,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI,CAAC,EAAE,CAC1E,CAAC;QACF,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,KAAK,CAAC,CAAC,CAAC,GAAG;YACV,GAAG,IAAI;YACP,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE;YAC9C,qEAAqE;YACrE,4CAA4C;YAC5C,eAAe,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,YAAY,CAAC,EAAE,gBAAgB,CAAC,CAAC;SAC3F,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED,SAAS,MAAM,CAAC,MAAgB;IAC/B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kosha-discovery — Merged public-catalog seed.
|
|
3
|
+
*
|
|
4
|
+
* Combines the models.dev and LiteLLM keyless catalogs into a single seed
|
|
5
|
+
* per kosha provider. Priorities:
|
|
6
|
+
*
|
|
7
|
+
* 1. **models.dev = primary.** Fresher, structured `release_date`/`last_updated`
|
|
8
|
+
* metadata, tiered pricing, structured modalities. Most up-to-date for the
|
|
9
|
+
* models we actively track.
|
|
10
|
+
* 2. **LiteLLM = filler.** Backfills providers and models that models.dev does
|
|
11
|
+
* not yet cover (e.g. moonshot-cn variants, niche bedrock entries).
|
|
12
|
+
*
|
|
13
|
+
* Merge rules per (providerId, modelId):
|
|
14
|
+
* - models.dev entry wins when it exists.
|
|
15
|
+
* - LiteLLM-only entries are added to the seed (filler behaviour).
|
|
16
|
+
* - When both exist, models.dev metadata is kept; LiteLLM is *not* used to
|
|
17
|
+
* overwrite individual fields. The post-discovery LiteLLM enricher still
|
|
18
|
+
* runs and can fill any genuinely missing fields downstream.
|
|
19
|
+
*
|
|
20
|
+
* Failures in either source are non-fatal: a network blip on one feed
|
|
21
|
+
* silently degrades to the other so kosha never fails closed.
|
|
22
|
+
* @module
|
|
23
|
+
*/
|
|
24
|
+
import type { ModelCard } from "../types.js";
|
|
25
|
+
/**
|
|
26
|
+
* Return a merged, deduplicated array of seed {@link ModelCard}s for the
|
|
27
|
+
* given kosha provider, sourced from both public catalogs.
|
|
28
|
+
*/
|
|
29
|
+
export declare function getPublicSeed(providerId: string): Promise<ModelCard[]>;
|
|
30
|
+
//# sourceMappingURL=public-seed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public-seed.d.ts","sourceRoot":"","sources":["../../src/discovery/public-seed.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAK7C;;;GAGG;AACH,wBAAsB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAoB5E"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kosha-discovery — Merged public-catalog seed.
|
|
3
|
+
*
|
|
4
|
+
* Combines the models.dev and LiteLLM keyless catalogs into a single seed
|
|
5
|
+
* per kosha provider. Priorities:
|
|
6
|
+
*
|
|
7
|
+
* 1. **models.dev = primary.** Fresher, structured `release_date`/`last_updated`
|
|
8
|
+
* metadata, tiered pricing, structured modalities. Most up-to-date for the
|
|
9
|
+
* models we actively track.
|
|
10
|
+
* 2. **LiteLLM = filler.** Backfills providers and models that models.dev does
|
|
11
|
+
* not yet cover (e.g. moonshot-cn variants, niche bedrock entries).
|
|
12
|
+
*
|
|
13
|
+
* Merge rules per (providerId, modelId):
|
|
14
|
+
* - models.dev entry wins when it exists.
|
|
15
|
+
* - LiteLLM-only entries are added to the seed (filler behaviour).
|
|
16
|
+
* - When both exist, models.dev metadata is kept; LiteLLM is *not* used to
|
|
17
|
+
* overwrite individual fields. The post-discovery LiteLLM enricher still
|
|
18
|
+
* runs and can fill any genuinely missing fields downstream.
|
|
19
|
+
*
|
|
20
|
+
* Failures in either source are non-fatal: a network blip on one feed
|
|
21
|
+
* silently degrades to the other so kosha never fails closed.
|
|
22
|
+
* @module
|
|
23
|
+
*/
|
|
24
|
+
import { getLiteLLMSeed } from "./litellm-seed.js";
|
|
25
|
+
import { getModelsDevSeed } from "./modelsdev-seed.js";
|
|
26
|
+
import { applyPromoOverrides } from "./promo-overrides.js";
|
|
27
|
+
/**
|
|
28
|
+
* Return a merged, deduplicated array of seed {@link ModelCard}s for the
|
|
29
|
+
* given kosha provider, sourced from both public catalogs.
|
|
30
|
+
*/
|
|
31
|
+
export async function getPublicSeed(providerId) {
|
|
32
|
+
const [modelsDev, litellm] = await Promise.all([
|
|
33
|
+
getModelsDevSeed(providerId).catch(() => []),
|
|
34
|
+
getLiteLLMSeed(providerId).catch(() => []),
|
|
35
|
+
]);
|
|
36
|
+
if (modelsDev.length === 0 && litellm.length === 0)
|
|
37
|
+
return [];
|
|
38
|
+
// Index models.dev by id so duplicate ids from LiteLLM are dropped.
|
|
39
|
+
const seen = new Set(modelsDev.map((card) => card.id));
|
|
40
|
+
const merged = [...modelsDev];
|
|
41
|
+
for (const card of litellm) {
|
|
42
|
+
if (seen.has(card.id))
|
|
43
|
+
continue;
|
|
44
|
+
seen.add(card.id);
|
|
45
|
+
merged.push(card);
|
|
46
|
+
}
|
|
47
|
+
// Final pass: apply any active promotional overrides for cases where the
|
|
48
|
+
// public catalogs haven't yet picked up a publicly-announced discount.
|
|
49
|
+
return applyPromoOverrides(merged);
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=public-seed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public-seed.js","sourceRoot":"","sources":["../../src/discovery/public-seed.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE3D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,UAAkB;IACrD,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC9C,gBAAgB,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAiB,CAAC;QAC3D,cAAc,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAiB,CAAC;KACzD,CAAC,CAAC;IAEH,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAE9D,oEAAoE;IACpE,MAAM,IAAI,GAAG,IAAI,GAAG,CAAS,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAgB,CAAC,GAAG,SAAS,CAAC,CAAC;IAC3C,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAAE,SAAS;QAChC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IAED,yEAAyE;IACzE,uEAAuE;IACvE,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC"}
|