@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,597 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kosha-discovery — Multi-source credential resolver.
|
|
3
|
+
*
|
|
4
|
+
* Implements a layered search strategy to locate API keys and
|
|
5
|
+
* access tokens for each supported provider. The search hierarchy is:
|
|
6
|
+
*
|
|
7
|
+
* 1. **Explicit config** — key passed directly via `KoshaConfig.providers`
|
|
8
|
+
* 2. **Environment variables** — e.g. `ANTHROPIC_API_KEY`, `OPENAI_API_KEY`
|
|
9
|
+
* 3. **CLI tool credential files** — Claude CLI, Copilot, Codex, Gemini CLI
|
|
10
|
+
* 4. **Config / OAuth files** — `~/.config/*`, gcloud ADC, `~/.aws/*`
|
|
11
|
+
* 5. **CLI subprocess** — `gcloud auth print-access-token` etc.
|
|
12
|
+
*
|
|
13
|
+
* The resolver returns the **first** credential found and never throws.
|
|
14
|
+
* If nothing is found, `{ source: "none" }` is returned.
|
|
15
|
+
* @module
|
|
16
|
+
*/
|
|
17
|
+
import { execSync } from "child_process";
|
|
18
|
+
import { readFile } from "fs/promises";
|
|
19
|
+
import { homedir, platform } from "os";
|
|
20
|
+
import { join } from "path";
|
|
21
|
+
import { normalizeProviderId } from "../provider-catalog.js";
|
|
22
|
+
/**
|
|
23
|
+
* Multi-source credential resolver for AI providers.
|
|
24
|
+
*
|
|
25
|
+
* Resolution priority per provider:
|
|
26
|
+
* 1. Explicit config key (passed programmatically)
|
|
27
|
+
* 2. Environment variables
|
|
28
|
+
* 3. CLI tool credential files (Claude CLI, Copilot, Gemini CLI, etc.)
|
|
29
|
+
* 4. Config / OAuth files (~/.config/*)
|
|
30
|
+
*
|
|
31
|
+
* Always returns a {@link CredentialResult}; never throws.
|
|
32
|
+
*/
|
|
33
|
+
export class CredentialResolver {
|
|
34
|
+
home = homedir();
|
|
35
|
+
isWindows = platform() === "win32";
|
|
36
|
+
/**
|
|
37
|
+
* Resolve credentials for the given provider.
|
|
38
|
+
*
|
|
39
|
+
* @param providerId - Provider slug (e.g. "anthropic", "openai").
|
|
40
|
+
* @param explicitKey - Optional API key passed from user config; takes
|
|
41
|
+
* highest precedence when provided.
|
|
42
|
+
* @returns The first credential found, or `{ source: "none" }`.
|
|
43
|
+
*/
|
|
44
|
+
async resolve(providerId, explicitKey) {
|
|
45
|
+
switch (normalizeProviderId(providerId) ?? providerId) {
|
|
46
|
+
case "anthropic":
|
|
47
|
+
return this.resolveAnthropic(explicitKey);
|
|
48
|
+
case "openai":
|
|
49
|
+
return this.resolveOpenAI(explicitKey);
|
|
50
|
+
case "google":
|
|
51
|
+
case "gemini":
|
|
52
|
+
return this.resolveGoogle(explicitKey);
|
|
53
|
+
case "openrouter":
|
|
54
|
+
return this.resolveOpenRouter(explicitKey);
|
|
55
|
+
case "ollama":
|
|
56
|
+
case "llama.cpp":
|
|
57
|
+
return this.resolveOllama();
|
|
58
|
+
case "bedrock":
|
|
59
|
+
return this.resolveBedrockCredential(explicitKey);
|
|
60
|
+
case "vertex":
|
|
61
|
+
return this.resolveVertexCredential(explicitKey);
|
|
62
|
+
case "nvidia":
|
|
63
|
+
return this.resolveNvidia(explicitKey);
|
|
64
|
+
case "together":
|
|
65
|
+
return this.resolveSimpleEnvKey(explicitKey, "TOGETHER_API_KEY");
|
|
66
|
+
case "fireworks":
|
|
67
|
+
return this.resolveSimpleEnvKey(explicitKey, "FIREWORKS_API_KEY");
|
|
68
|
+
case "groq":
|
|
69
|
+
return this.resolveSimpleEnvKey(explicitKey, "GROQ_API_KEY");
|
|
70
|
+
case "mistral":
|
|
71
|
+
return this.resolveSimpleEnvKey(explicitKey, "MISTRAL_API_KEY");
|
|
72
|
+
case "deepinfra":
|
|
73
|
+
return this.resolveSimpleEnvKey(explicitKey, "DEEPINFRA_API_KEY");
|
|
74
|
+
case "cohere":
|
|
75
|
+
return this.resolveSimpleEnvKey(explicitKey, "CO_API_KEY");
|
|
76
|
+
case "cerebras":
|
|
77
|
+
return this.resolveSimpleEnvKey(explicitKey, "CEREBRAS_API_KEY");
|
|
78
|
+
case "perplexity":
|
|
79
|
+
return this.resolveSimpleEnvKey(explicitKey, "PERPLEXITY_API_KEY");
|
|
80
|
+
case "deepseek":
|
|
81
|
+
return this.resolveSimpleEnvKey(explicitKey, "DEEPSEEK_API_KEY");
|
|
82
|
+
case "moonshot":
|
|
83
|
+
return this.resolveMultiEnvKey(explicitKey, ["MOONSHOT_API_KEY", "KIMI_API_KEY"]);
|
|
84
|
+
case "glm":
|
|
85
|
+
return this.resolveMultiEnvKey(explicitKey, ["GLM_API_KEY", "ZHIPUAI_API_KEY"]);
|
|
86
|
+
case "zai":
|
|
87
|
+
return this.resolveSimpleEnvKey(explicitKey, "ZAI_API_KEY");
|
|
88
|
+
case "minimax":
|
|
89
|
+
return this.resolveSimpleEnvKey(explicitKey, "MINIMAX_API_KEY");
|
|
90
|
+
default:
|
|
91
|
+
return { source: "none" };
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// ---------------------------------------------------------------------------
|
|
95
|
+
// Anthropic
|
|
96
|
+
// ---------------------------------------------------------------------------
|
|
97
|
+
/**
|
|
98
|
+
* Search hierarchy for Anthropic credentials:
|
|
99
|
+
* 1. Explicit config key
|
|
100
|
+
* 2. `ANTHROPIC_API_KEY` env var
|
|
101
|
+
* 3. `~/.claude.json` (Claude CLI)
|
|
102
|
+
* 4. `~/.config/claude/settings.json` (Claude CLI settings)
|
|
103
|
+
* 5. `~/.claude/credentials.json` (Claude CLI OAuth)
|
|
104
|
+
* 6. `~/.codex/auth.json` (Codex CLI — stores Anthropic keys)
|
|
105
|
+
*/
|
|
106
|
+
async resolveAnthropic(explicitKey) {
|
|
107
|
+
// 1. Explicit config key
|
|
108
|
+
if (explicitKey) {
|
|
109
|
+
return { apiKey: explicitKey, source: "config" };
|
|
110
|
+
}
|
|
111
|
+
// 2. Environment variable
|
|
112
|
+
const envKey = process.env.ANTHROPIC_API_KEY;
|
|
113
|
+
if (envKey) {
|
|
114
|
+
return { apiKey: envKey, source: "env" };
|
|
115
|
+
}
|
|
116
|
+
// 3. Claude CLI config — ~/.claude.json
|
|
117
|
+
const claudeJson = await this.readJson(join(this.home, ".claude.json"));
|
|
118
|
+
if (claudeJson?.apiKey) {
|
|
119
|
+
return { apiKey: claudeJson.apiKey, source: "cli", path: join(this.home, ".claude.json") };
|
|
120
|
+
}
|
|
121
|
+
// 4. Claude CLI settings — ~/.config/claude/settings.json
|
|
122
|
+
const claudeSettings = await this.readJson(join(this.home, ".config", "claude", "settings.json"));
|
|
123
|
+
if (claudeSettings?.apiKey) {
|
|
124
|
+
return {
|
|
125
|
+
apiKey: claudeSettings.apiKey,
|
|
126
|
+
source: "cli",
|
|
127
|
+
path: join(this.home, ".config", "claude", "settings.json"),
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
// 5. Claude CLI OAuth — ~/.claude/credentials.json
|
|
131
|
+
const claudeOAuth = await this.readJson(join(this.home, ".claude", "credentials.json"));
|
|
132
|
+
if (claudeOAuth?.accessToken) {
|
|
133
|
+
return {
|
|
134
|
+
accessToken: claudeOAuth.accessToken,
|
|
135
|
+
source: "oauth",
|
|
136
|
+
path: join(this.home, ".claude", "credentials.json"),
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
// 6. Codex CLI — ~/.codex/auth.json
|
|
140
|
+
const codexAuth = await this.readJson(join(this.home, ".codex", "auth.json"));
|
|
141
|
+
if (codexAuth?.anthropic) {
|
|
142
|
+
return { apiKey: codexAuth.anthropic, source: "cli", path: join(this.home, ".codex", "auth.json") };
|
|
143
|
+
}
|
|
144
|
+
return { source: "none" };
|
|
145
|
+
}
|
|
146
|
+
// ---------------------------------------------------------------------------
|
|
147
|
+
// OpenAI
|
|
148
|
+
// ---------------------------------------------------------------------------
|
|
149
|
+
/**
|
|
150
|
+
* Search hierarchy for OpenAI credentials:
|
|
151
|
+
* 1. Explicit config key
|
|
152
|
+
* 2. `OPENAI_API_KEY` env var
|
|
153
|
+
* 3. GitHub Copilot `hosts.json` (contains an OAuth token usable with OpenAI-compatible APIs)
|
|
154
|
+
* 4. GitHub Copilot `apps.json` (alternative credential location)
|
|
155
|
+
*/
|
|
156
|
+
async resolveOpenAI(explicitKey) {
|
|
157
|
+
// 1. Explicit config key
|
|
158
|
+
if (explicitKey) {
|
|
159
|
+
return { apiKey: explicitKey, source: "config" };
|
|
160
|
+
}
|
|
161
|
+
// 2. Environment variable
|
|
162
|
+
const envKey = process.env.OPENAI_API_KEY;
|
|
163
|
+
if (envKey) {
|
|
164
|
+
return { apiKey: envKey, source: "env" };
|
|
165
|
+
}
|
|
166
|
+
// 3. GitHub Copilot hosts.json
|
|
167
|
+
const copilotPaths = this.getCopilotPaths("hosts.json");
|
|
168
|
+
for (const p of copilotPaths) {
|
|
169
|
+
const hosts = await this.readJson(p);
|
|
170
|
+
if (hosts) {
|
|
171
|
+
const token = this.extractCopilotToken(hosts);
|
|
172
|
+
if (token) {
|
|
173
|
+
return { accessToken: token, source: "cli", path: p };
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
// 4. GitHub Copilot apps.json
|
|
178
|
+
const appsPaths = this.getCopilotPaths("apps.json");
|
|
179
|
+
for (const p of appsPaths) {
|
|
180
|
+
const apps = await this.readJson(p);
|
|
181
|
+
if (apps) {
|
|
182
|
+
const token = this.extractCopilotToken(apps);
|
|
183
|
+
if (token) {
|
|
184
|
+
return { accessToken: token, source: "cli", path: p };
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return { source: "none" };
|
|
189
|
+
}
|
|
190
|
+
// ---------------------------------------------------------------------------
|
|
191
|
+
// Google / Gemini
|
|
192
|
+
// ---------------------------------------------------------------------------
|
|
193
|
+
/**
|
|
194
|
+
* Search hierarchy for Google / Gemini credentials:
|
|
195
|
+
* 1. Explicit config key
|
|
196
|
+
* 2. `GOOGLE_API_KEY` or `GEMINI_API_KEY` env var
|
|
197
|
+
* 3. Gemini CLI `~/.gemini/credentials.json`
|
|
198
|
+
* 4. gcloud Application Default Credentials (ADC)
|
|
199
|
+
*/
|
|
200
|
+
async resolveGoogle(explicitKey) {
|
|
201
|
+
// 1. Explicit config key
|
|
202
|
+
if (explicitKey) {
|
|
203
|
+
return { apiKey: explicitKey, source: "config" };
|
|
204
|
+
}
|
|
205
|
+
// 2. Environment variables
|
|
206
|
+
const envKey = process.env.GOOGLE_API_KEY ?? process.env.GEMINI_API_KEY;
|
|
207
|
+
if (envKey) {
|
|
208
|
+
return { apiKey: envKey, source: "env" };
|
|
209
|
+
}
|
|
210
|
+
// 3. Gemini CLI credentials
|
|
211
|
+
const geminiCreds = await this.readJson(join(this.home, ".gemini", "credentials.json"));
|
|
212
|
+
if (geminiCreds?.apiKey) {
|
|
213
|
+
return {
|
|
214
|
+
apiKey: geminiCreds.apiKey,
|
|
215
|
+
source: "cli",
|
|
216
|
+
path: join(this.home, ".gemini", "credentials.json"),
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
if (geminiCreds?.access_token) {
|
|
220
|
+
return {
|
|
221
|
+
accessToken: geminiCreds.access_token,
|
|
222
|
+
source: "cli",
|
|
223
|
+
path: join(this.home, ".gemini", "credentials.json"),
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
// 4. gcloud application default credentials
|
|
227
|
+
const gcloudPaths = this.getGcloudPaths();
|
|
228
|
+
for (const p of gcloudPaths) {
|
|
229
|
+
const gcloud = await this.readJson(p);
|
|
230
|
+
if (gcloud?.access_token) {
|
|
231
|
+
return { accessToken: gcloud.access_token, source: "config", path: p };
|
|
232
|
+
}
|
|
233
|
+
if (gcloud?.refresh_token) {
|
|
234
|
+
return { accessToken: gcloud.refresh_token, source: "config", path: p };
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
return { source: "none" };
|
|
238
|
+
}
|
|
239
|
+
// ---------------------------------------------------------------------------
|
|
240
|
+
// OpenRouter
|
|
241
|
+
// ---------------------------------------------------------------------------
|
|
242
|
+
/**
|
|
243
|
+
* Search hierarchy for OpenRouter credentials:
|
|
244
|
+
* 1. Explicit config key
|
|
245
|
+
* 2. `OPENROUTER_API_KEY` env var
|
|
246
|
+
* (No known CLI tool stores OpenRouter keys on disk.)
|
|
247
|
+
*/
|
|
248
|
+
async resolveOpenRouter(explicitKey) {
|
|
249
|
+
// 1. Explicit config key
|
|
250
|
+
if (explicitKey) {
|
|
251
|
+
return { apiKey: explicitKey, source: "config" };
|
|
252
|
+
}
|
|
253
|
+
// 2. Environment variable
|
|
254
|
+
const envKey = process.env.OPENROUTER_API_KEY;
|
|
255
|
+
if (envKey) {
|
|
256
|
+
return { apiKey: envKey, source: "env" };
|
|
257
|
+
}
|
|
258
|
+
// No known CLI tool credentials for OpenRouter
|
|
259
|
+
return { source: "none" };
|
|
260
|
+
}
|
|
261
|
+
// ---------------------------------------------------------------------------
|
|
262
|
+
// Ollama (no auth needed)
|
|
263
|
+
// ---------------------------------------------------------------------------
|
|
264
|
+
/**
|
|
265
|
+
* Ollama runs locally and never requires authentication.
|
|
266
|
+
* Returns `{ source: "none" }` unconditionally.
|
|
267
|
+
*/
|
|
268
|
+
resolveOllama() {
|
|
269
|
+
return { source: "none" };
|
|
270
|
+
}
|
|
271
|
+
// ---------------------------------------------------------------------------
|
|
272
|
+
// AWS Bedrock
|
|
273
|
+
// ---------------------------------------------------------------------------
|
|
274
|
+
/**
|
|
275
|
+
* Search hierarchy for AWS Bedrock credentials:
|
|
276
|
+
* 1. Explicit config key (`config.providers.bedrock.apiKey` or `config.providers.aws.apiKey`)
|
|
277
|
+
* 2. `AWS_ACCESS_KEY_ID` + `AWS_SECRET_ACCESS_KEY` env vars (both must be present)
|
|
278
|
+
* 3. `AWS_PROFILE` env var — signals a named profile in `~/.aws/credentials`
|
|
279
|
+
* 4. `~/.aws/credentials` — reads the `[default]` profile's `aws_access_key_id`
|
|
280
|
+
* 5. `~/.aws/config` — detects SSO or IAM role configuration (presence check only)
|
|
281
|
+
*
|
|
282
|
+
* The returned `metadata.region` is resolved from (in order):
|
|
283
|
+
* `AWS_DEFAULT_REGION` → `AWS_REGION` → `region` in `~/.aws/config [default]` → `"us-east-1"`
|
|
284
|
+
*
|
|
285
|
+
* @param explicitKey - Optional AWS access key ID passed from user config.
|
|
286
|
+
* @returns Resolved credential with `key` (access key ID or sentinel) and `metadata.region`.
|
|
287
|
+
*/
|
|
288
|
+
async resolveBedrockCredential(explicitKey) {
|
|
289
|
+
// 1. Explicit config key
|
|
290
|
+
if (explicitKey) {
|
|
291
|
+
const region = await this.resolveAwsRegion();
|
|
292
|
+
return { apiKey: explicitKey, source: "config", metadata: { region } };
|
|
293
|
+
}
|
|
294
|
+
// 2. Environment variables — both access key and secret must be present
|
|
295
|
+
const accessKeyId = process.env.AWS_ACCESS_KEY_ID;
|
|
296
|
+
const secretAccessKey = process.env.AWS_SECRET_ACCESS_KEY;
|
|
297
|
+
if (accessKeyId && secretAccessKey) {
|
|
298
|
+
const region = await this.resolveAwsRegion();
|
|
299
|
+
return { apiKey: accessKeyId, source: "env", metadata: { region } };
|
|
300
|
+
}
|
|
301
|
+
// 3. Named profile via AWS_PROFILE env var
|
|
302
|
+
const awsProfile = process.env.AWS_PROFILE;
|
|
303
|
+
if (awsProfile) {
|
|
304
|
+
const region = await this.resolveAwsRegion();
|
|
305
|
+
return { apiKey: "aws-profile", source: "cli", metadata: { region } };
|
|
306
|
+
}
|
|
307
|
+
// 4. ~/.aws/credentials — [default] profile
|
|
308
|
+
const awsCredentialsPath = join(this.home, ".aws", "credentials");
|
|
309
|
+
const awsCredentialsRaw = await this.readTextFile(awsCredentialsPath);
|
|
310
|
+
if (awsCredentialsRaw !== null) {
|
|
311
|
+
const defaultProfile = this.parseAwsIniSection(awsCredentialsRaw, "default");
|
|
312
|
+
const keyId = defaultProfile["aws_access_key_id"];
|
|
313
|
+
if (keyId) {
|
|
314
|
+
const region = await this.resolveAwsRegion();
|
|
315
|
+
return { apiKey: keyId, source: "cli", path: awsCredentialsPath, metadata: { region } };
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
// 5. ~/.aws/config — detect SSO or role-based configuration (presence-only check)
|
|
319
|
+
const awsConfigPath = join(this.home, ".aws", "config");
|
|
320
|
+
const awsConfigRaw = await this.readTextFile(awsConfigPath);
|
|
321
|
+
if (awsConfigRaw !== null) {
|
|
322
|
+
const isSso = awsConfigRaw.includes("sso_start_url") || awsConfigRaw.includes("sso_session");
|
|
323
|
+
const isRole = awsConfigRaw.includes("role_arn");
|
|
324
|
+
if (isSso) {
|
|
325
|
+
const region = await this.resolveAwsRegion(awsConfigRaw);
|
|
326
|
+
return { apiKey: "aws-sso", source: "cli", path: awsConfigPath, metadata: { region } };
|
|
327
|
+
}
|
|
328
|
+
if (isRole) {
|
|
329
|
+
const region = await this.resolveAwsRegion(awsConfigRaw);
|
|
330
|
+
return { apiKey: "aws-iam", source: "cli", path: awsConfigPath, metadata: { region } };
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
return { source: "none" };
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Resolve the effective AWS region from environment variables or the
|
|
337
|
+
* parsed `~/.aws/config` content.
|
|
338
|
+
*
|
|
339
|
+
* Priority: `AWS_DEFAULT_REGION` → `AWS_REGION` → `region` in `[default]`
|
|
340
|
+
* profile of the provided config text → `"us-east-1"` fallback.
|
|
341
|
+
*
|
|
342
|
+
* @param awsConfigRaw - Optional raw text of `~/.aws/config` already read by the caller.
|
|
343
|
+
* @returns The resolved region string.
|
|
344
|
+
*/
|
|
345
|
+
async resolveAwsRegion(awsConfigRaw) {
|
|
346
|
+
// Env vars take highest precedence
|
|
347
|
+
const envRegion = process.env.AWS_DEFAULT_REGION ?? process.env.AWS_REGION;
|
|
348
|
+
if (envRegion) {
|
|
349
|
+
return envRegion;
|
|
350
|
+
}
|
|
351
|
+
// Parse from ~/.aws/config [default] or the pre-read content
|
|
352
|
+
const configText = awsConfigRaw ?? (await this.readTextFile(join(this.home, ".aws", "config")));
|
|
353
|
+
if (configText !== null) {
|
|
354
|
+
// AWS config uses [profile default] for non-default profiles and [default] for the default
|
|
355
|
+
const section = this.parseAwsIniSection(configText, "profile default")["region"] ??
|
|
356
|
+
this.parseAwsIniSection(configText, "default")["region"];
|
|
357
|
+
if (section) {
|
|
358
|
+
return section;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
return "us-east-1";
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Parse a single named section from an AWS INI-format file.
|
|
365
|
+
*
|
|
366
|
+
* AWS credential/config files use INI syntax with `[section]` headers and
|
|
367
|
+
* `key = value` pairs. This parser is intentionally minimal: it only extracts
|
|
368
|
+
* key-value pairs belonging to the requested section and ignores all others.
|
|
369
|
+
*
|
|
370
|
+
* @param text - Raw file content.
|
|
371
|
+
* @param sectionName - Section header to extract (without brackets), e.g. `"default"`.
|
|
372
|
+
* @returns A map of key → value strings found within the section, or `{}` if not found.
|
|
373
|
+
*/
|
|
374
|
+
parseAwsIniSection(text, sectionName) {
|
|
375
|
+
const result = {};
|
|
376
|
+
const lines = text.split(/\r?\n/);
|
|
377
|
+
let inSection = false;
|
|
378
|
+
for (const line of lines) {
|
|
379
|
+
const trimmed = line.trim();
|
|
380
|
+
// Detect section headers
|
|
381
|
+
if (trimmed.startsWith("[")) {
|
|
382
|
+
const header = trimmed.slice(1, trimmed.indexOf("]")).trim();
|
|
383
|
+
inSection = header === sectionName;
|
|
384
|
+
continue;
|
|
385
|
+
}
|
|
386
|
+
if (!inSection || !trimmed || trimmed.startsWith("#") || trimmed.startsWith(";")) {
|
|
387
|
+
continue;
|
|
388
|
+
}
|
|
389
|
+
const eqIdx = trimmed.indexOf("=");
|
|
390
|
+
if (eqIdx === -1)
|
|
391
|
+
continue;
|
|
392
|
+
const key = trimmed.slice(0, eqIdx).trim();
|
|
393
|
+
const value = trimmed.slice(eqIdx + 1).trim();
|
|
394
|
+
result[key] = value;
|
|
395
|
+
}
|
|
396
|
+
return result;
|
|
397
|
+
}
|
|
398
|
+
// ---------------------------------------------------------------------------
|
|
399
|
+
// GCP Vertex AI
|
|
400
|
+
// ---------------------------------------------------------------------------
|
|
401
|
+
/**
|
|
402
|
+
* Search hierarchy for GCP Vertex AI credentials:
|
|
403
|
+
* 1. Explicit config key (`config.providers.vertex.apiKey`)
|
|
404
|
+
* 2. `GOOGLE_APPLICATION_CREDENTIALS` env var — path to service account JSON
|
|
405
|
+
* 3. `~/.config/gcloud/application_default_credentials.json` (gcloud ADC)
|
|
406
|
+
* 4. `gcloud auth print-access-token` subprocess (5 s timeout)
|
|
407
|
+
*
|
|
408
|
+
* The returned `metadata` always contains `region` and optionally `projectId`
|
|
409
|
+
* resolved from (in order):
|
|
410
|
+
* - `GOOGLE_CLOUD_PROJECT` / `GCLOUD_PROJECT` env vars
|
|
411
|
+
* - `gcloud config get-value project` subprocess
|
|
412
|
+
*
|
|
413
|
+
* @param explicitKey - Optional explicit key or service-account path from user config.
|
|
414
|
+
* @returns Resolved credential with `key` and `metadata.{ projectId?, region }`.
|
|
415
|
+
*/
|
|
416
|
+
async resolveVertexCredential(explicitKey) {
|
|
417
|
+
// 1. Explicit config key
|
|
418
|
+
if (explicitKey) {
|
|
419
|
+
const metadata = await this.resolveVertexMetadata();
|
|
420
|
+
return { apiKey: explicitKey, source: "config", metadata };
|
|
421
|
+
}
|
|
422
|
+
// 2. GOOGLE_APPLICATION_CREDENTIALS env var — path to a service account JSON file
|
|
423
|
+
const gacEnv = process.env.GOOGLE_APPLICATION_CREDENTIALS;
|
|
424
|
+
if (gacEnv) {
|
|
425
|
+
const metadata = await this.resolveVertexMetadata();
|
|
426
|
+
return { apiKey: gacEnv, source: "env", metadata };
|
|
427
|
+
}
|
|
428
|
+
// 3. gcloud Application Default Credentials (ADC) file
|
|
429
|
+
const adcPaths = this.getGcloudPaths();
|
|
430
|
+
for (const adcPath of adcPaths) {
|
|
431
|
+
const adc = await this.readJson(adcPath);
|
|
432
|
+
if (adc) {
|
|
433
|
+
const token = adc.access_token ?? adc.refresh_token;
|
|
434
|
+
if (token) {
|
|
435
|
+
const metadata = await this.resolveVertexMetadata();
|
|
436
|
+
return { apiKey: token, source: "config", path: adcPath, metadata };
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
// 4. gcloud CLI — obtain a short-lived access token via subprocess
|
|
441
|
+
const cliToken = this.execGcloudToken();
|
|
442
|
+
if (cliToken) {
|
|
443
|
+
const metadata = await this.resolveVertexMetadata();
|
|
444
|
+
return { apiKey: cliToken, source: "cli", metadata };
|
|
445
|
+
}
|
|
446
|
+
return { source: "none" };
|
|
447
|
+
}
|
|
448
|
+
/**
|
|
449
|
+
* Resolve Vertex AI metadata: GCP project ID and region.
|
|
450
|
+
*
|
|
451
|
+
* Project ID priority: `GOOGLE_CLOUD_PROJECT` → `GCLOUD_PROJECT` → `gcloud config get-value project`
|
|
452
|
+
* Region priority: `GOOGLE_CLOUD_REGION` → `"us-central1"`
|
|
453
|
+
*
|
|
454
|
+
* @returns Metadata object with `region` (always set) and optional `projectId`.
|
|
455
|
+
*/
|
|
456
|
+
async resolveVertexMetadata() {
|
|
457
|
+
const region = process.env.GOOGLE_CLOUD_REGION ?? "us-central1";
|
|
458
|
+
// Resolve project ID from environment first (cheapest)
|
|
459
|
+
const envProject = process.env.GOOGLE_CLOUD_PROJECT ?? process.env.GCLOUD_PROJECT;
|
|
460
|
+
if (envProject) {
|
|
461
|
+
return { projectId: envProject, region };
|
|
462
|
+
}
|
|
463
|
+
// Fall back to gcloud CLI subprocess
|
|
464
|
+
const cliProject = this.execGcloudProject();
|
|
465
|
+
if (cliProject) {
|
|
466
|
+
return { projectId: cliProject, region };
|
|
467
|
+
}
|
|
468
|
+
return { region };
|
|
469
|
+
}
|
|
470
|
+
/**
|
|
471
|
+
* Run `gcloud auth print-access-token` and return the trimmed token.
|
|
472
|
+
* Returns `null` on any error (gcloud not installed, not authenticated, timeout, etc.).
|
|
473
|
+
*/
|
|
474
|
+
execGcloudToken() {
|
|
475
|
+
try {
|
|
476
|
+
const output = execSync("gcloud auth print-access-token", {
|
|
477
|
+
timeout: 5_000,
|
|
478
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
479
|
+
});
|
|
480
|
+
const token = output.toString().trim();
|
|
481
|
+
return token || null;
|
|
482
|
+
}
|
|
483
|
+
catch {
|
|
484
|
+
return null;
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
/**
|
|
488
|
+
* Run `gcloud config get-value project` and return the trimmed project ID.
|
|
489
|
+
* Returns `null` on any error.
|
|
490
|
+
*/
|
|
491
|
+
execGcloudProject() {
|
|
492
|
+
try {
|
|
493
|
+
const output = execSync("gcloud config get-value project", {
|
|
494
|
+
timeout: 5_000,
|
|
495
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
496
|
+
});
|
|
497
|
+
const project = output.toString().trim();
|
|
498
|
+
// gcloud prints "(unset)" when no project is configured
|
|
499
|
+
return project && project !== "(unset)" ? project : null;
|
|
500
|
+
}
|
|
501
|
+
catch {
|
|
502
|
+
return null;
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
// ---------------------------------------------------------------------------
|
|
506
|
+
// Simple env-var providers (NVIDIA, Together, Fireworks, Groq, Mistral)
|
|
507
|
+
// ---------------------------------------------------------------------------
|
|
508
|
+
/**
|
|
509
|
+
* Generic resolver for providers that only need an explicit key or a single env var.
|
|
510
|
+
* Used by NVIDIA, Together AI, Fireworks AI, Groq, and Mistral AI.
|
|
511
|
+
*/
|
|
512
|
+
resolveNvidia(explicitKey) {
|
|
513
|
+
return this.resolveSimpleEnvKey(explicitKey, "NVIDIA_API_KEY");
|
|
514
|
+
}
|
|
515
|
+
resolveSimpleEnvKey(explicitKey, envVarName) {
|
|
516
|
+
if (explicitKey) {
|
|
517
|
+
return Promise.resolve({ apiKey: explicitKey, source: "config" });
|
|
518
|
+
}
|
|
519
|
+
const envKey = process.env[envVarName];
|
|
520
|
+
if (envKey) {
|
|
521
|
+
return Promise.resolve({ apiKey: envKey, source: "env" });
|
|
522
|
+
}
|
|
523
|
+
return Promise.resolve({ source: "none" });
|
|
524
|
+
}
|
|
525
|
+
resolveMultiEnvKey(explicitKey, envVarNames) {
|
|
526
|
+
if (explicitKey) {
|
|
527
|
+
return Promise.resolve({ apiKey: explicitKey, source: "config" });
|
|
528
|
+
}
|
|
529
|
+
for (const envVarName of envVarNames) {
|
|
530
|
+
const envKey = process.env[envVarName];
|
|
531
|
+
if (envKey) {
|
|
532
|
+
return Promise.resolve({ apiKey: envKey, source: "env" });
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
return Promise.resolve({ source: "none" });
|
|
536
|
+
}
|
|
537
|
+
// ---------------------------------------------------------------------------
|
|
538
|
+
// Helpers
|
|
539
|
+
// ---------------------------------------------------------------------------
|
|
540
|
+
/** Safely read and parse a JSON file; returns null on any error. */
|
|
541
|
+
async readJson(filePath) {
|
|
542
|
+
try {
|
|
543
|
+
const raw = await readFile(filePath, "utf-8");
|
|
544
|
+
return JSON.parse(raw);
|
|
545
|
+
}
|
|
546
|
+
catch {
|
|
547
|
+
return null;
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
/** Safely read a text file as a string; returns null on any error. */
|
|
551
|
+
async readTextFile(filePath) {
|
|
552
|
+
try {
|
|
553
|
+
return await readFile(filePath, "utf-8");
|
|
554
|
+
}
|
|
555
|
+
catch {
|
|
556
|
+
return null;
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
/** Return candidate paths for GitHub Copilot config files. */
|
|
560
|
+
getCopilotPaths(filename) {
|
|
561
|
+
const paths = [join(this.home, ".config", "github-copilot", filename)];
|
|
562
|
+
if (this.isWindows) {
|
|
563
|
+
const appData = process.env.APPDATA;
|
|
564
|
+
if (appData) {
|
|
565
|
+
paths.push(join(appData, "github-copilot", filename));
|
|
566
|
+
}
|
|
567
|
+
const localAppData = process.env.LOCALAPPDATA;
|
|
568
|
+
if (localAppData) {
|
|
569
|
+
paths.push(join(localAppData, "github-copilot", filename));
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
return paths;
|
|
573
|
+
}
|
|
574
|
+
/** Return candidate paths for gcloud ADC. */
|
|
575
|
+
getGcloudPaths() {
|
|
576
|
+
const paths = [
|
|
577
|
+
join(this.home, ".config", "gcloud", "application_default_credentials.json"),
|
|
578
|
+
];
|
|
579
|
+
if (this.isWindows) {
|
|
580
|
+
const appData = process.env.APPDATA;
|
|
581
|
+
if (appData) {
|
|
582
|
+
paths.push(join(appData, "gcloud", "application_default_credentials.json"));
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
return paths;
|
|
586
|
+
}
|
|
587
|
+
/** Extract the first OAuth token from a Copilot hosts/apps JSON structure. */
|
|
588
|
+
extractCopilotToken(data) {
|
|
589
|
+
for (const value of Object.values(data)) {
|
|
590
|
+
if (value?.oauth_token) {
|
|
591
|
+
return value.oauth_token;
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
return undefined;
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
//# sourceMappingURL=resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/credentials/resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
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 type { CredentialResult, ModelCard } from "../types.js";
|
|
9
|
+
import { BaseDiscoverer } from "./base.js";
|
|
10
|
+
/**
|
|
11
|
+
* Discovers models available through the Anthropic API.
|
|
12
|
+
*
|
|
13
|
+
* Authentication is via `x-api-key` header. The endpoint is paginated,
|
|
14
|
+
* so we loop until `has_more` is false.
|
|
15
|
+
*/
|
|
16
|
+
export declare class AnthropicDiscoverer extends BaseDiscoverer {
|
|
17
|
+
readonly providerId = "anthropic";
|
|
18
|
+
readonly providerName = "Anthropic";
|
|
19
|
+
readonly baseUrl = "https://api.anthropic.com";
|
|
20
|
+
/**
|
|
21
|
+
* Fetch all models from the Anthropic API using cursor-based pagination.
|
|
22
|
+
* @param credential - Must contain an `apiKey` or `accessToken`.
|
|
23
|
+
* @param options - Optional timeout override (default 10 s).
|
|
24
|
+
* @returns Normalized model cards, or an empty array if unauthenticated.
|
|
25
|
+
*/
|
|
26
|
+
discover(credential: CredentialResult, options?: {
|
|
27
|
+
timeout?: number;
|
|
28
|
+
}): Promise<ModelCard[]>;
|
|
29
|
+
/**
|
|
30
|
+
* Convert an Anthropic API model object into a normalized {@link ModelCard}.
|
|
31
|
+
*/
|
|
32
|
+
private toModelCard;
|
|
33
|
+
/**
|
|
34
|
+
* Infer capability flags from the model ID string.
|
|
35
|
+
*
|
|
36
|
+
* All Claude chat models get "chat", "code", "nlu", and "function_calling".
|
|
37
|
+
* Vision is added for Claude 3+ models (detected via regex).
|
|
38
|
+
* @param modelId - The canonical Anthropic model ID.
|
|
39
|
+
*/
|
|
40
|
+
private inferCapabilities;
|
|
41
|
+
/**
|
|
42
|
+
* Check whether a model ID indicates vision (multimodal) support.
|
|
43
|
+
*
|
|
44
|
+
* @param id - Lowercased model ID.
|
|
45
|
+
* @returns `true` for Claude 3, 3.5, 4, 4.5, 4.6, etc.
|
|
46
|
+
*/
|
|
47
|
+
private hasVisionSupport;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=anthropic.d.ts.map
|