Skip to content

Commit 8c10d62

Browse files
committed
refactor(core): 统一 Provider-Adapter 架构,新增 DashScope 支持
- 新增 DashScope 文本和图像适配器 - 重构模型默认配置,从 Adapter 获取 Provider 元数据 - 删除冗余的 static-models.ts 和 text-model-defaults.ts - 统一 PROVIDER_ENV_KEYS 映射管理 - 更新 UI 组件适配新架构 - 新增 DashScope 相关国际化文案
1 parent 7892ec7 commit 8c10d62

25 files changed

+1209
-646
lines changed
Lines changed: 78 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,44 @@
1-
import { ImageModelConfig, IImageAdapterRegistry } from '../image/types'
1+
import type { ImageModelConfig, IImageAdapterRegistry } from '../image/types'
2+
import { ImageAdapterRegistry } from '../image/adapters/registry'
23
import { getEnvVar } from '../../utils/environment'
34

45
/**
56
* 图像模型默认配置生成器
67
* 返回完整的自包含配置对象,包含provider和model完整信息
8+
*
9+
* baseURL 和默认 modelId 从 Adapter 获取,避免硬编码
10+
*
11+
* @param registry 可选,图像适配器注册表(用于依赖注入和测试)
712
*/
8-
export function getDefaultImageModels(registry: IImageAdapterRegistry): Record<string, ImageModelConfig> {
13+
export function getDefaultImageModels(registry?: IImageAdapterRegistry): Record<string, ImageModelConfig> {
14+
const adapterRegistry = registry || new ImageAdapterRegistry()
15+
16+
// 环境变量
917
const GEMINI_API_KEY = getEnvVar('VITE_GEMINI_API_KEY').trim()
1018
const SEEDREAM_API_KEY = (
1119
getEnvVar('VITE_SEEDREAM_API_KEY') ||
12-
getEnvVar('VITE_ARK_API_KEY') ).trim()
20+
getEnvVar('VITE_ARK_API_KEY')).trim()
1321
const SEEDREAM_BASE_URL = (
1422
getEnvVar('VITE_SEEDREAM_BASE_URL') ||
15-
getEnvVar('VITE_ARK_BASE_URL') ).trim()
23+
getEnvVar('VITE_ARK_BASE_URL')).trim()
1624
const OPENROUTER_API_KEY = getEnvVar('VITE_OPENROUTER_API_KEY').trim()
1725
const SILICONFLOW_API_KEY = getEnvVar('VITE_SILICONFLOW_API_KEY').trim()
1826
const OPENAI_API_KEY = getEnvVar('VITE_OPENAI_API_KEY').trim()
1927
const OPENAI_BASE_URL = getEnvVar('VITE_OPENAI_BASE_URL').trim()
28+
const DASHSCOPE_API_KEY = getEnvVar('VITE_DASHSCOPE_API_KEY').trim()
29+
30+
// 辅助函数:获取 Provider 的默认 baseURL
31+
const getDefaultBaseURL = (providerId: string): string => {
32+
const adapter = adapterRegistry.getAdapter(providerId)
33+
return adapter.getProvider().defaultBaseURL || ''
34+
}
35+
36+
// 辅助函数:获取 Provider 的第一个模型 ID 作为默认
37+
const getDefaultModelId = (providerId: string): string => {
38+
const models = adapterRegistry.getStaticModels(providerId)
39+
return models[0]?.id || providerId
40+
}
41+
2042
// 辅助函数:构建完整配置
2143
const buildConfig = (
2244
configId: string,
@@ -27,80 +49,113 @@ export function getDefaultImageModels(registry: IImageAdapterRegistry): Record<s
2749
connectionConfig?: any,
2850
paramOverrides?: any
2951
): ImageModelConfig => {
30-
// 获取provider信息
31-
const adapter = registry.getAdapter(providerId)
52+
const adapter = adapterRegistry.getAdapter(providerId)
3253
const provider = adapter.getProvider()
3354

3455
// 尝试从静态模型列表获取模型信息
35-
let model = registry.getStaticModels(providerId).find(m => m.id === modelId)
56+
let model = adapterRegistry.getStaticModels(providerId).find(m => m.id === modelId)
3657

3758
// 如果静态模型不存在,使用buildDefaultModel构建
3859
if (!model) {
3960
model = adapter.buildDefaultModel(modelId)
4061
}
4162

63+
// 合并模型默认参数和用户指定的参数覆盖
64+
// 用户指定的参数优先级更高
65+
const modelDefaults = model.defaultParameterValues || {}
66+
const mergedParamOverrides = { ...modelDefaults, ...(paramOverrides ?? {}) }
67+
4268
return {
4369
id: configId,
4470
name,
4571
providerId,
4672
modelId,
4773
enabled,
4874
connectionConfig,
49-
paramOverrides: paramOverrides ?? {},
75+
paramOverrides: mergedParamOverrides,
5076
customParamOverrides: {},
5177
provider,
5278
model
5379
}
5480
}
5581

