1- import { ImageModelConfig , IImageAdapterRegistry } from '../image/types'
1+ import type { ImageModelConfig , IImageAdapterRegistry } from '../image/types'
2+ import { ImageAdapterRegistry } from '../image/adapters/registry'
23import { 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