mirror of
https://github.com/CherryHQ/cherry-studio.git
synced 2026-01-01 17:59:09 +08:00
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:
parent
b3643944f3
commit
8b5a3f734c
@ -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') {
|
||||
|
||||
@ -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": {
|
||||
|
||||
@ -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": {
|
||||
|
||||
@ -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": {
|
||||
|
||||
@ -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": {
|
||||
|
||||
@ -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": {
|
||||
|
||||
@ -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')
|
||||
}
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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 {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user