56-
// 以字典列表描述默认配置,避免重复书写 id
82+
// 预设配置列表
83+
// baseURL 优先使用环境变量,否则从 Provider 获取默认值
84+
// modelId 使用 Provider 的第一个模型作为默认
5785
const entries = [
5886
{
5987
id: 'image-openrouter-nanobanana',
6088
name: 'OpenRouter Nano Banana',
6189
providerId: 'openrouter',
62-
modelId: 'google/gemini-2.5-flash-image-preview',
90+
modelId: getDefaultModelId('openrouter'),
6391
enabled: !!OPENROUTER_API_KEY,
64-
connectionConfig: { apiKey: OPENROUTER_API_KEY, baseURL: 'https://openrouter.ai/api/v1' },
92+
connectionConfig: {
93+
apiKey: OPENROUTER_API_KEY,
94+
baseURL: getDefaultBaseURL('openrouter')
95+
},
6596
paramOverrides: {}
6697
},
6798
{
6899
id: 'image-gemini-nanobanana',
69100
name: 'Gemini Nano Banana',
70101
providerId: 'gemini',
71-
modelId: 'gemini-2.5-flash-image-preview',
102+
modelId: getDefaultModelId('gemini'),
72103
enabled: !!GEMINI_API_KEY,
73-
connectionConfig: { apiKey: GEMINI_API_KEY },
104+
connectionConfig: {
105+
apiKey: GEMINI_API_KEY,
106+
baseURL: getDefaultBaseURL('gemini')
107+
},
74108
paramOverrides: { outputMimeType: 'image/png' }
75109
},
76110
{
77111
id: 'image-openai-gpt',
78112
name: 'OpenAI GPT Image 1',
79113
providerId: 'openai',
80-
modelId: 'gpt-image-1',
114+
modelId: getDefaultModelId('openai'),
81115
enabled: !!OPENAI_API_KEY,
82-
connectionConfig: { apiKey: OPENAI_API_KEY, baseURL: OPENAI_BASE_URL || 'https://api.openai.com/v1' },
116+
connectionConfig: {
117+
apiKey: OPENAI_API_KEY,
118+
baseURL: OPENAI_BASE_URL || getDefaultBaseURL('openai')
119+
},
83120
paramOverrides: { size: '1024x1024', quality: 'auto', background: 'auto' }
84121
},
85122
{
86123
id: 'image-siliconflow-kolors',
87124
name: 'SiliconFlow Kolors',
88125
providerId: 'siliconflow',
89-
modelId: 'Kwai-Kolors/Kolors',
126+
modelId: getDefaultModelId('siliconflow'),
90127
enabled: !!SILICONFLOW_API_KEY,
91-
connectionConfig: { apiKey: SILICONFLOW_API_KEY, baseURL: 'https://api.siliconflow.cn/v1' },
128+
connectionConfig: {
129+
apiKey: SILICONFLOW_API_KEY,
130+
baseURL: getDefaultBaseURL('siliconflow')
131+
},
92132
paramOverrides: { image_size: '1024x1024', num_inference_steps: 20, guidance_scale: 7.5, outputMimeType: 'image/png' }
93133
},
94134
{
95135
id: 'image-seedream',
96136
name: 'Doubao Seedream 4.0',
97137
providerId: 'seedream',
98-
modelId: 'doubao-seedream-4-0-250828',
138+
modelId: getDefaultModelId('seedream'),
99139
enabled: !!SEEDREAM_API_KEY,
100-
connectionConfig: { apiKey: SEEDREAM_API_KEY, baseURL: SEEDREAM_BASE_URL || 'https://ark.cn-beijing.volces.com/api/v3' },
140+
connectionConfig: {
141+
apiKey: SEEDREAM_API_KEY,
142+
baseURL: SEEDREAM_BASE_URL || getDefaultBaseURL('seedream')
143+
},
101144
paramOverrides: { size: '1024x1024', watermark: false, outputMimeType: 'image/png' }
145+
},
146+
{
147+
id: 'image-dashscope',
148+
name: 'DashScope Qwen',
149+
providerId: 'dashscope',
150+
modelId: getDefaultModelId('dashscope'),
151+
enabled: !!DASHSCOPE_API_KEY,
152+
connectionConfig: {
153+
apiKey: DASHSCOPE_API_KEY,
154+
baseURL: getDefaultBaseURL('dashscope')
155+
},
156+
paramOverrides: {}
102157
}
103-
] as const
158+
]
104159

105160
const models: Record<string, ImageModelConfig> = {}
106161
for (const e of entries) {
@@ -109,3 +164,6 @@ export function getDefaultImageModels(registry: IImageAdapterRegistry): Record<s
109164

110165
return models
111166
}
167+
168+
// 直接导出所有图像模型配置(保持向后兼容,与文本模型风格一致)
169+
export const defaultImageModels = getDefaultImageModels()

0 commit comments

Comments
 (0)