接入 GPT Image 2.5 双 provider 启动路由

启动时分别构造 VectorEngine 与 Tiantoken 图片 client

按生成、编辑和 nanobanana 模型选择具体 provider

迁移 api-server、编辑器 Agent 与 raw edit 调用方

拆分 GPT Image 2.5 生成与编辑定价并隐藏 provider 具体值
This commit is contained in:
2026-09-18 16:28:45 +08:00
parent c34d24c2c8
commit b294cbc3db
16 changed files with 430 additions and 160 deletions
@@ -44,6 +44,7 @@ import {
// 中文注释:与 api-server/src/editor_generation_config.rs 保持同名模型定价语义,前端仅作为展示兜底。
export const IMAGE_MODEL_GPT_IMAGE_2 = 'gpt-image-2';
export const IMAGE_MODEL_GPT_IMAGE_2_5 = 'gpt-image-2.5';
export const IMAGE_MODEL_NANOBANANA2 = 'gemini-3.1-flash-image-preview';
export const DEFAULT_IMAGE_MODEL = IMAGE_MODEL_NANOBANANA2;
const IMAGE_MODEL_NANOBANANA_ALIASES = new Set([
@@ -51,7 +52,7 @@ const IMAGE_MODEL_NANOBANANA_ALIASES = new Set([
'nanobanana2',
'nano-banana',
]);
export const SPEC_GENERATION_MODEL = IMAGE_MODEL_GPT_IMAGE_2;
export const SPEC_GENERATION_MODEL = IMAGE_MODEL_GPT_IMAGE_2_5;
export const SPEC_GENERATION_ASPECT_RATIO = '16:9';
export const SPEC_GENERATION_IMAGE_SIZE = '2K';
export const SPEC_GENERATION_SIZE = '2048x1152';
@@ -93,6 +94,12 @@ export const EDITOR_IMAGE_MODEL_MUD_POINT_CONFIG = {
'1K': 12,
'2K': 24,
},
[IMAGE_MODEL_GPT_IMAGE_2_5]: {
'1K': 3,
'2K': 5,
},
// Legacy persisted model value; keep readable for old assets without exposing
// it as a new selectable model.
[IMAGE_MODEL_GPT_IMAGE_2]: {
'1K': 3,
'2K': 5,
@@ -127,7 +134,7 @@ export const QUICK_EDIT_SIZE_PRESETS = [
] as const;
export const EDITOR_IMAGE_MODEL_OPTIONS = [
{ label: 'nanobanana2', value: IMAGE_MODEL_NANOBANANA2 },
{ label: 'gpt-image-2', value: IMAGE_MODEL_GPT_IMAGE_2 },
{ label: 'GPT Image 2.5', value: IMAGE_MODEL_GPT_IMAGE_2_5 },
] as const;
export const QUICK_EDIT_MODEL_OPTIONS = EDITOR_IMAGE_MODEL_OPTIONS;
export const EDITOR_IMAGE_DIMENSION_OPTIONS = {
@@ -135,6 +142,10 @@ export const EDITOR_IMAGE_DIMENSION_OPTIONS = {
aspectRatios: ['1:1', '4:3', '3:2', '2:3', '9:16', '16:9'],
imageSizes: ['0.5K', '1K', '2K'],
},
[IMAGE_MODEL_GPT_IMAGE_2_5]: {
aspectRatios: ['1:1', '4:3', '3:2', '2:3', '9:16', '16:9'],
imageSizes: ['1K', '2K'],
},
[IMAGE_MODEL_GPT_IMAGE_2]: {
aspectRatios: ['1:1', '4:3', '3:2', '2:3', '9:16', '16:9'],
imageSizes: ['1K', '2K'],
@@ -381,9 +392,9 @@ export const EDITOR_MODEL_MUD_POINT_CONFIG = {
unit: 'perGeneration',
prices: EDITOR_IMAGE_MODEL_MUD_POINT_CONFIG[IMAGE_MODEL_NANOBANANA2],
},
[IMAGE_MODEL_GPT_IMAGE_2]: {
[IMAGE_MODEL_GPT_IMAGE_2_5]: {
unit: 'perGeneration',
prices: EDITOR_IMAGE_MODEL_MUD_POINT_CONFIG[IMAGE_MODEL_GPT_IMAGE_2],
prices: EDITOR_IMAGE_MODEL_MUD_POINT_CONFIG[IMAGE_MODEL_GPT_IMAGE_2_5],
},
[VIDEO_MODEL_SEEDANCE_2_FAST]: {
unit: 'perSecond',
@@ -1452,7 +1463,7 @@ export function decodeCanvasGenerationInputs(
} else if (action === 'ui-design.generate') {
normalizeStringField('prompt', '用户输入');
normalizeImageParameters({
defaultModel: IMAGE_MODEL_GPT_IMAGE_2,
defaultModel: IMAGE_MODEL_GPT_IMAGE_2_5,
defaultAspectRatio: '16:9',
});
} else if (action === 'image.edit') {
@@ -1993,7 +2004,7 @@ export function buildUiDesignGenerationInputs(
...createGenerationInputField('用户输入', prompt, 'prompt'),
...createGenerationInputField(
'模型',
options.model ?? IMAGE_MODEL_GPT_IMAGE_2,
options.model ?? IMAGE_MODEL_GPT_IMAGE_2_5,
'model',
),
...createGenerationInputField(