feat: 添加新 VIP 图片模型并优化模型选择器
- 新增 gemini-3-pro-image-preview-vip 系列模型(含 2k、4k 版本) - 实现分组模型选择器,分为推荐和更多两组 - 更新默认图片模型为 gemini-3-pro-image-preview-vip - 为所有模型添加别名显示(如 nano-banana-2-vip) - 图片生成请求添加 "Generate an image:" 前缀强调出图
This commit is contained in:
1 parent
026a1224f7
commit
64ca94669c
7 files changed
+46
-19
No files matched your search
@@ -7,13 +7,39 @@ import { geminiSettings } from '../../utils/settings-manager';
|
||||
import { Tooltip, Select } from 'tdesign-react';
|
||||
import { InfoCircleIcon } from 'tdesign-icons-react';
|
||||
|
||||
export const IMAGE_MODEL_OPTIONS = [
|
||||
// VIP models - shown at top
|
||||
export const IMAGE_MODEL_VIP_OPTIONS = [
|
||||
{ label: 'gemini-3-pro-image-preview-vip (nano-banana-2-vip)', value: 'gemini-3-pro-image-preview-vip' },
|
||||
{ label: 'gemini-3-pro-image-preview-2k-vip (nano-banana-2-2k-vip)', value: 'gemini-3-pro-image-preview-2k-vip' },
|
||||
{ label: 'gemini-3-pro-image-preview-4k-vip (nano-banana-2-4k-vip)', value: 'gemini-3-pro-image-preview-4k-vip' },
|
||||
{ label: 'gemini-2.5-flash-image-vip (nano-banana-vip)', value: 'gemini-2.5-flash-image-vip' },
|
||||
];
|
||||
|
||||
// Additional models - shown in "More" section
|
||||
export const IMAGE_MODEL_MORE_OPTIONS = [
|
||||
{ label: 'gemini-3-pro-image-preview (nano-banana-2)', value: 'gemini-3-pro-image-preview' },
|
||||
{ label: 'gemini-2.5-flash-image (nano-banana)', value: 'gemini-2.5-flash-image' },
|
||||
{ label: 'gemini-3-pro-image-preview-hd (nano-banana-2-hd)', value: 'gemini-3-pro-image-preview-hd' },
|
||||
{ label: 'gemini-3-pro-image-preview-2k (nano-banana-2-2k)', value: 'gemini-3-pro-image-preview-2k' },
|
||||
{ label: 'gemini-3-pro-image-preview-4k (nano-banana-2-4k)', value: 'gemini-3-pro-image-preview-4k' },
|
||||
{ label: 'gemini-2.5-flash-image-vip (nano-banana-vip)', value: 'gemini-2.5-flash-image-vip' },
|
||||
{ label: 'gemini-2.5-flash-image (nano-banana)', value: 'gemini-2.5-flash-image' },
|
||||
];
|
||||
|
||||
// Combined options for backward compatibility (flat list)
|
||||
export const IMAGE_MODEL_OPTIONS = [
|
||||
...IMAGE_MODEL_VIP_OPTIONS,
|
||||
...IMAGE_MODEL_MORE_OPTIONS,
|
||||
];
|
||||
|
||||
// Grouped options for Select with "More" section
|
||||
export const IMAGE_MODEL_GROUPED_OPTIONS = [
|
||||
{
|
||||
group: '推荐',
|
||||
children: IMAGE_MODEL_VIP_OPTIONS,
|
||||
},
|
||||
{
|
||||
group: '更多',
|
||||
children: IMAGE_MODEL_MORE_OPTIONS,
|
||||
},
|
||||
];
|
||||
|
||||
export const VIDEO_MODEL_OPTIONS = [
|
||||
@@ -44,7 +70,7 @@ export const SettingsDialog = ({
|
||||
const config = geminiSettings.get();
|
||||
setApiKey(config.apiKey || '');
|
||||
setBaseUrl(config.baseUrl || 'https://api.tu-zi.com/v1');
|
||||
setImageModelName(config.imageModelName || 'gemini-2.5-flash-image-vip');
|
||||
setImageModelName(config.imageModelName || 'gemini-3-pro-image-preview-vip');
|
||||
setVideoModelName(config.videoModelName || 'veo3');
|
||||
}
|
||||
}, [appState.openSettings]);
|
||||
@@ -54,7 +80,7 @@ export const SettingsDialog = ({
|
||||
geminiSettings.update({
|
||||
apiKey: apiKey.trim(),
|
||||
baseUrl: baseUrl.trim() || 'https://api.tu-zi.com/v1',
|
||||
imageModelName: imageModelName.trim() || 'gemini-2.5-flash-image-vip',
|
||||
imageModelName: imageModelName.trim() || 'gemini-3-pro-image-preview-vip',
|
||||
videoModelName: videoModelName.trim() || 'veo3',
|
||||
});
|
||||
|
||||
@@ -120,10 +146,10 @@ export const SettingsDialog = ({
|
||||
className="settings-dialog__select"
|
||||
value={imageModelName}
|
||||
onChange={(value) => setImageModelName(value as string)}
|
||||
options={IMAGE_MODEL_OPTIONS}
|
||||
options={IMAGE_MODEL_GROUPED_OPTIONS}
|
||||
filterable
|
||||
creatable
|
||||
placeholder="gemini-2.5-flash-image"
|
||||
placeholder="gemini-3-pro-image-preview-vip"
|
||||
/>
|
||||
</div>
|
||||
<div className="settings-dialog__field">
|
||||
|
||||
@@ -7,7 +7,7 @@ import { useTaskQueue } from '../../hooks/useTaskQueue';
|
||||
import { TaskType } from '../../types/task.types';
|
||||
import { MessagePlugin, Select } from 'tdesign-react';
|
||||
import { useGenerationHistory } from '../../hooks/useGenerationHistory';
|
||||
import { IMAGE_MODEL_OPTIONS } from '../settings-dialog/settings-dialog';
|
||||
import { IMAGE_MODEL_GROUPED_OPTIONS } from '../settings-dialog/settings-dialog';
|
||||
import {
|
||||
useGenerationState,
|
||||
useKeyboardShortcuts,
|
||||
@@ -225,7 +225,7 @@ const AIImageGeneration = ({
|
||||
|
||||
// Get current image model from settings
|
||||
const settings = geminiSettings.get();
|
||||
const currentImageModel = settings.imageModelName || 'gemini-2.5-flash-image-vip';
|
||||
const currentImageModel = settings.imageModelName || 'gemini-3-pro-image-preview-vip';
|
||||
|
||||
for (let i = 0; i < count; i++) {
|
||||
const taskParams = {
|
||||
@@ -363,7 +363,7 @@ const AIImageGeneration = ({
|
||||
<Select
|
||||
value={selectedModel}
|
||||
onChange={(value) => onModelChange(value as string)}
|
||||
options={IMAGE_MODEL_OPTIONS}
|
||||
options={IMAGE_MODEL_GROUPED_OPTIONS}
|
||||
size="small"
|
||||
placeholder={language === 'zh' ? '选择图片模型' : 'Select Image Model'}
|
||||
filterable
|
||||
|
||||
@@ -32,7 +32,7 @@ const TTDDialogComponent = ({ container }: { container: HTMLElement | null }) =>
|
||||
// 加载当前模型设置
|
||||
useEffect(() => {
|
||||
const config = geminiSettings.get();
|
||||
setSelectedImageModel(config.imageModelName || 'gemini-2.5-flash-image-vip');
|
||||
setSelectedImageModel(config.imageModelName || 'gemini-3-pro-image-preview-vip');
|
||||
setSelectedVideoModel(config.videoModelName || 'veo3');
|
||||
}, []);
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@ export async function callApiRaw(
|
||||
messages: GeminiMessage[],
|
||||
): Promise<GeminiResponse> {
|
||||
const startTime = Date.now();
|
||||
const model = config.modelName || 'gemini-2.5-flash-image-vip';
|
||||
const model = config.modelName || 'gemini-3-pro-image-preview-vip';
|
||||
const endpoint = '/chat/completions';
|
||||
|
||||
// Track API call start
|
||||
@@ -119,7 +119,7 @@ export async function callApiStreamRaw(
|
||||
signal?: AbortSignal
|
||||
): Promise<GeminiResponse> {
|
||||
const startTime = Date.now();
|
||||
const model = config.modelName || 'gemini-2.5-flash-image-vip';
|
||||
const model = config.modelName || 'gemini-3-pro-image-preview-vip';
|
||||
const endpoint = '/chat/completions';
|
||||
|
||||
// Track API call start
|
||||
@@ -472,7 +472,7 @@ export async function callApiWithRetry(
|
||||
): Promise<GeminiResponse> {
|
||||
const maxRetries = config.maxRetries || DEFAULT_CONFIG.maxRetries!;
|
||||
const retryDelay = config.retryDelay || DEFAULT_CONFIG.retryDelay!;
|
||||
const model = config.modelName || 'gemini-2.5-flash-image-vip';
|
||||
const model = config.modelName || 'gemini-3-pro-image-preview-vip';
|
||||
const endpoint = '/chat/completions';
|
||||
|
||||
for (let attempt = 0; attempt < maxRetries; attempt++) {
|
||||
|
||||
@@ -6,7 +6,7 @@ import { GeminiConfig } from './types';
|
||||
|
||||
// 默认配置
|
||||
export const DEFAULT_CONFIG: Partial<GeminiConfig> = {
|
||||
modelName: 'gemini-2.5-flash-image-vip', // 图片生成和聊天的默认模型
|
||||
modelName: 'gemini-3-pro-image-preview-vip', // 图片生成和聊天的默认模型
|
||||
maxRetries: 10,
|
||||
retryDelay: 0,
|
||||
timeout: 10 * 60 * 1000, // 10分钟,HTTP 请求超时
|
||||
|
||||
@@ -39,10 +39,11 @@ export async function generateImageWithGemini(
|
||||
'Content-Type': 'application/json',
|
||||
};
|
||||
|
||||
// 构建请求体
|
||||
// 构建请求体 - 强调生成图片
|
||||
const enhancedPrompt = `Generate an image: ${prompt}`;
|
||||
const data: any = {
|
||||
model: validatedConfig.modelName || 'gemini-2.5-flash-image-vip',
|
||||
prompt,
|
||||
model: validatedConfig.modelName || 'gemini-3-pro-image-preview-vip',
|
||||
prompt: enhancedPrompt,
|
||||
response_format: options.response_format || 'url', // 默认返回 url
|
||||
};
|
||||
|
||||
|
||||
@@ -30,7 +30,7 @@ const DEFAULT_SETTINGS: AppSettings = {
|
||||
apiKey: '',
|
||||
baseUrl: 'https://api.tu-zi.com/v1',
|
||||
chatModel: 'gpt-5',
|
||||
imageModelName: 'gemini-2.5-flash-image-vip',
|
||||
imageModelName: 'gemini-3-pro-image-preview-vip',
|
||||
videoModelName: 'veo3',
|
||||
},
|
||||
};
|
||||
|
||||
Reference in new issue
Block a user