feat: add Google Vertex AI as new provider

This commit is contained in:
ElshadHu
2026-01-11 00:11:30 -05:00
parent cf9638b231
commit 8f538193dd
3 changed files with 83 additions and 3 deletions

View File

@@ -1,6 +1,6 @@
# AI Provider Configuration
# AI_PROVIDER: Which provider to use
# Options: bedrock, openai, anthropic, google, azure, ollama, openrouter, deepseek, siliconflow, gateway
# Options: bedrock, openai, anthropic, google, vertexai, azure, ollama, openrouter, deepseek, siliconflow, gateway
# Default: bedrock
AI_PROVIDER=bedrock
@@ -38,7 +38,17 @@ AI_MODEL=global.anthropic.claude-sonnet-4-5-20250929-v1:0
# GOOGLE_TOP_P=0.95 # Optional: Nucleus sampling parameter
# Note: Gemini 2.5/3 models automatically enable reasoning display (includeThoughts: true)
# GOOGLE_THINKING_BUDGET=8192 # Optional: Gemini 2.5 thinking budget in tokens (for more/less thinking)
# GOOGLE_THINKING_LEVEL=high # Optional: Gemini 3 thinking level (low/high)
# GOOGLE_THINKING_LEVEL=high # Optional: Gemini 3 thinking level (minimal/low/medium/high)
# Google Vertex AI Configuration (Enterprise GCP)
# For enterprise users needing data residency, VPC Service Controls, or GCP integration
# Uses GCP service account authentication instead of API keys
# GOOGLE_VERTEX_PROJECT=your-gcp-project-id # Required: GCP project ID
# GOOGLE_VERTEX_LOCATION=us-central1 # Optional: defaults to us-central1
# GOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account.json # Path to service account key file
# Note: When running on GCP (Cloud Run, GKE, Compute Engine), uses Application Default Credentials automatically
# GOOGLE_VERTEX_THINKING_BUDGET=8192 # Optional: Gemini 2.5 thinking budget in tokens (1024-100000)
# GOOGLE_VERTEX_THINKING_LEVEL=high # Optional: Gemini 3 thinking level (minimal/low/medium/high)
# Azure OpenAI Configuration
# Configure endpoint using ONE of these methods:

View File

