From 1d278d7c65f628b9dfbca6baa3dc833d4776a769 Mon Sep 17 00:00:00 2001 From: jonathang4 Date: Sat, 13 Dec 2025 13:17:32 +0800 Subject: [PATCH] 4.x --- src/api/controllers/core.ts | 118 ----------- src/api/controllers/images.ts | 186 ++++++++++-------- src/api/routes/images.ts | 16 +- src/lib/services/DatabaseGenerationService.ts | 4 +- src/lib/services/TaskPollingService.ts | 4 +- 5 files changed, 125 insertions(+), 203 deletions(-) diff --git a/src/api/controllers/core.ts b/src/api/controllers/core.ts index 37749c4..1963dd0 100644 --- a/src/api/controllers/core.ts +++ b/src/api/controllers/core.ts @@ -504,122 +504,4 @@ export function image4Options_0302( }, }, } -} - -export function image4Options( - model, - DRAFT_VERSION, - componentId, - prompt, - sampleStrength, - height, - width, - negativePrompt = '', - resolutionType = "2k", - generateCount = 4 -){ - const min_version = "3.0.2" - const version = "3.3.7" - const submit_id = util.uuid() - return { - params: { - da_version:version, - web_component_open_flag:1, - web_version:"7.5.0", - aigc_features:"app_lip_sync", - msToken:"", - a_bogus:"", - }, - data: { - extend: { - root_model: model, - }, - submit_id: submit_id, - metrics_extra: JSON.stringify({ - promptSource: "custom", - generateCount: generateCount, - enterFrom: "click", - sceneOptions:JSON.stringify([ - { - "type": "image", - "scene": "ImageBasicGenerate", - "modelReqKey": model, - "resolutionType": resolutionType, - "abilityList": [], - "benefitCount": 4, - "reportParams": { - "enterSource": "generate", - "vipSource": "generate", - "extraVipFunctionKey": model+"-"+resolutionType, - "useVipFunctionDetailsReporterHoc": true - } - } - ]), - isBoxSelect: false, - isCutout: false, - generateId: submit_id, - isRegenerate: false - }), - draft_content: JSON.stringify({ - type: "draft", - id: util.uuid(), - min_version: min_version, - is_from_tsn: true, - version: version, - main_component_id: componentId, - component_list: [ - { - type: "image_base_component", - id: componentId, - min_version: min_version, - generate_type: "generate", - aigc_mode: "workbench", - metadata: { - "type": "", - "id": util.uuid(), - "created_platform": 3, - "created_platform_version": "", - "created_time_in_ms": Math.floor(Date.now()/1000), - "created_did": "" - }, - abilities: { - type: "", - id: util.uuid(), - generate: { - type: "", - id: util.uuid(), - core_param: { - type: "", - id: util.uuid(), - model, - prompt, - negative_prompt: negativePrompt, - seed: Math.floor(Math.random() * 100000000) + 2500000000, - sample_strength: sampleStrength, - image_ratio: 5, - large_image_info: { - type: "", - id: util.uuid(), - height, - width, - resolution_type: resolutionType, - }, - intelligent_ratio: false - }, - }, - gen_option: { - "type": "", - "id": util.uuid(), - "gen_count": 4, - "generate_all": false - } - }, - }, - ], - }), - http_common_info: { - aid: Number(DEFAULT_ASSISTANT_ID), - }, - }, - } } \ No newline at end of file diff --git a/src/api/controllers/images.ts b/src/api/controllers/images.ts index 4c3f948..34fd392 100644 --- a/src/api/controllers/images.ts +++ b/src/api/controllers/images.ts @@ -3,7 +3,7 @@ import _ from "lodash"; import APIException from "@/lib/exceptions/APIException.ts"; import EX from "@/api/consts/exceptions.ts"; import util from "@/lib/util.ts"; -import { getCredit, receiveCredit, request } from "./core.ts"; +import { getCredit, receiveCredit, request, image3Options, image4Options_0302 } from "./core.ts"; import logger from "@/lib/logger.ts"; import { ImagesTaskCache } from '@/api/ImagesTaskCache.ts'; @@ -11,7 +11,9 @@ const DEFAULT_ASSISTANT_ID = "513695"; export const DEFAULT_MODEL = "jimeng-3.0"; const DRAFT_VERSION = "3.0.2"; const MODEL_MAP = { + "jimeng-4.5": "high_aes_general_v40l", "jimeng-4.1": "high_aes_general_v41", + "jimeng-4.0": "high_aes_general_v40", "jimeng-3.1": "high_aes_general_v30l_art_fangzhou:general_v3.0_18b", "jimeng-3.0": "high_aes_general_v30l:general_v3.0_18b", "jimeng-2.1": "high_aes_general_v21_L:general_v2.1_L", @@ -34,11 +36,13 @@ export async function generateImages( height = 1024, sampleStrength = 0.5, negativePrompt = "", + generateCount = 4, }: { width?: number; height?: number; sampleStrength?: number; negativePrompt?: string; + generateCount?: number; }, refreshToken: string ) { @@ -54,86 +58,114 @@ export async function generateImages( await receiveCredit(refreshToken); const componentId = util.uuid(); + let isModel4 = model.startsWith("jimeng-4"); + let options = {}; + if(isModel4){ + options = image4Options_0302( + model, + componentId, + prompt, + sampleStrength, + height, + width, + negativePrompt, + '2k', + generateCount, + ); + }else{ + options = image3Options( + model, + componentId, + prompt, + sampleStrength, + height, + width, + negativePrompt, + '1k', + generateCount, + ); + } const { aigc_data } = await request( "post", "/mweb/v1/aigc_draft/generate", refreshToken, - { - params: { - babi_param: encodeURIComponent( - JSON.stringify({ - scenario: "image_video_generation", - feature_key: "aigc_to_image", - feature_entrance: "to_image", - feature_entrance_detail: "to_image-" + model, - }) - ), - }, - data: { - extend: { - root_model: model, - template_id: "", - }, - submit_id: util.uuid(), - metrics_extra: JSON.stringify({ - templateId: "", - generateCount: 1, - promptSource: "custom", - templateSource: "", - lastRequestId: "", - originRequestId: "", - }), - draft_content: JSON.stringify({ - type: "draft", - id: util.uuid(), - min_version: DRAFT_VERSION, - is_from_tsn: true, - version: DRAFT_VERSION, - main_component_id: componentId, - component_list: [ - { - type: "image_base_component", - id: componentId, - min_version: DRAFT_VERSION, - generate_type: "generate", - aigc_mode: "workbench", - abilities: { - type: "", - id: util.uuid(), - generate: { - type: "", - id: util.uuid(), - core_param: { - type: "", - id: util.uuid(), - model, - prompt, - negative_prompt: negativePrompt, - seed: Math.floor(Math.random() * 100000000) + 2500000000, - sample_strength: sampleStrength, - image_ratio: 1, - large_image_info: { - type: "", - id: util.uuid(), - height, - width, - resolution_type: "1k", - }, - }, - history_option: { - type: "", - id: util.uuid(), - }, - }, - }, - }, - ], - }), - http_common_info: { - aid: Number(DEFAULT_ASSISTANT_ID), - }, - }, - } + options, + // { + // params: { + // babi_param: encodeURIComponent( + // JSON.stringify({ + // scenario: "image_video_generation", + // feature_key: "aigc_to_image", + // feature_entrance: "to_image", + // feature_entrance_detail: "to_image-" + model, + // }) + // ), + // }, + // data: { + // extend: { + // root_model: model, + // template_id: "", + // }, + // submit_id: util.uuid(), + // metrics_extra: JSON.stringify({ + // templateId: "", + // generateCount: 1, + // promptSource: "custom", + // templateSource: "", + // lastRequestId: "", + // originRequestId: "", + // }), + // draft_content: JSON.stringify({ + // type: "draft", + // id: util.uuid(), + // min_version: DRAFT_VERSION, + // is_from_tsn: true, + // version: DRAFT_VERSION, + // main_component_id: componentId, + // component_list: [ + // { + // type: "image_base_component", + // id: componentId, + // min_version: DRAFT_VERSION, + // generate_type: "generate", + // aigc_mode: "workbench", + // abilities: { + // type: "", + // id: util.uuid(), + // generate: { + // type: "", + // id: util.uuid(), + // core_param: { + // type: "", + // id: util.uuid(), + // model, + // prompt, + // negative_prompt: negativePrompt, + // seed: Math.floor(Math.random() * 100000000) + 2500000000, + // sample_strength: sampleStrength, + // image_ratio: 1, + // large_image_info: { + // type: "", + // id: util.uuid(), + // height, + // width, + // resolution_type: "1k", + // }, + // }, + // history_option: { + // type: "", + // id: util.uuid(), + // }, + // }, + // }, + // }, + // ], + // }), + // http_common_info: { + // aid: Number(DEFAULT_ASSISTANT_ID), + // }, + // }, + // } ); const historyId = aigc_data.history_record_id; if (!historyId) diff --git a/src/api/routes/images.ts b/src/api/routes/images.ts index 71409db..8dfc767 100644 --- a/src/api/routes/images.ts +++ b/src/api/routes/images.ts @@ -68,7 +68,8 @@ export default { // .validate("body.negative_prompt", v => _.isUndefined(v) || _.isString(v)) .validate("body.width", v => _.isUndefined(v) || _.isFinite(v)) .validate("body.height", v => _.isUndefined(v) || _.isFinite(v)) - // .validate("body.sample_strength", v => _.isUndefined(v) || _.isFinite(v)) + .validate("body.sample_strength", v => _.isUndefined(v) || _.isFinite(v)) + .validate("body.generate_count", v => _.isUndefined(v) || _.isFinite(v)) .validate("body.response_format", v => _.isUndefined(v) || _.isString(v)) .validate("headers.authorization", _.isString); // refresh_token切分 @@ -82,28 +83,31 @@ export default { // negative_prompt: negativePrompt, width, height, - // sample_strength: sampleStrength, + sample_strength, + generate_count, response_format, } = request.body; const responseFormat = _.defaultTo(response_format, "url"); - logger.info(`\n图片生成: model: ${model}, task_id: ${task_id}, width: ${width}, height: ${height}, responseFormat: ${responseFormat}, \n prompt: ${prompt}`); + // logger.info(`\n图片生成: model: ${model}, task_id: ${task_id}, width: ${width}, height: ${height}, responseFormat: ${responseFormat}, \n prompt: ${prompt}`); if (USE_DATABASE_MODE) { // 使用新的数据库方法 await DatabaseGenerationService.generateImagesV2(model||'jimeng-3.0', task_id, prompt, { width, height, - sampleStrength: 0.5, + sampleStrength: sample_strength || 0.5, negativePrompt: "", - response_format: responseFormat + response_format: responseFormat, + generateCount: generate_count || 4, }, token); } else { // 使用原有方法(不等待结果) generateImages(model||'jimeng-3.0', task_id, prompt, { width, height, - sampleStrength: 0.5, + sampleStrength: sample_strength || 0.5, negativePrompt: "", + generateCount: generate_count || 4, }, token); } diff --git a/src/lib/services/DatabaseGenerationService.ts b/src/lib/services/DatabaseGenerationService.ts index 49ba3cf..e3d28f1 100644 --- a/src/lib/services/DatabaseGenerationService.ts +++ b/src/lib/services/DatabaseGenerationService.ts @@ -45,6 +45,7 @@ export class DatabaseGenerationService { sampleStrength?: number; negativePrompt?: string; response_format?: string; + generateCount?: number; }, refreshToken: string ): Promise { @@ -74,7 +75,8 @@ export class DatabaseGenerationService { height: params.height || 1024, sample_strength: params.sampleStrength || 0.5, negative_prompt: params.negativePrompt || "", - response_format: params.response_format + response_format: params.response_format, + generate_count: params.generateCount || 4, }, internal_params: { refresh_token: refreshToken diff --git a/src/lib/services/TaskPollingService.ts b/src/lib/services/TaskPollingService.ts index 893a336..d94c7c3 100644 --- a/src/lib/services/TaskPollingService.ts +++ b/src/lib/services/TaskPollingService.ts @@ -8,7 +8,7 @@ import logger from '@/lib/logger.js'; import TOSService from '@/lib/tos/tos-service.js'; import { generateImages as originalGenerateImages } from '@/api/controllers/images.js'; import { generateVideo as originalGenerateVideo } from '@/api/controllers/video.js'; -import { request, image4Options_0302, image3Options, image4Options } from '@/api/controllers/core.js'; +import { request, image4Options_0302, image3Options } from '@/api/controllers/core.js'; import EX from "@/api/consts/exceptions.ts"; const timeZone = 'Asia/Shanghai'; @@ -774,7 +774,9 @@ export class TaskPollingService { // 映射模型 const MODEL_MAP = { + "jimeng-4.5": "high_aes_general_v40l", "jimeng-4.1": "high_aes_general_v41", + "jimeng-4.0": "high_aes_general_v40", "jimeng-3.1": "high_aes_general_v30l_art_fangzhou:general_v3.0_18b", "jimeng-3.0": "high_aes_general_v30l:general_v3.0_18b", "jimeng-2.1": "high_aes_general_v21_L:general_v2.1_L",