jimeng-cli 0.3.2 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5571,7 +5571,6 @@ var import_node_path = __toESM(require("path"), 1);
5571
5571
  // src/api/consts/common.ts
5572
5572
  var BASE_URL_CN = "https://jimeng.jianying.com";
5573
5573
  var BASE_URL_US_COMMERCE = "https://commerce.us.capcut.com";
5574
- var BASE_URL_HK_COMMERCE = "https://commerce-api-sg.capcut.com";
5575
5574
  var DEFAULT_ASSISTANT_ID_CN = 513695;
5576
5575
  var DEFAULT_ASSISTANT_ID_US = 513641;
5577
5576
  var DEFAULT_ASSISTANT_ID_HK = 513641;
@@ -5587,9 +5586,9 @@ var VERSION_CODE = "8.4.0";
5587
5586
  var DEFAULT_IMAGE_MODEL = "jimeng-4.5";
5588
5587
  var DEFAULT_IMAGE_MODEL_US = "jimeng-4.5";
5589
5588
  var DEFAULT_VIDEO_MODEL = "jimeng-video-3.5-pro";
5590
- var DRAFT_VERSION = "3.3.9";
5589
+ var DRAFT_VERSION = "3.3.12";
5591
5590
  var DRAFT_MIN_VERSION = "3.0.2";
5592
- var DRAFT_VERSION_OMNI = "3.3.9";
5591
+ var DRAFT_VERSION_OMNI = "3.3.12";
5593
5592
  var OMNI_BENEFIT_TYPE = "dreamina_video_seedance_20_video_add";
5594
5593
  var OMNI_BENEFIT_TYPE_FAST = "dreamina_seedance_20_fast_with_video";
