@sriinnu/kosha-discovery 0.6.1 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/README.md +53 -268
  2. package/dist/cli-cmd-model.d.ts +48 -0
  3. package/dist/cli-cmd-model.d.ts.map +1 -0
  4. package/dist/cli-cmd-model.js +231 -0
  5. package/dist/cli-cmd-model.js.map +1 -0
  6. package/dist/cli-cmd-query.d.ts +40 -0
  7. package/dist/cli-cmd-query.d.ts.map +1 -0
  8. package/dist/cli-cmd-query.js +303 -0
  9. package/dist/cli-cmd-query.js.map +1 -0
  10. package/dist/cli-commands.d.ts +65 -75
  11. package/dist/cli-commands.d.ts.map +1 -1
  12. package/dist/cli-commands.js +93 -543
  13. package/dist/cli-commands.js.map +1 -1
  14. package/dist/cli-format.d.ts +32 -0
  15. package/dist/cli-format.d.ts.map +1 -1
  16. package/dist/cli-format.js +51 -0
  17. package/dist/cli-format.js.map +1 -1
  18. package/dist/cli-help.d.ts +19 -0
  19. package/dist/cli-help.d.ts.map +1 -0
  20. package/dist/cli-help.js +150 -0
  21. package/dist/cli-help.js.map +1 -0
  22. package/dist/cli.js +4 -1
  23. package/dist/cli.js.map +1 -1
  24. package/dist/discovery/anthropic.d.ts +8 -1
  25. package/dist/discovery/anthropic.d.ts.map +1 -1
  26. package/dist/discovery/anthropic.js +26 -3
  27. package/dist/discovery/anthropic.js.map +1 -1
  28. package/dist/discovery/base.d.ts +26 -0
  29. package/dist/discovery/base.d.ts.map +1 -1
  30. package/dist/discovery/base.js +55 -2
  31. package/dist/discovery/base.js.map +1 -1
  32. package/dist/discovery/free-tier.d.ts +31 -0
  33. package/dist/discovery/free-tier.d.ts.map +1 -0
  34. package/dist/discovery/free-tier.js +47 -0
  35. package/dist/discovery/free-tier.js.map +1 -0
  36. package/dist/discovery/google.d.ts +8 -1
  37. package/dist/discovery/google.d.ts.map +1 -1
  38. package/dist/discovery/google.js +25 -3
  39. package/dist/discovery/google.js.map +1 -1
  40. package/dist/discovery/litellm-seed.d.ts +32 -0
  41. package/dist/discovery/litellm-seed.d.ts.map +1 -0
  42. package/dist/discovery/litellm-seed.js +252 -0
  43. package/dist/discovery/litellm-seed.js.map +1 -0
  44. package/dist/discovery/modelsdev-catalog.d.ts +95 -0
  45. package/dist/discovery/modelsdev-catalog.d.ts.map +1 -0
  46. package/dist/discovery/modelsdev-catalog.js +131 -0
  47. package/dist/discovery/modelsdev-catalog.js.map +1 -0
  48. package/dist/discovery/modelsdev-seed.d.ts +19 -0
  49. package/dist/discovery/modelsdev-seed.d.ts.map +1 -0
  50. package/dist/discovery/modelsdev-seed.js +203 -0
  51. package/dist/discovery/modelsdev-seed.js.map +1 -0
  52. package/dist/discovery/openai-compatible.d.ts.map +1 -1
  53. package/dist/discovery/openai-compatible.js +12 -1
  54. package/dist/discovery/openai-compatible.js.map +1 -1
  55. package/dist/discovery/openai.d.ts +9 -1
  56. package/dist/discovery/openai.d.ts.map +1 -1
  57. package/dist/discovery/openai.js +31 -8
  58. package/dist/discovery/openai.js.map +1 -1
  59. package/dist/discovery/promo-overrides.d.ts +54 -0
  60. package/dist/discovery/promo-overrides.d.ts.map +1 -0
  61. package/dist/discovery/promo-overrides.js +74 -0
  62. package/dist/discovery/promo-overrides.js.map +1 -0
  63. package/dist/discovery/public-seed.d.ts +30 -0
  64. package/dist/discovery/public-seed.d.ts.map +1 -0
  65. package/dist/discovery/public-seed.js +51 -0
  66. package/dist/discovery/public-seed.js.map +1 -0
  67. package/dist/discovery-contract.d.ts +14 -2
  68. package/dist/discovery-contract.d.ts.map +1 -1
  69. package/dist/discovery-contract.js +28 -0
  70. package/dist/discovery-contract.js.map +1 -1
  71. package/dist/enrichment/litellm-catalog.d.ts +81 -0
  72. package/dist/enrichment/litellm-catalog.d.ts.map +1 -0
  73. package/dist/enrichment/litellm-catalog.js +129 -0
  74. package/dist/enrichment/litellm-catalog.js.map +1 -0
  75. package/dist/enrichment/litellm.d.ts +9 -2
  76. package/dist/enrichment/litellm.d.ts.map +1 -1
  77. package/dist/enrichment/litellm.js +168 -20
  78. package/dist/enrichment/litellm.js.map +1 -1
  79. package/dist/index.d.ts +3 -1
  80. package/dist/index.d.ts.map +1 -1
  81. package/dist/index.js +2 -0
  82. package/dist/index.js.map +1 -1
  83. package/dist/model-features.d.ts +77 -0
  84. package/dist/model-features.d.ts.map +1 -0
  85. package/dist/model-features.js +245 -0
  86. package/dist/model-features.js.map +1 -0
  87. package/dist/provider-catalog.d.ts +7 -0
  88. package/dist/provider-catalog.d.ts.map +1 -1
  89. package/dist/provider-catalog.js +4 -0
  90. package/dist/provider-catalog.js.map +1 -1
  91. package/dist/registry-discovery.d.ts.map +1 -1
  92. package/dist/registry-discovery.js +11 -1
  93. package/dist/registry-discovery.js.map +1 -1
  94. package/dist/registry-runtime.d.ts +20 -1
  95. package/dist/registry-runtime.d.ts.map +1 -1
  96. package/dist/registry-runtime.js +296 -8
  97. package/dist/registry-runtime.js.map +1 -1
  98. package/dist/registry-selection.js +2 -0
  99. package/dist/registry-selection.js.map +1 -1
  100. package/dist/registry.d.ts +9 -0
  101. package/dist/registry.d.ts.map +1 -1
  102. package/dist/registry.js +11 -1
  103. package/dist/registry.js.map +1 -1
  104. package/dist/tokenizer-family.d.ts +39 -0
  105. package/dist/tokenizer-family.d.ts.map +1 -0
  106. package/dist/tokenizer-family.js +92 -0
  107. package/dist/tokenizer-family.js.map +1 -0
  108. package/dist/types.d.ts +186 -0
  109. package/dist/types.d.ts.map +1 -1
  110. package/package.json +8 -2
