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[]; }