feat(aihubmix): painting support flux model & update web search rules & update default models (#9220)

* feat: add painting flux model & update web search models

* feat: update flux api

---------

Co-authored-by: zhaochenxue <zhaochenxue@bixin.cn>
This commit is contained in:
chenxue 2025-08-17 00:40:06 +08:00 committed by GitHub
parent b3643944f3
commit 8b5a3f734c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 167 additions and 27 deletions

View File

@ -638,35 +638,59 @@ export const SYSTEM_MODELS: Record<SystemProviderId | 'defaultModel', Model[]> =
}
],
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<SystemProviderId | 'defaultModel', Model[]> =
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') {

View File

@ -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": {

View File

@ -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": {

View File

@ -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": {

View File

@ -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": {

View File

@ -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": {

View File

@ -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')
}

View File

@ -88,6 +88,11 @@ export const createModeConfigs = (): Record<AihubmixMode, ConfigItem[]> => {
{ 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<AihubmixMode, ConfigItem[]> => {
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
}

View File

@ -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 {