@@ -0,0 +1,95 @@
1
+ /**
2
+ * kosha-discovery — Shared models.dev catalog loader.
3
+ *
4
+ * Pulls the keyless community catalog at https://models.dev/api.json,
5
+ * which is maintained by the SST team and tends to surface new models
6
+ * faster than LiteLLM. Same hardening contract as the LiteLLM loader:
7
+ * HTTPS-pinned URL, assertCleanPayload scan, bounded body read, entry-count
8
+ * cap, promise-deduped singleton.
9
+ *
10
+ * Schema (top level):
11
+ * {
12
+ * [providerSlug]: {
13
+ * id, name, env: string[], doc, npm, api,
14
+ * models: {
15
+ * [modelId]: {
16
+ * id, name, family,
17
+ * attachment, reasoning, tool_call, structured_output, temperature,
18
+ * knowledge, release_date, last_updated,
19
+ * modalities: { input: string[], output: string[] },
20
+ * open_weights,
21
+ * cost: { input, output, cache_read?, cache_write?, ... },
22
+ * limit: { context, output, input? }
23
+ * }
24
+ * }
25
+ * }
26
+ * }
27
+ * @module
28
+ */
29
+ /** Pinned upstream catalog URL — HTTPS only. */
30
+ export declare const MODELSDEV_CATALOG_URL = "https://models.dev/api.json";
31
+ /** Cost block for a single model entry. Fields are optional / forward-compatible. */
32
+ export interface ModelsDevCost {
33
+ input?: number;
34
+ output?: number;
35
+ cache_read?: number;
36
+ cache_write?: number;
37
+ /** Per-million tokens for >200K-context billing tier (OpenAI long-context tier). */
38
+ context_over_200k?: {
39
+ input?: number;
40
+ output?: number;
41
+ cache_read?: number;
42
+ };
43
+ /** Per-million tokens for batch API tier. */
44
+ batch?: {
45
+ input?: number;
46
+ output?: number;
47
+ };
48
+ }
49
+ /** Limit block — context window + output cap + optional input cap. */
50
+ export interface ModelsDevLimit {
51
+ context?: number;
52
+ output?: number;
53
+ input?: number;
54
+ }
55
+ /** Modalities block — structured input/output media kinds. */
56
+ export interface ModelsDevModalities {
57
+ input?: string[];
58
+ output?: string[];
59
+ }
60
+ /** A single model entry in models.dev. */
61
+ export interface ModelsDevModel {
62
+ id: string;
63
+ name?: string;
64
+ family?: string;
65
+ attachment?: boolean;
66
+ reasoning?: boolean;
67
+ tool_call?: boolean;
68
+ structured_output?: boolean;
69
+ temperature?: boolean;
70
+ knowledge?: string;
71
+ release_date?: string;
72
+ last_updated?: string;
73
+ modalities?: ModelsDevModalities;
74
+ open_weights?: boolean;
75
+ cost?: ModelsDevCost;
76
+ limit?: ModelsDevLimit;
77
+ }
78
+ /** A single provider entry in models.dev. */
79
+ export interface ModelsDevProvider {
80
+ id: string;
81
+ name?: string;
82
+ env?: string[];
83
+ api?: string;
84
+ doc?: string;
85
+ npm?: string;
86
+ models?: Record<string, ModelsDevModel>;
87
+ }
88
+ /**
89
+ * Fetch the models.dev catalog with full hardening. Concurrent callers
90
+ * share the same in-flight promise.
91
+ */
92
+ export declare function loadModelsDevCatalog(): Promise<Record<string, ModelsDevProvider>>;
93
+ /** Test-only helper to clear the cache between runs. */
94
+ export declare function resetModelsDevCatalogCache(): void;
95
+ //# sourceMappingURL=modelsdev-catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modelsdev-catalog.d.ts","sourceRoot":"","sources":["../../src/discovery/modelsdev-catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAIH,gDAAgD;AAChD,eAAO,MAAM,qBAAqB,gCAAgC,CAAC;AAWnE,qFAAqF;AACrF,MAAM,WAAW,aAAa;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oFAAoF;IACpF,iBAAiB,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7E,6CAA6C;IAC7C,KAAK,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5C;AAED,sEAAsE;AACtE,MAAM,WAAW,cAAc;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,8DAA8D;AAC9D,MAAM,WAAW,mBAAmB;IACnC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,0CAA0C;AAC1C,MAAM,WAAW,cAAc;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,mBAAmB,CAAC;IACjC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,KAAK,CAAC,EAAE,cAAc,CAAC;CACvB;AAED,6CAA6C;AAC7C,MAAM,WAAW,iBAAiB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CACxC;AAKD;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAQjF;AAED,wDAAwD;AACxD,wBAAgB,0BAA0B,IAAI,IAAI,CAEjD"}
@@ -0,0 +1,131 @@
1
+ /**
2
+ * kosha-discovery — Shared models.dev catalog loader.
3
+ *
4
+ * Pulls the keyless community catalog at https://models.dev/api.json,
5
+ * which is maintained by the SST team and tends to surface new models
6
+ * faster than LiteLLM. Same hardening contract as the LiteLLM loader:
7
+ * HTTPS-pinned URL, assertCleanPayload scan, bounded body read, entry-count
8
+ * cap, promise-deduped singleton.
9
+ *
10
+ * Schema (top level):
11
+ * {
12
+ * [providerSlug]: {
13
+ * id, name, env: string[], doc, npm, api,
14
+ * models: {
15
+ * [modelId]: {
16
+ * id, name, family,
17
+ * attachment, reasoning, tool_call, structured_output, temperature,
18
+ * knowledge, release_date, last_updated,
19
+ * modalities: { input: string[], output: string[] },
20
+ * open_weights,
21
+ * cost: { input, output, cache_read?, cache_write?, ... },
22
+ * limit: { context, output, input? }
23
+ * }
24
+ * }
25
+ * }
26
+ * }
27
+ * @module
28
+ */
29
+ import { assertCleanPayload } from "../security.js";
30
+ /** Pinned upstream catalog URL — HTTPS only. */
31
+ export const MODELSDEV_CATALOG_URL = "https://models.dev/api.json";
32
+ /** Maximum response payload size (8 MB) — current catalog is ~600 KB. */
33
+ const MAX_PAYLOAD_BYTES = 8 * 1024 * 1024;
34
+ /** Maximum top-level provider entry count we accept. */
35
+ const MAX_PROVIDER_ENTRIES = 1_000;
36
+ /** Network timeout for the catalog fetch. */
37
+ const FETCH_TIMEOUT_MS = 15_000;
38
+ /** Module-level promise-dedup cache. */
39
+ let inflight = null;
40
+ /**
41
+ * Fetch the models.dev catalog with full hardening. Concurrent callers
42
+ * share the same in-flight promise.
43
+ */
44
+ export function loadModelsDevCatalog() {
45
+ if (inflight)
46
+ return inflight;
47
+ inflight = fetchAndValidate().catch((error) => {
48
+ // Reset on failure so future calls can retry.
49
+ inflight = null;
50
+ throw error;
51
+ });
52
+ return inflight;
53
+ }
54
+ /** Test-only helper to clear the cache between runs. */
55
+ export function resetModelsDevCatalogCache() {
56
+ inflight = null;
57
+ }
58
+ async function fetchAndValidate() {
59
+ const controller = new AbortController();
60
+ const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);
61
+ let response;
62
+ try {
63
+ response = await fetch(MODELSDEV_CATALOG_URL, { signal: controller.signal });
64
+ }
65
+ finally {
66
+ clearTimeout(timer);
67
+ }
68
+ if (!response.ok) {
69
+ throw new Error(`Failed to fetch models.dev catalog: ${response.status} ${response.statusText}`);
70
+ }
71
+ const text = await readBoundedText(response, MAX_PAYLOAD_BYTES);
72
+ let parsed;
73
+ try {
74
+ parsed = JSON.parse(text);
75
+ }
76
+ catch {
77
+ throw new Error("Failed to parse models.dev catalog: invalid JSON");
78
+ }
79
+ if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
80
+ throw new Error("Failed to parse models.dev catalog: expected an object");
81
+ }
82
+ assertCleanPayload(parsed, "models.dev");
83
+ const entries = Object.entries(parsed);
84
+ if (entries.length > MAX_PROVIDER_ENTRIES) {
85
+ throw new Error(`models.dev catalog exceeds provider cap (${entries.length} > ${MAX_PROVIDER_ENTRIES}) — refusing to load`);
86
+ }
87
+ const out = Object.create(null);
88
+ for (const [key, value] of entries) {
89
+ if (value && typeof value === "object" && !Array.isArray(value)) {
90
+ out[key] = value;
91
+ }
92
+ }
93
+ return out;
94
+ }
95
+ /** Stream-read a Response body but cap total bytes received. */
96
+ async function readBoundedText(response, maxBytes) {
97
+ const contentLength = Number(response.headers.get("content-length") ?? "0");
98
+ if (contentLength > maxBytes) {
99
+ throw new Error(`models.dev catalog too large (${contentLength} > ${maxBytes} bytes) — refusing to load`);
100
+ }
101
+ if (!response.body) {
102
+ const text = await response.text();
103
+ if (text.length > maxBytes) {
104
+ throw new Error(`models.dev catalog too large (${text.length} > ${maxBytes} chars) — refusing to load`);
105
+ }
106
+ return text;
107
+ }
108
+ const reader = response.body.getReader();
109
+ const decoder = new TextDecoder("utf-8");
110
+ let received = 0;
111
+ let text = "";
112
+ while (true) {
113
+ const { done, value } = await reader.read();
114
+ if (done)
115
+ break;
116
+ received += value.byteLength;
117
+ if (received > maxBytes) {
118
+ try {
119
+ await reader.cancel();
120
+ }
121
+ catch {
122
+ /* swallow */
123
+ }
124
+ throw new Error(`models.dev catalog too large (>${maxBytes} bytes) — refusing to load`);
125
+ }
126
+ text += decoder.decode(value, { stream: true });
127
+ }
128
+ text += decoder.decode();
129
+ return text;
130
+ }
131
+ //# sourceMappingURL=modelsdev-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modelsdev-catalog.js","sourceRoot":"","sources":["../../src/discovery/modelsdev-catalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
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 type { ModelCard } from "../types.js";
14
+ /**
15
+ * Build seed {@link ModelCard}s for the given kosha provider, sourced from
16
+ * models.dev. Returns `[]` if the provider has no entries.
17
+ */
18
+ export declare function getModelsDevSeed(providerId: string): Promise<ModelCard[]>;
19
+ //# sourceMappingURL=modelsdev-seed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modelsdev-seed.d.ts","sourceRoot":"","sources":["../../src/discovery/modelsdev-seed.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,SAAS,EAA2B,MAAM,aAAa,CAAC;AA8CtE;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CA4B/E"}
@@ -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;AAE3C,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;IAkClG;;;;;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"}
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
- return [];
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":"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"}
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
- /** Return curated fallback models when no API key is configured. */
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;AAiB3C;;;;;;;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;IAkBlG;;;;;;;OAOG;IACH,OAAO,CAAC,eAAe;IAsBvB,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,oEAAoE;IACpE,OAAO,CAAC,oBAAoB;CAa5B"}
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"}
@@ -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.staticFallbackModels();
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
- return response.data
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") || lower.startsWith("davinci") || lower.startsWith("curie") || lower.startsWith("ada")) {
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
- /** Return curated fallback models when no API key is configured. */
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,