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.
@@ -5691,6 +5691,10 @@ var util = {
5691
5691
  return ((crc ^ -1) >>> 0).toString(16).padStart(8, "0");
5692
5692
  }
5693
5693
  };
5694
+ function maskToken(token) {
5695
+ if (token.length <= 10) return "***";
5696
+ return `${token.slice(0, 4)}...${token.slice(-4)}`;
5697
+ }
5694
5698
  var util_default = util;
5695
5699
 
5696
5700
  // src/lib/logger.ts
@@ -5970,6 +5974,8 @@ var JimengErrorHandler = class {
5970
5974
  throw new APIException(exceptions_default.API_IMAGE_GENERATION_FAILED, `[\u751F\u6210\u5931\u8D25]: ${errmsg}`);
5971
5975
  case "5002":
5972
5976
  throw new APIException(exceptions_default.API_VIDEO_GENERATION_FAILED, `[\u89C6\u9891\u751F\u6210\u5931\u8D25]: ${errmsg}`);
5977
+ case "34010105":
5978
+ throw new APIException(exceptions_default.API_REQUEST_FAILED, `[\u767B\u5F55\u9A8C\u8BC1\u5931\u8D25]: ${errmsg} (\u9519\u8BEF\u7801: ${ret})`);
5973
5979
  default:
5974
5980
  throw new APIException(exceptions_default.API_REQUEST_FAILED, `[${operation}\u5931\u8D25]: ${errmsg} (\u9519\u8BEF\u7801: ${ret})`);
5975
5981
  }
@@ -6080,7 +6086,6 @@ var DA_VERSION = "3.3.12";
6080
6086
  // src/api/consts/common.ts
6081
6087
  var BASE_URL_CN = "https://jimeng.jianying.com";
6082
6088
  var BASE_URL_US_COMMERCE = "https://commerce.us.capcut.com";
6083
- var BASE_URL_HK_COMMERCE = "https://commerce-api-sg.capcut.com";
6084
6089
  var DEFAULT_ASSISTANT_ID_CN = 513695;
6085
6090
  var DEFAULT_ASSISTANT_ID_US = 513641;
6086
6091
  var DEFAULT_ASSISTANT_ID_HK = 513641;
@@ -6096,9 +6101,9 @@ var VERSION_CODE = "8.4.0";
6096
6101
  var DEFAULT_IMAGE_MODEL = "jimeng-4.5";
6097
6102
  var DEFAULT_IMAGE_MODEL_US = "jimeng-4.5";
6098
6103
  var DEFAULT_VIDEO_MODEL = "jimeng-video-3.5-pro";
6099
- var DRAFT_VERSION = "3.3.9";
6104
+ var DRAFT_VERSION = "3.3.12";
6100
6105
  var DRAFT_MIN_VERSION = "3.0.2";
6101
- var DRAFT_VERSION_OMNI = "3.3.9";
6106
+ var DRAFT_VERSION_OMNI = "3.3.12";
6102
6107
  var OMNI_BENEFIT_TYPE = "dreamina_video_seedance_20_video_add";
6103
6108
  var OMNI_BENEFIT_TYPE_FAST = "dreamina_seedance_20_fast_with_video";
