ai icon indicating copy to clipboard operation
ai copied to clipboard

Support Google Vertex AI Express Mode

Open akarimcheese opened this issue 2 months ago • 1 comments

Description

Looking ai-sdk's the documentation for Vertex AI and Google's documentation for Vertex AI in Express Mode, it seems like AI SDK does not support providing a single api key in express mode (without having to supply location, project, client email, or private_key). It also doesn't look like the ai-sdk supports constructing the vertex api url in the way that the Vertex AI docs mention (https://aiplatform.googleapis.com/v1/publishers/google/models/{model}:streamGenerateContent?key={API_KEY})

Using nodejs

Sample env variables loaded

GOOGLE_PRIVATE_KEY="<Express mode API Key>"
GOOGLE_VERTEX_LOCATION= "us-central1"
GOOGLE_VERTEX_PROJECT="example-project"

Trying to fit it into the existing parameters (didn't expect either of the below to work, just being exhaustive)

Attempt 1

import { createVertex } from '@ai-sdk/google-vertex';
import { loadConfig } from './something-internal';
import { generateText } from 'ai';

const config = loadConfig(); // object populated from env vars
const vertex = createVertex({
  googleAuthOptions: {
    credentials: {
      client_email: '[email protected]',
      private_key: config.googlePrivateKey,
    },
  },
});

const model = vertex('gemini-2.5-flash');
const response = await generateText({
  model,
  prompt: 'Hello, world!',
});

Error

Error: error:1E08010C:DECODER routines::unsupported
    at Sign.sign (node:internal/crypto/sig:128:29)
    at Object.sign (/Users/user/dev/app/node_modules/.pnpm/[email protected]/node_modules/jwa/index.js:166:45)
    at Object.jwsSign [as sign] (/Users/user/dev/app/node_modules/.pnpm/[email protected]/node_modules/jws/lib/sign-stream.js:32:24)
    at GoogleToken._GoogleToken_requestToken (/Users/user/dev/app/node_modules/.pnpm/[email protected]/node_modules/gtoken/build/src/index.js:235:27)
    at GoogleToken._GoogleToken_getTokenAsyncInner (/Users/user/dev/app/node_modules/.pnpm/[email protected]/node_modules/gtoken/build/src/index.js:180:97)
    at GoogleToken._GoogleToken_getTokenAsync (/Users/user/dev/app/node_modules/.pnpm/[email protected]/node_modules/gtoken/build/src/index.js:160:173)
    at GoogleToken.getToken (/Users/user/dev/app/node_modules/.pnpm/[email protected]/node_modules/gtoken/build/src/index.js:110:102)
    at JWT.refreshTokenNoCache (/Users/user/dev/app/node_modules/.pnpm/[email protected]/node_modules/google-auth-library/build/src/auth/jwtclient.js:173:36)
    at JWT.refreshToken (/Users/user/dev/app/node_modules/.pnpm/[email protected]/node_modules/google-auth-library/build/src/auth/oauth2client.js:187:24)
    at JWT.refreshAccessTokenAsync (/Users/auser/dev/app/node_modules/.pnpm/[email protected]/node_modules/google-auth-library/build/src/auth/oauth2client.js:247:30) {
  opensslErrorStack: [ 'error:1E08010C:DECODER routines::unsupported' ],
  library: 'DECODER routines',
  reason: 'unsupported',
  code: 'ERR_OSSL_UNSUPPORTED'
}

Attempt 2

import { vertex } from '@ai-sdk/google-vertex';
import { generateText } from 'ai';

const model = vertex('gemini-2.5-flash');
const response = await generateText({
  model,
  prompt: 'Hello, world!',
});

Error

Error: Could not load the default credentials. Browse to https://cloud.google.com/docs/authentication/getting-started for more information.
    at GoogleAuth.getApplicationDefaultAsync (/Users/user/dev/app/node_modules/.pnpm/[email protected]/node_modules/google-auth-library/build/src/auth/googleauth.js:287:15)
    at process.processTicksAndRejections (node:internal/process/task_queues:105:5)
    at async GoogleAuth._GoogleAuth_determineClient (/Users/user/dev/app/node_modules/.pnpm/[email protected]/node_modules/google-auth-library/build/src/auth/googleauth.js:834:32)
    at async GoogleAuth.getClient (/Usersuser/dev/app/node_modules/.pnpm/[email protected]/node_modules/google-auth-library/build/src/auth/googleauth.js:698:20)
    at async generateAuthToken (/Users/user/dev/app/node_modules/.pnpm/@[email protected][email protected]/node_modules/@ai-sdk/google-vertex/dist/index.js:48:18)
    at async headers (/Users/user/dev/app/node_modules/.pnpm/@[email protected][email protected]/node_modules/@ai-sdk/google-vertex/dist/index.js:402:32)
    at async getHeaders (/Users/user/dev/app/node_modules/.pnpm/@[email protected][email protected]/node_modules/@ai-sdk/google-vertex/dist/index.js:351:31)
    at async GoogleGenerativeAILanguageModel.doGenerate (/Users/user/dev/app/node_modules/.pnpm/@[email protected][email protected]/node_modules/@ai-sdk/google/dist/internal/index.js:701:7)
    at async fn (/Users/user/dev/app/node_modules/.pnpm/[email protected][email protected]/node_modules/ai/dist/index.js:2348:34)
    at async /Users/user/dev/app/node_modules/.pnpm/[email protected][email protected]/node_modules/ai/dist/index.js:1631:22
}

AI SDK Version

  • @ai-sdk/google-vertex: 3.0.58
  • ai: 5.0.87

Code of Conduct

  • [x] I agree to follow this project's Code of Conduct

akarimcheese avatar Nov 06 '25 23:11 akarimcheese

Also running into this issue. Any idea how to workaround or get something working for now @akarimcheese?

raymondhechen avatar Nov 11 '25 02:11 raymondhechen

Also running into this issue. Any idea how to workaround or get something working for now @akarimcheese?

Unfortunately haven't had the time to look into a workaround

akarimcheese avatar Nov 16 '25 05:11 akarimcheese

will look into this soon, also see the PR from @Kartikayy007

dancer avatar Nov 18 '25 18:11 dancer

Please

wong2 avatar Dec 05 '25 07:12 wong2