diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index bb5d4b4e..7610609c 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -4,7 +4,7 @@ ### Fixed -- Vertex AI dummy value for `getEnvApiKey()`: Returns `""` when Application Default Credentials are configured (`~/.config/gcloud/application_default_credentials.json` exists) and both `GOOGLE_CLOUD_PROJECT` (or `GCLOUD_PROJECT`) and `GOOGLE_CLOUD_LOCATION` are set. This allows `streamSimple()` to work with Vertex AI without explicit `apiKey` option. +- Vertex AI dummy value for `getEnvApiKey()`: Returns `""` when Application Default Credentials are configured (`~/.config/gcloud/application_default_credentials.json` exists) and both `GOOGLE_CLOUD_PROJECT` (or `GCLOUD_PROJECT`) and `GOOGLE_CLOUD_LOCATION` are set. This allows `streamSimple()` to work with Vertex AI without explicit `apiKey` option. The ADC credentials file existence check is cached per-process to avoid repeated filesystem access. ## [0.34.2] - 2026-01-04 diff --git a/packages/ai/src/stream.ts b/packages/ai/src/stream.ts index 8f186dad..50e2f699 100644 --- a/packages/ai/src/stream.ts +++ b/packages/ai/src/stream.ts @@ -24,6 +24,17 @@ import type { SimpleStreamOptions, } from "./types.js"; +const VERTEX_ADC_CREDENTIALS_PATH = join(homedir(), ".config", "gcloud", "application_default_credentials.json"); + +let cachedVertexAdcCredentialsExists: boolean | null = null; + +function hasVertexAdcCredentials(): boolean { + if (cachedVertexAdcCredentialsExists === null) { + cachedVertexAdcCredentialsExists = existsSync(VERTEX_ADC_CREDENTIALS_PATH); + } + return cachedVertexAdcCredentialsExists; +} + /** * Get API key for provider from known environment variables, e.g. OPENAI_API_KEY. * @@ -45,8 +56,7 @@ export function getEnvApiKey(provider: any): string | undefined { // Vertex AI uses Application Default Credentials, not API keys. // Auth is configured via `gcloud auth application-default login`. if (provider === "google-vertex") { - const credentialsPath = join(homedir(), ".config", "gcloud", "application_default_credentials.json"); - const hasCredentials = existsSync(credentialsPath); + const hasCredentials = hasVertexAdcCredentials(); const hasProject = !!(process.env.GOOGLE_CLOUD_PROJECT || process.env.GCLOUD_PROJECT); const hasLocation = !!process.env.GOOGLE_CLOUD_LOCATION;