diff --git a/src/renderer/src/config/models.ts b/src/renderer/src/config/models.ts index e6276cbb98..6e9c2326ee 100644 --- a/src/renderer/src/config/models.ts +++ b/src/renderer/src/config/models.ts @@ -638,35 +638,59 @@ export const SYSTEM_MODELS: Record = } ], aihubmix: [ + { + id: 'gpt-5', + provider: 'aihubmix', + name: 'gpt-5', + group: 'OpenAI' + }, + { + id: 'gpt-5-mini', + provider: 'aihubmix', + name: 'gpt-5-mini', + group: 'OpenAI' + }, + { + id: 'gpt-5-nano', + provider: 'aihubmix', + name: 'gpt-5-nano', + group: 'OpenAI' + }, + { + id: 'gpt-5-chat-latest', + provider: 'aihubmix', + name: 'gpt-5-chat-latest', + group: 'OpenAI' + }, { id: 'o3', provider: 'aihubmix', name: 'o3', - group: 'gpt' + group: 'OpenAI' }, { id: 'o4-mini', provider: 'aihubmix', name: 'o4-mini', - group: 'gpt' + group: 'OpenAI' }, { id: 'gpt-4.1', provider: 'aihubmix', name: 'gpt-4.1', - group: 'gpt' + group: 'OpenAI' }, { id: 'gpt-4o', provider: 'aihubmix', name: 'gpt-4o', - group: 'gpt' + group: 'OpenAI' }, { id: 'gpt-image-1', provider: 'aihubmix', name: 'gpt-image-1', - group: 'gpt' + group: 'OpenAI' }, { id: 'DeepSeek-V3', @@ -674,29 +698,59 @@ export const SYSTEM_MODELS: Record = name: 'DeepSeek-V3', group: 'DeepSeek' }, + { + id: 'DeepSeek-R1', + provider: 'aihubmix', + name: 'DeepSeek-R1', + group: 'DeepSeek' + }, { id: 'claude-sonnet-4-20250514', provider: 'aihubmix', name: 'claude-sonnet-4-20250514', - group: 'claude' + group: 'Claude' }, { - id: 'gemini-2.5-pro-preview-05-06', + id: 'gemini-2.5-pro', provider: 'aihubmix', - name: 'gemini-2.5-pro-preview-05-06', - group: 'gemini' + name: 'gemini-2.5-pro', + group: 'Gemini' }, { - id: 'gemini-2.5-flash-preview-05-20-nothink', + id: 'gemini-2.5-flash-nothink', provider: 'aihubmix', - name: 'gemini-2.5-flash-preview-05-20-nothink', - group: 'gemini' + name: 'gemini-2.5-flash-nothink', + group: 'Gemini' }, { id: 'gemini-2.5-flash', provider: 'aihubmix', name: 'gemini-2.5-flash', - group: 'gemini' + group: 'Gemini' + }, + { + id: 'Qwen3-235B-A22B-Instruct-2507', + provider: 'aihubmix', + name: 'Qwen3-235B-A22B-Instruct-2507', + group: 'qwen' + }, + { + id: 'kimi-k2-0711-preview', + provider: 'aihubmix', + name: 'kimi-k2-0711-preview', + group: 'moonshot' + }, + { + id: 'Llama-4-Scout-17B-16E-Instruct', + provider: 'aihubmix', + name: 'Llama-4-Scout-17B-16E-Instruct', + group: 'llama' + }, + { + id: 'Llama-4-Maverick-17B-128E-Instruct-FP8', + provider: 'aihubmix', + name: 'Llama-4-Maverick-17B-128E-Instruct-FP8', + group: 'llama' } ], @@ -2896,12 +2950,16 @@ export function isWebSearchModel(model: Model): boolean { } if (provider.id === 'aihubmix') { + // modelId 不以-search结尾 + if (!modelId.endsWith('-search') && GEMINI_SEARCH_REGEX.test(modelId)) { + return true + } + if (isOpenAIWebSearchModel(model)) { return true } - const models = ['gemini-2.0-flash-search', 'gemini-2.0-flash-exp-search', 'gemini-2.0-pro-exp-02-05-search'] - return models.includes(modelId) + return false } if (provider?.type === 'openai') { diff --git a/src/renderer/src/i18n/locales/en-us.json b/src/renderer/src/i18n/locales/en-us.json index 5b2169ebdd..86717e01b5 100644 --- a/src/renderer/src/i18n/locales/en-us.json +++ b/src/renderer/src/i18n/locales/en-us.json @@ -1579,6 +1579,7 @@ "style_type_tip": "Style for edited image, only for V_2 and above" }, "generate": { + "height": "Height", "magic_prompt_option_tip": "Intelligently enhances prompts for better results", "model_tip": "Model version: V3 is the latest version, V2 is the previous model, V2A is the fast model, V_1 is the first-generation model, _TURBO is the acceleration version", "negative_prompt_tip": "Describe unwanted elements, only for V_1, V_1_TURBO, V_2, and V_2_TURBO", @@ -1586,8 +1587,11 @@ "person_generation": "Generate person", "person_generation_tip": "Allow model to generate person images", "rendering_speed_tip": "Controls rendering speed vs. quality trade-off, only available for V_3", + "safety_tolerance": "Safety Tolerance", + "safety_tolerance_tip": "Controls safety tolerance for image generation, only available for FLUX.1-Kontext-pro", "seed_tip": "Controls image generation randomness for reproducible results", - "style_type_tip": "Image generation style for V_2 and above" + "style_type_tip": "Image generation style for V_2 and above", + "width": "Width" }, "generated_image": "Generated Image", "go_to_settings": "Go to Settings", @@ -1642,7 +1646,7 @@ "prompt_enhancement_tip": "Rewrite prompts into detailed, model-friendly versions when switched on", "prompt_placeholder": "Describe the image you want to create, e.g. A serene lake at sunset with mountains in the background", "prompt_placeholder_edit": "Enter your image description, text drawing uses \"double quotes\" to wrap", - "prompt_placeholder_en": "Enter your image description, currently Imagen only supports English prompts", + "prompt_placeholder_en": "Enter your image description, currently only supports English prompts", "proxy_required": "Open the proxy and enable \"TUN mode\" to view generated images or copy them to the browser for opening. In the future, domestic direct connection will be supported", "quality": "Quality", "quality_options": { diff --git a/src/renderer/src/i18n/locales/ja-jp.json b/src/renderer/src/i18n/locales/ja-jp.json index c9dfd6418b..b41b10c4c7 100644 --- a/src/renderer/src/i18n/locales/ja-jp.json +++ b/src/renderer/src/i18n/locales/ja-jp.json @@ -1579,6 +1579,7 @@ "style_type_tip": "編集後の画像スタイル、V_2 以上のバージョンでのみ適用" }, "generate": { + "height": "高さ", "magic_prompt_option_tip": "生成効果を向上させるための提示詞を最適化します", "model_tip": "モデルバージョン:V2 は最新 API モデル、V2A は高速モデル、V_1 は初代モデル、_TURBO は高速処理版です", "negative_prompt_tip": "画像に含めたくない内容を説明します", @@ -1586,8 +1587,11 @@ "person_generation": "人物生成", "person_generation_tip": "人物画像を生成する", "rendering_speed_tip": "レンダリング速度と品質のバランスを調整します。V_3バージョンでのみ利用可能です", + "safety_tolerance": "安全耐性", + "safety_tolerance_tip": "画像生成の安全耐性を制御します。FLUX.1-Kontext-pro のみ利用可能です", "seed_tip": "画像生成のランダム性を制御して、同じ生成結果を再現します", - "style_type_tip": "画像生成スタイル、V_2 以上のバージョンでのみ適用" + "style_type_tip": "画像生成スタイル、V_2 以上のバージョンでのみ適用", + "width": "幅" }, "generated_image": "生成画像", "go_to_settings": "設定に移動", @@ -1642,7 +1646,7 @@ "prompt_enhancement_tip": "オンにすると、プロンプトを詳細でモデルに適したバージョンに書き直します", "prompt_placeholder": "作成したい画像を説明します。例:夕日の湖畔、遠くに山々", "prompt_placeholder_edit": "画像の説明を入力します。テキスト描画には '二重引用符' を使用します", - "prompt_placeholder_en": "「英語」の説明を入力します。Imagenは現在、英語のプロンプト語のみをサポートしています", + "prompt_placeholder_en": "「英語」の説明を入力します。は現在、英語のプロンプト語のみをサポートしています", "proxy_required": "打開代理並開啟TUN模式查看生成圖片或複製到瀏覽器開啟,後續會支持國內直連", "quality": "品質", "quality_options": { diff --git a/src/renderer/src/i18n/locales/ru-ru.json b/src/renderer/src/i18n/locales/ru-ru.json index e7b000c671..e689aecebf 100644 --- a/src/renderer/src/i18n/locales/ru-ru.json +++ b/src/renderer/src/i18n/locales/ru-ru.json @@ -1579,6 +1579,7 @@ "style_type_tip": "Стиль изображения после редактирования, доступен только для версий V_2 и выше" }, "generate": { + "height": "Высота", "magic_prompt_option_tip": "Интеллектуально оптимизирует подсказки для улучшения эффекта генерации", "model_tip": "Версия модели: V2 - новейшая API модель, V2A - быстрая модель, V_1 - первое поколение, _TURBO - ускоренная версия", "negative_prompt_tip": "Описывает, что вы не хотите видеть в изображении", @@ -1586,8 +1587,11 @@ "person_generation": "Генерация персонажа", "person_generation_tip": "Разрешить модель генерировать изображения людей", "rendering_speed_tip": "Управляет балансом между скоростью рендеринга и качеством, доступно только для V_3", + "safety_tolerance": "Безопасность", + "safety_tolerance_tip": "Контролирует безопасность изображения, доступно только для FLUX.1-Kontext-pro", "seed_tip": "Контролирует случайность генерации изображений для воспроизведения одинаковых результатов", - "style_type_tip": "Стиль генерации изображений, доступен только для версий V_2 и выше" + "style_type_tip": "Стиль генерации изображений, доступен только для версий V_2 и выше", + "width": "Ширина" }, "generated_image": "Сгенерированное изображение", "go_to_settings": "Перейти в настройки", @@ -1642,7 +1646,7 @@ "prompt_enhancement_tip": "При включении переписывает промпт в более детальную, модель-ориентированную версию", "prompt_placeholder": "Опишите изображение, которое вы хотите создать, например, Спокойное озеро на закате с горами на заднем плане", "prompt_placeholder_edit": "Введите ваше описание изображения, текстовая отрисовка использует двойные кавычки для обертки", - "prompt_placeholder_en": "Введите описание изображения, в настоящее время Imagen поддерживает только английские подсказки", + "prompt_placeholder_en": "Введите описание изображения, в настоящее время поддерживает только английские подсказки", "proxy_required": "Сейчас необходимо открыть прокси для просмотра сгенерированных изображений, в будущем будет поддерживаться прямое соединение", "quality": "Качество", "quality_options": { diff --git a/src/renderer/src/i18n/locales/zh-cn.json b/src/renderer/src/i18n/locales/zh-cn.json index 8aedda3c48..9c0ee36467 100644 --- a/src/renderer/src/i18n/locales/zh-cn.json +++ b/src/renderer/src/i18n/locales/zh-cn.json @@ -1579,6 +1579,7 @@ "style_type_tip": "编辑后的图像风格,仅适用于 V_2 及以上版本" }, "generate": { + "height": "高度", "magic_prompt_option_tip": "智能优化提示词以提升生成效果", "model_tip": "模型版本:V3 为最新版本,V2 为之前版本,V2A 为快速模型、V_1 为初代模型,_TURBO 为加速版本", "negative_prompt_tip": "描述不想在图像中出现的元素,仅支持 V_1、V_1_TURBO、V_2 和 V_2_TURBO 版本", @@ -1586,8 +1587,11 @@ "person_generation": "生成人物", "person_generation_tip": "允许模型生成人物图像", "rendering_speed_tip": "控制渲染速度与质量的平衡,仅适用于 V_3 版本", + "safety_tolerance": "安全容忍度", + "safety_tolerance_tip": "控制图像生成的安全容忍度,仅适用于 FLUX.1-Kontext-pro 版本", "seed_tip": "控制图像生成的随机性,用于复现相同的生成结果", - "style_type_tip": "图像生成风格,仅适用于 V_2 及以上版本" + "style_type_tip": "图像生成风格,仅适用于 V_2 及以上版本", + "width": "宽度" }, "generated_image": "生成图片", "go_to_settings": "去设置", @@ -1642,7 +1646,7 @@ "prompt_enhancement_tip": "开启后将提示重写为详细的、适合模型的版本", "prompt_placeholder": "描述你想创建的图片,例如:一个宁静的湖泊,夕阳西下,远处是群山", "prompt_placeholder_edit": "输入你的图片描述,文本绘制用 \"双引号\" 包裹", - "prompt_placeholder_en": "输入 \"英文\" 图片描述,目前 Imagen 仅支持英文提示词", + "prompt_placeholder_en": "输入 \"英文\" 图片描述,目前仅支持英文提示词", "proxy_required": "打开代理并开启 \"TUN 模式\" 查看生成图片或复制到浏览器打开,后续会支持国内直连", "quality": "质量", "quality_options": { diff --git a/src/renderer/src/i18n/locales/zh-tw.json b/src/renderer/src/i18n/locales/zh-tw.json index 188a7782c1..8a32912fd9 100644 --- a/src/renderer/src/i18n/locales/zh-tw.json +++ b/src/renderer/src/i18n/locales/zh-tw.json @@ -1579,6 +1579,7 @@ "style_type_tip": "編輯後的圖像風格,僅適用於 V_2 及以上版本" }, "generate": { + "height": "高度", "magic_prompt_option_tip": "智能優化生成效果的提示詞", "model_tip": "模型版本:V2 是最新 API 模型,V2A 是高速模型,V_1 是初代模型,_TURBO 是高速處理版", "negative_prompt_tip": "描述不想在圖像中出現的內容", @@ -1586,8 +1587,11 @@ "person_generation": "人物生成", "person_generation_tip": "允許模型生成人物圖像", "rendering_speed_tip": "控制渲染速度與品質之間的平衡,僅適用於 V_3 版本", + "safety_tolerance": "安全耐性", + "safety_tolerance_tip": "控制圖像生成的安全耐性,僅適用於 FLUX.1-Kontext-pro 版本", "seed_tip": "控制圖像生成的隨機性,以重現相同的生成結果", - "style_type_tip": "圖像生成風格,僅適用於 V_2 及以上版本" + "style_type_tip": "圖像生成風格,僅適用於 V_2 及以上版本", + "width": "寬度" }, "generated_image": "生成圖片", "go_to_settings": "去設置", @@ -1642,7 +1646,7 @@ "prompt_enhancement_tip": "開啟後將提示重寫為詳細的、適合模型的版本", "prompt_placeholder": "描述你想建立的圖片,例如:一個寧靜的湖泊,夕陽西下,遠處是群山", "prompt_placeholder_edit": "輸入你的圖片描述,文本繪製用 ' 雙引號 ' 包裹", - "prompt_placeholder_en": "輸入英文圖片描述,目前 Imagen 僅支持英文提示詞", + "prompt_placeholder_en": "輸入英文圖片描述,目前僅支持英文提示詞", "proxy_required": "打開代理並開啟”TUN 模式 “查看生成圖片或複製到瀏覽器開啟,後續會支持國內直連", "quality": "品質", "quality_options": { diff --git a/src/renderer/src/pages/paintings/AihubmixPage.tsx b/src/renderer/src/pages/paintings/AihubmixPage.tsx index 4d5d8f0f75..2c3075148c 100644 --- a/src/renderer/src/pages/paintings/AihubmixPage.tsx +++ b/src/renderer/src/pages/paintings/AihubmixPage.tsx @@ -314,6 +314,18 @@ const AihubmixPage: FC<{ Options: string[] }> = ({ Options }) => { headers = { Authorization: `Bearer ${aihubmixProvider.apiKey}` } + } else if (painting.model === 'FLUX.1-Kontext-pro') { + requestData = { + prompt, + model: painting.model, + // width: painting.width, + // height: painting.height, + safety_tolerance: painting.safetyTolerance || 6 + } + url = aihubmixProvider.apiHost + `/v1/images/generations` + headers = { + Authorization: `Bearer ${aihubmixProvider.apiKey}` + } } else { // Existing V1/V2 API requestData = { @@ -470,6 +482,17 @@ const AihubmixPage: FC<{ Options: string[] }> = ({ Options }) => { const data = await response.json() logger.silly(`通用API响应: ${data}`) + if (data.output) { + const base64s = data.output.b64_json.map((item) => item.bytesBase64) + const validFiles = await Promise.all( + base64s.map(async (base64) => { + return await window.api.file.saveBase64Image(base64) + }) + ) + await FileManager.addFiles(validFiles) + updatePaintingState({ files: validFiles, urls: validFiles.map((file) => file.name) }) + return + } const urls = data.data.filter((item) => item.url).map((item) => item.url) const base64s = data.data.filter((item) => item.b64_json).map((item) => item.b64_json) @@ -859,7 +882,7 @@ const AihubmixPage: FC<{ Options: string[] }> = ({ Options }) => { placeholder={ isTranslating ? t('paintings.translating') - : painting.model?.startsWith('imagen-') + : painting.model?.startsWith('imagen-') || painting.model?.startsWith('FLUX') ? t('paintings.prompt_placeholder_en') : t('paintings.prompt_placeholder_edit') } diff --git a/src/renderer/src/pages/paintings/config/aihubmixConfig.tsx b/src/renderer/src/pages/paintings/config/aihubmixConfig.tsx index e188303a32..719b50cbd1 100644 --- a/src/renderer/src/pages/paintings/config/aihubmixConfig.tsx +++ b/src/renderer/src/pages/paintings/config/aihubmixConfig.tsx @@ -88,6 +88,11 @@ export const createModeConfigs = (): Record => { { label: 'ideogram_V_1', value: 'V_1' }, { label: 'ideogram_V_1_TURBO', value: 'V_1_TURBO' } ] + }, + { + label: 'Flux', + title: 'Flux', + options: [{ label: 'FLUX.1-Kontext-pro', value: 'FLUX.1-Kontext-pro' }] } ] }, @@ -229,6 +234,36 @@ export const createModeConfigs = (): Record => { options: PERSON_GENERATION_OPTIONS, initialValue: 'ALLOW_ALL', condition: (painting) => Boolean(painting.model?.startsWith('imagen-')) + }, + // { + // type: 'slider', + // key: 'width', + // title: 'paintings.generate.width', + // min: 256, + // max: 1440, + // initialValue: 1024, + // step: 32, + // condition: (painting) => painting.model === 'FLUX.1-Kontext-pro' + // }, + // { + // type: 'slider', + // key: 'height', + // title: 'paintings.generate.height', + // min: 256, + // max: 1440, + // initialValue: 768, + // step: 32, + // condition: (painting) => painting.model === 'FLUX.1-Kontext-pro' + // }, + { + type: 'slider', + key: 'safetyTolerance', + title: 'paintings.generate.safety_tolerance', + tooltip: 'paintings.generate.safety_tolerance_tip', + min: 0, + max: 6, + initialValue: 6, + condition: (painting) => painting.model === 'FLUX.1-Kontext-pro' } ], remix: [ @@ -384,5 +419,6 @@ export const DEFAULT_PAINTING: PaintingAction = { quality: 'auto', moderation: 'auto', n: 1, - numberOfImages: 4 + numberOfImages: 4, + safetyTolerance: 6 } diff --git a/src/renderer/src/types/index.ts b/src/renderer/src/types/index.ts index 5f649c5e8f..4401e14d6e 100644 --- a/src/renderer/src/types/index.ts +++ b/src/renderer/src/types/index.ts @@ -405,6 +405,9 @@ export interface GeneratePainting extends PaintingParams { background?: string personGeneration?: GenerateImagesConfig['personGeneration'] numberOfImages?: number + safetyTolerance?: number + width?: number + height?: number } export interface EditPainting extends PaintingParams {