feat: add Vertex AI UI support and validation endpoint

This commit is contained in:
ElshadHu
2026-01-11 00:49:43 -05:00
parent 8f538193dd
commit 6a20f03805
2 changed files with 37 additions and 3 deletions

View File

@@ -3,6 +3,7 @@ import { createAnthropic } from "@ai-sdk/anthropic"
import { createDeepSeek, deepseek } from "@ai-sdk/deepseek"
import { createGateway } from "@ai-sdk/gateway"
import { createGoogleGenerativeAI } from "@ai-sdk/google"
import { createVertex } from "@ai-sdk/google-vertex"
import { createOpenAI } from "@ai-sdk/openai"
import { createOpenRouter } from "@openrouter/ai-sdk-provider"
import { generateText } from "ai"
@@ -121,7 +122,12 @@ export async function POST(req: Request) {
{ status: 400 },
)
}
} else if (provider !== "ollama" && provider !== "edgeone" && !apiKey) {
} else if (
provider !== "ollama" &&
provider !== "edgeone" &&
provider !== "vertexai" &&
!apiKey
) {
return NextResponse.json(
{ valid: false, error: "API key is required" },
{ status: 400 },
@@ -158,6 +164,30 @@ export async function POST(req: Request) {
break
}
case "vertexai": {
// Vertex AI uses GCP service account authentication via environment variables
const vertexProject = process.env.GOOGLE_VERTEX_PROJECT
const vertexLocation =
process.env.GOOGLE_VERTEX_LOCATION || "us-central1"
if (!vertexProject) {
return NextResponse.json(
{
valid: false,
error: "GOOGLE_VERTEX_PROJECT environment variable is required",
},
{ status: 400 },
)
}
const vertex = createVertex({
project: vertexProject,
location: vertexLocation,
})
model = vertex(modelId)
break
}
case "azure": {
const azure = createOpenAI({
apiKey,

View File

@@ -78,6 +78,7 @@ const PROVIDER_LOGO_MAP: Record<string, string> = {
sglang: "openai", // SGLang is OpenAI-compatible
gateway: "vercel",
edgeone: "tencent-cloud",
vertexai: "google",
doubao: "bytedance",
modelscope: "modelscope",
}
@@ -280,6 +281,7 @@ export function ModelConfigDialog({
// Check credentials based on provider type
const isBedrock = selectedProvider.provider === "bedrock"
const isEdgeOne = selectedProvider.provider === "edgeone"
const isVertexAI = selectedProvider.provider === "vertexai"
if (isBedrock) {
if (
!selectedProvider.awsAccessKeyId ||
@@ -288,7 +290,7 @@ export function ModelConfigDialog({
) {
return
}
} else if (!isEdgeOne && !selectedProvider.apiKey) {
} else if (!isEdgeOne && !isVertexAI && !selectedProvider.apiKey) {
return
}
@@ -867,7 +869,9 @@ export function ModelConfigDialog({
</div>
</>
) : selectedProvider.provider ===
"edgeone" ? (
"edgeone" ||
selectedProvider.provider ===
"vertexai" ? (
<div className="space-y-3">
<div className="flex items-center gap-2">
<Button