@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.
- package/LICENSE +21 -0
- package/README.md +286 -0
- package/dist/aliases.d.ts +51 -0
- package/dist/aliases.d.ts.map +1 -0
- package/dist/aliases.js +115 -0
- package/dist/aliases.js.map +1 -0
- package/dist/cache.d.ts +57 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +123 -0
- package/dist/cache.js.map +1 -0
- package/dist/cli-commands.d.ts +142 -0
- package/dist/cli-commands.d.ts.map +1 -0
- package/dist/cli-commands.js +746 -0
- package/dist/cli-commands.js.map +1 -0
- package/dist/cli-format.d.ts +119 -0
- package/dist/cli-format.d.ts.map +1 -0
- package/dist/cli-format.js +171 -0
- package/dist/cli-format.js.map +1 -0
- package/dist/cli.d.ts +15 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +143 -0
- package/dist/cli.js.map +1 -0
- package/dist/credentials/index.d.ts +2 -0
- package/dist/credentials/index.d.ts.map +1 -0
- package/dist/credentials/index.js +2 -0
- package/dist/credentials/index.js.map +1 -0
- package/dist/credentials/resolver.d.ts +170 -0
- package/dist/credentials/resolver.d.ts.map +1 -0
- package/dist/credentials/resolver.js +597 -0
- package/dist/credentials/resolver.js.map +1 -0
- package/dist/discovery/anthropic.d.ts +49 -0
- package/dist/discovery/anthropic.d.ts.map +1 -0
- package/dist/discovery/anthropic.js +101 -0
- package/dist/discovery/anthropic.js.map +1 -0
- package/dist/discovery/base.d.ts +59 -0
- package/dist/discovery/base.d.ts.map +1 -0
- package/dist/discovery/base.js +123 -0
- package/dist/discovery/base.js.map +1 -0
- package/dist/discovery/bedrock.d.ts +122 -0
- package/dist/discovery/bedrock.d.ts.map +1 -0
- package/dist/discovery/bedrock.js +356 -0
- package/dist/discovery/bedrock.js.map +1 -0
- package/dist/discovery/cerebras.d.ts +43 -0
- package/dist/discovery/cerebras.d.ts.map +1 -0
- package/dist/discovery/cerebras.js +65 -0
- package/dist/discovery/cerebras.js.map +1 -0
- package/dist/discovery/cohere.d.ts +57 -0
- package/dist/discovery/cohere.d.ts.map +1 -0
- package/dist/discovery/cohere.js +82 -0
- package/dist/discovery/cohere.js.map +1 -0
- package/dist/discovery/deepinfra.d.ts +41 -0
- package/dist/discovery/deepinfra.d.ts.map +1 -0
- package/dist/discovery/deepinfra.js +86 -0
- package/dist/discovery/deepinfra.js.map +1 -0
- package/dist/discovery/deepseek.d.ts +17 -0
- package/dist/discovery/deepseek.d.ts.map +1 -0
- package/dist/discovery/deepseek.js +45 -0
- package/dist/discovery/deepseek.js.map +1 -0
- package/dist/discovery/fireworks.d.ts +48 -0
- package/dist/discovery/fireworks.d.ts.map +1 -0
- package/dist/discovery/fireworks.js +101 -0
- package/dist/discovery/fireworks.js.map +1 -0
- package/dist/discovery/glm.d.ts +17 -0
- package/dist/discovery/glm.d.ts.map +1 -0
- package/dist/discovery/glm.js +52 -0
- package/dist/discovery/glm.js.map +1 -0
- package/dist/discovery/google.d.ts +53 -0
- package/dist/discovery/google.d.ts.map +1 -0
- package/dist/discovery/google.js +122 -0
- package/dist/discovery/google.js.map +1 -0
- package/dist/discovery/groq.d.ts +44 -0
- package/dist/discovery/groq.d.ts.map +1 -0
- package/dist/discovery/groq.js +89 -0
- package/dist/discovery/groq.js.map +1 -0
- package/dist/discovery/index.d.ts +48 -0
- package/dist/discovery/index.d.ts.map +1 -0
- package/dist/discovery/index.js +116 -0
- package/dist/discovery/index.js.map +1 -0
- package/dist/discovery/llama-cpp.d.ts +45 -0
- package/dist/discovery/llama-cpp.d.ts.map +1 -0
- package/dist/discovery/llama-cpp.js +137 -0
- package/dist/discovery/llama-cpp.js.map +1 -0
- package/dist/discovery/minimax.d.ts +16 -0
- package/dist/discovery/minimax.d.ts.map +1 -0
- package/dist/discovery/minimax.js +56 -0
- package/dist/discovery/minimax.js.map +1 -0
- package/dist/discovery/mistral.d.ts +45 -0
- package/dist/discovery/mistral.d.ts.map +1 -0
- package/dist/discovery/mistral.js +82 -0
- package/dist/discovery/mistral.js.map +1 -0
- package/dist/discovery/moonshot.d.ts +16 -0
- package/dist/discovery/moonshot.d.ts.map +1 -0
- package/dist/discovery/moonshot.js +46 -0
- package/dist/discovery/moonshot.js.map +1 -0
- package/dist/discovery/nvidia.d.ts +60 -0
- package/dist/discovery/nvidia.d.ts.map +1 -0
- package/dist/discovery/nvidia.js +145 -0
- package/dist/discovery/nvidia.js.map +1 -0
- package/dist/discovery/ollama.d.ts +57 -0
- package/dist/discovery/ollama.d.ts.map +1 -0
- package/dist/discovery/ollama.js +151 -0
- package/dist/discovery/ollama.js.map +1 -0
- package/dist/discovery/openai-compatible.d.ts +126 -0
- package/dist/discovery/openai-compatible.d.ts.map +1 -0
- package/dist/discovery/openai-compatible.js +161 -0
- package/dist/discovery/openai-compatible.js.map +1 -0
- package/dist/discovery/openai.d.ts +62 -0
- package/dist/discovery/openai.d.ts.map +1 -0
- package/dist/discovery/openai.js +157 -0
- package/dist/discovery/openai.js.map +1 -0
- package/dist/discovery/openrouter.d.ts +78 -0
- package/dist/discovery/openrouter.d.ts.map +1 -0
- package/dist/discovery/openrouter.js +184 -0
- package/dist/discovery/openrouter.js.map +1 -0
- package/dist/discovery/perplexity.d.ts +66 -0
- package/dist/discovery/perplexity.d.ts.map +1 -0
- package/dist/discovery/perplexity.js +86 -0
- package/dist/discovery/perplexity.js.map +1 -0
- package/dist/discovery/together.d.ts +41 -0
- package/dist/discovery/together.d.ts.map +1 -0
- package/dist/discovery/together.js +88 -0
- package/dist/discovery/together.js.map +1 -0
- package/dist/discovery/vertex.d.ts +146 -0
- package/dist/discovery/vertex.d.ts.map +1 -0
- package/dist/discovery/vertex.js +371 -0
- package/dist/discovery/vertex.js.map +1 -0
- package/dist/discovery/zai.d.ts +17 -0
- package/dist/discovery/zai.d.ts.map +1 -0
- package/dist/discovery/zai.js +51 -0
- package/dist/discovery/zai.js.map +1 -0
- package/dist/discovery-contract.d.ts +186 -0
- package/dist/discovery-contract.d.ts.map +1 -0
- package/dist/discovery-contract.js +115 -0
- package/dist/discovery-contract.js.map +1 -0
- package/dist/discovery-routes.d.ts +14 -0
- package/dist/discovery-routes.d.ts.map +1 -0
- package/dist/discovery-routes.js +98 -0
- package/dist/discovery-routes.js.map +1 -0
- package/dist/enrichment/index.d.ts +2 -0
- package/dist/enrichment/index.d.ts.map +1 -0
- package/dist/enrichment/index.js +2 -0
- package/dist/enrichment/index.js.map +1 -0
- package/dist/enrichment/litellm.d.ts +52 -0
- package/dist/enrichment/litellm.d.ts.map +1 -0
- package/dist/enrichment/litellm.js +205 -0
- package/dist/enrichment/litellm.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/normalize.d.ts +64 -0
- package/dist/normalize.d.ts.map +1 -0
- package/dist/normalize.js +166 -0
- package/dist/normalize.js.map +1 -0
- package/dist/provider-catalog.d.ts +62 -0
- package/dist/provider-catalog.d.ts.map +1 -0
- package/dist/provider-catalog.js +331 -0
- package/dist/provider-catalog.js.map +1 -0
- package/dist/registry-delta.d.ts +17 -0
- package/dist/registry-delta.d.ts.map +1 -0
- package/dist/registry-delta.js +74 -0
- package/dist/registry-delta.js.map +1 -0
- package/dist/registry-discovery.d.ts +66 -0
- package/dist/registry-discovery.d.ts.map +1 -0
- package/dist/registry-discovery.js +339 -0
- package/dist/registry-discovery.js.map +1 -0
- package/dist/registry-query.d.ts +74 -0
- package/dist/registry-query.d.ts.map +1 -0
- package/dist/registry-query.js +310 -0
- package/dist/registry-query.js.map +1 -0
- package/dist/registry-runtime.d.ts +48 -0
- package/dist/registry-runtime.d.ts.map +1 -0
- package/dist/registry-runtime.js +255 -0
- package/dist/registry-runtime.js.map +1 -0
- package/dist/registry-selection.d.ts +31 -0
- package/dist/registry-selection.d.ts.map +1 -0
- package/dist/registry-selection.js +167 -0
- package/dist/registry-selection.js.map +1 -0
- package/dist/registry-state.d.ts +92 -0
- package/dist/registry-state.d.ts.map +1 -0
- package/dist/registry-state.js +35 -0
- package/dist/registry-state.js.map +1 -0
- package/dist/registry.d.ts +127 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +248 -0
- package/dist/registry.js.map +1 -0
- package/dist/resilience.d.ts +212 -0
- package/dist/resilience.d.ts.map +1 -0
- package/dist/resilience.js +292 -0
- package/dist/resilience.js.map +1 -0
- package/dist/security.d.ts +44 -0
- package/dist/security.d.ts.map +1 -0
- package/dist/security.js +184 -0
- package/dist/security.js.map +1 -0
- package/dist/server.d.ts +41 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +320 -0
- package/dist/server.js.map +1 -0
- package/dist/shell-safe.d.ts +15 -0
- package/dist/shell-safe.d.ts.map +1 -0
- package/dist/shell-safe.js +20 -0
- package/dist/shell-safe.js.map +1 -0
- package/dist/types.d.ts +365 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/logo.svg +81 -0
- 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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"}
|