@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 @@
1
+ {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/discovery/anthropic.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,cAAc,EAA2B,MAAM,WAAW,CAAC;AAkBpE;;;;;GAKG;AACH,qBAAa,mBAAoB,SAAQ,cAAc;IACtD,QAAQ,CAAC,UAAU,eAAe;IAClC,QAAQ,CAAC,YAAY,eAAe;IACpC,QAAQ,CAAC,OAAO,+BAA+B;IAE/C;;;;;OAKG;IACG,QAAQ,CAAC,UAAU,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAiClG;;OAEG;IACH,OAAO,CAAC,WAAW;IAanB;;;;;;OAMG;IACH,OAAO,CAAC,iBAAiB;IAmBzB;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;CAMxB"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * kosha-discovery — Anthropic provider discoverer.
3
+ *
4
+ * Queries the Anthropic `/v1/models` endpoint to enumerate all available
5
+ * Claude models and maps them into normalized {@link ModelCard} objects.
6
+ * @module
7
+ */
8
+ import { BaseDiscoverer, MAX_MODELS_PER_PROVIDER } from "./base.js";
9
+ /**
10
+ * Discovers models available through the Anthropic API.
11
+ *
12
+ * Authentication is via `x-api-key` header. The endpoint is paginated,
13
+ * so we loop until `has_more` is false.
14
+ */
15
+ export class AnthropicDiscoverer extends BaseDiscoverer {
16
+ providerId = "anthropic";
17
+ providerName = "Anthropic";
18
+ baseUrl = "https://api.anthropic.com";
19
+ /**
20
+ * Fetch all models from the Anthropic API using cursor-based pagination.
21
+ * @param credential - Must contain an `apiKey` or `accessToken`.
22
+ * @param options - Optional timeout override (default 10 s).
23
+ * @returns Normalized model cards, or an empty array if unauthenticated.
24
+ */
25
+ async discover(credential, options) {
26
+ const apiKey = credential.apiKey ?? credential.accessToken;
27
+ if (!apiKey) {
28
+ return [];
29
+ }
30
+ const timeoutMs = this.validateTimeout(options?.timeout);
31
+ const headers = {
32
+ "x-api-key": apiKey,
33
+ "anthropic-version": "2023-06-01",
34
+ };
35
+ const allModels = [];
36
+ let url = `${this.baseUrl}/v1/models?limit=100`;
37
+ // Cursor-based pagination: keep fetching pages while `has_more` is true.
38
+ // Each page returns up to 100 models; `last_id` serves as the cursor.
39
+ while (url) {
40
+ const response = await this.fetchJSON(url, headers, timeoutMs);
41
+ allModels.push(...response.data);
42
+ if (allModels.length >= MAX_MODELS_PER_PROVIDER)
43
+ break;
44
+ if (response.has_more && response.last_id) {
45
+ url = `${this.baseUrl}/v1/models?limit=100&after_id=${response.last_id}`;
46
+ }
47
+ else {
48
+ url = "";
49
+ }
50
+ }
51
+ return allModels.map((model) => this.toModelCard(model));
52
+ }
53
+ /**
54
+ * Convert an Anthropic API model object into a normalized {@link ModelCard}.
55
+ */
56
+ toModelCard(model) {
57
+ const capabilities = this.inferCapabilities(model.id);
58
+ const mode = model.id.toLowerCase().includes("embed") ? "embedding" : "chat";
59
+ return this.makeCard({
60
+ id: model.id,
61
+ name: model.display_name || model.id,
62
+ provider: this.providerId,
63
+ mode,
64
+ capabilities,
65
+ });
66
+ }
67
+ /**
68
+ * Infer capability flags from the model ID string.
69
+ *
70
+ * All Claude chat models get "chat", "code", "nlu", and "function_calling".
71
+ * Vision is added for Claude 3+ models (detected via regex).
72
+ * @param modelId - The canonical Anthropic model ID.
73
+ */
74
+ inferCapabilities(modelId) {
75
+ const id = modelId.toLowerCase();
76
+ // Embedding models have a single capability
77
+ if (id.includes("embed")) {
78
+ return ["embedding"];
79
+ }
80
+ // All Claude chat models get base capabilities
81
+ const capabilities = ["chat", "code", "nlu", "function_calling"];
82
+ // Claude 3+ models have multimodal vision support
83
+ if (this.hasVisionSupport(id)) {
84
+ capabilities.push("vision");
85
+ }
86
+ return capabilities;
87
+ }
88
+ /**
89
+ * Check whether a model ID indicates vision (multimodal) support.
90
+ *
91
+ * @param id - Lowercased model ID.
92
+ * @returns `true` for Claude 3, 3.5, 4, 4.5, 4.6, etc.
93
+ */
94
+ hasVisionSupport(id) {
95
+ // Matches "claude-3", "claude-4", "claude-4-6", etc.
96
+ // The regex captures a major version >= 3, covering all current and future multimodal Claude models.
97
+ const visionPattern = /claude-([3-9]|[1-9]\d)/;
98
+ return visionPattern.test(id);
99
+ }
100
+ }
101
+ //# sourceMappingURL=anthropic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/discovery/anthropic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * kosha-discovery — Base discoverer abstraction.
3
+ *
4
+ * Provides shared HTTP fetching, timeout handling, and {@link ModelCard}
5
+ * construction logic that every concrete provider discoverer inherits.
6
+ * @module
7
+ */
8
+ import type { CredentialResult, ModelCard, ProviderDiscoverer } from "../types.js";
9
+ /** Safety cap for paginated model listing. */
10
+ export declare const MAX_MODELS_PER_PROVIDER = 10000;
11
+ /**
12
+ * Abstract base class for all provider discoverers.
13
+ *
14
+ * Subclasses only need to implement {@link discover} and set the three
15
+ * readonly identity fields; the base class supplies `fetchJSON` for
16
+ * HTTP calls and `makeCard` for building uniform {@link ModelCard} objects.
17
+ */
18
+ export declare abstract class BaseDiscoverer implements ProviderDiscoverer {
19
+ abstract readonly providerId: string;
20
+ abstract readonly providerName: string;
21
+ abstract readonly baseUrl: string;
22
+ /**
23
+ * Query the provider's API and return a list of normalized model cards.
24
+ * @param credential - Resolved credential for authentication.
25
+ * @param options - Optional per-request timeout override.
26
+ */
27
+ abstract discover(credential: CredentialResult, options?: {
28
+ timeout?: number;
29
+ }): Promise<ModelCard[]>;
30
+ /**
31
+ * Fetch JSON from a URL with timeout and automatic retry on transient errors.
32
+ *
33
+ * Retries up to {@link maxRetries} times with exponential backoff on:
34
+ * - Network failures (fetch throws)
35
+ * - Timeout / abort errors
36
+ * - Server errors (HTTP 5xx)
37
+ *
38
+ * Client errors (4xx) are thrown immediately without retry.
39
+ */
40
+ protected fetchJSON<T>(url: string, headers?: Record<string, string>, timeoutMs?: number): Promise<T>;
41
+ /**
42
+ * Create a ModelCard with sensible defaults for missing fields.
43
+ *
44
+ * - `originProvider` defaults to `partial.provider` when not explicitly set,
45
+ * which is correct for first-party providers (e.g. "anthropic" serving its
46
+ * own Claude models). Aggregators like openrouter or managed services like
47
+ * bedrock/vertex should pass an explicit `originProvider` to distinguish
48
+ * the serving layer from the original model creator.
49
+ * - `region` and `projectId` are passed through unchanged when present
50
+ * (used by Bedrock and Vertex AI respectively).
51
+ */
52
+ /** Validate and normalise a timeout value. Returns defaultMs when invalid. */
53
+ protected validateTimeout(timeout: number | undefined, defaultMs?: number): number;
54
+ protected makeCard(partial: Partial<ModelCard> & {
55
+ id: string;
56
+ provider: string;
57
+ }): ModelCard;
58
+ }
59
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/discovery/base.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAGnF,8CAA8C;AAC9C,eAAO,MAAM,uBAAuB,QAAS,CAAC;AAa9C;;;;;;GAMG;AACH,8BAAsB,cAAe,YAAW,kBAAkB;IACjE,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAElC;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAErG;;;;;;;;;OASG;cACa,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC;IAwD3G;;;;;;;;;;OAUG;IACH,8EAA8E;IAC9E,SAAS,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,SAAS,SAAS,GAAG,MAAM;IAIlF,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS;CAkB7F"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * kosha-discovery — Base discoverer abstraction.
3
+ *
4
+ * Provides shared HTTP fetching, timeout handling, and {@link ModelCard}
5
+ * construction logic that every concrete provider discoverer inherits.
6
+ * @module
7
+ */
8
+ import { assertCleanPayload } from "../security.js";
9
+ /** Safety cap for paginated model listing. */
10
+ export const MAX_MODELS_PER_PROVIDER = 10_000;
11
+ /** Common API-key patterns to redact from error messages. */
12
+ const API_KEY_PATTERN = /\b(sk-[A-Za-z0-9_-]{8,}|key-[A-Za-z0-9_-]{8,}|Bearer\s+[A-Za-z0-9._\-]{20,})\b/gi;
13
+ /** Sanitize a response body before including it in an error message. */
14
+ function sanitizeErrorBody(raw, maxLen = 200) {
15
+ const redacted = raw.replace(API_KEY_PATTERN, "[REDACTED]");
16
+ if (redacted.length <= maxLen)
17
+ return redacted;
18
+ return `${redacted.slice(0, maxLen)}…[truncated]`;
19
+ }
20
+ /**
21
+ * Abstract base class for all provider discoverers.
22
+ *
23
+ * Subclasses only need to implement {@link discover} and set the three
24
+ * readonly identity fields; the base class supplies `fetchJSON` for
25
+ * HTTP calls and `makeCard` for building uniform {@link ModelCard} objects.
26
+ */
27
+ export class BaseDiscoverer {
28
+ /**
29
+ * Fetch JSON from a URL with timeout and automatic retry on transient errors.
30
+ *
31
+ * Retries up to {@link maxRetries} times with exponential backoff on:
32
+ * - Network failures (fetch throws)
33
+ * - Timeout / abort errors
34
+ * - Server errors (HTTP 5xx)
35
+ *
36
+ * Client errors (4xx) are thrown immediately without retry.
37
+ */
38
+ async fetchJSON(url, headers, timeoutMs = 10_000) {
39
+ const maxRetries = 3;
40
+ const baseDelayMs = 500;
41
+ let lastError;
42
+ for (let attempt = 0; attempt < maxRetries; attempt++) {
43
+ const controller = new AbortController();
44
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
45
+ try {
46
+ const response = await fetch(url, {
47
+ headers,
48
+ signal: controller.signal,
49
+ });
50
+ if (!response.ok) {
51
+ const body = await response.text().catch(() => "");
52
+ const safeBody = body ? sanitizeErrorBody(body) : "";
53
+ const err = new Error(`${this.providerName} API error: ${response.status} ${response.statusText}${safeBody ? ` — ${safeBody}` : ""}`);
54
+ // 4xx client errors are not transient — fail immediately
55
+ if (response.status >= 400 && response.status < 500) {
56
+ throw err;
57
+ }
58
+ // 5xx server errors are retryable
59
+ lastError = err;
60
+ }
61
+ else {
62
+ const data = (await response.json());
63
+ assertCleanPayload(data, `${this.providerName} API`);
64
+ return data;
65
+ }
66
+ }
67
+ catch (error) {
68
+ if (error instanceof DOMException && error.name === "AbortError") {
69
+ lastError = new Error(`${this.providerName} API request timed out after ${timeoutMs}ms`);
70
+ }
71
+ else if (error instanceof Error) {
72
+ // 4xx errors rethrown above will have already propagated
73
+ lastError = error;
74
+ }
75
+ else {
76
+ lastError = new Error(String(error));
77
+ }
78
+ }
79
+ finally {
80
+ clearTimeout(timer);
81
+ }
82
+ // Wait before retrying (exponential backoff: 500ms, 1s, 2s)
83
+ if (attempt < maxRetries - 1) {
84
+ await new Promise((resolve) => setTimeout(resolve, baseDelayMs * 2 ** attempt));
85
+ }
86
+ }
87
+ throw lastError ?? new Error(`${this.providerName} API request failed after ${maxRetries} attempts`);
88
+ }
89
+ /**
90
+ * Create a ModelCard with sensible defaults for missing fields.
91
+ *
92
+ * - `originProvider` defaults to `partial.provider` when not explicitly set,
93
+ * which is correct for first-party providers (e.g. "anthropic" serving its
94
+ * own Claude models). Aggregators like openrouter or managed services like
95
+ * bedrock/vertex should pass an explicit `originProvider` to distinguish
96
+ * the serving layer from the original model creator.
97
+ * - `region` and `projectId` are passed through unchanged when present
98
+ * (used by Bedrock and Vertex AI respectively).
99
+ */
100
+ /** Validate and normalise a timeout value. Returns defaultMs when invalid. */
101
+ validateTimeout(timeout, defaultMs = 10_000) {
102
+ return (Number.isFinite(timeout) && timeout > 0) ? timeout : defaultMs;
103
+ }
104
+ makeCard(partial) {
105
+ const capabilities = partial.capabilities ?? ["chat"];
106
+ return {
107
+ name: partial.id,
108
+ mode: "chat",
109
+ capabilities,
110
+ rawCapabilities: partial.rawCapabilities ?? [...capabilities],
111
+ contextWindow: 0,
112
+ maxOutputTokens: 0,
113
+ aliases: [],
114
+ discoveredAt: Date.now(),
115
+ source: "api",
116
+ // originProvider falls back to the serving provider when the caller
117
+ // does not supply a more-specific original creator.
118
+ originProvider: partial.originProvider ?? partial.provider,
119
+ ...partial,
120
+ };
121
+ }
122
+ }
123
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/discovery/base.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,122 @@
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 type { CredentialResult, ModelCard } from "../types.js";
18
+ import { BaseDiscoverer } from "./base.js";
19
+ /**
20
+ * Discovers models available through AWS Bedrock.
21
+ *
22
+ * Tries three resolution strategies in order:
23
+ * 1. `@aws-sdk/client-bedrock` (if installed in the host project).
24
+ * 2. AWS CLI (`aws bedrock list-foundation-models`).
25
+ * 3. Static fallback catalogue.
26
+ *
27
+ * The `credential` argument is optional in the sense that the AWS SDK and CLI
28
+ * both rely on the ambient credential chain. However, the `credential.metadata`
29
+ * bag may carry an explicit `{ region }` override.
30
+ */
31
+ export declare class BedrockDiscoverer extends BaseDiscoverer {
32
+ readonly providerId = "bedrock";
33
+ readonly providerName = "AWS Bedrock";
34
+ readonly baseUrl = "https://bedrock.us-east-1.amazonaws.com";
35
+ /**
36
+ * Discover all foundation models available on AWS Bedrock.
37
+ *
38
+ * Resolution order: SDK → CLI → static fallback.
39
+ *
40
+ * @param credential - Optional credential; `metadata.region` overrides the
41
+ * `AWS_DEFAULT_REGION` environment variable.
42
+ * @param options - Optional timeout in milliseconds (used for CLI exec).
43
+ */
44
+ discover(credential: CredentialResult, options?: {
45
+ timeout?: number;
46
+ }): Promise<ModelCard[]>;
47
+ /**
48
+ * Use `@aws-sdk/client-bedrock` to list foundation models.
49
+ *
50
+ * Dynamic import prevents a hard dependency: the SDK is optional and must
51
+ * be installed separately by the host project. If the import fails we
52
+ * throw so the caller can fall through to the next strategy.
53
+ *
54
+ * @throws When `@aws-sdk/client-bedrock` is not installed, or the API call fails.
55
+ */
56
+ private discoverViaSdk;
57
+ /**
58
+ * Use the `aws` CLI to list foundation models.
59
+ *
60
+ * Runs `aws bedrock list-foundation-models --region {region} --output json`
61
+ * synchronously. Wrapped in try/catch so failures are surfaced to the caller
62
+ * as thrown errors, letting `discover()` fall through gracefully.
63
+ *
64
+ * @throws When the `aws` CLI is not installed or returns a non-zero exit code.
65
+ */
66
+ private discoverViaCli;
67
+ /**
68
+ * Return a hardcoded catalogue of well-known Bedrock foundation models.
69
+ *
70
+ * Used when neither the SDK nor the CLI is available. All entries have
71
+ * `source: "manual"` and zero context/output token limits — the litellm
72
+ * enrichment pass is expected to populate those fields later.
73
+ */
74
+ private staticFallback;
75
+ /**
76
+ * Convert a raw Bedrock foundation model summary into a {@link ModelCard}.
77
+ *
78
+ * @param model - Raw model summary from SDK or CLI.
79
+ * @param source - Whether the data came from a live API call or static data.
80
+ * @param credential - Used to attach the resolved AWS region.
81
+ */
82
+ private toModelCard;
83
+ /**
84
+ * Infer the primary {@link ModelMode} from Bedrock output modalities.
85
+ *
86
+ * Bedrock reports modalities as uppercase strings: "TEXT", "IMAGE", "EMBEDDING".
87
+ * We pick the most specific non-TEXT modality first; TEXT-only → "chat".
88
+ */
89
+ private inferMode;
90
+ /**
91
+ * Infer capability flags from Bedrock input/output modalities and inference types.
92
+ *
93
+ * - "embedding" models → ["embedding"]
94
+ * - "image" output-only models → ["image"]
95
+ * - All chat models get ["chat"] plus optional vision/code/function_calling
96
+ */
97
+ private inferCapabilities;
98
+ /**
99
+ * Resolve the AWS region to use for API calls.
100
+ *
101
+ * Priority: `credential.metadata.region` > `AWS_DEFAULT_REGION` env var > `"us-east-1"`.
102
+ */
103
+ private resolveRegion;
104
+ }
105
+ /**
106
+ * Extract the origin provider from a Bedrock model ID.
107
+ *
108
+ * Bedrock model IDs follow the pattern `{vendor}.{model-name}-v{n}:{variant}`,
109
+ * e.g. `anthropic.claude-opus-4-6-v1:0` → `"anthropic"`.
110
+ *
111
+ * Falls back to `"unknown"` for unrecognised vendor prefixes.
112
+ *
113
+ * @param modelId - A Bedrock foundation model ID.
114
+ * @returns The canonical origin provider string.
115
+ *
116
+ * @example
117
+ * inferOriginFromBedrockId("anthropic.claude-sonnet-4-6-v1:0") // "anthropic"
118
+ * inferOriginFromBedrockId("meta.llama3-3-70b-instruct-v1:0") // "meta"
119
+ * inferOriginFromBedrockId("amazon.titan-text-premier-v2:0") // "amazon"
120
+ */
121
+ export declare function inferOriginFromBedrockId(modelId: string): string;
122
+ //# sourceMappingURL=bedrock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bedrock.d.ts","sourceRoot":"","sources":["../../src/discovery/bedrock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAKH,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAa,MAAM,aAAa,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAwH3C;;;;;;;;;;;GAWG;AACH,qBAAa,iBAAkB,SAAQ,cAAc;IACpD,QAAQ,CAAC,UAAU,aAAa;IAChC,QAAQ,CAAC,YAAY,iBAAiB;IACtC,QAAQ,CAAC,OAAO,6CAA6C;IAE7D;;;;;;;;OAQG;IACG,QAAQ,CAAC,UAAU,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IA6BlG;;;;;;;;OAQG;YACW,cAAc;IAmB5B;;;;;;;;OAQG;YACW,cAAc;IAuC5B;;;;;;OAMG;IACH,OAAO,CAAC,cAAc;IAoBtB;;;;;;OAMG;IACH,OAAO,CAAC,WAAW;IAwBnB;;;;;OAKG;IACH,OAAO,CAAC,SAAS;IAiBjB;;;;;;OAMG;IACH,OAAO,CAAC,iBAAiB;IAoCzB;;;;OAIG;IACH,OAAO,CAAC,aAAa;CAGrB;AAMD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAShE"}