@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,371 @@
1
+ /**
2
+ * kosha-discovery — Google Vertex AI provider discoverer.
3
+ *
4
+ * Resolution strategy (in order):
5
+ * 1. REST API with Application Default Credentials (ADC)
6
+ * 2. gcloud CLI fallback (`gcloud ai models list`)
7
+ * 3. Static fallback list of known Vertex AI models
8
+ *
9
+ * Credentials: Uses the Google ADC chain —
10
+ * ~/.config/gcloud/application_default_credentials.json,
11
+ * GOOGLE_APPLICATION_CREDENTIALS env var, or the GCP metadata server.
12
+ * @module
13
+ */
14
+ import { execFileSync, execSync } from "node:child_process";
15
+ import { readFileSync } from "node:fs";
16
+ import { homedir } from "node:os";
17
+ import { join } from "node:path";
18
+ import { assertSafeShellArg } from "../shell-safe.js";
19
+ import { assertCleanPayload } from "../security.js";
20
+ import { BaseDiscoverer } from "./base.js";
21
+ // ---------------------------------------------------------------------------
22
+ // VertexDiscoverer
23
+ // ---------------------------------------------------------------------------
24
+ /**
25
+ * Discovers models available through Google Vertex AI.
26
+ *
27
+ * Works without an explicit API key: access tokens are resolved via the
28
+ * standard ADC chain, so it behaves correctly in local dev environments
29
+ * (after `gcloud auth application-default login`) and on GCP VMs (metadata
30
+ * server). When the REST API is unavailable it falls back to the gcloud CLI,
31
+ * and when that is missing it returns a curated static list so callers always
32
+ * receive useful results.
33
+ */
34
+ export class VertexDiscoverer extends BaseDiscoverer {
35
+ providerId = "vertex";
36
+ providerName = "Google Vertex AI";
37
+ /** Template string — region is substituted per-request. */
38
+ baseUrl = "https://{region}-aiplatform.googleapis.com";
39
+ /**
40
+ * Discover models from Vertex AI using a three-tier fallback strategy:
41
+ * 1. Vertex AI REST API (requires an ADC access token + project ID)
42
+ * 2. `gcloud ai models list` CLI
43
+ * 3. Curated static list
44
+ *
45
+ * @param credential - Credential bag; `accessToken` is used when present.
46
+ * `metadata.projectId` and `metadata.region` take precedence over env vars.
47
+ * @param options - Optional timeout in ms (default 10 000).
48
+ */
49
+ async discover(credential, options) {
50
+ // Project ID resolution: credential → env vars → gcloud config
51
+ let projectId = credential.metadata?.projectId ??
52
+ process.env.GOOGLE_CLOUD_PROJECT ??
53
+ process.env.GCLOUD_PROJECT;
54
+ if (!projectId) {
55
+ projectId = this.resolveProjectFromCli();
56
+ }
57
+ // Region resolution: credential → env var → default
58
+ const region = credential.metadata?.region ?? process.env.GOOGLE_CLOUD_REGION ?? "us-central1";
59
+ // Attempt 1: REST API
60
+ try {
61
+ const cards = await this.discoverViaApi(credential, projectId, region, options);
62
+ if (cards.length > 0)
63
+ return cards;
64
+ }
65
+ catch {
66
+ // Fall through to CLI
67
+ }
68
+ // Attempt 2: gcloud CLI
69
+ if (projectId) {
70
+ try {
71
+ const cards = await this.discoverViaCli(projectId, region);
72
+ if (cards.length > 0)
73
+ return cards;
74
+ }
75
+ catch {
76
+ // Fall through to static list
77
+ }
78
+ }
79
+ // Attempt 3: Static fallback
80
+ return this.staticFallback(region, projectId);
81
+ }
82
+ // -------------------------------------------------------------------------
83
+ // Private: REST API
84
+ // -------------------------------------------------------------------------
85
+ /**
86
+ * Fetch models from the Vertex AI Publisher Models REST endpoint.
87
+ *
88
+ * URL: `https://{region}-aiplatform.googleapis.com/v1/projects/{project}/
89
+ * locations/{region}/publishers/google/models`
90
+ *
91
+ * @param credential - Used to obtain a Bearer token via {@link getAccessToken}.
92
+ * @param projectId - GCP project ID (required for the REST path).
93
+ * @param region - GCP region (e.g. "us-central1").
94
+ * @param options - Optional timeout override.
95
+ */
96
+ async discoverViaApi(credential, projectId, region, options) {
97
+ if (!projectId)
98
+ throw new Error("Vertex AI: project ID is required for the REST API");
99
+ assertSafeShellArg(projectId, "projectId");
100
+ assertSafeShellArg(region, "region");
101
+ const token = await this.getAccessToken(credential);
102
+ if (!token)
103
+ throw new Error("Vertex AI: could not obtain an access token");
104
+ const host = `https://${region}-aiplatform.googleapis.com`;
105
+ const url = `${host}/v1/projects/${projectId}/locations/${region}/publishers/google/models`;
106
+ const headers = {
107
+ Authorization: `Bearer ${token}`,
108
+ "Content-Type": "application/json",
109
+ };
110
+ const response = await this.fetchJSON(url, headers, this.validateTimeout(options?.timeout));
111
+ const rawModels = response.publisherModels ?? response.models ?? [];
112
+ return rawModels.map((m) => this.toModelCard(m, region, projectId));
113
+ }
114
+ // -------------------------------------------------------------------------
115
+ // Private: ADC token resolution
116
+ // -------------------------------------------------------------------------
117
+ /**
118
+ * Resolve a Google OAuth2 access token using the ADC chain:
119
+ * 1. `credential.accessToken` — already resolved upstream
120
+ * 2. ADC JSON file containing `access_token` (service account / workload identity)
121
+ * 3. ADC JSON file with `refresh_token` — exchange via Google OAuth endpoint
122
+ * 4. `gcloud auth print-access-token` CLI fallback
123
+ *
124
+ * Returns `undefined` when no token can be obtained.
125
+ *
126
+ * @param credential - The credential bag from the discovery pipeline.
127
+ */
128
+ async getAccessToken(credential) {
129
+ // 1. Token already present in credential
130
+ if (credential.accessToken)
131
+ return credential.accessToken;
132
+ // 2 & 3. Try the ADC credentials file
133
+ const adcPath = process.env.GOOGLE_APPLICATION_CREDENTIALS ??
134
+ join(homedir(), ".config", "gcloud", "application_default_credentials.json");
135
+ try {
136
+ const adc = JSON.parse(readFileSync(adcPath, "utf8"));
137
+ // 2a. Pre-issued access token (rare, but valid for some service accounts)
138
+ if (adc.access_token)
139
+ return adc.access_token;
140
+ // 2b. Refresh-token flow (typical after `gcloud auth application-default login`)
141
+ if (adc.refresh_token && adc.client_id && adc.client_secret) {
142
+ return await this.exchangeRefreshToken(adc.client_id, adc.client_secret, adc.refresh_token);
143
+ }
144
+ }
145
+ catch (err) {
146
+ if (err instanceof SyntaxError) {
147
+ console.warn(`Vertex AI: ADC file has invalid JSON: ${adcPath}`);
148
+ }
149
+ // ENOENT or other read errors — continue to CLI fallback
150
+ }
151
+ // 4. gcloud CLI fallback
152
+ return this.tokenFromGcloudCli();
153
+ }
154
+ /**
155
+ * Exchange a refresh token for a short-lived access token via Google OAuth2.
156
+ *
157
+ * @param clientId - OAuth2 client ID from the ADC file.
158
+ * @param clientSecret - OAuth2 client secret from the ADC file.
159
+ * @param refreshToken - Refresh token from the ADC file.
160
+ */
161
+ async exchangeRefreshToken(clientId, clientSecret, refreshToken) {
162
+ const body = new URLSearchParams({
163
+ client_id: clientId,
164
+ client_secret: clientSecret,
165
+ refresh_token: refreshToken,
166
+ grant_type: "refresh_token",
167
+ });
168
+ try {
169
+ const res = await fetch("https://oauth2.googleapis.com/token", {
170
+ method: "POST",
171
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
172
+ body: body.toString(),
173
+ });
174
+ if (!res.ok)
175
+ return undefined;
176
+ const data = (await res.json());
177
+ return data.access_token;
178
+ }
179
+ catch {
180
+ return undefined;
181
+ }
182
+ }
183
+ /**
184
+ * Obtain an access token by calling `gcloud auth print-access-token`.
185
+ * Returns `undefined` when the CLI is not installed or the command fails.
186
+ */
187
+ tokenFromGcloudCli() {
188
+ try {
189
+ const out = execSync("gcloud auth print-access-token", {
190
+ stdio: ["pipe", "pipe", "pipe"],
191
+ timeout: 8_000,
192
+ })
193
+ .toString()
194
+ .trim();
195
+ return out.length > 0 ? out : undefined;
196
+ }
197
+ catch {
198
+ return undefined;
199
+ }
200
+ }
201
+ // -------------------------------------------------------------------------
202
+ // Private: gcloud CLI model discovery
203
+ // -------------------------------------------------------------------------
204
+ /**
205
+ * Discover models by executing `gcloud ai models list` and parsing JSON output.
206
+ *
207
+ * @param projectId - GCP project ID passed as `--project`.
208
+ * @param region - GCP region passed as `--region`.
209
+ */
210
+ async discoverViaCli(projectId, region) {
211
+ try {
212
+ assertSafeShellArg(projectId, "projectId");
213
+ assertSafeShellArg(region, "region");
214
+ const raw = execFileSync("gcloud", ["ai", "models", "list", `--project=${projectId}`, `--region=${region}`, "--format=json"], { stdio: ["pipe", "pipe", "pipe"], timeout: 15_000 }).toString();
215
+ const models = JSON.parse(raw);
216
+ assertCleanPayload(models, "Vertex AI gcloud CLI");
217
+ if (!Array.isArray(models))
218
+ return [];
219
+ return models.map((m) => this.gcloudModelToCard(m, region, projectId));
220
+ }
221
+ catch (err) {
222
+ if (err instanceof SyntaxError) {
223
+ console.warn(`Vertex AI: gcloud CLI returned invalid JSON for region ${region}`);
224
+ }
225
+ return [];
226
+ }
227
+ }
228
+ /**
229
+ * Resolve a GCP project ID from the active `gcloud` configuration.
230
+ * Returns `undefined` when the CLI is unavailable or unconfigured.
231
+ */
232
+ resolveProjectFromCli() {
233
+ try {
234
+ const out = execSync("gcloud config get-value project", {
235
+ stdio: ["pipe", "pipe", "pipe"],
236
+ timeout: 5_000,
237
+ })
238
+ .toString()
239
+ .trim();
240
+ // gcloud prints "(unset)" when no project is configured
241
+ return out && out !== "(unset)" ? out : undefined;
242
+ }
243
+ catch {
244
+ return undefined;
245
+ }
246
+ }
247
+ // -------------------------------------------------------------------------
248
+ // Private: static fallback
249
+ // -------------------------------------------------------------------------
250
+ /**
251
+ * Return a curated list of well-known Vertex AI models (Feb 2026).
252
+ *
253
+ * Used when neither the REST API nor the gcloud CLI is accessible.
254
+ * All entries carry `source: "manual"` so consumers can distinguish them
255
+ * from live API data.
256
+ *
257
+ * @param region - Propagated to each card's `region` field.
258
+ * @param projectId - Propagated to each card's `projectId` field (may be undefined).
259
+ */
260
+ staticFallback(region, projectId) {
261
+ const base = { provider: "vertex", originProvider: "google", region, projectId, source: "manual" };
262
+ const geminiChat = (id, name, ctx, out) => this.makeCard({ ...base, id, name, mode: "chat", capabilities: ["chat", "vision", "function_calling", "code", "nlu"], contextWindow: ctx, maxOutputTokens: out });
263
+ return [
264
+ geminiChat("gemini-2.5-pro-preview-05-06", "Gemini 2.5 Pro Preview", 1_048_576, 65_536),
265
+ geminiChat("gemini-2.5-flash-preview-04-17", "Gemini 2.5 Flash Preview", 1_048_576, 8_192),
266
+ geminiChat("gemini-2.0-flash", "Gemini 2.0 Flash", 1_048_576, 8_192),
267
+ this.makeCard({ ...base, id: "text-embedding-005", name: "Text Embedding 005", mode: "embedding", capabilities: ["embedding"], contextWindow: 2_048, maxOutputTokens: 0 }),
268
+ this.makeCard({ ...base, id: "imagen-3.0-generate-002", name: "Imagen 3.0", mode: "image", capabilities: ["image_generation"], contextWindow: 0, maxOutputTokens: 0 }),
269
+ ];
270
+ }
271
+ // -------------------------------------------------------------------------
272
+ // Private: model → ModelCard converters
273
+ // -------------------------------------------------------------------------
274
+ /**
275
+ * Convert a Vertex AI REST API model object to a {@link ModelCard}.
276
+ *
277
+ * The `name` field is a full resource path such as
278
+ * `publishers/google/models/gemini-2.5-pro`; the prefix is stripped to
279
+ * obtain the bare model ID used in API calls.
280
+ *
281
+ * @param model - Raw Vertex API model entry.
282
+ * @param region - Region the model was fetched from.
283
+ * @param projectId - GCP project ID.
284
+ */
285
+ toModelCard(model, region, projectId) {
286
+ const id = model.name.replace(/^.*\/models\//, "");
287
+ const actions = model.supportedActions ?? [];
288
+ return this.makeCard({
289
+ id,
290
+ name: model.displayName ?? id,
291
+ provider: "vertex",
292
+ originProvider: "google",
293
+ mode: this.inferMode(id, actions),
294
+ capabilities: this.inferCapabilities(id, actions),
295
+ contextWindow: 0,
296
+ maxOutputTokens: 0,
297
+ region,
298
+ projectId,
299
+ source: "api",
300
+ });
301
+ }
302
+ /**
303
+ * Convert a `gcloud ai models list` JSON entry to a {@link ModelCard}.
304
+ *
305
+ * gcloud returns full resource names such as
306
+ * `projects/{p}/locations/{r}/models/{id}` — we take only the last segment.
307
+ *
308
+ * @param model - Raw gcloud JSON model entry.
309
+ * @param region - Region used for the gcloud query.
310
+ * @param projectId - GCP project ID.
311
+ */
312
+ gcloudModelToCard(model, region, projectId) {
313
+ const id = model.name.split("/").pop() ?? model.name;
314
+ return this.makeCard({
315
+ id,
316
+ name: model.displayName ?? id,
317
+ provider: "vertex",
318
+ originProvider: "google",
319
+ mode: this.inferMode(id, []),
320
+ capabilities: this.inferCapabilities(id, []),
321
+ contextWindow: 0,
322
+ maxOutputTokens: 0,
323
+ region,
324
+ projectId,
325
+ source: "manual",
326
+ });
327
+ }
328
+ // -------------------------------------------------------------------------
329
+ // Private: capability / mode inference
330
+ // -------------------------------------------------------------------------
331
+ /**
332
+ * Determine the primary {@link ModelMode} from a model ID and its
333
+ * supported actions list.
334
+ *
335
+ * @param id - Bare model ID.
336
+ * @param actions - `supportedActions` array from the API response.
337
+ */
338
+ inferMode(id, actions) {
339
+ const lower = id.toLowerCase();
340
+ if (actions.includes("embedContent") || lower.includes("embedding") || lower.includes("embed"))
341
+ return "embedding";
342
+ if (lower.includes("imagen") || lower.includes("image"))
343
+ return "image";
344
+ return "chat";
345
+ }
346
+ /**
347
+ * Infer capability flags from a model ID and its supported actions.
348
+ *
349
+ * Gemini pro/flash/ultra variants receive vision + function_calling because
350
+ * all modern Gemini editions support multimodal input and tool use.
351
+ *
352
+ * @param id - Bare model ID.
353
+ * @param actions - `supportedActions` from the API response.
354
+ */
355
+ inferCapabilities(id, actions) {
356
+ const lower = id.toLowerCase();
357
+ if (actions.includes("embedContent") || lower.includes("embedding") || lower.includes("embed"))
358
+ return ["embedding"];
359
+ if (lower.includes("imagen") || lower.includes("image"))
360
+ return ["image_generation"];
361
+ if (lower.includes("gemini")) {
362
+ const caps = ["chat", "code", "nlu"];
363
+ if (lower.includes("pro") || lower.includes("flash") || lower.includes("ultra")) {
364
+ caps.push("vision", "function_calling");
365
+ }
366
+ return caps;
367
+ }
368
+ return ["chat"];
369
+ }
370
+ }
371
+ //# sourceMappingURL=vertex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vertex.js","sourceRoot":"","sources":["../../src/discovery/vertex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * kosha-discovery — Z.AI provider discoverer.
3
+ *
4
+ * Z.AI exposes an OpenAI-compatible API surface.
5
+ * @module
6
+ */
7
+ import type { OpenAICompatibleModel, ModelClassification } from "./openai-compatible.js";
8
+ import { OpenAICompatibleDiscoverer } from "./openai-compatible.js";
9
+ export declare class ZAIDiscoverer extends OpenAICompatibleDiscoverer {
10
+ readonly providerId = "zai";
11
+ readonly providerName = "Z.AI";
12
+ readonly baseUrl = "https://api.z.ai/api/paas/v4";
13
+ protected modelListEndpoints(): string[];
14
+ protected isRelevantModel(model: OpenAICompatibleModel): boolean;
15
+ protected classifyModel(model: OpenAICompatibleModel): ModelClassification;
16
+ }
17
+ //# sourceMappingURL=zai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zai.d.ts","sourceRoot":"","sources":["../../src/discovery/zai.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AACzF,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AAEpE,qBAAa,aAAc,SAAQ,0BAA0B;IAC5D,QAAQ,CAAC,UAAU,SAAS;IAC5B,QAAQ,CAAC,YAAY,UAAU;IAC/B,QAAQ,CAAC,OAAO,kCAAkC;IAElD,SAAS,CAAC,kBAAkB,IAAI,MAAM,EAAE;IAOxC,SAAS,CAAC,eAAe,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO;IAIhE,SAAS,CAAC,aAAa,CAAC,KAAK,EAAE,qBAAqB,GAAG,mBAAmB;CA6B1E"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * kosha-discovery — Z.AI provider discoverer.
3
+ *
4
+ * Z.AI exposes an OpenAI-compatible API surface.
5
+ * @module
6
+ */
7
+ import { OpenAICompatibleDiscoverer } from "./openai-compatible.js";
8
+ export class ZAIDiscoverer extends OpenAICompatibleDiscoverer {
9
+ providerId = "zai";
10
+ providerName = "Z.AI";
11
+ baseUrl = "https://api.z.ai/api/paas/v4";
12
+ modelListEndpoints() {
13
+ return [
14
+ `${this.baseUrl}/models`,
15
+ `${this.baseUrl}/v1/models`,
16
+ ];
17
+ }
18
+ isRelevantModel(model) {
19
+ return !model.id.startsWith("ft:");
20
+ }
21
+ classifyModel(model) {
22
+ const lower = model.id.toLowerCase();
23
+ if (this.looksLikeEmbedding(lower) || lower.includes("embedding")) {
24
+ return {
25
+ originProvider: "zai",
26
+ mode: "embedding",
27
+ capabilities: ["embedding"],
28
+ contextWindow: model.context_window,
29
+ maxOutputTokens: model.max_output_tokens,
30
+ maxInputTokens: model.max_input_tokens,
31
+ dimensions: model.output_vector_size,
32
+ };
33
+ }
34
+ const capabilities = ["chat", "function_calling"];
35
+ if (this.looksLikeVision(lower))
36
+ capabilities.push("vision");
37
+ if (this.looksLikeCode(lower))
38
+ capabilities.push("code");
39
+ if (lower.includes("reason") || lower.includes("thinking"))
40
+ capabilities.push("nlu");
41
+ return {
42
+ originProvider: "zai",
43
+ mode: "chat",
44
+ capabilities,
45
+ contextWindow: model.context_window,
46
+ maxOutputTokens: model.max_output_tokens,
47
+ maxInputTokens: model.max_input_tokens,
48
+ };
49
+ }
50
+ }
51
+ //# sourceMappingURL=zai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zai.js","sourceRoot":"","sources":["../../src/discovery/zai.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AAEpE,MAAM,OAAO,aAAc,SAAQ,0BAA0B;IACnD,UAAU,GAAG,KAAK,CAAC;IACnB,YAAY,GAAG,MAAM,CAAC;IACtB,OAAO,GAAG,8BAA8B,CAAC;IAExC,kBAAkB;QAC3B,OAAO;YACN,GAAG,IAAI,CAAC,OAAO,SAAS;YACxB,GAAG,IAAI,CAAC,OAAO,YAAY;SAC3B,CAAC;IACH,CAAC;IAES,eAAe,CAAC,KAA4B;QACrD,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAES,aAAa,CAAC,KAA4B;QACnD,MAAM,KAAK,GAAG,KAAK,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;QAErC,IAAI,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACnE,OAAO;gBACN,cAAc,EAAE,KAAK;gBACrB,IAAI,EAAE,WAAW;gBACjB,YAAY,EAAE,CAAC,WAAW,CAAC;gBAC3B,aAAa,EAAE,KAAK,CAAC,cAAc;gBACnC,eAAe,EAAE,KAAK,CAAC,iBAAiB;gBACxC,cAAc,EAAE,KAAK,CAAC,gBAAgB;gBACtC,UAAU,EAAE,KAAK,CAAC,kBAAkB;aACpC,CAAC;QACH,CAAC;QAED,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;QAClD,IAAI,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;YAAE,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7D,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;YAAE,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzD,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC;YAAE,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAErF,OAAO;YACN,cAAc,EAAE,KAAK;YACrB,IAAI,EAAE,MAAM;YACZ,YAAY;YACZ,aAAa,EAAE,KAAK,CAAC,cAAc;YACnC,eAAe,EAAE,KAAK,CAAC,iBAAiB;YACxC,cAAc,EAAE,KAAK,CAAC,gBAAgB;SACtC,CAAC;IACH,CAAC;CACD"}
@@ -0,0 +1,186 @@
1
+ /**
2
+ * kosha-discovery — Versioned discovery contract helpers.
3
+ *
4
+ * I keep the v1 schema, trusted capability taxonomy, and lightweight
5
+ * heuristics here so the registry can stay focused on orchestration.
6
+ * @module
7
+ */
8
+ import type { ModelCard, ModelPricing } from "./types.js";
9
+ import type { ProviderDescriptor } from "./provider-catalog.js";
10
+ /** Stable schema version exposed to Chitragupta and other daemon consumers. */
11
+ export declare const DISCOVERY_SCHEMA_VERSION = 1;
12
+ /** Trusted capability taxonomy surfaced by the v1 discovery contract. */
13
+ export type TrustedCapability = "chat" | "function_calling" | "embeddings" | "vision" | "rerank" | "structured_output" | "streaming" | "long_context" | "local_exec" | "code_generation" | "reasoning" | "low_latency" | "cheap_inference";
14
+ /** Normalized role hints exposed by the v1 schema. */
15
+ export interface DiscoveryRoleDefinition {
16
+ /** Stable role identifier. */
17
+ roleId: string;
18
+ /** Capabilities required for the role to be viable. */
19
+ requiredCapabilities: TrustedCapability[];
20
+ /** Capabilities that improve suitability but are not mandatory. */
21
+ preferredCapabilities: TrustedCapability[];
22
+ /** Short human-readable hint for consumers. */
23
+ suitabilityHint: string;
24
+ }
25
+ /** Credential prompt shape exposed in the v1 schema. */
26
+ export interface DiscoveryCredentialPrompt {
27
+ providerId: string;
28
+ providerName: string;
29
+ required: boolean;
30
+ envVars: string[];
31
+ message: string;
32
+ }
33
+ /** Stable provider shape emitted by the v1 discovery snapshot. */
34
+ export interface DiscoveryProviderV1 {
35
+ providerId: string;
36
+ canonicalProviderId: string;
37
+ aliases: string[];
38
+ name: string;
39
+ origin: string;
40
+ isLocal: boolean;
41
+ transport: string;
42
+ authenticated: boolean;
43
+ credentialSource: string | null;
44
+ credentialsPresent: boolean;
45
+ credentialsRequired: boolean;
46
+ credentialEnvVars: string[];
47
+ modelCount: number;
48
+ lastRefreshed: number | null;
49
+ baseUrl: string;
50
+ }
51
+ /** Stable model shape emitted by the v1 discovery snapshot. */
52
+ export interface DiscoveryModelV1 {
53
+ key: string;
54
+ modelId: string;
55
+ name: string;
56
+ providerId: string;
57
+ canonicalProviderId: string;
58
+ originProviderId: string;
59
+ mode: string;
60
+ capabilities: TrustedCapability[];
61
+ rawCapabilities: string[];
62
+ contextWindow: number | null;
63
+ maxOutputTokens: number | null;
64
+ pricing: ModelPricing | null;
65
+ dimensions: number | null;
66
+ maxInputTokens: number | null;
67
+ discoveredAt: number;
68
+ source: string;
69
+ aliases: string[];
70
+ region: string | null;
71
+ projectId: string | null;
72
+ runtimeFamily: string | null;
73
+ tokenizerFamily: string | null;
74
+ quantization: string | null;
75
+ memoryFootprintBytes: number | null;
76
+ computeTarget: string | null;
77
+ supportsStructuredOutput: boolean | null;
78
+ supportsStreaming: boolean | null;
79
+ }
80
+ /** Normalized provider health exposed by the v1 discovery snapshot. */
81
+ export interface DiscoveryHealthRecord {
82
+ providerId: string;
83
+ state: "healthy" | "degraded" | "down" | "auth_error" | "throttled" | "unknown";
84
+ failureCount: number;
85
+ lastError: string | null;
86
+ lastSuccessAt: number | null;
87
+ lastFailureAt: number | null;
88
+ latencyClass: "low" | "medium" | "high" | "timeout" | "unknown";
89
+ timeoutRate: number;
90
+ rateLimitState: "ok" | "throttled" | "unknown";
91
+ circuitState: "closed" | "open" | "half-open";
92
+ }
93
+ /** Full v1 discovery snapshot. */
94
+ export interface DiscoverySnapshotV1 {
95
+ schemaVersion: number;
96
+ discoveredAt: number | null;
97
+ cursor: string;
98
+ providers: DiscoveryProviderV1[];
99
+ models: DiscoveryModelV1[];
100
+ roles: DiscoveryRoleDefinition[];
101
+ health: DiscoveryHealthRecord[];
102
+ credentialPrompts: DiscoveryCredentialPrompt[];
103
+ }
104
+ /** Entity kinds that can appear in a delta stream. */
105
+ export type DiscoveryChangeEntity = "provider" | "model" | "health" | "credential_prompt";
106
+ /** Individual change item inside a delta batch. */
107
+ export interface DiscoveryChangeV1 {
108
+ entity: DiscoveryChangeEntity;
109
+ action: "upsert" | "remove";
110
+ key: string;
111
+ value: DiscoveryProviderV1 | DiscoveryModelV1 | DiscoveryHealthRecord | DiscoveryCredentialPrompt | null;
112
+ }
113
+ /** Aggregate delta response used by polling and live watch. */
114
+ export interface DiscoveryDeltaV1 {
115
+ schemaVersion: number;
116
+ sinceCursor: string | null;
117
+ cursor: string;
118
+ changedAt: number | null;
119
+ resetRequired: boolean;
120
+ changes: DiscoveryChangeV1[];
121
+ }
122
+ /** Stable cheapest-candidate match used by the v1 debug/library surface. */
123
+ export interface DiscoveryCheapestCandidateV1 {
124
+ modelId: string;
125
+ providerId: string;
126
+ canonicalProviderId: string;
127
+ score: number | null;
128
+ priceMetric: string;
129
+ capabilities: TrustedCapability[];
130
+ }
131
+ /** Cheapest-candidate response for a normalized query. */
132
+ export interface DiscoveryCheapestResultV1 {
133
+ schemaVersion: number;
134
+ query: Record<string, string | number | boolean | null>;
135
+ candidates: number;
136
+ pricedCandidates: number;
137
+ skippedNoPricing: number;
138
+ priceMetric: string;
139
+ matches: DiscoveryCheapestCandidateV1[];
140
+ }
141
+ /** Binding query used by the additive v1 selection-hints surface. */
142
+ export interface DiscoveryBindingQuery {
143
+ role?: string;
144
+ capability?: string;
145
+ provider?: string;
146
+ originProvider?: string;
147
+ mode?: string;
148
+ limit?: number;
149
+ priceMetric?: string;
150
+ preferLocalProviders?: boolean;
151
+ allowCrossProvider?: boolean;
152
+ }
153
+ /** Query-scoped discovery hints used to build Chitragupta bindings. */
154
+ export interface DiscoveryBindingHintsV1 {
155
+ schemaVersion: number;
156
+ query: Record<string, string | number | boolean | null>;
157
+ selectedModelId: string | null;
158
+ selectedProviderId: string | null;
159
+ candidateModelIds: string[];
160
+ preferredModelIds: string[];
161
+ preferredProviderIds: string[];
162
+ preferLocalProviders: boolean;
163
+ allowCrossProvider: boolean;
164
+ }
165
+ /** Stable role definitions shipped with the v1 schema. */
166
+ export declare const DISCOVERY_ROLE_DEFINITIONS: readonly DiscoveryRoleDefinition[];
167
+ /**
168
+ * Build a stable composite key for a model route.
169
+ */
170
+ export declare function makeModelKey(model: Pick<ModelCard, "provider" | "id">, descriptor: ProviderDescriptor): string;
171
+ /**
172
+ * Return the raw capability list that a discoverer originally emitted.
173
+ */
174
+ export declare function rawCapabilitiesForModel(model: ModelCard): string[];
175
+ /**
176
+ * Normalize free-form model metadata into the trusted capability taxonomy.
177
+ *
178
+ * I keep the heuristics intentionally conservative. When I cannot infer a
179
+ * capability with reasonable confidence, I leave it out of the trusted set.
180
+ */
181
+ export declare function trustedCapabilitiesForModel(model: ModelCard, descriptor: ProviderDescriptor): TrustedCapability[];
182
+ /**
183
+ * Return stable role definitions for the v1 snapshot.
184
+ */
185
+ export declare function discoveryRoles(): DiscoveryRoleDefinition[];
186
+ //# sourceMappingURL=discovery-contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery-contract.d.ts","sourceRoot":"","sources":["../src/discovery-contract.ts"],"names":[],"mappings":"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"}