mirror of
https://github.com/openclaw/openclaw.git
synced 2026-04-13 18:21:27 +00:00
68 lines
2.0 KiB
TypeScript
68 lines
2.0 KiB
TypeScript
import { getEnvApiKey } from "@mariozechner/pi-ai";
|
|
import { getShellEnvAppliedKeys } from "../infra/shell-env.js";
|
|
import { resolvePluginSetupProvider } from "../plugins/setup-registry.js";
|
|
import { normalizeOptionalSecretInput } from "../utils/normalize-secret-input.js";
|
|
import { resolveProviderEnvApiKeyCandidates } from "./model-auth-env-vars.js";
|
|
import { GCP_VERTEX_CREDENTIALS_MARKER } from "./model-auth-markers.js";
|
|
import { resolveProviderIdForAuth } from "./provider-auth-aliases.js";
|
|
|
|
export type EnvApiKeyResult = {
|
|
apiKey: string;
|
|
source: string;
|
|
};
|
|
|
|
export function resolveEnvApiKey(
|
|
provider: string,
|
|
env: NodeJS.ProcessEnv = process.env,
|
|
): EnvApiKeyResult | null {
|
|
const normalized = resolveProviderIdForAuth(provider, { env });
|
|
const candidateMap = resolveProviderEnvApiKeyCandidates({ env });
|
|
const applied = new Set(getShellEnvAppliedKeys());
|
|
const pick = (envVar: string): EnvApiKeyResult | null => {
|
|
const value = normalizeOptionalSecretInput(env[envVar]);
|
|
if (!value) {
|
|
return null;
|
|
}
|
|
const source = applied.has(envVar) ? `shell env: ${envVar}` : `env: ${envVar}`;
|
|
return { apiKey: value, source };
|
|
};
|
|
|
|
const candidates = Object.hasOwn(candidateMap, normalized) ? candidateMap[normalized] : undefined;
|
|
if (Array.isArray(candidates)) {
|
|
for (const envVar of candidates) {
|
|
const resolved = pick(envVar);
|
|
if (resolved) {
|
|
return resolved;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
if (normalized === "google-vertex") {
|
|
const envKey = getEnvApiKey(normalized);
|
|
if (!envKey) {
|
|
return null;
|
|
}
|
|
return { apiKey: envKey, source: "gcloud adc" };
|
|
}
|
|
|
|
const setupProvider = resolvePluginSetupProvider({
|
|
provider: normalized,
|
|
env,
|
|
});
|
|
if (setupProvider?.resolveConfigApiKey) {
|
|
const resolved = setupProvider.resolveConfigApiKey({
|
|
provider: normalized,
|
|
env,
|
|
});
|
|
if (resolved?.trim()) {
|
|
return {
|
|
apiKey: resolved,
|
|
source: resolved === GCP_VERTEX_CREDENTIALS_MARKER ? "gcloud adc" : "env",
|
|
};
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|