From a9cb98648821ba8a2eb8e37d039b89d74a27b18e Mon Sep 17 00:00:00 2001 From: miguel Date: Fri, 24 Oct 2025 21:29:24 -0700 Subject: [PATCH] Auto-load GEMINI_API_KEY or GOOGLE_GENERATIVE_AI_API_KEY if either is defined on .env --- packages/core/lib/utils.ts | 10 +++++++--- packages/core/lib/v3/agent/GoogleCUAClient.ts | 5 ++++- packages/core/lib/v3/v3.ts | 17 +++++++++++++---- packages/core/lib/v3Evaluator.ts | 5 ++++- packages/evals/initV3.ts | 4 ++-- 5 files changed, 30 insertions(+), 11 deletions(-) diff --git a/packages/core/lib/utils.ts b/packages/core/lib/utils.ts index 9feb03bb1..3912365e8 100644 --- a/packages/core/lib/utils.ts +++ b/packages/core/lib/utils.ts @@ -395,11 +395,11 @@ function makeIdStringSchema(orig: z.ZodString): z.ZodString { * Mapping from LLM provider names to their corresponding environment variable names for API keys. */ export const providerEnvVarMap: Partial< - Record + Record> > = { openai: "OPENAI_API_KEY", anthropic: "ANTHROPIC_API_KEY", - google: "GOOGLE_GENERATIVE_AI_API_KEY", + google: ["GEMINI_API_KEY", "GOOGLE_GENERATIVE_AI_API_KEY"], groq: "GROQ_API_KEY", cerebras: "CEREBRAS_API_KEY", togetherai: "TOGETHER_AI_API_KEY", @@ -435,7 +435,11 @@ export function loadApiKeyFromEnv( return undefined; } - const apiKeyFromEnv = process.env[envVarName]; + const apiKeyFromEnv = Array.isArray(envVarName) + ? envVarName + .map((name) => process.env[name]) + .find((key) => key && key.length > 0) + : process.env[envVarName as string]; if (typeof apiKeyFromEnv === "string" && apiKeyFromEnv.length > 0) { return apiKeyFromEnv; } diff --git a/packages/core/lib/v3/agent/GoogleCUAClient.ts b/packages/core/lib/v3/agent/GoogleCUAClient.ts index 537cc27bf..cd60f5eee 100644 --- a/packages/core/lib/v3/agent/GoogleCUAClient.ts +++ b/packages/core/lib/v3/agent/GoogleCUAClient.ts @@ -46,7 +46,10 @@ export class GoogleCUAClient extends AgentClient { // Process client options this.apiKey = - (clientOptions?.apiKey as string) || process.env.GEMINI_API_KEY || ""; + (clientOptions?.apiKey as string) || + process.env.GEMINI_API_KEY || + process.env.GOOGLE_GENERATIVE_AI_API_KEY || + ""; // Initialize the Google Generative AI client this.client = new GoogleGenAI({ diff --git a/packages/core/lib/v3/v3.ts b/packages/core/lib/v3/v3.ts index f0b2a1323..68405927f 100644 --- a/packages/core/lib/v3/v3.ts +++ b/packages/core/lib/v3/v3.ts @@ -204,10 +204,19 @@ export class V3 { // Ensure API key is set let apiKey = (baseClientOptions as { apiKey?: string }).apiKey; if (!apiKey) { - apiKey = loadApiKeyFromEnv( - this.modelName.split("/")[0], // "openai", "anthropic", etc - this.logger, - ); + try { + apiKey = loadApiKeyFromEnv( + this.modelName.split("/")[0], // "openai", "anthropic", etc + this.logger, + ); + } catch (error) { + this.logger({ + category: "init", + message: `Error loading API key for model ${this.modelName}: ${error}. Continuing without LLM client.`, + level: 0, + }); + throw error; + } } this.modelClientOptions = { ...baseClientOptions, diff --git a/packages/core/lib/v3Evaluator.ts b/packages/core/lib/v3Evaluator.ts index 858716df7..149e09347 100644 --- a/packages/core/lib/v3Evaluator.ts +++ b/packages/core/lib/v3Evaluator.ts @@ -41,7 +41,10 @@ export class V3Evaluator { this.v3 = v3; this.modelName = modelName || ("google/gemini-2.5-flash" as AvailableModel); this.modelClientOptions = modelClientOptions || { - apiKey: process.env.GOOGLE_GENERATIVE_AI_API_KEY || "", + apiKey: + process.env.GEMINI_API_KEY || + process.env.GOOGLE_GENERATIVE_AI_API_KEY || + "", }; } diff --git a/packages/evals/initV3.ts b/packages/evals/initV3.ts index 419f9e4e6..f4cc9bc96 100644 --- a/packages/evals/initV3.ts +++ b/packages/evals/initV3.ts @@ -69,7 +69,7 @@ export async function initV3({ if (process.env.OPENAI_API_KEY) internalModel = "openai/gpt-4.1-mini" as AvailableModel; else if ( - process.env.GOOGLE_API_KEY || + process.env.GEMINI_API_KEY || process.env.GOOGLE_GENERATIVE_AI_API_KEY ) internalModel = "google/gemini-2.0-flash" as AvailableModel; @@ -77,7 +77,7 @@ export async function initV3({ internalModel = "anthropic/claude-3-7-sonnet-latest" as AvailableModel; else throw new Error( - "V3 init: No AISDK API key found. Set one of OPENAI_API_KEY, GOOGLE_API_KEY/GOOGLE_GENERATIVE_AI_API_KEY, or ANTHROPIC_API_KEY to run CUA evals.", + "V3 init: No AISDK API key found. Set one of OPENAI_API_KEY, GEMINI_API_KEY/GOOGLE_GENERATIVE_AI_API_KEY, or ANTHROPIC_API_KEY to run CUA evals.", ); }