@@ -4,6 +4,7 @@ import { azure, createAzure } from "@ai-sdk/azure"
import { createDeepSeek, deepseek } from "@ai-sdk/deepseek"
import { createGateway, gateway } from "@ai-sdk/gateway"
import { createGoogleGenerativeAI, google } from "@ai-sdk/google"
import { createVertex } from "@ai-sdk/google-vertex"
import { createOpenAI, openai } from "@ai-sdk/openai"
import { fromNodeProviderChain } from "@aws-sdk/credential-providers"
import { createOpenRouter } from "@openrouter/ai-sdk-provider"
@@ -38,6 +39,7 @@ const ALLOWED_CLIENT_PROVIDERS: ProviderName[] = [
"openai",
"anthropic",
"google",
"vertexai",
"azure",
"bedrock",
"openrouter",
@@ -95,7 +97,9 @@ function parseIntSafe(
* - ANTHROPIC_THINKING_BUDGET_TOKENS: Anthropic thinking budget in tokens (1024-64000)
* - ANTHROPIC_THINKING_TYPE: Anthropic thinking type (enabled)
* - GOOGLE_THINKING_BUDGET: Google Gemini 2.5 thinking budget in tokens (1024-100000)
* - GOOGLE_THINKING_LEVEL: Google Gemini 3 thinking level (low/high)
* - GOOGLE_THINKING_LEVEL: Google Gemini 3 thinking level (minimal/low/medium/high)
* - GOOGLE_VERTEX_THINKING_BUDGET: Vertex AI Gemini 2.5 thinking budget in tokens (1024-100000)
* - GOOGLE_VERTEX_THINKING_LEVEL: Vertex AI Gemini 3 thinking level (minimal/low/medium/high)
* - AZURE_REASONING_EFFORT: Azure/OpenAI reasoning effort (low/medium/high)
* - AZURE_REASONING_SUMMARY: Azure reasoning summary (none/brief/detailed)
* - BEDROCK_REASONING_BUDGET_TOKENS: Bedrock Claude reasoning budget in tokens (1024-64000)
@@ -260,7 +264,39 @@ function buildProviderOptions(
}
break
}
case "vertexai": {
// Google Vertex supports the same thinking config as standard Google provider
const thinkingBudget = parseIntSafe(
process.env.GOOGLE_VERTEX_THINKING_BUDGET,
"GOOGLE_VERTEX_THINKING_BUDGET",
1024,
100000,
)
const thinkingLevel = process.env.GOOGLE_VERTEX_THINKING_LEVEL
if (
modelId &&
(modelId.includes("gemini-2") ||
modelId.includes("gemini-3") ||
modelId.includes("gemini2") ||
modelId.includes("gemini3"))
) {
const thinkingConfig: Record<string, any> = {
includeThoughts: true,
}
if (thinkingBudget) {
thinkingConfig.thinkingBudget = thinkingBudget
} else if (thinkingLevel) {
thinkingConfig.thinkingLevel = thinkingLevel as
| "minimal"
| "low"
| "medium"
| "high"
}
options.google = { thinkingConfig }
}
break
}
case "azure": {
const reasoningEffort = process.env.AZURE_REASONING_EFFORT
const reasoningSummary = process.env.AZURE_REASONING_SUMMARY
@@ -362,6 +398,7 @@ const PROVIDER_ENV_VARS: Record<ProviderName, string | null> = {
openai: "OPENAI_API_KEY",
anthropic: "ANTHROPIC_API_KEY",
google: "GOOGLE_GENERATIVE_AI_API_KEY",
vertexai: null, // Uses GOOGLE_APPLICATION_CREDENTIALS or IAM role
azure: "AZURE_API_KEY",
ollama: null, // No credentials needed for local Ollama
openrouter: "OPENROUTER_API_KEY",
@@ -644,6 +681,26 @@ export function getAIModel(overrides?: ClientOverrides): ModelConfig {
}
break
}
case "vertexai": {
// Google Vertex AI uses GCP service account authentication, not API keys
// Auth is handled via GOOGLE_APPLICATION_CREDENTIALS env var or GCP default credentials
const vertexProject = process.env.GOOGLE_VERTEX_PROJECT
const vertexLocation =
process.env.GOOGLE_VERTEX_LOCATION || "us-central1"
if (!vertexProject) {
throw new Error(
"GOOGLE_VERTEX_PROJECT environment variable is required for vertexai provider.",
)
}
const vertexProvider = createVertex({
project: vertexProject,
location: vertexLocation,
})
model = vertexProvider(modelId)
break
}
case "azure": {
const apiKey = overrides?.apiKey || process.env.AZURE_API_KEY

View File

@@ -4,6 +4,7 @@ export type ProviderName =
| "openai"
| "anthropic"
| "google"
| "vertexai"
| "azure"
| "bedrock"
| "ollama"
@@ -75,6 +76,7 @@ export const PROVIDER_INFO: Record<
defaultBaseUrl: "https://api.anthropic.com/v1",
},
google: { label: "Google" },
vertexai: { label: "Google Vertex AI" },
azure: { label: "Azure OpenAI" },
bedrock: { label: "Amazon Bedrock" },
ollama: {
@@ -157,6 +159,17 @@ export const SUGGESTED_MODELS: Partial<Record<ProviderName, string[]>> = {
// Legacy
"gemini-pro",
],
vertexai: [
// Gemini 2.5 series
"gemini-2.5-pro",
"gemini-2.5-flash",
// Gemini 2.0 series
"gemini-2.0-flash",
"gemini-2.0-flash-exp",
// Gemini 1.5 series
"gemini-1.5-pro",
"gemini-1.5-flash",
],
azure: ["gpt-4o", "gpt-4o-mini", "gpt-4-turbo", "gpt-4", "gpt-35-turbo"],
bedrock: [
// Anthropic Claude