@sriinnu/kosha-discovery 0.5.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 (208) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +286 -0
  3. package/dist/aliases.d.ts +51 -0
  4. package/dist/aliases.d.ts.map +1 -0
  5. package/dist/aliases.js +115 -0
  6. package/dist/aliases.js.map +1 -0
  7. package/dist/cache.d.ts +57 -0
  8. package/dist/cache.d.ts.map +1 -0
  9. package/dist/cache.js +123 -0
  10. package/dist/cache.js.map +1 -0
  11. package/dist/cli-commands.d.ts +142 -0
  12. package/dist/cli-commands.d.ts.map +1 -0
  13. package/dist/cli-commands.js +746 -0
  14. package/dist/cli-commands.js.map +1 -0
  15. package/dist/cli-format.d.ts +119 -0
  16. package/dist/cli-format.d.ts.map +1 -0
  17. package/dist/cli-format.js +171 -0
  18. package/dist/cli-format.js.map +1 -0
  19. package/dist/cli.d.ts +15 -0
  20. package/dist/cli.d.ts.map +1 -0
  21. package/dist/cli.js +143 -0
  22. package/dist/cli.js.map +1 -0
  23. package/dist/credentials/index.d.ts +2 -0
  24. package/dist/credentials/index.d.ts.map +1 -0
  25. package/dist/credentials/index.js +2 -0
  26. package/dist/credentials/index.js.map +1 -0
  27. package/dist/credentials/resolver.d.ts +170 -0
  28. package/dist/credentials/resolver.d.ts.map +1 -0
  29. package/dist/credentials/resolver.js +597 -0
  30. package/dist/credentials/resolver.js.map +1 -0
  31. package/dist/discovery/anthropic.d.ts +49 -0
  32. package/dist/discovery/anthropic.d.ts.map +1 -0
  33. package/dist/discovery/anthropic.js +101 -0
  34. package/dist/discovery/anthropic.js.map +1 -0
  35. package/dist/discovery/base.d.ts +59 -0
  36. package/dist/discovery/base.d.ts.map +1 -0
  37. package/dist/discovery/base.js +123 -0
  38. package/dist/discovery/base.js.map +1 -0
  39. package/dist/discovery/bedrock.d.ts +122 -0
  40. package/dist/discovery/bedrock.d.ts.map +1 -0
  41. package/dist/discovery/bedrock.js +356 -0
  42. package/dist/discovery/bedrock.js.map +1 -0
  43. package/dist/discovery/cerebras.d.ts +43 -0
  44. package/dist/discovery/cerebras.d.ts.map +1 -0
  45. package/dist/discovery/cerebras.js +65 -0
  46. package/dist/discovery/cerebras.js.map +1 -0
  47. package/dist/discovery/cohere.d.ts +57 -0
  48. package/dist/discovery/cohere.d.ts.map +1 -0
  49. package/dist/discovery/cohere.js +82 -0
  50. package/dist/discovery/cohere.js.map +1 -0
  51. package/dist/discovery/deepinfra.d.ts +41 -0
  52. package/dist/discovery/deepinfra.d.ts.map +1 -0
  53. package/dist/discovery/deepinfra.js +86 -0
  54. package/dist/discovery/deepinfra.js.map +1 -0
  55. package/dist/discovery/deepseek.d.ts +17 -0
  56. package/dist/discovery/deepseek.d.ts.map +1 -0
  57. package/dist/discovery/deepseek.js +45 -0
  58. package/dist/discovery/deepseek.js.map +1 -0
  59. package/dist/discovery/fireworks.d.ts +48 -0
  60. package/dist/discovery/fireworks.d.ts.map +1 -0
  61. package/dist/discovery/fireworks.js +101 -0
  62. package/dist/discovery/fireworks.js.map +1 -0
  63. package/dist/discovery/glm.d.ts +17 -0
  64. package/dist/discovery/glm.d.ts.map +1 -0
  65. package/dist/discovery/glm.js +52 -0
  66. package/dist/discovery/glm.js.map +1 -0
  67. package/dist/discovery/google.d.ts +53 -0
  68. package/dist/discovery/google.d.ts.map +1 -0
  69. package/dist/discovery/google.js +122 -0
  70. package/dist/discovery/google.js.map +1 -0
  71. package/dist/discovery/groq.d.ts +44 -0
  72. package/dist/discovery/groq.d.ts.map +1 -0
  73. package/dist/discovery/groq.js +89 -0
  74. package/dist/discovery/groq.js.map +1 -0
  75. package/dist/discovery/index.d.ts +48 -0
  76. package/dist/discovery/index.d.ts.map +1 -0
  77. package/dist/discovery/index.js +116 -0
  78. package/dist/discovery/index.js.map +1 -0
  79. package/dist/discovery/llama-cpp.d.ts +45 -0
  80. package/dist/discovery/llama-cpp.d.ts.map +1 -0
  81. package/dist/discovery/llama-cpp.js +137 -0
  82. package/dist/discovery/llama-cpp.js.map +1 -0
  83. package/dist/discovery/minimax.d.ts +16 -0
  84. package/dist/discovery/minimax.d.ts.map +1 -0
  85. package/dist/discovery/minimax.js +56 -0
  86. package/dist/discovery/minimax.js.map +1 -0
  87. package/dist/discovery/mistral.d.ts +45 -0
  88. package/dist/discovery/mistral.d.ts.map +1 -0
  89. package/dist/discovery/mistral.js +82 -0
  90. package/dist/discovery/mistral.js.map +1 -0
  91. package/dist/discovery/moonshot.d.ts +16 -0
  92. package/dist/discovery/moonshot.d.ts.map +1 -0
  93. package/dist/discovery/moonshot.js +46 -0
  94. package/dist/discovery/moonshot.js.map +1 -0
  95. package/dist/discovery/nvidia.d.ts +60 -0
  96. package/dist/discovery/nvidia.d.ts.map +1 -0
  97. package/dist/discovery/nvidia.js +145 -0
  98. package/dist/discovery/nvidia.js.map +1 -0
  99. package/dist/discovery/ollama.d.ts +57 -0
  100. package/dist/discovery/ollama.d.ts.map +1 -0
  101. package/dist/discovery/ollama.js +151 -0
  102. package/dist/discovery/ollama.js.map +1 -0
  103. package/dist/discovery/openai-compatible.d.ts +126 -0
  104. package/dist/discovery/openai-compatible.d.ts.map +1 -0
  105. package/dist/discovery/openai-compatible.js +161 -0
  106. package/dist/discovery/openai-compatible.js.map +1 -0
  107. package/dist/discovery/openai.d.ts +62 -0
  108. package/dist/discovery/openai.d.ts.map +1 -0
  109. package/dist/discovery/openai.js +157 -0
  110. package/dist/discovery/openai.js.map +1 -0
  111. package/dist/discovery/openrouter.d.ts +78 -0
  112. package/dist/discovery/openrouter.d.ts.map +1 -0
  113. package/dist/discovery/openrouter.js +184 -0
  114. package/dist/discovery/openrouter.js.map +1 -0
  115. package/dist/discovery/perplexity.d.ts +66 -0
  116. package/dist/discovery/perplexity.d.ts.map +1 -0
  117. package/dist/discovery/perplexity.js +86 -0
  118. package/dist/discovery/perplexity.js.map +1 -0
  119. package/dist/discovery/together.d.ts +41 -0
  120. package/dist/discovery/together.d.ts.map +1 -0
  121. package/dist/discovery/together.js +88 -0
  122. package/dist/discovery/together.js.map +1 -0
  123. package/dist/discovery/vertex.d.ts +146 -0
  124. package/dist/discovery/vertex.d.ts.map +1 -0
  125. package/dist/discovery/vertex.js +371 -0
  126. package/dist/discovery/vertex.js.map +1 -0
  127. package/dist/discovery/zai.d.ts +17 -0
  128. package/dist/discovery/zai.d.ts.map +1 -0
  129. package/dist/discovery/zai.js +51 -0
  130. package/dist/discovery/zai.js.map +1 -0
  131. package/dist/discovery-contract.d.ts +186 -0
  132. package/dist/discovery-contract.d.ts.map +1 -0
  133. package/dist/discovery-contract.js +115 -0
  134. package/dist/discovery-contract.js.map +1 -0
  135. package/dist/discovery-routes.d.ts +14 -0
  136. package/dist/discovery-routes.d.ts.map +1 -0
  137. package/dist/discovery-routes.js +98 -0
  138. package/dist/discovery-routes.js.map +1 -0
  139. package/dist/enrichment/index.d.ts +2 -0
  140. package/dist/enrichment/index.d.ts.map +1 -0
  141. package/dist/enrichment/index.js +2 -0
  142. package/dist/enrichment/index.js.map +1 -0
  143. package/dist/enrichment/litellm.d.ts +52 -0
  144. package/dist/enrichment/litellm.d.ts.map +1 -0
  145. package/dist/enrichment/litellm.js +205 -0
  146. package/dist/enrichment/litellm.js.map +1 -0
  147. package/dist/index.d.ts +30 -0
  148. package/dist/index.d.ts.map +1 -0
  149. package/dist/index.js +33 -0
  150. package/dist/index.js.map +1 -0
  151. package/dist/normalize.d.ts +64 -0
  152. package/dist/normalize.d.ts.map +1 -0
  153. package/dist/normalize.js +166 -0
  154. package/dist/normalize.js.map +1 -0
  155. package/dist/provider-catalog.d.ts +62 -0
  156. package/dist/provider-catalog.d.ts.map +1 -0
  157. package/dist/provider-catalog.js +331 -0
  158. package/dist/provider-catalog.js.map +1 -0
  159. package/dist/registry-delta.d.ts +17 -0
  160. package/dist/registry-delta.d.ts.map +1 -0
  161. package/dist/registry-delta.js +74 -0
  162. package/dist/registry-delta.js.map +1 -0
  163. package/dist/registry-discovery.d.ts +66 -0
  164. package/dist/registry-discovery.d.ts.map +1 -0
  165. package/dist/registry-discovery.js +339 -0
  166. package/dist/registry-discovery.js.map +1 -0
  167. package/dist/registry-query.d.ts +74 -0
  168. package/dist/registry-query.d.ts.map +1 -0
  169. package/dist/registry-query.js +310 -0
  170. package/dist/registry-query.js.map +1 -0
  171. package/dist/registry-runtime.d.ts +48 -0
  172. package/dist/registry-runtime.d.ts.map +1 -0
  173. package/dist/registry-runtime.js +255 -0
  174. package/dist/registry-runtime.js.map +1 -0
  175. package/dist/registry-selection.d.ts +31 -0
  176. package/dist/registry-selection.d.ts.map +1 -0
  177. package/dist/registry-selection.js +167 -0
  178. package/dist/registry-selection.js.map +1 -0
  179. package/dist/registry-state.d.ts +92 -0
  180. package/dist/registry-state.d.ts.map +1 -0
  181. package/dist/registry-state.js +35 -0
  182. package/dist/registry-state.js.map +1 -0
  183. package/dist/registry.d.ts +127 -0
  184. package/dist/registry.d.ts.map +1 -0
  185. package/dist/registry.js +248 -0
  186. package/dist/registry.js.map +1 -0
  187. package/dist/resilience.d.ts +212 -0
  188. package/dist/resilience.d.ts.map +1 -0
  189. package/dist/resilience.js +292 -0
  190. package/dist/resilience.js.map +1 -0
  191. package/dist/security.d.ts +44 -0
  192. package/dist/security.d.ts.map +1 -0
  193. package/dist/security.js +184 -0
  194. package/dist/security.js.map +1 -0
  195. package/dist/server.d.ts +41 -0
  196. package/dist/server.d.ts.map +1 -0
  197. package/dist/server.js +320 -0
  198. package/dist/server.js.map +1 -0
  199. package/dist/shell-safe.d.ts +15 -0
  200. package/dist/shell-safe.d.ts.map +1 -0
  201. package/dist/shell-safe.js +20 -0
  202. package/dist/shell-safe.js.map +1 -0
  203. package/dist/types.d.ts +365 -0
  204. package/dist/types.d.ts.map +1 -0
  205. package/dist/types.js +10 -0
  206. package/dist/types.js.map +1 -0
  207. package/logo.svg +81 -0
  208. package/package.json +85 -0
