diff --git a/src/components/SettingsModal.tsx b/src/components/SettingsModal.tsx index 1942c8a..19f6daa 100644 --- a/src/components/SettingsModal.tsx +++ b/src/components/SettingsModal.tsx @@ -13,6 +13,7 @@ export const SettingsModal: React.FC = ({ open, onOpenChange const [geminiApiKey, setGeminiApiKey] = useState(''); const [uploadApiUrl, setUploadApiUrl] = useState(''); const [uploadAssetUrl, setUploadAssetUrl] = useState(''); + const [modelName, setModelName] = useState(''); // 组件挂载时从localStorage加载设置 useEffect(() => { @@ -21,11 +22,13 @@ export const SettingsModal: React.FC = ({ open, onOpenChange const savedGeminiApiKey = localStorage.getItem('VITE_GEMINI_API_KEY') || ''; const savedUploadApiUrl = localStorage.getItem('VITE_UPLOAD_API') || ''; const savedUploadAssetUrl = localStorage.getItem('VITE_UPLOAD_ASSET_URL') || ''; + const savedModelName = localStorage.getItem('VITE_GEMINI_MODEL_NAME') || 'gemini-2.5-flash-image-preview'; setAccessToken(savedAccessToken); setGeminiApiKey(savedGeminiApiKey); setUploadApiUrl(savedUploadApiUrl); setUploadAssetUrl(savedUploadAssetUrl); + setModelName(savedModelName); } }, [open]); @@ -55,6 +58,12 @@ export const SettingsModal: React.FC = ({ open, onOpenChange localStorage.removeItem('VITE_UPLOAD_ASSET_URL'); } + if (modelName) { + localStorage.setItem('VITE_GEMINI_MODEL_NAME', modelName); + } else { + localStorage.removeItem('VITE_GEMINI_MODEL_NAME'); + } + // 显示保存成功的提示 alert('设置已保存!'); @@ -68,11 +77,13 @@ export const SettingsModal: React.FC = ({ open, onOpenChange const defaultGeminiApiKey = import.meta.env.VITE_GEMINI_API_KEY || ''; const defaultUploadApiUrl = import.meta.env.VITE_UPLOAD_API || ''; const defaultUploadAssetUrl = import.meta.env.VITE_UPLOAD_ASSET_URL || ''; + const defaultModelName = import.meta.env.VITE_GEMINI_MODEL_NAME || 'gemini-2.5-flash-image-preview'; setAccessToken(defaultAccessToken); setGeminiApiKey(defaultGeminiApiKey); setUploadApiUrl(defaultUploadApiUrl); setUploadAssetUrl(defaultUploadAssetUrl); + setModelName(defaultModelName); }; return ( @@ -160,6 +171,23 @@ export const SettingsModal: React.FC = ({ open, onOpenChange 图像上传后返回的URL前缀

+ +
+ + setModelName(e.target.value)} + className="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-yellow-500 focus:border-transparent" + placeholder="输入模型名称" + /> +

+ 用于AI图像生成和编辑的Google Gemini模型名称 +

+
diff --git a/src/services/geminiService.ts b/src/services/geminiService.ts index 6c960c5..f3c57d8 100644 --- a/src/services/geminiService.ts +++ b/src/services/geminiService.ts @@ -3,6 +3,8 @@ import { GoogleGenAI } from '@google/genai' // 注意:在生产环境中,这应该通过后端代理处理 // 优先使用localStorage中的API密钥,如果没有则使用环境变量中的,最后使用默认值 const API_KEY = localStorage.getItem('VITE_GEMINI_API_KEY') || import.meta.env.VITE_GEMINI_API_KEY || 'demo-key' +// 优先使用localStorage中的模型名称,如果没有则使用环境变量中的,最后使用默认值 +const MODEL_NAME = localStorage.getItem('VITE_GEMINI_MODEL_NAME') || import.meta.env.VITE_GEMINI_MODEL_NAME || 'gemini-2.5-flash-image-preview' const genAI = new GoogleGenAI({ apiKey: API_KEY }) export interface GenerationRequest { @@ -144,7 +146,7 @@ export class GeminiService { contents: Array<{ text: string } | { inlineData: { mimeType: string; data: string } }> config?: { httpOptions: { abortSignal: AbortSignal } } } = { - model: 'gemini-2.5-flash-image-preview', + model: MODEL_NAME, contents, } @@ -383,7 +385,7 @@ export class GeminiService { contents: Array<{ text: string } | { inlineData: { mimeType: string; data: string } }> config?: { httpOptions: { abortSignal: AbortSignal } } } = { - model: 'gemini-2.5-flash-image-preview', + model: MODEL_NAME, contents, } @@ -552,7 +554,7 @@ export class GeminiService { contents: Array<{ text: string } | { inlineData: { mimeType: string; data: string } }> config?: { httpOptions: { abortSignal: AbortSignal } } } = { - model: 'gemini-2.5-flash-image-preview', + model: MODEL_NAME, contents: prompt, }