5595
5594
  var IMAGE_MODEL_MAP = {
@@ -5605,6 +5604,8 @@ var IMAGE_MODEL_MAP = {
5605
5604
  "jimeng-lab": "high_aes_general_v50_lab"
5606
5605
  };
5607
5606
  var IMAGE_MODEL_MAP_US = {
5607
+ "jimeng-5.0": "high_aes_general_v50",
5608
+ "jimeng-4.6": "high_aes_general_v42",
5608
5609
  "jimeng-4.5": "high_aes_general_v40l",
5609
5610
  "jimeng-4.1": "high_aes_general_v41",
5610
5611
  "jimeng-4.0": "high_aes_general_v40",
@@ -5618,6 +5619,7 @@ var IMAGE_MODEL_MAP_ASIA = {
5618
5619
  "jimeng-4.5": "high_aes_general_v40l",
5619
5620
  "jimeng-4.1": "high_aes_general_v41",
5620
5621
  "jimeng-4.0": "high_aes_general_v40",
5622
+ "jimeng-3.1": "high_aes_general_v30l_art:general_v3.0_18b",
5621
5623
  "jimeng-3.0": "high_aes_general_v30l:general_v3.0_18b",
5622
5624
  "nanobanana": "external_model_gemini_flash_image_v25",
5623
5625
  "nanobananapro": "dreamina_image_lib_1"
@@ -5635,10 +5637,14 @@ var VIDEO_MODEL_MAP = {
5635
5637
  "jimeng-video-2.0-pro": "dreamina_ic_generate_video_model_vgfm1.0"
5636
5638
  };
5637
5639
  var VIDEO_MODEL_MAP_US = {
5640
+ "jimeng-video-seedance-2.0": "dreamina_seedance_40_pro",
5641
+ "jimeng-video-seedance-2.0-fast": "dreamina_seedance_40",
5638
5642
  "jimeng-video-3.5-pro": "dreamina_ic_generate_video_model_vgfm_3.5_pro",
5639
5643
  "jimeng-video-3.0": "dreamina_ic_generate_video_model_vgfm_3.0"
5640
5644
  };
5641
5645
  var VIDEO_MODEL_MAP_ASIA = {
5646
+ "jimeng-video-seedance-2.0": "dreamina_seedance_40_pro",
5647
+ "jimeng-video-seedance-2.0-fast": "dreamina_seedance_40",
5642
5648
  "jimeng-video-veo3": "dreamina_veo3_generate_video",
5643
5649
  "jimeng-video-veo3.1": "dreamina_veo3.1_generate_video",
5644
5650
  "jimeng-video-sora2": "dreamina_sora2_generate_video",
@@ -5941,6 +5947,10 @@ var util = {
5941
5947
  return ((crc ^ -1) >>> 0).toString(16).padStart(8, "0");
5942
5948
  }
5943
5949
  };
5950
+ function maskToken(token) {
5951
+ if (token.length <= 10) return "***";
5952
+ return `${token.slice(0, 4)}...${token.slice(-4)}`;
5953
+ }
5944
5954
  var util_default = util;
5945
5955
 
5946
5956
  // src/lib/logger.ts
@@ -6140,6 +6150,8 @@ var JimengErrorHandler = class {
6140
6150
  throw new APIException(exceptions_default.API_IMAGE_GENERATION_FAILED, `[\u751F\u6210\u5931\u8D25]: ${errmsg}`);
6141
6151
  case "5002":
6142
6152
  throw new APIException(exceptions_default.API_VIDEO_GENERATION_FAILED, `[\u89C6\u9891\u751F\u6210\u5931\u8D25]: ${errmsg}`);
6153
+ case "34010105":
6154
+ throw new APIException(exceptions_default.API_REQUEST_FAILED, `[\u767B\u5F55\u9A8C\u8BC1\u5931\u8D25]: ${errmsg} (\u9519\u8BEF\u7801: ${ret})`);
6143
6155
  default:
6144
6156
  throw new APIException(exceptions_default.API_REQUEST_FAILED, `[${operation}\u5931\u8D25]: ${errmsg} (\u9519\u8BEF\u7801: ${ret})`);
6145
6157
  }
@@ -6251,6 +6263,7 @@ var DA_VERSION = "3.3.12";
6251
6263
  var DEVICE_ID = Math.random() * 1e18 + 7e18;
6252
6264
  var WEB_ID = Math.random() * 1e18 + 7e18;
6253
6265
  var USER_ID = util_default.uuid(false);
6266
+ var INTERNATIONAL_FRONTEND_ORIGIN = "https://dreamina.capcut.com";
6254
6267
  var FAKE_HEADERS = {
6255
6268
  Accept: "application/json, text/plain, */*",
6256
6269
  "Accept-Encoding": "gzip, deflate, br, zstd",
@@ -6374,8 +6387,7 @@ function parseProxyFromToken(rawToken) {
6374
6387
  return { token, proxyUrl };
6375
6388
  }
6376
6389
  function getRefererByRegion(regionInfo, cnPath) {
6377
- const { isInternational } = regionInfo;
6378
- return isInternational ? "https://dreamina.capcut.com/" : `https://jimeng.jianying.com${cnPath}`;
6390
+ return regionInfo.isInternational ? `${INTERNATIONAL_FRONTEND_ORIGIN}/` : `${BASE_URL_CN}${cnPath}`;
6379
6391
  }
6380
6392
  function getAssistantId(regionInfo) {
6381
6393
  if (regionInfo.isUS) return DEFAULT_ASSISTANT_ID_US;
@@ -6406,12 +6418,14 @@ function generateCookie(refreshToken) {
6406
6418
  }
6407
6419
  async function getCredit(refreshToken, regionInfo) {
6408
6420
  const referer = getRefererByRegion(regionInfo, "/ai-tool/image/generate");
6421
+ const origin = regionInfo.isInternational ? INTERNATIONAL_FRONTEND_ORIGIN : void 0;
6409
6422
  const {
6410
6423
  credit: { gift_credit, purchase_credit, vip_credit }
6411
6424
  } = await request("POST", "/commerce/v1/benefits/user_credit", refreshToken, regionInfo, {
6412
6425
  data: {},
6413
6426
  headers: {
6414
- Referer: referer
6427
+ Referer: referer,
6428
+ ...origin ? { Origin: origin } : {}
6415
6429
  },
6416
6430
  noDefaultParams: true
6417
6431
  });
@@ -6428,13 +6442,15 @@ async function getCredit(refreshToken, regionInfo) {
6428
6442
  async function receiveCredit(refreshToken, regionInfo) {
6429
6443
  logger_default.info("\u6B63\u5728\u5C1D\u8BD5\u6536\u53D6\u4ECA\u65E5\u79EF\u5206...");
6430
6444
  const referer = getRefererByRegion(regionInfo, "/ai-tool/home");
6445
+ const origin = regionInfo.isInternational ? INTERNATIONAL_FRONTEND_ORIGIN : void 0;
6431
6446
  const timeZone = regionInfo.isUS ? "America/New_York" : regionInfo.isHK ? "Asia/Hong_Kong" : regionInfo.isJP ? "Asia/Tokyo" : regionInfo.isSG ? "Asia/Singapore" : "Asia/Shanghai";
6432
6447
  const { receive_quota } = await request("POST", "/commerce/v1/benefits/credit_receive", refreshToken, regionInfo, {
6433
6448
  data: {
6434
6449
  time_zone: timeZone
6435
6450
  },
6436
6451
  headers: {
6437
- Referer: referer
6452
+ Referer: referer,
6453
+ ...origin ? { Origin: origin } : {}
6438
6454
  }
6439
6455
  });
6440
6456
  logger_default.info(`\u4ECA\u65E5${receive_quota}\u79EF\u5206\u6536\u53D6\u6210\u529F`);
@@ -6462,7 +6478,7 @@ async function request(method, uri, refreshToken, regionInfo, options = {}) {
6462
6478
  region = REGION_US;
6463
6479
  } else if (isHK || isJP || isSG) {
6464
6480
  if (uri.startsWith("/commerce/")) {
6465
- baseUrl = BASE_URL_HK_COMMERCE;
6481
+ baseUrl = BASE_URL_US_COMMERCE;
6466
6482
  } else {
6467
6483
  baseUrl = BASE_URL_DREAMINA_HK;
6468
6484
  }
@@ -6542,7 +6558,8 @@ async function request(method, uri, refreshToken, regionInfo, options = {}) {
6542
6558
  });
6543
6559
  logger_default.info(`\u54CD\u5E94\u72B6\u6001: ${response.status} ${response.statusText}`);
6544
6560
  if (options.responseType == "stream") return response;
6545
- const responseDataSummary = JSON.stringify(response.data).substring(0, 500) + (JSON.stringify(response.data).length > 500 ? "..." : "");
6561
+ const responseJson = JSON.stringify(response.data);
6562
+ const responseDataSummary = responseJson.substring(0, 500) + (responseJson.length > 500 ? "..." : "");
6546
6563
  logger_default.info(`\u54CD\u5E94\u6570\u636E\u6458\u8981: ${responseDataSummary}`);
6547
6564
  if (response.status >= 400) {
6548
6565
  logger_default.warn(`HTTP\u9519\u8BEF: ${response.status} ${response.statusText}`);
@@ -6660,7 +6677,7 @@ async function checkInternationalTokenLive(refreshToken, regionInfo) {
6660
6677
  const cookie = generateCookie(refreshToken);
6661
6678
  try {
6662
6679
  const response = await import_axios2.default.get(
6663
- "https://dreamina.capcut.com/passport/web/account/info/",
6680
+ `${INTERNATIONAL_FRONTEND_ORIGIN}/passport/web/account/info/`,
6664
6681
  {
6665
6682
  params: {
6666
6683
  aid,
@@ -6671,8 +6688,8 @@ async function checkInternationalTokenLive(refreshToken, regionInfo) {
6671
6688
  headers: {
6672
6689
  ...FAKE_HEADERS,
6673
6690
  Cookie: cookie,
6674
- Referer: "https://dreamina.capcut.com/ai-tool/home/",
6675
- Origin: "https://dreamina.capcut.com",
6691
+ Referer: `${INTERNATIONAL_FRONTEND_ORIGIN}/ai-tool/home/`,
6692
+ Origin: INTERNATIONAL_FRONTEND_ORIGIN,
6676
6693
  Appid: String(aid),
6677
6694
  "store-country-code": countryCode,
6678
6695
  "store-country-code-src": "uid"
@@ -7660,7 +7677,7 @@ async function generateImageComposition(_model, prompt, images, {
7660
7677
  abilityName: "byte_edit",
7661
7678
  strength: sampleStrength,
7662
7679
  source: {
7663
- imageUrl: `blob:https://dreamina.capcut.com/${util_default.uuid()}`
7680
+ imageUrl: `blob:${INTERNATIONAL_FRONTEND_ORIGIN}/${util_default.uuid()}`
7664
7681
  }
7665
7682
  }));
7666
7683
  const metricsExtra = buildMetricsExtra({
@@ -7695,7 +7712,7 @@ async function generateImageComposition(_model, prompt, images, {
7695
7712
  draftContent,
7696
7713
  metricsExtra
7697
7714
  });
7698
- const imageReferer = regionInfo.isCN ? "https://jimeng.jianying.com/ai-tool/generate?type=image" : "https://dreamina.capcut.com/ai-tool/generate?type=image";
7715
+ const imageReferer = regionInfo.isCN ? `${BASE_URL_CN}/ai-tool/generate?type=image` : `${INTERNATIONAL_FRONTEND_ORIGIN}/ai-tool/generate?type=image`;
7699
7716
  const { aigc_data } = await request(
7700
7717
  "post",
7701
7718
  "/mweb/v1/aigc_draft/generate",
@@ -7859,7 +7876,7 @@ async function generateImagesInternal(_model, prompt, {
7859
7876
  draftContent,
7860
7877
  metricsExtra
7861
7878
  });
7862
- const imageReferer = regionInfo.isCN ? "https://jimeng.jianying.com/ai-tool/generate?type=image" : "https://dreamina.capcut.com/ai-tool/generate?type=image";
7879
+ const imageReferer = regionInfo.isCN ? `${BASE_URL_CN}/ai-tool/generate?type=image` : `${INTERNATIONAL_FRONTEND_ORIGIN}/ai-tool/generate?type=image`;
7863
7880
  const { aigc_data } = await request(
7864
7881
  "post",
7865
7882
  "/mweb/v1/aigc_draft/generate",
@@ -7981,7 +7998,7 @@ async function generateJimeng4xMultiImages(_model, prompt, {
7981
7998
  draftContent,
7982
7999
  metricsExtra
7983
8000
  });
7984
- const imageReferer = regionInfo.isCN ? "https://jimeng.jianying.com/ai-tool/generate?type=image" : "https://dreamina.capcut.com/ai-tool/generate?type=image";
8001
+ const imageReferer = regionInfo.isCN ? `${BASE_URL_CN}/ai-tool/generate?type=image` : `${INTERNATIONAL_FRONTEND_ORIGIN}/ai-tool/generate?type=image`;
7985
8002
  const { aigc_data } = await request(
7986
8003
  "post",
7987
8004
  "/mweb/v1/aigc_draft/generate",
@@ -8153,7 +8170,7 @@ async function upscaleImage(_model, image, {
8153
8170
  draftContent,
8154
8171
  metricsExtra
8155
8172
  });
8156
- const imageReferer = regionInfo.isCN ? "https://jimeng.jianying.com/ai-tool/generate?type=image" : "https://dreamina.capcut.com/ai-tool/generate?type=image";
8173
+ const imageReferer = regionInfo.isCN ? `${BASE_URL_CN}/ai-tool/generate?type=image` : `${INTERNATIONAL_FRONTEND_ORIGIN}/ai-tool/generate?type=image`;
8157
8174
  const { aigc_data } = await request(
8158
8175
  "post",
8159
8176
  "/mweb/v1/aigc_draft/generate",
@@ -8267,10 +8284,14 @@ var TokenPool = class {
8267
8284
  );
8268
8285
  }
8269
8286
  getSummary() {
8270
- const entries = this.getEntries(false);
8271
- const enabledCount = entries.filter((item) => item.enabled).length;
8272
- const liveCount = entries.filter((item) => item.enabled && item.live === true).length;
8273
- const missingRegionCount = entries.filter((item) => !item.region).length;
8287
+ let enabledCount = 0;
8288
+ let liveCount = 0;
8289
+ let missingRegionCount = 0;
8290
+ for (const item of this.entryMap.values()) {
8291
+ if (item.enabled) enabledCount++;
8292
+ if (item.enabled && item.live === true) liveCount++;
8293
+ if (!item.region) missingRegionCount++;
8294
+ }
8274
8295
  return {
8275
8296
  enabled: this.enabled,
8276
8297
  filePath: this.filePath,
@@ -8279,19 +8300,19 @@ var TokenPool = class {
8279
8300
  fetchCreditOnCheck: this.fetchCreditOnCheck,
8280
8301
  autoDisableEnabled: this.autoDisableEnabled,
8281
8302
  autoDisableFailures: this.autoDisableFailures,
8282
- total: entries.length,
8303
+ total: this.entryMap.size,
8283
8304
  enabledCount,
8284
8305
  liveCount,
8285
8306
  missingRegionCount,
8286
8307
  lastHealthCheckAt: this.lastHealthCheckAt || null
8287
8308
  };
8288
8309
  }
8289
- getEntries(maskToken = true) {
8310
+ getEntries(shouldMask = true) {
8290
8311
  const items = Array.from(this.entryMap.values()).map((item) => ({ ...item }));
8291
- if (!maskToken) return items;
8312
+ if (!shouldMask) return items;
8292
8313
  return items.map((item) => ({
8293
8314
  ...item,
8294
- token: this.maskToken(item.token)
8315
+ token: maskToken(item.token)
8295
8316
  }));
8296
8317
  }
8297
8318
  getAllTokens(options = {}) {
@@ -8362,7 +8383,7 @@ var TokenPool = class {
8362
8383
  token: null,
8363
8384
  region: null,
8364
8385
  error: "prefixed_token_not_supported",
8365
- reason: `token ${this.maskToken(prefixedCandidate.token)} \u4F7F\u7528\u4E86\u5DF2\u5E9F\u5F03\u7684 region \u524D\u7F00`
8386
+ reason: `token ${maskToken(prefixedCandidate.token)} \u4F7F\u7528\u4E86\u5DF2\u5E9F\u5F03\u7684 region \u524D\u7F00`
8366
8387
  };
8367
8388
  }
8368
8389
  const regionLockedCandidates = validCandidates.filter(
@@ -8468,8 +8489,8 @@ var TokenPool = class {
8468
8489
  async refreshDynamicCapabilitiesForToken(token) {
8469
8490
  if (!this.enabled) throw new Error("Token pool disabled");
8470
8491
  const item = this.entryMap.get(token);
8471
- if (!item) throw new Error(`Token not found in pool: ${this.maskToken(token)}`);
8472
- if (!item.region) throw new Error(`Token ${this.maskToken(token)} has no region`);
8492
+ if (!item) throw new Error(`Token not found in pool: ${maskToken(token)}`);
8493
+ if (!item.region) throw new Error(`Token ${maskToken(token)} has no region`);
8473
8494
  const regionInfo = buildRegionInfo(item.region);
8474
8495
  const capabilities = await this.fetchDynamicCapabilities(token, regionInfo);
8475
8496
  item.dynamicCapabilities = { ...capabilities, updatedAt: Date.now() };
@@ -8481,39 +8502,41 @@ var TokenPool = class {
8481
8502
  * Returns a per-token result summary.
8482
8503
  */
8483
8504
  async refreshAllDynamicCapabilities() {
8484
- var _a, _b;
8485
8505
  if (!this.enabled) return [];
8486
8506
  const entries = this.getEntries(false).filter(
8487
8507
  (item) => item.enabled && item.live !== false && Boolean(item.region)
8488
8508
  );
8489
- const results = [];
8490
- for (const entry of entries) {
8491
- try {
8492
- const regionInfo = buildRegionInfo(entry.region);
8493
- const capabilities = await this.fetchDynamicCapabilities(entry.token, regionInfo);
8494
- const current = this.entryMap.get(entry.token);
8495
- if (current) {
8496
- current.dynamicCapabilities = { ...capabilities, updatedAt: Date.now() };
8497
- }
8498
- results.push({
8499
- token: this.maskToken(entry.token),
8500
- region: entry.region,
8501
- imageModels: ((_a = capabilities.imageModels) == null ? void 0 : _a.length) ?? 0,
8502
- videoModels: ((_b = capabilities.videoModels) == null ? void 0 : _b.length) ?? 0,
8503
- capabilityTags: capabilities.capabilityTags ?? []
8504
- });
8505
- } catch (err) {
8506
- results.push({
8507
- token: this.maskToken(entry.token),
8508
- region: entry.region,
8509
- imageModels: 0,
8510
- videoModels: 0,
8511
- capabilityTags: [],
8512
- error: (err == null ? void 0 : err.message) || String(err)
8513
- });
8514
- }
8515
- }
8516
- if (entries.length > 0) await this.persistToDisk();
8509
+ if (entries.length === 0) return [];
8510
+ const results = await Promise.all(
8511
+ entries.map(async (entry) => {
8512
+ var _a, _b;
8513
+ try {
8514
+ const regionInfo = buildRegionInfo(entry.region);
8515
+ const capabilities = await this.fetchDynamicCapabilities(entry.token, regionInfo);
8516
+ const current = this.entryMap.get(entry.token);
8517
+ if (current) {
8518
+ current.dynamicCapabilities = { ...capabilities, updatedAt: Date.now() };
8519
+ }
8520
+ return {
8521
+ token: maskToken(entry.token),
8522
+ region: entry.region,
8523
+ imageModels: ((_a = capabilities.imageModels) == null ? void 0 : _a.length) ?? 0,
8524
+ videoModels: ((_b = capabilities.videoModels) == null ? void 0 : _b.length) ?? 0,
8525
+ capabilityTags: capabilities.capabilityTags ?? []
8526
+ };
8527
+ } catch (err) {
8528
+ return {
8529
+ token: maskToken(entry.token),
8530
+ region: entry.region,
8531
+ imageModels: 0,
8532
+ videoModels: 0,
8533
+ capabilityTags: [],
8534
+ error: err instanceof Error ? err.message : String(err)
8535
+ };
8536
+ }
8537
+ })
8538
+ );
8539
+ await this.persistToDisk();
8517
8540
  return results;
8518
8541
  }
8519
8542
  async runHealthCheck() {
@@ -8634,14 +8657,10 @@ var TokenPool = class {
8634
8657
  await import_fs_extra4.default.ensureDir(import_path4.default.dirname(this.filePath));
8635
8658
  const payload = {
8636
8659
  updatedAt: Date.now(),
8637
- tokens: this.getEntries(false)
8660
+ tokens: Array.from(this.entryMap.values())
8638
8661
  };
8639
8662
  await import_fs_extra4.default.writeJson(this.filePath, payload, { spaces: 2 });
8640
8663
  }
8641
- maskToken(token) {
8642
- if (token.length <= 10) return "***";
8643
- return `${token.slice(0, 4)}...${token.slice(-4)}`;
8644
- }
8645
8664
  parseAuthorizationTokens(authorization) {
8646
8665
  if (typeof authorization !== "string" || authorization.trim().length === 0) {
8647
8666
  return { tokens: [], error: null };
@@ -8670,7 +8689,7 @@ var TokenPool = class {
8670
8689
  if (!token) continue;
8671
8690
  const parsedRegion = parseRegionCode(item.region || defaultRegion);
8672
8691
  if (!parsedRegion) {
8673
- throw new Error(`token ${this.maskToken(token)} \u7F3A\u5C11\u6709\u6548 region\uFF08\u4EC5\u652F\u6301 cn/us/hk/jp/sg\uFF09`);
8692
+ throw new Error(`token ${maskToken(token)} \u7F3A\u5C11\u6709\u6548 region\uFF08\u4EC5\u652F\u6301 cn/us/hk/jp/sg\uFF09`);
8674
8693
  }
8675
8694
  normalized.push({
8676
8695
  token,
@@ -8778,40 +8797,22 @@ var TokenPool = class {
8778
8797
  }
8779
8798
  async fetchDynamicCapabilities(token, regionInfo) {
8780
8799
  const regionCode = regionInfo.isUS ? "us" : regionInfo.isHK ? "hk" : regionInfo.isJP ? "jp" : regionInfo.isSG ? "sg" : "cn";
8781
- const reverseMap = this.getReverseModelMapByRegion(regionCode);
8782
- const imageConfig = await request("post", "/mweb/v1/get_common_config", token, regionInfo, {
8783
- data: {},
8784
- params: { needCache: true, needRefresh: false }
8785
- });
8786
- const videoConfig = await request("post", "/mweb/v1/video_generate/get_common_config", token, regionInfo, {
8787
- data: { scene: "generate_video", params: {} }
8788
- });
8789
- const imageReqKeys = Array.isArray(imageConfig == null ? void 0 : imageConfig.model_list) ? imageConfig.model_list.map((item) => typeof (item == null ? void 0 : item.model_req_key) === "string" ? item.model_req_key : "").filter(Boolean) : [];
8790
- const videoReqKeys = Array.isArray(videoConfig == null ? void 0 : videoConfig.model_list) ? videoConfig.model_list.map((item) => typeof (item == null ? void 0 : item.model_req_key) === "string" ? item.model_req_key : "").filter(Boolean) : [];
8791
- const imageModels = imageReqKeys.map((key) => reverseMap[key]).filter(Boolean);
8792
- const videoModels = videoReqKeys.map((key) => reverseMap[key]).filter(Boolean);
8800
+ const reverseMap = buildReverseMap(regionCode);
8801
+ const { imageModels, videoModels } = await fetchConfigModelReqKeys(token, regionCode);
8802
+ const imageIds = imageModels.map((m) => reverseMap[m.reqKey]).filter(Boolean);
8803
+ const videoIds = videoModels.map((m) => reverseMap[m.reqKey]).filter(Boolean);
8793
8804
  const capabilityTags = /* @__PURE__ */ new Set();
8794
- for (const model of videoModels) {
8805
+ for (const model of videoIds) {
8795
8806
  if (model.includes("seedance_40")) capabilityTags.add("omni_reference");
8796
8807
  if (model.includes("veo3")) capabilityTags.add("veo3");
8797
8808
  if (model.includes("sora2")) capabilityTags.add("sora2");
8798
8809
  }
8799
8810
  return {
8800
- imageModels: imageModels.length ? Array.from(new Set(imageModels)) : void 0,
8801
- videoModels: videoModels.length ? Array.from(new Set(videoModels)) : void 0,
8811
+ imageModels: imageIds.length ? Array.from(new Set(imageIds)) : void 0,
8812
+ videoModels: videoIds.length ? Array.from(new Set(videoIds)) : void 0,
8802
8813
  capabilityTags: capabilityTags.size ? Array.from(capabilityTags) : void 0
8803
8814
  };
8804
8815
  }
8805
- getReverseModelMapByRegion(region) {
8806
- const maps = region === "us" ? [IMAGE_MODEL_MAP_US, VIDEO_MODEL_MAP_US] : region === "hk" || region === "jp" || region === "sg" ? [IMAGE_MODEL_MAP_ASIA, VIDEO_MODEL_MAP_ASIA] : [IMAGE_MODEL_MAP, VIDEO_MODEL_MAP];
8807
- const reverse = {};
8808
- for (const map of maps) {
8809
- for (const [modelId, reqKey] of Object.entries(map)) {
8810
- reverse[reqKey] = modelId;
8811
- }
8812
- }
8813
- return reverse;
8814
- }
8815
8816
  };
8816
8817
  var session_pool_default = new TokenPool();
8817
8818
 
@@ -8855,6 +8856,7 @@ function buildModelItem(modelId, meta) {
8855
8856
  if (meta == null ? void 0 : meta.reqKey) item.model_req_key = meta.reqKey;
8856
8857
  if (meta == null ? void 0 : meta.modelName) item.model_name = meta.modelName;
8857
8858
  if ((_a = meta == null ? void 0 : meta.capabilities) == null ? void 0 : _a.length) item.capabilities = Array.from(new Set(meta.capabilities)).sort();
8859
+ if ((meta == null ? void 0 : meta.params) && Object.keys(meta.params).length > 0) item.params = meta.params;
8858
8860
  if (meta == null ? void 0 : meta.modelTip) {
8859
8861
  item.description = meta.modelTip;
8860
8862
  } else if (modelType === "video") {
@@ -8898,13 +8900,17 @@ function resolveRegion(authorization, xRegion) {
8898
8900
  }
8899
8901
  return "cn";
8900
8902
  }
8903
+ var reverseMapCache = /* @__PURE__ */ new Map();
8901
8904
  function buildReverseMap(region) {
8905
+ const cached = reverseMapCache.get(region);
8906
+ if (cached) return cached;
8902
8907
  const reverse = {};
8903
8908
  for (const map of getRegionalMaps(region)) {
8904
8909
  for (const [modelId, upstreamKey] of Object.entries(map)) {
8905
8910
  reverse[upstreamKey] = modelId;
8906
8911
  }
8907
8912
  }
8913
+ reverseMapCache.set(region, reverse);
8908
8914
  return reverse;
8909
8915
  }
8910
8916
  function buildFallbackModels(region) {
@@ -8921,43 +8927,62 @@ function resolveFetchToken(token) {
8921
8927
  assertTokenWithoutRegionPrefix(normalizedToken);
8922
8928
  return normalizedToken;
8923
8929
  }
8930
+ function extractValidOptions(item) {
8931
+ return (Array.isArray(item.options) ? item.options : []).filter(
8932
+ (opt) => !!opt && typeof opt === "object" && typeof opt.key === "string" && opt.key.length > 0
8933
+ );
8934
+ }
8924
8935
  function extractCapabilities(item) {
8925
- const features = Array.isArray(item.feats) ? item.feats.filter((feature) => typeof feature === "string" && feature.length > 0) : [];
8926
- const options = Array.isArray(item.options) ? item.options.map(
8927
- (option) => option && typeof option === "object" && typeof option.key === "string" ? option.key : void 0
8928
- ).filter((key) => typeof key === "string" && key.length > 0) : [];
8929
- return Array.from(/* @__PURE__ */ new Set([...features, ...options]));
8936
+ const features = Array.isArray(item.feats) ? item.feats.filter((f) => typeof f === "string" && f.length > 0) : [];
8937
+ const optionKeys = extractValidOptions(item).map((o) => o.key);
8938
+ return Array.from(/* @__PURE__ */ new Set([...features, ...optionKeys]));
8939
+ }
8940
+ function extractEnumParams(item) {
8941
+ const params = {};
8942
+ for (const o of extractValidOptions(item)) {
8943
+ const ev = o.enum_val;
8944
+ if (!ev) continue;
8945
+ const sv = ev.string_value;
8946
+ const iv = ev.int_value;
8947
+ const vals = sv || iv;
8948
+ if (vals && vals.length > 0) {
8949
+ params[o.key] = vals;
8950
+ }
8951
+ }
8952
+ const rm = item.resolution_map;
8953
+ if (rm && typeof rm === "object") {
8954
+ params["resolution"] = Object.keys(rm).map(String);
8955
+ }
8956
+ const steps = item.sample_steps;
8957
+ if (steps && typeof steps === "object") {
8958
+ params["steps"] = [steps.min_steps, steps.max_steps];
8959
+ }
8960
+ return params;
8961
+ }
8962
+ function toUpstreamMeta(item) {
8963
+ const reqKey = item == null ? void 0 : item.model_req_key;
8964
+ if (typeof reqKey !== "string" || reqKey.length === 0) return void 0;
8965
+ return {
8966
+ reqKey,
8967
+ modelName: typeof (item == null ? void 0 : item.model_name) === "string" ? item.model_name : void 0,
8968
+ modelTip: typeof (item == null ? void 0 : item.model_tip) === "string" ? item.model_tip : void 0,
8969
+ capabilities: extractCapabilities(item),
8970
+ params: extractEnumParams(item)
8971
+ };
8930
8972
  }
8931
8973
  async function fetchConfigModelReqKeys(token, region) {
8932
8974
  const regionInfo = buildRegionInfo(region);
8933
- const imageConfig = await request("post", "/mweb/v1/get_common_config", token, regionInfo, {
8934
- data: {},
8935
- params: { needCache: true, needRefresh: false }
8936
- });
8937
- const videoConfig = await request("post", "/mweb/v1/video_generate/get_common_config", token, regionInfo, {
8938
- data: { scene: "generate_video", params: {} }
8939
- });
8940
- const imageModels = Array.isArray(imageConfig == null ? void 0 : imageConfig.model_list) ? imageConfig.model_list.map((item) => {
8941
- const reqKey = item == null ? void 0 : item.model_req_key;
8942
- if (typeof reqKey !== "string" || reqKey.length === 0) return void 0;
8943
- return {
8944
- reqKey,
8945
- modelName: typeof (item == null ? void 0 : item.model_name) === "string" ? item.model_name : void 0,
8946
- modelTip: typeof (item == null ? void 0 : item.model_tip) === "string" ? item.model_tip : void 0,
8947
- capabilities: extractCapabilities(item)
8948
- };
8949
- }).filter((item) => Boolean(item)) : [];
8950
- const videoModels = Array.isArray(videoConfig == null ? void 0 : videoConfig.model_list) ? videoConfig.model_list.map((item) => {
8951
- const reqKey = item == null ? void 0 : item.model_req_key;
8952
- if (typeof reqKey !== "string" || reqKey.length === 0) return void 0;
8953
- return {
8954
- reqKey,
8955
- modelName: typeof (item == null ? void 0 : item.model_name) === "string" ? item.model_name : void 0,
8956
- modelTip: typeof (item == null ? void 0 : item.model_tip) === "string" ? item.model_tip : void 0,
8957
- capabilities: extractCapabilities(item)
8958
- };
8959
- }).filter((item) => Boolean(item)) : [];
8960
- return { imageModels, videoModels };
8975
+ const [imageConfig, videoConfig] = await Promise.all([
8976
+ request("post", "/mweb/v1/get_common_config", token, regionInfo, {
8977
+ data: {},
8978
+ params: { needCache: true, needRefresh: false }
8979
+ }),
8980
+ request("post", "/mweb/v1/video_generate/get_common_config", token, regionInfo, {
8981
+ data: { scene: "generate_video", params: {} }
8982
+ })
8983
+ ]);
8984
+ const toList = (config) => Array.isArray(config == null ? void 0 : config.model_list) ? config.model_list.map(toUpstreamMeta).filter((m) => Boolean(m)) : [];
8985
+ return { imageModels: toList(imageConfig), videoModels: toList(videoConfig) };
8961
8986
  }
8962
8987
  async function getLiveModels(authorization, xRegion) {
8963
8988
  const region = resolveRegion(authorization, xRegion);
@@ -10170,7 +10195,7 @@ async function generateVideo(_model, prompt, {
10170
10195
  }
10171
10196
  };
10172
10197
  }
10173
- const videoReferer = regionInfo.isCN ? "https://jimeng.jianying.com/ai-tool/generate?type=video" : "https://dreamina.capcut.com/ai-tool/generate?type=video";
10198
+ const videoReferer = regionInfo.isCN ? `${BASE_URL_CN}/ai-tool/generate?type=video` : `${INTERNATIONAL_FRONTEND_ORIGIN}/ai-tool/generate?type=video`;
10174
10199
  const { aigc_data } = await request(
10175
10200
  "post",
10176
10201
  "/mweb/v1/aigc_draft/generate",