6104
6109
  var IMAGE_MODEL_MAP = {
@@ -6114,6 +6119,8 @@ var IMAGE_MODEL_MAP = {
6114
6119
  "jimeng-lab": "high_aes_general_v50_lab"
6115
6120
  };
6116
6121
  var IMAGE_MODEL_MAP_US = {
6122
+ "jimeng-5.0": "high_aes_general_v50",
6123
+ "jimeng-4.6": "high_aes_general_v42",
6117
6124
  "jimeng-4.5": "high_aes_general_v40l",
6118
6125
  "jimeng-4.1": "high_aes_general_v41",
6119
6126
  "jimeng-4.0": "high_aes_general_v40",
@@ -6127,6 +6134,7 @@ var IMAGE_MODEL_MAP_ASIA = {
6127
6134
  "jimeng-4.5": "high_aes_general_v40l",
6128
6135
  "jimeng-4.1": "high_aes_general_v41",
6129
6136
  "jimeng-4.0": "high_aes_general_v40",
6137
+ "jimeng-3.1": "high_aes_general_v30l_art:general_v3.0_18b",
6130
6138
  "jimeng-3.0": "high_aes_general_v30l:general_v3.0_18b",
6131
6139
  "nanobanana": "external_model_gemini_flash_image_v25",
6132
6140
  "nanobananapro": "dreamina_image_lib_1"
@@ -6144,10 +6152,14 @@ var VIDEO_MODEL_MAP = {
6144
6152
  "jimeng-video-2.0-pro": "dreamina_ic_generate_video_model_vgfm1.0"
6145
6153
  };
6146
6154
  var VIDEO_MODEL_MAP_US = {
6155
+ "jimeng-video-seedance-2.0": "dreamina_seedance_40_pro",
6156
+ "jimeng-video-seedance-2.0-fast": "dreamina_seedance_40",
6147
6157
  "jimeng-video-3.5-pro": "dreamina_ic_generate_video_model_vgfm_3.5_pro",
6148
6158
  "jimeng-video-3.0": "dreamina_ic_generate_video_model_vgfm_3.0"
6149
6159
  };
6150
6160
  var VIDEO_MODEL_MAP_ASIA = {
6161
+ "jimeng-video-seedance-2.0": "dreamina_seedance_40_pro",
6162
+ "jimeng-video-seedance-2.0-fast": "dreamina_seedance_40",
6151
6163
  "jimeng-video-veo3": "dreamina_veo3_generate_video",
6152
6164
  "jimeng-video-veo3.1": "dreamina_veo3.1_generate_video",
6153
6165
  "jimeng-video-sora2": "dreamina_sora2_generate_video",
@@ -6227,6 +6239,7 @@ var RESOLUTION_OPTIONS_NANOBANANAPRO_4K = {
6227
6239
  var DEVICE_ID = Math.random() * 1e18 + 7e18;
6228
6240
  var WEB_ID = Math.random() * 1e18 + 7e18;
6229
6241
  var USER_ID = util_default.uuid(false);
6242
+ var INTERNATIONAL_FRONTEND_ORIGIN = "https://dreamina.capcut.com";
6230
6243
  var FAKE_HEADERS = {
6231
6244
  Accept: "application/json, text/plain, */*",
6232
6245
  "Accept-Encoding": "gzip, deflate, br, zstd",
@@ -6350,8 +6363,7 @@ function parseProxyFromToken(rawToken) {
6350
6363
  return { token, proxyUrl };
6351
6364
  }
6352
6365
  function getRefererByRegion(regionInfo, cnPath) {
6353
- const { isInternational } = regionInfo;
6354
- return isInternational ? "https://dreamina.capcut.com/" : `https://jimeng.jianying.com${cnPath}`;
6366
+ return regionInfo.isInternational ? `${INTERNATIONAL_FRONTEND_ORIGIN}/` : `${BASE_URL_CN}${cnPath}`;
6355
6367
  }
6356
6368
  function getAssistantId(regionInfo) {
6357
6369
  if (regionInfo.isUS) return DEFAULT_ASSISTANT_ID_US;
@@ -6382,12 +6394,14 @@ function generateCookie(refreshToken) {
6382
6394
  }
6383
6395
  async function getCredit(refreshToken, regionInfo) {
6384
6396
  const referer = getRefererByRegion(regionInfo, "/ai-tool/image/generate");
6397
+ const origin = regionInfo.isInternational ? INTERNATIONAL_FRONTEND_ORIGIN : void 0;
6385
6398
  const {
6386
6399
  credit: { gift_credit, purchase_credit, vip_credit }
6387
6400
  } = await request("POST", "/commerce/v1/benefits/user_credit", refreshToken, regionInfo, {
6388
6401
  data: {},
6389
6402
  headers: {
6390
- Referer: referer
6403
+ Referer: referer,
6404
+ ...origin ? { Origin: origin } : {}
6391
6405
  },
6392
6406
  noDefaultParams: true
6393
6407
  });
@@ -6404,13 +6418,15 @@ async function getCredit(refreshToken, regionInfo) {
6404
6418
  async function receiveCredit(refreshToken, regionInfo) {
6405
6419
  logger_default.info("\u6B63\u5728\u5C1D\u8BD5\u6536\u53D6\u4ECA\u65E5\u79EF\u5206...");
6406
6420
  const referer = getRefererByRegion(regionInfo, "/ai-tool/home");
6421
+ const origin = regionInfo.isInternational ? INTERNATIONAL_FRONTEND_ORIGIN : void 0;
6407
6422
  const timeZone = regionInfo.isUS ? "America/New_York" : regionInfo.isHK ? "Asia/Hong_Kong" : regionInfo.isJP ? "Asia/Tokyo" : regionInfo.isSG ? "Asia/Singapore" : "Asia/Shanghai";
6408
6423
  const { receive_quota } = await request("POST", "/commerce/v1/benefits/credit_receive", refreshToken, regionInfo, {
6409
6424
  data: {
6410
6425
  time_zone: timeZone
6411
6426
  },
6412
6427
  headers: {
6413
- Referer: referer
6428
+ Referer: referer,
6429
+ ...origin ? { Origin: origin } : {}
6414
6430
  }
6415
6431
  });
6416
6432
  logger_default.info(`\u4ECA\u65E5${receive_quota}\u79EF\u5206\u6536\u53D6\u6210\u529F`);
@@ -6438,7 +6454,7 @@ async function request(method, uri, refreshToken, regionInfo, options = {}) {
6438
6454
  region = REGION_US;
6439
6455
  } else if (isHK || isJP || isSG) {
6440
6456
  if (uri.startsWith("/commerce/")) {
6441
- baseUrl = BASE_URL_HK_COMMERCE;
6457
+ baseUrl = BASE_URL_US_COMMERCE;
6442
6458
  } else {
6443
6459
  baseUrl = BASE_URL_DREAMINA_HK;
6444
6460
  }
@@ -6518,7 +6534,8 @@ async function request(method, uri, refreshToken, regionInfo, options = {}) {
6518
6534
  });
6519
6535
  logger_default.info(`\u54CD\u5E94\u72B6\u6001: ${response.status} ${response.statusText}`);
6520
6536
  if (options.responseType == "stream") return response;
6521
- const responseDataSummary = JSON.stringify(response.data).substring(0, 500) + (JSON.stringify(response.data).length > 500 ? "..." : "");
6537
+ const responseJson = JSON.stringify(response.data);
6538
+ const responseDataSummary = responseJson.substring(0, 500) + (responseJson.length > 500 ? "..." : "");
6522
6539
  logger_default.info(`\u54CD\u5E94\u6570\u636E\u6458\u8981: ${responseDataSummary}`);
6523
6540
  if (response.status >= 400) {
6524
6541
  logger_default.warn(`HTTP\u9519\u8BEF: ${response.status} ${response.statusText}`);
@@ -6636,7 +6653,7 @@ async function checkInternationalTokenLive(refreshToken, regionInfo) {
6636
6653
  const cookie = generateCookie(refreshToken);
6637
6654
  try {
6638
6655
  const response = await import_axios2.default.get(
6639
- "https://dreamina.capcut.com/passport/web/account/info/",
6656
+ `${INTERNATIONAL_FRONTEND_ORIGIN}/passport/web/account/info/`,
6640
6657
  {
6641
6658
  params: {
6642
6659
  aid,
@@ -6647,8 +6664,8 @@ async function checkInternationalTokenLive(refreshToken, regionInfo) {
6647
6664
  headers: {
6648
6665
  ...FAKE_HEADERS,
6649
6666
  Cookie: cookie,
6650
- Referer: "https://dreamina.capcut.com/ai-tool/home/",
6651
- Origin: "https://dreamina.capcut.com",
6667
+ Referer: `${INTERNATIONAL_FRONTEND_ORIGIN}/ai-tool/home/`,
6668
+ Origin: INTERNATIONAL_FRONTEND_ORIGIN,
6652
6669
  Appid: String(aid),
6653
6670
  "store-country-code": countryCode,
6654
6671
  "store-country-code-src": "uid"
@@ -6669,6 +6686,220 @@ async function checkInternationalTokenLive(refreshToken, regionInfo) {
6669
6686
  }
6670
6687
  }
6671
6688
 
6689
+ // src/api/controllers/models.ts
6690
+ var CACHE_TTL_MS = 10 * 60 * 1e3;
6691
+ var FALLBACK_TOKEN = "test_token";
6692
+ var modelCache = /* @__PURE__ */ new Map();
6693
+ function mapVideoDescription(id) {
6694
+ if (id.includes("veo3.1")) return "\u5373\u68A6AI\u89C6\u9891\u751F\u6210\u6A21\u578B veo3.1";
6695
+ if (id.includes("veo3")) return "\u5373\u68A6AI\u89C6\u9891\u751F\u6210\u6A21\u578B veo3";
6696
+ if (id.includes("sora2")) return "\u5373\u68A6AI\u89C6\u9891\u751F\u6210\u6A21\u578B sora2";
6697
+ if (id.includes("seedance-2.0-fast")) return "\u5373\u68A6AI\u89C6\u9891\u751F\u6210\u6A21\u578B seedance 2.0-fast";
6698
+ if (id.includes("seedance-2.0")) return "\u5373\u68A6AI\u89C6\u9891\u751F\u6210\u6A21\u578B seedance 2.0";
6699
+ if (id.includes("3.5-pro")) return "\u5373\u68A6AI\u89C6\u9891\u751F\u6210\u6A21\u578B 3.5 \u4E13\u4E1A\u7248";
6700
+ if (id.includes("3.0-fast")) return "\u5373\u68A6AI\u89C6\u9891\u751F\u6210\u6A21\u578B 3.0 \u6781\u901F\u7248";
6701
+ if (id.includes("3.0-pro")) return "\u5373\u68A6AI\u89C6\u9891\u751F\u6210\u6A21\u578B 3.0 \u4E13\u4E1A\u7248";
6702
+ if (id.includes("3.0")) return "\u5373\u68A6AI\u89C6\u9891\u751F\u6210\u6A21\u578B 3.0";
6703
+ if (id.includes("2.0-pro")) return "\u5373\u68A6AI\u89C6\u9891\u751F\u6210\u6A21\u578B 2.0 \u4E13\u4E1A\u7248";
6704
+ if (id.includes("2.0")) return "\u5373\u68A6AI\u89C6\u9891\u751F\u6210\u6A21\u578B 2.0";
6705
+ return void 0;
6706
+ }
6707
+ function mapImageDescription(id) {
6708
+ if (id.includes("5.0")) return "\u5373\u68A6AI\u56FE\u50CF\u6A21\u578B 5.0";
6709
+ if (id.includes("4.6")) return "\u5373\u68A6AI\u56FE\u50CF\u6A21\u578B 4.6";
6710
+ if (id.includes("4.5")) return "\u5373\u68A6AI\u56FE\u50CF\u6A21\u578B 4.5";
6711
+ if (id.includes("4.1")) return "\u5373\u68A6AI\u56FE\u50CF\u6A21\u578B 4.1";
6712
+ if (id.includes("4.0")) return "\u5373\u68A6AI\u56FE\u50CF\u6A21\u578B 4.0";
6713
+ if (id.includes("3.1")) return "\u5373\u68A6AI\u56FE\u50CF\u6A21\u578B 3.1";
6714
+ if (id.includes("3.0")) return "\u5373\u68A6AI\u56FE\u50CF\u6A21\u578B 3.0";
6715
+ return `\u5373\u68A6AI\u56FE\u50CF\u6A21\u578B ${id}`;
6716
+ }
6717
+ function buildModelItem(modelId, meta) {
6718
+ var _a;
6719
+ const modelType = modelId.startsWith("jimeng-video-") ? "video" : "image";
6720
+ const item = {
6721
+ id: modelId,
6722
+ object: "model",
6723
+ owned_by: "jimeng-cli",
6724
+ model_type: modelType
6725
+ };
6726
+ if (meta == null ? void 0 : meta.reqKey) item.model_req_key = meta.reqKey;
6727
+ if (meta == null ? void 0 : meta.modelName) item.model_name = meta.modelName;
6728
+ if ((_a = meta == null ? void 0 : meta.capabilities) == null ? void 0 : _a.length) item.capabilities = Array.from(new Set(meta.capabilities)).sort();
6729
+ if ((meta == null ? void 0 : meta.params) && Object.keys(meta.params).length > 0) item.params = meta.params;
6730
+ if (meta == null ? void 0 : meta.modelTip) {
6731
+ item.description = meta.modelTip;
6732
+ } else if (modelType === "video") {
6733
+ item.description = mapVideoDescription(modelId);
6734
+ } else {
6735
+ item.description = mapImageDescription(modelId);
6736
+ }
6737
+ return item;
6738
+ }
6739
+ function parseFirstToken(authorization) {
6740
+ var _a;
6741
+ if (!authorization || !/^Bearer\s+/i.test(authorization)) return void 0;
6742
+ const raw = authorization.replace(/^Bearer\s+/i, "").trim();
6743
+ if (!raw) return void 0;
6744
+ const first = (_a = raw.split(",")[0]) == null ? void 0 : _a.trim();
6745
+ return first || void 0;
6746
+ }
6747
+ function resolveToken(authorization) {
6748
+ const fromAuth = parseFirstToken(authorization);
6749
+ if (fromAuth) return fromAuth;
6750
+ const fromPool = session_pool_default.getAllTokens({ onlyEnabled: true, preferLive: true })[0];
6751
+ return fromPool || void 0;
6752
+ }
6753
+ function getRegionalMaps(region) {
6754
+ if (region === "us") return [IMAGE_MODEL_MAP_US, VIDEO_MODEL_MAP_US];
6755
+ if (region === "hk" || region === "jp" || region === "sg") return [IMAGE_MODEL_MAP_ASIA, VIDEO_MODEL_MAP_ASIA];
6756
+ if (region === "cn") return [IMAGE_MODEL_MAP, VIDEO_MODEL_MAP];
6757
+ return [IMAGE_MODEL_MAP, IMAGE_MODEL_MAP_US, IMAGE_MODEL_MAP_ASIA, VIDEO_MODEL_MAP, VIDEO_MODEL_MAP_US, VIDEO_MODEL_MAP_ASIA];
6758
+ }
6759
+ function resolveRegion(authorization, xRegion) {
6760
+ var _a;
6761
+ const token = resolveToken(authorization);
6762
+ const parsedXRegion = parseRegionCode(xRegion);
6763
+ if (parsedXRegion) return parsedXRegion;
6764
+ if (token) {
6765
+ assertTokenWithoutRegionPrefix(token);
6766
+ const normalizedToken = parseProxyFromToken(token).token;
6767
+ const poolRegion = (_a = session_pool_default.getTokenEntry(normalizedToken)) == null ? void 0 : _a.region;
6768
+ if (poolRegion) return poolRegion;
6769
+ throw new Error("\u7F3A\u5C11 region\u3002token \u672A\u5728 pool \u4E2D\u6CE8\u518C\u65F6\uFF0C/v1/models \u9700\u8981\u63D0\u4F9B\u8BF7\u6C42\u5934 X-Region");
6770
+ }
6771
+ return "cn";
6772
+ }
6773
+ var reverseMapCache = /* @__PURE__ */ new Map();
6774
+ function buildReverseMap(region) {
6775
+ const cached = reverseMapCache.get(region);
6776
+ if (cached) return cached;
6777
+ const reverse = {};
6778
+ for (const map of getRegionalMaps(region)) {
6779
+ for (const [modelId, upstreamKey] of Object.entries(map)) {
6780
+ reverse[upstreamKey] = modelId;
6781
+ }
6782
+ }
6783
+ reverseMapCache.set(region, reverse);
6784
+ return reverse;
6785
+ }
6786
+ function buildFallbackModels(region) {
6787
+ const maps = getRegionalMaps(region);
6788
+ const modelIds = Array.from(new Set(maps.flatMap((item) => Object.keys(item)))).sort();
6789
+ return modelIds.map((id) => buildModelItem(id));
6790
+ }
6791
+ function makeCacheKey(region) {
6792
+ return `models|${region}`;
6793
+ }
6794
+ function resolveFetchToken(token) {
6795
+ if (!token) return FALLBACK_TOKEN;
6796
+ const normalizedToken = parseProxyFromToken(token).token;
6797
+ assertTokenWithoutRegionPrefix(normalizedToken);
6798
+ return normalizedToken;
6799
+ }
6800
+ function extractValidOptions(item) {
6801
+ return (Array.isArray(item.options) ? item.options : []).filter(
6802
+ (opt) => !!opt && typeof opt === "object" && typeof opt.key === "string" && opt.key.length > 0
6803
+ );
6804
+ }
6805
+ function extractCapabilities(item) {
6806
+ const features = Array.isArray(item.feats) ? item.feats.filter((f) => typeof f === "string" && f.length > 0) : [];
6807
+ const optionKeys = extractValidOptions(item).map((o) => o.key);
6808
+ return Array.from(/* @__PURE__ */ new Set([...features, ...optionKeys]));
6809
+ }
6810
+ function extractEnumParams(item) {
6811
+ const params = {};
6812
+ for (const o of extractValidOptions(item)) {
6813
+ const ev = o.enum_val;
6814
+ if (!ev) continue;
6815
+ const sv = ev.string_value;
6816
+ const iv = ev.int_value;
6817
+ const vals = sv || iv;
6818
+ if (vals && vals.length > 0) {
6819
+ params[o.key] = vals;
6820
+ }
6821
+ }
6822
+ const rm = item.resolution_map;
6823
+ if (rm && typeof rm === "object") {
6824
+ params["resolution"] = Object.keys(rm).map(String);
6825
+ }
6826
+ const steps = item.sample_steps;
6827
+ if (steps && typeof steps === "object") {
6828
+ params["steps"] = [steps.min_steps, steps.max_steps];
6829
+ }
6830
+ return params;
6831
+ }
6832
+ function toUpstreamMeta(item) {
6833
+ const reqKey = item == null ? void 0 : item.model_req_key;
6834
+ if (typeof reqKey !== "string" || reqKey.length === 0) return void 0;
6835
+ return {
6836
+ reqKey,
6837
+ modelName: typeof (item == null ? void 0 : item.model_name) === "string" ? item.model_name : void 0,
6838
+ modelTip: typeof (item == null ? void 0 : item.model_tip) === "string" ? item.model_tip : void 0,
6839
+ capabilities: extractCapabilities(item),
6840
+ params: extractEnumParams(item)
6841
+ };
6842
+ }
6843
+ async function fetchConfigModelReqKeys(token, region) {
6844
+ const regionInfo = buildRegionInfo(region);
6845
+ const [imageConfig, videoConfig] = await Promise.all([
6846
+ request("post", "/mweb/v1/get_common_config", token, regionInfo, {
6847
+ data: {},
6848
+ params: { needCache: true, needRefresh: false }
6849
+ }),
6850
+ request("post", "/mweb/v1/video_generate/get_common_config", token, regionInfo, {
6851
+ data: { scene: "generate_video", params: {} }
6852
+ })
6853
+ ]);
6854
+ const toList = (config) => Array.isArray(config == null ? void 0 : config.model_list) ? config.model_list.map(toUpstreamMeta).filter((m) => Boolean(m)) : [];
6855
+ return { imageModels: toList(imageConfig), videoModels: toList(videoConfig) };
6856
+ }
6857
+ async function getLiveModels(authorization, xRegion) {
6858
+ const region = resolveRegion(authorization, xRegion);
6859
+ const token = resolveToken(authorization);
6860
+ const effectiveToken = resolveFetchToken(token);
6861
+ const cacheKey = makeCacheKey(region);
6862
+ const cached = modelCache.get(cacheKey);
6863
+ if (cached && cached.expiresAt > Date.now()) {
6864
+ return { source: cached.source, data: cached.data };
6865
+ }
6866
+ try {
6867
+ const reverseMap = buildReverseMap(region);
6868
+ const { imageModels, videoModels } = await fetchConfigModelReqKeys(effectiveToken, region);
6869
+ const upstreamModels = [...imageModels, ...videoModels];
6870
+ const metaByModelId = /* @__PURE__ */ new Map();
6871
+ const mapped = upstreamModels.map((model) => {
6872
+ const modelId = reverseMap[model.reqKey];
6873
+ if (modelId && !metaByModelId.has(modelId)) {
6874
+ metaByModelId.set(modelId, model);
6875
+ }
6876
+ return modelId;
6877
+ }).filter((item) => typeof item === "string" && item.length > 0);
6878
+ const modelIds = Array.from(new Set(mapped)).sort();
6879
+ if (modelIds.length === 0) {
6880
+ throw new Error("model_req_key resolved but none matched local reverse map");
6881
+ }
6882
+ const data = modelIds.map((id) => buildModelItem(id, metaByModelId.get(id)));
6883
+ modelCache.set(cacheKey, {
6884
+ expiresAt: Date.now() + CACHE_TTL_MS,
6885
+ source: "upstream",
6886
+ data
6887
+ });
6888
+ return { source: "upstream", data };
6889
+ } catch {
6890
+ const data = buildFallbackModels(region);
6891
+ modelCache.set(cacheKey, {
6892
+ expiresAt: Date.now() + CACHE_TTL_MS,
6893
+ source: "fallback",
6894
+ data
6895
+ });
6896
+ return { source: "fallback", data };
6897
+ }
6898
+ }
6899
+ async function refreshAllTokenModels() {
6900
+ return session_pool_default.refreshAllDynamicCapabilities();
6901
+ }
6902
+
6672
6903
  // src/lib/session-pool.ts
6673
6904
  function sample(arr) {
6674
6905
  return arr.length > 0 ? arr[Math.floor(Math.random() * arr.length)] : void 0;
@@ -6718,10 +6949,14 @@ var TokenPool = class {
6718
6949
  );
6719
6950
  }
6720
6951
  getSummary() {
6721
- const entries = this.getEntries(false);
6722
- const enabledCount = entries.filter((item) => item.enabled).length;
6723
- const liveCount = entries.filter((item) => item.enabled && item.live === true).length;
6724
- const missingRegionCount = entries.filter((item) => !item.region).length;
6952
+ let enabledCount = 0;
6953
+ let liveCount = 0;
6954
+ let missingRegionCount = 0;
6955
+ for (const item of this.entryMap.values()) {
6956
+ if (item.enabled) enabledCount++;
6957
+ if (item.enabled && item.live === true) liveCount++;
6958
+ if (!item.region) missingRegionCount++;
6959
+ }
6725
6960
  return {
6726
6961
  enabled: this.enabled,
6727
6962
  filePath: this.filePath,
@@ -6730,19 +6965,19 @@ var TokenPool = class {
6730
6965
  fetchCreditOnCheck: this.fetchCreditOnCheck,
6731
6966
  autoDisableEnabled: this.autoDisableEnabled,
6732
6967
  autoDisableFailures: this.autoDisableFailures,
6733
- total: entries.length,
6968
+ total: this.entryMap.size,
6734
6969
  enabledCount,
6735
6970
  liveCount,
6736
6971
  missingRegionCount,
6737
6972
  lastHealthCheckAt: this.lastHealthCheckAt || null
6738
6973
  };
6739
6974
  }
6740
- getEntries(maskToken2 = true) {
6975
+ getEntries(shouldMask = true) {
6741
6976
  const items = Array.from(this.entryMap.values()).map((item) => ({ ...item }));
6742
- if (!maskToken2) return items;
6977
+ if (!shouldMask) return items;
6743
6978
  return items.map((item) => ({
6744
6979
  ...item,
6745
- token: this.maskToken(item.token)
6980
+ token: maskToken(item.token)
6746
6981
  }));
6747
6982
  }
6748
6983
  getAllTokens(options = {}) {
@@ -6813,7 +7048,7 @@ var TokenPool = class {
6813
7048
  token: null,
6814
7049
  region: null,
6815
7050
  error: "prefixed_token_not_supported",
6816
- reason: `token ${this.maskToken(prefixedCandidate.token)} \u4F7F\u7528\u4E86\u5DF2\u5E9F\u5F03\u7684 region \u524D\u7F00`
7051
+ reason: `token ${maskToken(prefixedCandidate.token)} \u4F7F\u7528\u4E86\u5DF2\u5E9F\u5F03\u7684 region \u524D\u7F00`
6817
7052
  };
6818
7053
  }
6819
7054
  const regionLockedCandidates = validCandidates.filter(
@@ -6919,8 +7154,8 @@ var TokenPool = class {
6919
7154
  async refreshDynamicCapabilitiesForToken(token) {
6920
7155
  if (!this.enabled) throw new Error("Token pool disabled");
6921
7156
  const item = this.entryMap.get(token);
6922
- if (!item) throw new Error(`Token not found in pool: ${this.maskToken(token)}`);
6923
- if (!item.region) throw new Error(`Token ${this.maskToken(token)} has no region`);
7157
+ if (!item) throw new Error(`Token not found in pool: ${maskToken(token)}`);
7158
+ if (!item.region) throw new Error(`Token ${maskToken(token)} has no region`);
6924
7159
  const regionInfo = buildRegionInfo(item.region);
6925
7160
  const capabilities = await this.fetchDynamicCapabilities(token, regionInfo);
6926
7161
  item.dynamicCapabilities = { ...capabilities, updatedAt: Date.now() };
@@ -6932,39 +7167,41 @@ var TokenPool = class {
6932
7167
  * Returns a per-token result summary.
6933
7168
  */
6934
7169
  async refreshAllDynamicCapabilities() {
6935
- var _a, _b;
6936
7170
  if (!this.enabled) return [];
6937
7171
  const entries = this.getEntries(false).filter(
6938
7172
  (item) => item.enabled && item.live !== false && Boolean(item.region)
6939
7173
  );
6940
- const results = [];
6941
- for (const entry of entries) {
6942
- try {
6943
- const regionInfo = buildRegionInfo(entry.region);
6944
- const capabilities = await this.fetchDynamicCapabilities(entry.token, regionInfo);
6945
- const current = this.entryMap.get(entry.token);
6946
- if (current) {
6947
- current.dynamicCapabilities = { ...capabilities, updatedAt: Date.now() };
6948
- }
6949
- results.push({
6950
- token: this.maskToken(entry.token),
6951
- region: entry.region,
6952
- imageModels: ((_a = capabilities.imageModels) == null ? void 0 : _a.length) ?? 0,
6953
- videoModels: ((_b = capabilities.videoModels) == null ? void 0 : _b.length) ?? 0,
6954
- capabilityTags: capabilities.capabilityTags ?? []
6955
- });
6956
- } catch (err) {
6957
- results.push({
6958
- token: this.maskToken(entry.token),
6959
- region: entry.region,
6960
- imageModels: 0,
6961
- videoModels: 0,
6962
- capabilityTags: [],
6963
- error: (err == null ? void 0 : err.message) || String(err)
6964
- });
6965
- }
6966
- }
6967
- if (entries.length > 0) await this.persistToDisk();
7174
+ if (entries.length === 0) return [];
7175
+ const results = await Promise.all(
7176
+ entries.map(async (entry) => {
7177
+ var _a, _b;
7178
+ try {
7179
+ const regionInfo = buildRegionInfo(entry.region);
7180
+ const capabilities = await this.fetchDynamicCapabilities(entry.token, regionInfo);
7181
+ const current = this.entryMap.get(entry.token);
7182
+ if (current) {
7183
+ current.dynamicCapabilities = { ...capabilities, updatedAt: Date.now() };
7184
+ }
7185
+ return {
7186
+ token: maskToken(entry.token),
7187
+ region: entry.region,
7188
+ imageModels: ((_a = capabilities.imageModels) == null ? void 0 : _a.length) ?? 0,
7189
+ videoModels: ((_b = capabilities.videoModels) == null ? void 0 : _b.length) ?? 0,
7190
+ capabilityTags: capabilities.capabilityTags ?? []
7191
+ };
7192
+ } catch (err) {
7193
+ return {
7194
+ token: maskToken(entry.token),
7195
+ region: entry.region,
7196
+ imageModels: 0,
7197
+ videoModels: 0,
7198
+ capabilityTags: [],
7199
+ error: err instanceof Error ? err.message : String(err)
7200
+ };
7201
+ }
7202
+ })
7203
+ );
7204
+ await this.persistToDisk();
6968
7205
  return results;
6969
7206
  }
6970
7207
  async runHealthCheck() {
@@ -7085,14 +7322,10 @@ var TokenPool = class {
7085
7322
  await import_fs_extra4.default.ensureDir(import_path4.default.dirname(this.filePath));
7086
7323
  const payload = {
7087
7324
  updatedAt: Date.now(),
7088
- tokens: this.getEntries(false)
7325
+ tokens: Array.from(this.entryMap.values())
7089
7326
  };
7090
7327
  await import_fs_extra4.default.writeJson(this.filePath, payload, { spaces: 2 });
7091
7328
  }
7092
- maskToken(token) {
7093
- if (token.length <= 10) return "***";
7094
- return `${token.slice(0, 4)}...${token.slice(-4)}`;
7095
- }
7096
7329
  parseAuthorizationTokens(authorization) {
7097
7330
  if (typeof authorization !== "string" || authorization.trim().length === 0) {
7098
7331
  return { tokens: [], error: null };
@@ -7121,7 +7354,7 @@ var TokenPool = class {
7121
7354
  if (!token) continue;
7122
7355
  const parsedRegion = parseRegionCode(item.region || defaultRegion);
7123
7356
  if (!parsedRegion) {
7124
- throw new Error(`token ${this.maskToken(token)} \u7F3A\u5C11\u6709\u6548 region\uFF08\u4EC5\u652F\u6301 cn/us/hk/jp/sg\uFF09`);
7357
+ throw new Error(`token ${maskToken(token)} \u7F3A\u5C11\u6709\u6548 region\uFF08\u4EC5\u652F\u6301 cn/us/hk/jp/sg\uFF09`);
7125
7358
  }
7126
7359
  normalized.push({
7127
7360
  token,
@@ -7229,40 +7462,22 @@ var TokenPool = class {
7229
7462
  }
7230
7463
  async fetchDynamicCapabilities(token, regionInfo) {
7231
7464
  const regionCode = regionInfo.isUS ? "us" : regionInfo.isHK ? "hk" : regionInfo.isJP ? "jp" : regionInfo.isSG ? "sg" : "cn";
7232
- const reverseMap = this.getReverseModelMapByRegion(regionCode);
7233
- const imageConfig = await request("post", "/mweb/v1/get_common_config", token, regionInfo, {
7234
- data: {},
7235
- params: { needCache: true, needRefresh: false }
7236
- });
7237
- const videoConfig = await request("post", "/mweb/v1/video_generate/get_common_config", token, regionInfo, {
7238
- data: { scene: "generate_video", params: {} }
7239
- });
7240
- 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) : [];
7241
- 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) : [];
7242
- const imageModels = imageReqKeys.map((key) => reverseMap[key]).filter(Boolean);
7243
- const videoModels = videoReqKeys.map((key) => reverseMap[key]).filter(Boolean);
7465
+ const reverseMap = buildReverseMap(regionCode);
7466
+ const { imageModels, videoModels } = await fetchConfigModelReqKeys(token, regionCode);
7467
+ const imageIds = imageModels.map((m) => reverseMap[m.reqKey]).filter(Boolean);
7468
+ const videoIds = videoModels.map((m) => reverseMap[m.reqKey]).filter(Boolean);
7244
7469
  const capabilityTags = /* @__PURE__ */ new Set();
7245
- for (const model of videoModels) {
7470
+ for (const model of videoIds) {
7246
7471
  if (model.includes("seedance_40")) capabilityTags.add("omni_reference");
7247
7472
  if (model.includes("veo3")) capabilityTags.add("veo3");
7248
7473
  if (model.includes("sora2")) capabilityTags.add("sora2");
7249
7474
  }
7250
7475
  return {
7251
- imageModels: imageModels.length ? Array.from(new Set(imageModels)) : void 0,
7252
- videoModels: videoModels.length ? Array.from(new Set(videoModels)) : void 0,
7476
+ imageModels: imageIds.length ? Array.from(new Set(imageIds)) : void 0,
7477
+ videoModels: videoIds.length ? Array.from(new Set(videoIds)) : void 0,
7253
7478
  capabilityTags: capabilityTags.size ? Array.from(capabilityTags) : void 0
7254
7479
  };
7255
7480
  }
7256
- getReverseModelMapByRegion(region) {
7257
- 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];
7258
- const reverse = {};
7259
- for (const map of maps) {
7260
- for (const [modelId, reqKey] of Object.entries(map)) {
7261
- reverse[reqKey] = modelId;
7262
- }
7263
- }
7264
- return reverse;
7265
- }
7266
7481
  };
7267
7482
  var session_pool_default = new TokenPool();
7268
7483
 
@@ -7271,10 +7486,6 @@ var import_node_fs = require("fs");
7271
7486
  var import_node_path = __toESM(require("path"), 1);
7272
7487
  var import_promises2 = require("fs/promises");
7273
7488
  var import_minimist2 = __toESM(require("minimist"), 1);
7274
- function maskToken(token) {
7275
- if (token.length <= 10) return "***";
7276
- return `${token.slice(0, 4)}...${token.slice(-4)}`;
7277
- }
7278
7489
  function formatUnixMs(value) {
7279
7490
  if (typeof value !== "number" || !Number.isFinite(value) || value <= 0) return "-";
7280
7491
  return new Date(value).toISOString();
@@ -7376,29 +7587,28 @@ function createTokenSubcommands(deps) {
7376
7587
  if (!args.json) {
7377
7588
  console.log(`Checking ${pairs.length} token(s)`);
7378
7589
  }
7379
- let invalid = 0;
7380
- let requestErrors = 0;
7381
- const results = [];
7382
- for (const { token, region } of pairs) {
7383
- const masked = maskToken(token);
7384
- try {
7385
- const live = await getTokenLiveStatus(token, buildRegionInfo(region));
7386
- await session_pool_default.syncTokenCheckResult(token, live);
7387
- if (live) {
7388
- if (!args.json) console.log(`[OK] ${masked} (${region}) live=true`);
7389
- results.push({ token_masked: masked, region, live: true });
7390
- } else {
7391
- invalid += 1;
7392
- if (!args.json) console.log(`[FAIL] ${masked} (${region}) live=false`);
7393
- results.push({ token_masked: masked, region, live: false });
7590
+ const results = await Promise.all(
7591
+ pairs.map(async ({ token, region }) => {
7592
+ const masked = maskToken(token);
7593
+ try {
7594
+ const live = await getTokenLiveStatus(token, buildRegionInfo(region));
7595
+ await session_pool_default.syncTokenCheckResult(token, live);
7596
+ if (live) {
7597
+ if (!args.json) console.log(`[OK] ${masked} (${region}) live=true`);
7598
+ return { token_masked: masked, region, live: true };
7599
+ } else {
7600
+ if (!args.json) console.log(`[FAIL] ${masked} (${region}) live=false`);
7601
+ return { token_masked: masked, region, live: false };
7602
+ }
7603
+ } catch (error) {
7604
+ const message = error instanceof Error ? error.message : String(error);
7605
+ if (!args.json) console.log(`[ERROR] ${masked} (${region}) ${message}`);
7606
+ return { token_masked: masked, region, error: message };
7394
7607
  }
7395
- } catch (error) {
7396
- requestErrors += 1;
7397
- const message = error instanceof Error ? error.message : String(error);
7398
- if (!args.json) console.log(`[ERROR] ${masked} (${region}) ${message}`);
7399
- results.push({ token_masked: masked, region, error: message });
7400
- }
7401
- }
7608
+ })
7609
+ );
7610
+ const invalid = results.filter((r) => r.live === false).length;
7611
+ const requestErrors = results.filter((r) => r.error).length;
7402
7612
  if (args.json) {
7403
7613
  deps.printCommandJson("token.check", results, {
7404
7614
  total: pairs.length,
@@ -7446,27 +7656,37 @@ function createTokenSubcommands(deps) {
7446
7656
  await deps.ensureTokenPoolReady();
7447
7657
  const explicitTokens = await collectTokensFromArgs(args, usage, deps, false);
7448
7658
  const pairs = resolveTokenRegionPairs(explicitTokens, regionCode, deps);
7449
- const payload = action === "points" ? await Promise.all(
7450
- pairs.map(async ({ token, region }) => ({
7451
- token,
7452
- points: await getCredit(token, buildRegionInfo(region))
7453
- }))
7454
- ) : await Promise.all(
7455
- pairs.map(async ({ token, region }) => {
7456
- const regionInfo = buildRegionInfo(region);
7659
+ const toErrorResult = (token, region, error) => ({
7660
+ token_masked: maskToken(token),
7661
+ region,
7662
+ error: error instanceof Error ? error.message : String(error)
7663
+ });
7664
+ const fetchPoints = async ({ token, region }) => {
7665
+ try {
7666
+ return { token_masked: maskToken(token), region, points: await getCredit(token, buildRegionInfo(region)) };
7667
+ } catch (error) {
7668
+ return toErrorResult(token, region, error);
7669
+ }
7670
+ };
7671
+ const processReceive = async ({ token, region }) => {
7672
+ const regionInfo = buildRegionInfo(region);
7673
+ try {
7457
7674
  const currentCredit = await getCredit(token, regionInfo);
7458
- if (currentCredit.totalCredit <= 0) {
7459
- try {
7460
- await receiveCredit(token, regionInfo);
7461
- const updatedCredit = await getCredit(token, regionInfo);
7462
- return { token, credits: updatedCredit, received: true };
7463
- } catch (error) {
7464
- return { token, credits: currentCredit, received: false, error: (error == null ? void 0 : error.message) || String(error) };
7465
- }
7675
+ if (currentCredit.totalCredit > 0) {
7676
+ return { token_masked: maskToken(token), region, credits: currentCredit, received: false };
7466
7677
  }
7467
- return { token, credits: currentCredit, received: false };
7468
- })
7469
- );
7678
+ try {
7679
+ await receiveCredit(token, regionInfo);
7680
+ const updatedCredit = await getCredit(token, regionInfo);
7681
+ return { token_masked: maskToken(token), region, credits: updatedCredit, received: true };
7682
+ } catch (error) {
7683
+ return { token_masked: maskToken(token), region, credits: currentCredit, received: false, ...toErrorResult(token, region, error) };
7684
+ }
7685
+ } catch (error) {
7686
+ return toErrorResult(token, region, error);
7687
+ }
7688
+ };
7689
+ const payload = action === "points" ? await Promise.all(pairs.map(fetchPoints)) : await Promise.all(pairs.map(processReceive));
7470
7690
  if (args.json) {
7471
7691
  deps.printCommandJson(`token.${action}`, payload);
7472
7692
  return;
@@ -7554,10 +7774,13 @@ function createTokenSubcommands(deps) {
7554
7774
  return;
7555
7775
  }
7556
7776
  await deps.ensureTokenPoolReady();
7557
- const payload = action === "pool-check" ? { ...await session_pool_default.runHealthCheck(), summary: session_pool_default.getSummary() } : (() => {
7777
+ let payload;
7778
+ if (action === "pool-check") {
7779
+ payload = { ...await session_pool_default.runHealthCheck(), summary: session_pool_default.getSummary() };
7780
+ } else {
7558
7781
  session_pool_default.reloadFromDisk();
7559
- return { reloaded: true, summary: session_pool_default.getSummary(), items: buildTokenPoolSnapshot().items };
7560
- })();
7782
+ payload = { reloaded: true, summary: session_pool_default.getSummary(), items: buildTokenPoolSnapshot().items };
7783
+ }
7561
7784
  if (args.json) {
7562
7785
  deps.printCommandJson(`token.${action}`, deps.unwrapBody(payload));
7563
7786
  return;
@@ -7677,196 +7900,6 @@ function createTokenSubcommands(deps) {
7677
7900
  // src/cli/query-commands.ts
7678
7901
  var import_minimist3 = __toESM(require("minimist"), 1);
7679
7902
 
7680
- // src/api/controllers/models.ts
7681
- var CACHE_TTL_MS = 10 * 60 * 1e3;
7682
- var FALLBACK_TOKEN = "test_token";
7683
- var modelCache = /* @__PURE__ */ new Map();
7684
- function mapVideoDescription(id) {
7685
- if (id.includes("veo3.1")) return "\u5373\u68A6AI\u89C6\u9891\u751F\u6210\u6A21\u578B veo3.1";
7686
- if (id.includes("veo3")) return "\u5373\u68A6AI\u89C6\u9891\u751F\u6210\u6A21\u578B veo3";
7687
- if (id.includes("sora2")) return "\u5373\u68A6AI\u89C6\u9891\u751F\u6210\u6A21\u578B sora2";
7688
- if (id.includes("seedance-2.0-fast")) return "\u5373\u68A6AI\u89C6\u9891\u751F\u6210\u6A21\u578B seedance 2.0-fast";
7689
- if (id.includes("seedance-2.0")) return "\u5373\u68A6AI\u89C6\u9891\u751F\u6210\u6A21\u578B seedance 2.0";
7690
- if (id.includes("3.5-pro")) return "\u5373\u68A6AI\u89C6\u9891\u751F\u6210\u6A21\u578B 3.5 \u4E13\u4E1A\u7248";
7691
- if (id.includes("3.0-fast")) return "\u5373\u68A6AI\u89C6\u9891\u751F\u6210\u6A21\u578B 3.0 \u6781\u901F\u7248";
7692
- if (id.includes("3.0-pro")) return "\u5373\u68A6AI\u89C6\u9891\u751F\u6210\u6A21\u578B 3.0 \u4E13\u4E1A\u7248";
7693
- if (id.includes("3.0")) return "\u5373\u68A6AI\u89C6\u9891\u751F\u6210\u6A21\u578B 3.0";
7694
- if (id.includes("2.0-pro")) return "\u5373\u68A6AI\u89C6\u9891\u751F\u6210\u6A21\u578B 2.0 \u4E13\u4E1A\u7248";
7695
- if (id.includes("2.0")) return "\u5373\u68A6AI\u89C6\u9891\u751F\u6210\u6A21\u578B 2.0";
7696
- return void 0;
7697
- }
7698
- function mapImageDescription(id) {
7699
- if (id.includes("5.0")) return "\u5373\u68A6AI\u56FE\u50CF\u6A21\u578B 5.0";
7700
- if (id.includes("4.6")) return "\u5373\u68A6AI\u56FE\u50CF\u6A21\u578B 4.6";
7701
- if (id.includes("4.5")) return "\u5373\u68A6AI\u56FE\u50CF\u6A21\u578B 4.5";
7702
- if (id.includes("4.1")) return "\u5373\u68A6AI\u56FE\u50CF\u6A21\u578B 4.1";
7703
- if (id.includes("4.0")) return "\u5373\u68A6AI\u56FE\u50CF\u6A21\u578B 4.0";
7704
- if (id.includes("3.1")) return "\u5373\u68A6AI\u56FE\u50CF\u6A21\u578B 3.1";
7705
- if (id.includes("3.0")) return "\u5373\u68A6AI\u56FE\u50CF\u6A21\u578B 3.0";
7706
- return `\u5373\u68A6AI\u56FE\u50CF\u6A21\u578B ${id}`;
7707
- }
7708
- function buildModelItem(modelId, meta) {
7709
- var _a;
7710
- const modelType = modelId.startsWith("jimeng-video-") ? "video" : "image";
7711
- const item = {
7712
- id: modelId,
7713
- object: "model",
7714
- owned_by: "jimeng-cli",
7715
- model_type: modelType
7716
- };
7717
- if (meta == null ? void 0 : meta.reqKey) item.model_req_key = meta.reqKey;
7718
- if (meta == null ? void 0 : meta.modelName) item.model_name = meta.modelName;
7719
- if ((_a = meta == null ? void 0 : meta.capabilities) == null ? void 0 : _a.length) item.capabilities = Array.from(new Set(meta.capabilities)).sort();
7720
- if (meta == null ? void 0 : meta.modelTip) {
7721
- item.description = meta.modelTip;
7722
- } else if (modelType === "video") {
7723
- item.description = mapVideoDescription(modelId);
7724
- } else {
7725
- item.description = mapImageDescription(modelId);
7726
- }
7727
- return item;
7728
- }
7729
- function parseFirstToken(authorization) {
7730
- var _a;
7731
- if (!authorization || !/^Bearer\s+/i.test(authorization)) return void 0;
7732
- const raw = authorization.replace(/^Bearer\s+/i, "").trim();
7733
- if (!raw) return void 0;
7734
- const first = (_a = raw.split(",")[0]) == null ? void 0 : _a.trim();
7735
- return first || void 0;
7736
- }
7737
- function resolveToken(authorization) {
7738
- const fromAuth = parseFirstToken(authorization);
7739
- if (fromAuth) return fromAuth;
7740
- const fromPool = session_pool_default.getAllTokens({ onlyEnabled: true, preferLive: true })[0];
7741
- return fromPool || void 0;
7742
- }
7743
- function getRegionalMaps(region) {
7744
- if (region === "us") return [IMAGE_MODEL_MAP_US, VIDEO_MODEL_MAP_US];
7745
- if (region === "hk" || region === "jp" || region === "sg") return [IMAGE_MODEL_MAP_ASIA, VIDEO_MODEL_MAP_ASIA];
7746
- if (region === "cn") return [IMAGE_MODEL_MAP, VIDEO_MODEL_MAP];
7747
- return [IMAGE_MODEL_MAP, IMAGE_MODEL_MAP_US, IMAGE_MODEL_MAP_ASIA, VIDEO_MODEL_MAP, VIDEO_MODEL_MAP_US, VIDEO_MODEL_MAP_ASIA];
7748
- }
7749
- function resolveRegion(authorization, xRegion) {
7750
- var _a;
7751
- const token = resolveToken(authorization);
7752
- const parsedXRegion = parseRegionCode(xRegion);
7753
- if (parsedXRegion) return parsedXRegion;
7754
- if (token) {
7755
- assertTokenWithoutRegionPrefix(token);
7756
- const normalizedToken = parseProxyFromToken(token).token;
7757
- const poolRegion = (_a = session_pool_default.getTokenEntry(normalizedToken)) == null ? void 0 : _a.region;
7758
- if (poolRegion) return poolRegion;
7759
- throw new Error("\u7F3A\u5C11 region\u3002token \u672A\u5728 pool \u4E2D\u6CE8\u518C\u65F6\uFF0C/v1/models \u9700\u8981\u63D0\u4F9B\u8BF7\u6C42\u5934 X-Region");
7760
- }
7761
- return "cn";
7762
- }
7763
- function buildReverseMap(region) {
7764
- const reverse = {};
7765
- for (const map of getRegionalMaps(region)) {
7766
- for (const [modelId, upstreamKey] of Object.entries(map)) {
7767
- reverse[upstreamKey] = modelId;
7768
- }
7769
- }
7770
- return reverse;
7771
- }
7772
- function buildFallbackModels(region) {
7773
- const maps = getRegionalMaps(region);
7774
- const modelIds = Array.from(new Set(maps.flatMap((item) => Object.keys(item)))).sort();
7775
- return modelIds.map((id) => buildModelItem(id));
7776
- }
7777
- function makeCacheKey(region) {
7778
- return `models|${region}`;
7779
- }
7780
- function resolveFetchToken(token) {
7781
- if (!token) return FALLBACK_TOKEN;
7782
- const normalizedToken = parseProxyFromToken(token).token;
7783
- assertTokenWithoutRegionPrefix(normalizedToken);
7784
- return normalizedToken;
7785
- }
7786
- function extractCapabilities(item) {
7787
- const features = Array.isArray(item.feats) ? item.feats.filter((feature) => typeof feature === "string" && feature.length > 0) : [];
7788
- const options = Array.isArray(item.options) ? item.options.map(
7789
- (option) => option && typeof option === "object" && typeof option.key === "string" ? option.key : void 0
7790
- ).filter((key) => typeof key === "string" && key.length > 0) : [];
7791
- return Array.from(/* @__PURE__ */ new Set([...features, ...options]));
7792
- }
7793
- async function fetchConfigModelReqKeys(token, region) {
7794
- const regionInfo = buildRegionInfo(region);
7795
- const imageConfig = await request("post", "/mweb/v1/get_common_config", token, regionInfo, {
7796
- data: {},
7797
- params: { needCache: true, needRefresh: false }
7798
- });
7799
- const videoConfig = await request("post", "/mweb/v1/video_generate/get_common_config", token, regionInfo, {
7800
- data: { scene: "generate_video", params: {} }
7801
- });
7802
- const imageModels = Array.isArray(imageConfig == null ? void 0 : imageConfig.model_list) ? imageConfig.model_list.map((item) => {
7803
- const reqKey = item == null ? void 0 : item.model_req_key;
7804
- if (typeof reqKey !== "string" || reqKey.length === 0) return void 0;
7805
- return {
7806
- reqKey,
7807
- modelName: typeof (item == null ? void 0 : item.model_name) === "string" ? item.model_name : void 0,
7808
- modelTip: typeof (item == null ? void 0 : item.model_tip) === "string" ? item.model_tip : void 0,
7809
- capabilities: extractCapabilities(item)
7810
- };
7811
- }).filter((item) => Boolean(item)) : [];
7812
- const videoModels = Array.isArray(videoConfig == null ? void 0 : videoConfig.model_list) ? videoConfig.model_list.map((item) => {
7813
- const reqKey = item == null ? void 0 : item.model_req_key;
7814
- if (typeof reqKey !== "string" || reqKey.length === 0) return void 0;
7815
- return {
7816
- reqKey,
7817
- modelName: typeof (item == null ? void 0 : item.model_name) === "string" ? item.model_name : void 0,
7818
- modelTip: typeof (item == null ? void 0 : item.model_tip) === "string" ? item.model_tip : void 0,
7819
- capabilities: extractCapabilities(item)
7820
- };
7821
- }).filter((item) => Boolean(item)) : [];
7822
- return { imageModels, videoModels };
7823
- }
7824
- async function getLiveModels(authorization, xRegion) {
7825
- const region = resolveRegion(authorization, xRegion);
7826
- const token = resolveToken(authorization);
7827
- const effectiveToken = resolveFetchToken(token);
7828
- const cacheKey = makeCacheKey(region);
7829
- const cached = modelCache.get(cacheKey);
7830
- if (cached && cached.expiresAt > Date.now()) {
7831
- return { source: cached.source, data: cached.data };
7832
- }
7833
- try {
7834
- const reverseMap = buildReverseMap(region);
7835
- const { imageModels, videoModels } = await fetchConfigModelReqKeys(effectiveToken, region);
7836
- const upstreamModels = [...imageModels, ...videoModels];
7837
- const metaByModelId = /* @__PURE__ */ new Map();
7838
- const mapped = upstreamModels.map((model) => {
7839
- const modelId = reverseMap[model.reqKey];
7840
- if (modelId && !metaByModelId.has(modelId)) {
7841
- metaByModelId.set(modelId, model);
7842
- }
7843
- return modelId;
7844
- }).filter((item) => typeof item === "string" && item.length > 0);
7845
- const modelIds = Array.from(new Set(mapped)).sort();
7846
- if (modelIds.length === 0) {
7847
- throw new Error("model_req_key resolved but none matched local reverse map");
7848
- }
7849
- const data = modelIds.map((id) => buildModelItem(id, metaByModelId.get(id)));
7850
- modelCache.set(cacheKey, {
7851
- expiresAt: Date.now() + CACHE_TTL_MS,
7852
- source: "upstream",
7853
- data
7854
- });
7855
- return { source: "upstream", data };
7856
- } catch {
7857
- const data = buildFallbackModels(region);
7858
- modelCache.set(cacheKey, {
7859
- expiresAt: Date.now() + CACHE_TTL_MS,
7860
- source: "fallback",
7861
- data
7862
- });
7863
- return { source: "fallback", data };
7864
- }
7865
- }
7866
- async function refreshAllTokenModels() {
7867
- return session_pool_default.refreshAllDynamicCapabilities();
7868
- }
7869
-
7870
7903
  // src/lib/smart-poller.ts
7871
7904
  var SmartPoller = class {
7872
7905
  pollCount = 0;
@@ -8408,7 +8441,6 @@ function printModelIds(models) {
8408
8441
  }
8409
8442
  }
8410
8443
  function printModelVerbose(models) {
8411
- console.log("id type desc capabilities");
8412
8444
  for (const item of models) {
8413
8445
  if (!item || typeof item !== "object") continue;
8414
8446
  const m = item;
@@ -8417,7 +8449,17 @@ function printModelVerbose(models) {
8417
8449
  const type = typeof m.model_type === "string" ? m.model_type : "-";
8418
8450
  const desc = typeof m.description === "string" ? m.description : "-";
8419
8451
  const caps = Array.isArray(m.capabilities) ? m.capabilities.filter((c) => typeof c === "string").join(",") : "-";
8420
- console.log(`${id} type=${type} desc=${desc} capabilities=${caps}`);
8452
+ console.log(`${id} [${type}] ${desc}`);
8453
+ console.log(` capabilities: ${caps}`);
8454
+ const params = m.params;
8455
+ if (params && typeof params === "object") {
8456
+ for (const [key, vals] of Object.entries(params)) {
8457
+ if (Array.isArray(vals)) {
8458
+ console.log(` ${key}: ${vals.join(", ")}`);
8459
+ }
8460
+ }
8461
+ }
8462
+ console.log("");
8421
8463
  }
8422
8464
  }
8423
8465
  function createQueryCommandHandlers(deps) {
@@ -8468,20 +8510,22 @@ function createQueryCommandHandlers(deps) {
8468
8510
  if (entries.length === 0) {
8469
8511
  deps.fail("No enabled+live tokens with region found in pool.");
8470
8512
  }
8471
- const results = [];
8472
- for (const entry of entries) {
8473
- const masked = entry.token.length <= 10 ? "***" : `${entry.token.slice(0, 4)}...${entry.token.slice(-4)}`;
8474
- try {
8475
- const direct2 = await getLiveModels(`Bearer ${entry.token}`, entry.region);
8476
- results.push({
8477
- token: masked,
8478
- region: entry.region,
8479
- models: direct2.data.map((m) => m.id)
8480
- });
8481
- } catch (error) {
8482
- results.push({ token: masked, region: entry.region, error: error.message });
8483
- }
8484
- }
8513
+ const results = await Promise.all(
8514
+ entries.map(async (entry) => {
8515
+ const masked = maskToken(entry.token);
8516
+ try {
8517
+ const direct2 = await getLiveModels(`Bearer ${entry.token}`, entry.region);
8518
+ return {
8519
+ token: masked,
8520
+ region: entry.region,
8521
+ source: direct2.source,
8522
+ models: isVerbose ? direct2.data : direct2.data.map((m) => m.id)
8523
+ };
8524
+ } catch (error) {
8525
+ return { token: masked, region: entry.region, error: error instanceof Error ? error.message : String(error) };
8526
+ }
8527
+ })
8528
+ );
8485
8529
  if (isJson) {
8486
8530
  deps.printCommandJson("models.list", results);
8487
8531
  return;
@@ -8490,6 +8534,8 @@ function createQueryCommandHandlers(deps) {
8490
8534
  console.log(`[${r.region}] ${r.token}`);
8491
8535
  if (r.error) {
8492
8536
  console.log(` error: ${r.error}`);
8537
+ } else if (isVerbose) {
8538
+ printModelVerbose(r.models);
8493
8539
  } else {
8494
8540
  for (const id of r.models) console.log(` ${id}`);
8495
8541
  }
@@ -9333,7 +9379,7 @@ async function generateImageComposition(_model, prompt, images, {
9333
9379
  abilityName: "byte_edit",
9334
9380
  strength: sampleStrength,
9335
9381
  source: {
9336
- imageUrl: `blob:https://dreamina.capcut.com/${util_default.uuid()}`
9382
+ imageUrl: `blob:${INTERNATIONAL_FRONTEND_ORIGIN}/${util_default.uuid()}`
9337
9383
  }
9338
9384
  }));
9339
9385
  const metricsExtra = buildMetricsExtra({
@@ -9368,7 +9414,7 @@ async function generateImageComposition(_model, prompt, images, {
9368
9414
  draftContent,
9369
9415
  metricsExtra
9370
9416
  });
9371
- const imageReferer = regionInfo.isCN ? "https://jimeng.jianying.com/ai-tool/generate?type=image" : "https://dreamina.capcut.com/ai-tool/generate?type=image";
9417
+ const imageReferer = regionInfo.isCN ? `${BASE_URL_CN}/ai-tool/generate?type=image` : `${INTERNATIONAL_FRONTEND_ORIGIN}/ai-tool/generate?type=image`;
9372
9418
  const { aigc_data } = await request(
9373
9419
  "post",
9374
9420
  "/mweb/v1/aigc_draft/generate",
@@ -9532,7 +9578,7 @@ async function generateImagesInternal(_model, prompt, {
9532
9578
  draftContent,
9533
9579
  metricsExtra
9534
9580
  });
9535
- const imageReferer = regionInfo.isCN ? "https://jimeng.jianying.com/ai-tool/generate?type=image" : "https://dreamina.capcut.com/ai-tool/generate?type=image";
9581
+ const imageReferer = regionInfo.isCN ? `${BASE_URL_CN}/ai-tool/generate?type=image` : `${INTERNATIONAL_FRONTEND_ORIGIN}/ai-tool/generate?type=image`;
9536
9582
  const { aigc_data } = await request(
9537
9583
  "post",
9538
9584
  "/mweb/v1/aigc_draft/generate",
@@ -9654,7 +9700,7 @@ async function generateJimeng4xMultiImages(_model, prompt, {
9654
9700
  draftContent,
9655
9701
  metricsExtra
9656
9702
  });
9657
- const imageReferer = regionInfo.isCN ? "https://jimeng.jianying.com/ai-tool/generate?type=image" : "https://dreamina.capcut.com/ai-tool/generate?type=image";
9703
+ const imageReferer = regionInfo.isCN ? `${BASE_URL_CN}/ai-tool/generate?type=image` : `${INTERNATIONAL_FRONTEND_ORIGIN}/ai-tool/generate?type=image`;
9658
9704
  const { aigc_data } = await request(
9659
9705
  "post",
9660
9706
  "/mweb/v1/aigc_draft/generate",
@@ -9826,7 +9872,7 @@ async function upscaleImage(_model, image, {
9826
9872
  draftContent,
9827
9873
  metricsExtra
9828
9874
  });
9829
- const imageReferer = regionInfo.isCN ? "https://jimeng.jianying.com/ai-tool/generate?type=image" : "https://dreamina.capcut.com/ai-tool/generate?type=image";
9875
+ const imageReferer = regionInfo.isCN ? `${BASE_URL_CN}/ai-tool/generate?type=image` : `${INTERNATIONAL_FRONTEND_ORIGIN}/ai-tool/generate?type=image`;
9830
9876
  const { aigc_data } = await request(
9831
9877
  "post",
9832
9878
  "/mweb/v1/aigc_draft/generate",
@@ -10876,7 +10922,7 @@ async function generateVideo(_model, prompt, {
10876
10922
  }
10877
10923
  };
10878
10924
  }
10879
- const videoReferer = regionInfo.isCN ? "https://jimeng.jianying.com/ai-tool/generate?type=video" : "https://dreamina.capcut.com/ai-tool/generate?type=video";
10925
+ const videoReferer = regionInfo.isCN ? `${BASE_URL_CN}/ai-tool/generate?type=video` : `${INTERNATIONAL_FRONTEND_ORIGIN}/ai-tool/generate?type=video`;
10880
10926
  const { aigc_data } = await request(
10881
10927
  "post",
10882
10928
  "/mweb/v1/aigc_draft/generate",