diff --git a/src/components/providers/GeminiSection/GeminiSection.tsx b/src/components/providers/GeminiSection/GeminiSection.tsx
index 1d25f3c..1ebbf83 100644
--- a/src/components/providers/GeminiSection/GeminiSection.tsx
+++ b/src/components/providers/GeminiSection/GeminiSection.tsx
@@ -125,6 +125,12 @@ export function GeminiSection({
{item.baseUrl}
)}
+ {item.proxyUrl && (
+
+ {t('common.proxy_url')}:
+ {item.proxyUrl}
+
+ )}
{headerEntries.length > 0 && (
{headerEntries.map(([key, value]) => (
diff --git a/src/i18n/locales/en.json b/src/i18n/locales/en.json
index e80722f..297448a 100644
--- a/src/i18n/locales/en.json
+++ b/src/i18n/locales/en.json
@@ -194,6 +194,8 @@
"gemini_keys_add_btn": "Add Key",
"gemini_base_url_label": "Base URL (Optional):",
"gemini_base_url_placeholder": "e.g.: https://generativelanguage.googleapis.com",
+ "gemini_add_modal_proxy_label": "Proxy URL (Optional):",
+ "gemini_add_modal_proxy_placeholder": "e.g.: socks5://proxy.example.com:1080",
"gemini_edit_modal_title": "Edit Gemini API Key",
"gemini_edit_modal_key_label": "API Key:",
"gemini_delete_confirm": "Are you sure you want to delete this Gemini key?",
diff --git a/src/i18n/locales/ru.json b/src/i18n/locales/ru.json
index 0be9e95..c299e3f 100644
--- a/src/i18n/locales/ru.json
+++ b/src/i18n/locales/ru.json
@@ -194,6 +194,8 @@
"gemini_keys_add_btn": "Добавить ключ",
"gemini_base_url_label": "Базовый URL (необязательно):",
"gemini_base_url_placeholder": "например: https://generativelanguage.googleapis.com",
+ "gemini_add_modal_proxy_label": "URL прокси (необязательно):",
+ "gemini_add_modal_proxy_placeholder": "например: socks5://proxy.example.com:1080",
"gemini_edit_modal_title": "Редактирование API-ключа Gemini",
"gemini_edit_modal_key_label": "API-ключ:",
"gemini_delete_confirm": "Удалить этот ключ Gemini?",
diff --git a/src/i18n/locales/zh-CN.json b/src/i18n/locales/zh-CN.json
index d176a4a..a3b65b5 100644
--- a/src/i18n/locales/zh-CN.json
+++ b/src/i18n/locales/zh-CN.json
@@ -194,6 +194,8 @@
"gemini_keys_add_btn": "添加密钥",
"gemini_base_url_label": "Base URL (可选)",
"gemini_base_url_placeholder": "例如: https://generativelanguage.googleapis.com",
+ "gemini_add_modal_proxy_label": "代理 URL (可选):",
+ "gemini_add_modal_proxy_placeholder": "例如: socks5://proxy.example.com:1080",
"gemini_edit_modal_title": "编辑Gemini API密钥",
"gemini_edit_modal_key_label": "API密钥:",
"gemini_delete_confirm": "确定要删除这个Gemini密钥吗?",
diff --git a/src/pages/AiProvidersGeminiEditPage.tsx b/src/pages/AiProvidersGeminiEditPage.tsx
index 441cad3..015f7c9 100644
--- a/src/pages/AiProvidersGeminiEditPage.tsx
+++ b/src/pages/AiProvidersGeminiEditPage.tsx
@@ -21,6 +21,7 @@ const buildEmptyForm = (): GeminiFormState => ({
apiKey: '',
prefix: '',
baseUrl: '',
+ proxyUrl: '',
headers: [],
excludedModels: [],
excludedText: '',
@@ -138,6 +139,7 @@ export function AiProvidersGeminiEditPage() {
apiKey: form.apiKey.trim(),
prefix: form.prefix?.trim() || undefined,
baseUrl: form.baseUrl?.trim() || undefined,
+ proxyUrl: form.proxyUrl?.trim() || undefined,
headers: buildHeaderObject(form.headers),
excludedModels: parseExcludedModels(form.excludedText),
};
@@ -218,6 +220,13 @@ export function AiProvidersGeminiEditPage() {
onChange={(e) => setForm((prev) => ({ ...prev, baseUrl: e.target.value }))}
disabled={disableControls || saving}
/>
+ setForm((prev) => ({ ...prev, proxyUrl: e.target.value }))}
+ disabled={disableControls || saving}
+ />
setForm((prev) => ({ ...prev, headers: entries }))}
diff --git a/src/services/api/providers.ts b/src/services/api/providers.ts
index d56de47..5a0bf8d 100644
--- a/src/services/api/providers.ts
+++ b/src/services/api/providers.ts
@@ -99,6 +99,7 @@ const serializeGeminiKey = (config: GeminiKeyConfig) => {
const payload: Record = { 'api-key': config.apiKey };
if (config.prefix?.trim()) payload.prefix = config.prefix.trim();
if (config.baseUrl) payload['base-url'] = config.baseUrl;
+ if (config.proxyUrl) payload['proxy-url'] = config.proxyUrl;
const headers = serializeHeaders(config.headers);
if (headers) payload.headers = headers;
if (config.excludedModels && config.excludedModels.length) {
diff --git a/src/services/api/transformers.ts b/src/services/api/transformers.ts
index b6b5830..ef89361 100644
--- a/src/services/api/transformers.ts
+++ b/src/services/api/transformers.ts
@@ -153,6 +153,8 @@ const normalizeGeminiKeyConfig = (item: unknown): GeminiKeyConfig | null => {
if (prefix) config.prefix = prefix;
const baseUrl = record ? record['base-url'] ?? record.baseUrl ?? record['base_url'] : undefined;
if (baseUrl) config.baseUrl = String(baseUrl);
+ const proxyUrl = record ? record['proxy-url'] ?? record.proxyUrl ?? record['proxy_url'] : undefined;
+ if (proxyUrl) config.proxyUrl = String(proxyUrl);
const headers = normalizeHeaders(record?.headers);
if (headers) config.headers = headers;
const excludedModels = normalizeExcludedModels(record?.['excluded-models'] ?? record?.excludedModels);
diff --git a/src/types/provider.ts b/src/types/provider.ts
index c0999f5..73d3c84 100644
--- a/src/types/provider.ts
+++ b/src/types/provider.ts
@@ -20,6 +20,7 @@ export interface GeminiKeyConfig {
apiKey: string;
prefix?: string;
baseUrl?: string;
+ proxyUrl?: string;
headers?: Record;
excludedModels?: string[];
}