@@ -0,0 +1,356 @@
1
+ /**
2
+ * kosha-discovery — AWS Bedrock model discoverer.
3
+ *
4
+ * Resolution strategy (in order):
5
+ * 1. AWS SDK (`@aws-sdk/client-bedrock`) — if installed in the host project.
6
+ * 2. AWS CLI fallback (`aws bedrock list-foundation-models --output json`).
7
+ * 3. Static fallback list of well-known Bedrock foundation models (Feb 2026).
8
+ *
9
+ * Credentials use the standard AWS credential chain:
10
+ * environment variables (`AWS_ACCESS_KEY_ID` / `AWS_SECRET_ACCESS_KEY`),
11
+ * `~/.aws/credentials`, EC2 / ECS instance-metadata IAM roles, etc.
12
+ * No explicit credential is required by this discoverer — the SDK and CLI
13
+ * both pick up the ambient credential automatically.
14
+ *
15
+ * @module
16
+ */
17
+ import { execFileSync } from "node:child_process";
18
+ import { assertSafeShellArg } from "../shell-safe.js";
19
+ import { assertCleanPayload } from "../security.js";
20
+ import { BaseDiscoverer } from "./base.js";
21
+ // ---------------------------------------------------------------------------
22
+ // Vendor prefix → originProvider mapping
23
+ // ---------------------------------------------------------------------------
24
+ /**
25
+ * Maps the Bedrock model-ID vendor prefix to the canonical origin provider.
26
+ *
27
+ * Bedrock model IDs follow the pattern `{vendor}.{model-family}-v{n}:{variant}`,
28
+ * e.g. `anthropic.claude-opus-4-6-v1:0`, `amazon.titan-text-premier-v2:0`.
29
+ */
30
+ const VENDOR_TO_ORIGIN = {
31
+ anthropic: "anthropic",
32
+ amazon: "amazon",
33
+ meta: "meta",
34
+ mistral: "mistral",
35
+ cohere: "cohere",
36
+ ai21: "ai21",
37
+ stability: "stability",
38
+ "amazon-bedrock-preview": "amazon",
39
+ };
40
+ // ---------------------------------------------------------------------------
41
+ // Static fallback catalogue (Feb 2026)
42
+ // ---------------------------------------------------------------------------
43
+ /**
44
+ * A minimal set of well-known Bedrock foundation models used when neither
45
+ * the SDK nor the CLI is available. Context windows and output limits are
46
+ * intentionally set to 0 so that the litellm enrichment pass can fill them in.
47
+ */
48
+ const STATIC_MODELS = [
49
+ {
50
+ id: "anthropic.claude-opus-4-6-v1:0",
51
+ name: "Claude Opus 4.6 (Bedrock)",
52
+ mode: "chat",
53
+ capabilities: ["chat", "vision", "code", "nlu", "function_calling"],
54
+ originProvider: "anthropic",
55
+ },
56
+ {
57
+ id: "anthropic.claude-sonnet-4-6-v1:0",
58
+ name: "Claude Sonnet 4.6 (Bedrock)",
59
+ mode: "chat",
60
+ capabilities: ["chat", "vision", "code", "nlu", "function_calling"],
61
+ originProvider: "anthropic",
62
+ },
63
+ {
64
+ id: "anthropic.claude-haiku-4-5-v1:0",
65
+ name: "Claude Haiku 4.5 (Bedrock)",
66
+ mode: "chat",
67
+ capabilities: ["chat", "vision", "code", "nlu", "function_calling"],
68
+ originProvider: "anthropic",
69
+ },
70
+ {
71
+ id: "amazon.titan-text-premier-v2:0",
72
+ name: "Titan Text Premier v2 (Bedrock)",
73
+ mode: "chat",
74
+ capabilities: ["chat", "nlu"],
75
+ originProvider: "amazon",
76
+ },
77
+ {
78
+ id: "amazon.titan-embed-text-v2:0",
79
+ name: "Titan Embed Text v2 (Bedrock)",
80
+ mode: "embedding",
81
+ capabilities: ["embedding"],
82
+ originProvider: "amazon",
83
+ },
84
+ {
85
+ id: "meta.llama3-3-70b-instruct-v1:0",
86
+ name: "Llama 3.3 70B Instruct (Bedrock)",
87
+ mode: "chat",
88
+ capabilities: ["chat", "code", "nlu"],
89
+ originProvider: "meta",
90
+ },
91
+ {
92
+ id: "mistral.mistral-large-2411-v1:0",
93
+ name: "Mistral Large 2411 (Bedrock)",
94
+ mode: "chat",
95
+ capabilities: ["chat", "code", "nlu", "function_calling"],
96
+ originProvider: "mistral",
97
+ },
98
+ ];
99
+ // ---------------------------------------------------------------------------
100
+ // BedrockDiscoverer
101
+ // ---------------------------------------------------------------------------
102
+ /**
103
+ * Discovers models available through AWS Bedrock.
104
+ *
105
+ * Tries three resolution strategies in order:
106
+ * 1. `@aws-sdk/client-bedrock` (if installed in the host project).
107
+ * 2. AWS CLI (`aws bedrock list-foundation-models`).
108
+ * 3. Static fallback catalogue.
109
+ *
110
+ * The `credential` argument is optional in the sense that the AWS SDK and CLI
111
+ * both rely on the ambient credential chain. However, the `credential.metadata`
112
+ * bag may carry an explicit `{ region }` override.
113
+ */
114
+ export class BedrockDiscoverer extends BaseDiscoverer {
115
+ providerId = "bedrock";
116
+ providerName = "AWS Bedrock";
117
+ baseUrl = "https://bedrock.us-east-1.amazonaws.com";
118
+ /**
119
+ * Discover all foundation models available on AWS Bedrock.
120
+ *
121
+ * Resolution order: SDK → CLI → static fallback.
122
+ *
123
+ * @param credential - Optional credential; `metadata.region` overrides the
124
+ * `AWS_DEFAULT_REGION` environment variable.
125
+ * @param options - Optional timeout in milliseconds (used for CLI exec).
126
+ */
127
+ async discover(credential, options) {
128
+ // 1. Try the AWS SDK first (zero-config, respects credential chain)
129
+ try {
130
+ const models = await this.discoverViaSdk(credential, options);
131
+ if (models.length > 0) {
132
+ return models;
133
+ }
134
+ }
135
+ catch {
136
+ // SDK not installed or threw — fall through to CLI
137
+ }
138
+ // 2. Fall back to the AWS CLI
139
+ try {
140
+ const models = await this.discoverViaCli(credential, options);
141
+ if (models.length > 0) {
142
+ return models;
143
+ }
144
+ }
145
+ catch {
146
+ // CLI not installed or threw — fall through to static list
147
+ }
148
+ // 3. Last resort: static catalogue
149
+ return this.staticFallback();
150
+ }
151
+ // -------------------------------------------------------------------------
152
+ // Strategy 1 — AWS SDK
153
+ // -------------------------------------------------------------------------
154
+ /**
155
+ * Use `@aws-sdk/client-bedrock` to list foundation models.
156
+ *
157
+ * Dynamic import prevents a hard dependency: the SDK is optional and must
158
+ * be installed separately by the host project. If the import fails we
159
+ * throw so the caller can fall through to the next strategy.
160
+ *
161
+ * @throws When `@aws-sdk/client-bedrock` is not installed, or the API call fails.
162
+ */
163
+ async discoverViaSdk(credential, _options) {
164
+ // Dynamic import: will throw MODULE_NOT_FOUND if the SDK is absent.
165
+ // The SDK is an optional peer dependency — not installed in kosha itself.
166
+ // @ts-expect-error — optional peer dep, resolved at runtime by host project
167
+ const { BedrockClient, ListFoundationModelsCommand } = await import("@aws-sdk/client-bedrock");
168
+ const region = this.resolveRegion(credential);
169
+ const client = new BedrockClient({ region });
170
+ const response = await client.send(new ListFoundationModelsCommand({}));
171
+ const summaries = response.modelSummaries ?? [];
172
+ return summaries.map((m) => this.toModelCard(m, "api", credential));
173
+ }
174
+ // -------------------------------------------------------------------------
175
+ // Strategy 2 — AWS CLI
176
+ // -------------------------------------------------------------------------
177
+ /**
178
+ * Use the `aws` CLI to list foundation models.
179
+ *
180
+ * Runs `aws bedrock list-foundation-models --region {region} --output json`
181
+ * synchronously. Wrapped in try/catch so failures are surfaced to the caller
182
+ * as thrown errors, letting `discover()` fall through gracefully.
183
+ *
184
+ * @throws When the `aws` CLI is not installed or returns a non-zero exit code.
185
+ */
186
+ async discoverViaCli(credential, options) {
187
+ const region = this.resolveRegion(credential);
188
+ // Default CLI timeout: 15 s (slower than SDK due to subprocess overhead)
189
+ const timeoutMs = this.validateTimeout(options?.timeout, 15_000);
190
+ let stdout;
191
+ try {
192
+ assertSafeShellArg(region, "region");
193
+ stdout = execFileSync("aws", ["bedrock", "list-foundation-models", "--region", region, "--output", "json"], {
194
+ timeout: timeoutMs,
195
+ encoding: "utf8",
196
+ // Suppress stderr — credential errors print there, not on stdout
197
+ stdio: ["ignore", "pipe", "ignore"],
198
+ });
199
+ }
200
+ catch (error) {
201
+ // Re-throw so discover() can fall through to the static list
202
+ throw new Error(`AWS CLI failed: ${error instanceof Error ? error.message : String(error)}`);
203
+ }
204
+ let parsed;
205
+ try {
206
+ parsed = JSON.parse(stdout);
207
+ }
208
+ catch {
209
+ throw new Error("AWS CLI returned invalid JSON");
210
+ }
211
+ assertCleanPayload(parsed, "Bedrock AWS CLI");
212
+ return (parsed.modelSummaries ?? []).map((m) => this.toModelCard(m, "api", credential));
213
+ }
214
+ // -------------------------------------------------------------------------
215
+ // Strategy 3 — Static fallback
216
+ // -------------------------------------------------------------------------
217
+ /**
218
+ * Return a hardcoded catalogue of well-known Bedrock foundation models.
219
+ *
220
+ * Used when neither the SDK nor the CLI is available. All entries have
221
+ * `source: "manual"` and zero context/output token limits — the litellm
222
+ * enrichment pass is expected to populate those fields later.
223
+ */
224
+ staticFallback() {
225
+ return STATIC_MODELS.map((entry) => this.makeCard({
226
+ id: entry.id,
227
+ name: entry.name,
228
+ provider: this.providerId,
229
+ originProvider: entry.originProvider,
230
+ mode: entry.mode,
231
+ capabilities: [...entry.capabilities],
232
+ contextWindow: 0,
233
+ maxOutputTokens: 0,
234
+ source: "manual",
235
+ }));
236
+ }
237
+ // -------------------------------------------------------------------------
238
+ // Shared mapping helpers
239
+ // -------------------------------------------------------------------------
240
+ /**
241
+ * Convert a raw Bedrock foundation model summary into a {@link ModelCard}.
242
+ *
243
+ * @param model - Raw model summary from SDK or CLI.
244
+ * @param source - Whether the data came from a live API call or static data.
245
+ * @param credential - Used to attach the resolved AWS region.
246
+ */
247
+ toModelCard(model, source, credential) {
248
+ const mode = this.inferMode(model);
249
+ const capabilities = this.inferCapabilities(model);
250
+ const originProvider = inferOriginFromBedrockId(model.modelId);
251
+ const region = this.resolveRegion(credential);
252
+ return this.makeCard({
253
+ id: model.modelId,
254
+ name: model.modelName || model.modelId,
255
+ provider: this.providerId,
256
+ originProvider,
257
+ mode,
258
+ capabilities,
259
+ contextWindow: 0,
260
+ maxOutputTokens: 0,
261
+ source,
262
+ region,
263
+ });
264
+ }
265
+ /**
266
+ * Infer the primary {@link ModelMode} from Bedrock output modalities.
267
+ *
268
+ * Bedrock reports modalities as uppercase strings: "TEXT", "IMAGE", "EMBEDDING".
269
+ * We pick the most specific non-TEXT modality first; TEXT-only → "chat".
270
+ */
271
+ inferMode(model) {
272
+ const output = (model.outputModalities ?? []).map((m) => m.toUpperCase());
273
+ const id = model.modelId.toLowerCase();
274
+ // Embedding: explicit modality or keyword in ID
275
+ if (output.includes("EMBEDDING") || id.includes("embed")) {
276
+ return "embedding";
277
+ }
278
+ // Image generation: output includes IMAGE but not TEXT
279
+ if (output.includes("IMAGE") && !output.includes("TEXT")) {
280
+ return "image";
281
+ }
282
+ return "chat";
283
+ }
284
+ /**
285
+ * Infer capability flags from Bedrock input/output modalities and inference types.
286
+ *
287
+ * - "embedding" models → ["embedding"]
288
+ * - "image" output-only models → ["image"]
289
+ * - All chat models get ["chat"] plus optional vision/code/function_calling
290
+ */
291
+ inferCapabilities(model) {
292
+ const input = (model.inputModalities ?? []).map((m) => m.toUpperCase());
293
+ const output = (model.outputModalities ?? []).map((m) => m.toUpperCase());
294
+ const id = model.modelId.toLowerCase();
295
+ // Embedding models have a single capability
296
+ if (output.includes("EMBEDDING") || id.includes("embed")) {
297
+ return ["embedding"];
298
+ }
299
+ // Image-generation-only models
300
+ if (output.includes("IMAGE") && !output.includes("TEXT")) {
301
+ return ["image"];
302
+ }
303
+ const capabilities = ["chat"];
304
+ // Vision: the model accepts IMAGE input
305
+ if (input.includes("IMAGE")) {
306
+ capabilities.push("vision");
307
+ }
308
+ // Claude models on Bedrock always support code, NLU, and function calling
309
+ if (id.includes("claude")) {
310
+ capabilities.push("code", "nlu", "function_calling");
311
+ }
312
+ // Mistral large variants support function calling
313
+ if (id.includes("mistral") && id.includes("large")) {
314
+ capabilities.push("function_calling");
315
+ }
316
+ // Streaming inference type is informational — not a capability flag
317
+ return capabilities;
318
+ }
319
+ /**
320
+ * Resolve the AWS region to use for API calls.
321
+ *
322
+ * Priority: `credential.metadata.region` > `AWS_DEFAULT_REGION` env var > `"us-east-1"`.
323
+ */
324
+ resolveRegion(credential) {
325
+ return credential.metadata?.region ?? process.env.AWS_DEFAULT_REGION ?? "us-east-1";
326
+ }
327
+ }
328
+ // ---------------------------------------------------------------------------
329
+ // Exported helper (also used in tests)
330
+ // ---------------------------------------------------------------------------
331
+ /**
332
+ * Extract the origin provider from a Bedrock model ID.
333
+ *
334
+ * Bedrock model IDs follow the pattern `{vendor}.{model-name}-v{n}:{variant}`,
335
+ * e.g. `anthropic.claude-opus-4-6-v1:0` → `"anthropic"`.
336
+ *
337
+ * Falls back to `"unknown"` for unrecognised vendor prefixes.
338
+ *
339
+ * @param modelId - A Bedrock foundation model ID.
340
+ * @returns The canonical origin provider string.
341
+ *
342
+ * @example
343
+ * inferOriginFromBedrockId("anthropic.claude-sonnet-4-6-v1:0") // "anthropic"
344
+ * inferOriginFromBedrockId("meta.llama3-3-70b-instruct-v1:0") // "meta"
345
+ * inferOriginFromBedrockId("amazon.titan-text-premier-v2:0") // "amazon"
346
+ */
347
+ export function inferOriginFromBedrockId(modelId) {
348
+ // The vendor prefix is everything before the first dot
349
+ const dotIndex = modelId.indexOf(".");
350
+ if (dotIndex === -1) {
351
+ return "unknown";
352
+ }
353
+ const vendor = modelId.slice(0, dotIndex).toLowerCase();
354
+ return VENDOR_TO_ORIGIN[vendor] ?? "unknown";
355
+ }
356
+ //# sourceMappingURL=bedrock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bedrock.js","sourceRoot":"","sources":["../../src/discovery/bedrock.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * kosha-discovery — Cerebras provider discoverer.
3
+ *
4
+ * Queries the Cerebras `/v1/models` endpoint (OpenAI-compatible),
5
+ * and maps results into {@link ModelCard} objects.
6
+ *
7
+ * Cerebras hosts open-source models (Llama, Mistral, DeepSeek, Qwen) on
8
+ * their fast inference hardware. Model IDs are flat (no vendor prefix),
9
+ * e.g. `llama3.1-8b`, `llama-3.3-70b`, `deepseek-r1-distill-llama-70b`.
10
+ *
11
+ * @module
12
+ */
13
+ import { OpenAICompatibleDiscoverer, type OpenAICompatibleModel, type ModelClassification } from "./openai-compatible.js";
14
+ /**
15
+ * Discovers models available through the Cerebras Inference API.
16
+ *
17
+ * Cerebras serves a small, curated catalog of open-source models on their
18
+ * custom CS-3 silicon. All models are chat/instruct models — no embedding
19
+ * or vision models are currently offered. Every model supports function
20
+ * calling via the OpenAI-compatible tool-use API.
21
+ *
22
+ * Model IDs use flat naming without a vendor prefix (e.g. `llama3.1-8b`),
23
+ * so origin provider is inferred from keywords in the ID.
24
+ */
25
+ export declare class CerebrasDiscoverer extends OpenAICompatibleDiscoverer {
26
+ readonly providerId = "cerebras";
27
+ readonly providerName = "Cerebras";
28
+ readonly baseUrl = "https://api.cerebras.ai";
29
+ /**
30
+ * Keep all models — Cerebras maintains a small curated catalog and every
31
+ * listed model is a usable chat/instruct model. No filtering needed.
32
+ */
33
+ protected isRelevantModel(_model: OpenAICompatibleModel): boolean;
34
+ /**
35
+ * Classify a Cerebras model: infer origin from flat ID keywords,
36
+ * set mode to "chat", and assign standard chat capabilities.
37
+ *
38
+ * All models on Cerebras are chat/instruct models with function-calling
39
+ * support. Origin is inferred by matching keywords in the model ID.
40
+ */
41
+ protected classifyModel(model: OpenAICompatibleModel): ModelClassification;
42
+ }
43
+ //# sourceMappingURL=cerebras.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cerebras.d.ts","sourceRoot":"","sources":["../../src/discovery/cerebras.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,0BAA0B,EAAE,KAAK,qBAAqB,EAAE,KAAK,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAe1H;;;;;;;;;;GAUG;AACH,qBAAa,kBAAmB,SAAQ,0BAA0B;IACjE,QAAQ,CAAC,UAAU,cAAc;IACjC,QAAQ,CAAC,YAAY,cAAc;IACnC,QAAQ,CAAC,OAAO,6BAA6B;IAE7C;;;OAGG;IACH,SAAS,CAAC,eAAe,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO;IAIjE;;;;;;OAMG;IACH,SAAS,CAAC,aAAa,CAAC,KAAK,EAAE,qBAAqB,GAAG,mBAAmB;CAU1E"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * kosha-discovery — Cerebras provider discoverer.
3
+ *
4
+ * Queries the Cerebras `/v1/models` endpoint (OpenAI-compatible),
5
+ * and maps results into {@link ModelCard} objects.
6
+ *
7
+ * Cerebras hosts open-source models (Llama, Mistral, DeepSeek, Qwen) on
8
+ * their fast inference hardware. Model IDs are flat (no vendor prefix),
9
+ * e.g. `llama3.1-8b`, `llama-3.3-70b`, `deepseek-r1-distill-llama-70b`.
10
+ *
11
+ * @module
12
+ */
13
+ import { OpenAICompatibleDiscoverer } from "./openai-compatible.js";
14
+ /**
15
+ * Keyword rules for inferring origin provider from flat Cerebras model IDs.
16
+ *
17
+ * Order matters: put more-specific keywords first so that, e.g.,
18
+ * `deepseek-r1-distill-llama-70b` resolves to "deepseek" rather than "meta".
19
+ */
20
+ const ORIGIN_RULES = [
21
+ ["deepseek", "deepseek"],
22
+ ["mistral", "mistral"],
23
+ ["llama", "meta"],
24
+ ["qwen", "qwen"],
25
+ ];
26
+ /**
27
+ * Discovers models available through the Cerebras Inference API.
28
+ *
29
+ * Cerebras serves a small, curated catalog of open-source models on their
30
+ * custom CS-3 silicon. All models are chat/instruct models — no embedding
31
+ * or vision models are currently offered. Every model supports function
32
+ * calling via the OpenAI-compatible tool-use API.
33
+ *
34
+ * Model IDs use flat naming without a vendor prefix (e.g. `llama3.1-8b`),
35
+ * so origin provider is inferred from keywords in the ID.
36
+ */
37
+ export class CerebrasDiscoverer extends OpenAICompatibleDiscoverer {
38
+ providerId = "cerebras";
39
+ providerName = "Cerebras";
40
+ baseUrl = "https://api.cerebras.ai";
41
+ /**
42
+ * Keep all models — Cerebras maintains a small curated catalog and every
43
+ * listed model is a usable chat/instruct model. No filtering needed.
44
+ */
45
+ isRelevantModel(_model) {
46
+ return true;
47
+ }
48
+ /**
49
+ * Classify a Cerebras model: infer origin from flat ID keywords,
50
+ * set mode to "chat", and assign standard chat capabilities.
51
+ *
52
+ * All models on Cerebras are chat/instruct models with function-calling
53
+ * support. Origin is inferred by matching keywords in the model ID.
54
+ */
55
+ classifyModel(model) {
56
+ const lower = model.id.toLowerCase();
57
+ const originProvider = this.inferOriginFromKeywords(lower, ORIGIN_RULES, "cerebras");
58
+ return {
59
+ originProvider,
60
+ mode: "chat",
61
+ capabilities: ["chat", "function_calling"],
62
+ };
63
+ }
64
+ }
65
+ //# sourceMappingURL=cerebras.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cerebras.js","sourceRoot":"","sources":["../../src/discovery/cerebras.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,0BAA0B,EAAwD,MAAM,wBAAwB,CAAC;AAE1H;;;;;GAKG;AACH,MAAM,YAAY,GAAuB;IACxC,CAAC,UAAU,EAAE,UAAU,CAAC;IACxB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,OAAO,EAAE,MAAM,CAAC;IACjB,CAAC,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,OAAO,kBAAmB,SAAQ,0BAA0B;IACxD,UAAU,GAAG,UAAU,CAAC;IACxB,YAAY,GAAG,UAAU,CAAC;IAC1B,OAAO,GAAG,yBAAyB,CAAC;IAE7C;;;OAGG;IACO,eAAe,CAAC,MAA6B;QACtD,OAAO,IAAI,CAAC;IACb,CAAC;IAED;;;;;;OAMG;IACO,aAAa,CAAC,KAA4B;QACnD,MAAM,KAAK,GAAG,KAAK,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,cAAc,GAAG,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;QAErF,OAAO;YACN,cAAc;YACd,IAAI,EAAE,MAAM;YACZ,YAAY,EAAE,CAAC,MAAM,EAAE,kBAAkB,CAAC;SAC1C,CAAC;IACH,CAAC;CACD"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * kosha-discovery — Cohere provider discoverer.
3
+ *
4
+ * Queries the Cohere OpenAI-compatible `/v1/models` endpoint,
5
+ * maps each model into a normalized {@link ModelCard}, and classifies
6
+ * the full catalog — chat, embedding, and rerank models alike.
7
+ *
8
+ * Auth: `Authorization: Bearer $CO_API_KEY`
9
+ * @module
10
+ */
11
+ import { OpenAICompatibleDiscoverer, type ModelClassification, type OpenAICompatibleModel } from "./openai-compatible.js";
12
+ /**
13
+ * Discovers models available through the Cohere API.
14
+ *
15
+ * Cohere exposes an OpenAI-compatible `/v1/models` endpoint at
16
+ * `https://api.cohere.com/compatibility`. All models in the catalog
17
+ * are Cohere's own, so `originProvider` is always `"cohere"`.
18
+ *
19
+ * Model families:
20
+ * - **command-r-plus / command-r** — flagship chat models with NLU capabilities
21
+ * - **command-light** — lighter chat model
22
+ * - **embed-*** — text embedding models
23
+ * - **rerank-*** — reranking models (classified as embedding mode)
24
+ */
25
+ export declare class CohereDiscoverer extends OpenAICompatibleDiscoverer {
26
+ readonly providerId = "cohere";
27
+ readonly providerName = "Cohere";
28
+ readonly baseUrl = "https://api.cohere.com/compatibility";
29
+ /**
30
+ * Keep all models in the Cohere catalog.
31
+ *
32
+ * Cohere maintains a clean, intentional catalog (no reward models,
33
+ * no internal snapshots), so no filtering is required.
34
+ */
35
+ protected isRelevantModel(_model: OpenAICompatibleModel): boolean;
36
+ /**
37
+ * Classify a Cohere model: all are first-party, with mode and
38
+ * capabilities inferred from the model ID.
39
+ *
40
+ * Rules:
41
+ * - `originProvider` is always `"cohere"`
42
+ * - Embedding/rerank models → mode `"embedding"`, caps `["embedding"]`
43
+ * - All chat models → caps include `"function_calling"` (Cohere supports tool use)
44
+ * - `command-r-plus` and `command-r` additionally get `"nlu"`
45
+ */
46
+ protected classifyModel(model: OpenAICompatibleModel): ModelClassification;
47
+ /** Map a model ID to its primary {@link ModelMode}. */
48
+ private inferMode;
49
+ /**
50
+ * Infer capability flags from the lowercase model ID.
51
+ *
52
+ * - Embedding/rerank → `["embedding"]`
53
+ * - All chat models → `["chat", "function_calling"]` (+ `"nlu"` for command-r variants)
54
+ */
55
+ private inferCapabilities;
56
+ }
57
+ //# sourceMappingURL=cohere.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cohere.d.ts","sourceRoot":"","sources":["../../src/discovery/cohere.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,0BAA0B,EAAE,KAAK,mBAAmB,EAAE,KAAK,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAE1H;;;;;;;;;;;;GAYG;AACH,qBAAa,gBAAiB,SAAQ,0BAA0B;IAC/D,QAAQ,CAAC,UAAU,YAAY;IAC/B,QAAQ,CAAC,YAAY,YAAY;IACjC,QAAQ,CAAC,OAAO,0CAA0C;IAE1D;;;;;OAKG;IACH,SAAS,CAAC,eAAe,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO;IAIjE;;;;;;;;;OASG;IACH,SAAS,CAAC,aAAa,CAAC,KAAK,EAAE,qBAAqB,GAAG,mBAAmB;IAY1E,uDAAuD;IACvD,OAAO,CAAC,SAAS;IAKjB;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;CAczB"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * kosha-discovery — Cohere provider discoverer.
3
+ *
4
+ * Queries the Cohere OpenAI-compatible `/v1/models` endpoint,
5
+ * maps each model into a normalized {@link ModelCard}, and classifies
6
+ * the full catalog — chat, embedding, and rerank models alike.
7
+ *
8
+ * Auth: `Authorization: Bearer $CO_API_KEY`
9
+ * @module
10
+ */
11
+ import { OpenAICompatibleDiscoverer } from "./openai-compatible.js";
12
+ /**
13
+ * Discovers models available through the Cohere API.
14
+ *
15
+ * Cohere exposes an OpenAI-compatible `/v1/models` endpoint at
16
+ * `https://api.cohere.com/compatibility`. All models in the catalog
17
+ * are Cohere's own, so `originProvider` is always `"cohere"`.
18
+ *
19
+ * Model families:
20
+ * - **command-r-plus / command-r** — flagship chat models with NLU capabilities
21
+ * - **command-light** — lighter chat model
22
+ * - **embed-*** — text embedding models
23
+ * - **rerank-*** — reranking models (classified as embedding mode)
24
+ */
25
+ export class CohereDiscoverer extends OpenAICompatibleDiscoverer {
26
+ providerId = "cohere";
27
+ providerName = "Cohere";
28
+ baseUrl = "https://api.cohere.com/compatibility";
29
+ /**
30
+ * Keep all models in the Cohere catalog.
31
+ *
32
+ * Cohere maintains a clean, intentional catalog (no reward models,
33
+ * no internal snapshots), so no filtering is required.
34
+ */
35
+ isRelevantModel(_model) {
36
+ return true;
37
+ }
38
+ /**
39
+ * Classify a Cohere model: all are first-party, with mode and
40
+ * capabilities inferred from the model ID.
41
+ *
42
+ * Rules:
43
+ * - `originProvider` is always `"cohere"`
44
+ * - Embedding/rerank models → mode `"embedding"`, caps `["embedding"]`
45
+ * - All chat models → caps include `"function_calling"` (Cohere supports tool use)
46
+ * - `command-r-plus` and `command-r` additionally get `"nlu"`
47
+ */
48
+ classifyModel(model) {
49
+ const lower = model.id.toLowerCase();
50
+ const mode = this.inferMode(lower);
51
+ const capabilities = this.inferCapabilities(lower);
52
+ return {
53
+ originProvider: "cohere",
54
+ mode,
55
+ capabilities,
56
+ };
57
+ }
58
+ /** Map a model ID to its primary {@link ModelMode}. */
59
+ inferMode(lower) {
60
+ if (this.looksLikeEmbedding(lower))
61
+ return "embedding";
62
+ return "chat";
63
+ }
64
+ /**
65
+ * Infer capability flags from the lowercase model ID.
66
+ *
67
+ * - Embedding/rerank → `["embedding"]`
68
+ * - All chat models → `["chat", "function_calling"]` (+ `"nlu"` for command-r variants)
69
+ */
70
+ inferCapabilities(lower) {
71
+ if (this.looksLikeEmbedding(lower)) {
72
+ return ["embedding"];
73
+ }
74
+ const caps = ["chat", "function_calling"];
75
+ // command-r-plus and command-r have advanced NLU/RAG capabilities
76
+ if (lower === "command-r-plus" || lower === "command-r") {
77
+ caps.push("nlu");
78
+ }
79
+ return caps;
80
+ }
81
+ }
82
+ //# sourceMappingURL=cohere.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cohere.js","sourceRoot":"","sources":["../../src/discovery/cohere.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,0BAA0B,EAAwD,MAAM,wBAAwB,CAAC;AAE1H;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,gBAAiB,SAAQ,0BAA0B;IACtD,UAAU,GAAG,QAAQ,CAAC;IACtB,YAAY,GAAG,QAAQ,CAAC;IACxB,OAAO,GAAG,sCAAsC,CAAC;IAE1D;;;;;OAKG;IACO,eAAe,CAAC,MAA6B;QACtD,OAAO,IAAI,CAAC;IACb,CAAC;IAED;;;;;;;;;OASG;IACO,aAAa,CAAC,KAA4B;QACnD,MAAM,KAAK,GAAG,KAAK,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAEnD,OAAO;YACN,cAAc,EAAE,QAAQ;YACxB,IAAI;YACJ,YAAY;SACZ,CAAC;IACH,CAAC;IAED,uDAAuD;IAC/C,SAAS,CAAC,KAAa;QAC9B,IAAI,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;YAAE,OAAO,WAAW,CAAC;QACvD,OAAO,MAAM,CAAC;IACf,CAAC;IAED;;;;;OAKG;IACK,iBAAiB,CAAC,KAAa;QACtC,IAAI,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;YACpC,OAAO,CAAC,WAAW,CAAC,CAAC;QACtB,CAAC;QAED,MAAM,IAAI,GAAa,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;QAEpD,kEAAkE;QAClE,IAAI,KAAK,KAAK,gBAAgB,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;YACzD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,IAAI,CAAC;IACb,CAAC;CACD"}