mirror of
https://github.com/DayuanJiang/next-ai-draw-io.git
synced 2026-09-02 01:20:23 +08:00
feat: add Google Vertex AI as new provider
This commit is contained in:
14
env.example
14
env.example
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user