Skip to content

Commit d17b50c

Browse files
authored
💄 style: add region support for Vertex AI provider (#9720)
✨ feat: add region support for Vertex AI provider - Add VertexAIKeyVault interface with region support - Update UI to include region selector with 35+ regions - Add vertexAIRegion field to ClientSecretPayload - Update backend to use user-selected region with fallback - Add i18n support for English and Chinese - Fix issue with Gemini 2.5 models requiring global region
1 parent 0a8c80d commit d17b50c

File tree

8 files changed

+96
-5
lines changed

8 files changed

+96
-5
lines changed

locales/en-US/modelProvider.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,11 @@
399399
"desc": "Enter your Vertex AI Keys",
400400
"placeholder": "{ \"type\": \"service_account\", \"project_id\": \"xxx\", \"private_key_id\": ... }",
401401
"title": "Vertex AI Keys"
402+
},
403+
"region": {
404+
"desc": "Select the region for Vertex AI service. Some models like Gemini 2.5 are only available in specific regions (e.g., global)",
405+
"placeholder": "Select region",
406+
"title": "Vertex AI Region"
402407
}
403408
},
404409
"zeroone": {

locales/zh-CN/modelProvider.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,11 @@
399399
"desc": "填入你的 Vertex Ai Keys",
400400
"placeholder": "{ \"type\": \"service_account\", \"project_id\": \"xxx\", \"private_key_id\": ... }",
401401
"title": "Vertex AI Keys"
402+
},
403+
"region": {
404+
"desc": "选择 Vertex AI 服务的区域。某些模型如 Gemini 2.5 仅在特定区域可用(如 global)",
405+
"placeholder": "选择区域",
406+
"title": "Vertex AI 区域"
402407
}
403408
},
404409
"zeroone": {

packages/types/src/auth.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ export interface ClientSecretPayload {
2727

2828
cloudflareBaseURLOrAccountID?: string;
2929

30+
vertexAIRegion?: string;
31+
3032
/**
3133
* user id
3234
* in client db mode it's a uuid

packages/types/src/user/settings/keyVaults.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@ export interface AWSBedrockKeyVault {
2424
sessionToken?: string;
2525
}
2626

27+
export interface VertexAIKeyVault {
28+
apiKey?: string;
29+
region?: string;
30+
}
31+
2732
export interface CloudflareKeyVault {
2833
apiKey?: string;
2934
baseURLOrAccountID?: string;
@@ -96,7 +101,7 @@ export interface UserKeyVaults extends SearchEngineKeyVaults {
96101
upstage?: OpenAICompatibleKeyVault;
97102
v0?: OpenAICompatibleKeyVault;
98103
vercelaigateway?: OpenAICompatibleKeyVault;
99-
vertexai?: OpenAICompatibleKeyVault;
104+
vertexai?: VertexAIKeyVault;
100105
vllm?: OpenAICompatibleKeyVault;
101106
volcengine?: OpenAICompatibleKeyVault;
102107
wenxin?: OpenAICompatibleKeyVault;

src/app/[variants]/(main)/settings/provider/detail/vertexai/index.tsx

Lines changed: 64 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use client';
22

3-
import { Markdown } from '@lobehub/ui';
3+
import { Markdown, Select } from '@lobehub/ui';
44
import { createStyles } from 'antd-style';
55
import { useTranslation } from 'react-i18next';
66

@@ -28,6 +28,48 @@ const useStyles = createStyles(({ css, token }) => ({
2828

2929
const providerKey: GlobalLLMProviderKey = 'vertexai';
3030

31+
const VERTEX_AI_REGIONS: string[] = [
32+
'global',
33+
'us-central1',
34+
'us-east1',
35+
'us-east4',
36+
'us-west1',
37+
'us-west2',
38+
'us-west3',
39+
'us-west4',
40+
'us-south1',
41+
'northamerica-northeast1',
42+
'northamerica-northeast2',
43+
'southamerica-east1',
44+
'southamerica-west1',
45+
'europe-central2',
46+
'europe-north1',
47+
'europe-southwest1',
48+
'europe-west1',
49+
'europe-west2',
50+
'europe-west3',
51+
'europe-west4',
52+
'europe-west6',
53+
'europe-west8',
54+
'europe-west9',
55+
'europe-west10',
56+
'europe-west12',
57+
'me-central1',
58+
'me-central2',
59+
'me-west1',
60+
'africa-south1',
61+
'asia-east1',
62+
'asia-east2',
63+
'asia-northeast1',
64+
'asia-northeast2',
65+
'asia-northeast3',
66+
'asia-south1',
67+
'asia-southeast1',
68+
'asia-southeast2',
69+
'australia-southeast1',
70+
'australia-southeast2',
71+
];
72+
3173
// Same as OpenAIProvider, but replace API Key with HuggingFace Access Token
3274
const useProviderCard = (): ProviderItem => {
3375
const { t } = useTranslation('modelProvider');
@@ -54,6 +96,27 @@ const useProviderCard = (): ProviderItem => {
5496
label: t('vertexai.apiKey.title'),
5597
name: [KeyVaultsConfigKey, LLMProviderApiTokenKey],
5698
},
99+
{
100+
children: isLoading ? (
101+
<SkeletonInput />
102+
) : (
103+
<Select
104+
allowClear
105+
options={VERTEX_AI_REGIONS.map((region) => ({
106+
label: region,
107+
value: region,
108+
}))}
109+
placeholder={t('vertexai.region.placeholder')}
110+
/>
111+
),
112+
desc: (
113+
<Markdown className={styles.markdown} fontSize={12} variant={'chat'}>
114+
{t('vertexai.region.desc')}
115+
</Markdown>
116+
),
117+
label: t('vertexai.region.title'),
118+
name: [KeyVaultsConfigKey, 'region'],
119+
},
57120
],
58121
};
59122
};

src/locales/default/modelProvider.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -407,6 +407,11 @@ export default {
407407
placeholder: `{ "type": "service_account", "project_id": "xxx", "private_key_id": ... }`,
408408
title: 'Vertex AI Keys',
409409
},
410+
region: {
411+
desc: '选择 Vertex AI 服务的区域。某些模型如 Gemini 2.5 仅在特定区域可用(如 global)',
412+
placeholder: '选择区域',
413+
title: 'Vertex AI 区域',
414+
},
410415
},
411416
zeroone: {
412417
title: '01.AI 零一万物',

src/server/modules/ModelRuntime/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ const buildVertexOptions = (
136136

137137
const project = projectFromParams ?? projectFromCredentials ?? projectFromEnv;
138138
const location =
139-
(params.location as string | undefined) ?? process.env.VERTEXAI_LOCATION ?? undefined;
139+
(params.location as string | undefined) ?? payload.vertexAIRegion ?? process.env.VERTEXAI_LOCATION ?? undefined;
140140

141141
const googleAuthOptions = params.googleAuthOptions ?? (credentials ? { credentials } : undefined);
142142

src/services/_auth.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
ClientSecretPayload,
66
CloudflareKeyVault,
77
OpenAICompatibleKeyVault,
8+
VertexAIKeyVault,
89
} from '@lobechat/types';
910
import { clientApiKeyManager } from '@lobechat/utils/client';
1011
import { ModelProvider } from 'model-bank';
@@ -21,7 +22,8 @@ export const getProviderAuthPayload = (
2122
keyVaults: OpenAICompatibleKeyVault &
2223
AzureOpenAIKeyVault &
2324
AWSBedrockKeyVault &
24-
CloudflareKeyVault,
25+
CloudflareKeyVault &
26+
VertexAIKeyVault,
2527
) => {
2628
switch (provider) {
2729
case ModelProvider.Bedrock: {
@@ -76,7 +78,11 @@ export const getProviderAuthPayload = (
7678

7779
case ModelProvider.VertexAI: {
7880
// Vertex AI uses JSON credentials, should not split by comma
79-
return { apiKey: keyVaults?.apiKey, baseURL: keyVaults?.baseURL };
81+
return {
82+
apiKey: keyVaults?.apiKey,
83+
baseURL: keyVaults?.baseURL,
84+
vertexAIRegion: keyVaults?.region,
85+
};
8086
}
8187

8288
default: {

0 commit comments

Comments
 (0)