.
diff --git a/configs/dev/service.yml b/configs/dev/service.yml
new file mode 100644
index 0000000..32b1a8b
--- /dev/null
+++ b/configs/dev/service.yml
@@ -0,0 +1,6 @@
+# 服务名称
+name: jimeng-free-api
+# 服务绑定主机地址
+host: '0.0.0.0'
+# 服务绑定端口
+port: 8000
\ No newline at end of file
diff --git a/configs/dev/system.yml b/configs/dev/system.yml
new file mode 100644
index 0000000..dca6170
--- /dev/null
+++ b/configs/dev/system.yml
@@ -0,0 +1,14 @@
+# 是否开启请求日志
+requestLog: true
+# 临时目录路径
+tmpDir: ./tmp
+# 日志目录路径
+logDir: ./logs
+# 日志写入间隔(毫秒)
+logWriteInterval: 200
+# 日志文件有效期(毫秒)
+logFileExpires: 2626560000
+# 公共目录路径
+publicDir: ./public
+# 临时文件有效期(毫秒)
+tmpFileExpires: 86400000
\ No newline at end of file
diff --git a/curl(node.js)_jimeng-5.0lite.txt b/curl(node.js)_jimeng-5.0lite.txt
new file mode 100644
index 0000000..e5ce18d
--- /dev/null
+++ b/curl(node.js)_jimeng-5.0lite.txt
@@ -0,0 +1,827 @@
+fetch("https://mcs.zijieapi.com/list", {
+ "headers": {
+ "accept": "*/*",
+ "accept-language": "zh-CN,zh;q=0.9",
+ "cache-control": "no-cache",
+ "content-type": "application/json; charset=UTF-8",
+ "pragma": "no-cache",
+ "priority": "u=1, i",
+ "sec-ch-ua": "\"Not A(Brand\";v=\"8\", \"Chromium\";v=\"132\", \"Google Chrome\";v=\"132\"",
+ "sec-ch-ua-mobile": "?0",
+ "sec-ch-ua-platform": "\"Windows\"",
+ "sec-fetch-dest": "empty",
+ "sec-fetch-mode": "cors",
+ "sec-fetch-site": "cross-site",
+ "x-mcs-appkey": "566f58151b0ed37e",
+ "Referer": "https://helpdesk.bytedance.com/sites/standalone/helpcenter_web/home?biz_id=73&source=generation&entrance=IM513695-2111&channel=5&app_id=513695&im_extra=%257B%2522device_id%2522%253A%25227605602965571765786%2522%252C%2522host_app_version%2522%253A%25220.0.0.1%2522%252C%2522entrance%2522%253A%2522IM513695-2111%2522%252C%2522host_user_id%2522%253A%2522704135154117550%2522%252C%2522host_user_name%2522%253A%2522%25E5%2591%25A8%25E8%25BE%2589%2522%252C%2522host_user_agent%2522%253A%2522Mozilla%252F5.0%2520%28Windows%2520NT%252010.0%253B%2520Win64%253B%2520x64%29%2520AppleWebKit%252F537.36%2520%28KHTML%252C%2520like%2520Gecko%29%2520Chrome%252F132.0.0.0%2520Safari%252F537.36%2522%252C%2522host_app_name%2522%253A%2522jimeng%2522%252C%2522host_os_type%2522%253A%2522Windows%2522%252C%2522host_os_version%2522%253A%252210%2522%252C%2522host_app_id%2522%253A%2522513695%2522%252C%2522channel%2522%253A%25225%2522%252C%2522device_brand%2522%253A%2522unknown%2522%252C%2522entrance_location%2522%253A%2522%25E5%25B8%25AE%25E5%258A%25A9%25E4%25B8%25AD%25E5%25BF%2583%2522%252C%2522vip_had_pay%2522%253A%25221%2522%257D&theme=dark&ui_theme=dark&inst_id=2&sign_uid=177189382446285",
+ "Referrer-Policy": "no-referrer-when-downgrade"
+ },
+ "body": "[{\"events\":[{\"event\":\"onload\",\"params\":\"{\\\"app_id\\\":2970,\\\"app_name\\\":\\\"\\\",\\\"sdk_version\\\":\\\"5.2.7\\\",\\\"sdk_type\\\":\\\"npm\\\",\\\"sdk_config\\\":{\\\"app_id\\\":2970,\\\"channel\\\":\\\"cn\\\",\\\"enable_ab_test\\\":true,\\\"ab_channel_domain\\\":\\\"https://abtestvm.bytedance.com\\\",\\\"log\\\":true},\\\"sdk_desc\\\":\\\"TOC\\\",\\\"url\\\":\\\"https://helpdesk.bytedance.com/sites/standalone/helpcenter_web/home?biz_id=73&source=generation&entrance=IM513695-2111&channel=5&app_id=513695&im_extra=%257B%2522device_id%2522%253A%25227605602965571765786%2522%252C%2522host_app_version%2522%253A%25220.0.0.1%2522%252C%2522entrance%2522%253A%2522IM513695-2111%2522%252C%2522host_user_id%2522%253A%2522704135154117550%2522%252C%2522host_user_name%2522%253A%2522%25E5%2591%25A8%25E8%25BE%2589%2522%252C%2522host_user_agent%2522%253A%2522Mozilla%252F5.0%2520%28Windows%2520NT%252010.0%253B%2520Win64%253B%2520x64%29%2520AppleWebKit%252F537.36%2520%28KHTML%252C%2520like%2520Gecko%29%2520Chrome%252F132.0.0.0%2520Safari%252F537.36%2522%252C%2522host_app_name%2522%253A%2522jimeng%2522%252C%2522host_os_type%2522%253A%2522Windows%2522%252C%2522host_os_version%2522%253A%252210%2522%252C%2522host_app_id%2522%253A%2522513695%2522%252C%2522channel%2522%253A%25225%2522%252C%2522device_brand%2522%253A%2522unknown%2522%252C%2522entrance_location%2522%253A%2522%25E5%25B8%25AE%25E5%258A%25A9%25E4%25B8%25AD%25E5%25BF%2583%2522%252C%2522vip_had_pay%2522%253A%25221%2522%257D&theme=dark&ui_theme=dark&inst_id=2&sign_uid=177189382446285\\\"}\",\"local_time_ms\":1771893824535}],\"user\":{\"user_unique_id\":\"7490556098354857484\"},\"header\":{}}]",
+ "method": "POST"
+}); ;
+fetch("https://mcs.zijieapi.com/list", {
+ "headers": {
+ "accept": "*/*",
+ "accept-language": "zh-CN,zh;q=0.9",
+ "cache-control": "no-cache",
+ "content-type": "application/json; charset=UTF-8",
+ "pragma": "no-cache",
+ "priority": "u=1, i",
+ "sec-ch-ua": "\"Not A(Brand\";v=\"8\", \"Chromium\";v=\"132\", \"Google Chrome\";v=\"132\"",
+ "sec-ch-ua-mobile": "?0",
+ "sec-ch-ua-platform": "\"Windows\"",
+ "sec-fetch-dest": "empty",
+ "sec-fetch-mode": "cors",
+ "sec-fetch-site": "cross-site",
+ "Referer": "https://helpdesk.bytedance.com/sites/standalone/helpcenter_web/home?biz_id=73&source=generation&entrance=IM513695-2111&channel=5&app_id=513695&im_extra=%257B%2522device_id%2522%253A%25227605602965571765786%2522%252C%2522host_app_version%2522%253A%25220.0.0.1%2522%252C%2522entrance%2522%253A%2522IM513695-2111%2522%252C%2522host_user_id%2522%253A%2522704135154117550%2522%252C%2522host_user_name%2522%253A%2522%25E5%2591%25A8%25E8%25BE%2589%2522%252C%2522host_user_agent%2522%253A%2522Mozilla%252F5.0%2520%28Windows%2520NT%252010.0%253B%2520Win64%253B%2520x64%29%2520AppleWebKit%252F537.36%2520%28KHTML%252C%2520like%2520Gecko%29%2520Chrome%252F132.0.0.0%2520Safari%252F537.36%2522%252C%2522host_app_name%2522%253A%2522jimeng%2522%252C%2522host_os_type%2522%253A%2522Windows%2522%252C%2522host_os_version%2522%253A%252210%2522%252C%2522host_app_id%2522%253A%2522513695%2522%252C%2522channel%2522%253A%25225%2522%252C%2522device_brand%2522%253A%2522unknown%2522%252C%2522entrance_location%2522%253A%2522%25E5%25B8%25AE%25E5%258A%25A9%25E4%25B8%25AD%25E5%25BF%2583%2522%252C%2522vip_had_pay%2522%253A%25221%2522%257D&theme=dark&ui_theme=dark&inst_id=2&sign_uid=177189382446285",
+ "Referrer-Policy": "no-referrer-when-downgrade"
+ },
+ "body": "[{\"events\":[{\"event\":\"predefine_pageview\",\"params\":\"{\\\"_staging_flag\\\":0,\\\"device_id\\\":\\\"7605602965571765786\\\",\\\"user_id\\\":\\\"704135154117550\\\",\\\"appVersion\\\":\\\"0.0.0.1\\\",\\\"title\\\":\\\"帮助中心\\\",\\\"url\\\":\\\"https://helpdesk.bytedance.com/sites/standalone/helpcenter_web/home?biz_id=73&source=generation&entrance=IM513695-2111&channel=5&app_id=513695&im_extra=%257B%2522device_id%2522%253A%25227605602965571765786%2522%252C%2522host_app_version%2522%253A%25220.0.0.1%2522%252C%2522entrance%2522%253A%2522IM513695-2111%2522%252C%2522host_user_id%2522%253A%2522704135154117550%2522%252C%2522host_user_name%2522%253A%2522%25E5%2591%25A8%25E8%25BE%2589%2522%252C%2522host_user_agent%2522%253A%2522Mozilla%252F5.0%2520%28Windows%2520NT%252010.0%253B%2520Win64%253B%2520x64%29%2520AppleWebKit%252F537.36%2520%28KHTML%252C%2520like%2520Gecko%29%2520Chrome%252F132.0.0.0%2520Safari%252F537.36%2522%252C%2522host_app_name%2522%253A%2522jimeng%2522%252C%2522host_os_type%2522%253A%2522Windows%2522%252C%2522host_os_version%2522%253A%252210%2522%252C%2522host_app_id%2522%253A%2522513695%2522%252C%2522channel%2522%253A%25225%2522%252C%2522device_brand%2522%253A%2522unknown%2522%252C%2522entrance_location%2522%253A%2522%25E5%25B8%25AE%25E5%258A%25A9%25E4%25B8%25AD%25E5%25BF%2583%2522%252C%2522vip_had_pay%2522%253A%25221%2522%257D&theme=dark&ui_theme=dark&inst_id=2&sign_uid=177189382446285\\\",\\\"url_path\\\":\\\"/sites/standalone/helpcenter_web/home\\\",\\\"time\\\":1771893824536,\\\"referrer\\\":\\\"https://jimeng.jianying.com/ai-tool/generate?type=image\\\",\\\"$is_first_time\\\":\\\"false\\\",\\\"event_index\\\":1771894006679}\",\"local_time_ms\":1771893824536,\"is_bav\":0,\"session_id\":\"9d5e6b47-1c8e-472b-9c2e-0bd52b22b268\"}],\"user\":{\"user_unique_id\":\"7605602965571765786\",\"user_id\":\"704135154117550\",\"web_id\":\"7490556098354857484\"},\"header\":{\"app_id\":2970,\"os_name\":\"windows\",\"os_version\":\"10\",\"device_model\":\"Windows NT 10.0\",\"language\":\"zh-CN\",\"platform\":\"web\",\"sdk_version\":\"5.2.7\",\"sdk_lib\":\"js\",\"timezone\":8,\"tz_offset\":-28800,\"resolution\":\"1536x864\",\"browser\":\"Chrome\",\"browser_version\":\"132.0.0.0\",\"referrer\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"referrer_host\":\"jimeng.jianying.com\",\"width\":1536,\"height\":864,\"screen_width\":1536,\"screen_height\":864,\"tracer_data\":\"{\\\"$utm_from_url\\\":1}\",\"custom\":\"{\\\"$latest_referrer\\\":\\\"https://jimeng.jianying.com/ai-tool/generate?type=image\\\",\\\"$latest_referrer_host\\\":\\\"jimeng.jianying.com\\\",\\\"$latest_search_keyword\\\":\\\"\\\",\\\"source\\\":\\\"generation\\\",\\\"page_source\\\":\\\"generation\\\",\\\"query_source\\\":\\\"generation\\\",\\\"uid\\\":\\\"704135154117550\\\",\\\"biz\\\":\\\"73\\\",\\\"biz_id\\\":\\\"73\\\",\\\"im_entrance\\\":\\\"IM513695-2111\\\",\\\"timestamp\\\":1771893824436,\\\"aid\\\":513695}\"},\"local_time\":1771893825,\"verbose\":1}]",
+ "method": "POST"
+}); ;
+fetch("https://jimeng.jianying.com/mweb/v1/aigc_draft/generate?aid=513695&device_platform=web®ion=cn&webId=7605602965571765786&da_version=3.3.9&os=windows&web_component_open_flag=1&web_version=7.5.0&aigc_features=app_lip_sync&msToken=ihykpW25F6ZdjhjeVFqU1JlJcnS7q1jpt3V0MMj57KcgSYXexymGclx9WUAZR1KqlKf3iBxnkNxtzZj1u75VJDsZIxv72ralFzbne1AtshBzB1TFg5Ju2A%3D%3D&a_bogus=djsxDcgXMsm1ME8-AXkz9e4NcEb0YW4cgZENvyD-DzoW", {
+ "headers": {
+ "accept": "application/json, text/plain, */*",
+ "accept-language": "zh-CN,zh;q=0.9",
+ "app-sdk-version": "48.0.0",
+ "appid": "513695",
+ "appvr": "8.4.0",
+ "cache-control": "no-cache",
+ "content-type": "application/json",
+ "device-time": "1771893826",
+ "lan": "zh-Hans",
+ "loc": "cn",
+ "pf": "7",
+ "pragma": "no-cache",
+ "priority": "u=1, i",
+ "sec-ch-ua": "\"Not A(Brand\";v=\"8\", \"Chromium\";v=\"132\", \"Google Chrome\";v=\"132\"",
+ "sec-ch-ua-mobile": "?0",
+ "sec-ch-ua-platform": "\"Windows\"",
+ "sec-fetch-dest": "empty",
+ "sec-fetch-mode": "cors",
+ "sec-fetch-site": "same-origin",
+ "sign": "19724735691862919106b8c4808a6ce7",
+ "sign-ver": "1",
+ "tdid": "",
+ "cookie": "_isHitHomeHeaderRefreshExperiment=1; s_v_web_id=verify_mli2zh09_eQ5L9Cej_bFER_4ccU_9JK5_Ael0lBTb3f1K; COOKIE_CONSENT_PROMPT_CONFIG={%22status%22:1%2C%22settings%22:{%22firstPartyAnalytics%22:true%2C%22GoogleAnalytics%22:true}%2C%22updatedTime%22:1770817444874}; fpk1=148a20cd63817580d8e8d9df32cd9b08f2453b88009c7c8bebd01f333cce15c7626a440c525de2203bdc082bd9051722; passport_csrf_token=ce5085d40c0c9edf5268392eeba6903e; passport_csrf_token_default=ce5085d40c0c9edf5268392eeba6903e; n_mh=xSPw81I4URH-3hVkPcoqGh1J2A7uMjTD8qZw1F59WkQ; sid_guard=0b6873d7aa4f947b144dd55be06359ec%7C1770821461%7C31536000%7CThu%2C+11-Feb-2027+14%3A51%3A01+GMT; uid_tt=7ced300dac82637ad657f41cb285cdfd; uid_tt_ss=7ced300dac82637ad657f41cb285cdfd; sid_tt=0b6873d7aa4f947b144dd55be06359ec; sessionid=0b6873d7aa4f947b144dd55be06359ec; sessionid_ss=0b6873d7aa4f947b144dd55be06359ec; session_tlb_tag=sttt%7C19%7CC2hz16pPlHsUTdVb4GNZ7P________-tjvJ8OgKw-5e-zmSTtf2yhZkCkLhpu1O7odzc7jAax0U%3D; is_staff_user=false; sid_ucp_v1=1.0.0-KGNhNzQzMDk0ZDliY2QwNzUwYjcxZDllMjQ2YjY5ZWRiNTU2YzdmNjAKHwiu1_Dtg42gARDVrrLMBhifrR8gDDDau4-EBjgIQCYaAmxxIiAwYjY4NzNkN2FhNGY5NDdiMTQ0ZGQ1NWJlMDYzNTllYw; ssid_ucp_v1=1.0.0-KGNhNzQzMDk0ZDliY2QwNzUwYjcxZDllMjQ2YjY5ZWRiNTU2YzdmNjAKHwiu1_Dtg42gARDVrrLMBhifrR8gDDDau4-EBjgIQCYaAmxxIiAwYjY4NzNkN2FhNGY5NDdiMTQ0ZGQ1NWJlMDYzNTllYw; user_spaces_idc={\"6954646182010290440\":\"hl\"}; dm_auid=6T58itIihnmLPAnsov+nbw==; uifid_temp=3d5c832fc871287d7ad4963d32df5aca8803a3d2a91cbed0592bf979487355215fd04954a5e33925193fc7ccbdd29b0b187b8d70ae376168de63643ab93f4025f47b9d1a4279a97bd4b92654a658b2b1; uifid=3d5c832fc871287d7ad4963d32df5aca8803a3d2a91cbed0592bf97948735521edf981832a5888f6de8426836c91e6e7beabc4eefe37adedf77629c420c674607ed44f52dd24901845b3081e04ecdd4837a6214df4a6ad9aa9cb58f1e731d13a4c2ec6dfaa71d3176186a2d994b505fddbdc62288e16eb34dc1ac099f7f4b6f3b86561b64b0ee189a363097d02fb2fd8570b6705b51a000f4d0c19176e726dc678a53a228ece78dd815cad3810392bb6; _v2_spipe_web_id=7606003060459978806; passport_mfa_token=CjjmvrvsaRSDPfoLf%2BDBmLAbuwJJDxiqC%2BHwu9ltw9GEkGilV%2BtOBusKn%2FFCFO6cwlFm6wgWDaK5mRpKCjwAAAAAAAAAAAAAUBQguICbvVY0ipQB7VhbH%2BFMdUuSBjo8WCjfD0mmn2DwVt3%2BYWeWtGtyM3BeLDy6Tw4QuOGJDhj2sdFsIAIiAQPFR%2FhM; _tea_web_id=7605602965571765786; DREAMINA_THEME=dark; odin_tt=24d7444414dbc3444791a95433f4d9953781e8e83bc9ac32cfe82c3f5fdf8dbbcca1d7ae88ef505ae0932f140a6785d9a46a7b376458f8cf2e5642679dca56ed; _uetsid=0cafbb40108711f1a52bb5009fae695d; _uetvid=b3c5085013b011f0a6cf3f171e4de2ae; ttwid=1|WfnGlJxqfilLYF7b-dzgFRlCRoYXBmnbtqai9ntlVwc|1771893824|43ab27aca3313957211fb20ea85fcd44fe2840f6c1e0fb1b2a292d30e1b9af08",
+ "Referer": "https://jimeng.jianying.com/ai-tool/generate?type=image",
+ "Referrer-Policy": "no-referrer-when-downgrade"
+ },
+ "body": "{\"extend\":{\"root_model\":\"high_aes_general_v50\"},\"submit_id\":\"717c5e9b-d3ff-444d-8d22-85f59dd38da7\",\"metrics_extra\":\"{\\\"promptSource\\\":\\\"custom\\\",\\\"generateCount\\\":1,\\\"enterFrom\\\":\\\"click\\\",\\\"position\\\":\\\"page_bottom_box\\\",\\\"sceneOptions\\\":\\\"[{\\\\\\\"type\\\\\\\":\\\\\\\"image\\\\\\\",\\\\\\\"scene\\\\\\\":\\\\\\\"ImageBasicGenerate\\\\\\\",\\\\\\\"modelReqKey\\\\\\\":\\\\\\\"high_aes_general_v50\\\\\\\",\\\\\\\"resolutionType\\\\\\\":\\\\\\\"2k\\\\\\\",\\\\\\\"abilityList\\\\\\\":[],\\\\\\\"benefitCount\\\\\\\":4,\\\\\\\"reportParams\\\\\\\":{\\\\\\\"enterSource\\\\\\\":\\\\\\\"generate\\\\\\\",\\\\\\\"vipSource\\\\\\\":\\\\\\\"generate\\\\\\\",\\\\\\\"extraVipFunctionKey\\\\\\\":\\\\\\\"high_aes_general_v50-2k\\\\\\\",\\\\\\\"useVipFunctionDetailsReporterHoc\\\\\\\":true}}]\\\",\\\"isBoxSelect\\\":false,\\\"isCutout\\\":false,\\\"generateId\\\":\\\"717c5e9b-d3ff-444d-8d22-85f59dd38da7\\\",\\\"isRegenerate\\\":false}\",\"draft_content\":\"{\\\"type\\\":\\\"draft\\\",\\\"id\\\":\\\"ab0f784c-0647-a3ec-ce07-3507cdbab95d\\\",\\\"min_version\\\":\\\"3.0.2\\\",\\\"min_features\\\":[],\\\"is_from_tsn\\\":true,\\\"version\\\":\\\"3.3.9\\\",\\\"main_component_id\\\":\\\"7ed7cd94-b25f-65f1-5b10-895dc2325cb3\\\",\\\"component_list\\\":[{\\\"type\\\":\\\"image_base_component\\\",\\\"id\\\":\\\"7ed7cd94-b25f-65f1-5b10-895dc2325cb3\\\",\\\"min_version\\\":\\\"3.0.2\\\",\\\"aigc_mode\\\":\\\"workbench\\\",\\\"metadata\\\":{\\\"type\\\":\\\"\\\",\\\"id\\\":\\\"782812df-30eb-ba67-f2d8-760453fc599b\\\",\\\"created_platform\\\":3,\\\"created_platform_version\\\":\\\"\\\",\\\"created_time_in_ms\\\":\\\"1771893826296\\\",\\\"created_did\\\":\\\"\\\"},\\\"generate_type\\\":\\\"generate\\\",\\\"abilities\\\":{\\\"type\\\":\\\"\\\",\\\"id\\\":\\\"7cfd3d5e-7a56-f446-ca88-cf92dd582856\\\",\\\"generate\\\":{\\\"type\\\":\\\"\\\",\\\"id\\\":\\\"85d6138a-c537-e60b-f9e6-09fe56ee5642\\\",\\\"core_param\\\":{\\\"type\\\":\\\"\\\",\\\"id\\\":\\\"41fc4d2a-63a6-6d1e-4dea-5c9c57191fb3\\\",\\\"model\\\":\\\"high_aes_general_v50\\\",\\\"prompt\\\":\\\"两个小马在一起跑步\\\",\\\"negative_prompt\\\":\\\"\\\",\\\"seed\\\":1357613421,\\\"sample_strength\\\":0.5,\\\"image_ratio\\\":3,\\\"large_image_info\\\":{\\\"type\\\":\\\"\\\",\\\"id\\\":\\\"847e0525-b663-a0fe-f8a9-03071370b37a\\\",\\\"height\\\":1440,\\\"width\\\":2560,\\\"resolution_type\\\":\\\"2k\\\"},\\\"intelligent_ratio\\\":false,\\\"generate_type\\\":0}},\\\"gen_option\\\":{\\\"type\\\":\\\"\\\",\\\"id\\\":\\\"cf1a915e-0955-02ed-69e0-8dfbc7aeca4e\\\",\\\"generate_all\\\":false}}}]}\",\"http_common_info\":{\"aid\":513695}}",
+ "method": "POST"
+}); ;
+fetch("https://everphoto.jianying.com/sf/5/v5/GetUpdates?aid=324442&space_id=7436736040297038899&cursor=n_7492071223166238732&material=1&abilities=30", {
+ "headers": {
+ "accept": "*/*",
+ "accept-language": "zh-CN,zh;q=0.9",
+ "cache-control": "no-cache",
+ "content-type": "application/json",
+ "expect-real-status": "1",
+ "pragma": "no-cache",
+ "sec-ch-ua": "\"Not A(Brand\";v=\"8\", \"Chromium\";v=\"132\", \"Google Chrome\";v=\"132\"",
+ "sec-ch-ua-mobile": "?0",
+ "sec-ch-ua-platform": "\"Windows\"",
+ "sec-fetch-dest": "empty",
+ "sec-fetch-mode": "cors",
+ "sec-fetch-site": "same-site",
+ "x-ep-thirdparty-uid": "704135154117550",
+ "x-everphoto-global-session-token": "CsABdblQiZw9HNKaE0LbOVLZZaHZCHp1jEHyFNVSZpzEH99Sg4Do1S11PDQi0hq5XNFcmraJZKhWGsiGyH5YaBayggz2cvwHhKoC50CHli+FQXvL5jVsOhxvFaXoSgXHflFxt1Qb0VOYpn66MGHGdIVkkLh4Kz2di/5aZ9FMtggwPrxIT8Wn9Cp2uqxXyma6JOupbg2ygC52SccQbXjXa/zATFafIO55Y59ZzNGpaANAmcoSE/1tz2hwbFWoJ/9Qt6kNGkkKPAAAAAAAAAAAAABQG5LgtCE9i65XVA0wPVUCxHnUNoQ5GX6sgXGnyaCAQWmq0G0nL1Dm3jJv4mBUDmNoOhD0uooOGJqMmcQLIgEDsDnl6BFgVFs=",
+ "cookie": "passport_csrf_token=ce5085d40c0c9edf5268392eeba6903e; passport_csrf_token_default=ce5085d40c0c9edf5268392eeba6903e; n_mh=xSPw81I4URH-3hVkPcoqGh1J2A7uMjTD8qZw1F59WkQ; sid_guard=0b6873d7aa4f947b144dd55be06359ec%7C1770821461%7C31536000%7CThu%2C+11-Feb-2027+14%3A51%3A01+GMT; uid_tt=7ced300dac82637ad657f41cb285cdfd; uid_tt_ss=7ced300dac82637ad657f41cb285cdfd; sid_tt=0b6873d7aa4f947b144dd55be06359ec; sessionid=0b6873d7aa4f947b144dd55be06359ec; sessionid_ss=0b6873d7aa4f947b144dd55be06359ec; session_tlb_tag=sttt%7C19%7CC2hz16pPlHsUTdVb4GNZ7P________-tjvJ8OgKw-5e-zmSTtf2yhZkCkLhpu1O7odzc7jAax0U%3D; is_staff_user=false; sid_ucp_v1=1.0.0-KGNhNzQzMDk0ZDliY2QwNzUwYjcxZDllMjQ2YjY5ZWRiNTU2YzdmNjAKHwiu1_Dtg42gARDVrrLMBhifrR8gDDDau4-EBjgIQCYaAmxxIiAwYjY4NzNkN2FhNGY5NDdiMTQ0ZGQ1NWJlMDYzNTllYw; ssid_ucp_v1=1.0.0-KGNhNzQzMDk0ZDliY2QwNzUwYjcxZDllMjQ2YjY5ZWRiNTU2YzdmNjAKHwiu1_Dtg42gARDVrrLMBhifrR8gDDDau4-EBjgIQCYaAmxxIiAwYjY4NzNkN2FhNGY5NDdiMTQ0ZGQ1NWJlMDYzNTllYw; passport_mfa_token=CjjmvrvsaRSDPfoLf%2BDBmLAbuwJJDxiqC%2BHwu9ltw9GEkGilV%2BtOBusKn%2FFCFO6cwlFm6wgWDaK5mRpKCjwAAAAAAAAAAAAAUBQguICbvVY0ipQB7VhbH%2BFMdUuSBjo8WCjfD0mmn2DwVt3%2BYWeWtGtyM3BeLDy6Tw4QuOGJDhj2sdFsIAIiAQPFR%2FhM; odin_tt=24d7444414dbc3444791a95433f4d9953781e8e83bc9ac32cfe82c3f5fdf8dbbcca1d7ae88ef505ae0932f140a6785d9a46a7b376458f8cf2e5642679dca56ed; _uetsid=0cafbb40108711f1a52bb5009fae695d; _uetvid=b3c5085013b011f0a6cf3f171e4de2ae; ttwid=1|WfnGlJxqfilLYF7b-dzgFRlCRoYXBmnbtqai9ntlVwc|1771893824|43ab27aca3313957211fb20ea85fcd44fe2840f6c1e0fb1b2a292d30e1b9af08",
+ "Referer": "https://jimeng.jianying.com/ai-tool/generate?type=image",
+ "Referrer-Policy": "no-referrer-when-downgrade"
+ },
+ "body": null,
+ "method": "GET"
+}); ;
+fetch("https://mcs.zijieapi.com/list", {
+ "headers": {
+ "accept": "*/*",
+ "accept-language": "zh-CN,zh;q=0.9",
+ "cache-control": "no-cache",
+ "content-type": "application/json; charset=UTF-8",
+ "pragma": "no-cache",
+ "priority": "u=1, i",
+ "sec-ch-ua": "\"Not A(Brand\";v=\"8\", \"Chromium\";v=\"132\", \"Google Chrome\";v=\"132\"",
+ "sec-ch-ua-mobile": "?0",
+ "sec-ch-ua-platform": "\"Windows\"",
+ "sec-fetch-dest": "empty",
+ "sec-fetch-mode": "cors",
+ "sec-fetch-site": "cross-site",
+ "Referer": "https://jimeng.jianying.com/ai-tool/generate?type=image",
+ "Referrer-Policy": "no-referrer-when-downgrade"
+ },
+ "body": "[{\"events\":[{\"event\":\"vip_function_details\",\"params\":\"{\\\"_staging_flag\\\":0,\\\"is_vip\\\":1,\\\"user_subscribe_type\\\":\\\"standard\\\",\\\"url_path\\\":\\\"/ai-tool/generate\\\",\\\"referrer\\\":\\\"/home/\\\",\\\"page\\\":\\\"generation\\\",\\\"action\\\":\\\"use\\\",\\\"enter_source\\\":\\\"generate\\\",\\\"right_id\\\":\\\"image_basic_v5_2k\\\",\\\"right_type\\\":\\\"generate_img\\\",\\\"right_main_type\\\":\\\"aigc\\\",\\\"right_is_aigc\\\":\\\"1\\\",\\\"right_block_type\\\":\\\"click\\\",\\\"right_count_type\\\":\\\"times\\\",\\\"right_subscribe_type\\\":\\\"free\\\",\\\"right_oneoff_mix_type\\\":\\\"free\\\",\\\"right_is_trial\\\":\\\"1\\\",\\\"right_trial_mode\\\":\\\"period_trial\\\",\\\"right_trial_type\\\":\\\"limit_times\\\",\\\"right_trial_limit_left\\\":\\\"-1\\\",\\\"event_index\\\":1771894585752}\",\"local_time_ms\":1771893827067,\"is_bav\":0,\"ab_sdk_version\":\"91249282,14674564,13753331,15628237,15174027,15174145,15170779,15407184,15567817,15504129,15481561\",\"session_id\":\"95ac96eb-cba1-47fe-94a4-fbc644d0f38b\"},{\"event\":\"vip_function_details\",\"params\":\"{\\\"_staging_flag\\\":0,\\\"is_vip\\\":1,\\\"user_subscribe_type\\\":\\\"standard\\\",\\\"url_path\\\":\\\"/ai-tool/generate\\\",\\\"referrer\\\":\\\"/home/\\\",\\\"page\\\":\\\"generation\\\",\\\"action\\\":\\\"use\\\",\\\"enter_source\\\":\\\"queue_speed_by_default\\\",\\\"right_id\\\":\\\"queue_speed\\\",\\\"right_type\\\":\\\"queue_speed\\\",\\\"right_main_type\\\":\\\"function\\\",\\\"right_is_aigc\\\":\\\"0\\\",\\\"right_block_type\\\":\\\"click\\\",\\\"right_count_type\\\":\\\"times\\\",\\\"right_subscribe_type\\\":\\\"free\\\",\\\"right_oneoff_mix_type\\\":\\\"free\\\",\\\"right_is_trial\\\":\\\"1\\\",\\\"right_trial_mode\\\":\\\"period_trial\\\",\\\"right_trial_type\\\":\\\"limit_times\\\",\\\"right_trial_limit_left\\\":\\\"-1\\\",\\\"event_index\\\":1771894585751}\",\"local_time_ms\":1771893827067,\"is_bav\":0,\"ab_sdk_version\":\"91249282,14674564,13753331,15628237,15174027,15174145,15170779,15407184,15567817,15504129,15481561\",\"session_id\":\"95ac96eb-cba1-47fe-94a4-fbc644d0f38b\"},{\"event\":\"click_generate\",\"params\":\"{\\\"_staging_flag\\\":0,\\\"is_vip\\\":1,\\\"user_subscribe_type\\\":\\\"standard\\\",\\\"url_path\\\":\\\"/ai-tool/generate\\\",\\\"referrer\\\":\\\"/home/\\\",\\\"page\\\":\\\"generation\\\",\\\"ratio\\\":\\\"1.7778\\\",\\\"prompt\\\":\\\"两个小马在一起跑步\\\",\\\"definition\\\":\\\"2k\\\",\\\"is_time_limited_free\\\":0,\\\"credits_need\\\":0,\\\"credits_now\\\":1180,\\\"generate_type\\\":1,\\\"submit_id\\\":\\\"717c5e9b-d3ff-444d-8d22-85f59dd38da7\\\",\\\"action_type\\\":\\\"generate\\\",\\\"prompt_cnt\\\":9,\\\"image_prompt_cnt\\\":0,\\\"prompt_source\\\":\\\"custom\\\",\\\"model_name\\\":\\\"图片5.0 Lite\\\",\\\"model_starling_key\\\":\\\"web_image_model_name_50\\\",\\\"model_key\\\":\\\"high_aes_general_v50\\\",\\\"is_describe\\\":0,\\\"generate_cnt\\\":1,\\\"enter_from\\\":\\\"click\\\",\\\"reference_cnt\\\":0,\\\"is_box_select\\\":0,\\\"is_cutout\\\":0,\\\"event_index\\\":1771894585750}\",\"local_time_ms\":1771893826299,\"is_bav\":0,\"ab_sdk_version\":\"91249282,14674564,13753331,15628237,15174027,15174145,15170779,15407184,15567817,15504129,15481561\",\"session_id\":\"95ac96eb-cba1-47fe-94a4-fbc644d0f38b\"},{\"event\":\"vip_function_details\",\"params\":\"{\\\"_staging_flag\\\":0,\\\"is_vip\\\":1,\\\"user_subscribe_type\\\":\\\"standard\\\",\\\"url_path\\\":\\\"/ai-tool/generate\\\",\\\"referrer\\\":\\\"/home/\\\",\\\"page\\\":\\\"generation\\\",\\\"action\\\":\\\"click\\\",\\\"enter_source\\\":\\\"generate\\\",\\\"right_id\\\":\\\"image_basic_v5_2k\\\",\\\"right_type\\\":\\\"generate_img\\\",\\\"right_main_type\\\":\\\"aigc\\\",\\\"right_is_aigc\\\":\\\"1\\\",\\\"right_block_type\\\":\\\"click\\\",\\\"right_count_type\\\":\\\"times\\\",\\\"right_subscribe_type\\\":\\\"free\\\",\\\"right_oneoff_mix_type\\\":\\\"free\\\",\\\"right_is_trial\\\":\\\"1\\\",\\\"right_trial_mode\\\":\\\"period_trial\\\",\\\"right_trial_type\\\":\\\"limit_times\\\",\\\"right_trial_limit_left\\\":\\\"-1\\\",\\\"event_index\\\":1771894585749}\",\"local_time_ms\":1771893826291,\"is_bav\":0,\"ab_sdk_version\":\"91249282,14674564,13753331,15628237,15174027,15174145,15170779,15407184,15567817,15504129,15481561\",\"session_id\":\"95ac96eb-cba1-47fe-94a4-fbc644d0f38b\"},{\"event\":\"ai_image_adjust_param\",\"params\":\"{\\\"_staging_flag\\\":0,\\\"is_vip\\\":1,\\\"user_subscribe_type\\\":\\\"standard\\\",\\\"url_path\\\":\\\"/ai-tool/generate\\\",\\\"referrer\\\":\\\"/home/\\\",\\\"page\\\":\\\"generation\\\",\\\"modal\\\":\\\"aigc_image\\\",\\\"position\\\":\\\"page_bottom_box\\\",\\\"action\\\":\\\"enter_prompt\\\",\\\"enter_from\\\":\\\"click\\\",\\\"event_index\\\":1771894585748}\",\"local_time_ms\":1771893825815,\"is_bav\":0,\"ab_sdk_version\":\"91249282,14674564,13753331,15628237,15174027,15174145,15170779,15407184,15567817,15504129,15481561\",\"session_id\":\"95ac96eb-cba1-47fe-94a4-fbc644d0f38b\"},{\"event\":\"ai_image_adjust_param\",\"params\":\"{\\\"_staging_flag\\\":0,\\\"is_vip\\\":1,\\\"user_subscribe_type\\\":\\\"standard\\\",\\\"url_path\\\":\\\"/ai-tool/generate\\\",\\\"referrer\\\":\\\"/home/\\\",\\\"page\\\":\\\"generation\\\",\\\"modal\\\":\\\"aigc_image\\\",\\\"position\\\":\\\"page_bottom_box\\\",\\\"action\\\":\\\"activate\\\",\\\"enter_from\\\":\\\"click\\\",\\\"event_index\\\":1771894585747}\",\"local_time_ms\":1771893825811,\"is_bav\":0,\"ab_sdk_version\":\"91249282,14674564,13753331,15628237,15174027,15174145,15170779,15407184,15567817,15504129,15481561\",\"session_id\":\"95ac96eb-cba1-47fe-94a4-fbc644d0f38b\"}],\"user\":{\"user_unique_id\":\"704135154117550\",\"user_type\":12,\"user_id\":\"704135154117550\",\"user_is_login\":true,\"web_id\":\"7605602965571765786\"},\"header\":{\"app_id\":513695,\"app_version\":\"0.1.0\",\"os_name\":\"windows\",\"os_version\":\"10\",\"device_model\":\"Windows NT 10.0\",\"language\":\"zh-Hans\",\"platform\":\"web\",\"sdk_version\":\"5.0.53\",\"sdk_lib\":\"js\",\"timezone\":8,\"tz_offset\":-28800,\"resolution\":\"1536x864\",\"browser\":\"Chrome\",\"browser_version\":\"132.0.0.0\",\"referrer\":\"\",\"referrer_host\":\"\",\"width\":1536,\"height\":864,\"screen_width\":1536,\"screen_height\":864,\"tracer_data\":\"{\\\"$utm_from_url\\\":1}\",\"custom\":\"{\\\"channel_level1\\\":\\\"Direct\\\",\\\"channel_level2\\\":\\\"enter_url\\\",\\\"channel_level3\\\":\\\"\\\",\\\"channel_level4\\\":\\\"\\\",\\\"channel_from\\\":\\\"ut\\\",\\\"session_start_url\\\":\\\"https://jimeng.jianying.com/ai-tool/home/\\\",\\\"branch\\\":\\\"release/950\\\",\\\"theme_mode\\\":\\\"dark\\\",\\\"resolution\\\":480,\\\"gpu_exist\\\":\\\"1\\\",\\\"network_type\\\":\\\"4g\\\",\\\"downlink\\\":10,\\\"rtt\\\":0,\\\"web_id\\\":\\\"7605602965571765786\\\",\\\"is_new_framework\\\":1,\\\"store_country\\\":\\\"CN\\\",\\\"language\\\":\\\"zh-Hans\\\",\\\"is_vip\\\":1,\\\"user_subscribe_type\\\":\\\"standard\\\"}\"},\"local_time\":1771893829,\"verbose\":1}]",
+ "method": "POST"
+}); ;
+fetch("https://jimeng.jianying.com/mweb/v1/get_history_by_ids?aid=513695&device_platform=web®ion=cn&webId=7605602965571765786&da_version=3.3.9&web_version=7.5.0&aigc_features=app_lip_sync&msToken=ihykpW25F6ZdjhjeVFqU1JlJcnS7q1jpt3V0MMj57KcgSYXexymGclx9WUAZR1KqlKf3iBxnkNxtzZj1u75VJDsZIxv72ralFzbne1AtshBzB1TFg5Ju2A%3D%3D&a_bogus=xXsxhcgXMsm1o%2Fb-AXkz9Hx7ciY0YW5wgZENvyDMyUop", {
+ "headers": {
+ "accept": "application/json, text/plain, */*",
+ "accept-language": "zh-CN,zh;q=0.9",
+ "app-sdk-version": "48.0.0",
+ "appid": "513695",
+ "appvr": "8.4.0",
+ "cache-control": "no-cache",
+ "content-type": "application/json",
+ "device-time": "1771893831",
+ "lan": "zh-Hans",
+ "loc": "cn",
+ "pf": "7",
+ "pragma": "no-cache",
+ "priority": "u=1, i",
+ "sec-ch-ua": "\"Not A(Brand\";v=\"8\", \"Chromium\";v=\"132\", \"Google Chrome\";v=\"132\"",
+ "sec-ch-ua-mobile": "?0",
+ "sec-ch-ua-platform": "\"Windows\"",
+ "sec-fetch-dest": "empty",
+ "sec-fetch-mode": "cors",
+ "sec-fetch-site": "same-origin",
+ "sign": "656c1e00cf94dfd5bcfaf031e32493e4",
+ "sign-ver": "1",
+ "tdid": "",
+ "x-platform": "pc",
+ "cookie": "_isHitHomeHeaderRefreshExperiment=1; s_v_web_id=verify_mli2zh09_eQ5L9Cej_bFER_4ccU_9JK5_Ael0lBTb3f1K; COOKIE_CONSENT_PROMPT_CONFIG={%22status%22:1%2C%22settings%22:{%22firstPartyAnalytics%22:true%2C%22GoogleAnalytics%22:true}%2C%22updatedTime%22:1770817444874}; fpk1=148a20cd63817580d8e8d9df32cd9b08f2453b88009c7c8bebd01f333cce15c7626a440c525de2203bdc082bd9051722; passport_csrf_token=ce5085d40c0c9edf5268392eeba6903e; passport_csrf_token_default=ce5085d40c0c9edf5268392eeba6903e; n_mh=xSPw81I4URH-3hVkPcoqGh1J2A7uMjTD8qZw1F59WkQ; sid_guard=0b6873d7aa4f947b144dd55be06359ec%7C1770821461%7C31536000%7CThu%2C+11-Feb-2027+14%3A51%3A01+GMT; uid_tt=7ced300dac82637ad657f41cb285cdfd; uid_tt_ss=7ced300dac82637ad657f41cb285cdfd; sid_tt=0b6873d7aa4f947b144dd55be06359ec; sessionid=0b6873d7aa4f947b144dd55be06359ec; sessionid_ss=0b6873d7aa4f947b144dd55be06359ec; session_tlb_tag=sttt%7C19%7CC2hz16pPlHsUTdVb4GNZ7P________-tjvJ8OgKw-5e-zmSTtf2yhZkCkLhpu1O7odzc7jAax0U%3D; is_staff_user=false; sid_ucp_v1=1.0.0-KGNhNzQzMDk0ZDliY2QwNzUwYjcxZDllMjQ2YjY5ZWRiNTU2YzdmNjAKHwiu1_Dtg42gARDVrrLMBhifrR8gDDDau4-EBjgIQCYaAmxxIiAwYjY4NzNkN2FhNGY5NDdiMTQ0ZGQ1NWJlMDYzNTllYw; ssid_ucp_v1=1.0.0-KGNhNzQzMDk0ZDliY2QwNzUwYjcxZDllMjQ2YjY5ZWRiNTU2YzdmNjAKHwiu1_Dtg42gARDVrrLMBhifrR8gDDDau4-EBjgIQCYaAmxxIiAwYjY4NzNkN2FhNGY5NDdiMTQ0ZGQ1NWJlMDYzNTllYw; user_spaces_idc={\"6954646182010290440\":\"hl\"}; dm_auid=6T58itIihnmLPAnsov+nbw==; uifid_temp=3d5c832fc871287d7ad4963d32df5aca8803a3d2a91cbed0592bf979487355215fd04954a5e33925193fc7ccbdd29b0b187b8d70ae376168de63643ab93f4025f47b9d1a4279a97bd4b92654a658b2b1; uifid=3d5c832fc871287d7ad4963d32df5aca8803a3d2a91cbed0592bf97948735521edf981832a5888f6de8426836c91e6e7beabc4eefe37adedf77629c420c674607ed44f52dd24901845b3081e04ecdd4837a6214df4a6ad9aa9cb58f1e731d13a4c2ec6dfaa71d3176186a2d994b505fddbdc62288e16eb34dc1ac099f7f4b6f3b86561b64b0ee189a363097d02fb2fd8570b6705b51a000f4d0c19176e726dc678a53a228ece78dd815cad3810392bb6; _v2_spipe_web_id=7606003060459978806; passport_mfa_token=CjjmvrvsaRSDPfoLf%2BDBmLAbuwJJDxiqC%2BHwu9ltw9GEkGilV%2BtOBusKn%2FFCFO6cwlFm6wgWDaK5mRpKCjwAAAAAAAAAAAAAUBQguICbvVY0ipQB7VhbH%2BFMdUuSBjo8WCjfD0mmn2DwVt3%2BYWeWtGtyM3BeLDy6Tw4QuOGJDhj2sdFsIAIiAQPFR%2FhM; _tea_web_id=7605602965571765786; DREAMINA_THEME=dark; odin_tt=24d7444414dbc3444791a95433f4d9953781e8e83bc9ac32cfe82c3f5fdf8dbbcca1d7ae88ef505ae0932f140a6785d9a46a7b376458f8cf2e5642679dca56ed; _uetsid=0cafbb40108711f1a52bb5009fae695d; _uetvid=b3c5085013b011f0a6cf3f171e4de2ae; ttwid=1|WfnGlJxqfilLYF7b-dzgFRlCRoYXBmnbtqai9ntlVwc|1771893824|43ab27aca3313957211fb20ea85fcd44fe2840f6c1e0fb1b2a292d30e1b9af08",
+ "Referer": "https://jimeng.jianying.com/ai-tool/generate?type=image",
+ "Referrer-Policy": "no-referrer-when-downgrade"
+ },
+ "body": "{\"submit_ids\":[\"717c5e9b-d3ff-444d-8d22-85f59dd38da7\"]}",
+ "method": "POST"
+}); ;
+fetch("https://jimeng.jianying.com/commerce/v1/benefits/user_credit_history", {
+ "headers": {
+ "accept": "application/json, text/plain, */*",
+ "accept-language": "zh-CN,zh;q=0.9",
+ "appid": "513695",
+ "appvr": "8.4.0",
+ "cache-control": "no-cache",
+ "content-type": "application/json",
+ "device-time": "1771893831",
+ "lan": "ZH",
+ "pf": "7",
+ "pragma": "no-cache",
+ "priority": "u=1, i",
+ "sec-ch-ua": "\"Not A(Brand\";v=\"8\", \"Chromium\";v=\"132\", \"Google Chrome\";v=\"132\"",
+ "sec-ch-ua-mobile": "?0",
+ "sec-ch-ua-platform": "\"Windows\"",
+ "sec-fetch-dest": "empty",
+ "sec-fetch-mode": "cors",
+ "sec-fetch-site": "same-origin",
+ "sign": "e689d5fa536721dee8945eaa6efb01b0",
+ "sign-ver": "1",
+ "tdid": "",
+ "cookie": "_isHitHomeHeaderRefreshExperiment=1; s_v_web_id=verify_mli2zh09_eQ5L9Cej_bFER_4ccU_9JK5_Ael0lBTb3f1K; COOKIE_CONSENT_PROMPT_CONFIG={%22status%22:1%2C%22settings%22:{%22firstPartyAnalytics%22:true%2C%22GoogleAnalytics%22:true}%2C%22updatedTime%22:1770817444874}; fpk1=148a20cd63817580d8e8d9df32cd9b08f2453b88009c7c8bebd01f333cce15c7626a440c525de2203bdc082bd9051722; passport_csrf_token=ce5085d40c0c9edf5268392eeba6903e; passport_csrf_token_default=ce5085d40c0c9edf5268392eeba6903e; n_mh=xSPw81I4URH-3hVkPcoqGh1J2A7uMjTD8qZw1F59WkQ; sid_guard=0b6873d7aa4f947b144dd55be06359ec%7C1770821461%7C31536000%7CThu%2C+11-Feb-2027+14%3A51%3A01+GMT; uid_tt=7ced300dac82637ad657f41cb285cdfd; uid_tt_ss=7ced300dac82637ad657f41cb285cdfd; sid_tt=0b6873d7aa4f947b144dd55be06359ec; sessionid=0b6873d7aa4f947b144dd55be06359ec; sessionid_ss=0b6873d7aa4f947b144dd55be06359ec; session_tlb_tag=sttt%7C19%7CC2hz16pPlHsUTdVb4GNZ7P________-tjvJ8OgKw-5e-zmSTtf2yhZkCkLhpu1O7odzc7jAax0U%3D; is_staff_user=false; sid_ucp_v1=1.0.0-KGNhNzQzMDk0ZDliY2QwNzUwYjcxZDllMjQ2YjY5ZWRiNTU2YzdmNjAKHwiu1_Dtg42gARDVrrLMBhifrR8gDDDau4-EBjgIQCYaAmxxIiAwYjY4NzNkN2FhNGY5NDdiMTQ0ZGQ1NWJlMDYzNTllYw; ssid_ucp_v1=1.0.0-KGNhNzQzMDk0ZDliY2QwNzUwYjcxZDllMjQ2YjY5ZWRiNTU2YzdmNjAKHwiu1_Dtg42gARDVrrLMBhifrR8gDDDau4-EBjgIQCYaAmxxIiAwYjY4NzNkN2FhNGY5NDdiMTQ0ZGQ1NWJlMDYzNTllYw; user_spaces_idc={\"6954646182010290440\":\"hl\"}; dm_auid=6T58itIihnmLPAnsov+nbw==; uifid_temp=3d5c832fc871287d7ad4963d32df5aca8803a3d2a91cbed0592bf979487355215fd04954a5e33925193fc7ccbdd29b0b187b8d70ae376168de63643ab93f4025f47b9d1a4279a97bd4b92654a658b2b1; uifid=3d5c832fc871287d7ad4963d32df5aca8803a3d2a91cbed0592bf97948735521edf981832a5888f6de8426836c91e6e7beabc4eefe37adedf77629c420c674607ed44f52dd24901845b3081e04ecdd4837a6214df4a6ad9aa9cb58f1e731d13a4c2ec6dfaa71d3176186a2d994b505fddbdc62288e16eb34dc1ac099f7f4b6f3b86561b64b0ee189a363097d02fb2fd8570b6705b51a000f4d0c19176e726dc678a53a228ece78dd815cad3810392bb6; _v2_spipe_web_id=7606003060459978806; passport_mfa_token=CjjmvrvsaRSDPfoLf%2BDBmLAbuwJJDxiqC%2BHwu9ltw9GEkGilV%2BtOBusKn%2FFCFO6cwlFm6wgWDaK5mRpKCjwAAAAAAAAAAAAAUBQguICbvVY0ipQB7VhbH%2BFMdUuSBjo8WCjfD0mmn2DwVt3%2BYWeWtGtyM3BeLDy6Tw4QuOGJDhj2sdFsIAIiAQPFR%2FhM; _tea_web_id=7605602965571765786; DREAMINA_THEME=dark; odin_tt=24d7444414dbc3444791a95433f4d9953781e8e83bc9ac32cfe82c3f5fdf8dbbcca1d7ae88ef505ae0932f140a6785d9a46a7b376458f8cf2e5642679dca56ed; _uetsid=0cafbb40108711f1a52bb5009fae695d; _uetvid=b3c5085013b011f0a6cf3f171e4de2ae; ttwid=1|WfnGlJxqfilLYF7b-dzgFRlCRoYXBmnbtqai9ntlVwc|1771893824|43ab27aca3313957211fb20ea85fcd44fe2840f6c1e0fb1b2a292d30e1b9af08",
+ "Referer": "https://jimeng.jianying.com/ai-tool/generate?type=image",
+ "Referrer-Policy": "no-referrer-when-downgrade"
+ },
+ "body": "{\"count\":20,\"cursor\":\"0\"}",
+ "method": "POST"
+}); ;
+fetch("https://mcs.zijieapi.com/list", {
+ "headers": {
+ "accept": "*/*",
+ "accept-language": "zh-CN,zh;q=0.9",
+ "cache-control": "no-cache",
+ "content-type": "application/json; charset=UTF-8",
+ "pragma": "no-cache",
+ "priority": "u=1, i",
+ "sec-ch-ua": "\"Not A(Brand\";v=\"8\", \"Chromium\";v=\"132\", \"Google Chrome\";v=\"132\"",
+ "sec-ch-ua-mobile": "?0",
+ "sec-ch-ua-platform": "\"Windows\"",
+ "sec-fetch-dest": "empty",
+ "sec-fetch-mode": "cors",
+ "sec-fetch-site": "cross-site",
+ "Referer": "https://jimeng.jianying.com/ai-tool/generate?type=image",
+ "Referrer-Policy": "no-referrer-when-downgrade"
+ },
+ "body": "[{\"events\":[{\"event\":\"page_stay_time\",\"params\":\"{\\\"_staging_flag\\\":0,\\\"is_vip\\\":1,\\\"user_subscribe_type\\\":\\\"standard\\\",\\\"url_path\\\":\\\"/ai-tool/generate\\\",\\\"referrer\\\":\\\"/home/\\\",\\\"page\\\":\\\"generation\\\",\\\"url\\\":\\\"https://jimeng.jianying.com/ai-tool/generate?type=image\\\",\\\"title\\\":\\\"即梦AI - 一站式AI创作平台\\\",\\\"duration\\\":4112,\\\"from\\\":\\\"from-onblur\\\",\\\"event_index\\\":1771894585755}\",\"local_time_ms\":1771893829923,\"is_bav\":0,\"ab_sdk_version\":\"91249282,14674564,13753331,15628237,15174027,15174145,15170779,15407184,15567817,15504129,15481561\",\"session_id\":\"95ac96eb-cba1-47fe-94a4-fbc644d0f38b\"},{\"event\":\"evpt_Sync_pullResult\",\"params\":\"{\\\"_staging_flag\\\":0,\\\"is_vip\\\":1,\\\"user_subscribe_type\\\":\\\"standard\\\",\\\"url_path\\\":\\\"/ai-tool/generate\\\",\\\"referrer\\\":\\\"/home/\\\",\\\"page\\\":\\\"generation\\\",\\\"message\\\":\\\"success\\\",\\\"entriesCount\\\":0,\\\"packagesCount\\\":0,\\\"code\\\":0,\\\"initially\\\":0,\\\"duration\\\":197,\\\"hasNewData\\\":0,\\\"assetsCount\\\":0,\\\"event_index\\\":1771894585754}\",\"local_time_ms\":1771893829137,\"is_bav\":0,\"ab_sdk_version\":\"91249282,14674564,13753331,15628237,15174027,15174145,15170779,15407184,15567817,15504129,15481561\",\"session_id\":\"95ac96eb-cba1-47fe-94a4-fbc644d0f38b\"},{\"event\":\"evpt_Sync_pullResult\",\"params\":\"{\\\"_staging_flag\\\":0,\\\"is_vip\\\":1,\\\"user_subscribe_type\\\":\\\"standard\\\",\\\"url_path\\\":\\\"/ai-tool/generate\\\",\\\"referrer\\\":\\\"/home/\\\",\\\"page\\\":\\\"generation\\\",\\\"message\\\":\\\"success\\\",\\\"entriesCount\\\":0,\\\"hasNewData\\\":0,\\\"initially\\\":0,\\\"duration\\\":197,\\\"code\\\":0,\\\"assetsCount\\\":0,\\\"packagesCount\\\":0,\\\"event_index\\\":1771894585753}\",\"local_time_ms\":1771893829137,\"is_bav\":0,\"ab_sdk_version\":\"91249282,14674564,13753331,15628237,15174027,15174145,15170779,15407184,15567817,15504129,15481561\",\"session_id\":\"95ac96eb-cba1-47fe-94a4-fbc644d0f38b\"}],\"user\":{\"user_unique_id\":\"704135154117550\",\"user_type\":12,\"user_id\":\"704135154117550\",\"user_is_login\":true,\"web_id\":\"7605602965571765786\"},\"header\":{\"app_id\":513695,\"app_version\":\"0.1.0\",\"os_name\":\"windows\",\"os_version\":\"10\",\"device_model\":\"Windows NT 10.0\",\"language\":\"zh-Hans\",\"platform\":\"web\",\"sdk_version\":\"5.0.53\",\"sdk_lib\":\"js\",\"timezone\":8,\"tz_offset\":-28800,\"resolution\":\"1536x864\",\"browser\":\"Chrome\",\"browser_version\":\"132.0.0.0\",\"referrer\":\"\",\"referrer_host\":\"\",\"width\":1536,\"height\":864,\"screen_width\":1536,\"screen_height\":864,\"tracer_data\":\"{\\\"$utm_from_url\\\":1}\",\"custom\":\"{\\\"channel_level1\\\":\\\"Direct\\\",\\\"channel_level2\\\":\\\"enter_url\\\",\\\"channel_level3\\\":\\\"\\\",\\\"channel_level4\\\":\\\"\\\",\\\"channel_from\\\":\\\"ut\\\",\\\"session_start_url\\\":\\\"https://jimeng.jianying.com/ai-tool/home/\\\",\\\"branch\\\":\\\"release/950\\\",\\\"theme_mode\\\":\\\"dark\\\",\\\"resolution\\\":480,\\\"gpu_exist\\\":\\\"1\\\",\\\"network_type\\\":\\\"4g\\\",\\\"downlink\\\":10,\\\"rtt\\\":0,\\\"web_id\\\":\\\"7605602965571765786\\\",\\\"is_new_framework\\\":1,\\\"store_country\\\":\\\"CN\\\",\\\"language\\\":\\\"zh-Hans\\\",\\\"is_vip\\\":1,\\\"user_subscribe_type\\\":\\\"standard\\\"}\"},\"local_time\":1771893831,\"verbose\":1}]",
+ "method": "POST"
+}); ;
+fetch("https://mon.zijieapi.com/monitor_browser/collect/batch/?biz_id=cn_mweb", {
+ "headers": {
+ "accept": "*/*",
+ "accept-language": "zh-CN,zh;q=0.9",
+ "cache-control": "no-cache",
+ "content-type": "application/json",
+ "pragma": "no-cache",
+ "priority": "u=1, i",
+ "sec-ch-ua": "\"Not A(Brand\";v=\"8\", \"Chromium\";v=\"132\", \"Google Chrome\";v=\"132\"",
+ "sec-ch-ua-mobile": "?0",
+ "sec-ch-ua-platform": "\"Windows\"",
+ "sec-fetch-dest": "empty",
+ "sec-fetch-mode": "cors",
+ "sec-fetch-site": "cross-site",
+ "Referer": "https://jimeng.jianying.com/ai-tool/generate?type=image",
+ "Referrer-Policy": "no-referrer-when-downgrade"
+ },
+ "body": "{\"ev_type\":\"batch\",\"list\":[{\"ev_type\":\"resource\",\"payload\":{\"name\":\"https://lf3-short.ibytedapm.com/slardar/fe/sdk-web/plugins/screenshot.min.js\",\"entryType\":\"resource\",\"startTime\":86213.82000000007,\"duration\":54.71999999997206,\"initiatorType\":\"script\",\"deliveryType\":\"\",\"nextHopProtocol\":\"h2\",\"renderBlockingStatus\":\"non-blocking\",\"workerStart\":0,\"redirectStart\":0,\"redirectEnd\":0,\"fetchStart\":86213.82000000007,\"domainLookupStart\":86213.82000000007,\"domainLookupEnd\":86213.82000000007,\"connectStart\":86215.8999999999,\"secureConnectionStart\":86216.91500000004,\"connectEnd\":86242.7250000001,\"requestStart\":86243.02000000002,\"responseStart\":86258.37999999989,\"firstInterimResponseStart\":0,\"responseEnd\":86268.54000000004,\"transferSize\":54867,\"encodedBodySize\":54567,\"decodedBodySize\":283917,\"responseStatus\":200,\"serverTiming\":[{\"name\":\"cdn-cache\",\"duration\":0,\"description\":\"HIT\"},{\"name\":\"edge\",\"duration\":4,\"description\":\"\"}]},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893820979,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":0.1}},{\"ev_type\":\"performance_longtask\",\"payload\":{\"type\":\"perf\",\"longtasks\":[{\"name\":\"multiple-contexts\",\"entryType\":\"longtask\",\"startTime\":88136.69500000007,\"duration\":748,\"attribution\":[{\"name\":\"unknown\",\"entryType\":\"taskattribution\",\"startTime\":0,\"duration\":0,\"containerType\":\"window\",\"containerSrc\":\"\",\"containerId\":\"\",\"containerName\":\"\"}]}]},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893823808,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":1}},{\"ev_type\":\"performance_longtask\",\"payload\":{\"type\":\"perf\",\"longtasks\":[{\"name\":\"self\",\"entryType\":\"longtask\",\"startTime\":88899.91500000004,\"duration\":77,\"attribution\":[{\"name\":\"unknown\",\"entryType\":\"taskattribution\",\"startTime\":0,\"duration\":0,\"containerType\":\"window\",\"containerSrc\":\"\",\"containerId\":\"\",\"containerName\":\"\"}]}]},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893823808,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":1}},{\"ev_type\":\"performance_longtask\",\"payload\":{\"type\":\"perf\",\"longtasks\":[{\"name\":\"same-origin-descendant\",\"entryType\":\"longtask\",\"startTime\":89011.08499999996,\"duration\":70,\"attribution\":[{\"name\":\"unknown\",\"entryType\":\"taskattribution\",\"startTime\":0,\"duration\":0,\"containerType\":\"iframe\",\"containerSrc\":\"\",\"containerId\":\"\",\"containerName\":\"\"}]}]},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893823808,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":1}},{\"ev_type\":\"performance_longtask\",\"payload\":{\"type\":\"perf\",\"longtasks\":[{\"name\":\"self\",\"entryType\":\"longtask\",\"startTime\":89121.46999999997,\"duration\":79,\"attribution\":[{\"name\":\"unknown\",\"entryType\":\"taskattribution\",\"startTime\":0,\"duration\":0,\"containerType\":\"window\",\"containerSrc\":\"\",\"containerId\":\"\",\"containerName\":\"\"}]}]},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893823968,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":1}},{\"ev_type\":\"blank_screen\",\"payload\":{\"timestamp\":1771893825515,\"score\":0,\"screenshot\":\"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/4gHYSUNDX1BST0ZJTEUAAQEAAAHIAAAAAAQwAABtbnRyUkdCIFhZWiAH4AABAAEAAAAAAABhY3NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA9tYAAQAAAADTLQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlkZXNjAAAA8AAAACRyWFlaAAABFAAAABRnWFlaAAABKAAAABRiWFlaAAABPAAAABR3dHB0AAABUAAAABRyVFJDAAABZAAAAChnVFJDAAABZAAAAChiVFJDAAABZAAAAChjcHJ0AAABjAAAADxtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAHMAUgBHAEJYWVogAAAAAAAAb6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9YWVogAAAAAAAA9tYAAQAAAADTLXBhcmEAAAAAAAQAAAACZmYAAPKnAAANWQAAE9AAAApbAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAACAAAAAcAEcAbwBvAGcAbABlACAASQBuAGMALgAgADIAMAAxADb/2wBDAFA3PEY8MlBGQUZaVVBfeMiCeG5uePWvuZHI////////////////////////////////////////////////////2wBDAVVaWnhpeOuCguv/////////////////////////////////////////////////////////////////////////wAARCAEuAZwDASIAAhEBAxEB/8QAGQABAQEBAQEAAAAAAAAAAAAAAAECBQME/8QAMBABAQACAAQFAwMEAgMBAAAAAAECEQMSITETQVFSYRSRoQRCcSIygeFi8LHB8dH/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAf/EABcRAQEBAQAAAAAAAAAAAAAAAAAhARH/2gAMAwEAAhEDEQA/APkBrDC5713gMi5Y5Y95YgIKAiiggoCCgIKAgoCCgIKAgoCCgIKAgrXLdbBgV6ThZXGXpqg8h658LLCyXVt9GLLLq9wZGpN2Seb08DLm0DxHtOBlZvc+7OXDyxyk6W30B5jVll1TGc2Uk8wZHv8AT5TvcUnAys3vH7g8UeuXDyxy5elt9GLNXVBkUBHYnaOQ687QFAAAAABx28OJyTUnW96wAuV5rtAAAAVFAAAAAAAAAAAAAAAAAAAa5rrX/pkAameUmpWQGsssstbu9IgCteLnvcuv4jADfi5+78Jlnlnd5XdZAUl1dzyQBvxc7+6k4uc/cwA1lncrvK7rOxAAAHXnaOQ687QFAAAAABxwAAAAAFRQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEVAAAHXnaOQ687QFAAAAABxwXGbv/mgguWOvn5iAAAKigAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIqAAAOvO0ch152gKAAAAADjrjZNyzcvyjfD4nh71N7BMrLJJLJ/LLfF4t4mtzWmAAAFQ2CibNgomzYKJs2CibNgomzYKJs2CibNgomzYKJs2CibNgomzYKJs2CibNgomzYKJs2CibNgqGwAAB152jkOvO0BQAAAAAcdvhcO8XOYz/NYb4WOdvNh3xA43CvCz5b/AIrDfFmfNzcTvkwAAA1jN9GVl0DXJbZMdXfo14HE9v5jM4lll327N/UZ/AJ4HE9v5YyxuNss6x6fU561ufZ55Zc1tvegkm2phblrHV/hmXXm1OJZlzb6gvhZ+08LPetLePle+tL9Rl8A8rNbi9NJllzW31QAAAAAAAAAAAAAAAAAAAAAAAAAAB152jkOvO0BQAAAAAcdZlZ2Rrh4y735QEyzyy/uu0a4mMxs5d6s82QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHXnaOQ687QFAAAAABx2+Hw7nu45a0wsys7WwF4mNxvXKZX4u2QAAABoGdX0NVqdz/APAZ1fQ01O8S784ByZehcbO8b8Tp/azlnvyBfB4nt/K+BxPb+Y9J+puv7O3yX9Rb+y/f/QPPwOJ7fzE8HieyvT6n/h1+av1O9f0fkHl4WfpPXvGNPTPic2N/p1vU7+jz+AXkys3o5b6NTKySctS3K+QLODxMseaY9P5W8DiT9v5ax41wxkuN6fP+l+p/4fkGPA4nt/KZcLPGbymp/L0n6myScvb5/wBJlx5lLLh0vyDzw4eWf9s2t4Oc7yfeLw+LeHjZJ3+Wr+ol/Z+f9A8/Cz3rX5SY5XfTs9PH6y6vTy2mPGsmrN+u73BJweJe2NXwOJ7fy9J+qvs/LP1F8S5cvlrWwY8LP0n3h4PE9tbv6nLd6eXqfUX2/kHlljcbq63/ACs4edm5O/yvE4nid8evldrhxrjO3l060EnCzt1Ju/yeDxPbW/qMvTy13L+oyvaa6eoPLKXG6vdAAAAAAdedo5DrztAUAAAAAHHa4eubrrWr3Zb4WOGUvPlr0BM9bmpJ08mW+LMJrktvrtgAABplZfgFL0tMZbvWmuTP1gMrzz27OXK+ieHd+QL4k9pzz2p4d+EyxuN6gvNOvTv8lz69k5brfReS/AL4k9rG2phb5w8O+sA5516d/lmXVjXJWddQeni/Bzy+VZ8O/CZY3G6oNZZyydGbdoAAAAAAAAAAAAAAAAAAAAAOvO0ch152gKAAAAADjgAAAAAEuhZAJlZ2XxL8FwsutXZyZe2/YCZ34PEvpDky6f03r8JZrpZqgviZJcrl30amu6Aszsi89ZAamdnoeJkyA1z34Zl0ANc99Iltyu6gAAAAAAAAAAAAAAAAAAAAAAA687RyHXnaAoAAAAAOOAAAAAAsuuqAPTHPlyl1Onk349v7fy8AHv4//Hf8/wDx5Z3myt1rbIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA687RyHXnaAoAAAAAOOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA687RyHXnaAoAAAAAOODW8prp2+AZG7llZZpgTAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdedo5DrztAUAAAAAHHavEyrIHGuesgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA687RyHXnaAoAAAAAOOAAAAAAqKAACyW3Ult+C4ZTvjZ/hrh58mXNrb0vH3eks6fkHjJb2lXkyn7b9np405ZNdf+/8Aey48bCTtftAeGmuTP25fZq8T+vck184x6/UYbtmN3fgHz8uXtv2R9F/UY66S3+Y+fzAAAAAAAAAAAAAAAAAAAAAAAABAAHXnaOQ687QFAAAAABx1l156QBbd1AAAAVFBdAtmgZotQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAdedo5DrztAUAAAAAHHWefXSALe6AAAAqKCqmzYFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAB152jkOvO0BQAAAAAcdcbJ3iAFu+wAAACooLJaavoTKyaWZ6mtKlTV9Eb575pctzWgrICK1ccpN2dDkz9t+xc7ceV639RddMdX12Dx5cvbfscuXpfs9Lx8rd6n+UnGynlAeY1nlc8rle7ILcbO8Xky9t+yXK2a6fZ6ePl6QHl56a8PP2ZfZLd5W3zu3t9Tfb+QeXJl7b0+GXrONZlbMZNvIFktuoiy6svoW7uwQAAAAAAABeW9Oncls3q9zmv2AuNk35Pb9LwZxbbl/bPy8ue8uvJ7/pONMLccrqXtQevg8Diy44TVnnHxZY3HK43vLp0LxOFw5cueXd30rn55c+dyvndgzo03jJe6ZSS9OwMuvO0ch152gKAAAAADjrLr/4gBeoAAABsAXYgCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogC7TYAsuuxbvvUAHXnaOQ687QFAAAAAB//9k=\",\"serialized_dom\":\"\"},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893820921,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":1}},{\"ev_type\":\"performance_longtask\",\"payload\":{\"type\":\"perf\",\"longtasks\":[{\"name\":\"self\",\"entryType\":\"longtask\",\"startTime\":90321.54000000004,\"duration\":221,\"attribution\":[{\"name\":\"unknown\",\"entryType\":\"taskattribution\",\"startTime\":0,\"duration\":0,\"containerType\":\"window\",\"containerSrc\":\"\",\"containerId\":\"\",\"containerName\":\"\"}]}]},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893825516,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":1}},{\"ev_type\":\"performance_longtask\",\"payload\":{\"type\":\"perf\",\"longtasks\":[{\"name\":\"self\",\"entryType\":\"longtask\",\"startTime\":90581.71500000008,\"duration\":61,\"attribution\":[{\"name\":\"unknown\",\"entryType\":\"taskattribution\",\"startTime\":0,\"duration\":0,\"containerType\":\"window\",\"containerSrc\":\"\",\"containerId\":\"\",\"containerName\":\"\"}]}]},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893825516,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":1}},{\"ev_type\":\"performance_longtask\",\"payload\":{\"type\":\"perf\",\"longtasks\":[{\"name\":\"multiple-contexts\",\"entryType\":\"longtask\",\"startTime\":90719.03499999992,\"duration\":89,\"attribution\":[{\"name\":\"unknown\",\"entryType\":\"taskattribution\",\"startTime\":0,\"duration\":0,\"containerType\":\"window\",\"containerSrc\":\"\",\"containerId\":\"\",\"containerName\":\"\"}]}]},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893825516,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":1}},{\"ev_type\":\"resource\",\"payload\":{\"name\":\"https://lf3-lv-buz.vlabstatic.com/obj/image-lvweb-buz/common/font/FZYASHJW-Regular.20251015.subset.ttf\",\"entryType\":\"resource\",\"startTime\":90593.44999999995,\"duration\":67.44500000006519,\"initiatorType\":\"css\",\"deliveryType\":\"\",\"nextHopProtocol\":\"h2\",\"renderBlockingStatus\":\"non-blocking\",\"workerStart\":0,\"redirectStart\":0,\"redirectEnd\":0,\"fetchStart\":90593.44999999995,\"domainLookupStart\":90593.44999999995,\"domainLookupEnd\":90593.44999999995,\"connectStart\":90593.44999999995,\"secureConnectionStart\":90593.44999999995,\"connectEnd\":90593.44999999995,\"requestStart\":90649.56000000006,\"responseStart\":90659.88500000001,\"firstInterimResponseStart\":0,\"responseEnd\":90660.89500000002,\"transferSize\":22496,\"encodedBodySize\":22196,\"decodedBodySize\":22196,\"responseStatus\":200,\"serverTiming\":[{\"name\":\"inner\",\"duration\":71,\"description\":\"\"}]},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893825517,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":0.1}},{\"ev_type\":\"custom\",\"payload\":{\"content\":\"[dreamina-global-logger][2/24/2026, 8:43:46 AM][ContentGeneratorTaskReportService] content_generator_task_submit_start {\\\"submitId\\\":\\\"717c5e9b-d3ff-444d-8d22-85f59dd38da7\\\",\\\"type\\\":\\\"\\\",\\\"generateType\\\":1,\\\"inputParamsStr\\\":\\\"\\\"}\",\"type\":\"log\",\"level\":\"info\",\"metrics\":{},\"categories\":{\"branch\":\"release/950\"}},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893826297,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"action_id\":\"91954610-db03-42e5-8e5b-b232ca650032\",\"sdk_offset\":1055.5,\"sample_rate\":1}},{\"ev_type\":\"resource\",\"payload\":{\"name\":\"https://lf3-lv-buz.vlabstatic.com/obj/image-lvweb-buz/common/font/Montserrat-SemiBold.20250416.subset.ttf\",\"entryType\":\"resource\",\"startTime\":91608.7749999999,\"duration\":38.84000000008382,\"initiatorType\":\"css\",\"deliveryType\":\"\",\"nextHopProtocol\":\"h2\",\"renderBlockingStatus\":\"non-blocking\",\"workerStart\":0,\"redirectStart\":0,\"redirectEnd\":0,\"fetchStart\":91608.7749999999,\"domainLookupStart\":91608.7749999999,\"domainLookupEnd\":91608.7749999999,\"connectStart\":91608.7749999999,\"secureConnectionStart\":91608.7749999999,\"connectEnd\":91608.7749999999,\"requestStart\":91636.33499999996,\"responseStart\":91646.59000000008,\"firstInterimResponseStart\":0,\"responseEnd\":91647.61499999999,\"transferSize\":25796,\"encodedBodySize\":25496,\"decodedBodySize\":25496,\"responseStatus\":200,\"serverTiming\":[{\"name\":\"inner\",\"duration\":108,\"description\":\"\"}]},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893826368,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"action_id\":\"91954610-db03-42e5-8e5b-b232ca650032\",\"sdk_offset\":1055.5,\"sample_rate\":0.1}},{\"ev_type\":\"custom\",\"payload\":{\"content\":\"[dreamina-global-logger][2/24/2026, 8:43:47 AM][ContentGeneratorTaskReportService] content_generator_task_query_start {\\\"submitId\\\":\\\"717c5e9b-d3ff-444d-8d22-85f59dd38da7\\\",\\\"type\\\":\\\"\\\",\\\"generateType\\\":1,\\\"historyId\\\":\\\"13489993616908\\\",\\\"generateId\\\":\\\"20260224084347D8F218F0D45862717C7C\\\",\\\"inputParamsStr\\\":\\\"\\\",\\\"statusModel\\\":{\\\"statusCode\\\":42,\\\"recordStatus\\\":4,\\\"timeModel\\\":{\\\"createdTime\\\":1771893827644,\\\"estimatedQueueCostTime\\\":0,\\\"estimatedGenCostTime\\\":37000},\\\"queueInfo\\\":{\\\"priority\\\":3,\\\"queueIdx\\\":0,\\\"queueStatus\\\":2,\\\"queueLength\\\":0,\\\"pollingConfig\\\":{\\\"intervalSeconds\\\":30,\\\"timeoutSeconds\\\":86400},\\\"priorityQueueDisplayThreshold\\\":{\\\"vipQueuingTimeThreshold\\\":300,\\\"waitingTimeThreshold\\\":60},\\\"debugInfo\\\":\\\"{\\\\\\\"have_no_dreamina_queue_name\\\\\\\":true,\\\\\\\"dreamina_matrix_queue_name\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"dreamina_matrix_req_key\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"dreamina_matrix_second_req_key\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"have_no_queue_name\\\\\\\":false,\\\\\\\"queue_name\\\\\\\":\\\\\\\"high_aes_general_v50\\\\\\\",\\\\\\\"matrix_req_key\\\\\\\":\\\\\\\"MImageGen:high_aes_general_v50\\\\\\\",\\\\\\\"matrix_second_req_key\\\\\\\":\\\\\\\"\\\\\\\"}\\\"}}}\",\"type\":\"log\",\"level\":\"info\",\"metrics\":{},\"categories\":{\"branch\":\"release/950\"}},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893827065,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"action_id\":\"91954610-db03-42e5-8e5b-b232ca650032\",\"sdk_offset\":1055.5,\"sample_rate\":1}},{\"ev_type\":\"custom\",\"payload\":{\"content\":\"[dreamina-global-logger][2/24/2026, 8:43:47 AM][WebsocketPollingManager:10016] 创建降级策略: racing\",\"type\":\"log\",\"level\":\"info\",\"metrics\":{},\"categories\":{\"branch\":\"release/950\"}},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893827066,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"action_id\":\"91954610-db03-42e5-8e5b-b232ca650032\",\"sdk_offset\":1055.5,\"sample_rate\":1}},{\"ev_type\":\"custom\",\"payload\":{\"content\":\"[dreamina-global-logger][2/24/2026, 8:43:47 AM][WebsocketPollingManager:10016] 初始化完成,使用策略: racing\",\"type\":\"log\",\"level\":\"info\",\"metrics\":{},\"categories\":{\"branch\":\"release/950\"}},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893827066,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"action_id\":\"91954610-db03-42e5-8e5b-b232ca650032\",\"sdk_offset\":1055.5,\"sample_rate\":1}},{\"ev_type\":\"custom\",\"payload\":{\"content\":\"[dreamina-global-logger][2/24/2026, 8:43:47 AM][WebsocketPollingManager:10016] 开始监听WebSocket消息,方法ID: 10016\",\"type\":\"log\",\"level\":\"info\",\"metrics\":{},\"categories\":{\"branch\":\"release/950\"}},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893827066,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"action_id\":\"91954610-db03-42e5-8e5b-b232ca650032\",\"sdk_offset\":1055.5,\"sample_rate\":1}},{\"ev_type\":\"custom\",\"payload\":{\"content\":\"[dreamina-global-logger][2/24/2026, 8:43:47 AM][WebsocketPollingManager:10016] 设置降级超时定时器: 10000ms\",\"type\":\"log\",\"level\":\"info\",\"metrics\":{},\"categories\":{\"branch\":\"release/950\"}},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893827066,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"action_id\":\"91954610-db03-42e5-8e5b-b232ca650032\",\"sdk_offset\":1055.5,\"sample_rate\":1}},{\"ev_type\":\"custom\",\"payload\":{\"content\":\"[dreamina-global-logger][2/24/2026, 8:43:47 AM][ContentGeneratorTaskReportService] content_generator_task_submit_end {\\\"submitId\\\":\\\"717c5e9b-d3ff-444d-8d22-85f59dd38da7\\\",\\\"type\\\":\\\"\\\",\\\"generateType\\\":1,\\\"historyId\\\":\\\"13489993616908\\\",\\\"generateId\\\":\\\"20260224084347D8F218F0D45862717C7C\\\",\\\"inputParamsStr\\\":\\\"\\\",\\\"statusModel\\\":{\\\"statusCode\\\":42,\\\"recordStatus\\\":4,\\\"timeModel\\\":{\\\"createdTime\\\":1771893827644,\\\"estimatedQueueCostTime\\\":0,\\\"estimatedGenCostTime\\\":37000},\\\"queueInfo\\\":{\\\"priority\\\":3,\\\"queueIdx\\\":0,\\\"queueStatus\\\":2,\\\"queueLength\\\":0,\\\"pollingConfig\\\":{\\\"intervalSeconds\\\":30,\\\"timeoutSeconds\\\":86400},\\\"priorityQueueDisplayThreshold\\\":{\\\"vipQueuingTimeThreshold\\\":300,\\\"waitingTimeThreshold\\\":60},\\\"debugInfo\\\":\\\"{\\\\\\\"have_no_dreamina_queue_name\\\\\\\":true,\\\\\\\"dreamina_matrix_queue_name\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"dreamina_matrix_req_key\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"dreamina_matrix_second_req_key\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"have_no_queue_name\\\\\\\":false,\\\\\\\"queue_name\\\\\\\":\\\\\\\"high_aes_general_v50\\\\\\\",\\\\\\\"matrix_req_key\\\\\\\":\\\\\\\"MImageGen:high_aes_general_v50\\\\\\\",\\\\\\\"matrix_second_req_key\\\\\\\":\\\\\\\"\\\\\\\"}\\\"}}}\",\"type\":\"log\",\"level\":\"info\",\"metrics\":{},\"categories\":{\"branch\":\"release/950\"}},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893827067,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"action_id\":\"91954610-db03-42e5-8e5b-b232ca650032\",\"sdk_offset\":1055.5,\"sample_rate\":1}},{\"ev_type\":\"http\",\"payload\":{\"api\":\"xhr\",\"request\":{\"url\":\"https://jimeng.jianying.com/mweb/v1/aigc_draft/generate?aid=513695&device_platform=web®ion=cn&webId=7605602965571765786&da_version=3.3.9&os=windows&web_component_open_flag=1&web_version=7.5.0&aigc_features=app_lip_sync\",\"method\":\"post\",\"headers\":{\"accept\":\"application/json, text/plain, */*\",\"content-type\":\"application/json\",\"sign\":\"19724735691862919106b8c4808a6ce7\",\"device-time\":\"1771893826\",\"sign-ver\":\"1\",\"pf\":\"7\",\"appvr\":\"8.4.0\",\"loc\":\"cn\",\"lan\":\"zh-Hans\",\"app-sdk-version\":\"48.0.0\",\"appid\":\"513695\"},\"timestamp\":1771893826311},\"response\":{\"status\":200,\"is_custom_error\":false,\"timestamp\":1771893827061,\"headers\":{\"content-encoding\":\"br\",\"content-type\":\"application/json; charset=utf-8\",\"date\":\"Tue, 24 Feb 2026 00:43:48 GMT\",\"eagleid\":\"79e4822117718938273106935e\",\"server\":\"Tengine\",\"server-timing\":\"inner; dur=594, cdn-cache;desc=MISS,edge;dur=63,origin;dur=663\",\"strict-transport-security\":\"max-age=31536000; includeSubDomains; preload\",\"timing-allow-origin\":\"*\",\"tt_stable\":\"1\",\"vary\":\"Accept-Encoding\",\"via\":\"cache7.l2cm9-6[663,0], cache13.cn3833[726,0]\",\"x-tt-logid\":\"20260224084347D8F218F0D45862717C7C\",\"x-tt-trace-host\":\"01317a0b267e6f7b60df5311a11f49fe3abe12f513916a96b0892b0c747dbb7c47b0c35f4e5258fb8b8e3653213edfb30741c0573fffb81268cec9cce8d5c7d47926cfdce946321cda3f0e7fe4b74b6e442516e2424f632bae7c4fe474f8a20b8d61a83c5fc6379be6a700f39da246b051\",\"x-tt-trace-id\":\"00-260224084347D8F218F0D45862717C7C-3CA91966710B1D13-00\",\"x-tt-trace-tag\":\"id=03;cdn-cache=miss;type=dyn\"},\"timing\":{\"name\":\"https://jimeng.jianying.com/mweb/v1/aigc_draft/generate?aid=513695&device_platform=web®ion=cn&webId=7605602965571765786&da_version=3.3.9&os=windows&web_component_open_flag=1&web_version=7.5.0&aigc_features=app_lip_sync&msToken=ihykpW25F6ZdjhjeVFqU1JlJcnS7q1jpt3V0MMj57KcgSYXexymGclx9WUAZR1KqlKf3iBxnkNxtzZj1u75VJDsZIxv72ralFzbne1AtshBzB1TFg5Ju2A%3D%3D&a_bogus=djsxDcgXMsm1ME8-AXkz9e4NcEb0YW4cgZENvyD-DzoW\",\"entryType\":\"resource\",\"startTime\":91607.40500000003,\"duration\":742.7849999999162,\"initiatorType\":\"xmlhttprequest\",\"deliveryType\":\"\",\"nextHopProtocol\":\"h2\",\"renderBlockingStatus\":\"non-blocking\",\"workerStart\":0,\"redirectStart\":0,\"redirectEnd\":0,\"fetchStart\":91607.40500000003,\"domainLookupStart\":91607.40500000003,\"domainLookupEnd\":91607.40500000003,\"connectStart\":91607.40500000003,\"secureConnectionStart\":91607.40500000003,\"connectEnd\":91607.40500000003,\"requestStart\":91608.8500000001,\"responseStart\":92348.93999999994,\"firstInterimResponseStart\":0,\"responseEnd\":92350.18999999994,\"transferSize\":2236,\"encodedBodySize\":1936,\"decodedBodySize\":4568,\"responseStatus\":200,\"serverTiming\":[{\"name\":\"inner\",\"duration\":594,\"description\":\"\"},{\"name\":\"cdn-cache\",\"duration\":0,\"description\":\"MISS\"},{\"name\":\"edge\",\"duration\":63,\"description\":\"\"},{\"name\":\"origin\",\"duration\":663,\"description\":\"\"}]}},\"duration\":750},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893826311,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"action_id\":\"91954610-db03-42e5-8e5b-b232ca650032\",\"sdk_offset\":1055.5,\"sample_rate\":1}},{\"ev_type\":\"action\",\"payload\":{\"start_time\":91582.50499999989,\"id\":\"91954610-db03-42e5-8e5b-b232ca650032\",\"type\":\"click\",\"target\":{\"name\":\"ANONYMOUS_SVG\",\"path\":\"div.toolbar > div.toolbar-actions > div > button.lv-btn.lv-btn.lv-btn-size.lv-btn-shape.lv-btn-icon-only.button.submit-button.submit-button.expand-transition-start[type=\\\"button\\\"] > svg\"},\"metrics\":{\"resource\":{\"count\":1},\"http\":{\"count\":1,\"duration\":742.7849999999162}},\"duration\":878.0400000000373,\"frontend_time\":135.25500000012107},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893826290,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"action_id\":\"91954610-db03-42e5-8e5b-b232ca650032\",\"sdk_offset\":1055.5,\"sample_rate\":0.05}},{\"ev_type\":\"http\",\"payload\":{\"api\":\"fetch\",\"request\":{\"method\":\"get\",\"timestamp\":1771893828943,\"url\":\"https://everphoto.jianying.com/sf/5/v5/GetUpdates?aid=324442&space_id=7436736040297038899&cursor=n_7492071223166238732&material=1&abilities=30\",\"headers\":{\"content-type\":\"application/json\",\"expect-real-status\":\"1\",\"x-ep-thirdparty-uid\":\"704135154117550\"}},\"response\":{\"status\":200,\"is_custom_error\":false,\"timestamp\":1771893829131,\"headers\":{\"content-type\":\"application/json; charset=utf-8\",\"x-tt-logid\":\"20260224084350D6884052232FB7258896\"},\"timing\":{\"name\":\"https://everphoto.jianying.com/sf/5/v5/GetUpdates?aid=324442&space_id=7436736040297038899&cursor=n_7492071223166238732&material=1&abilities=30\",\"entryType\":\"resource\",\"startTime\":94236.26000000001,\"duration\":185.82499999995343,\"initiatorType\":\"fetch\",\"deliveryType\":\"\",\"nextHopProtocol\":\"\",\"renderBlockingStatus\":\"non-blocking\",\"workerStart\":0,\"redirectStart\":0,\"redirectEnd\":0,\"fetchStart\":94236.26000000001,\"domainLookupStart\":0,\"domainLookupEnd\":0,\"connectStart\":0,\"secureConnectionStart\":0,\"connectEnd\":0,\"requestStart\":0,\"responseStart\":0,\"firstInterimResponseStart\":0,\"responseEnd\":94422.08499999996,\"transferSize\":0,\"encodedBodySize\":0,\"decodedBodySize\":0,\"responseStatus\":200,\"serverTiming\":[]}},\"duration\":188},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893828943,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"action_id\":\"91954610-db03-42e5-8e5b-b232ca650032\",\"sdk_offset\":1055.5,\"sample_rate\":1}},{\"ev_type\":\"http\",\"payload\":{\"api\":\"xhr\",\"request\":{\"url\":\"https://jimeng.jianying.com/mweb/v1/get_history_by_ids?aid=513695&device_platform=web®ion=cn&webId=7605602965571765786&da_version=3.3.9&web_version=7.5.0&aigc_features=app_lip_sync\",\"method\":\"post\",\"headers\":{\"accept\":\"application/json, text/plain, */*\",\"content-type\":\"application/json\",\"x-platform\":\"pc\",\"sign\":\"656c1e00cf94dfd5bcfaf031e32493e4\",\"device-time\":\"1771893831\",\"sign-ver\":\"1\",\"pf\":\"7\",\"appvr\":\"8.4.0\",\"loc\":\"cn\",\"lan\":\"zh-Hans\",\"app-sdk-version\":\"48.0.0\",\"appid\":\"513695\"},\"timestamp\":1771893831638},\"response\":{\"status\":200,\"is_custom_error\":false,\"timestamp\":1771893831918,\"headers\":{\"content-encoding\":\"br\",\"content-type\":\"application/json; charset=utf-8\",\"date\":\"Tue, 24 Feb 2026 00:43:52 GMT\",\"eagleid\":\"79e4822117718938326445079e\",\"server\":\"Tengine\",\"server-timing\":\"inner; dur=161, cdn-cache;desc=MISS,edge;dur=12,origin;dur=240\",\"strict-transport-security\":\"max-age=31536000; includeSubDomains; preload\",\"timing-allow-origin\":\"*\",\"tt_stable\":\"1\",\"vary\":\"Accept-Encoding\",\"via\":\"cache26.l2ea120-5[240,0], cache13.cn3833[252,0]\",\"x-tt-logid\":\"202602240843529A46418A603C686CFE10\",\"x-tt-trace-host\":\"01317a0b267e6f7b60df5311a11f49fe3ab2c55d072c9cbc4143ed34a7b79eaabd0eae7951c4d5455a85fa40122db3870ca5c6a17eee571ce9ea11b509925e2b54a08bdb510fdb00c9d68e472d8cdab6bfd918465348d67e12d407eb78a917fd8ec3275525c7bc88deba55793d5274fc26\",\"x-tt-trace-id\":\"00-2602240843529A46418A603C686CFE10-57EF8455522CA21A-00\",\"x-tt-trace-tag\":\"id=03;cdn-cache=miss;type=dyn\"},\"timing\":{\"name\":\"https://jimeng.jianying.com/mweb/v1/get_history_by_ids?aid=513695&device_platform=web®ion=cn&webId=7605602965571765786&da_version=3.3.9&web_version=7.5.0&aigc_features=app_lip_sync&msToken=ihykpW25F6ZdjhjeVFqU1JlJcnS7q1jpt3V0MMj57KcgSYXexymGclx9WUAZR1KqlKf3iBxnkNxtzZj1u75VJDsZIxv72ralFzbne1AtshBzB1TFg5Ju2A%3D%3D&a_bogus=xXsxhcgXMsm1o%2Fb-AXkz9Hx7ciY0YW5wgZENvyDMyUop\",\"entryType\":\"resource\",\"startTime\":96933.11999999988,\"duration\":275.5150000001304,\"initiatorType\":\"xmlhttprequest\",\"deliveryType\":\"\",\"nextHopProtocol\":\"h2\",\"renderBlockingStatus\":\"non-blocking\",\"workerStart\":0,\"redirectStart\":0,\"redirectEnd\":0,\"fetchStart\":96933.11999999988,\"domainLookupStart\":96933.11999999988,\"domainLookupEnd\":96933.11999999988,\"connectStart\":96933.11999999988,\"secureConnectionStart\":96933.11999999988,\"connectEnd\":96933.11999999988,\"requestStart\":96941.18500000006,\"responseStart\":97208.03499999992,\"firstInterimResponseStart\":0,\"responseEnd\":97208.63500000001,\"transferSize\":2233,\"encodedBodySize\":1933,\"decodedBodySize\":4480,\"responseStatus\":200,\"serverTiming\":[{\"name\":\"inner\",\"duration\":161,\"description\":\"\"},{\"name\":\"cdn-cache\",\"duration\":0,\"description\":\"MISS\"},{\"name\":\"edge\",\"duration\":12,\"description\":\"\"},{\"name\":\"origin\",\"duration\":240,\"description\":\"\"}]}},\"duration\":280},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893831638,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"action_id\":\"91954610-db03-42e5-8e5b-b232ca650032\",\"sdk_offset\":1055.5,\"sample_rate\":1}},{\"ev_type\":\"http\",\"payload\":{\"api\":\"xhr\",\"request\":{\"url\":\"https://jimeng.jianying.com/commerce/v1/benefits/user_credit_history\",\"method\":\"post\",\"headers\":{\"accept\":\"application/json, text/plain, */*\",\"content-type\":\"application/json\",\"appid\":\"513695\",\"lan\":\"ZH\",\"sign\":\"e689d5fa536721dee8945eaa6efb01b0\",\"device-time\":\"1771893831\",\"sign-ver\":\"1\",\"pf\":\"7\",\"appvr\":\"8.4.0\"},\"timestamp\":1771893831924},\"response\":{\"status\":200,\"is_custom_error\":false,\"timestamp\":1771893832055,\"headers\":{\"content-encoding\":\"br\",\"content-type\":\"application/json; charset=utf-8\",\"date\":\"Tue, 24 Feb 2026 00:43:53 GMT\",\"eagleid\":\"79e4822117718938329207063e\",\"server\":\"Tengine\",\"server-timing\":\"inner; dur=31, cdn-cache;desc=MISS,edge;dur=65,origin;dur=48\",\"strict-transport-security\":\"max-age=31536000; includeSubDomains; preload\",\"timing-allow-origin\":\"*\",\"tt_stable\":\"1\",\"vary\":\"Accept-Encoding\",\"via\":\"cache23.l2cm9-6[48,0], cache13.cn3833[113,0]\",\"x-tt-logid\":\"20260224084352E0C9E9FBBB693EAAE45C\",\"x-tt-trace-host\":\"01317a0b267e6f7b60df5311a11f49fe3a8bfbc65b68dad73a3b0ba4f886cb1a5666297d0fe7fb27add108c5776d7225397d9af9d4c594f889f5b17c8277e6646e2bd819a0f5d149ea8718a4129b3d0bf41afa6f18a1764f0700dc3baa779f285d74d090d20f165d87a9fbbd1341a1cb1d\",\"x-tt-trace-id\":\"00-260224084352E0C9E9FBBB693EAAE45C-0BA2E31204CBB6BE-00\",\"x-tt-trace-tag\":\"id=03;cdn-cache=miss;type=dyn\"}},\"duration\":131},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893831924,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":1}},{\"ev_type\":\"custom\",\"payload\":{\"name\":\"blank_screen_query_path\",\"type\":\"event\",\"metrics\":{},\"categories\":{\"dom_show\":\"[[\\\"div.video-record-nlt6eI\\\",\\\"div.content-DPogfx.ai-generated-record-content-hg5EL8\\\",\\\"div.responsive-container-msS_cP.responsive-container-qHd4jO\\\",\\\"div#item_539985ba-9cf8-4f0e-9737-86492c51f085_e500b442-53c4-431a-ae69-da306ae81f75.item-Xh64V7\\\",\\\"div#scroll-list-539985ba-9cf8-4f0e-9737-86492c51f085.scroll-list-gsJVWP\\\",\\\"div.\\\",\\\"div.virtual-list-gUs6jj\\\",\\\"div.scroll-container-j7wUS8\\\",\\\"div.virtual-list-container-rarVwb\\\",\\\"div.record-list-RjGugi.record-virtual-list\\\",\\\"div.record-list-container-YQhwuM\\\",\\\"div.entry-lav5_s\\\",\\\"div.content-TZbgMr\\\",\\\"div#dreamina-ui-configuration-content-wrapper.main-container-nXfW_A\\\",\\\"div.content-wrapper-cF1zaN\\\",\\\"div.container-moSF_y\\\",\\\"div.top-down-layer-ilr3Ve\\\",\\\"div#dreamina.root_bf55f\\\",\\\"div.global-dreamina-container\\\",\\\"div#csr-root.\\\",\\\"body.\\\",\\\"html.\\\"],[\\\"div.video-record-nlt6eI\\\",\\\"div.content-DPogfx.ai-generated-record-content-hg5EL8\\\",\\\"div.responsive-container-msS_cP.responsive-container-qHd4jO\\\",\\\"div#item_539985ba-9cf8-4f0e-9737-86492c51f085_e500b442-53c4-431a-ae69-da306ae81f75.item-Xh64V7\\\",\\\"div#scroll-list-539985ba-9cf8-4f0e-9737-86492c51f085.scroll-list-gsJVWP\\\",\\\"div.\\\",\\\"div.virtual-list-gUs6jj\\\",\\\"div.scroll-container-j7wUS8\\\",\\\"div.virtual-list-container-rarVwb\\\",\\\"div.record-list-RjGugi.record-virtual-list\\\",\\\"div.record-list-container-YQhwuM\\\",\\\"div.entry-lav5_s\\\",\\\"div.content-TZbgMr\\\",\\\"div#dreamina-ui-configuration-content-wrapper.main-container-nXfW_A\\\",\\\"div.content-wrapper-cF1zaN\\\",\\\"div.container-moSF_y\\\",\\\"div.top-down-layer-ilr3Ve\\\",\\\"div#dreamina.root_bf55f\\\",\\\"div.global-dreamina-container\\\",\\\"div#csr-root.\\\",\\\"body.\\\",\\\"html.\\\"],[\\\"div.empty-placeholder-dcs8S2\\\",\\\"div.top-placeholder-aEry7y\\\",\\\"div.top-placeholder-fTCjHC\\\",\\\"div#scroll-list-539985ba-9cf8-4f0e-9737-86492c51f085.scroll-list-gsJVWP\\\",\\\"div.\\\",\\\"div.virtual-list-gUs6jj\\\",\\\"div.scroll-container-j7wUS8\\\",\\\"div.virtual-list-container-rarVwb\\\",\\\"div.record-list-RjGugi.record-virtual-list\\\",\\\"div.record-list-container-YQhwuM\\\",\\\"div.entry-lav5_s\\\",\\\"div.content-TZbgMr\\\",\\\"div#dreamina-ui-configuration-content-wrapper.main-container-nXfW_A\\\",\\\"div.content-wrapper-cF1zaN\\\",\\\"div.container-moSF_y\\\",\\\"div.top-down-layer-ilr3Ve\\\",\\\"div#dreamina.root_bf55f\\\",\\\"div.global-dreamina-container\\\",\\\"div#csr-root.\\\",\\\"body.\\\",\\\"html.\\\"],[\\\"div.empty-placeholder-dcs8S2\\\",\\\"div.top-placeholder-aEry7y\\\",\\\"div.top-placeholder-fTCjHC\\\",\\\"div#scroll-list-539985ba-9cf8-4f0e-9737-86492c51f085.scroll-list-gsJVWP\\\",\\\"div.\\\",\\\"div.virtual-list-gUs6jj\\\",\\\"div.scroll-container-j7wUS8\\\",\\\"div.virtual-list-container-rarVwb\\\",\\\"div.record-list-RjGugi.record-virtual-list\\\",\\\"div.record-list-container-YQhwuM\\\",\\\"div.entry-lav5_s\\\",\\\"div.content-TZbgMr\\\",\\\"div#dreamina-ui-configuration-content-wrapper.main-container-nXfW_A\\\",\\\"div.content-wrapper-cF1zaN\\\",\\\"div.container-moSF_y\\\",\\\"div.top-down-layer-ilr3Ve\\\",\\\"div#dreamina.root_bf55f\\\",\\\"div.global-dreamina-container\\\",\\\"div#csr-root.\\\",\\\"body.\\\",\\\"html.\\\"]]\"}},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893833527,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":1}}]}",
+ "method": "POST"
+}); ;
+fetch("https://mon.zijieapi.com/monitor_browser/collect/batch/?biz_id=cn_mweb", {
+ "headers": {
+ "accept": "*/*",
+ "accept-language": "zh-CN,zh;q=0.9",
+ "cache-control": "no-cache",
+ "content-type": "application/json",
+ "pragma": "no-cache",
+ "priority": "u=1, i",
+ "sec-ch-ua": "\"Not A(Brand\";v=\"8\", \"Chromium\";v=\"132\", \"Google Chrome\";v=\"132\"",
+ "sec-ch-ua-mobile": "?0",
+ "sec-ch-ua-platform": "\"Windows\"",
+ "sec-fetch-dest": "empty",
+ "sec-fetch-mode": "cors",
+ "sec-fetch-site": "cross-site",
+ "Referer": "https://jimeng.jianying.com/ai-tool/generate?type=image",
+ "Referrer-Policy": "no-referrer-when-downgrade"
+ },
+ "body": "{\"ev_type\":\"batch\",\"list\":[{\"ev_type\":\"resource\",\"payload\":{\"name\":\"https://lf3-lv-buz.vlabstatic.com/obj/image-lvweb-buz/ies/lvweb/dreamina_cn/static/media/record-loading-animation-v1.87ca7d66.mp4\",\"entryType\":\"resource\",\"startTime\":99637.19999999995,\"duration\":36.544999999925494,\"initiatorType\":\"video\",\"deliveryType\":\"\",\"nextHopProtocol\":\"h2\",\"renderBlockingStatus\":\"non-blocking\",\"workerStart\":0,\"redirectStart\":0,\"redirectEnd\":0,\"fetchStart\":99637.19999999995,\"domainLookupStart\":99637.19999999995,\"domainLookupEnd\":99637.19999999995,\"connectStart\":99637.19999999995,\"secureConnectionStart\":99637.19999999995,\"connectEnd\":99637.19999999995,\"requestStart\":99647.25,\"responseStart\":99661.5249999999,\"firstInterimResponseStart\":0,\"responseEnd\":99673.74499999988,\"transferSize\":300,\"encodedBodySize\":0,\"decodedBodySize\":0,\"responseStatus\":0,\"serverTiming\":[{\"name\":\"inner\",\"duration\":3,\"description\":\"\"}]},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893834382,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":0.1}},{\"ev_type\":\"resource\",\"payload\":{\"name\":\"https://lf3-lv-buz.vlabstatic.com/obj/image-lvweb-buz/ies/lvweb/dreamina_cn/static/media/record-loading-animation-v1.87ca7d66.mp4\",\"entryType\":\"resource\",\"startTime\":99673.11999999988,\"duration\":17.240000000223517,\"initiatorType\":\"video\",\"deliveryType\":\"\",\"nextHopProtocol\":\"h2\",\"renderBlockingStatus\":\"non-blocking\",\"workerStart\":0,\"redirectStart\":0,\"redirectEnd\":0,\"fetchStart\":99673.11999999988,\"domainLookupStart\":99673.11999999988,\"domainLookupEnd\":99673.11999999988,\"connectStart\":99673.11999999988,\"secureConnectionStart\":99673.11999999988,\"connectEnd\":99673.11999999988,\"requestStart\":99679.65999999992,\"responseStart\":99689.3600000001,\"firstInterimResponseStart\":0,\"responseEnd\":99690.3600000001,\"transferSize\":27070,\"encodedBodySize\":26770,\"decodedBodySize\":26770,\"responseStatus\":206,\"serverTiming\":[{\"name\":\"inner\",\"duration\":3,\"description\":\"\"}]},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893834399,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":0.1}},{\"ev_type\":\"resource\",\"payload\":{\"name\":\"https://lf3-lv-buz.vlabstatic.com/obj/image-lvweb-buz/ies/lvweb/dreamina_cn/static/media/record-loading-animation-v1.87ca7d66.mp4\",\"entryType\":\"resource\",\"startTime\":99764.21999999997,\"duration\":28.475000000093132,\"initiatorType\":\"video\",\"deliveryType\":\"\",\"nextHopProtocol\":\"h2\",\"renderBlockingStatus\":\"non-blocking\",\"workerStart\":0,\"redirectStart\":0,\"redirectEnd\":0,\"fetchStart\":99764.21999999997,\"domainLookupStart\":99764.21999999997,\"domainLookupEnd\":99764.21999999997,\"connectStart\":99764.21999999997,\"secureConnectionStart\":99764.21999999997,\"connectEnd\":99764.21999999997,\"requestStart\":99767.43500000006,\"responseStart\":99777.7649999999,\"firstInterimResponseStart\":0,\"responseEnd\":99792.69500000007,\"transferSize\":354750,\"encodedBodySize\":354450,\"decodedBodySize\":354450,\"responseStatus\":0,\"serverTiming\":[{\"name\":\"inner\",\"duration\":3,\"description\":\"\"}]},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893834502,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":0.1}},{\"ev_type\":\"custom\",\"payload\":{\"content\":\"[dreamina-global-logger][2/24/2026, 8:43:57 AM][WebsocketPollingManager:10016] WebSocket超时(10000ms),触发降级到轮询\",\"type\":\"log\",\"level\":\"warn\",\"metrics\":{},\"categories\":{\"branch\":\"release/950\"}},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893837068,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":1}},{\"ev_type\":\"custom\",\"payload\":{\"content\":\"[dreamina-global-logger][2/24/2026, 8:43:57 AM][WebsocketPollingManager:10016] 清除降级超时定时器\",\"type\":\"log\",\"level\":\"info\",\"metrics\":{},\"categories\":{\"branch\":\"release/950\"}},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893837068,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":1}},{\"ev_type\":\"custom\",\"payload\":{\"content\":\"[dreamina-global-logger][2/24/2026, 8:43:57 AM][WebsocketPollingManager:10016] 降级到轮询,原因: timeout\",\"type\":\"log\",\"level\":\"warn\",\"metrics\":{},\"categories\":{\"branch\":\"release/950\"}},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893837068,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":1}}]}",
+ "method": "POST"
+}); ;
+fetch("https://jimeng.jianying.com/mweb/v1/get_history_by_ids?aid=513695&device_platform=web®ion=cn&webId=7605602965571765786&da_version=3.3.9&web_version=7.5.0&aigc_features=app_lip_sync&msToken=ihykpW25F6ZdjhjeVFqU1JlJcnS7q1jpt3V0MMj57KcgSYXexymGclx9WUAZR1KqlKf3iBxnkNxtzZj1u75VJDsZIxv72ralFzbne1AtshBzB1TFg5Ju2A%3D%3D&a_bogus=xfMDkOgXMsm1o%2Fb-AXkz9Hx7cOL0YW-cgZENvydSEzoM", {
+ "headers": {
+ "accept": "application/json, text/plain, */*",
+ "accept-language": "zh-CN,zh;q=0.9",
+ "app-sdk-version": "48.0.0",
+ "appid": "513695",
+ "appvr": "8.4.0",
+ "cache-control": "no-cache",
+ "content-type": "application/json",
+ "device-time": "1771893851",
+ "lan": "zh-Hans",
+ "loc": "cn",
+ "pf": "7",
+ "pragma": "no-cache",
+ "priority": "u=1, i",
+ "sec-ch-ua": "\"Not A(Brand\";v=\"8\", \"Chromium\";v=\"132\", \"Google Chrome\";v=\"132\"",
+ "sec-ch-ua-mobile": "?0",
+ "sec-ch-ua-platform": "\"Windows\"",
+ "sec-fetch-dest": "empty",
+ "sec-fetch-mode": "cors",
+ "sec-fetch-site": "same-origin",
+ "sign": "2134fe58fd9975f7473ab058d4f1dc2c",
+ "sign-ver": "1",
+ "tdid": "",
+ "x-platform": "pc",
+ "cookie": "_isHitHomeHeaderRefreshExperiment=1; s_v_web_id=verify_mli2zh09_eQ5L9Cej_bFER_4ccU_9JK5_Ael0lBTb3f1K; COOKIE_CONSENT_PROMPT_CONFIG={%22status%22:1%2C%22settings%22:{%22firstPartyAnalytics%22:true%2C%22GoogleAnalytics%22:true}%2C%22updatedTime%22:1770817444874}; fpk1=148a20cd63817580d8e8d9df32cd9b08f2453b88009c7c8bebd01f333cce15c7626a440c525de2203bdc082bd9051722; passport_csrf_token=ce5085d40c0c9edf5268392eeba6903e; passport_csrf_token_default=ce5085d40c0c9edf5268392eeba6903e; n_mh=xSPw81I4URH-3hVkPcoqGh1J2A7uMjTD8qZw1F59WkQ; sid_guard=0b6873d7aa4f947b144dd55be06359ec%7C1770821461%7C31536000%7CThu%2C+11-Feb-2027+14%3A51%3A01+GMT; uid_tt=7ced300dac82637ad657f41cb285cdfd; uid_tt_ss=7ced300dac82637ad657f41cb285cdfd; sid_tt=0b6873d7aa4f947b144dd55be06359ec; sessionid=0b6873d7aa4f947b144dd55be06359ec; sessionid_ss=0b6873d7aa4f947b144dd55be06359ec; session_tlb_tag=sttt%7C19%7CC2hz16pPlHsUTdVb4GNZ7P________-tjvJ8OgKw-5e-zmSTtf2yhZkCkLhpu1O7odzc7jAax0U%3D; is_staff_user=false; sid_ucp_v1=1.0.0-KGNhNzQzMDk0ZDliY2QwNzUwYjcxZDllMjQ2YjY5ZWRiNTU2YzdmNjAKHwiu1_Dtg42gARDVrrLMBhifrR8gDDDau4-EBjgIQCYaAmxxIiAwYjY4NzNkN2FhNGY5NDdiMTQ0ZGQ1NWJlMDYzNTllYw; ssid_ucp_v1=1.0.0-KGNhNzQzMDk0ZDliY2QwNzUwYjcxZDllMjQ2YjY5ZWRiNTU2YzdmNjAKHwiu1_Dtg42gARDVrrLMBhifrR8gDDDau4-EBjgIQCYaAmxxIiAwYjY4NzNkN2FhNGY5NDdiMTQ0ZGQ1NWJlMDYzNTllYw; user_spaces_idc={\"6954646182010290440\":\"hl\"}; dm_auid=6T58itIihnmLPAnsov+nbw==; uifid_temp=3d5c832fc871287d7ad4963d32df5aca8803a3d2a91cbed0592bf979487355215fd04954a5e33925193fc7ccbdd29b0b187b8d70ae376168de63643ab93f4025f47b9d1a4279a97bd4b92654a658b2b1; uifid=3d5c832fc871287d7ad4963d32df5aca8803a3d2a91cbed0592bf97948735521edf981832a5888f6de8426836c91e6e7beabc4eefe37adedf77629c420c674607ed44f52dd24901845b3081e04ecdd4837a6214df4a6ad9aa9cb58f1e731d13a4c2ec6dfaa71d3176186a2d994b505fddbdc62288e16eb34dc1ac099f7f4b6f3b86561b64b0ee189a363097d02fb2fd8570b6705b51a000f4d0c19176e726dc678a53a228ece78dd815cad3810392bb6; _v2_spipe_web_id=7606003060459978806; passport_mfa_token=CjjmvrvsaRSDPfoLf%2BDBmLAbuwJJDxiqC%2BHwu9ltw9GEkGilV%2BtOBusKn%2FFCFO6cwlFm6wgWDaK5mRpKCjwAAAAAAAAAAAAAUBQguICbvVY0ipQB7VhbH%2BFMdUuSBjo8WCjfD0mmn2DwVt3%2BYWeWtGtyM3BeLDy6Tw4QuOGJDhj2sdFsIAIiAQPFR%2FhM; _tea_web_id=7605602965571765786; DREAMINA_THEME=dark; odin_tt=24d7444414dbc3444791a95433f4d9953781e8e83bc9ac32cfe82c3f5fdf8dbbcca1d7ae88ef505ae0932f140a6785d9a46a7b376458f8cf2e5642679dca56ed; _uetsid=0cafbb40108711f1a52bb5009fae695d; _uetvid=b3c5085013b011f0a6cf3f171e4de2ae; ttwid=1|WfnGlJxqfilLYF7b-dzgFRlCRoYXBmnbtqai9ntlVwc|1771893824|43ab27aca3313957211fb20ea85fcd44fe2840f6c1e0fb1b2a292d30e1b9af08",
+ "Referer": "https://jimeng.jianying.com/ai-tool/generate?type=image",
+ "Referrer-Policy": "no-referrer-when-downgrade"
+ },
+ "body": "{\"submit_ids\":[\"717c5e9b-d3ff-444d-8d22-85f59dd38da7\"]}",
+ "method": "POST"
+}); ;
+fetch("https://jimeng.jianying.com/commerce/v1/benefits/user_credit_history", {
+ "headers": {
+ "accept": "application/json, text/plain, */*",
+ "accept-language": "zh-CN,zh;q=0.9",
+ "appid": "513695",
+ "appvr": "8.4.0",
+ "cache-control": "no-cache",
+ "content-type": "application/json",
+ "device-time": "1771893851",
+ "lan": "ZH",
+ "pf": "7",
+ "pragma": "no-cache",
+ "priority": "u=1, i",
+ "sec-ch-ua": "\"Not A(Brand\";v=\"8\", \"Chromium\";v=\"132\", \"Google Chrome\";v=\"132\"",
+ "sec-ch-ua-mobile": "?0",
+ "sec-ch-ua-platform": "\"Windows\"",
+ "sec-fetch-dest": "empty",
+ "sec-fetch-mode": "cors",
+ "sec-fetch-site": "same-origin",
+ "sign": "299a9119c3e285cbc08a711e7d563c3e",
+ "sign-ver": "1",
+ "tdid": "",
+ "cookie": "_isHitHomeHeaderRefreshExperiment=1; s_v_web_id=verify_mli2zh09_eQ5L9Cej_bFER_4ccU_9JK5_Ael0lBTb3f1K; COOKIE_CONSENT_PROMPT_CONFIG={%22status%22:1%2C%22settings%22:{%22firstPartyAnalytics%22:true%2C%22GoogleAnalytics%22:true}%2C%22updatedTime%22:1770817444874}; fpk1=148a20cd63817580d8e8d9df32cd9b08f2453b88009c7c8bebd01f333cce15c7626a440c525de2203bdc082bd9051722; passport_csrf_token=ce5085d40c0c9edf5268392eeba6903e; passport_csrf_token_default=ce5085d40c0c9edf5268392eeba6903e; n_mh=xSPw81I4URH-3hVkPcoqGh1J2A7uMjTD8qZw1F59WkQ; sid_guard=0b6873d7aa4f947b144dd55be06359ec%7C1770821461%7C31536000%7CThu%2C+11-Feb-2027+14%3A51%3A01+GMT; uid_tt=7ced300dac82637ad657f41cb285cdfd; uid_tt_ss=7ced300dac82637ad657f41cb285cdfd; sid_tt=0b6873d7aa4f947b144dd55be06359ec; sessionid=0b6873d7aa4f947b144dd55be06359ec; sessionid_ss=0b6873d7aa4f947b144dd55be06359ec; session_tlb_tag=sttt%7C19%7CC2hz16pPlHsUTdVb4GNZ7P________-tjvJ8OgKw-5e-zmSTtf2yhZkCkLhpu1O7odzc7jAax0U%3D; is_staff_user=false; sid_ucp_v1=1.0.0-KGNhNzQzMDk0ZDliY2QwNzUwYjcxZDllMjQ2YjY5ZWRiNTU2YzdmNjAKHwiu1_Dtg42gARDVrrLMBhifrR8gDDDau4-EBjgIQCYaAmxxIiAwYjY4NzNkN2FhNGY5NDdiMTQ0ZGQ1NWJlMDYzNTllYw; ssid_ucp_v1=1.0.0-KGNhNzQzMDk0ZDliY2QwNzUwYjcxZDllMjQ2YjY5ZWRiNTU2YzdmNjAKHwiu1_Dtg42gARDVrrLMBhifrR8gDDDau4-EBjgIQCYaAmxxIiAwYjY4NzNkN2FhNGY5NDdiMTQ0ZGQ1NWJlMDYzNTllYw; user_spaces_idc={\"6954646182010290440\":\"hl\"}; dm_auid=6T58itIihnmLPAnsov+nbw==; uifid_temp=3d5c832fc871287d7ad4963d32df5aca8803a3d2a91cbed0592bf979487355215fd04954a5e33925193fc7ccbdd29b0b187b8d70ae376168de63643ab93f4025f47b9d1a4279a97bd4b92654a658b2b1; uifid=3d5c832fc871287d7ad4963d32df5aca8803a3d2a91cbed0592bf97948735521edf981832a5888f6de8426836c91e6e7beabc4eefe37adedf77629c420c674607ed44f52dd24901845b3081e04ecdd4837a6214df4a6ad9aa9cb58f1e731d13a4c2ec6dfaa71d3176186a2d994b505fddbdc62288e16eb34dc1ac099f7f4b6f3b86561b64b0ee189a363097d02fb2fd8570b6705b51a000f4d0c19176e726dc678a53a228ece78dd815cad3810392bb6; _v2_spipe_web_id=7606003060459978806; passport_mfa_token=CjjmvrvsaRSDPfoLf%2BDBmLAbuwJJDxiqC%2BHwu9ltw9GEkGilV%2BtOBusKn%2FFCFO6cwlFm6wgWDaK5mRpKCjwAAAAAAAAAAAAAUBQguICbvVY0ipQB7VhbH%2BFMdUuSBjo8WCjfD0mmn2DwVt3%2BYWeWtGtyM3BeLDy6Tw4QuOGJDhj2sdFsIAIiAQPFR%2FhM; _tea_web_id=7605602965571765786; DREAMINA_THEME=dark; odin_tt=24d7444414dbc3444791a95433f4d9953781e8e83bc9ac32cfe82c3f5fdf8dbbcca1d7ae88ef505ae0932f140a6785d9a46a7b376458f8cf2e5642679dca56ed; _uetsid=0cafbb40108711f1a52bb5009fae695d; _uetvid=b3c5085013b011f0a6cf3f171e4de2ae; ttwid=1|WfnGlJxqfilLYF7b-dzgFRlCRoYXBmnbtqai9ntlVwc|1771893824|43ab27aca3313957211fb20ea85fcd44fe2840f6c1e0fb1b2a292d30e1b9af08",
+ "Referer": "https://jimeng.jianying.com/ai-tool/generate?type=image",
+ "Referrer-Policy": "no-referrer-when-downgrade"
+ },
+ "body": "{\"count\":20,\"cursor\":\"0\"}",
+ "method": "POST"
+}); ;
+fetch("https://mon.zijieapi.com/monitor_browser/collect/batch/?biz_id=cn_mweb", {
+ "headers": {
+ "accept": "*/*",
+ "accept-language": "zh-CN,zh;q=0.9",
+ "cache-control": "no-cache",
+ "content-type": "application/json",
+ "pragma": "no-cache",
+ "priority": "u=1, i",
+ "sec-ch-ua": "\"Not A(Brand\";v=\"8\", \"Chromium\";v=\"132\", \"Google Chrome\";v=\"132\"",
+ "sec-ch-ua-mobile": "?0",
+ "sec-ch-ua-platform": "\"Windows\"",
+ "sec-fetch-dest": "empty",
+ "sec-fetch-mode": "cors",
+ "sec-fetch-site": "cross-site",
+ "Referer": "https://jimeng.jianying.com/ai-tool/generate?type=image",
+ "Referrer-Policy": "no-referrer-when-downgrade"
+ },
+ "body": "{\"ev_type\":\"batch\",\"list\":[{\"ev_type\":\"http\",\"payload\":{\"api\":\"xhr\",\"request\":{\"url\":\"https://jimeng.jianying.com/mweb/v1/get_history_by_ids?aid=513695&device_platform=web®ion=cn&webId=7605602965571765786&da_version=3.3.9&web_version=7.5.0&aigc_features=app_lip_sync\",\"method\":\"post\",\"headers\":{\"accept\":\"application/json, text/plain, */*\",\"content-type\":\"application/json\",\"x-platform\":\"pc\",\"sign\":\"2134fe58fd9975f7473ab058d4f1dc2c\",\"device-time\":\"1771893851\",\"sign-ver\":\"1\",\"pf\":\"7\",\"appvr\":\"8.4.0\",\"loc\":\"cn\",\"lan\":\"zh-Hans\",\"app-sdk-version\":\"48.0.0\",\"appid\":\"513695\"},\"timestamp\":1771893851271},\"response\":{\"status\":200,\"is_custom_error\":false,\"timestamp\":1771893851605,\"headers\":{\"content-encoding\":\"br\",\"content-type\":\"application/json; charset=utf-8\",\"date\":\"Tue, 24 Feb 2026 00:44:12 GMT\",\"eagleid\":\"79e4822117718938522702269e\",\"server\":\"Tengine\",\"server-timing\":\"inner; dur=231, cdn-cache;desc=MISS,edge;dur=13,origin;dur=300\",\"strict-transport-security\":\"max-age=31536000; includeSubDomains; preload\",\"timing-allow-origin\":\"*\",\"tt_stable\":\"1\",\"vary\":\"Accept-Encoding\",\"via\":\"cache56.l2ea120-5[300,0], cache13.cn3833[313,0]\",\"x-tt-logid\":\"202602240844124D683FEC7687A96D4ED8\",\"x-tt-trace-host\":\"01317a0b267e6f7b60df5311a11f49fe3afe5c6130a10e46061a773db9ee03035212a904bb7e87d4d071aeb6dacfd15f892113bece3ebdb491c13ffea6fe0b111fbb17d707264009ae6c940e4294d1134fcb7862e971133cf17488c6fc01d51591d5ca482a66825c04ea3032d5df0ede4c\",\"x-tt-trace-id\":\"00-2602240844124D683FEC7687A96D4ED8-71F8D87D191C5889-00\",\"x-tt-trace-tag\":\"id=03;cdn-cache=miss;type=dyn\"},\"timing\":{\"name\":\"https://jimeng.jianying.com/mweb/v1/get_history_by_ids?aid=513695&device_platform=web®ion=cn&webId=7605602965571765786&da_version=3.3.9&web_version=7.5.0&aigc_features=app_lip_sync&msToken=ihykpW25F6ZdjhjeVFqU1JlJcnS7q1jpt3V0MMj57KcgSYXexymGclx9WUAZR1KqlKf3iBxnkNxtzZj1u75VJDsZIxv72ralFzbne1AtshBzB1TFg5Ju2A%3D%3D&a_bogus=xfMDkOgXMsm1o%2Fb-AXkz9Hx7cOL0YW-cgZENvydSEzoM\",\"entryType\":\"resource\",\"startTime\":116565.41999999993,\"duration\":331.65500000002794,\"initiatorType\":\"xmlhttprequest\",\"deliveryType\":\"\",\"nextHopProtocol\":\"h2\",\"renderBlockingStatus\":\"non-blocking\",\"workerStart\":0,\"redirectStart\":0,\"redirectEnd\":0,\"fetchStart\":116565.41999999993,\"domainLookupStart\":116565.41999999993,\"domainLookupEnd\":116565.41999999993,\"connectStart\":116565.41999999993,\"secureConnectionStart\":116565.41999999993,\"connectEnd\":116565.41999999993,\"requestStart\":116567.47999999998,\"responseStart\":116895.11999999988,\"firstInterimResponseStart\":0,\"responseEnd\":116897.07499999995,\"transferSize\":4216,\"encodedBodySize\":3916,\"decodedBodySize\":14261,\"responseStatus\":200,\"serverTiming\":[{\"name\":\"inner\",\"duration\":231,\"description\":\"\"},{\"name\":\"cdn-cache\",\"duration\":0,\"description\":\"MISS\"},{\"name\":\"edge\",\"duration\":13,\"description\":\"\"},{\"name\":\"origin\",\"duration\":300,\"description\":\"\"}]}},\"duration\":334},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893851271,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"action_id\":\"91954610-db03-42e5-8e5b-b232ca650032\",\"sdk_offset\":1055.5,\"sample_rate\":1}},{\"ev_type\":\"http\",\"payload\":{\"api\":\"xhr\",\"request\":{\"url\":\"https://jimeng.jianying.com/commerce/v1/benefits/user_credit_history\",\"method\":\"post\",\"headers\":{\"accept\":\"application/json, text/plain, */*\",\"content-type\":\"application/json\",\"appid\":\"513695\",\"lan\":\"ZH\",\"sign\":\"299a9119c3e285cbc08a711e7d563c3e\",\"device-time\":\"1771893851\",\"sign-ver\":\"1\",\"pf\":\"7\",\"appvr\":\"8.4.0\"},\"timestamp\":1771893851613},\"response\":{\"status\":200,\"is_custom_error\":false,\"timestamp\":1771893851724,\"headers\":{\"content-encoding\":\"br\",\"content-type\":\"application/json; charset=utf-8\",\"date\":\"Tue, 24 Feb 2026 00:44:12 GMT\",\"eagleid\":\"79e4822117718938526084569e\",\"server\":\"Tengine\",\"server-timing\":\"inner; dur=30, cdn-cache;desc=MISS,edge;dur=24,origin;dur=71\",\"strict-transport-security\":\"max-age=31536000; includeSubDomains; preload\",\"timing-allow-origin\":\"*\",\"tt_stable\":\"1\",\"vary\":\"Accept-Encoding\",\"via\":\"cache30.l2cm9-6[71,0], cache13.cn3833[95,0]\",\"x-tt-logid\":\"202602240844127609FA1FF19723109AFA\",\"x-tt-trace-host\":\"01317a0b267e6f7b60df5311a11f49fe3a510ec6b138d7c781915b90c5ddb6da5cd74afc2187f46936d13a79f6ea7cc4501583679a00cccc98152a4e5f8ade4402ac5a84fb5ad3122f52f10cc901831da602798a4b558d1a5112640c84de1c90ee9bfd9871c379866d145aeb80c7726fa6\",\"x-tt-trace-id\":\"00-2602240844127609FA1FF19723109AFA-3EE66EC1A5428AAF-00\",\"x-tt-trace-tag\":\"id=03;cdn-cache=miss;type=dyn\"}},\"duration\":111},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893851613,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":1}},{\"ev_type\":\"resource\",\"payload\":{\"name\":\"https://p3-dreamina-sign.byteimg.com/tos-cn-i-tb4s082cfz/1f315f04e5c74478b17c0c11144e92fa~tplv-tb4s082cfz-aigc_resize:360:360.webp?lk3s=43402efa&x-expires=1774224000&x-signature=vC1lCmE%2FWpFIZdAKI7yUmC9sG%2Bs%3D&format=.webp\",\"entryType\":\"resource\",\"startTime\":116972.33000000007,\"duration\":265.4299999999348,\"initiatorType\":\"img\",\"deliveryType\":\"\",\"nextHopProtocol\":\"h2\",\"renderBlockingStatus\":\"non-blocking\",\"workerStart\":0,\"redirectStart\":0,\"redirectEnd\":0,\"fetchStart\":116972.33000000007,\"domainLookupStart\":116972.33000000007,\"domainLookupEnd\":116972.33000000007,\"connectStart\":116972.33000000007,\"secureConnectionStart\":116972.33000000007,\"connectEnd\":116972.33000000007,\"requestStart\":116973.63500000001,\"responseStart\":117235.07000000007,\"firstInterimResponseStart\":0,\"responseEnd\":117237.76000000001,\"transferSize\":12430,\"encodedBodySize\":12130,\"decodedBodySize\":12130,\"responseStatus\":200,\"serverTiming\":[{\"name\":\"inner\",\"duration\":198,\"description\":\"\"},{\"name\":\"cdn-cache\",\"duration\":0,\"description\":\"MISS\"},{\"name\":\"edge\",\"duration\":23,\"description\":\"\"},{\"name\":\"origin\",\"duration\":217,\"description\":\"\"}]},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893851946,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":0.1}}]}",
+ "method": "POST"
+}); ;
+fetch("https://everphoto.jianying.com/sf/5/v5/GetUpdates?aid=324442&space_id=7436736040297038899&cursor=n_7492071223166238732&material=1&abilities=30", {
+ "headers": {
+ "accept": "*/*",
+ "accept-language": "zh-CN,zh;q=0.9",
+ "cache-control": "no-cache",
+ "content-type": "application/json",
+ "expect-real-status": "1",
+ "pragma": "no-cache",
+ "sec-ch-ua": "\"Not A(Brand\";v=\"8\", \"Chromium\";v=\"132\", \"Google Chrome\";v=\"132\"",
+ "sec-ch-ua-mobile": "?0",
+ "sec-ch-ua-platform": "\"Windows\"",
+ "sec-fetch-dest": "empty",
+ "sec-fetch-mode": "cors",
+ "sec-fetch-site": "same-site",
+ "x-ep-thirdparty-uid": "704135154117550",
+ "x-everphoto-global-session-token": "CsABdblQiZw9HNKaE0LbOVLZZaHZCHp1jEHyFNVSZpzEH99Sg4Do1S11PDQi0hq5XNFcmraJZKhWGsiGyH5YaBayggz2cvwHhKoC50CHli+FQXvL5jVsOhxvFaXoSgXHflFxt1Qb0VOYpn66MGHGdIVkkLh4Kz2di/5aZ9FMtggwPrxIT8Wn9Cp2uqxXyma6JOupbg2ygC52SccQbXjXa/zATFafIO55Y59ZzNGpaANAmcoSE/1tz2hwbFWoJ/9Qt6kNGkkKPAAAAAAAAAAAAABQG5LgtCE9i65XVA0wPVUCxHnUNoQ5GX6sgXGnyaCAQWmq0G0nL1Dm3jJv4mBUDmNoOhD0uooOGJqMmcQLIgEDsDnl6BFgVFs=",
+ "cookie": "passport_csrf_token=ce5085d40c0c9edf5268392eeba6903e; passport_csrf_token_default=ce5085d40c0c9edf5268392eeba6903e; n_mh=xSPw81I4URH-3hVkPcoqGh1J2A7uMjTD8qZw1F59WkQ; sid_guard=0b6873d7aa4f947b144dd55be06359ec%7C1770821461%7C31536000%7CThu%2C+11-Feb-2027+14%3A51%3A01+GMT; uid_tt=7ced300dac82637ad657f41cb285cdfd; uid_tt_ss=7ced300dac82637ad657f41cb285cdfd; sid_tt=0b6873d7aa4f947b144dd55be06359ec; sessionid=0b6873d7aa4f947b144dd55be06359ec; sessionid_ss=0b6873d7aa4f947b144dd55be06359ec; session_tlb_tag=sttt%7C19%7CC2hz16pPlHsUTdVb4GNZ7P________-tjvJ8OgKw-5e-zmSTtf2yhZkCkLhpu1O7odzc7jAax0U%3D; is_staff_user=false; sid_ucp_v1=1.0.0-KGNhNzQzMDk0ZDliY2QwNzUwYjcxZDllMjQ2YjY5ZWRiNTU2YzdmNjAKHwiu1_Dtg42gARDVrrLMBhifrR8gDDDau4-EBjgIQCYaAmxxIiAwYjY4NzNkN2FhNGY5NDdiMTQ0ZGQ1NWJlMDYzNTllYw; ssid_ucp_v1=1.0.0-KGNhNzQzMDk0ZDliY2QwNzUwYjcxZDllMjQ2YjY5ZWRiNTU2YzdmNjAKHwiu1_Dtg42gARDVrrLMBhifrR8gDDDau4-EBjgIQCYaAmxxIiAwYjY4NzNkN2FhNGY5NDdiMTQ0ZGQ1NWJlMDYzNTllYw; passport_mfa_token=CjjmvrvsaRSDPfoLf%2BDBmLAbuwJJDxiqC%2BHwu9ltw9GEkGilV%2BtOBusKn%2FFCFO6cwlFm6wgWDaK5mRpKCjwAAAAAAAAAAAAAUBQguICbvVY0ipQB7VhbH%2BFMdUuSBjo8WCjfD0mmn2DwVt3%2BYWeWtGtyM3BeLDy6Tw4QuOGJDhj2sdFsIAIiAQPFR%2FhM; odin_tt=24d7444414dbc3444791a95433f4d9953781e8e83bc9ac32cfe82c3f5fdf8dbbcca1d7ae88ef505ae0932f140a6785d9a46a7b376458f8cf2e5642679dca56ed; _uetsid=0cafbb40108711f1a52bb5009fae695d; _uetvid=b3c5085013b011f0a6cf3f171e4de2ae; ttwid=1|WfnGlJxqfilLYF7b-dzgFRlCRoYXBmnbtqai9ntlVwc|1771893824|43ab27aca3313957211fb20ea85fcd44fe2840f6c1e0fb1b2a292d30e1b9af08",
+ "Referer": "https://jimeng.jianying.com/ai-tool/generate?type=image",
+ "Referrer-Policy": "no-referrer-when-downgrade"
+ },
+ "body": null,
+ "method": "GET"
+}); ;
+fetch("https://jimeng.jianying.com/mweb/v1/get_unread_count?aid=513695&web_version=7.5.0&da_version=3.3.9&aigc_features=app_lip_sync", {
+ "headers": {
+ "accept": "application/json, text/plain, */*",
+ "accept-language": "zh-CN,zh;q=0.9",
+ "app-sdk-version": "48.0.0",
+ "appid": "513695",
+ "appvr": "8.4.0",
+ "cache-control": "no-cache",
+ "content-type": "application/json",
+ "device-time": "1771893859",
+ "lan": "zh-Hans",
+ "loc": "cn",
+ "pf": "7",
+ "pragma": "no-cache",
+ "priority": "u=1, i",
+ "sec-ch-ua": "\"Not A(Brand\";v=\"8\", \"Chromium\";v=\"132\", \"Google Chrome\";v=\"132\"",
+ "sec-ch-ua-mobile": "?0",
+ "sec-ch-ua-platform": "\"Windows\"",
+ "sec-fetch-dest": "empty",
+ "sec-fetch-mode": "cors",
+ "sec-fetch-site": "same-origin",
+ "sign": "ebbac26279a528b6ca2a2a091d65aa16",
+ "sign-ver": "1",
+ "tdid": "",
+ "cookie": "_isHitHomeHeaderRefreshExperiment=1; s_v_web_id=verify_mli2zh09_eQ5L9Cej_bFER_4ccU_9JK5_Ael0lBTb3f1K; COOKIE_CONSENT_PROMPT_CONFIG={%22status%22:1%2C%22settings%22:{%22firstPartyAnalytics%22:true%2C%22GoogleAnalytics%22:true}%2C%22updatedTime%22:1770817444874}; fpk1=148a20cd63817580d8e8d9df32cd9b08f2453b88009c7c8bebd01f333cce15c7626a440c525de2203bdc082bd9051722; passport_csrf_token=ce5085d40c0c9edf5268392eeba6903e; passport_csrf_token_default=ce5085d40c0c9edf5268392eeba6903e; n_mh=xSPw81I4URH-3hVkPcoqGh1J2A7uMjTD8qZw1F59WkQ; sid_guard=0b6873d7aa4f947b144dd55be06359ec%7C1770821461%7C31536000%7CThu%2C+11-Feb-2027+14%3A51%3A01+GMT; uid_tt=7ced300dac82637ad657f41cb285cdfd; uid_tt_ss=7ced300dac82637ad657f41cb285cdfd; sid_tt=0b6873d7aa4f947b144dd55be06359ec; sessionid=0b6873d7aa4f947b144dd55be06359ec; sessionid_ss=0b6873d7aa4f947b144dd55be06359ec; session_tlb_tag=sttt%7C19%7CC2hz16pPlHsUTdVb4GNZ7P________-tjvJ8OgKw-5e-zmSTtf2yhZkCkLhpu1O7odzc7jAax0U%3D; is_staff_user=false; sid_ucp_v1=1.0.0-KGNhNzQzMDk0ZDliY2QwNzUwYjcxZDllMjQ2YjY5ZWRiNTU2YzdmNjAKHwiu1_Dtg42gARDVrrLMBhifrR8gDDDau4-EBjgIQCYaAmxxIiAwYjY4NzNkN2FhNGY5NDdiMTQ0ZGQ1NWJlMDYzNTllYw; ssid_ucp_v1=1.0.0-KGNhNzQzMDk0ZDliY2QwNzUwYjcxZDllMjQ2YjY5ZWRiNTU2YzdmNjAKHwiu1_Dtg42gARDVrrLMBhifrR8gDDDau4-EBjgIQCYaAmxxIiAwYjY4NzNkN2FhNGY5NDdiMTQ0ZGQ1NWJlMDYzNTllYw; user_spaces_idc={\"6954646182010290440\":\"hl\"}; dm_auid=6T58itIihnmLPAnsov+nbw==; uifid_temp=3d5c832fc871287d7ad4963d32df5aca8803a3d2a91cbed0592bf979487355215fd04954a5e33925193fc7ccbdd29b0b187b8d70ae376168de63643ab93f4025f47b9d1a4279a97bd4b92654a658b2b1; uifid=3d5c832fc871287d7ad4963d32df5aca8803a3d2a91cbed0592bf97948735521edf981832a5888f6de8426836c91e6e7beabc4eefe37adedf77629c420c674607ed44f52dd24901845b3081e04ecdd4837a6214df4a6ad9aa9cb58f1e731d13a4c2ec6dfaa71d3176186a2d994b505fddbdc62288e16eb34dc1ac099f7f4b6f3b86561b64b0ee189a363097d02fb2fd8570b6705b51a000f4d0c19176e726dc678a53a228ece78dd815cad3810392bb6; _v2_spipe_web_id=7606003060459978806; passport_mfa_token=CjjmvrvsaRSDPfoLf%2BDBmLAbuwJJDxiqC%2BHwu9ltw9GEkGilV%2BtOBusKn%2FFCFO6cwlFm6wgWDaK5mRpKCjwAAAAAAAAAAAAAUBQguICbvVY0ipQB7VhbH%2BFMdUuSBjo8WCjfD0mmn2DwVt3%2BYWeWtGtyM3BeLDy6Tw4QuOGJDhj2sdFsIAIiAQPFR%2FhM; _tea_web_id=7605602965571765786; DREAMINA_THEME=dark; odin_tt=24d7444414dbc3444791a95433f4d9953781e8e83bc9ac32cfe82c3f5fdf8dbbcca1d7ae88ef505ae0932f140a6785d9a46a7b376458f8cf2e5642679dca56ed; _uetsid=0cafbb40108711f1a52bb5009fae695d; _uetvid=b3c5085013b011f0a6cf3f171e4de2ae; ttwid=1|WfnGlJxqfilLYF7b-dzgFRlCRoYXBmnbtqai9ntlVwc|1771893824|43ab27aca3313957211fb20ea85fcd44fe2840f6c1e0fb1b2a292d30e1b9af08",
+ "Referer": "https://jimeng.jianying.com/ai-tool/generate?type=image",
+ "Referrer-Policy": "no-referrer-when-downgrade"
+ },
+ "body": "{\"notice_type_list\":[2,1]}",
+ "method": "POST"
+}); ;
+fetch("https://mcs.zijieapi.com/list", {
+ "headers": {
+ "accept": "*/*",
+ "accept-language": "zh-CN,zh;q=0.9",
+ "cache-control": "no-cache",
+ "content-type": "application/json; charset=UTF-8",
+ "pragma": "no-cache",
+ "priority": "u=1, i",
+ "sec-ch-ua": "\"Not A(Brand\";v=\"8\", \"Chromium\";v=\"132\", \"Google Chrome\";v=\"132\"",
+ "sec-ch-ua-mobile": "?0",
+ "sec-ch-ua-platform": "\"Windows\"",
+ "sec-fetch-dest": "empty",
+ "sec-fetch-mode": "cors",
+ "sec-fetch-site": "cross-site",
+ "Referer": "https://jimeng.jianying.com/ai-tool/generate?type=image",
+ "Referrer-Policy": "no-referrer-when-downgrade"
+ },
+ "body": "[{\"events\":[{\"event\":\"evpt_Sync_pullResult\",\"params\":\"{\\\"_staging_flag\\\":0,\\\"is_vip\\\":1,\\\"user_subscribe_type\\\":\\\"standard\\\",\\\"url_path\\\":\\\"/ai-tool/generate\\\",\\\"referrer\\\":\\\"/home/\\\",\\\"page\\\":\\\"generation\\\",\\\"message\\\":\\\"success\\\",\\\"entriesCount\\\":0,\\\"code\\\":0,\\\"duration\\\":211,\\\"initially\\\":0,\\\"hasNewData\\\":0,\\\"assetsCount\\\":0,\\\"packagesCount\\\":0,\\\"event_index\\\":1771894585757}\",\"local_time_ms\":1771893859154,\"is_bav\":0,\"ab_sdk_version\":\"91249282,14674564,13753331,15628237,15174027,15174145,15170779,15407184,15567817,15504129,15481561\",\"session_id\":\"95ac96eb-cba1-47fe-94a4-fbc644d0f38b\"},{\"event\":\"evpt_Sync_pullResult\",\"params\":\"{\\\"_staging_flag\\\":0,\\\"is_vip\\\":1,\\\"user_subscribe_type\\\":\\\"standard\\\",\\\"url_path\\\":\\\"/ai-tool/generate\\\",\\\"referrer\\\":\\\"/home/\\\",\\\"page\\\":\\\"generation\\\",\\\"message\\\":\\\"success\\\",\\\"code\\\":0,\\\"duration\\\":211,\\\"assetsCount\\\":0,\\\"packagesCount\\\":0,\\\"entriesCount\\\":0,\\\"hasNewData\\\":0,\\\"initially\\\":0,\\\"event_index\\\":1771894585756}\",\"local_time_ms\":1771893859154,\"is_bav\":0,\"ab_sdk_version\":\"91249282,14674564,13753331,15628237,15174027,15174145,15170779,15407184,15567817,15504129,15481561\",\"session_id\":\"95ac96eb-cba1-47fe-94a4-fbc644d0f38b\"}],\"user\":{\"user_unique_id\":\"704135154117550\",\"user_type\":12,\"user_id\":\"704135154117550\",\"user_is_login\":true,\"web_id\":\"7605602965571765786\"},\"header\":{\"app_id\":513695,\"app_version\":\"0.1.0\",\"os_name\":\"windows\",\"os_version\":\"10\",\"device_model\":\"Windows NT 10.0\",\"language\":\"zh-Hans\",\"platform\":\"web\",\"sdk_version\":\"5.0.53\",\"sdk_lib\":\"js\",\"timezone\":8,\"tz_offset\":-28800,\"resolution\":\"1536x864\",\"browser\":\"Chrome\",\"browser_version\":\"132.0.0.0\",\"referrer\":\"\",\"referrer_host\":\"\",\"width\":1536,\"height\":864,\"screen_width\":1536,\"screen_height\":864,\"tracer_data\":\"{\\\"$utm_from_url\\\":1}\",\"custom\":\"{\\\"channel_level1\\\":\\\"Direct\\\",\\\"channel_level2\\\":\\\"enter_url\\\",\\\"channel_level3\\\":\\\"\\\",\\\"channel_level4\\\":\\\"\\\",\\\"channel_from\\\":\\\"ut\\\",\\\"session_start_url\\\":\\\"https://jimeng.jianying.com/ai-tool/home/\\\",\\\"branch\\\":\\\"release/950\\\",\\\"theme_mode\\\":\\\"dark\\\",\\\"resolution\\\":480,\\\"gpu_exist\\\":\\\"1\\\",\\\"network_type\\\":\\\"4g\\\",\\\"downlink\\\":10,\\\"rtt\\\":0,\\\"web_id\\\":\\\"7605602965571765786\\\",\\\"is_new_framework\\\":1,\\\"store_country\\\":\\\"CN\\\",\\\"language\\\":\\\"zh-Hans\\\",\\\"is_vip\\\":1,\\\"user_subscribe_type\\\":\\\"standard\\\"}\"},\"local_time\":1771893861,\"verbose\":1}]",
+ "method": "POST"
+}); ;
+fetch("https://p3-dreamina-sign.byteimg.com/tos-cn-i-tb4s082cfz/1f315f04e5c74478b17c0c11144e92fa~tplv-tb4s082cfz-aigc_resize:360:360.webp?lk3s=43402efa&x-expires=1774224000&x-signature=vC1lCmE%2FWpFIZdAKI7yUmC9sG%2Bs%3D&format=.webp", {
+ "headers": {
+ "accept": "*/*",
+ "accept-language": "zh-CN,zh;q=0.9",
+ "cache-control": "no-cache",
+ "pragma": "no-cache",
+ "priority": "u=1, i",
+ "sec-ch-ua": "\"Not A(Brand\";v=\"8\", \"Chromium\";v=\"132\", \"Google Chrome\";v=\"132\"",
+ "sec-ch-ua-mobile": "?0",
+ "sec-ch-ua-platform": "\"Windows\"",
+ "sec-fetch-dest": "empty",
+ "sec-fetch-mode": "cors",
+ "sec-fetch-site": "cross-site",
+ "Referer": "https://jimeng.jianying.com/ai-tool/generate?type=image",
+ "Referrer-Policy": "no-referrer-when-downgrade"
+ },
+ "body": null,
+ "method": "GET"
+}); ;
+fetch("https://mcs.zijieapi.com/list", {
+ "headers": {
+ "accept": "*/*",
+ "accept-language": "zh-CN,zh;q=0.9",
+ "cache-control": "no-cache",
+ "content-type": "application/json; charset=UTF-8",
+ "pragma": "no-cache",
+ "priority": "u=1, i",
+ "sec-ch-ua": "\"Not A(Brand\";v=\"8\", \"Chromium\";v=\"132\", \"Google Chrome\";v=\"132\"",
+ "sec-ch-ua-mobile": "?0",
+ "sec-ch-ua-platform": "\"Windows\"",
+ "sec-fetch-dest": "empty",
+ "sec-fetch-mode": "cors",
+ "sec-fetch-site": "cross-site",
+ "Referer": "https://jimeng.jianying.com/ai-tool/generate?type=image",
+ "Referrer-Policy": "no-referrer-when-downgrade"
+ },
+ "body": "[{\"events\":[{\"event\":\"abtest_exposure\",\"ab_sdk_version\":\"14902980\",\"params\":\"{\\\"ab_url\\\":\\\"https://jimeng.jianying.com/ai-tool/generate?type=image\\\"}\",\"local_time_ms\":1771893863965}],\"user\":{\"user_unique_id\":\"704135154117550\",\"user_type\":12,\"user_id\":\"704135154117550\",\"user_is_login\":true,\"web_id\":\"7605602965571765786\"},\"header\":{\"app_id\":513695,\"app_version\":\"0.1.0\",\"os_name\":\"windows\",\"os_version\":\"10\",\"device_model\":\"Windows NT 10.0\",\"language\":\"zh-Hans\",\"platform\":\"web\",\"sdk_version\":\"5.0.53\",\"sdk_lib\":\"js\",\"timezone\":8,\"tz_offset\":-28800,\"resolution\":\"1536x864\",\"browser\":\"Chrome\",\"browser_version\":\"132.0.0.0\",\"referrer\":\"\",\"referrer_host\":\"\",\"width\":1536,\"height\":864,\"screen_width\":1536,\"screen_height\":864,\"tracer_data\":\"{\\\"$utm_from_url\\\":1}\",\"custom\":\"{\\\"channel_level1\\\":\\\"Direct\\\",\\\"channel_level2\\\":\\\"enter_url\\\",\\\"channel_level3\\\":\\\"\\\",\\\"channel_level4\\\":\\\"\\\",\\\"channel_from\\\":\\\"ut\\\",\\\"session_start_url\\\":\\\"https://jimeng.jianying.com/ai-tool/home/\\\",\\\"branch\\\":\\\"release/950\\\",\\\"theme_mode\\\":\\\"dark\\\",\\\"resolution\\\":480,\\\"gpu_exist\\\":\\\"1\\\",\\\"network_type\\\":\\\"4g\\\",\\\"downlink\\\":10,\\\"rtt\\\":0,\\\"web_id\\\":\\\"7605602965571765786\\\",\\\"is_new_framework\\\":1,\\\"store_country\\\":\\\"CN\\\",\\\"language\\\":\\\"zh-Hans\\\",\\\"is_vip\\\":1,\\\"user_subscribe_type\\\":\\\"standard\\\"}\"}},{\"events\":[{\"event\":\"abtest_exposure\",\"ab_sdk_version\":\"15407184\",\"params\":\"{\\\"ab_url\\\":\\\"https://jimeng.jianying.com/ai-tool/generate?type=image\\\"}\",\"local_time_ms\":1771893864002}],\"user\":{\"user_unique_id\":\"704135154117550\",\"user_type\":12,\"user_id\":\"704135154117550\",\"user_is_login\":true,\"web_id\":\"7605602965571765786\"},\"header\":{\"app_id\":513695,\"app_version\":\"0.1.0\",\"os_name\":\"windows\",\"os_version\":\"10\",\"device_model\":\"Windows NT 10.0\",\"language\":\"zh-Hans\",\"platform\":\"web\",\"sdk_version\":\"5.0.53\",\"sdk_lib\":\"js\",\"timezone\":8,\"tz_offset\":-28800,\"resolution\":\"1536x864\",\"browser\":\"Chrome\",\"browser_version\":\"132.0.0.0\",\"referrer\":\"\",\"referrer_host\":\"\",\"width\":1536,\"height\":864,\"screen_width\":1536,\"screen_height\":864,\"tracer_data\":\"{\\\"$utm_from_url\\\":1}\",\"custom\":\"{\\\"channel_level1\\\":\\\"Direct\\\",\\\"channel_level2\\\":\\\"enter_url\\\",\\\"channel_level3\\\":\\\"\\\",\\\"channel_level4\\\":\\\"\\\",\\\"channel_from\\\":\\\"ut\\\",\\\"session_start_url\\\":\\\"https://jimeng.jianying.com/ai-tool/home/\\\",\\\"branch\\\":\\\"release/950\\\",\\\"theme_mode\\\":\\\"dark\\\",\\\"resolution\\\":480,\\\"gpu_exist\\\":\\\"1\\\",\\\"network_type\\\":\\\"4g\\\",\\\"downlink\\\":10,\\\"rtt\\\":0,\\\"web_id\\\":\\\"7605602965571765786\\\",\\\"is_new_framework\\\":1,\\\"store_country\\\":\\\"CN\\\",\\\"language\\\":\\\"zh-Hans\\\",\\\"is_vip\\\":1,\\\"user_subscribe_type\\\":\\\"standard\\\"}\"}}]",
+ "method": "POST"
+}); ;
+fetch("https://mcs.zijieapi.com/list", {
+ "headers": {
+ "accept": "*/*",
+ "accept-language": "zh-CN,zh;q=0.9",
+ "cache-control": "no-cache",
+ "content-type": "application/json; charset=UTF-8",
+ "pragma": "no-cache",
+ "priority": "u=1, i",
+ "sec-ch-ua": "\"Not A(Brand\";v=\"8\", \"Chromium\";v=\"132\", \"Google Chrome\";v=\"132\"",
+ "sec-ch-ua-mobile": "?0",
+ "sec-ch-ua-platform": "\"Windows\"",
+ "sec-fetch-dest": "empty",
+ "sec-fetch-mode": "cors",
+ "sec-fetch-site": "cross-site",
+ "Referer": "https://jimeng.jianying.com/ai-tool/generate?type=image",
+ "Referrer-Policy": "no-referrer-when-downgrade"
+ },
+ "body": "[{\"events\":[{\"event\":\"vip_function_details\",\"params\":\"{\\\"_staging_flag\\\":0,\\\"is_vip\\\":1,\\\"user_subscribe_type\\\":\\\"standard\\\",\\\"url_path\\\":\\\"/ai-tool/generate\\\",\\\"referrer\\\":\\\"/home/\\\",\\\"page\\\":\\\"generation\\\",\\\"action\\\":\\\"show\\\",\\\"enter_source\\\":\\\"remove_watermark_detailed_download\\\",\\\"right_id\\\":\\\"remove_watermark\\\",\\\"right_type\\\":\\\"remove_watermark\\\",\\\"right_main_type\\\":\\\"function\\\",\\\"right_is_aigc\\\":\\\"0\\\",\\\"right_block_type\\\":\\\"click\\\",\\\"right_count_type\\\":\\\"times\\\",\\\"right_subscribe_type\\\":\\\"free\\\",\\\"right_oneoff_mix_type\\\":\\\"free\\\",\\\"right_is_trial\\\":\\\"1\\\",\\\"right_trial_mode\\\":\\\"period_trial\\\",\\\"right_trial_type\\\":\\\"limit_times\\\",\\\"right_trial_limit_left\\\":\\\"-1\\\",\\\"event_index\\\":1771894585759}\",\"local_time_ms\":1771893864026,\"is_bav\":0,\"ab_sdk_version\":\"91249282,14674564,13753331,15628237,15174027,15174145,15170779,15407184,15567817,15504129,15481561,14902980\",\"session_id\":\"95ac96eb-cba1-47fe-94a4-fbc644d0f38b\"},{\"event\":\"vip_function_details\",\"params\":\"{\\\"_staging_flag\\\":0,\\\"is_vip\\\":1,\\\"user_subscribe_type\\\":\\\"standard\\\",\\\"url_path\\\":\\\"/ai-tool/generate\\\",\\\"referrer\\\":\\\"/home/\\\",\\\"page\\\":\\\"generation\\\",\\\"action\\\":\\\"show\\\",\\\"enter_source\\\":\\\"remove_watermark_gallery_download\\\",\\\"right_id\\\":\\\"remove_watermark\\\",\\\"right_type\\\":\\\"remove_watermark\\\",\\\"right_main_type\\\":\\\"function\\\",\\\"right_is_aigc\\\":\\\"0\\\",\\\"right_block_type\\\":\\\"click\\\",\\\"right_count_type\\\":\\\"times\\\",\\\"right_subscribe_type\\\":\\\"free\\\",\\\"right_oneoff_mix_type\\\":\\\"free\\\",\\\"right_is_trial\\\":\\\"1\\\",\\\"right_trial_mode\\\":\\\"period_trial\\\",\\\"right_trial_type\\\":\\\"limit_times\\\",\\\"right_trial_limit_left\\\":\\\"-1\\\",\\\"event_index\\\":1771894585758}\",\"local_time_ms\":1771893862727,\"is_bav\":0,\"ab_sdk_version\":\"91249282,14674564,13753331,15628237,15174027,15174145,15170779,15407184,15567817,15504129,15481561,14902980\",\"session_id\":\"95ac96eb-cba1-47fe-94a4-fbc644d0f38b\"}],\"user\":{\"user_unique_id\":\"704135154117550\",\"user_type\":12,\"user_id\":\"704135154117550\",\"user_is_login\":true,\"web_id\":\"7605602965571765786\"},\"header\":{\"app_id\":513695,\"app_version\":\"0.1.0\",\"os_name\":\"windows\",\"os_version\":\"10\",\"device_model\":\"Windows NT 10.0\",\"language\":\"zh-Hans\",\"platform\":\"web\",\"sdk_version\":\"5.0.53\",\"sdk_lib\":\"js\",\"timezone\":8,\"tz_offset\":-28800,\"resolution\":\"1536x864\",\"browser\":\"Chrome\",\"browser_version\":\"132.0.0.0\",\"referrer\":\"\",\"referrer_host\":\"\",\"width\":1536,\"height\":864,\"screen_width\":1536,\"screen_height\":864,\"tracer_data\":\"{\\\"$utm_from_url\\\":1}\",\"custom\":\"{\\\"channel_level1\\\":\\\"Direct\\\",\\\"channel_level2\\\":\\\"enter_url\\\",\\\"channel_level3\\\":\\\"\\\",\\\"channel_level4\\\":\\\"\\\",\\\"channel_from\\\":\\\"ut\\\",\\\"session_start_url\\\":\\\"https://jimeng.jianying.com/ai-tool/home/\\\",\\\"branch\\\":\\\"release/950\\\",\\\"theme_mode\\\":\\\"dark\\\",\\\"resolution\\\":480,\\\"gpu_exist\\\":\\\"1\\\",\\\"network_type\\\":\\\"4g\\\",\\\"downlink\\\":10,\\\"rtt\\\":0,\\\"web_id\\\":\\\"7605602965571765786\\\",\\\"is_new_framework\\\":1,\\\"store_country\\\":\\\"CN\\\",\\\"language\\\":\\\"zh-Hans\\\",\\\"is_vip\\\":1,\\\"user_subscribe_type\\\":\\\"standard\\\"}\"},\"local_time\":1771893866,\"verbose\":1}]",
+ "method": "POST"
+}); ;
+fetch("https://jimeng.jianying.com/mweb/v1/get_history_queue_info?aid=513695&web_version=7.5.0&da_version=3.3.9&aigc_features=app_lip_sync&msToken=ihykpW25F6ZdjhjeVFqU1JlJcnS7q1jpt3V0MMj57KcgSYXexymGclx9WUAZR1KqlKf3iBxnkNxtzZj1u75VJDsZIxv72ralFzbne1AtshBzB1TFg5Ju2A%3D%3D&a_bogus=O7lmvcgXMsm1JLj-AXkz9GBYcKD0YW5MgZENvyp7ezq0", {
+ "headers": {
+ "accept": "application/json, text/plain, */*",
+ "accept-language": "zh-CN,zh;q=0.9",
+ "app-sdk-version": "48.0.0",
+ "appid": "513695",
+ "appvr": "8.4.0",
+ "cache-control": "no-cache",
+ "content-type": "application/json",
+ "device-time": "1771893870",
+ "lan": "zh-Hans",
+ "loc": "cn",
+ "pf": "7",
+ "pragma": "no-cache",
+ "priority": "u=1, i",
+ "sec-ch-ua": "\"Not A(Brand\";v=\"8\", \"Chromium\";v=\"132\", \"Google Chrome\";v=\"132\"",
+ "sec-ch-ua-mobile": "?0",
+ "sec-ch-ua-platform": "\"Windows\"",
+ "sec-fetch-dest": "empty",
+ "sec-fetch-mode": "cors",
+ "sec-fetch-site": "same-origin",
+ "sign": "b455ce04243cab9429ffbb87850c5686",
+ "sign-ver": "1",
+ "tdid": "",
+ "cookie": "_isHitHomeHeaderRefreshExperiment=1; s_v_web_id=verify_mli2zh09_eQ5L9Cej_bFER_4ccU_9JK5_Ael0lBTb3f1K; COOKIE_CONSENT_PROMPT_CONFIG={%22status%22:1%2C%22settings%22:{%22firstPartyAnalytics%22:true%2C%22GoogleAnalytics%22:true}%2C%22updatedTime%22:1770817444874}; fpk1=148a20cd63817580d8e8d9df32cd9b08f2453b88009c7c8bebd01f333cce15c7626a440c525de2203bdc082bd9051722; passport_csrf_token=ce5085d40c0c9edf5268392eeba6903e; passport_csrf_token_default=ce5085d40c0c9edf5268392eeba6903e; n_mh=xSPw81I4URH-3hVkPcoqGh1J2A7uMjTD8qZw1F59WkQ; sid_guard=0b6873d7aa4f947b144dd55be06359ec%7C1770821461%7C31536000%7CThu%2C+11-Feb-2027+14%3A51%3A01+GMT; uid_tt=7ced300dac82637ad657f41cb285cdfd; uid_tt_ss=7ced300dac82637ad657f41cb285cdfd; sid_tt=0b6873d7aa4f947b144dd55be06359ec; sessionid=0b6873d7aa4f947b144dd55be06359ec; sessionid_ss=0b6873d7aa4f947b144dd55be06359ec; session_tlb_tag=sttt%7C19%7CC2hz16pPlHsUTdVb4GNZ7P________-tjvJ8OgKw-5e-zmSTtf2yhZkCkLhpu1O7odzc7jAax0U%3D; is_staff_user=false; sid_ucp_v1=1.0.0-KGNhNzQzMDk0ZDliY2QwNzUwYjcxZDllMjQ2YjY5ZWRiNTU2YzdmNjAKHwiu1_Dtg42gARDVrrLMBhifrR8gDDDau4-EBjgIQCYaAmxxIiAwYjY4NzNkN2FhNGY5NDdiMTQ0ZGQ1NWJlMDYzNTllYw; ssid_ucp_v1=1.0.0-KGNhNzQzMDk0ZDliY2QwNzUwYjcxZDllMjQ2YjY5ZWRiNTU2YzdmNjAKHwiu1_Dtg42gARDVrrLMBhifrR8gDDDau4-EBjgIQCYaAmxxIiAwYjY4NzNkN2FhNGY5NDdiMTQ0ZGQ1NWJlMDYzNTllYw; user_spaces_idc={\"6954646182010290440\":\"hl\"}; dm_auid=6T58itIihnmLPAnsov+nbw==; uifid_temp=3d5c832fc871287d7ad4963d32df5aca8803a3d2a91cbed0592bf979487355215fd04954a5e33925193fc7ccbdd29b0b187b8d70ae376168de63643ab93f4025f47b9d1a4279a97bd4b92654a658b2b1; uifid=3d5c832fc871287d7ad4963d32df5aca8803a3d2a91cbed0592bf97948735521edf981832a5888f6de8426836c91e6e7beabc4eefe37adedf77629c420c674607ed44f52dd24901845b3081e04ecdd4837a6214df4a6ad9aa9cb58f1e731d13a4c2ec6dfaa71d3176186a2d994b505fddbdc62288e16eb34dc1ac099f7f4b6f3b86561b64b0ee189a363097d02fb2fd8570b6705b51a000f4d0c19176e726dc678a53a228ece78dd815cad3810392bb6; _v2_spipe_web_id=7606003060459978806; passport_mfa_token=CjjmvrvsaRSDPfoLf%2BDBmLAbuwJJDxiqC%2BHwu9ltw9GEkGilV%2BtOBusKn%2FFCFO6cwlFm6wgWDaK5mRpKCjwAAAAAAAAAAAAAUBQguICbvVY0ipQB7VhbH%2BFMdUuSBjo8WCjfD0mmn2DwVt3%2BYWeWtGtyM3BeLDy6Tw4QuOGJDhj2sdFsIAIiAQPFR%2FhM; _tea_web_id=7605602965571765786; DREAMINA_THEME=dark; odin_tt=24d7444414dbc3444791a95433f4d9953781e8e83bc9ac32cfe82c3f5fdf8dbbcca1d7ae88ef505ae0932f140a6785d9a46a7b376458f8cf2e5642679dca56ed; _uetsid=0cafbb40108711f1a52bb5009fae695d; _uetvid=b3c5085013b011f0a6cf3f171e4de2ae; ttwid=1|WfnGlJxqfilLYF7b-dzgFRlCRoYXBmnbtqai9ntlVwc|1771893824|43ab27aca3313957211fb20ea85fcd44fe2840f6c1e0fb1b2a292d30e1b9af08",
+ "Referer": "https://jimeng.jianying.com/ai-tool/generate?type=image",
+ "Referrer-Policy": "no-referrer-when-downgrade"
+ },
+ "body": "{\"history_ids\":[\"13489993616908\"]}",
+ "method": "POST"
+}); ;
+fetch("https://mcs.zijieapi.com/list", {
+ "headers": {
+ "accept": "*/*",
+ "accept-language": "zh-CN,zh;q=0.9",
+ "cache-control": "no-cache",
+ "content-type": "application/json; charset=UTF-8",
+ "pragma": "no-cache",
+ "priority": "u=1, i",
+ "sec-ch-ua": "\"Not A(Brand\";v=\"8\", \"Chromium\";v=\"132\", \"Google Chrome\";v=\"132\"",
+ "sec-ch-ua-mobile": "?0",
+ "sec-ch-ua-platform": "\"Windows\"",
+ "sec-fetch-dest": "empty",
+ "sec-fetch-mode": "cors",
+ "sec-fetch-site": "cross-site",
+ "Referer": "https://jimeng.jianying.com/ai-tool/generate?type=image",
+ "Referrer-Policy": "no-referrer-when-downgrade"
+ },
+ "body": "[{\"events\":[{\"event\":\"generate_status_more\",\"params\":\"{\\\"_staging_flag\\\":0,\\\"is_vip\\\":1,\\\"user_subscribe_type\\\":\\\"standard\\\",\\\"url_path\\\":\\\"/ai-tool/generate\\\",\\\"referrer\\\":\\\"/home/\\\",\\\"page\\\":\\\"generation\\\",\\\"status\\\":\\\"generating\\\",\\\"submit_id\\\":\\\"717c5e9b-d3ff-444d-8d22-85f59dd38da7\\\",\\\"generate_id\\\":\\\"20260224084347D8F218F0D45862717C7C\\\",\\\"picture_id\\\":\\\"7610225894170348838\\\",\\\"event_index\\\":1771894585760}\",\"local_time_ms\":1771893870253,\"is_bav\":0,\"ab_sdk_version\":\"91249282,14674564,13753331,15628237,15174027,15174145,15170779,15407184,15567817,15504129,15481561,14902980\",\"session_id\":\"95ac96eb-cba1-47fe-94a4-fbc644d0f38b\"}],\"user\":{\"user_unique_id\":\"704135154117550\",\"user_type\":12,\"user_id\":\"704135154117550\",\"user_is_login\":true,\"web_id\":\"7605602965571765786\"},\"header\":{\"app_id\":513695,\"app_version\":\"0.1.0\",\"os_name\":\"windows\",\"os_version\":\"10\",\"device_model\":\"Windows NT 10.0\",\"language\":\"zh-Hans\",\"platform\":\"web\",\"sdk_version\":\"5.0.53\",\"sdk_lib\":\"js\",\"timezone\":8,\"tz_offset\":-28800,\"resolution\":\"1536x864\",\"browser\":\"Chrome\",\"browser_version\":\"132.0.0.0\",\"referrer\":\"\",\"referrer_host\":\"\",\"width\":1536,\"height\":864,\"screen_width\":1536,\"screen_height\":864,\"tracer_data\":\"{\\\"$utm_from_url\\\":1}\",\"custom\":\"{\\\"channel_level1\\\":\\\"Direct\\\",\\\"channel_level2\\\":\\\"enter_url\\\",\\\"channel_level3\\\":\\\"\\\",\\\"channel_level4\\\":\\\"\\\",\\\"channel_from\\\":\\\"ut\\\",\\\"session_start_url\\\":\\\"https://jimeng.jianying.com/ai-tool/home/\\\",\\\"branch\\\":\\\"release/950\\\",\\\"theme_mode\\\":\\\"dark\\\",\\\"resolution\\\":480,\\\"gpu_exist\\\":\\\"1\\\",\\\"network_type\\\":\\\"4g\\\",\\\"downlink\\\":10,\\\"rtt\\\":0,\\\"web_id\\\":\\\"7605602965571765786\\\",\\\"is_new_framework\\\":1,\\\"store_country\\\":\\\"CN\\\",\\\"language\\\":\\\"zh-Hans\\\",\\\"is_vip\\\":1,\\\"user_subscribe_type\\\":\\\"standard\\\"}\"},\"local_time\":1771893872,\"verbose\":1}]",
+ "method": "POST"
+}); ;
+fetch("https://p3-dreamina-sign.byteimg.com/tos-cn-i-tb4s082cfz/52d4e578519c4057906a6ed43f78036f~tplv-tb4s082cfz-aigc_resize:360:360.webp?lk3s=43402efa&x-expires=1774224000&x-signature=QHNJxJ8LLBzBfhWR80cTsEwVu60%3D&format=.webp", {
+ "headers": {
+ "accept": "*/*",
+ "accept-language": "zh-CN,zh;q=0.9",
+ "cache-control": "no-cache",
+ "pragma": "no-cache",
+ "priority": "u=1, i",
+ "sec-ch-ua": "\"Not A(Brand\";v=\"8\", \"Chromium\";v=\"132\", \"Google Chrome\";v=\"132\"",
+ "sec-ch-ua-mobile": "?0",
+ "sec-ch-ua-platform": "\"Windows\"",
+ "sec-fetch-dest": "empty",
+ "sec-fetch-mode": "cors",
+ "sec-fetch-site": "cross-site",
+ "Referer": "https://jimeng.jianying.com/ai-tool/generate?type=image",
+ "Referrer-Policy": "no-referrer-when-downgrade"
+ },
+ "body": null,
+ "method": "GET"
+}); ;
+fetch("https://mcs.zijieapi.com/list", {
+ "headers": {
+ "accept": "*/*",
+ "accept-language": "zh-CN,zh;q=0.9",
+ "cache-control": "no-cache",
+ "content-type": "application/json; charset=UTF-8",
+ "pragma": "no-cache",
+ "priority": "u=1, i",
+ "sec-ch-ua": "\"Not A(Brand\";v=\"8\", \"Chromium\";v=\"132\", \"Google Chrome\";v=\"132\"",
+ "sec-ch-ua-mobile": "?0",
+ "sec-ch-ua-platform": "\"Windows\"",
+ "sec-fetch-dest": "empty",
+ "sec-fetch-mode": "cors",
+ "sec-fetch-site": "cross-site",
+ "Referer": "https://jimeng.jianying.com/ai-tool/generate?type=image",
+ "Referrer-Policy": "no-referrer-when-downgrade"
+ },
+ "body": "[{\"events\":[{\"event\":\"page_stay_time\",\"params\":\"{\\\"_staging_flag\\\":0,\\\"is_vip\\\":1,\\\"user_subscribe_type\\\":\\\"standard\\\",\\\"url_path\\\":\\\"/ai-tool/generate\\\",\\\"referrer\\\":\\\"/home/\\\",\\\"page\\\":\\\"generation\\\",\\\"url\\\":\\\"https://jimeng.jianying.com/ai-tool/generate?type=image\\\",\\\"title\\\":\\\"即梦AI - 一站式AI创作平台\\\",\\\"duration\\\":9313,\\\"from\\\":\\\"from-onblur\\\",\\\"event_index\\\":1771894585761}\",\"local_time_ms\":1771893872966,\"is_bav\":0,\"ab_sdk_version\":\"91249282,14674564,13753331,15628237,15174027,15174145,15170779,15407184,15567817,15504129,15481561,14902980\",\"session_id\":\"95ac96eb-cba1-47fe-94a4-fbc644d0f38b\"}],\"user\":{\"user_unique_id\":\"704135154117550\",\"user_type\":12,\"user_id\":\"704135154117550\",\"user_is_login\":true,\"web_id\":\"7605602965571765786\"},\"header\":{\"app_id\":513695,\"app_version\":\"0.1.0\",\"os_name\":\"windows\",\"os_version\":\"10\",\"device_model\":\"Windows NT 10.0\",\"language\":\"zh-Hans\",\"platform\":\"web\",\"sdk_version\":\"5.0.53\",\"sdk_lib\":\"js\",\"timezone\":8,\"tz_offset\":-28800,\"resolution\":\"1536x864\",\"browser\":\"Chrome\",\"browser_version\":\"132.0.0.0\",\"referrer\":\"\",\"referrer_host\":\"\",\"width\":1536,\"height\":864,\"screen_width\":1536,\"screen_height\":864,\"tracer_data\":\"{\\\"$utm_from_url\\\":1}\",\"custom\":\"{\\\"channel_level1\\\":\\\"Direct\\\",\\\"channel_level2\\\":\\\"enter_url\\\",\\\"channel_level3\\\":\\\"\\\",\\\"channel_level4\\\":\\\"\\\",\\\"channel_from\\\":\\\"ut\\\",\\\"session_start_url\\\":\\\"https://jimeng.jianying.com/ai-tool/home/\\\",\\\"branch\\\":\\\"release/950\\\",\\\"theme_mode\\\":\\\"dark\\\",\\\"resolution\\\":480,\\\"gpu_exist\\\":\\\"1\\\",\\\"network_type\\\":\\\"4g\\\",\\\"downlink\\\":10,\\\"rtt\\\":0,\\\"web_id\\\":\\\"7605602965571765786\\\",\\\"is_new_framework\\\":1,\\\"store_country\\\":\\\"CN\\\",\\\"language\\\":\\\"zh-Hans\\\",\\\"is_vip\\\":1,\\\"user_subscribe_type\\\":\\\"standard\\\"}\"},\"local_time\":1771893874,\"verbose\":1}]",
+ "method": "POST"
+}); ;
+fetch("https://mon.zijieapi.com/monitor_browser/collect/batch/?biz_id=cn_mweb", {
+ "headers": {
+ "accept": "*/*",
+ "accept-language": "zh-CN,zh;q=0.9",
+ "cache-control": "no-cache",
+ "content-type": "application/json",
+ "pragma": "no-cache",
+ "priority": "u=1, i",
+ "sec-ch-ua": "\"Not A(Brand\";v=\"8\", \"Chromium\";v=\"132\", \"Google Chrome\";v=\"132\"",
+ "sec-ch-ua-mobile": "?0",
+ "sec-ch-ua-platform": "\"Windows\"",
+ "sec-fetch-dest": "empty",
+ "sec-fetch-mode": "cors",
+ "sec-fetch-site": "cross-site",
+ "Referer": "https://jimeng.jianying.com/ai-tool/generate?type=image",
+ "Referrer-Policy": "no-referrer-when-downgrade"
+ },
+ "body": "{\"ev_type\":\"batch\",\"list\":[{\"ev_type\":\"http\",\"payload\":{\"api\":\"fetch\",\"request\":{\"method\":\"get\",\"timestamp\":1771893858943,\"url\":\"https://everphoto.jianying.com/sf/5/v5/GetUpdates?aid=324442&space_id=7436736040297038899&cursor=n_7492071223166238732&material=1&abilities=30\",\"headers\":{\"content-type\":\"application/json\",\"expect-real-status\":\"1\",\"x-ep-thirdparty-uid\":\"704135154117550\"}},\"response\":{\"status\":200,\"is_custom_error\":false,\"timestamp\":1771893859153,\"headers\":{\"content-type\":\"application/json; charset=utf-8\",\"x-tt-logid\":\"20260224084420111EF5E600153EB6D59D\"},\"timing\":{\"name\":\"https://everphoto.jianying.com/sf/5/v5/GetUpdates?aid=324442&space_id=7436736040297038899&cursor=n_7492071223166238732&material=1&abilities=30\",\"entryType\":\"resource\",\"startTime\":124236.16500000004,\"duration\":206.5700000000652,\"initiatorType\":\"fetch\",\"deliveryType\":\"\",\"nextHopProtocol\":\"\",\"renderBlockingStatus\":\"non-blocking\",\"workerStart\":0,\"redirectStart\":0,\"redirectEnd\":0,\"fetchStart\":124236.16500000004,\"domainLookupStart\":0,\"domainLookupEnd\":0,\"connectStart\":0,\"secureConnectionStart\":0,\"connectEnd\":0,\"requestStart\":0,\"responseStart\":0,\"firstInterimResponseStart\":0,\"responseEnd\":124442.7350000001,\"transferSize\":0,\"encodedBodySize\":0,\"decodedBodySize\":0,\"responseStatus\":200,\"serverTiming\":[]}},\"duration\":210},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893858943,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"action_id\":\"91954610-db03-42e5-8e5b-b232ca650032\",\"sdk_offset\":1055.5,\"sample_rate\":1}},{\"ev_type\":\"http\",\"payload\":{\"api\":\"xhr\",\"request\":{\"url\":\"https://jimeng.jianying.com/mweb/v1/get_unread_count?aid=513695&web_version=7.5.0&da_version=3.3.9&aigc_features=app_lip_sync\",\"method\":\"post\",\"headers\":{\"accept\":\"application/json, text/plain, */*\",\"content-type\":\"application/json\",\"sign\":\"ebbac26279a528b6ca2a2a091d65aa16\",\"device-time\":\"1771893859\",\"sign-ver\":\"1\",\"pf\":\"7\",\"appvr\":\"8.4.0\",\"loc\":\"cn\",\"lan\":\"zh-Hans\",\"app-sdk-version\":\"48.0.0\",\"appid\":\"513695\"},\"timestamp\":1771893859931},\"response\":{\"status\":200,\"is_custom_error\":false,\"timestamp\":1771893860133,\"headers\":{\"content-length\":\"119\",\"content-type\":\"application/json; charset=utf-8\",\"date\":\"Tue, 24 Feb 2026 00:44:21 GMT\",\"eagleid\":\"79e4822117718938609248713e\",\"server\":\"Tengine\",\"server-timing\":\"inner; dur=79, cdn-cache;desc=MISS,edge;dur=51,origin;dur=137\",\"strict-transport-security\":\"max-age=31536000; includeSubDomains; preload\",\"timing-allow-origin\":\"*\",\"tt_stable\":\"1\",\"via\":\"cache8.l2cm9-6[137,0], cache13.cn3833[188,0]\",\"x-tt-logid\":\"202602240844218E901BBAEC05E89CCBD8\",\"x-tt-trace-host\":\"01317a0b267e6f7b60df5311a11f49fe3af7b3ccf4bdd3b3f580d2d4e3af62fe027f16bc54d3808bb989edca9d9ca5d0b22fe45570ac07e06f6a6824669efd1c99118745f8836d32e44153e2f9f187956ce696b667b1bd9155255af74c4a0afe87017c4bdf638546467970bb1065e351b1\",\"x-tt-trace-id\":\"00-2602240844218E901BBAEC05E89CCBD8-76A361A50BFEC0EB-00\",\"x-tt-trace-tag\":\"id=03;cdn-cache=miss;type=dyn\"}},\"duration\":202},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893859931,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":1}},{\"ev_type\":\"resource\",\"payload\":{\"name\":\"https://lf3-lv-buz.vlabstatic.com/obj/image-lvweb-buz/ies/lvweb/dreamina_cn/static/css/async/aigc-data-detail-feature-loader.37763303.css\",\"entryType\":\"resource\",\"startTime\":129227.71500000008,\"duration\":17.12999999988824,\"initiatorType\":\"link\",\"deliveryType\":\"\",\"nextHopProtocol\":\"h2\",\"renderBlockingStatus\":\"non-blocking\",\"workerStart\":0,\"redirectStart\":0,\"redirectEnd\":0,\"fetchStart\":129227.71500000008,\"domainLookupStart\":129227.71500000008,\"domainLookupEnd\":129227.71500000008,\"connectStart\":129227.71500000008,\"secureConnectionStart\":129227.71500000008,\"connectEnd\":129227.71500000008,\"requestStart\":129229.85499999998,\"responseStart\":129241.63500000001,\"firstInterimResponseStart\":0,\"responseEnd\":129244.84499999997,\"transferSize\":7275,\"encodedBodySize\":6975,\"decodedBodySize\":34252,\"responseStatus\":200,\"serverTiming\":[{\"name\":\"inner\",\"duration\":103,\"description\":\"\"}]},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893863954,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"action_id\":\"ef4cffea-6062-4c19-b646-faa89e51d77e\",\"sdk_offset\":1055.5,\"sample_rate\":0.1}},{\"ev_type\":\"resource\",\"payload\":{\"name\":\"https://lf3-lv-buz.vlabstatic.com/obj/image-lvweb-buz/ies/lvweb/dreamina_cn/static/js/async/aigc-data-detail-feature-loader.c47d4725.js\",\"entryType\":\"resource\",\"startTime\":129228.45500000007,\"duration\":17.260000000009313,\"initiatorType\":\"script\",\"deliveryType\":\"\",\"nextHopProtocol\":\"h2\",\"renderBlockingStatus\":\"non-blocking\",\"workerStart\":0,\"redirectStart\":0,\"redirectEnd\":0,\"fetchStart\":129228.45500000007,\"domainLookupStart\":129228.45500000007,\"domainLookupEnd\":129228.45500000007,\"connectStart\":129228.45500000007,\"secureConnectionStart\":129228.45500000007,\"connectEnd\":129228.45500000007,\"requestStart\":129231.81000000006,\"responseStart\":129243.3999999999,\"firstInterimResponseStart\":0,\"responseEnd\":129245.71500000008,\"transferSize\":38054,\"encodedBodySize\":37754,\"decodedBodySize\":141860,\"responseStatus\":200,\"serverTiming\":[{\"name\":\"inner\",\"duration\":5,\"description\":\"\"}]},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893863956,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"action_id\":\"ef4cffea-6062-4c19-b646-faa89e51d77e\",\"sdk_offset\":1055.5,\"sample_rate\":0.1}},{\"ev_type\":\"custom\",\"payload\":{\"content\":\"[dreamina-global-logger][2/24/2026, 8:44:23 AM]获取应用下载配置失败: Error: 获取应用下载配置失败\",\"type\":\"log\",\"level\":\"error\",\"metrics\":{},\"categories\":{\"branch\":\"release/950\"}},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893863966,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"action_id\":\"ef4cffea-6062-4c19-b646-faa89e51d77e\",\"sdk_offset\":1055.5,\"sample_rate\":1}},{\"ev_type\":\"custom\",\"payload\":{\"content\":\"[dreamina-global-logger][2/24/2026, 8:44:23 AM]获取应用下载配置失败: Error: 获取应用下载配置失败\",\"type\":\"log\",\"level\":\"error\",\"metrics\":{},\"categories\":{\"branch\":\"release/950\"}},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893863966,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"action_id\":\"ef4cffea-6062-4c19-b646-faa89e51d77e\",\"sdk_offset\":1055.5,\"sample_rate\":1}},{\"ev_type\":\"custom\",\"payload\":{\"content\":\"[dreamina-global-logger][2/24/2026, 8:44:23 AM]获取应用下载配置失败: Error: 获取应用下载配置失败\",\"type\":\"log\",\"level\":\"error\",\"metrics\":{},\"categories\":{\"branch\":\"release/950\"}},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893863966,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"action_id\":\"ef4cffea-6062-4c19-b646-faa89e51d77e\",\"sdk_offset\":1055.5,\"sample_rate\":1}},{\"ev_type\":\"action\",\"payload\":{\"start_time\":129226.33000000007,\"id\":\"ef4cffea-6062-4c19-b646-faa89e51d77e\",\"type\":\"click\",\"target\":{\"name\":\"ai-generated-image-record-card\",\"path\":\"div.content-container > div.image-card-container > div.container.image > div > img.image\"},\"metrics\":{\"resource\":{\"count\":2}},\"duration\":126.99499999987893,\"frontend_time\":126.99499999987893},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893863934,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"action_id\":\"ef4cffea-6062-4c19-b646-faa89e51d77e\",\"sdk_offset\":1055.5,\"sample_rate\":0.05}},{\"ev_type\":\"resource\",\"payload\":{\"name\":\"https://p3-dreamina-sign.byteimg.com/tos-cn-i-tb4s082cfz/1f315f04e5c74478b17c0c11144e92fa~tplv-tb4s082cfz-aigc_resize:360:360.webp?lk3s=43402efa&x-expires=1774224000&x-signature=vC1lCmE%2FWpFIZdAKI7yUmC9sG%2Bs%3D&format=.webp\",\"entryType\":\"resource\",\"startTime\":129354.2250000001,\"duration\":28.59499999997206,\"initiatorType\":\"img\",\"deliveryType\":\"\",\"nextHopProtocol\":\"h2\",\"renderBlockingStatus\":\"non-blocking\",\"workerStart\":0,\"redirectStart\":0,\"redirectEnd\":0,\"fetchStart\":129354.2250000001,\"domainLookupStart\":129354.2250000001,\"domainLookupEnd\":129354.2250000001,\"connectStart\":129354.2250000001,\"secureConnectionStart\":129354.2250000001,\"connectEnd\":129354.2250000001,\"requestStart\":129356.13500000001,\"responseStart\":129381.69500000007,\"firstInterimResponseStart\":0,\"responseEnd\":129382.82000000007,\"transferSize\":12430,\"encodedBodySize\":12130,\"decodedBodySize\":12130,\"responseStatus\":200,\"serverTiming\":[{\"name\":\"cdn-cache\",\"duration\":0,\"description\":\"HIT\"},{\"name\":\"edge\",\"duration\":3,\"description\":\"\"}]},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893864102,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":0.1}},{\"ev_type\":\"image\",\"payload\":{\"name\":\"https://p3-dreamina-sign.byteimg.com/tos-cn-i-tb4s082cfz/1f315f04e5c74478b17c0c11144e92fa~tplv-tb4s082cfz-aigc_resize:360:360.webp?lk3s=43402efa&x-expires=1774224000&x-signature=vC1lCmE%2FWpFIZdAKI7yUmC9sG%2Bs%3D&format=.webp\",\"source\":\"img\",\"dpr\":1,\"needCompress\":false,\"needSizeOptim\":true,\"needFormatOptim\":false,\"hitLocalCache\":false,\"hitCdnCache\":true,\"size\":12130,\"duration\":28.59499999997206,\"redirect\":0,\"dns\":0,\"tcp\":0,\"ssl\":0,\"request\":25.56000000005588,\"download\":1.125,\"timingDetail\":{\"name\":\"https://p3-dreamina-sign.byteimg.com/tos-cn-i-tb4s082cfz/1f315f04e5c74478b17c0c11144e92fa~tplv-tb4s082cfz-aigc_resize:360:360.webp?lk3s=43402efa&x-expires=1774224000&x-signature=vC1lCmE%2FWpFIZdAKI7yUmC9sG%2Bs%3D&format=.webp\",\"entryType\":\"resource\",\"startTime\":129354.2250000001,\"duration\":28.59499999997206,\"initiatorType\":\"img\",\"deliveryType\":\"\",\"nextHopProtocol\":\"h2\",\"renderBlockingStatus\":\"non-blocking\",\"workerStart\":0,\"redirectStart\":0,\"redirectEnd\":0,\"fetchStart\":129354.2250000001,\"domainLookupStart\":129354.2250000001,\"domainLookupEnd\":129354.2250000001,\"connectStart\":129354.2250000001,\"secureConnectionStart\":129354.2250000001,\"connectEnd\":129354.2250000001,\"requestStart\":129356.13500000001,\"responseStart\":129381.69500000007,\"firstInterimResponseStart\":0,\"responseEnd\":129382.82000000007,\"transferSize\":12430,\"encodedBodySize\":12130,\"decodedBodySize\":12130,\"responseStatus\":200,\"serverTiming\":[{\"name\":\"cdn-cache\",\"duration\":0,\"description\":\"HIT\"},{\"name\":\"edge\",\"duration\":3,\"description\":\"\"}]},\"monitorVersion\":\"0.2.6\",\"imageSampleRate\":0.1,\"imagexType\":null,\"imagexVersion\":null,\"isLazyLoad\":true,\"width\":360,\"height\":203,\"viewerWidth\":156,\"viewerHeight\":87,\"format\":\"webp\",\"status\":200,\"resizeSavings\":2253},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893864144,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":1}},{\"ev_type\":\"resource\",\"payload\":{\"name\":\"https://p26-dreamina-sign.byteimg.com/tos-cn-i-tb4s082cfz/1f315f04e5c74478b17c0c11144e92fa~tplv-tb4s082cfz-aigc_resize:720:720.webp?lk3s=43402efa&x-expires=1774224000&x-signature=82W3lXpIm7RiiynYjMTSuWS4jLI%3D&format=.webp\",\"entryType\":\"resource\",\"startTime\":129358.8999999999,\"duration\":218.92000000015832,\"initiatorType\":\"img\",\"deliveryType\":\"\",\"nextHopProtocol\":\"h2\",\"renderBlockingStatus\":\"non-blocking\",\"workerStart\":0,\"redirectStart\":0,\"redirectEnd\":0,\"fetchStart\":129358.8999999999,\"domainLookupStart\":129358.8999999999,\"domainLookupEnd\":129358.8999999999,\"connectStart\":129358.8999999999,\"secureConnectionStart\":129358.8999999999,\"connectEnd\":129358.8999999999,\"requestStart\":129360.1499999999,\"responseStart\":129576.06499999994,\"firstInterimResponseStart\":0,\"responseEnd\":129577.82000000007,\"transferSize\":28212,\"encodedBodySize\":27912,\"decodedBodySize\":27912,\"responseStatus\":200,\"serverTiming\":[{\"name\":\"cdn-cache\",\"duration\":0,\"description\":\"MISS\"},{\"name\":\"edge\",\"duration\":44,\"description\":\"\"},{\"name\":\"origin\",\"duration\":167,\"description\":\"\"},{\"name\":\"inner\",\"duration\":158,\"description\":\"\"}]},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893864297,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":0.1}},{\"ev_type\":\"http\",\"payload\":{\"api\":\"fetch\",\"request\":{\"method\":\"get\",\"timestamp\":1771893864102,\"url\":\"https://p3-dreamina-sign.byteimg.com/tos-cn-i-tb4s082cfz/1f315f04e5c74478b17c0c11144e92fa~tplv-tb4s082cfz-aigc_resize:360:360.webp?lk3s=43402efa&x-expires=1774224000&x-signature=vC1lCmE%2FWpFIZdAKI7yUmC9sG%2Bs%3D&format=.webp\",\"headers\":{}},\"response\":{\"status\":200,\"is_custom_error\":false,\"timestamp\":1771893864143,\"headers\":{\"cache-control\":\"max-age=31536000\",\"content-length\":\"12130\",\"content-type\":\"image/webp\",\"last-modified\":\"Tue, 24 Feb 2026 00:44:12 GMT\"},\"timing\":{\"name\":\"https://p3-dreamina-sign.byteimg.com/tos-cn-i-tb4s082cfz/1f315f04e5c74478b17c0c11144e92fa~tplv-tb4s082cfz-aigc_resize:360:360.webp?lk3s=43402efa&x-expires=1774224000&x-signature=vC1lCmE%2FWpFIZdAKI7yUmC9sG%2Bs%3D&format=.webp\",\"entryType\":\"resource\",\"startTime\":129395.22999999998,\"duration\":35.764999999897555,\"initiatorType\":\"fetch\",\"deliveryType\":\"\",\"nextHopProtocol\":\"h2\",\"renderBlockingStatus\":\"non-blocking\",\"workerStart\":0,\"redirectStart\":0,\"redirectEnd\":0,\"fetchStart\":129395.22999999998,\"domainLookupStart\":129395.22999999998,\"domainLookupEnd\":129395.22999999998,\"connectStart\":129395.22999999998,\"secureConnectionStart\":129395.22999999998,\"connectEnd\":129395.22999999998,\"requestStart\":129397.20999999996,\"responseStart\":129427.05499999993,\"firstInterimResponseStart\":0,\"responseEnd\":129430.99499999988,\"transferSize\":12430,\"encodedBodySize\":12130,\"decodedBodySize\":12130,\"responseStatus\":200,\"serverTiming\":[{\"name\":\"cdn-cache\",\"duration\":0,\"description\":\"HIT\"},{\"name\":\"edge\",\"duration\":6,\"description\":\"\"}]}},\"duration\":41},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893864102,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"action_id\":\"ef4cffea-6062-4c19-b646-faa89e51d77e\",\"sdk_offset\":1055.5,\"sample_rate\":1}},{\"ev_type\":\"action\",\"payload\":{\"start_time\":132374.95999999996,\"id\":\"1604f566-6181-4ebd-a5d8-80c900642674\",\"type\":\"click\",\"target\":{\"name\":\"ANONYMOUS_SVG\",\"path\":\"div.operation-area > button.icon-button.close-button > svg > g > path\"},\"metrics\":{},\"duration\":100.48999999999069,\"frontend_time\":100.48999999999069},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893867083,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"action_id\":\"1604f566-6181-4ebd-a5d8-80c900642674\",\"sdk_offset\":1055.5,\"sample_rate\":0.05}},{\"ev_type\":\"http\",\"payload\":{\"api\":\"xhr\",\"request\":{\"url\":\"https://jimeng.jianying.com/mweb/v1/get_history_queue_info?aid=513695&web_version=7.5.0&da_version=3.3.9&aigc_features=app_lip_sync\",\"method\":\"post\",\"headers\":{\"accept\":\"application/json, text/plain, */*\",\"content-type\":\"application/json\",\"sign\":\"b455ce04243cab9429ffbb87850c5686\",\"device-time\":\"1771893870\",\"sign-ver\":\"1\",\"pf\":\"7\",\"appvr\":\"8.4.0\",\"loc\":\"cn\",\"lan\":\"zh-Hans\",\"app-sdk-version\":\"48.0.0\",\"appid\":\"513695\"},\"timestamp\":1771893870075},\"response\":{\"status\":200,\"is_custom_error\":false,\"timestamp\":1771893870251,\"headers\":{\"content-encoding\":\"br\",\"content-type\":\"application/json; charset=utf-8\",\"date\":\"Tue, 24 Feb 2026 00:44:31 GMT\",\"eagleid\":\"79e4822117718938710831074e\",\"server\":\"Tengine\",\"server-timing\":\"inner; dur=57, cdn-cache;desc=MISS,edge;dur=12,origin;dur=135\",\"strict-transport-security\":\"max-age=31536000; includeSubDomains; preload\",\"timing-allow-origin\":\"*\",\"tt_stable\":\"1\",\"vary\":\"Accept-Encoding\",\"via\":\"cache58.l2ea120-5[135,0], cache13.cn3833[147,0]\",\"x-tt-logid\":\"20260224084431A4130370763EDD4C774E\",\"x-tt-trace-host\":\"01317a0b267e6f7b60df5311a11f49fe3a2989b26a306cb8875899d5e955b5f00b3a224c2432053dc35f56208aa21e72c7602f77fff9bb3d06289a72d6ff536ff8876141f4f270d7e8ee38e0d67d24632f3b1a35400059b92b6e7410cea0dd10e64634bd876895f4fef1eb9f7659a4d2cb\",\"x-tt-trace-id\":\"00-260224084431A4130370763EDD4C774E-0EE22E9766DCDE06-00\",\"x-tt-trace-tag\":\"id=03;cdn-cache=miss;type=dyn\"},\"timing\":{\"name\":\"https://jimeng.jianying.com/mweb/v1/get_history_queue_info?aid=513695&web_version=7.5.0&da_version=3.3.9&aigc_features=app_lip_sync&msToken=ihykpW25F6ZdjhjeVFqU1JlJcnS7q1jpt3V0MMj57KcgSYXexymGclx9WUAZR1KqlKf3iBxnkNxtzZj1u75VJDsZIxv72ralFzbne1AtshBzB1TFg5Ju2A%3D%3D&a_bogus=O7lmvcgXMsm1JLj-AXkz9GBYcKD0YW5MgZENvyp7ezq0\",\"entryType\":\"resource\",\"startTime\":135372.7649999999,\"duration\":169.35499999998137,\"initiatorType\":\"xmlhttprequest\",\"deliveryType\":\"\",\"nextHopProtocol\":\"h2\",\"renderBlockingStatus\":\"non-blocking\",\"workerStart\":0,\"redirectStart\":0,\"redirectEnd\":0,\"fetchStart\":135372.7649999999,\"domainLookupStart\":135372.7649999999,\"domainLookupEnd\":135372.7649999999,\"connectStart\":135372.7649999999,\"secureConnectionStart\":135372.7649999999,\"connectEnd\":135372.7649999999,\"requestStart\":135376.49,\"responseStart\":135541.49,\"firstInterimResponseStart\":0,\"responseEnd\":135542.11999999988,\"transferSize\":715,\"encodedBodySize\":415,\"decodedBodySize\":768,\"responseStatus\":200,\"serverTiming\":[{\"name\":\"inner\",\"duration\":57,\"description\":\"\"},{\"name\":\"cdn-cache\",\"duration\":0,\"description\":\"MISS\"},{\"name\":\"edge\",\"duration\":12,\"description\":\"\"},{\"name\":\"origin\",\"duration\":135,\"description\":\"\"}]}},\"duration\":176},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893870075,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"action_id\":\"1604f566-6181-4ebd-a5d8-80c900642674\",\"sdk_offset\":1055.5,\"sample_rate\":1}},{\"ev_type\":\"resource\",\"payload\":{\"name\":\"https://p26-dreamina-sign.byteimg.com/tos-cn-i-tb4s082cfz/1e92720efb2d4c4589e58a7c2ca33645~tplv-tb4s082cfz-aigc_resize:480:480.webp?lk3s=43402efa&x-expires=1774224000&x-signature=BT9JZJyAF%2Bm%2FvVFrYyAY8F0abwM%3D&format=.webp\",\"entryType\":\"resource\",\"startTime\":138653.94999999995,\"duration\":180.035000000149,\"initiatorType\":\"img\",\"deliveryType\":\"\",\"nextHopProtocol\":\"\",\"renderBlockingStatus\":\"non-blocking\",\"workerStart\":0,\"redirectStart\":0,\"redirectEnd\":0,\"fetchStart\":138653.94999999995,\"domainLookupStart\":0,\"domainLookupEnd\":0,\"connectStart\":0,\"secureConnectionStart\":0,\"connectEnd\":0,\"requestStart\":0,\"responseStart\":0,\"firstInterimResponseStart\":0,\"responseEnd\":138833.9850000001,\"transferSize\":0,\"encodedBodySize\":0,\"decodedBodySize\":0,\"responseStatus\":0,\"serverTiming\":[]},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893873559,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":0.1}},{\"ev_type\":\"resource\",\"payload\":{\"name\":\"https://p26-dreamina-sign.byteimg.com/tos-cn-i-tb4s082cfz/2f879a420f7c4c7984a6e1ec1b50d138~tplv-tb4s082cfz-aigc_resize:480:480.webp?lk3s=43402efa&x-expires=1774224000&x-signature=ntYbSwev8Qz9%2FpcpuuI79knIbU0%3D&format=.webp\",\"entryType\":\"resource\",\"startTime\":138654.29499999993,\"duration\":181.34000000008382,\"initiatorType\":\"img\",\"deliveryType\":\"\",\"nextHopProtocol\":\"\",\"renderBlockingStatus\":\"non-blocking\",\"workerStart\":0,\"redirectStart\":0,\"redirectEnd\":0,\"fetchStart\":138654.29499999993,\"domainLookupStart\":0,\"domainLookupEnd\":0,\"connectStart\":0,\"secureConnectionStart\":0,\"connectEnd\":0,\"requestStart\":0,\"responseStart\":0,\"firstInterimResponseStart\":0,\"responseEnd\":138835.635,\"transferSize\":0,\"encodedBodySize\":0,\"decodedBodySize\":0,\"responseStatus\":0,\"serverTiming\":[]},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893873559,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":0.1}},{\"ev_type\":\"resource\",\"payload\":{\"name\":\"https://p3-dreamina-sign.byteimg.com/tos-cn-i-tb4s082cfz/52d4e578519c4057906a6ed43f78036f~tplv-tb4s082cfz-aigc_resize:480:480.webp?lk3s=43402efa&x-expires=1774224000&x-signature=BN85Qe7pHN8xnvjG9aP2TRiKWs0%3D&format=.webp\",\"entryType\":\"resource\",\"startTime\":138654.6299999999,\"duration\":181.035000000149,\"initiatorType\":\"img\",\"deliveryType\":\"\",\"nextHopProtocol\":\"\",\"renderBlockingStatus\":\"non-blocking\",\"workerStart\":0,\"redirectStart\":0,\"redirectEnd\":0,\"fetchStart\":138654.6299999999,\"domainLookupStart\":0,\"domainLookupEnd\":0,\"connectStart\":0,\"secureConnectionStart\":0,\"connectEnd\":0,\"requestStart\":0,\"responseStart\":0,\"firstInterimResponseStart\":0,\"responseEnd\":138835.66500000004,\"transferSize\":0,\"encodedBodySize\":0,\"decodedBodySize\":0,\"responseStatus\":0,\"serverTiming\":[]},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893873560,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":0.1}},{\"ev_type\":\"resource\",\"payload\":{\"name\":\"https://p3-dreamina-sign.byteimg.com/tos-cn-i-tb4s082cfz/59baa6d3e25740199f148f99cc3acea9~tplv-tb4s082cfz-aigc_resize:480:480.webp?lk3s=43402efa&x-expires=1774224000&x-signature=7LYYK47EtjvvWypSypIRRxfi%2Fs0%3D&format=.webp\",\"entryType\":\"resource\",\"startTime\":138654.92500000005,\"duration\":180.7600000000093,\"initiatorType\":\"img\",\"deliveryType\":\"\",\"nextHopProtocol\":\"\",\"renderBlockingStatus\":\"non-blocking\",\"workerStart\":0,\"redirectStart\":0,\"redirectEnd\":0,\"fetchStart\":138654.92500000005,\"domainLookupStart\":0,\"domainLookupEnd\":0,\"connectStart\":0,\"secureConnectionStart\":0,\"connectEnd\":0,\"requestStart\":0,\"responseStart\":0,\"firstInterimResponseStart\":0,\"responseEnd\":138835.68500000006,\"transferSize\":0,\"encodedBodySize\":0,\"decodedBodySize\":0,\"responseStatus\":0,\"serverTiming\":[]},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893873560,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":0.1}},{\"ev_type\":\"resource\",\"payload\":{\"name\":\"https://p3-dreamina-sign.byteimg.com/tos-cn-i-tb4s082cfz/99d00b3c9e164d368cbf492f89d5bf37~tplv-tb4s082cfz-aigc_resize:480:480.webp?lk3s=43402efa&x-expires=1774224000&x-signature=0hTdWYdY6w8seagzMRmYseI9viA%3D&format=.webp\",\"entryType\":\"resource\",\"startTime\":138655.16999999993,\"duration\":180.54000000003725,\"initiatorType\":\"img\",\"deliveryType\":\"\",\"nextHopProtocol\":\"\",\"renderBlockingStatus\":\"non-blocking\",\"workerStart\":0,\"redirectStart\":0,\"redirectEnd\":0,\"fetchStart\":138655.16999999993,\"domainLookupStart\":0,\"domainLookupEnd\":0,\"connectStart\":0,\"secureConnectionStart\":0,\"connectEnd\":0,\"requestStart\":0,\"responseStart\":0,\"firstInterimResponseStart\":0,\"responseEnd\":138835.70999999996,\"transferSize\":0,\"encodedBodySize\":0,\"decodedBodySize\":0,\"responseStatus\":0,\"serverTiming\":[]},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893873560,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":0.1}},{\"ev_type\":\"resource\",\"payload\":{\"name\":\"https://p26-dreamina-sign.byteimg.com/tos-cn-i-tb4s082cfz/27a651f37a76469db81bfdabec936bed~tplv-tb4s082cfz-aigc_resize:480:480.webp?lk3s=43402efa&x-expires=1774224000&x-signature=4vCEhJS41YlnXvTajAw99wkyexU%3D&format=.webp\",\"entryType\":\"resource\",\"startTime\":138682.74499999988,\"duration\":152.9800000002142,\"initiatorType\":\"img\",\"deliveryType\":\"\",\"nextHopProtocol\":\"\",\"renderBlockingStatus\":\"non-blocking\",\"workerStart\":0,\"redirectStart\":0,\"redirectEnd\":0,\"fetchStart\":138682.74499999988,\"domainLookupStart\":0,\"domainLookupEnd\":0,\"connectStart\":0,\"secureConnectionStart\":0,\"connectEnd\":0,\"requestStart\":0,\"responseStart\":0,\"firstInterimResponseStart\":0,\"responseEnd\":138835.7250000001,\"transferSize\":0,\"encodedBodySize\":0,\"decodedBodySize\":0,\"responseStatus\":0,\"serverTiming\":[]},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893873560,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":0.1}},{\"ev_type\":\"resource\",\"payload\":{\"name\":\"https://p3-dreamina-sign.byteimg.com/tos-cn-i-tb4s082cfz/1e45b15d7dd646ebaf6a0f53da7ed9f4~tplv-tb4s082cfz-aigc_resize:480:480.webp?lk3s=43402efa&x-expires=1774224000&x-signature=d%2FjkUQu515H5lpuHU%2B5MXWduUNY%3D&format=.webp\",\"entryType\":\"resource\",\"startTime\":138683.6499999999,\"duration\":185.86000000010245,\"initiatorType\":\"img\",\"deliveryType\":\"\",\"nextHopProtocol\":\"\",\"renderBlockingStatus\":\"non-blocking\",\"workerStart\":0,\"redirectStart\":0,\"redirectEnd\":0,\"fetchStart\":138683.6499999999,\"domainLookupStart\":0,\"domainLookupEnd\":0,\"connectStart\":0,\"secureConnectionStart\":0,\"connectEnd\":0,\"requestStart\":0,\"responseStart\":0,\"firstInterimResponseStart\":0,\"responseEnd\":138869.51,\"transferSize\":0,\"encodedBodySize\":0,\"decodedBodySize\":0,\"responseStatus\":0,\"serverTiming\":[]},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893873578,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":0.1}},{\"ev_type\":\"resource\",\"payload\":{\"name\":\"https://p3-dreamina-sign.byteimg.com/tos-cn-i-tb4s082cfz/86dd618145544658a642fd9d070d7d76~tplv-tb4s082cfz-aigc_resize:480:480.webp?lk3s=43402efa&x-expires=1774224000&x-signature=wKM9hpLl1KgIlNnpRmmdKEx6Wfc%3D&format=.webp\",\"entryType\":\"resource\",\"startTime\":138683.94999999995,\"duration\":185.84000000008382,\"initiatorType\":\"img\",\"deliveryType\":\"\",\"nextHopProtocol\":\"\",\"renderBlockingStatus\":\"non-blocking\",\"workerStart\":0,\"redirectStart\":0,\"redirectEnd\":0,\"fetchStart\":138683.94999999995,\"domainLookupStart\":0,\"domainLookupEnd\":0,\"connectStart\":0,\"secureConnectionStart\":0,\"connectEnd\":0,\"requestStart\":0,\"responseStart\":0,\"firstInterimResponseStart\":0,\"responseEnd\":138869.79000000004,\"transferSize\":0,\"encodedBodySize\":0,\"decodedBodySize\":0,\"responseStatus\":0,\"serverTiming\":[]},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893873578,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":0.1}},{\"ev_type\":\"resource\",\"payload\":{\"name\":\"https://p26-dreamina-sign.byteimg.com/tos-cn-i-tb4s082cfz/1e92720efb2d4c4589e58a7c2ca33645~tplv-tb4s082cfz-aigc_resize:360:360.webp?lk3s=43402efa&x-expires=1774224000&x-signature=YIqmDOXlAxkgek3jV69nLtj5JkU%3D&format=.webp\",\"entryType\":\"resource\",\"startTime\":138819.24499999988,\"duration\":34.950000000186265,\"initiatorType\":\"img\",\"deliveryType\":\"\",\"nextHopProtocol\":\"h2\",\"renderBlockingStatus\":\"non-blocking\",\"workerStart\":0,\"redirectStart\":0,\"redirectEnd\":0,\"fetchStart\":138819.24499999988,\"domainLookupStart\":138819.24499999988,\"domainLookupEnd\":138819.24499999988,\"connectStart\":138819.24499999988,\"secureConnectionStart\":138819.24499999988,\"connectEnd\":138819.24499999988,\"requestStart\":138824.67999999993,\"responseStart\":138832.79000000004,\"firstInterimResponseStart\":0,\"responseEnd\":138854.19500000007,\"transferSize\":21278,\"encodedBodySize\":20978,\"decodedBodySize\":20978,\"responseStatus\":200,\"serverTiming\":[{\"name\":\"cdn-cache\",\"duration\":0,\"description\":\"HIT\"},{\"name\":\"edge\",\"duration\":5,\"description\":\"\"}]},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893873608,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":0.1}},{\"ev_type\":\"resource\",\"payload\":{\"name\":\"https://p3-dreamina-sign.byteimg.com/tos-cn-i-tb4s082cfz/2f879a420f7c4c7984a6e1ec1b50d138~tplv-tb4s082cfz-aigc_resize:360:360.webp?lk3s=43402efa&x-expires=1774224000&x-signature=T6cTJwOZ%2BcLYqUlAgFG4uDnDreI%3D&format=.webp\",\"entryType\":\"resource\",\"startTime\":138819.85499999998,\"duration\":65.88000000012107,\"initiatorType\":\"img\",\"deliveryType\":\"\",\"nextHopProtocol\":\"h2\",\"renderBlockingStatus\":\"non-blocking\",\"workerStart\":0,\"redirectStart\":0,\"redirectEnd\":0,\"fetchStart\":138819.85499999998,\"domainLookupStart\":138819.85499999998,\"domainLookupEnd\":138819.85499999998,\"connectStart\":138819.85499999998,\"secureConnectionStart\":138819.85499999998,\"connectEnd\":138819.85499999998,\"requestStart\":138829.25,\"responseStart\":138858.21500000008,\"firstInterimResponseStart\":0,\"responseEnd\":138885.7350000001,\"transferSize\":24126,\"encodedBodySize\":23826,\"decodedBodySize\":23826,\"responseStatus\":200,\"serverTiming\":[{\"name\":\"cdn-cache\",\"duration\":0,\"description\":\"HIT\"},{\"name\":\"edge\",\"duration\":4,\"description\":\"\"}]},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893873631,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":0.1}},{\"ev_type\":\"resource\",\"payload\":{\"name\":\"https://p3-dreamina-sign.byteimg.com/tos-cn-i-tb4s082cfz/52d4e578519c4057906a6ed43f78036f~tplv-tb4s082cfz-aigc_resize:360:360.webp?lk3s=43402efa&x-expires=1774224000&x-signature=QHNJxJ8LLBzBfhWR80cTsEwVu60%3D&format=.webp\",\"entryType\":\"resource\",\"startTime\":138820.36999999988,\"duration\":82.45000000018626,\"initiatorType\":\"img\",\"deliveryType\":\"\",\"nextHopProtocol\":\"h2\",\"renderBlockingStatus\":\"non-blocking\",\"workerStart\":0,\"redirectStart\":0,\"redirectEnd\":0,\"fetchStart\":138820.36999999988,\"domainLookupStart\":138820.36999999988,\"domainLookupEnd\":138820.36999999988,\"connectStart\":138820.36999999988,\"secureConnectionStart\":138820.36999999988,\"connectEnd\":138820.36999999988,\"requestStart\":138863.32000000007,\"responseStart\":138890.61999999988,\"firstInterimResponseStart\":0,\"responseEnd\":138902.82000000007,\"transferSize\":24040,\"encodedBodySize\":23740,\"decodedBodySize\":23740,\"responseStatus\":200,\"serverTiming\":[{\"name\":\"cdn-cache\",\"duration\":0,\"description\":\"HIT\"},{\"name\":\"edge\",\"duration\":4,\"description\":\"\"}]},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893873631,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":0.1}},{\"ev_type\":\"resource\",\"payload\":{\"name\":\"https://p26-dreamina-sign.byteimg.com/tos-cn-i-tb4s082cfz/59baa6d3e25740199f148f99cc3acea9~tplv-tb4s082cfz-aigc_resize:360:360.webp?lk3s=43402efa&x-expires=1774224000&x-signature=GCfVeOhDUhl2ZVN7DaAODRjo7Eg%3D&format=.webp\",\"entryType\":\"resource\",\"startTime\":138820.86999999988,\"duration\":70.89500000001863,\"initiatorType\":\"img\",\"deliveryType\":\"\",\"nextHopProtocol\":\"h2\",\"renderBlockingStatus\":\"non-blocking\",\"workerStart\":0,\"redirectStart\":0,\"redirectEnd\":0,\"fetchStart\":138820.86999999988,\"domainLookupStart\":138820.86999999988,\"domainLookupEnd\":138820.86999999988,\"connectStart\":138820.86999999988,\"secureConnectionStart\":138820.86999999988,\"connectEnd\":138820.86999999988,\"requestStart\":138867.96500000008,\"responseStart\":138875.36999999988,\"firstInterimResponseStart\":0,\"responseEnd\":138891.7649999999,\"transferSize\":23006,\"encodedBodySize\":22706,\"decodedBodySize\":22706,\"responseStatus\":200,\"serverTiming\":[{\"name\":\"cdn-cache\",\"duration\":0,\"description\":\"HIT\"},{\"name\":\"edge\",\"duration\":3,\"description\":\"\"}]},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893873631,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":0.1}},{\"ev_type\":\"resource\",\"payload\":{\"name\":\"https://p26-dreamina-sign.byteimg.com/tos-cn-i-tb4s082cfz/99d00b3c9e164d368cbf492f89d5bf37~tplv-tb4s082cfz-aigc_resize:360:360.webp?lk3s=43402efa&x-expires=1774224000&x-signature=ZCTmBN6Uj%2FH8q2Z2zA77B7TaZvM%3D&format=.webp\",\"entryType\":\"resource\",\"startTime\":138821.3999999999,\"duration\":78.86000000010245,\"initiatorType\":\"img\",\"deliveryType\":\"\",\"nextHopProtocol\":\"h2\",\"renderBlockingStatus\":\"non-blocking\",\"workerStart\":0,\"redirectStart\":0,\"redirectEnd\":0,\"fetchStart\":138821.3999999999,\"domainLookupStart\":138821.3999999999,\"domainLookupEnd\":138821.3999999999,\"connectStart\":138821.3999999999,\"secureConnectionStart\":138821.3999999999,\"connectEnd\":138821.3999999999,\"requestStart\":138881.08499999996,\"responseStart\":138887.875,\"firstInterimResponseStart\":0,\"responseEnd\":138900.26,\"transferSize\":30504,\"encodedBodySize\":30204,\"decodedBodySize\":30204,\"responseStatus\":200,\"serverTiming\":[{\"name\":\"cdn-cache\",\"duration\":0,\"description\":\"HIT\"},{\"name\":\"edge\",\"duration\":3,\"description\":\"\"}]},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893873631,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":0.1}},{\"ev_type\":\"resource\",\"payload\":{\"name\":\"https://p3-dreamina-sign.byteimg.com/tos-cn-i-tb4s082cfz/27a651f37a76469db81bfdabec936bed~tplv-tb4s082cfz-aigc_resize:360:360.webp?lk3s=43402efa&x-expires=1774224000&x-signature=k9mN8e1ktdlbjzyC9nmshxHs%2B3g%3D&format=.webp\",\"entryType\":\"resource\",\"startTime\":138821.96500000008,\"duration\":122.30999999982305,\"initiatorType\":\"img\",\"deliveryType\":\"\",\"nextHopProtocol\":\"h2\",\"renderBlockingStatus\":\"non-blocking\",\"workerStart\":0,\"redirectStart\":0,\"redirectEnd\":0,\"fetchStart\":138821.96500000008,\"domainLookupStart\":138821.96500000008,\"domainLookupEnd\":138821.96500000008,\"connectStart\":138821.96500000008,\"secureConnectionStart\":138821.96500000008,\"connectEnd\":138821.96500000008,\"requestStart\":138894.74499999988,\"responseStart\":138921.65500000003,\"firstInterimResponseStart\":0,\"responseEnd\":138944.2749999999,\"transferSize\":32306,\"encodedBodySize\":32006,\"decodedBodySize\":32006,\"responseStatus\":200,\"serverTiming\":[{\"name\":\"cdn-cache\",\"duration\":0,\"description\":\"HIT\"},{\"name\":\"edge\",\"duration\":3,\"description\":\"\"}]},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893873665,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":0.1}},{\"ev_type\":\"resource\",\"payload\":{\"name\":\"https://p3-dreamina-sign.byteimg.com/tos-cn-i-tb4s082cfz/1e45b15d7dd646ebaf6a0f53da7ed9f4~tplv-tb4s082cfz-aigc_resize:360:360.webp?lk3s=43402efa&x-expires=1774224000&x-signature=usRxbFgBRcvAs30kJ9kmKhX1ov0%3D&format=.webp\",\"entryType\":\"resource\",\"startTime\":138854.94500000007,\"duration\":90.97999999998137,\"initiatorType\":\"img\",\"deliveryType\":\"\",\"nextHopProtocol\":\"h2\",\"renderBlockingStatus\":\"non-blocking\",\"workerStart\":0,\"redirectStart\":0,\"redirectEnd\":0,\"fetchStart\":138854.94500000007,\"domainLookupStart\":138854.94500000007,\"domainLookupEnd\":138854.94500000007,\"connectStart\":138854.94500000007,\"secureConnectionStart\":138854.94500000007,\"connectEnd\":138854.94500000007,\"requestStart\":138905.81499999994,\"responseStart\":138932.3999999999,\"firstInterimResponseStart\":0,\"responseEnd\":138945.92500000005,\"transferSize\":29080,\"encodedBodySize\":28780,\"decodedBodySize\":28780,\"responseStatus\":200,\"serverTiming\":[{\"name\":\"cdn-cache\",\"duration\":0,\"description\":\"HIT\"},{\"name\":\"edge\",\"duration\":4,\"description\":\"\"}]},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893873665,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":0.1}},{\"ev_type\":\"resource\",\"payload\":{\"name\":\"https://p3-dreamina-sign.byteimg.com/tos-cn-i-tb4s082cfz/86dd618145544658a642fd9d070d7d76~tplv-tb4s082cfz-aigc_resize:360:360.webp?lk3s=43402efa&x-expires=1774224000&x-signature=ulPms%2BsfN6xKlfnTF%2BQi%2BmI6WWY%3D&format=.webp\",\"entryType\":\"resource\",\"startTime\":138856.1100000001,\"duration\":90,\"initiatorType\":\"img\",\"deliveryType\":\"\",\"nextHopProtocol\":\"h2\",\"renderBlockingStatus\":\"non-blocking\",\"workerStart\":0,\"redirectStart\":0,\"redirectEnd\":0,\"fetchStart\":138856.1100000001,\"domainLookupStart\":138856.1100000001,\"domainLookupEnd\":138856.1100000001,\"connectStart\":138856.1100000001,\"secureConnectionStart\":138856.1100000001,\"connectEnd\":138856.1100000001,\"requestStart\":138907.68999999994,\"responseStart\":138935.67999999993,\"firstInterimResponseStart\":0,\"responseEnd\":138946.1100000001,\"transferSize\":32012,\"encodedBodySize\":31712,\"decodedBodySize\":31712,\"responseStatus\":200,\"serverTiming\":[{\"name\":\"cdn-cache\",\"duration\":0,\"description\":\"HIT\"},{\"name\":\"edge\",\"duration\":3,\"description\":\"\"}]},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893873665,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":0.1}},{\"ev_type\":\"image\",\"payload\":{\"name\":\"https://p3-dreamina-sign.byteimg.com/tos-cn-i-tb4s082cfz/52d4e578519c4057906a6ed43f78036f~tplv-tb4s082cfz-aigc_resize:360:360.webp?lk3s=43402efa&x-expires=1774224000&x-signature=QHNJxJ8LLBzBfhWR80cTsEwVu60%3D&format=.webp\",\"source\":\"img\",\"dpr\":1,\"needCompress\":false,\"needSizeOptim\":true,\"needFormatOptim\":false,\"hitLocalCache\":false,\"hitCdnCache\":true,\"size\":23740,\"duration\":82.45000000018626,\"redirect\":0,\"dns\":0,\"tcp\":0,\"ssl\":0,\"request\":27.299999999813735,\"download\":12.200000000186265,\"timingDetail\":{\"name\":\"https://p3-dreamina-sign.byteimg.com/tos-cn-i-tb4s082cfz/52d4e578519c4057906a6ed43f78036f~tplv-tb4s082cfz-aigc_resize:360:360.webp?lk3s=43402efa&x-expires=1774224000&x-signature=QHNJxJ8LLBzBfhWR80cTsEwVu60%3D&format=.webp\",\"entryType\":\"resource\",\"startTime\":138820.36999999988,\"duration\":82.45000000018626,\"initiatorType\":\"img\",\"deliveryType\":\"\",\"nextHopProtocol\":\"h2\",\"renderBlockingStatus\":\"non-blocking\",\"workerStart\":0,\"redirectStart\":0,\"redirectEnd\":0,\"fetchStart\":138820.36999999988,\"domainLookupStart\":138820.36999999988,\"domainLookupEnd\":138820.36999999988,\"connectStart\":138820.36999999988,\"secureConnectionStart\":138820.36999999988,\"connectEnd\":138820.36999999988,\"requestStart\":138863.32000000007,\"responseStart\":138890.61999999988,\"firstInterimResponseStart\":0,\"responseEnd\":138902.82000000007,\"transferSize\":24040,\"encodedBodySize\":23740,\"decodedBodySize\":23740,\"responseStatus\":200,\"serverTiming\":[{\"name\":\"cdn-cache\",\"duration\":0,\"description\":\"HIT\"},{\"name\":\"edge\",\"duration\":4,\"description\":\"\"}]},\"monitorVersion\":\"0.2.6\",\"imageSampleRate\":0.1,\"imagexType\":null,\"imagexVersion\":null,\"isLazyLoad\":true,\"width\":360,\"height\":360,\"viewerWidth\":196,\"viewerHeight\":196,\"format\":\"webp\",\"status\":200,\"resizeSavings\":7037},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893873689,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":1}},{\"ev_type\":\"http\",\"payload\":{\"api\":\"fetch\",\"request\":{\"method\":\"get\",\"timestamp\":1771893873633,\"url\":\"https://p3-dreamina-sign.byteimg.com/tos-cn-i-tb4s082cfz/52d4e578519c4057906a6ed43f78036f~tplv-tb4s082cfz-aigc_resize:360:360.webp?lk3s=43402efa&x-expires=1774224000&x-signature=QHNJxJ8LLBzBfhWR80cTsEwVu60%3D&format=.webp\",\"headers\":{}},\"response\":{\"status\":200,\"is_custom_error\":false,\"timestamp\":1771893873688,\"headers\":{\"cache-control\":\"max-age=31536000\",\"content-length\":\"23740\",\"content-type\":\"image/webp\",\"last-modified\":\"Mon, 23 Feb 2026 07:13:03 GMT\"},\"timing\":{\"name\":\"https://p3-dreamina-sign.byteimg.com/tos-cn-i-tb4s082cfz/52d4e578519c4057906a6ed43f78036f~tplv-tb4s082cfz-aigc_resize:360:360.webp?lk3s=43402efa&x-expires=1774224000&x-signature=QHNJxJ8LLBzBfhWR80cTsEwVu60%3D&format=.webp\",\"entryType\":\"resource\",\"startTime\":138925.86999999988,\"duration\":54.52000000001863,\"initiatorType\":\"fetch\",\"deliveryType\":\"\",\"nextHopProtocol\":\"h2\",\"renderBlockingStatus\":\"non-blocking\",\"workerStart\":0,\"redirectStart\":0,\"redirectEnd\":0,\"fetchStart\":138925.86999999988,\"domainLookupStart\":138925.86999999988,\"domainLookupEnd\":138925.86999999988,\"connectStart\":138925.86999999988,\"secureConnectionStart\":138925.86999999988,\"connectEnd\":138925.86999999988,\"requestStart\":138954.08499999996,\"responseStart\":138977.95999999996,\"firstInterimResponseStart\":0,\"responseEnd\":138980.3899999999,\"transferSize\":24040,\"encodedBodySize\":23740,\"decodedBodySize\":23740,\"responseStatus\":200,\"serverTiming\":[{\"name\":\"cdn-cache\",\"duration\":0,\"description\":\"HIT\"},{\"name\":\"edge\",\"duration\":3,\"description\":\"\"}]}},\"duration\":55},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893873633,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"action_id\":\"1604f566-6181-4ebd-a5d8-80c900642674\",\"sdk_offset\":1055.5,\"sample_rate\":1}}]}",
+ "method": "POST"
+}); ;
+fetch("https://jimeng.jianying.com/mweb/v1/get_history_by_ids?aid=513695&device_platform=web®ion=cn&webId=7605602965571765786&da_version=3.3.9&web_version=7.5.0&aigc_features=app_lip_sync&msToken=ihykpW25F6ZdjhjeVFqU1JlJcnS7q1jpt3V0MMj57KcgSYXexymGclx9WUAZR1KqlKf3iBxnkNxtzZj1u75VJDsZIxv72ralFzbne1AtshBzB1TFg5Ju2A%3D%3D&a_bogus=QXBY6OgXMsm1o%2Fb-AXkz9Hx7cz60YWRhgZENvypDWzoD", {
+ "headers": {
+ "accept": "application/json, text/plain, */*",
+ "accept-language": "zh-CN,zh;q=0.9",
+ "app-sdk-version": "48.0.0",
+ "appid": "513695",
+ "appvr": "8.4.0",
+ "cache-control": "no-cache",
+ "content-type": "application/json",
+ "device-time": "1771893880",
+ "lan": "zh-Hans",
+ "loc": "cn",
+ "pf": "7",
+ "pragma": "no-cache",
+ "priority": "u=1, i",
+ "sec-ch-ua": "\"Not A(Brand\";v=\"8\", \"Chromium\";v=\"132\", \"Google Chrome\";v=\"132\"",
+ "sec-ch-ua-mobile": "?0",
+ "sec-ch-ua-platform": "\"Windows\"",
+ "sec-fetch-dest": "empty",
+ "sec-fetch-mode": "cors",
+ "sec-fetch-site": "same-origin",
+ "sign": "8fc3bf0e10f6a53ae7c0f8fb6c4060c6",
+ "sign-ver": "1",
+ "tdid": "",
+ "x-platform": "pc",
+ "cookie": "_isHitHomeHeaderRefreshExperiment=1; s_v_web_id=verify_mli2zh09_eQ5L9Cej_bFER_4ccU_9JK5_Ael0lBTb3f1K; COOKIE_CONSENT_PROMPT_CONFIG={%22status%22:1%2C%22settings%22:{%22firstPartyAnalytics%22:true%2C%22GoogleAnalytics%22:true}%2C%22updatedTime%22:1770817444874}; fpk1=148a20cd63817580d8e8d9df32cd9b08f2453b88009c7c8bebd01f333cce15c7626a440c525de2203bdc082bd9051722; passport_csrf_token=ce5085d40c0c9edf5268392eeba6903e; passport_csrf_token_default=ce5085d40c0c9edf5268392eeba6903e; n_mh=xSPw81I4URH-3hVkPcoqGh1J2A7uMjTD8qZw1F59WkQ; sid_guard=0b6873d7aa4f947b144dd55be06359ec%7C1770821461%7C31536000%7CThu%2C+11-Feb-2027+14%3A51%3A01+GMT; uid_tt=7ced300dac82637ad657f41cb285cdfd; uid_tt_ss=7ced300dac82637ad657f41cb285cdfd; sid_tt=0b6873d7aa4f947b144dd55be06359ec; sessionid=0b6873d7aa4f947b144dd55be06359ec; sessionid_ss=0b6873d7aa4f947b144dd55be06359ec; session_tlb_tag=sttt%7C19%7CC2hz16pPlHsUTdVb4GNZ7P________-tjvJ8OgKw-5e-zmSTtf2yhZkCkLhpu1O7odzc7jAax0U%3D; is_staff_user=false; sid_ucp_v1=1.0.0-KGNhNzQzMDk0ZDliY2QwNzUwYjcxZDllMjQ2YjY5ZWRiNTU2YzdmNjAKHwiu1_Dtg42gARDVrrLMBhifrR8gDDDau4-EBjgIQCYaAmxxIiAwYjY4NzNkN2FhNGY5NDdiMTQ0ZGQ1NWJlMDYzNTllYw; ssid_ucp_v1=1.0.0-KGNhNzQzMDk0ZDliY2QwNzUwYjcxZDllMjQ2YjY5ZWRiNTU2YzdmNjAKHwiu1_Dtg42gARDVrrLMBhifrR8gDDDau4-EBjgIQCYaAmxxIiAwYjY4NzNkN2FhNGY5NDdiMTQ0ZGQ1NWJlMDYzNTllYw; user_spaces_idc={\"6954646182010290440\":\"hl\"}; dm_auid=6T58itIihnmLPAnsov+nbw==; uifid_temp=3d5c832fc871287d7ad4963d32df5aca8803a3d2a91cbed0592bf979487355215fd04954a5e33925193fc7ccbdd29b0b187b8d70ae376168de63643ab93f4025f47b9d1a4279a97bd4b92654a658b2b1; uifid=3d5c832fc871287d7ad4963d32df5aca8803a3d2a91cbed0592bf97948735521edf981832a5888f6de8426836c91e6e7beabc4eefe37adedf77629c420c674607ed44f52dd24901845b3081e04ecdd4837a6214df4a6ad9aa9cb58f1e731d13a4c2ec6dfaa71d3176186a2d994b505fddbdc62288e16eb34dc1ac099f7f4b6f3b86561b64b0ee189a363097d02fb2fd8570b6705b51a000f4d0c19176e726dc678a53a228ece78dd815cad3810392bb6; _v2_spipe_web_id=7606003060459978806; passport_mfa_token=CjjmvrvsaRSDPfoLf%2BDBmLAbuwJJDxiqC%2BHwu9ltw9GEkGilV%2BtOBusKn%2FFCFO6cwlFm6wgWDaK5mRpKCjwAAAAAAAAAAAAAUBQguICbvVY0ipQB7VhbH%2BFMdUuSBjo8WCjfD0mmn2DwVt3%2BYWeWtGtyM3BeLDy6Tw4QuOGJDhj2sdFsIAIiAQPFR%2FhM; _tea_web_id=7605602965571765786; DREAMINA_THEME=dark; odin_tt=24d7444414dbc3444791a95433f4d9953781e8e83bc9ac32cfe82c3f5fdf8dbbcca1d7ae88ef505ae0932f140a6785d9a46a7b376458f8cf2e5642679dca56ed; _uetsid=0cafbb40108711f1a52bb5009fae695d; _uetvid=b3c5085013b011f0a6cf3f171e4de2ae; ttwid=1|WfnGlJxqfilLYF7b-dzgFRlCRoYXBmnbtqai9ntlVwc|1771893824|43ab27aca3313957211fb20ea85fcd44fe2840f6c1e0fb1b2a292d30e1b9af08",
+ "Referer": "https://jimeng.jianying.com/ai-tool/generate?type=image",
+ "Referrer-Policy": "no-referrer-when-downgrade"
+ },
+ "body": "{\"submit_ids\":[\"717c5e9b-d3ff-444d-8d22-85f59dd38da7\"]}",
+ "method": "POST"
+}); ;
+fetch("https://jimeng.jianying.com/mweb/v1/get_history_by_ids?aid=513695&device_platform=web®ion=cn&webId=7605602965571765786&da_version=3.3.9&web_version=7.5.0&aigc_features=app_lip_sync&msToken=ihykpW25F6ZdjhjeVFqU1JlJcnS7q1jpt3V0MMj57KcgSYXexymGclx9WUAZR1KqlKf3iBxnkNxtzZj1u75VJDsZIxv72ralFzbne1AtshBzB1TFg5Ju2A%3D%3D&a_bogus=YfBY6OgXMsm1o%2Fb-AXkz9Hx7cz60YW-VgZENvypDozoe", {
+ "headers": {
+ "accept": "application/json, text/plain, */*",
+ "accept-language": "zh-CN,zh;q=0.9",
+ "app-sdk-version": "48.0.0",
+ "appid": "513695",
+ "appvr": "8.4.0",
+ "cache-control": "no-cache",
+ "content-type": "application/json",
+ "device-time": "1771893880",
+ "lan": "zh-Hans",
+ "loc": "cn",
+ "pf": "7",
+ "pragma": "no-cache",
+ "priority": "u=1, i",
+ "sec-ch-ua": "\"Not A(Brand\";v=\"8\", \"Chromium\";v=\"132\", \"Google Chrome\";v=\"132\"",
+ "sec-ch-ua-mobile": "?0",
+ "sec-ch-ua-platform": "\"Windows\"",
+ "sec-fetch-dest": "empty",
+ "sec-fetch-mode": "cors",
+ "sec-fetch-site": "same-origin",
+ "sign": "8fc3bf0e10f6a53ae7c0f8fb6c4060c6",
+ "sign-ver": "1",
+ "tdid": "",
+ "x-platform": "pc",
+ "cookie": "_isHitHomeHeaderRefreshExperiment=1; s_v_web_id=verify_mli2zh09_eQ5L9Cej_bFER_4ccU_9JK5_Ael0lBTb3f1K; COOKIE_CONSENT_PROMPT_CONFIG={%22status%22:1%2C%22settings%22:{%22firstPartyAnalytics%22:true%2C%22GoogleAnalytics%22:true}%2C%22updatedTime%22:1770817444874}; fpk1=148a20cd63817580d8e8d9df32cd9b08f2453b88009c7c8bebd01f333cce15c7626a440c525de2203bdc082bd9051722; passport_csrf_token=ce5085d40c0c9edf5268392eeba6903e; passport_csrf_token_default=ce5085d40c0c9edf5268392eeba6903e; n_mh=xSPw81I4URH-3hVkPcoqGh1J2A7uMjTD8qZw1F59WkQ; sid_guard=0b6873d7aa4f947b144dd55be06359ec%7C1770821461%7C31536000%7CThu%2C+11-Feb-2027+14%3A51%3A01+GMT; uid_tt=7ced300dac82637ad657f41cb285cdfd; uid_tt_ss=7ced300dac82637ad657f41cb285cdfd; sid_tt=0b6873d7aa4f947b144dd55be06359ec; sessionid=0b6873d7aa4f947b144dd55be06359ec; sessionid_ss=0b6873d7aa4f947b144dd55be06359ec; session_tlb_tag=sttt%7C19%7CC2hz16pPlHsUTdVb4GNZ7P________-tjvJ8OgKw-5e-zmSTtf2yhZkCkLhpu1O7odzc7jAax0U%3D; is_staff_user=false; sid_ucp_v1=1.0.0-KGNhNzQzMDk0ZDliY2QwNzUwYjcxZDllMjQ2YjY5ZWRiNTU2YzdmNjAKHwiu1_Dtg42gARDVrrLMBhifrR8gDDDau4-EBjgIQCYaAmxxIiAwYjY4NzNkN2FhNGY5NDdiMTQ0ZGQ1NWJlMDYzNTllYw; ssid_ucp_v1=1.0.0-KGNhNzQzMDk0ZDliY2QwNzUwYjcxZDllMjQ2YjY5ZWRiNTU2YzdmNjAKHwiu1_Dtg42gARDVrrLMBhifrR8gDDDau4-EBjgIQCYaAmxxIiAwYjY4NzNkN2FhNGY5NDdiMTQ0ZGQ1NWJlMDYzNTllYw; user_spaces_idc={\"6954646182010290440\":\"hl\"}; dm_auid=6T58itIihnmLPAnsov+nbw==; uifid_temp=3d5c832fc871287d7ad4963d32df5aca8803a3d2a91cbed0592bf979487355215fd04954a5e33925193fc7ccbdd29b0b187b8d70ae376168de63643ab93f4025f47b9d1a4279a97bd4b92654a658b2b1; uifid=3d5c832fc871287d7ad4963d32df5aca8803a3d2a91cbed0592bf97948735521edf981832a5888f6de8426836c91e6e7beabc4eefe37adedf77629c420c674607ed44f52dd24901845b3081e04ecdd4837a6214df4a6ad9aa9cb58f1e731d13a4c2ec6dfaa71d3176186a2d994b505fddbdc62288e16eb34dc1ac099f7f4b6f3b86561b64b0ee189a363097d02fb2fd8570b6705b51a000f4d0c19176e726dc678a53a228ece78dd815cad3810392bb6; _v2_spipe_web_id=7606003060459978806; passport_mfa_token=CjjmvrvsaRSDPfoLf%2BDBmLAbuwJJDxiqC%2BHwu9ltw9GEkGilV%2BtOBusKn%2FFCFO6cwlFm6wgWDaK5mRpKCjwAAAAAAAAAAAAAUBQguICbvVY0ipQB7VhbH%2BFMdUuSBjo8WCjfD0mmn2DwVt3%2BYWeWtGtyM3BeLDy6Tw4QuOGJDhj2sdFsIAIiAQPFR%2FhM; _tea_web_id=7605602965571765786; DREAMINA_THEME=dark; odin_tt=24d7444414dbc3444791a95433f4d9953781e8e83bc9ac32cfe82c3f5fdf8dbbcca1d7ae88ef505ae0932f140a6785d9a46a7b376458f8cf2e5642679dca56ed; _uetsid=0cafbb40108711f1a52bb5009fae695d; _uetvid=b3c5085013b011f0a6cf3f171e4de2ae; ttwid=1|WfnGlJxqfilLYF7b-dzgFRlCRoYXBmnbtqai9ntlVwc|1771893824|43ab27aca3313957211fb20ea85fcd44fe2840f6c1e0fb1b2a292d30e1b9af08",
+ "Referer": "https://jimeng.jianying.com/ai-tool/generate?type=image",
+ "Referrer-Policy": "no-referrer-when-downgrade"
+ },
+ "body": "{\"submit_ids\":[\"717c5e9b-d3ff-444d-8d22-85f59dd38da7\"]}",
+ "method": "POST"
+}); ;
+fetch("https://jimeng.jianying.com/mweb/v1/get_history_by_ids?aid=513695&device_platform=web®ion=cn&webId=7605602965571765786&da_version=3.3.9&web_version=7.5.0&aigc_features=app_lip_sync&msToken=ihykpW25F6ZdjhjeVFqU1JlJcnS7q1jpt3V0MMj57KcgSYXexymGclx9WUAZR1KqlKf3iBxnkNxtzZj1u75VJDsZIxv72ralFzbne1AtshBzB1TFg5Ju2A%3D%3D&a_bogus=m7MY6cgXMsm1o%2Fb-AXkz9Hx7czf0YWRkgZENvypkUUop", {
+ "headers": {
+ "accept": "application/json, text/plain, */*",
+ "accept-language": "zh-CN,zh;q=0.9",
+ "app-sdk-version": "48.0.0",
+ "appid": "513695",
+ "appvr": "8.4.0",
+ "cache-control": "no-cache",
+ "content-type": "application/json",
+ "device-time": "1771893881",
+ "lan": "zh-Hans",
+ "loc": "cn",
+ "pf": "7",
+ "pragma": "no-cache",
+ "priority": "u=1, i",
+ "sec-ch-ua": "\"Not A(Brand\";v=\"8\", \"Chromium\";v=\"132\", \"Google Chrome\";v=\"132\"",
+ "sec-ch-ua-mobile": "?0",
+ "sec-ch-ua-platform": "\"Windows\"",
+ "sec-fetch-dest": "empty",
+ "sec-fetch-mode": "cors",
+ "sec-fetch-site": "same-origin",
+ "sign": "cd10f9d7d6a45a52bc58acf278a5314c",
+ "sign-ver": "1",
+ "tdid": "",
+ "x-platform": "pc",
+ "cookie": "_isHitHomeHeaderRefreshExperiment=1; s_v_web_id=verify_mli2zh09_eQ5L9Cej_bFER_4ccU_9JK5_Ael0lBTb3f1K; COOKIE_CONSENT_PROMPT_CONFIG={%22status%22:1%2C%22settings%22:{%22firstPartyAnalytics%22:true%2C%22GoogleAnalytics%22:true}%2C%22updatedTime%22:1770817444874}; fpk1=148a20cd63817580d8e8d9df32cd9b08f2453b88009c7c8bebd01f333cce15c7626a440c525de2203bdc082bd9051722; passport_csrf_token=ce5085d40c0c9edf5268392eeba6903e; passport_csrf_token_default=ce5085d40c0c9edf5268392eeba6903e; n_mh=xSPw81I4URH-3hVkPcoqGh1J2A7uMjTD8qZw1F59WkQ; sid_guard=0b6873d7aa4f947b144dd55be06359ec%7C1770821461%7C31536000%7CThu%2C+11-Feb-2027+14%3A51%3A01+GMT; uid_tt=7ced300dac82637ad657f41cb285cdfd; uid_tt_ss=7ced300dac82637ad657f41cb285cdfd; sid_tt=0b6873d7aa4f947b144dd55be06359ec; sessionid=0b6873d7aa4f947b144dd55be06359ec; sessionid_ss=0b6873d7aa4f947b144dd55be06359ec; session_tlb_tag=sttt%7C19%7CC2hz16pPlHsUTdVb4GNZ7P________-tjvJ8OgKw-5e-zmSTtf2yhZkCkLhpu1O7odzc7jAax0U%3D; is_staff_user=false; sid_ucp_v1=1.0.0-KGNhNzQzMDk0ZDliY2QwNzUwYjcxZDllMjQ2YjY5ZWRiNTU2YzdmNjAKHwiu1_Dtg42gARDVrrLMBhifrR8gDDDau4-EBjgIQCYaAmxxIiAwYjY4NzNkN2FhNGY5NDdiMTQ0ZGQ1NWJlMDYzNTllYw; ssid_ucp_v1=1.0.0-KGNhNzQzMDk0ZDliY2QwNzUwYjcxZDllMjQ2YjY5ZWRiNTU2YzdmNjAKHwiu1_Dtg42gARDVrrLMBhifrR8gDDDau4-EBjgIQCYaAmxxIiAwYjY4NzNkN2FhNGY5NDdiMTQ0ZGQ1NWJlMDYzNTllYw; user_spaces_idc={\"6954646182010290440\":\"hl\"}; dm_auid=6T58itIihnmLPAnsov+nbw==; uifid_temp=3d5c832fc871287d7ad4963d32df5aca8803a3d2a91cbed0592bf979487355215fd04954a5e33925193fc7ccbdd29b0b187b8d70ae376168de63643ab93f4025f47b9d1a4279a97bd4b92654a658b2b1; uifid=3d5c832fc871287d7ad4963d32df5aca8803a3d2a91cbed0592bf97948735521edf981832a5888f6de8426836c91e6e7beabc4eefe37adedf77629c420c674607ed44f52dd24901845b3081e04ecdd4837a6214df4a6ad9aa9cb58f1e731d13a4c2ec6dfaa71d3176186a2d994b505fddbdc62288e16eb34dc1ac099f7f4b6f3b86561b64b0ee189a363097d02fb2fd8570b6705b51a000f4d0c19176e726dc678a53a228ece78dd815cad3810392bb6; _v2_spipe_web_id=7606003060459978806; passport_mfa_token=CjjmvrvsaRSDPfoLf%2BDBmLAbuwJJDxiqC%2BHwu9ltw9GEkGilV%2BtOBusKn%2FFCFO6cwlFm6wgWDaK5mRpKCjwAAAAAAAAAAAAAUBQguICbvVY0ipQB7VhbH%2BFMdUuSBjo8WCjfD0mmn2DwVt3%2BYWeWtGtyM3BeLDy6Tw4QuOGJDhj2sdFsIAIiAQPFR%2FhM; _tea_web_id=7605602965571765786; DREAMINA_THEME=dark; odin_tt=24d7444414dbc3444791a95433f4d9953781e8e83bc9ac32cfe82c3f5fdf8dbbcca1d7ae88ef505ae0932f140a6785d9a46a7b376458f8cf2e5642679dca56ed; _uetsid=0cafbb40108711f1a52bb5009fae695d; _uetvid=b3c5085013b011f0a6cf3f171e4de2ae; ttwid=1|WfnGlJxqfilLYF7b-dzgFRlCRoYXBmnbtqai9ntlVwc|1771893824|43ab27aca3313957211fb20ea85fcd44fe2840f6c1e0fb1b2a292d30e1b9af08",
+ "Referer": "https://jimeng.jianying.com/ai-tool/generate?type=image",
+ "Referrer-Policy": "no-referrer-when-downgrade"
+ },
+ "body": "{\"submit_ids\":[\"717c5e9b-d3ff-444d-8d22-85f59dd38da7\"]}",
+ "method": "POST"
+}); ;
+fetch("https://jimeng.jianying.com/commerce/v1/benefits/user_credit_history", {
+ "headers": {
+ "accept": "application/json, text/plain, */*",
+ "accept-language": "zh-CN,zh;q=0.9",
+ "appid": "513695",
+ "appvr": "8.4.0",
+ "cache-control": "no-cache",
+ "content-type": "application/json",
+ "device-time": "1771893881",
+ "lan": "ZH",
+ "pf": "7",
+ "pragma": "no-cache",
+ "priority": "u=1, i",
+ "sec-ch-ua": "\"Not A(Brand\";v=\"8\", \"Chromium\";v=\"132\", \"Google Chrome\";v=\"132\"",
+ "sec-ch-ua-mobile": "?0",
+ "sec-ch-ua-platform": "\"Windows\"",
+ "sec-fetch-dest": "empty",
+ "sec-fetch-mode": "cors",
+ "sec-fetch-site": "same-origin",
+ "sign": "ba360efb1e59afe44e5d672d1224ec79",
+ "sign-ver": "1",
+ "tdid": "",
+ "cookie": "_isHitHomeHeaderRefreshExperiment=1; s_v_web_id=verify_mli2zh09_eQ5L9Cej_bFER_4ccU_9JK5_Ael0lBTb3f1K; COOKIE_CONSENT_PROMPT_CONFIG={%22status%22:1%2C%22settings%22:{%22firstPartyAnalytics%22:true%2C%22GoogleAnalytics%22:true}%2C%22updatedTime%22:1770817444874}; fpk1=148a20cd63817580d8e8d9df32cd9b08f2453b88009c7c8bebd01f333cce15c7626a440c525de2203bdc082bd9051722; passport_csrf_token=ce5085d40c0c9edf5268392eeba6903e; passport_csrf_token_default=ce5085d40c0c9edf5268392eeba6903e; n_mh=xSPw81I4URH-3hVkPcoqGh1J2A7uMjTD8qZw1F59WkQ; sid_guard=0b6873d7aa4f947b144dd55be06359ec%7C1770821461%7C31536000%7CThu%2C+11-Feb-2027+14%3A51%3A01+GMT; uid_tt=7ced300dac82637ad657f41cb285cdfd; uid_tt_ss=7ced300dac82637ad657f41cb285cdfd; sid_tt=0b6873d7aa4f947b144dd55be06359ec; sessionid=0b6873d7aa4f947b144dd55be06359ec; sessionid_ss=0b6873d7aa4f947b144dd55be06359ec; session_tlb_tag=sttt%7C19%7CC2hz16pPlHsUTdVb4GNZ7P________-tjvJ8OgKw-5e-zmSTtf2yhZkCkLhpu1O7odzc7jAax0U%3D; is_staff_user=false; sid_ucp_v1=1.0.0-KGNhNzQzMDk0ZDliY2QwNzUwYjcxZDllMjQ2YjY5ZWRiNTU2YzdmNjAKHwiu1_Dtg42gARDVrrLMBhifrR8gDDDau4-EBjgIQCYaAmxxIiAwYjY4NzNkN2FhNGY5NDdiMTQ0ZGQ1NWJlMDYzNTllYw; ssid_ucp_v1=1.0.0-KGNhNzQzMDk0ZDliY2QwNzUwYjcxZDllMjQ2YjY5ZWRiNTU2YzdmNjAKHwiu1_Dtg42gARDVrrLMBhifrR8gDDDau4-EBjgIQCYaAmxxIiAwYjY4NzNkN2FhNGY5NDdiMTQ0ZGQ1NWJlMDYzNTllYw; user_spaces_idc={\"6954646182010290440\":\"hl\"}; dm_auid=6T58itIihnmLPAnsov+nbw==; uifid_temp=3d5c832fc871287d7ad4963d32df5aca8803a3d2a91cbed0592bf979487355215fd04954a5e33925193fc7ccbdd29b0b187b8d70ae376168de63643ab93f4025f47b9d1a4279a97bd4b92654a658b2b1; uifid=3d5c832fc871287d7ad4963d32df5aca8803a3d2a91cbed0592bf97948735521edf981832a5888f6de8426836c91e6e7beabc4eefe37adedf77629c420c674607ed44f52dd24901845b3081e04ecdd4837a6214df4a6ad9aa9cb58f1e731d13a4c2ec6dfaa71d3176186a2d994b505fddbdc62288e16eb34dc1ac099f7f4b6f3b86561b64b0ee189a363097d02fb2fd8570b6705b51a000f4d0c19176e726dc678a53a228ece78dd815cad3810392bb6; _v2_spipe_web_id=7606003060459978806; passport_mfa_token=CjjmvrvsaRSDPfoLf%2BDBmLAbuwJJDxiqC%2BHwu9ltw9GEkGilV%2BtOBusKn%2FFCFO6cwlFm6wgWDaK5mRpKCjwAAAAAAAAAAAAAUBQguICbvVY0ipQB7VhbH%2BFMdUuSBjo8WCjfD0mmn2DwVt3%2BYWeWtGtyM3BeLDy6Tw4QuOGJDhj2sdFsIAIiAQPFR%2FhM; _tea_web_id=7605602965571765786; DREAMINA_THEME=dark; odin_tt=24d7444414dbc3444791a95433f4d9953781e8e83bc9ac32cfe82c3f5fdf8dbbcca1d7ae88ef505ae0932f140a6785d9a46a7b376458f8cf2e5642679dca56ed; _uetsid=0cafbb40108711f1a52bb5009fae695d; _uetvid=b3c5085013b011f0a6cf3f171e4de2ae; ttwid=1|WfnGlJxqfilLYF7b-dzgFRlCRoYXBmnbtqai9ntlVwc|1771893824|43ab27aca3313957211fb20ea85fcd44fe2840f6c1e0fb1b2a292d30e1b9af08",
+ "Referer": "https://jimeng.jianying.com/ai-tool/generate?type=image",
+ "Referrer-Policy": "no-referrer-when-downgrade"
+ },
+ "body": "{\"count\":20,\"cursor\":\"0\"}",
+ "method": "POST"
+}); ;
+fetch("https://jimeng.jianying.com/commerce/v1/benefits/user_credit_history", {
+ "headers": {
+ "accept": "application/json, text/plain, */*",
+ "accept-language": "zh-CN,zh;q=0.9",
+ "appid": "513695",
+ "appvr": "8.4.0",
+ "cache-control": "no-cache",
+ "content-type": "application/json",
+ "device-time": "1771893881",
+ "lan": "ZH",
+ "pf": "7",
+ "pragma": "no-cache",
+ "priority": "u=1, i",
+ "sec-ch-ua": "\"Not A(Brand\";v=\"8\", \"Chromium\";v=\"132\", \"Google Chrome\";v=\"132\"",
+ "sec-ch-ua-mobile": "?0",
+ "sec-ch-ua-platform": "\"Windows\"",
+ "sec-fetch-dest": "empty",
+ "sec-fetch-mode": "cors",
+ "sec-fetch-site": "same-origin",
+ "sign": "ba360efb1e59afe44e5d672d1224ec79",
+ "sign-ver": "1",
+ "tdid": "",
+ "cookie": "_isHitHomeHeaderRefreshExperiment=1; s_v_web_id=verify_mli2zh09_eQ5L9Cej_bFER_4ccU_9JK5_Ael0lBTb3f1K; COOKIE_CONSENT_PROMPT_CONFIG={%22status%22:1%2C%22settings%22:{%22firstPartyAnalytics%22:true%2C%22GoogleAnalytics%22:true}%2C%22updatedTime%22:1770817444874}; fpk1=148a20cd63817580d8e8d9df32cd9b08f2453b88009c7c8bebd01f333cce15c7626a440c525de2203bdc082bd9051722; passport_csrf_token=ce5085d40c0c9edf5268392eeba6903e; passport_csrf_token_default=ce5085d40c0c9edf5268392eeba6903e; n_mh=xSPw81I4URH-3hVkPcoqGh1J2A7uMjTD8qZw1F59WkQ; sid_guard=0b6873d7aa4f947b144dd55be06359ec%7C1770821461%7C31536000%7CThu%2C+11-Feb-2027+14%3A51%3A01+GMT; uid_tt=7ced300dac82637ad657f41cb285cdfd; uid_tt_ss=7ced300dac82637ad657f41cb285cdfd; sid_tt=0b6873d7aa4f947b144dd55be06359ec; sessionid=0b6873d7aa4f947b144dd55be06359ec; sessionid_ss=0b6873d7aa4f947b144dd55be06359ec; session_tlb_tag=sttt%7C19%7CC2hz16pPlHsUTdVb4GNZ7P________-tjvJ8OgKw-5e-zmSTtf2yhZkCkLhpu1O7odzc7jAax0U%3D; is_staff_user=false; sid_ucp_v1=1.0.0-KGNhNzQzMDk0ZDliY2QwNzUwYjcxZDllMjQ2YjY5ZWRiNTU2YzdmNjAKHwiu1_Dtg42gARDVrrLMBhifrR8gDDDau4-EBjgIQCYaAmxxIiAwYjY4NzNkN2FhNGY5NDdiMTQ0ZGQ1NWJlMDYzNTllYw; ssid_ucp_v1=1.0.0-KGNhNzQzMDk0ZDliY2QwNzUwYjcxZDllMjQ2YjY5ZWRiNTU2YzdmNjAKHwiu1_Dtg42gARDVrrLMBhifrR8gDDDau4-EBjgIQCYaAmxxIiAwYjY4NzNkN2FhNGY5NDdiMTQ0ZGQ1NWJlMDYzNTllYw; user_spaces_idc={\"6954646182010290440\":\"hl\"}; dm_auid=6T58itIihnmLPAnsov+nbw==; uifid_temp=3d5c832fc871287d7ad4963d32df5aca8803a3d2a91cbed0592bf979487355215fd04954a5e33925193fc7ccbdd29b0b187b8d70ae376168de63643ab93f4025f47b9d1a4279a97bd4b92654a658b2b1; uifid=3d5c832fc871287d7ad4963d32df5aca8803a3d2a91cbed0592bf97948735521edf981832a5888f6de8426836c91e6e7beabc4eefe37adedf77629c420c674607ed44f52dd24901845b3081e04ecdd4837a6214df4a6ad9aa9cb58f1e731d13a4c2ec6dfaa71d3176186a2d994b505fddbdc62288e16eb34dc1ac099f7f4b6f3b86561b64b0ee189a363097d02fb2fd8570b6705b51a000f4d0c19176e726dc678a53a228ece78dd815cad3810392bb6; _v2_spipe_web_id=7606003060459978806; passport_mfa_token=CjjmvrvsaRSDPfoLf%2BDBmLAbuwJJDxiqC%2BHwu9ltw9GEkGilV%2BtOBusKn%2FFCFO6cwlFm6wgWDaK5mRpKCjwAAAAAAAAAAAAAUBQguICbvVY0ipQB7VhbH%2BFMdUuSBjo8WCjfD0mmn2DwVt3%2BYWeWtGtyM3BeLDy6Tw4QuOGJDhj2sdFsIAIiAQPFR%2FhM; _tea_web_id=7605602965571765786; DREAMINA_THEME=dark; odin_tt=24d7444414dbc3444791a95433f4d9953781e8e83bc9ac32cfe82c3f5fdf8dbbcca1d7ae88ef505ae0932f140a6785d9a46a7b376458f8cf2e5642679dca56ed; _uetsid=0cafbb40108711f1a52bb5009fae695d; _uetvid=b3c5085013b011f0a6cf3f171e4de2ae; ttwid=1|WfnGlJxqfilLYF7b-dzgFRlCRoYXBmnbtqai9ntlVwc|1771893824|43ab27aca3313957211fb20ea85fcd44fe2840f6c1e0fb1b2a292d30e1b9af08",
+ "Referer": "https://jimeng.jianying.com/ai-tool/generate?type=image",
+ "Referrer-Policy": "no-referrer-when-downgrade"
+ },
+ "body": "{\"count\":20,\"cursor\":\"0\"}",
+ "method": "POST"
+}); ;
+fetch("https://jimeng.jianying.com/mweb/v1/batch_collect?web_id=7605602965571765786", {
+ "headers": {
+ "accept": "application/json, text/plain, */*",
+ "accept-language": "zh-CN,zh;q=0.9",
+ "appid": "513695",
+ "cache-control": "no-cache",
+ "content-type": "application/json",
+ "pragma": "no-cache",
+ "priority": "u=1, i",
+ "sec-ch-ua": "\"Not A(Brand\";v=\"8\", \"Chromium\";v=\"132\", \"Google Chrome\";v=\"132\"",
+ "sec-ch-ua-mobile": "?0",
+ "sec-ch-ua-platform": "\"Windows\"",
+ "sec-fetch-dest": "empty",
+ "sec-fetch-mode": "cors",
+ "sec-fetch-site": "same-origin",
+ "cookie": "_isHitHomeHeaderRefreshExperiment=1; s_v_web_id=verify_mli2zh09_eQ5L9Cej_bFER_4ccU_9JK5_Ael0lBTb3f1K; COOKIE_CONSENT_PROMPT_CONFIG={%22status%22:1%2C%22settings%22:{%22firstPartyAnalytics%22:true%2C%22GoogleAnalytics%22:true}%2C%22updatedTime%22:1770817444874}; fpk1=148a20cd63817580d8e8d9df32cd9b08f2453b88009c7c8bebd01f333cce15c7626a440c525de2203bdc082bd9051722; passport_csrf_token=ce5085d40c0c9edf5268392eeba6903e; passport_csrf_token_default=ce5085d40c0c9edf5268392eeba6903e; n_mh=xSPw81I4URH-3hVkPcoqGh1J2A7uMjTD8qZw1F59WkQ; sid_guard=0b6873d7aa4f947b144dd55be06359ec%7C1770821461%7C31536000%7CThu%2C+11-Feb-2027+14%3A51%3A01+GMT; uid_tt=7ced300dac82637ad657f41cb285cdfd; uid_tt_ss=7ced300dac82637ad657f41cb285cdfd; sid_tt=0b6873d7aa4f947b144dd55be06359ec; sessionid=0b6873d7aa4f947b144dd55be06359ec; sessionid_ss=0b6873d7aa4f947b144dd55be06359ec; session_tlb_tag=sttt%7C19%7CC2hz16pPlHsUTdVb4GNZ7P________-tjvJ8OgKw-5e-zmSTtf2yhZkCkLhpu1O7odzc7jAax0U%3D; is_staff_user=false; sid_ucp_v1=1.0.0-KGNhNzQzMDk0ZDliY2QwNzUwYjcxZDllMjQ2YjY5ZWRiNTU2YzdmNjAKHwiu1_Dtg42gARDVrrLMBhifrR8gDDDau4-EBjgIQCYaAmxxIiAwYjY4NzNkN2FhNGY5NDdiMTQ0ZGQ1NWJlMDYzNTllYw; ssid_ucp_v1=1.0.0-KGNhNzQzMDk0ZDliY2QwNzUwYjcxZDllMjQ2YjY5ZWRiNTU2YzdmNjAKHwiu1_Dtg42gARDVrrLMBhifrR8gDDDau4-EBjgIQCYaAmxxIiAwYjY4NzNkN2FhNGY5NDdiMTQ0ZGQ1NWJlMDYzNTllYw; user_spaces_idc={\"6954646182010290440\":\"hl\"}; dm_auid=6T58itIihnmLPAnsov+nbw==; uifid_temp=3d5c832fc871287d7ad4963d32df5aca8803a3d2a91cbed0592bf979487355215fd04954a5e33925193fc7ccbdd29b0b187b8d70ae376168de63643ab93f4025f47b9d1a4279a97bd4b92654a658b2b1; uifid=3d5c832fc871287d7ad4963d32df5aca8803a3d2a91cbed0592bf97948735521edf981832a5888f6de8426836c91e6e7beabc4eefe37adedf77629c420c674607ed44f52dd24901845b3081e04ecdd4837a6214df4a6ad9aa9cb58f1e731d13a4c2ec6dfaa71d3176186a2d994b505fddbdc62288e16eb34dc1ac099f7f4b6f3b86561b64b0ee189a363097d02fb2fd8570b6705b51a000f4d0c19176e726dc678a53a228ece78dd815cad3810392bb6; _v2_spipe_web_id=7606003060459978806; passport_mfa_token=CjjmvrvsaRSDPfoLf%2BDBmLAbuwJJDxiqC%2BHwu9ltw9GEkGilV%2BtOBusKn%2FFCFO6cwlFm6wgWDaK5mRpKCjwAAAAAAAAAAAAAUBQguICbvVY0ipQB7VhbH%2BFMdUuSBjo8WCjfD0mmn2DwVt3%2BYWeWtGtyM3BeLDy6Tw4QuOGJDhj2sdFsIAIiAQPFR%2FhM; _tea_web_id=7605602965571765786; DREAMINA_THEME=dark; odin_tt=24d7444414dbc3444791a95433f4d9953781e8e83bc9ac32cfe82c3f5fdf8dbbcca1d7ae88ef505ae0932f140a6785d9a46a7b376458f8cf2e5642679dca56ed; _uetsid=0cafbb40108711f1a52bb5009fae695d; _uetvid=b3c5085013b011f0a6cf3f171e4de2ae; ttwid=1|WfnGlJxqfilLYF7b-dzgFRlCRoYXBmnbtqai9ntlVwc|1771893824|43ab27aca3313957211fb20ea85fcd44fe2840f6c1e0fb1b2a292d30e1b9af08",
+ "Referer": "https://jimeng.jianying.com/ai-tool/generate?type=image",
+ "Referrer-Policy": "no-referrer-when-downgrade"
+ },
+ "body": "{\"events\":[{\"event_name\":\"server_generate_status\",\"params\":\"{\\\"is_vip\\\":1,\\\"user_subscribe_type\\\":\\\"standard\\\",\\\"url_path\\\":\\\"/ai-tool/generate\\\",\\\"referrer\\\":\\\"/home/\\\",\\\"page\\\":\\\"generation\\\",\\\"definition\\\":\\\"2k\\\",\\\"ratio\\\":\\\"1.7778\\\",\\\"prompt\\\":\\\"两个小马在一起跑步\\\",\\\"steps\\\":0.5,\\\"seed\\\":\\\"1357613421\\\",\\\"status\\\":\\\"success\\\",\\\"is_time_limited_free\\\":0,\\\"credits_need\\\":0,\\\"credits_now\\\":1180,\\\"generate_type\\\":1,\\\"submit_id\\\":\\\"717c5e9b-d3ff-444d-8d22-85f59dd38da7\\\",\\\"generate_id\\\":\\\"20260224084347D8F218F0D45862717C7C\\\",\\\"request_id\\\":\\\"\\\",\\\"picture_id\\\":\\\"7610225894170348838\\\",\\\"pe_ratio\\\":\\\"2560:1440\\\",\\\"action_type\\\":\\\"generate\\\",\\\"generate_app_name\\\":\\\"web\\\",\\\"prompt_cnt\\\":9,\\\"image_prompt_cnt\\\":0,\\\"prompt_source\\\":\\\"custom\\\",\\\"model_name\\\":\\\"图片5.0 Lite\\\",\\\"model_starling_key\\\":\\\"web_image_model_name_50\\\",\\\"model_key\\\":\\\"high_aes_general_v50\\\",\\\"enter_from\\\":\\\"click\\\",\\\"template_id\\\":\\\"0\\\",\\\"reference_cnt\\\":0,\\\"use_pre_llm\\\":0,\\\"generate_cnt\\\":1,\\\"is_box_select\\\":0,\\\"is_cutout\\\":0,\\\"is_agent_mode\\\":0,\\\"pe_target_num\\\":2,\\\"pe_is_group\\\":1,\\\"history_id\\\":\\\"13489993616908\\\",\\\"ab_tags\\\":\\\"high_aes_general_v50p_stream\\\",\\\"is_describe\\\":0,\\\"time_cost\\\":53885,\\\"event_index\\\":1771894585762}\"}],\"header\":{\"app_id\":513695,\"app_version\":\"0.1.0\",\"os_name\":\"windows\",\"os_version\":\"10\",\"device_model\":\"Windows NT 10.0\",\"language\":\"zh-Hans\",\"platform\":\"web\",\"sdk_version\":\"5.0.53\",\"sdk_lib\":\"js\",\"timezone\":8,\"tz_offset\":-28800,\"resolution\":\"1536x864\",\"browser\":\"Chrome\",\"browser_version\":\"132.0.0.0\",\"referrer\":\"\",\"referrer_host\":\"\",\"width\":1536,\"height\":864,\"screen_width\":1536,\"screen_height\":864,\"tracer_data\":\"{\\\"$utm_from_url\\\":1}\",\"custom\":\"{\\\"channel_level1\\\":\\\"Direct\\\",\\\"channel_level2\\\":\\\"enter_url\\\",\\\"channel_level3\\\":\\\"\\\",\\\"channel_level4\\\":\\\"\\\",\\\"channel_from\\\":\\\"ut\\\",\\\"session_start_url\\\":\\\"https://jimeng.jianying.com/ai-tool/home/\\\",\\\"branch\\\":\\\"release/950\\\",\\\"theme_mode\\\":\\\"dark\\\",\\\"resolution\\\":480,\\\"gpu_exist\\\":\\\"1\\\",\\\"network_type\\\":\\\"4g\\\",\\\"downlink\\\":10,\\\"rtt\\\":0,\\\"web_id\\\":\\\"7605602965571765786\\\",\\\"is_new_framework\\\":1,\\\"store_country\\\":\\\"CN\\\",\\\"language\\\":\\\"zh-Hans\\\",\\\"is_vip\\\":1,\\\"user_subscribe_type\\\":\\\"standard\\\"}\"}}",
+ "method": "POST"
+}); ;
+fetch("https://jimeng.jianying.com/mweb/v1/batch_collect?web_id=7605602965571765786", {
+ "headers": {
+ "accept": "application/json, text/plain, */*",
+ "accept-language": "zh-CN,zh;q=0.9",
+ "appid": "513695",
+ "cache-control": "no-cache",
+ "content-type": "application/json",
+ "pragma": "no-cache",
+ "priority": "u=1, i",
+ "sec-ch-ua": "\"Not A(Brand\";v=\"8\", \"Chromium\";v=\"132\", \"Google Chrome\";v=\"132\"",
+ "sec-ch-ua-mobile": "?0",
+ "sec-ch-ua-platform": "\"Windows\"",
+ "sec-fetch-dest": "empty",
+ "sec-fetch-mode": "cors",
+ "sec-fetch-site": "same-origin",
+ "cookie": "_isHitHomeHeaderRefreshExperiment=1; s_v_web_id=verify_mli2zh09_eQ5L9Cej_bFER_4ccU_9JK5_Ael0lBTb3f1K; COOKIE_CONSENT_PROMPT_CONFIG={%22status%22:1%2C%22settings%22:{%22firstPartyAnalytics%22:true%2C%22GoogleAnalytics%22:true}%2C%22updatedTime%22:1770817444874}; fpk1=148a20cd63817580d8e8d9df32cd9b08f2453b88009c7c8bebd01f333cce15c7626a440c525de2203bdc082bd9051722; passport_csrf_token=ce5085d40c0c9edf5268392eeba6903e; passport_csrf_token_default=ce5085d40c0c9edf5268392eeba6903e; n_mh=xSPw81I4URH-3hVkPcoqGh1J2A7uMjTD8qZw1F59WkQ; sid_guard=0b6873d7aa4f947b144dd55be06359ec%7C1770821461%7C31536000%7CThu%2C+11-Feb-2027+14%3A51%3A01+GMT; uid_tt=7ced300dac82637ad657f41cb285cdfd; uid_tt_ss=7ced300dac82637ad657f41cb285cdfd; sid_tt=0b6873d7aa4f947b144dd55be06359ec; sessionid=0b6873d7aa4f947b144dd55be06359ec; sessionid_ss=0b6873d7aa4f947b144dd55be06359ec; session_tlb_tag=sttt%7C19%7CC2hz16pPlHsUTdVb4GNZ7P________-tjvJ8OgKw-5e-zmSTtf2yhZkCkLhpu1O7odzc7jAax0U%3D; is_staff_user=false; sid_ucp_v1=1.0.0-KGNhNzQzMDk0ZDliY2QwNzUwYjcxZDllMjQ2YjY5ZWRiNTU2YzdmNjAKHwiu1_Dtg42gARDVrrLMBhifrR8gDDDau4-EBjgIQCYaAmxxIiAwYjY4NzNkN2FhNGY5NDdiMTQ0ZGQ1NWJlMDYzNTllYw; ssid_ucp_v1=1.0.0-KGNhNzQzMDk0ZDliY2QwNzUwYjcxZDllMjQ2YjY5ZWRiNTU2YzdmNjAKHwiu1_Dtg42gARDVrrLMBhifrR8gDDDau4-EBjgIQCYaAmxxIiAwYjY4NzNkN2FhNGY5NDdiMTQ0ZGQ1NWJlMDYzNTllYw; user_spaces_idc={\"6954646182010290440\":\"hl\"}; dm_auid=6T58itIihnmLPAnsov+nbw==; uifid_temp=3d5c832fc871287d7ad4963d32df5aca8803a3d2a91cbed0592bf979487355215fd04954a5e33925193fc7ccbdd29b0b187b8d70ae376168de63643ab93f4025f47b9d1a4279a97bd4b92654a658b2b1; uifid=3d5c832fc871287d7ad4963d32df5aca8803a3d2a91cbed0592bf97948735521edf981832a5888f6de8426836c91e6e7beabc4eefe37adedf77629c420c674607ed44f52dd24901845b3081e04ecdd4837a6214df4a6ad9aa9cb58f1e731d13a4c2ec6dfaa71d3176186a2d994b505fddbdc62288e16eb34dc1ac099f7f4b6f3b86561b64b0ee189a363097d02fb2fd8570b6705b51a000f4d0c19176e726dc678a53a228ece78dd815cad3810392bb6; _v2_spipe_web_id=7606003060459978806; passport_mfa_token=CjjmvrvsaRSDPfoLf%2BDBmLAbuwJJDxiqC%2BHwu9ltw9GEkGilV%2BtOBusKn%2FFCFO6cwlFm6wgWDaK5mRpKCjwAAAAAAAAAAAAAUBQguICbvVY0ipQB7VhbH%2BFMdUuSBjo8WCjfD0mmn2DwVt3%2BYWeWtGtyM3BeLDy6Tw4QuOGJDhj2sdFsIAIiAQPFR%2FhM; _tea_web_id=7605602965571765786; DREAMINA_THEME=dark; odin_tt=24d7444414dbc3444791a95433f4d9953781e8e83bc9ac32cfe82c3f5fdf8dbbcca1d7ae88ef505ae0932f140a6785d9a46a7b376458f8cf2e5642679dca56ed; _uetsid=0cafbb40108711f1a52bb5009fae695d; _uetvid=b3c5085013b011f0a6cf3f171e4de2ae; ttwid=1|WfnGlJxqfilLYF7b-dzgFRlCRoYXBmnbtqai9ntlVwc|1771893824|43ab27aca3313957211fb20ea85fcd44fe2840f6c1e0fb1b2a292d30e1b9af08",
+ "Referer": "https://jimeng.jianying.com/ai-tool/generate?type=image",
+ "Referrer-Policy": "no-referrer-when-downgrade"
+ },
+ "body": "{\"events\":[{\"event_name\":\"server_generate_status\",\"params\":\"{\\\"is_vip\\\":1,\\\"user_subscribe_type\\\":\\\"standard\\\",\\\"url_path\\\":\\\"/ai-tool/generate\\\",\\\"referrer\\\":\\\"/home/\\\",\\\"page\\\":\\\"generation\\\",\\\"definition\\\":\\\"2k\\\",\\\"ratio\\\":\\\"1.7778\\\",\\\"prompt\\\":\\\"两个小马在一起跑步\\\",\\\"steps\\\":0.5,\\\"seed\\\":\\\"1357613421\\\",\\\"status\\\":\\\"success\\\",\\\"is_time_limited_free\\\":0,\\\"credits_need\\\":0,\\\"credits_now\\\":1180,\\\"generate_type\\\":1,\\\"submit_id\\\":\\\"717c5e9b-d3ff-444d-8d22-85f59dd38da7\\\",\\\"generate_id\\\":\\\"20260224084347D8F218F0D45862717C7C\\\",\\\"request_id\\\":\\\"\\\",\\\"picture_id\\\":\\\"7610225894170365222\\\",\\\"pe_ratio\\\":\\\"2560:1440\\\",\\\"action_type\\\":\\\"generate\\\",\\\"generate_app_name\\\":\\\"web\\\",\\\"prompt_cnt\\\":9,\\\"image_prompt_cnt\\\":0,\\\"prompt_source\\\":\\\"custom\\\",\\\"model_name\\\":\\\"图片5.0 Lite\\\",\\\"model_starling_key\\\":\\\"web_image_model_name_50\\\",\\\"model_key\\\":\\\"high_aes_general_v50\\\",\\\"enter_from\\\":\\\"click\\\",\\\"template_id\\\":\\\"0\\\",\\\"reference_cnt\\\":0,\\\"use_pre_llm\\\":0,\\\"generate_cnt\\\":1,\\\"is_box_select\\\":0,\\\"is_cutout\\\":0,\\\"is_agent_mode\\\":0,\\\"pe_target_num\\\":2,\\\"pe_is_group\\\":1,\\\"history_id\\\":\\\"13489993616908\\\",\\\"ab_tags\\\":\\\"high_aes_general_v50p_stream\\\",\\\"is_describe\\\":0,\\\"time_cost\\\":53886,\\\"event_index\\\":1771894585763}\"}],\"header\":{\"app_id\":513695,\"app_version\":\"0.1.0\",\"os_name\":\"windows\",\"os_version\":\"10\",\"device_model\":\"Windows NT 10.0\",\"language\":\"zh-Hans\",\"platform\":\"web\",\"sdk_version\":\"5.0.53\",\"sdk_lib\":\"js\",\"timezone\":8,\"tz_offset\":-28800,\"resolution\":\"1536x864\",\"browser\":\"Chrome\",\"browser_version\":\"132.0.0.0\",\"referrer\":\"\",\"referrer_host\":\"\",\"width\":1536,\"height\":864,\"screen_width\":1536,\"screen_height\":864,\"tracer_data\":\"{\\\"$utm_from_url\\\":1}\",\"custom\":\"{\\\"channel_level1\\\":\\\"Direct\\\",\\\"channel_level2\\\":\\\"enter_url\\\",\\\"channel_level3\\\":\\\"\\\",\\\"channel_level4\\\":\\\"\\\",\\\"channel_from\\\":\\\"ut\\\",\\\"session_start_url\\\":\\\"https://jimeng.jianying.com/ai-tool/home/\\\",\\\"branch\\\":\\\"release/950\\\",\\\"theme_mode\\\":\\\"dark\\\",\\\"resolution\\\":480,\\\"gpu_exist\\\":\\\"1\\\",\\\"network_type\\\":\\\"4g\\\",\\\"downlink\\\":10,\\\"rtt\\\":0,\\\"web_id\\\":\\\"7605602965571765786\\\",\\\"is_new_framework\\\":1,\\\"store_country\\\":\\\"CN\\\",\\\"language\\\":\\\"zh-Hans\\\",\\\"is_vip\\\":1,\\\"user_subscribe_type\\\":\\\"standard\\\"}\"}}",
+ "method": "POST"
+}); ;
+fetch("https://jimeng.jianying.com/commerce/v1/benefits/user_credit_history", {
+ "headers": {
+ "accept": "application/json, text/plain, */*",
+ "accept-language": "zh-CN,zh;q=0.9",
+ "appid": "513695",
+ "appvr": "8.4.0",
+ "cache-control": "no-cache",
+ "content-type": "application/json",
+ "device-time": "1771893881",
+ "lan": "ZH",
+ "pf": "7",
+ "pragma": "no-cache",
+ "priority": "u=1, i",
+ "sec-ch-ua": "\"Not A(Brand\";v=\"8\", \"Chromium\";v=\"132\", \"Google Chrome\";v=\"132\"",
+ "sec-ch-ua-mobile": "?0",
+ "sec-ch-ua-platform": "\"Windows\"",
+ "sec-fetch-dest": "empty",
+ "sec-fetch-mode": "cors",
+ "sec-fetch-site": "same-origin",
+ "sign": "ba360efb1e59afe44e5d672d1224ec79",
+ "sign-ver": "1",
+ "tdid": "",
+ "cookie": "_isHitHomeHeaderRefreshExperiment=1; s_v_web_id=verify_mli2zh09_eQ5L9Cej_bFER_4ccU_9JK5_Ael0lBTb3f1K; COOKIE_CONSENT_PROMPT_CONFIG={%22status%22:1%2C%22settings%22:{%22firstPartyAnalytics%22:true%2C%22GoogleAnalytics%22:true}%2C%22updatedTime%22:1770817444874}; fpk1=148a20cd63817580d8e8d9df32cd9b08f2453b88009c7c8bebd01f333cce15c7626a440c525de2203bdc082bd9051722; passport_csrf_token=ce5085d40c0c9edf5268392eeba6903e; passport_csrf_token_default=ce5085d40c0c9edf5268392eeba6903e; n_mh=xSPw81I4URH-3hVkPcoqGh1J2A7uMjTD8qZw1F59WkQ; sid_guard=0b6873d7aa4f947b144dd55be06359ec%7C1770821461%7C31536000%7CThu%2C+11-Feb-2027+14%3A51%3A01+GMT; uid_tt=7ced300dac82637ad657f41cb285cdfd; uid_tt_ss=7ced300dac82637ad657f41cb285cdfd; sid_tt=0b6873d7aa4f947b144dd55be06359ec; sessionid=0b6873d7aa4f947b144dd55be06359ec; sessionid_ss=0b6873d7aa4f947b144dd55be06359ec; session_tlb_tag=sttt%7C19%7CC2hz16pPlHsUTdVb4GNZ7P________-tjvJ8OgKw-5e-zmSTtf2yhZkCkLhpu1O7odzc7jAax0U%3D; is_staff_user=false; sid_ucp_v1=1.0.0-KGNhNzQzMDk0ZDliY2QwNzUwYjcxZDllMjQ2YjY5ZWRiNTU2YzdmNjAKHwiu1_Dtg42gARDVrrLMBhifrR8gDDDau4-EBjgIQCYaAmxxIiAwYjY4NzNkN2FhNGY5NDdiMTQ0ZGQ1NWJlMDYzNTllYw; ssid_ucp_v1=1.0.0-KGNhNzQzMDk0ZDliY2QwNzUwYjcxZDllMjQ2YjY5ZWRiNTU2YzdmNjAKHwiu1_Dtg42gARDVrrLMBhifrR8gDDDau4-EBjgIQCYaAmxxIiAwYjY4NzNkN2FhNGY5NDdiMTQ0ZGQ1NWJlMDYzNTllYw; user_spaces_idc={\"6954646182010290440\":\"hl\"}; dm_auid=6T58itIihnmLPAnsov+nbw==; uifid_temp=3d5c832fc871287d7ad4963d32df5aca8803a3d2a91cbed0592bf979487355215fd04954a5e33925193fc7ccbdd29b0b187b8d70ae376168de63643ab93f4025f47b9d1a4279a97bd4b92654a658b2b1; uifid=3d5c832fc871287d7ad4963d32df5aca8803a3d2a91cbed0592bf97948735521edf981832a5888f6de8426836c91e6e7beabc4eefe37adedf77629c420c674607ed44f52dd24901845b3081e04ecdd4837a6214df4a6ad9aa9cb58f1e731d13a4c2ec6dfaa71d3176186a2d994b505fddbdc62288e16eb34dc1ac099f7f4b6f3b86561b64b0ee189a363097d02fb2fd8570b6705b51a000f4d0c19176e726dc678a53a228ece78dd815cad3810392bb6; _v2_spipe_web_id=7606003060459978806; passport_mfa_token=CjjmvrvsaRSDPfoLf%2BDBmLAbuwJJDxiqC%2BHwu9ltw9GEkGilV%2BtOBusKn%2FFCFO6cwlFm6wgWDaK5mRpKCjwAAAAAAAAAAAAAUBQguICbvVY0ipQB7VhbH%2BFMdUuSBjo8WCjfD0mmn2DwVt3%2BYWeWtGtyM3BeLDy6Tw4QuOGJDhj2sdFsIAIiAQPFR%2FhM; _tea_web_id=7605602965571765786; DREAMINA_THEME=dark; odin_tt=24d7444414dbc3444791a95433f4d9953781e8e83bc9ac32cfe82c3f5fdf8dbbcca1d7ae88ef505ae0932f140a6785d9a46a7b376458f8cf2e5642679dca56ed; _uetsid=0cafbb40108711f1a52bb5009fae695d; _uetvid=b3c5085013b011f0a6cf3f171e4de2ae; ttwid=1|WfnGlJxqfilLYF7b-dzgFRlCRoYXBmnbtqai9ntlVwc|1771893824|43ab27aca3313957211fb20ea85fcd44fe2840f6c1e0fb1b2a292d30e1b9af08",
+ "Referer": "https://jimeng.jianying.com/ai-tool/generate?type=image",
+ "Referrer-Policy": "no-referrer-when-downgrade"
+ },
+ "body": "{\"count\":20,\"cursor\":\"0\"}",
+ "method": "POST"
+}); ;
+fetch("https://mcs.zijieapi.com/list", {
+ "headers": {
+ "accept": "*/*",
+ "accept-language": "zh-CN,zh;q=0.9",
+ "cache-control": "no-cache",
+ "content-type": "application/json; charset=UTF-8",
+ "pragma": "no-cache",
+ "priority": "u=1, i",
+ "sec-ch-ua": "\"Not A(Brand\";v=\"8\", \"Chromium\";v=\"132\", \"Google Chrome\";v=\"132\"",
+ "sec-ch-ua-mobile": "?0",
+ "sec-ch-ua-platform": "\"Windows\"",
+ "sec-fetch-dest": "empty",
+ "sec-fetch-mode": "cors",
+ "sec-fetch-site": "cross-site",
+ "Referer": "https://jimeng.jianying.com/ai-tool/generate?type=image",
+ "Referrer-Policy": "no-referrer-when-downgrade"
+ },
+ "body": "[{\"events\":[{\"event\":\"vip_function_details\",\"params\":\"{\\\"_staging_flag\\\":0,\\\"is_vip\\\":1,\\\"user_subscribe_type\\\":\\\"standard\\\",\\\"url_path\\\":\\\"/ai-tool/generate\\\",\\\"referrer\\\":\\\"/home/\\\",\\\"page\\\":\\\"generation\\\",\\\"action\\\":\\\"show\\\",\\\"enter_source\\\":\\\"generate_task_bottom_button_bar\\\",\\\"right_id\\\":\\\"image_basic_v5_2k\\\",\\\"right_type\\\":\\\"generate_img\\\",\\\"right_main_type\\\":\\\"aigc\\\",\\\"right_is_aigc\\\":\\\"1\\\",\\\"right_block_type\\\":\\\"click\\\",\\\"right_count_type\\\":\\\"times\\\",\\\"right_subscribe_type\\\":\\\"free\\\",\\\"right_oneoff_mix_type\\\":\\\"free\\\",\\\"right_is_trial\\\":\\\"1\\\",\\\"right_trial_mode\\\":\\\"period_trial\\\",\\\"right_trial_type\\\":\\\"limit_times\\\",\\\"right_trial_limit_left\\\":\\\"-1\\\",\\\"event_index\\\":1771894585767}\",\"local_time_ms\":1771893881597,\"is_bav\":0,\"ab_sdk_version\":\"91249282,14674564,13753331,15628237,15174027,15174145,15170779,15407184,15567817,15504129,15481561,14902980\",\"session_id\":\"95ac96eb-cba1-47fe-94a4-fbc644d0f38b\"},{\"event\":\"generate_status_more\",\"params\":\"{\\\"_staging_flag\\\":0,\\\"is_vip\\\":1,\\\"user_subscribe_type\\\":\\\"standard\\\",\\\"url_path\\\":\\\"/ai-tool/generate\\\",\\\"referrer\\\":\\\"/home/\\\",\\\"page\\\":\\\"generation\\\",\\\"status\\\":\\\"success\\\",\\\"submit_id\\\":\\\"717c5e9b-d3ff-444d-8d22-85f59dd38da7\\\",\\\"generate_id\\\":\\\"20260224084347D8F218F0D45862717C7C\\\",\\\"picture_id\\\":\\\"7610225894170365222\\\",\\\"event_index\\\":1771894585766}\",\"local_time_ms\":1771893881531,\"is_bav\":0,\"ab_sdk_version\":\"91249282,14674564,13753331,15628237,15174027,15174145,15170779,15407184,15567817,15504129,15481561,14902980\",\"session_id\":\"95ac96eb-cba1-47fe-94a4-fbc644d0f38b\"},{\"event\":\"generate_status_more\",\"params\":\"{\\\"_staging_flag\\\":0,\\\"is_vip\\\":1,\\\"user_subscribe_type\\\":\\\"standard\\\",\\\"url_path\\\":\\\"/ai-tool/generate\\\",\\\"referrer\\\":\\\"/home/\\\",\\\"page\\\":\\\"generation\\\",\\\"status\\\":\\\"success\\\",\\\"submit_id\\\":\\\"717c5e9b-d3ff-444d-8d22-85f59dd38da7\\\",\\\"generate_id\\\":\\\"20260224084347D8F218F0D45862717C7C\\\",\\\"picture_id\\\":\\\"7610225894170348838\\\",\\\"event_index\\\":1771894585765}\",\"local_time_ms\":1771893881531,\"is_bav\":0,\"ab_sdk_version\":\"91249282,14674564,13753331,15628237,15174027,15174145,15170779,15407184,15567817,15504129,15481561,14902980\",\"session_id\":\"95ac96eb-cba1-47fe-94a4-fbc644d0f38b\"},{\"event\":\"perf_ai_image_generate\",\"params\":\"{\\\"_staging_flag\\\":0,\\\"is_vip\\\":1,\\\"user_subscribe_type\\\":\\\"standard\\\",\\\"url_path\\\":\\\"/ai-tool/generate\\\",\\\"referrer\\\":\\\"/home/\\\",\\\"page\\\":\\\"generation\\\",\\\"definition\\\":\\\"2k\\\",\\\"ratio\\\":\\\"1.7778\\\",\\\"prompt\\\":\\\"两个小马在一起跑步\\\",\\\"steps\\\":0.5,\\\"seed\\\":\\\"1357613421\\\",\\\"status\\\":\\\"success\\\",\\\"perf_pre_process_cost\\\":7,\\\"perf_gen_process_cost\\\":54895,\\\"perf_estimated_queue_cost\\\":0,\\\"perf_queue_cost_type\\\":\\\"actual\\\",\\\"perf_queue_cost\\\":43947,\\\"perf_server_total_cost\\\":54356,\\\"fail_item_count\\\":0,\\\"perf_post_process_cost\\\":329,\\\"perf_server_to_websocket_cost\\\":-799,\\\"perf_total_cost\\\":55231,\\\"perf_client_total_cost\\\":336,\\\"notification_type\\\":\\\"websocket_push\\\",\\\"is_time_limited_free\\\":0,\\\"credits_need\\\":0,\\\"credits_now\\\":1180,\\\"generate_type\\\":1,\\\"submit_id\\\":\\\"717c5e9b-d3ff-444d-8d22-85f59dd38da7\\\",\\\"generate_id\\\":\\\"20260224084347D8F218F0D45862717C7C\\\",\\\"request_id\\\":\\\"\\\",\\\"picture_id\\\":\\\"7610225894170365222\\\",\\\"pe_ratio\\\":\\\"2560:1440\\\",\\\"action_type\\\":\\\"generate\\\",\\\"generate_app_name\\\":\\\"web\\\",\\\"prompt_cnt\\\":9,\\\"image_prompt_cnt\\\":0,\\\"prompt_source\\\":\\\"custom\\\",\\\"model_name\\\":\\\"图片5.0 Lite\\\",\\\"model_starling_key\\\":\\\"web_image_model_name_50\\\",\\\"model_key\\\":\\\"high_aes_general_v50\\\",\\\"enter_from\\\":\\\"click\\\",\\\"template_id\\\":\\\"0\\\",\\\"reference_cnt\\\":0,\\\"use_pre_llm\\\":0,\\\"generate_cnt\\\":1,\\\"is_box_select\\\":0,\\\"is_cutout\\\":0,\\\"is_agent_mode\\\":0,\\\"pe_target_num\\\":2,\\\"pe_is_group\\\":1,\\\"history_id\\\":\\\"13489993616908\\\",\\\"ab_tags\\\":\\\"high_aes_general_v50p_stream\\\",\\\"is_describe\\\":0,\\\"time_cost\\\":53886,\\\"perf_is_add_image\\\":\\\"0\\\",\\\"perf_is_agent_mode\\\":\\\"0\\\",\\\"generate_type_str\\\":\\\"1\\\",\\\"error_code\\\":\\\"0\\\",\\\"event_index\\\":1771894585764}\",\"local_time_ms\":1771893881531,\"is_bav\":0,\"ab_sdk_version\":\"91249282,14674564,13753331,15628237,15174027,15174145,15170779,15407184,15567817,15504129,15481561,14902980\",\"session_id\":\"95ac96eb-cba1-47fe-94a4-fbc644d0f38b\"},{\"event\":\"generate_status\",\"params\":\"{\\\"_staging_flag\\\":0,\\\"is_vip\\\":1,\\\"user_subscribe_type\\\":\\\"standard\\\",\\\"url_path\\\":\\\"/ai-tool/generate\\\",\\\"referrer\\\":\\\"/home/\\\",\\\"page\\\":\\\"generation\\\",\\\"definition\\\":\\\"2k\\\",\\\"ratio\\\":\\\"1.7778\\\",\\\"prompt\\\":\\\"两个小马在一起跑步\\\",\\\"steps\\\":0.5,\\\"seed\\\":\\\"1357613421\\\",\\\"status\\\":\\\"success\\\",\\\"is_time_limited_free\\\":0,\\\"credits_need\\\":0,\\\"credits_now\\\":1180,\\\"generate_type\\\":1,\\\"submit_id\\\":\\\"717c5e9b-d3ff-444d-8d22-85f59dd38da7\\\",\\\"generate_id\\\":\\\"20260224084347D8F218F0D45862717C7C\\\",\\\"request_id\\\":\\\"\\\",\\\"picture_id\\\":\\\"7610225894170365222\\\",\\\"pe_ratio\\\":\\\"2560:1440\\\",\\\"action_type\\\":\\\"generate\\\",\\\"generate_app_name\\\":\\\"web\\\",\\\"prompt_cnt\\\":9,\\\"image_prompt_cnt\\\":0,\\\"prompt_source\\\":\\\"custom\\\",\\\"model_name\\\":\\\"图片5.0 Lite\\\",\\\"model_starling_key\\\":\\\"web_image_model_name_50\\\",\\\"model_key\\\":\\\"high_aes_general_v50\\\",\\\"enter_from\\\":\\\"click\\\",\\\"template_id\\\":\\\"0\\\",\\\"reference_cnt\\\":0,\\\"use_pre_llm\\\":0,\\\"generate_cnt\\\":1,\\\"is_box_select\\\":0,\\\"is_cutout\\\":0,\\\"is_agent_mode\\\":0,\\\"pe_target_num\\\":2,\\\"pe_is_group\\\":1,\\\"history_id\\\":\\\"13489993616908\\\",\\\"ab_tags\\\":\\\"high_aes_general_v50p_stream\\\",\\\"is_describe\\\":0,\\\"time_cost\\\":53886,\\\"event_index\\\":1771894585763}\",\"local_time_ms\":1771893881530,\"is_bav\":0,\"ab_sdk_version\":\"91249282,14674564,13753331,15628237,15174027,15174145,15170779,15407184,15567817,15504129,15481561,14902980\",\"session_id\":\"95ac96eb-cba1-47fe-94a4-fbc644d0f38b\"},{\"event\":\"generate_status\",\"params\":\"{\\\"_staging_flag\\\":0,\\\"is_vip\\\":1,\\\"user_subscribe_type\\\":\\\"standard\\\",\\\"url_path\\\":\\\"/ai-tool/generate\\\",\\\"referrer\\\":\\\"/home/\\\",\\\"page\\\":\\\"generation\\\",\\\"definition\\\":\\\"2k\\\",\\\"ratio\\\":\\\"1.7778\\\",\\\"prompt\\\":\\\"两个小马在一起跑步\\\",\\\"steps\\\":0.5,\\\"seed\\\":\\\"1357613421\\\",\\\"status\\\":\\\"success\\\",\\\"is_time_limited_free\\\":0,\\\"credits_need\\\":0,\\\"credits_now\\\":1180,\\\"generate_type\\\":1,\\\"submit_id\\\":\\\"717c5e9b-d3ff-444d-8d22-85f59dd38da7\\\",\\\"generate_id\\\":\\\"20260224084347D8F218F0D45862717C7C\\\",\\\"request_id\\\":\\\"\\\",\\\"picture_id\\\":\\\"7610225894170348838\\\",\\\"pe_ratio\\\":\\\"2560:1440\\\",\\\"action_type\\\":\\\"generate\\\",\\\"generate_app_name\\\":\\\"web\\\",\\\"prompt_cnt\\\":9,\\\"image_prompt_cnt\\\":0,\\\"prompt_source\\\":\\\"custom\\\",\\\"model_name\\\":\\\"图片5.0 Lite\\\",\\\"model_starling_key\\\":\\\"web_image_model_name_50\\\",\\\"model_key\\\":\\\"high_aes_general_v50\\\",\\\"enter_from\\\":\\\"click\\\",\\\"template_id\\\":\\\"0\\\",\\\"reference_cnt\\\":0,\\\"use_pre_llm\\\":0,\\\"generate_cnt\\\":1,\\\"is_box_select\\\":0,\\\"is_cutout\\\":0,\\\"is_agent_mode\\\":0,\\\"pe_target_num\\\":2,\\\"pe_is_group\\\":1,\\\"history_id\\\":\\\"13489993616908\\\",\\\"ab_tags\\\":\\\"high_aes_general_v50p_stream\\\",\\\"is_describe\\\":0,\\\"time_cost\\\":53885,\\\"event_index\\\":1771894585762}\",\"local_time_ms\":1771893881530,\"is_bav\":0,\"ab_sdk_version\":\"91249282,14674564,13753331,15628237,15174027,15174145,15170779,15407184,15567817,15504129,15481561,14902980\",\"session_id\":\"95ac96eb-cba1-47fe-94a4-fbc644d0f38b\"}],\"user\":{\"user_unique_id\":\"704135154117550\",\"user_type\":12,\"user_id\":\"704135154117550\",\"user_is_login\":true,\"web_id\":\"7605602965571765786\"},\"header\":{\"app_id\":513695,\"app_version\":\"0.1.0\",\"os_name\":\"windows\",\"os_version\":\"10\",\"device_model\":\"Windows NT 10.0\",\"language\":\"zh-Hans\",\"platform\":\"web\",\"sdk_version\":\"5.0.53\",\"sdk_lib\":\"js\",\"timezone\":8,\"tz_offset\":-28800,\"resolution\":\"1536x864\",\"browser\":\"Chrome\",\"browser_version\":\"132.0.0.0\",\"referrer\":\"\",\"referrer_host\":\"\",\"width\":1536,\"height\":864,\"screen_width\":1536,\"screen_height\":864,\"tracer_data\":\"{\\\"$utm_from_url\\\":1}\",\"custom\":\"{\\\"channel_level1\\\":\\\"Direct\\\",\\\"channel_level2\\\":\\\"enter_url\\\",\\\"channel_level3\\\":\\\"\\\",\\\"channel_level4\\\":\\\"\\\",\\\"channel_from\\\":\\\"ut\\\",\\\"session_start_url\\\":\\\"https://jimeng.jianying.com/ai-tool/home/\\\",\\\"branch\\\":\\\"release/950\\\",\\\"theme_mode\\\":\\\"dark\\\",\\\"resolution\\\":480,\\\"gpu_exist\\\":\\\"1\\\",\\\"network_type\\\":\\\"4g\\\",\\\"downlink\\\":10,\\\"rtt\\\":0,\\\"web_id\\\":\\\"7605602965571765786\\\",\\\"is_new_framework\\\":1,\\\"store_country\\\":\\\"CN\\\",\\\"language\\\":\\\"zh-Hans\\\",\\\"is_vip\\\":1,\\\"user_subscribe_type\\\":\\\"standard\\\"}\"},\"local_time\":1771893883,\"verbose\":1}]",
+ "method": "POST"
+}); ;
+fetch("https://mon.zijieapi.com/monitor_browser/collect/batch/?biz_id=cn_mweb", {
+ "headers": {
+ "accept": "*/*",
+ "accept-language": "zh-CN,zh;q=0.9",
+ "cache-control": "no-cache",
+ "content-type": "application/json",
+ "pragma": "no-cache",
+ "priority": "u=1, i",
+ "sec-ch-ua": "\"Not A(Brand\";v=\"8\", \"Chromium\";v=\"132\", \"Google Chrome\";v=\"132\"",
+ "sec-ch-ua-mobile": "?0",
+ "sec-ch-ua-platform": "\"Windows\"",
+ "sec-fetch-dest": "empty",
+ "sec-fetch-mode": "cors",
+ "sec-fetch-site": "cross-site",
+ "Referer": "https://jimeng.jianying.com/ai-tool/generate?type=image",
+ "Referrer-Policy": "no-referrer-when-downgrade"
+ },
+ "body": "{\"ev_type\":\"batch\",\"list\":[{\"ev_type\":\"custom\",\"payload\":{\"content\":\"[dreamina-global-logger][2/24/2026, 8:44:41 AM][WebsocketPollingManager:10016] 收到WebSocket消息: {\\\"historyId\\\":\\\"13489993616908\\\",\\\"submitId\\\":\\\"717c5e9b-d3ff-444d-8d22-85f59dd38da7\\\",\\\"priorityQueueTaskMeta\\\":{\\\"taskStatus\\\":3,\\\"historyId\\\":13489993616908,\\\"taskScore\\\":306.6436790103451},\\\"queueInfo\\\":{\\\"priority\\\":3,\\\"queueIdx\\\":0,\\\"queueStatus\\\":3,\\\"queueLength\\\":0,\\\"pollingConfig\\\":{\\\"intervalSeconds\\\":30,\\\"timeoutSeconds\\\":86400},\\\"priorityQueueDisplayThreshold\\\":{\\\"vipQueuingTimeThreshold\\\":300,\\\"waitingTimeThreshold\\\":60},\\\"debugInfo\\\":\\\"{\\\\\\\"have_no_dreamina_queue_name\\\\\\\":true,\\\\\\\"dreamina_matrix_queue_name\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"dreamina_matrix_req_key\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"dreamina_matrix_second_req_key\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"have_no_queue_name\\\\\\\":false,\\\\\\\"queue_name\\\\\\\":\\\\\\\"high_aes_general_v50\\\\\\\",\\\\\\\"matrix_req_key\\\\\\\":\\\\\\\"MImageGen:high_aes_general_v50\\\\\\\",\\\\\\\"matrix_second_req_key\\\\\\\":\\\\\\\"\\\\\\\"}\\\"}}\",\"type\":\"log\",\"level\":\"info\",\"metrics\":{},\"categories\":{\"branch\":\"release/950\"}},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893881223,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":1}},{\"ev_type\":\"custom\",\"payload\":{\"content\":\"[dreamina-global-logger][2/24/2026, 8:44:41 AM][WebsocketPollingManager:10016] 释放资源\",\"type\":\"log\",\"level\":\"info\",\"metrics\":{},\"categories\":{\"branch\":\"release/950\"}},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893881225,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":1}},{\"ev_type\":\"custom\",\"payload\":{\"content\":\"[dreamina-global-logger][2/24/2026, 8:44:41 AM][WebsocketPollingManager:10016] 释放WebSocket处理器\",\"type\":\"log\",\"level\":\"info\",\"metrics\":{},\"categories\":{\"branch\":\"release/950\"}},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893881225,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":1}},{\"ev_type\":\"custom\",\"payload\":{\"content\":\"[dreamina-global-logger][2/24/2026, 8:44:41 AM][WebsocketPollingManager:10016] 消息处理结果: accepted=true, done=true\",\"type\":\"log\",\"level\":\"info\",\"metrics\":{},\"categories\":{\"branch\":\"release/950\"}},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893881225,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":1}},{\"ev_type\":\"custom\",\"payload\":{\"content\":\"[dreamina-global-logger][2/24/2026, 8:44:41 AM][WebsocketPollingManager:10016] 释放资源\",\"type\":\"log\",\"level\":\"info\",\"metrics\":{},\"categories\":{\"branch\":\"release/950\"}},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893881225,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":1}},{\"ev_type\":\"custom\",\"payload\":{\"content\":\"[dreamina-global-logger][2/24/2026, 8:44:41 AM][WebsocketPollingManager:10016] 释放WebSocket处理器\",\"type\":\"log\",\"level\":\"info\",\"metrics\":{},\"categories\":{\"branch\":\"release/950\"}},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893881225,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":1}},{\"ev_type\":\"http\",\"payload\":{\"api\":\"xhr\",\"request\":{\"url\":\"https://jimeng.jianying.com/mweb/v1/get_history_by_ids?aid=513695&device_platform=web®ion=cn&webId=7605602965571765786&da_version=3.3.9&web_version=7.5.0&aigc_features=app_lip_sync\",\"method\":\"post\",\"headers\":{\"accept\":\"application/json, text/plain, */*\",\"content-type\":\"application/json\",\"x-platform\":\"pc\",\"sign\":\"8fc3bf0e10f6a53ae7c0f8fb6c4060c6\",\"device-time\":\"1771893880\",\"sign-ver\":\"1\",\"pf\":\"7\",\"appvr\":\"8.4.0\",\"loc\":\"cn\",\"lan\":\"zh-Hans\",\"app-sdk-version\":\"48.0.0\",\"appid\":\"513695\"},\"timestamp\":1771893880950},\"response\":{\"status\":200,\"is_custom_error\":false,\"timestamp\":1771893881242,\"headers\":{\"content-encoding\":\"br\",\"content-type\":\"application/json; charset=utf-8\",\"date\":\"Tue, 24 Feb 2026 00:44:42 GMT\",\"eagleid\":\"79e4822117718938819483820e\",\"server\":\"Tengine\",\"server-timing\":\"inner; dur=194, cdn-cache;desc=MISS,edge;dur=63,origin;dur=210\",\"strict-transport-security\":\"max-age=31536000; includeSubDomains; preload\",\"timing-allow-origin\":\"*\",\"tt_stable\":\"1\",\"vary\":\"Accept-Encoding\",\"via\":\"cache30.l2cm9-6[210,0], cache13.cn3833[273,0]\",\"x-tt-logid\":\"20260224084442FF5351EED1B4E2770F1A\",\"x-tt-trace-host\":\"01317a0b267e6f7b60df5311a11f49fe3af73538558477decabd66d7160bce59b481767a10ee56813cec34c1fd8277b36e675caa1700f6d92f425f9314519b085b751acc94b60263ded07cae7c2c9bb14ab594b0e71fb6e8a4ab2a4e6267ef93d8891a30c608aed86dd67ab36d04b58a22\",\"x-tt-trace-id\":\"00-260224084442FF5351EED1B4E2770F1A-76738D1806587D56-00\",\"x-tt-trace-tag\":\"id=03;cdn-cache=miss;type=dyn\"},\"timing\":{\"name\":\"https://jimeng.jianying.com/mweb/v1/get_history_by_ids?aid=513695&device_platform=web®ion=cn&webId=7605602965571765786&da_version=3.3.9&web_version=7.5.0&aigc_features=app_lip_sync&msToken=ihykpW25F6ZdjhjeVFqU1JlJcnS7q1jpt3V0MMj57KcgSYXexymGclx9WUAZR1KqlKf3iBxnkNxtzZj1u75VJDsZIxv72ralFzbne1AtshBzB1TFg5Ju2A%3D%3D&a_bogus=QXBY6OgXMsm1o%2Fb-AXkz9Hx7cz60YWRhgZENvypDWzoD\",\"entryType\":\"resource\",\"startTime\":146244.54499999993,\"duration\":288.0700000000652,\"initiatorType\":\"xmlhttprequest\",\"deliveryType\":\"\",\"nextHopProtocol\":\"h2\",\"renderBlockingStatus\":\"non-blocking\",\"workerStart\":0,\"redirectStart\":0,\"redirectEnd\":0,\"fetchStart\":146244.54499999993,\"domainLookupStart\":146244.54499999993,\"domainLookupEnd\":146244.54499999993,\"connectStart\":146244.54499999993,\"secureConnectionStart\":146244.54499999993,\"connectEnd\":146244.54499999993,\"requestStart\":146246.55499999993,\"responseStart\":146531.93999999994,\"firstInterimResponseStart\":0,\"responseEnd\":146532.615,\"transferSize\":4700,\"encodedBodySize\":4400,\"decodedBodySize\":20932,\"responseStatus\":200,\"serverTiming\":[{\"name\":\"inner\",\"duration\":194,\"description\":\"\"},{\"name\":\"cdn-cache\",\"duration\":0,\"description\":\"MISS\"},{\"name\":\"edge\",\"duration\":63,\"description\":\"\"},{\"name\":\"origin\",\"duration\":210,\"description\":\"\"}]}},\"duration\":292},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893880950,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"action_id\":\"1604f566-6181-4ebd-a5d8-80c900642674\",\"sdk_offset\":1055.5,\"sample_rate\":1}},{\"ev_type\":\"http\",\"payload\":{\"api\":\"xhr\",\"request\":{\"url\":\"https://jimeng.jianying.com/mweb/v1/get_history_by_ids?aid=513695&device_platform=web®ion=cn&webId=7605602965571765786&da_version=3.3.9&web_version=7.5.0&aigc_features=app_lip_sync\",\"method\":\"post\",\"headers\":{\"accept\":\"application/json, text/plain, */*\",\"content-type\":\"application/json\",\"x-platform\":\"pc\",\"sign\":\"8fc3bf0e10f6a53ae7c0f8fb6c4060c6\",\"device-time\":\"1771893880\",\"sign-ver\":\"1\",\"pf\":\"7\",\"appvr\":\"8.4.0\",\"loc\":\"cn\",\"lan\":\"zh-Hans\",\"app-sdk-version\":\"48.0.0\",\"appid\":\"513695\"},\"timestamp\":1771893880991},\"response\":{\"status\":200,\"is_custom_error\":false,\"timestamp\":1771893881304,\"headers\":{\"content-encoding\":\"br\",\"content-type\":\"application/json; charset=utf-8\",\"date\":\"Tue, 24 Feb 2026 00:44:42 GMT\",\"eagleid\":\"79e4822117718938819894076e\",\"server\":\"Tengine\",\"server-timing\":\"inner; dur=212, cdn-cache;desc=MISS,edge;dur=21,origin;dur=269\",\"strict-transport-security\":\"max-age=31536000; includeSubDomains; preload\",\"timing-allow-origin\":\"*\",\"tt_stable\":\"1\",\"vary\":\"Accept-Encoding\",\"via\":\"cache9.l2cm9-6[269,0], cache13.cn3833[290,0]\",\"x-tt-logid\":\"2026022408444215A92CE8C12130271BE0\",\"x-tt-trace-host\":\"01317a0b267e6f7b60df5311a11f49fe3ad997f1bc011a7cfd366c9495345054eec735ebaa5c2d209cb5547374a30da826b9e01c2a4d7d318118b83348ce53d23ac84d6e79c47a77bedbd0c9d1c8c91dfc2e4269abb7ad4930b6e73983f985602df897c0aa3ab221e9205735d6ffa3f777\",\"x-tt-trace-id\":\"00-26022408444215A92CE8C12130271BE0-613E5CD2919C01CB-00\",\"x-tt-trace-tag\":\"id=03;cdn-cache=miss;type=dyn\"},\"timing\":{\"name\":\"https://jimeng.jianying.com/mweb/v1/get_history_by_ids?aid=513695&device_platform=web®ion=cn&webId=7605602965571765786&da_version=3.3.9&web_version=7.5.0&aigc_features=app_lip_sync&msToken=ihykpW25F6ZdjhjeVFqU1JlJcnS7q1jpt3V0MMj57KcgSYXexymGclx9WUAZR1KqlKf3iBxnkNxtzZj1u75VJDsZIxv72ralFzbne1AtshBzB1TFg5Ju2A%3D%3D&a_bogus=YfBY6OgXMsm1o%2Fb-AXkz9Hx7cz60YW-VgZENvypDozoe\",\"entryType\":\"resource\",\"startTime\":146285.0149999999,\"duration\":310.73500000010245,\"initiatorType\":\"xmlhttprequest\",\"deliveryType\":\"\",\"nextHopProtocol\":\"h2\",\"renderBlockingStatus\":\"non-blocking\",\"workerStart\":0,\"redirectStart\":0,\"redirectEnd\":0,\"fetchStart\":146285.0149999999,\"domainLookupStart\":146285.0149999999,\"domainLookupEnd\":146285.0149999999,\"connectStart\":146285.0149999999,\"secureConnectionStart\":146285.0149999999,\"connectEnd\":146285.0149999999,\"requestStart\":146286.03000000003,\"responseStart\":146589.85499999998,\"firstInterimResponseStart\":0,\"responseEnd\":146595.75,\"transferSize\":4753,\"encodedBodySize\":4453,\"decodedBodySize\":20920,\"responseStatus\":200,\"serverTiming\":[{\"name\":\"inner\",\"duration\":212,\"description\":\"\"},{\"name\":\"cdn-cache\",\"duration\":0,\"description\":\"MISS\"},{\"name\":\"edge\",\"duration\":21,\"description\":\"\"},{\"name\":\"origin\",\"duration\":269,\"description\":\"\"}]}},\"duration\":313},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893880991,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"action_id\":\"1604f566-6181-4ebd-a5d8-80c900642674\",\"sdk_offset\":1055.5,\"sample_rate\":1}},{\"ev_type\":\"http\",\"payload\":{\"api\":\"xhr\",\"request\":{\"url\":\"https://jimeng.jianying.com/commerce/v1/benefits/user_credit_history\",\"method\":\"post\",\"headers\":{\"accept\":\"application/json, text/plain, */*\",\"content-type\":\"application/json\",\"appid\":\"513695\",\"lan\":\"ZH\",\"sign\":\"ba360efb1e59afe44e5d672d1224ec79\",\"device-time\":\"1771893881\",\"sign-ver\":\"1\",\"pf\":\"7\",\"appvr\":\"8.4.0\"},\"timestamp\":1771893881247},\"response\":{\"status\":200,\"is_custom_error\":false,\"timestamp\":1771893881372,\"headers\":{\"content-encoding\":\"br\",\"content-type\":\"application/json; charset=utf-8\",\"date\":\"Tue, 24 Feb 2026 00:44:42 GMT\",\"eagleid\":\"79e4822117718938822466009e\",\"server\":\"Tengine\",\"server-timing\":\"inner; dur=28, cdn-cache;desc=MISS,edge;dur=25,origin;dur=67\",\"strict-transport-security\":\"max-age=31536000; includeSubDomains; preload\",\"timing-allow-origin\":\"*\",\"tt_stable\":\"1\",\"vary\":\"Accept-Encoding\",\"via\":\"cache38.l2cm9-2[67,0], cache13.cn3833[92,0]\",\"x-tt-logid\":\"20260224084442F5A90089B14FDF7705A6\",\"x-tt-trace-host\":\"01317a0b267e6f7b60df5311a11f49fe3ac4f9ea674a9cf6436ead3be2763b8b3f4315d29676189eb1e472619185c146fbafb8926324989cdfaf402aa09c65af08c79684bcf67d11dd36bfc0a20a3df9daddf2509698b69f5828189ebe85dd70266b123d2e7163a2f4e89323342c805341\",\"x-tt-trace-id\":\"00-260224084442F5A90089B14FDF7705A6-2F2902534893DC0F-00\",\"x-tt-trace-tag\":\"id=03;cdn-cache=miss;type=dyn\"}},\"duration\":125},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893881247,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":1}},{\"ev_type\":\"custom\",\"payload\":{\"name\":\"perf_ai_image_generate\",\"type\":\"event\",\"metrics\":{\"steps\":0.5,\"perf_pre_process_cost\":7,\"perf_gen_process_cost\":54895,\"perf_estimated_queue_cost\":0,\"perf_queue_cost\":43947,\"perf_server_total_cost\":54356,\"fail_item_count\":0,\"perf_post_process_cost\":329,\"perf_server_to_websocket_cost\":-799,\"perf_total_cost\":55231,\"perf_client_total_cost\":336,\"is_time_limited_free\":0,\"credits_need\":0,\"credits_now\":1180,\"generate_type\":1,\"prompt_cnt\":9,\"image_prompt_cnt\":0,\"reference_cnt\":0,\"use_pre_llm\":0,\"generate_cnt\":1,\"is_box_select\":0,\"is_cutout\":0,\"is_agent_mode\":0,\"pe_target_num\":2,\"pe_is_group\":1,\"is_describe\":0,\"time_cost\":53886},\"categories\":{\"pc_sessionId\":\"\",\"app_channel\":\"\",\"pc_did\":\"\",\"branch\":\"release/950\",\"definition\":\"2k\",\"ratio\":\"1.7778\",\"prompt\":\"两个小马在一起跑步\",\"seed\":\"1357613421\",\"status\":\"success\",\"perf_queue_cost_type\":\"actual\",\"notification_type\":\"websocket_push\",\"submit_id\":\"717c5e9b-d3ff-444d-8d22-85f59dd38da7\",\"generate_id\":\"20260224084347D8F218F0D45862717C7C\",\"request_id\":\"\",\"picture_id\":\"7610225894170365222\",\"pe_ratio\":\"2560:1440\",\"action_type\":\"generate\",\"generate_app_name\":\"web\",\"prompt_source\":\"custom\",\"model_name\":\"图片5.0 Lite\",\"model_starling_key\":\"web_image_model_name_50\",\"model_key\":\"high_aes_general_v50\",\"enter_from\":\"click\",\"template_id\":\"0\",\"history_id\":\"13489993616908\",\"ab_tags\":\"high_aes_general_v50p_stream\",\"perf_is_add_image\":\"0\",\"perf_is_agent_mode\":\"0\",\"generate_type_str\":\"1\",\"error_code\":\"0\"}},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893881531,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":1}},{\"ev_type\":\"custom\",\"payload\":{\"content\":\"[dreamina-global-logger][2/24/2026, 8:44:41 AM][ContentGeneratorTaskReportService] content_generator_task_query_end {\\\"submitId\\\":\\\"717c5e9b-d3ff-444d-8d22-85f59dd38da7\\\",\\\"type\\\":\\\"\\\",\\\"generateType\\\":\\\"1\\\",\\\"historyId\\\":\\\"13489993616908\\\",\\\"generateId\\\":\\\"20260224084347D8F218F0D45862717C7C\\\",\\\"statusModel\\\":{\\\"statusCode\\\":50,\\\"recordStatus\\\":2,\\\"errorMsg\\\":\\\"Success\\\",\\\"failStarlingMessage\\\":\\\"\\\",\\\"timeModel\\\":{\\\"createdTime\\\":1771893827644,\\\"finishedTime\\\":1771893882000,\\\"estimatedQueueCostTime\\\":0,\\\"estimatedGenCostTime\\\":43000},\\\"queueInfo\\\":{\\\"priority\\\":3,\\\"queueIdx\\\":0,\\\"queueStatus\\\":3,\\\"queueLength\\\":0,\\\"pollingConfig\\\":{\\\"intervalSeconds\\\":30,\\\"timeoutSeconds\\\":86400},\\\"priorityQueueDisplayThreshold\\\":{\\\"vipQueuingTimeThreshold\\\":300,\\\"waitingTimeThreshold\\\":60},\\\"debugInfo\\\":\\\"{\\\\\\\"have_no_dreamina_queue_name\\\\\\\":true,\\\\\\\"dreamina_matrix_queue_name\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"dreamina_matrix_req_key\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"dreamina_matrix_second_req_key\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"have_no_queue_name\\\\\\\":false,\\\\\\\"queue_name\\\\\\\":\\\\\\\"high_aes_general_v50\\\\\\\",\\\\\\\"matrix_req_key\\\\\\\":\\\\\\\"MImageGen:high_aes_general_v50\\\\\\\",\\\\\\\"matrix_second_req_key\\\\\\\":\\\\\\\"\\\\\\\"}\\\"}}}\",\"type\":\"log\",\"level\":\"info\",\"metrics\":{},\"categories\":{\"branch\":\"release/950\"}},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893881531,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":1}},{\"ev_type\":\"resource\",\"payload\":{\"name\":\"https://p26-dreamina-sign.byteimg.com/tos-cn-i-tb4s082cfz/7ade6c55c59b4807b39fdafe226a061b~tplv-tb4s082cfz-aigc_resize:360:360.webp?lk3s=43402efa&x-expires=1774224000&x-signature=t8RsvYciFQQDYQZgaUIt3XgVb6w%3D&format=.webp\",\"entryType\":\"resource\",\"startTime\":146638.93999999994,\"duration\":161.01500000013039,\"initiatorType\":\"img\",\"deliveryType\":\"\",\"nextHopProtocol\":\"h2\",\"renderBlockingStatus\":\"non-blocking\",\"workerStart\":0,\"redirectStart\":0,\"redirectEnd\":0,\"fetchStart\":146638.93999999994,\"domainLookupStart\":146638.93999999994,\"domainLookupEnd\":146638.93999999994,\"connectStart\":146638.93999999994,\"secureConnectionStart\":146638.93999999994,\"connectEnd\":146638.93999999994,\"requestStart\":146642.34000000008,\"responseStart\":146795.71500000008,\"firstInterimResponseStart\":0,\"responseEnd\":146799.95500000007,\"transferSize\":16976,\"encodedBodySize\":16676,\"decodedBodySize\":16676,\"responseStatus\":200,\"serverTiming\":[{\"name\":\"cdn-cache\",\"duration\":0,\"description\":\"MISS\"},{\"name\":\"edge\",\"duration\":42,\"description\":\"\"},{\"name\":\"origin\",\"duration\":108,\"description\":\"\"},{\"name\":\"inner\",\"duration\":102,\"description\":\"\"}]},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893881545,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":0.1}},{\"ev_type\":\"http\",\"payload\":{\"api\":\"xhr\",\"request\":{\"url\":\"https://jimeng.jianying.com/commerce/v1/benefits/user_credit_history\",\"method\":\"post\",\"headers\":{\"accept\":\"application/json, text/plain, */*\",\"content-type\":\"application/json\",\"appid\":\"513695\",\"lan\":\"ZH\",\"sign\":\"ba360efb1e59afe44e5d672d1224ec79\",\"device-time\":\"1771893881\",\"sign-ver\":\"1\",\"pf\":\"7\",\"appvr\":\"8.4.0\"},\"timestamp\":1771893881308},\"response\":{\"status\":200,\"is_custom_error\":false,\"timestamp\":1771893881438,\"headers\":{\"content-encoding\":\"br\",\"content-type\":\"application/json; charset=utf-8\",\"date\":\"Tue, 24 Feb 2026 00:44:42 GMT\",\"eagleid\":\"79e4822117718938823146490e\",\"server\":\"Tengine\",\"server-timing\":\"inner; dur=43, cdn-cache;desc=MISS,edge;dur=22,origin;dur=65\",\"strict-transport-security\":\"max-age=31536000; includeSubDomains; preload\",\"timing-allow-origin\":\"*\",\"tt_stable\":\"1\",\"vary\":\"Accept-Encoding\",\"via\":\"cache40.l2cm9-6[65,0], cache13.cn3833[87,0]\",\"x-tt-logid\":\"20260224084442665C4FE57ACD6371C0C9\",\"x-tt-trace-host\":\"01317a0b267e6f7b60df5311a11f49fe3ad210d245355e6cdd8ea5148afb82fe9c4edbb9b4cd03d5fc6bbcf707c71596e9b8b7b9a2544cf2ccc5564fad92ef9c0f351c56c718c93d8485bdfeb6d3378bcf7664f852904282c440c60b8474912da238b39ef34d0c3abb306253b2b4bb2b31\",\"x-tt-trace-id\":\"00-260224084442665C4FE57ACD6371C0C9-0A64AC5F21D8A516-00\",\"x-tt-trace-tag\":\"id=03;cdn-cache=miss;type=dyn\"}},\"duration\":130},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893881308,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":1}},{\"ev_type\":\"http\",\"payload\":{\"api\":\"xhr\",\"request\":{\"url\":\"https://jimeng.jianying.com/mweb/v1/get_history_by_ids?aid=513695&device_platform=web®ion=cn&webId=7605602965571765786&da_version=3.3.9&web_version=7.5.0&aigc_features=app_lip_sync\",\"method\":\"post\",\"headers\":{\"accept\":\"application/json, text/plain, */*\",\"content-type\":\"application/json\",\"x-platform\":\"pc\",\"sign\":\"cd10f9d7d6a45a52bc58acf278a5314c\",\"device-time\":\"1771893881\",\"sign-ver\":\"1\",\"pf\":\"7\",\"appvr\":\"8.4.0\",\"loc\":\"cn\",\"lan\":\"zh-Hans\",\"app-sdk-version\":\"48.0.0\",\"appid\":\"513695\"},\"timestamp\":1771893881202},\"response\":{\"status\":200,\"is_custom_error\":false,\"timestamp\":1771893881524,\"headers\":{\"content-encoding\":\"br\",\"content-type\":\"application/json; charset=utf-8\",\"date\":\"Tue, 24 Feb 2026 00:44:42 GMT\",\"eagleid\":\"79e4822117718938822015672e\",\"server\":\"Tengine\",\"server-timing\":\"inner; dur=200, cdn-cache;desc=MISS,edge;dur=7,origin;dur=271\",\"strict-transport-security\":\"max-age=31536000; includeSubDomains; preload\",\"timing-allow-origin\":\"*\",\"tt_stable\":\"1\",\"vary\":\"Accept-Encoding\",\"via\":\"cache54.l2ea120-5[271,0], cache13.cn3833[278,0]\",\"x-tt-logid\":\"20260224084442386016622F03A26D867C\",\"x-tt-trace-host\":\"01317a0b267e6f7b60df5311a11f49fe3aa0acf1ff0796fd3b29f06d5bc5479c88a224a2cc80afe7c8143821d6d70cc35d10dbfc4609d3be6ac921b4ebcec62d243aa6edf028b6c06bc3120d9ce02bdb0aa5495db65a9ab08b11b46e473b224ed0ff5ae4e97302cd70b56054d04b66bf3a\",\"x-tt-trace-id\":\"00-260224084442386016622F03A26D867C-313B8AC31C77C855-00\",\"x-tt-trace-tag\":\"id=03;cdn-cache=miss;type=dyn\"},\"timing\":{\"name\":\"https://jimeng.jianying.com/mweb/v1/get_history_by_ids?aid=513695&device_platform=web®ion=cn&webId=7605602965571765786&da_version=3.3.9&web_version=7.5.0&aigc_features=app_lip_sync&msToken=ihykpW25F6ZdjhjeVFqU1JlJcnS7q1jpt3V0MMj57KcgSYXexymGclx9WUAZR1KqlKf3iBxnkNxtzZj1u75VJDsZIxv72ralFzbne1AtshBzB1TFg5Ju2A%3D%3D&a_bogus=m7MY6cgXMsm1o%2Fb-AXkz9Hx7czf0YWRkgZENvypkUUop\",\"entryType\":\"resource\",\"startTime\":146496.68500000006,\"duration\":295.2449999998789,\"initiatorType\":\"xmlhttprequest\",\"deliveryType\":\"\",\"nextHopProtocol\":\"h2\",\"renderBlockingStatus\":\"non-blocking\",\"workerStart\":0,\"redirectStart\":0,\"redirectEnd\":0,\"fetchStart\":146496.68500000006,\"domainLookupStart\":146496.68500000006,\"domainLookupEnd\":146496.68500000006,\"connectStart\":146496.68500000006,\"secureConnectionStart\":146496.68500000006,\"connectEnd\":146496.68500000006,\"requestStart\":146498.47999999998,\"responseStart\":146790.08000000007,\"firstInterimResponseStart\":0,\"responseEnd\":146791.92999999993,\"transferSize\":4792,\"encodedBodySize\":4492,\"decodedBodySize\":20958,\"responseStatus\":200,\"serverTiming\":[{\"name\":\"inner\",\"duration\":200,\"description\":\"\"},{\"name\":\"cdn-cache\",\"duration\":0,\"description\":\"MISS\"},{\"name\":\"edge\",\"duration\":7,\"description\":\"\"},{\"name\":\"origin\",\"duration\":271,\"description\":\"\"}]}},\"duration\":322},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893881202,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"action_id\":\"1604f566-6181-4ebd-a5d8-80c900642674\",\"sdk_offset\":1055.5,\"sample_rate\":1}},{\"ev_type\":\"resource\",\"payload\":{\"name\":\"https://p26-dreamina-sign.byteimg.com/tos-cn-i-tb4s082cfz/1f315f04e5c74478b17c0c11144e92fa~tplv-tb4s082cfz-aigc_resize:360:360.webp?lk3s=43402efa&x-expires=1774224000&x-signature=2%2Fl%2BO%2ByjZ69tyyuBpqEMYoh9uYM%3D&format=.webp\",\"entryType\":\"resource\",\"startTime\":146849.71500000008,\"duration\":120.48499999986961,\"initiatorType\":\"img\",\"deliveryType\":\"\",\"nextHopProtocol\":\"h2\",\"renderBlockingStatus\":\"non-blocking\",\"workerStart\":0,\"redirectStart\":0,\"redirectEnd\":0,\"fetchStart\":146849.71500000008,\"domainLookupStart\":146849.71500000008,\"domainLookupEnd\":146849.71500000008,\"connectStart\":146849.71500000008,\"secureConnectionStart\":146849.71500000008,\"connectEnd\":146849.71500000008,\"requestStart\":146851.9850000001,\"responseStart\":146969.4750000001,\"firstInterimResponseStart\":0,\"responseEnd\":146970.19999999995,\"transferSize\":12430,\"encodedBodySize\":12130,\"decodedBodySize\":12130,\"responseStatus\":200,\"serverTiming\":[{\"name\":\"cdn-cache\",\"duration\":0,\"description\":\"MISS\"},{\"name\":\"edge\",\"duration\":49,\"description\":\"\"},{\"name\":\"origin\",\"duration\":64,\"description\":\"\"},{\"name\":\"inner\",\"duration\":4,\"description\":\"\"}]},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893881679,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":0.1}},{\"ev_type\":\"http\",\"payload\":{\"api\":\"xhr\",\"request\":{\"url\":\"https://jimeng.jianying.com/mweb/v1/batch_collect?web_id=7605602965571765786\",\"method\":\"post\",\"headers\":{\"accept\":\"application/json, text/plain, */*\",\"content-type\":\"application/json\",\"appid\":\"513695\"},\"timestamp\":1771893881532},\"response\":{\"status\":200,\"is_custom_error\":false,\"timestamp\":1771893881642,\"headers\":{\"content-length\":\"98\",\"content-type\":\"application/json; charset=utf-8\",\"date\":\"Tue, 24 Feb 2026 00:44:42 GMT\",\"eagleid\":\"79e4822117718938825297940e\",\"server\":\"Tengine\",\"server-timing\":\"inner; dur=32, cdn-cache;desc=MISS,edge;dur=22,origin;dur=53\",\"strict-transport-security\":\"max-age=31536000; includeSubDomains; preload\",\"timing-allow-origin\":\"*\",\"tt_stable\":\"1\",\"via\":\"cache38.l2cm9-2[53,0], cache13.cn3833[75,0]\",\"x-tt-logid\":\"202602240844425FFC80077308D06F931D\",\"x-tt-trace-host\":\"01317a0b267e6f7b60df5311a11f49fe3a14900263fbe6e2722234a3c9eb71e0f6df18a4d616a009e461cb5aa806a6c9c77805b2aded47434d298ad44c24cf1b057907e35903e966557e268312bc7680fe295cbb7039db32eecf01d7350feb21f5d757c2b75f3f8329689fa9566ad6ddf6\",\"x-tt-trace-id\":\"00-2602240844425FFC80077308D06F931D-6865E0155A6F6166-00\",\"x-tt-trace-tag\":\"id=03;cdn-cache=miss;type=dyn\"},\"timing\":{\"name\":\"https://jimeng.jianying.com/mweb/v1/batch_collect?web_id=7605602965571765786\",\"entryType\":\"resource\",\"startTime\":146824.78000000003,\"duration\":104.68999999994412,\"initiatorType\":\"xmlhttprequest\",\"deliveryType\":\"\",\"nextHopProtocol\":\"h2\",\"renderBlockingStatus\":\"non-blocking\",\"workerStart\":0,\"redirectStart\":0,\"redirectEnd\":0,\"fetchStart\":146824.78000000003,\"domainLookupStart\":146824.78000000003,\"domainLookupEnd\":146824.78000000003,\"connectStart\":146824.78000000003,\"secureConnectionStart\":146824.78000000003,\"connectEnd\":146824.78000000003,\"requestStart\":146826.16999999993,\"responseStart\":146915.21999999997,\"firstInterimResponseStart\":0,\"responseEnd\":146929.46999999997,\"transferSize\":398,\"encodedBodySize\":98,\"decodedBodySize\":98,\"responseStatus\":200,\"serverTiming\":[{\"name\":\"inner\",\"duration\":32,\"description\":\"\"},{\"name\":\"cdn-cache\",\"duration\":0,\"description\":\"MISS\"},{\"name\":\"edge\",\"duration\":22,\"description\":\"\"},{\"name\":\"origin\",\"duration\":53,\"description\":\"\"}]}},\"duration\":110},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893881532,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"action_id\":\"1604f566-6181-4ebd-a5d8-80c900642674\",\"sdk_offset\":1055.5,\"sample_rate\":1}},{\"ev_type\":\"http\",\"payload\":{\"api\":\"xhr\",\"request\":{\"url\":\"https://jimeng.jianying.com/mweb/v1/batch_collect?web_id=7605602965571765786\",\"method\":\"post\",\"headers\":{\"accept\":\"application/json, text/plain, */*\",\"content-type\":\"application/json\",\"appid\":\"513695\"},\"timestamp\":1771893881533},\"response\":{\"status\":200,\"is_custom_error\":false,\"timestamp\":1771893881649,\"headers\":{\"content-length\":\"98\",\"content-type\":\"application/json; charset=utf-8\",\"date\":\"Tue, 24 Feb 2026 00:44:42 GMT\",\"eagleid\":\"79e4822117718938825367979e\",\"server\":\"Tengine\",\"server-timing\":\"inner; dur=21, cdn-cache;desc=MISS,edge;dur=22,origin;dur=61\",\"strict-transport-security\":\"max-age=31536000; includeSubDomains; preload\",\"timing-allow-origin\":\"*\",\"tt_stable\":\"1\",\"via\":\"cache9.l2cm9-2[61,0], cache13.cn3833[83,0]\",\"x-tt-logid\":\"20260224084442F2C75B08C18605AC442B\",\"x-tt-trace-host\":\"01317a0b267e6f7b60df5311a11f49fe3a208114c1238e3362d62c19122f1eab3a28daf18355edfc2b29ea4b67010a58724b35b970fe9441190471f42c38d73bdc9ac440d47e6e10838b1a440fba58ed7d4a135d04c47f203999d310e7e8756a3e05ff51ac15ad8a3e7e534df02f73f179\",\"x-tt-trace-id\":\"00-260224084442F2C75B08C18605AC442B-12E125524A885F46-00\",\"x-tt-trace-tag\":\"id=03;cdn-cache=miss;type=dyn\"},\"timing\":{\"name\":\"https://jimeng.jianying.com/mweb/v1/batch_collect?web_id=7605602965571765786\",\"entryType\":\"resource\",\"startTime\":146824.78000000003,\"duration\":104.68999999994412,\"initiatorType\":\"xmlhttprequest\",\"deliveryType\":\"\",\"nextHopProtocol\":\"h2\",\"renderBlockingStatus\":\"non-blocking\",\"workerStart\":0,\"redirectStart\":0,\"redirectEnd\":0,\"fetchStart\":146824.78000000003,\"domainLookupStart\":146824.78000000003,\"domainLookupEnd\":146824.78000000003,\"connectStart\":146824.78000000003,\"secureConnectionStart\":146824.78000000003,\"connectEnd\":146824.78000000003,\"requestStart\":146826.16999999993,\"responseStart\":146915.21999999997,\"firstInterimResponseStart\":0,\"responseEnd\":146929.46999999997,\"transferSize\":398,\"encodedBodySize\":98,\"decodedBodySize\":98,\"responseStatus\":200,\"serverTiming\":[{\"name\":\"inner\",\"duration\":32,\"description\":\"\"},{\"name\":\"cdn-cache\",\"duration\":0,\"description\":\"MISS\"},{\"name\":\"edge\",\"duration\":22,\"description\":\"\"},{\"name\":\"origin\",\"duration\":53,\"description\":\"\"}]}},\"duration\":116},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893881533,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"action_id\":\"1604f566-6181-4ebd-a5d8-80c900642674\",\"sdk_offset\":1055.5,\"sample_rate\":1}},{\"ev_type\":\"http\",\"payload\":{\"api\":\"xhr\",\"request\":{\"url\":\"https://jimeng.jianying.com/commerce/v1/benefits/user_credit_history\",\"method\":\"post\",\"headers\":{\"accept\":\"application/json, text/plain, */*\",\"content-type\":\"application/json\",\"appid\":\"513695\",\"lan\":\"ZH\",\"sign\":\"ba360efb1e59afe44e5d672d1224ec79\",\"device-time\":\"1771893881\",\"sign-ver\":\"1\",\"pf\":\"7\",\"appvr\":\"8.4.0\"},\"timestamp\":1771893881534},\"response\":{\"status\":200,\"is_custom_error\":false,\"timestamp\":1771893881680,\"headers\":{\"content-encoding\":\"br\",\"content-type\":\"application/json; charset=utf-8\",\"date\":\"Tue, 24 Feb 2026 00:44:42 GMT\",\"eagleid\":\"79e4822117718938825448037e\",\"server\":\"Tengine\",\"server-timing\":\"inner; dur=40, cdn-cache;desc=MISS,edge;dur=20,origin;dur=96\",\"strict-transport-security\":\"max-age=31536000; includeSubDomains; preload\",\"timing-allow-origin\":\"*\",\"tt_stable\":\"1\",\"vary\":\"Accept-Encoding\",\"via\":\"cache29.l2nu20-8[96,0], cache13.cn3833[116,0]\",\"x-tt-logid\":\"202602240844423579B00BE4C2DA710C34\",\"x-tt-trace-host\":\"01317a0b267e6f7b60df5311a11f49fe3a3932144bf41ab18680c84b8532b3007a3169b484af42199674ce56813c81f159d03cc51063df205eacaace2a24b3fd8fd2450a185ac72d8d5dcb1de1b856601c3c8328a85492450a3fa6f13724b14d1c89b168bab69b9880793edbe4a262ba0e\",\"x-tt-trace-id\":\"00-2602240844423579B00BE4C2DA710C34-47EB6C3D0F80BBF6-00\",\"x-tt-trace-tag\":\"id=03;cdn-cache=miss;type=dyn\"}},\"duration\":146},\"common\":{\"bid\":\"cn_mweb\",\"user_id\":\"704135154117550\",\"device_id\":\"ec92ab28-fedf-43fe-bc90-38c858bebf1a\",\"session_id\":\"2026022408421578356F9C41F3519F4FFA\",\"release\":\"1.0.10.5857\",\"env\":\"production\",\"url\":\"https://jimeng.jianying.com/ai-tool/generate?type=image\",\"timestamp\":1771893881534,\"sdk_version\":\"1.16.5\",\"sdk_name\":\"SDK_SLARDAR_WEB\",\"pid\":\"/ai-tool/generate\",\"view_id\":\"/ai-tool/generate_1771893759737\",\"context\":{\"ssrPreRenderContent\":\"both\",\"isAGWInjectSuccess\":\"true\",\"idc\":\"lf\",\"hasHidden\":\"false\",\"renderCacheStatus\":\"hit\",\"homeRenderRaceResult\":\"finishRender\"},\"network_type\":\"4g\",\"sdk_offset\":1055.5,\"sample_rate\":1}}]}",
+ "method": "POST"
+});
\ No newline at end of file
diff --git a/doc/example-0.png b/doc/example-0.png
new file mode 100644
index 0000000..3969a94
Binary files /dev/null and b/doc/example-0.png differ
diff --git a/doc/example-1.jpeg b/doc/example-1.jpeg
new file mode 100644
index 0000000..c101942
Binary files /dev/null and b/doc/example-1.jpeg differ
diff --git a/docs/JIMENG-4.1-4.5.md b/docs/JIMENG-4.1-4.5.md
new file mode 100644
index 0000000..71ec0c3
--- /dev/null
+++ b/docs/JIMENG-4.1-4.5.md
@@ -0,0 +1,170 @@
+# 即梦 AI 4.1 和 4.5 模型支持
+
+本文档介绍了 jimeng-free-api-all 项目对即梦 AI 新增的 4.1 和 4.5 模型的支持。
+
+## 新增模型
+
+### jimeng-4.5
+- **内部模型名**: `high_aes_general_v45`
+- **版本**: 3.2.9
+- **特性**:
+ - 支持文生图(Text-to-Image)
+ - 支持图生图(Image-to-Image)
+ - 支持多图连续生成
+ - 最高支持 2048x2048 分辨率
+
+### jimeng-4.1
+- **内部模型名**: `high_aes_general_v41`
+- **版本**: 3.2.9
+- **特性**:
+ - 支持文生图(Text-to-Image)
+ - 支持图生图(Image-to-Image)
+ - 支持多图连续生成
+ - 最高支持 2048x2048 分辨率
+
+## 与旧版本的差异
+
+| 特性 | jimeng-4.5/4.1 | jimeng-4.0 | jimeng-3.1 |
+|------|----------------|------------|------------|
+| Draft版本 | 3.2.9 | 3.0.2 | 3.0.2 |
+| 多图生成 | ✅ | ✅ | ❌ |
+| 最大分辨率 | 2048x2048 | 2048x2048 | 1024x1024 |
+| 采样强度范围 | 0.1-1.0 | 0.1-1.0 | 0.1-0.8 |
+
+## API 使用
+
+### 1. 文生图
+
+```bash
+curl -X POST http://localhost:8000/v1/images/generations \
+ -H "Content-Type: application/json" \
+ -H "Authorization: Bearer YOUR_SESSION_ID" \
+ -d '{
+ "model": "jimeng-4.5",
+ "prompt": "一只可爱的小猫在花园里玩耍",
+ "width": 1024,
+ "height": 1024,
+ "sample_strength": 0.7
+ }'
+```
+
+### 2. 多图连续生成
+
+```bash
+curl -X POST http://localhost:8000/v1/images/generations \
+ -H "Content-Type: application/json" \
+ -H "Authorization: Bearer YOUR_SESSION_ID" \
+ -d '{
+ "model": "jimeng-4.5",
+ "prompt": "生成4张连续场景的图片:春夏秋冬四季风景",
+ "width": 1024,
+ "height": 1024,
+ "sample_strength": 0.6
+ }'
+```
+
+### 3. 图生图
+
+```bash
+curl -X POST http://localhost:8000/v1/images/compositions \
+ -H "Content-Type: application/json" \
+ -H "Authorization: Bearer YOUR_SESSION_ID" \
+ -d '{
+ "model": "jimeng-4.1",
+ "prompt": "将这些图片合成为一幅美丽的风景画",
+ "images": [
+ "https://example.com/image1.jpg",
+ "https://example.com/image2.jpg"
+ ],
+ "width": 2560,
+ "height": 1440,
+ "sample_strength": 0.6
+ }'
+```
+
+## 参数说明
+
+### 支持的分辨率
+
+- 512x512
+- 768x768
+- 1024x1024(默认)
+- 1280x720
+- 720x1280
+- 1536x864
+- 864x1536
+- 2048x2048(仅 4.1 和 4.5)
+
+### 采样强度(sample_strength)
+
+- 范围:0.1 - 1.0
+- 默认:0.5
+- 说明:控制生成图片与提示词的契合度,值越高越贴近提示词
+
+## 最佳实践
+
+1. **使用提示词**
+ - 4.5 和 4.1 版本对中文提示词支持更好
+ - 建议使用详细的描述性提示词
+
+2. **多图生成**
+ - 使用 "连续"、"绘本"、"故事" 等关键词触发多图生成
+ - 使用 "X张" 指定生成图片数量
+
+3. **分辨率选择**
+ - 普通场景使用 1024x1024
+ - 需要高清细节时使用 2048x2048
+ - 宽屏场景使用 1280x720
+
+## 测试
+
+项目提供了测试脚本 `test/test-new-models.js`:
+
+```bash
+# 安装依赖
+npm install
+
+# 修改脚本中的 SESSION_ID
+vim test/test-new-models.js
+
+# 运行测试
+npm run test:models
+# 或直接运行
+node test/test-new-models.js
+```
+
+## 注意事项
+
+1. 新模型需要更多的积分消耗
+2. 生成时间可能比旧模型稍长
+3. 建议在生产环境使用前充分测试
+4. 遵守即梦 AI 的使用条款和限制
+
+## 故障排除
+
+### 常见错误
+
+1. **参数验证失败**
+ - 检查分辨率是否在支持列表中
+ - 检查采样强度是否在 0.1-1.0 范围内
+
+2. **模型不支持**
+ - 确保使用的是正确的模型名称(jimeng-4.5 或 jimeng-4.1)
+ - 查看模型列表确认可用性
+
+3. **生成失败**
+ - 检查积分是否充足
+ - 检查提示词是否符合内容规范
+ - 查看日志获取详细错误信息
+
+## 更新日志
+
+### v4.5 支持 (2024-12-07)
+- 新增 jimeng-4.5 模型支持
+- 支持最高 2048x2048 分辨率
+- 优化了提示词理解能力
+
+### v4.1 支持 (2024-12-07)
+- 新增 jimeng-4.1 模型支持
+- 改进了图像生成质量
+- 增强了多图生成功能
\ No newline at end of file
diff --git a/libs.d.ts b/libs.d.ts
new file mode 100644
index 0000000..e69de29
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..7a5448d
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,3347 @@
+{
+ "name": "jimeng-free-api",
+ "version": "0.8.6",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "jimeng-free-api",
+ "version": "0.8.6",
+ "license": "ISC",
+ "dependencies": {
+ "axios": "^1.6.7",
+ "colors": "^1.4.0",
+ "crc-32": "^1.2.2",
+ "cron": "^3.1.6",
+ "date-fns": "^3.3.1",
+ "eventsource-parser": "^1.1.2",
+ "form-data": "^4.0.0",
+ "fs-extra": "^11.2.0",
+ "koa": "^2.15.0",
+ "koa-body": "^5.0.0",
+ "koa-bodyparser": "^4.4.1",
+ "koa-range": "^0.3.0",
+ "koa-router": "^12.0.1",
+ "koa2-cors": "^2.0.6",
+ "lodash": "^4.17.21",
+ "mime": "^4.0.1",
+ "minimist": "^1.2.8",
+ "playwright-core": "^1.49.0",
+ "randomstring": "^1.3.0",
+ "semver": "^7.7.2",
+ "uuid": "^9.0.1",
+ "yaml": "^2.3.4"
+ },
+ "devDependencies": {
+ "@types/lodash": "^4.14.202",
+ "@types/mime": "^3.0.4",
+ "tsup": "^8.0.2",
+ "typescript": "^5.3.3"
+ }
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz",
+ "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz",
+ "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz",
+ "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz",
+ "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz",
+ "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz",
+ "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz",
+ "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz",
+ "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz",
+ "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz",
+ "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz",
+ "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz",
+ "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz",
+ "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz",
+ "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz",
+ "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz",
+ "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz",
+ "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-arm64": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz",
+ "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz",
+ "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz",
+ "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz",
+ "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openharmony-arm64": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz",
+ "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz",
+ "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz",
+ "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz",
+ "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz",
+ "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@hapi/bourne": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-3.0.0.tgz",
+ "integrity": "sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@isaacs/cliui": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
+ "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/set-array": "^1.2.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
+ "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.25",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
+ "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@noble/hashes": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz",
+ "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==",
+ "license": "MIT",
+ "engines": {
+ "node": "^14.21.3 || >=16"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/@paralleldrive/cuid2": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.3.1.tgz",
+ "integrity": "sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==",
+ "license": "MIT",
+ "dependencies": {
+ "@noble/hashes": "^1.1.5"
+ }
+ },
+ "node_modules/@pkgjs/parseargs": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.1.tgz",
+ "integrity": "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.1.tgz",
+ "integrity": "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.1.tgz",
+ "integrity": "sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.1.tgz",
+ "integrity": "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.1.tgz",
+ "integrity": "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.1.tgz",
+ "integrity": "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.1.tgz",
+ "integrity": "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.1.tgz",
+ "integrity": "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.1.tgz",
+ "integrity": "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.1.tgz",
+ "integrity": "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loong64-gnu": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.1.tgz",
+ "integrity": "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loong64-musl": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.1.tgz",
+ "integrity": "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-gnu": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.1.tgz",
+ "integrity": "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-musl": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.1.tgz",
+ "integrity": "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.1.tgz",
+ "integrity": "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-musl": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.1.tgz",
+ "integrity": "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.1.tgz",
+ "integrity": "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.1.tgz",
+ "integrity": "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.1.tgz",
+ "integrity": "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-openbsd-x64": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.1.tgz",
+ "integrity": "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-openharmony-arm64": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.1.tgz",
+ "integrity": "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.1.tgz",
+ "integrity": "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.1.tgz",
+ "integrity": "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-gnu": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.1.tgz",
+ "integrity": "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.1.tgz",
+ "integrity": "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/formidable": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@types/formidable/-/formidable-2.0.6.tgz",
+ "integrity": "sha512-L4HcrA05IgQyNYJj6kItuIkXrInJvsXTPC5B1i64FggWKKqSL+4hgt7asiSNva75AoLQjq29oPxFfU4GAQ6Z2w==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/lodash": {
+ "version": "4.17.7",
+ "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.7.tgz",
+ "integrity": "sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/luxon": {
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.4.2.tgz",
+ "integrity": "sha512-TifLZlFudklWlMBfhubvgqTXRzLDI5pCbGa4P8a3wPyUQSW+1xQ5eDsreP9DWHX3tjq1ke96uYG/nwundroWcA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/mime": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.4.tgz",
+ "integrity": "sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/node": {
+ "version": "20.14.12",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.12.tgz",
+ "integrity": "sha512-r7wNXakLeSsGT0H1AU863vS2wa5wBOK4bWMjZz2wj+8nBx+m5PeIn0k8AloSLpRuiwdRQZwarZqHE4FNArPuJQ==",
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~5.26.4"
+ }
+ },
+ "node_modules/accepts": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
+ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-types": "~2.1.34",
+ "negotiator": "0.6.3"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.15.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
+ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+ "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/any-promise": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/asap": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==",
+ "license": "MIT"
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+ "license": "MIT"
+ },
+ "node_modules/axios": {
+ "version": "1.13.5",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.5.tgz",
+ "integrity": "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==",
+ "license": "MIT",
+ "dependencies": {
+ "follow-redirects": "^1.15.11",
+ "form-data": "^4.0.5",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/brace-expansion": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/bundle-require": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz",
+ "integrity": "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "load-tsconfig": "^0.2.3"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "esbuild": ">=0.18"
+ }
+ },
+ "node_modules/bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/cac": {
+ "version": "6.7.14",
+ "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
+ "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cache-content-type": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz",
+ "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-types": "^2.1.18",
+ "ylru": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/call-bound": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "get-intrinsic": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
+ "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "readdirp": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 14.16.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==",
+ "license": "MIT",
+ "engines": {
+ "iojs": ">= 1.0.0",
+ "node": ">= 0.12.0"
+ }
+ },
+ "node_modules/co-body": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/co-body/-/co-body-5.2.0.tgz",
+ "integrity": "sha512-sX/LQ7LqUhgyaxzbe7IqwPeTr2yfpfUIQ/dgpKo6ZI4y4lpQA0YxAomWIY+7I7rHWcG02PG+OuPREzMW/5tszQ==",
+ "license": "MIT",
+ "dependencies": {
+ "inflation": "^2.0.0",
+ "qs": "^6.4.0",
+ "raw-body": "^2.2.0",
+ "type-is": "^1.6.14"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/colors": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
+ "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.1.90"
+ }
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "license": "MIT",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/commander": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/confbox": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz",
+ "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/consola": {
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz",
+ "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^14.18.0 || >=16.10.0"
+ }
+ },
+ "node_modules/content-disposition": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
+ "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "5.2.1"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/content-type": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookies": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.9.1.tgz",
+ "integrity": "sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==",
+ "license": "MIT",
+ "dependencies": {
+ "depd": "~2.0.0",
+ "keygrip": "~1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/copy-to": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/copy-to/-/copy-to-2.0.1.tgz",
+ "integrity": "sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w==",
+ "license": "MIT"
+ },
+ "node_modules/crc-32": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz",
+ "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==",
+ "license": "Apache-2.0",
+ "bin": {
+ "crc32": "bin/crc32.njs"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/cron": {
+ "version": "3.1.7",
+ "resolved": "https://registry.npmjs.org/cron/-/cron-3.1.7.tgz",
+ "integrity": "sha512-tlBg7ARsAMQLzgwqVxy8AZl/qlTc5nibqYwtNGoCrd+cV+ugI+tvZC1oT/8dFH8W455YrywGykx/KMmAqOr7Jw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/luxon": "~3.4.0",
+ "luxon": "~3.4.0"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/date-fns": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz",
+ "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/kossnocorp"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/deep-equal": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz",
+ "integrity": "sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==",
+ "license": "MIT"
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/delegates": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
+ "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==",
+ "license": "MIT"
+ },
+ "node_modules/depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/destroy": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/dezalgo": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz",
+ "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==",
+ "license": "ISC",
+ "dependencies": {
+ "asap": "^2.0.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
+ "license": "MIT"
+ },
+ "node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-set-tostringtag": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/esbuild": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz",
+ "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.27.3",
+ "@esbuild/android-arm": "0.27.3",
+ "@esbuild/android-arm64": "0.27.3",
+ "@esbuild/android-x64": "0.27.3",
+ "@esbuild/darwin-arm64": "0.27.3",
+ "@esbuild/darwin-x64": "0.27.3",
+ "@esbuild/freebsd-arm64": "0.27.3",
+ "@esbuild/freebsd-x64": "0.27.3",
+ "@esbuild/linux-arm": "0.27.3",
+ "@esbuild/linux-arm64": "0.27.3",
+ "@esbuild/linux-ia32": "0.27.3",
+ "@esbuild/linux-loong64": "0.27.3",
+ "@esbuild/linux-mips64el": "0.27.3",
+ "@esbuild/linux-ppc64": "0.27.3",
+ "@esbuild/linux-riscv64": "0.27.3",
+ "@esbuild/linux-s390x": "0.27.3",
+ "@esbuild/linux-x64": "0.27.3",
+ "@esbuild/netbsd-arm64": "0.27.3",
+ "@esbuild/netbsd-x64": "0.27.3",
+ "@esbuild/openbsd-arm64": "0.27.3",
+ "@esbuild/openbsd-x64": "0.27.3",
+ "@esbuild/openharmony-arm64": "0.27.3",
+ "@esbuild/sunos-x64": "0.27.3",
+ "@esbuild/win32-arm64": "0.27.3",
+ "@esbuild/win32-ia32": "0.27.3",
+ "@esbuild/win32-x64": "0.27.3"
+ }
+ },
+ "node_modules/escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
+ "license": "MIT"
+ },
+ "node_modules/eventsource-parser": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-1.1.2.tgz",
+ "integrity": "sha512-v0eOBUbiaFojBu2s2NPBfYUoRR9GjcDNvCXVaqEf5vVfpIAh9f8RCo4vXTP8c63QRKCFwoLpMpTdPwwhEKVgzA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.18"
+ }
+ },
+ "node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/fix-dts-default-cjs-exports": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/fix-dts-default-cjs-exports/-/fix-dts-default-cjs-exports-1.0.1.tgz",
+ "integrity": "sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "magic-string": "^0.30.17",
+ "mlly": "^1.7.4",
+ "rollup": "^4.34.8"
+ }
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.15.11",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz",
+ "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/foreground-child": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz",
+ "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/foreground-child/node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz",
+ "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==",
+ "license": "MIT",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "es-set-tostringtag": "^2.1.0",
+ "hasown": "^2.0.2",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/formidable": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.5.tgz",
+ "integrity": "sha512-Oz5Hwvwak/DCaXVVUtPn4oLMLLy1CdclLKO1LFgU7XzDpVMUU5UjlSLpGMocyQNNk8F6IJW9M/YdooSn2MRI+Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@paralleldrive/cuid2": "^2.2.2",
+ "dezalgo": "^1.0.4",
+ "once": "^1.4.0",
+ "qs": "^6.11.0"
+ },
+ "funding": {
+ "url": "https://ko-fi.com/tunnckoCore/commissions"
+ }
+ },
+ "node_modules/fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fs-extra": {
+ "version": "11.2.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz",
+ "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==",
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=14.14"
+ }
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/glob": {
+ "version": "10.5.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz",
+ "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==",
+ "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^1.11.1"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "license": "ISC"
+ },
+ "node_modules/has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-tostringtag": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "license": "MIT",
+ "dependencies": {
+ "has-symbols": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/http-assert": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz",
+ "integrity": "sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==",
+ "license": "MIT",
+ "dependencies": {
+ "deep-equal": "~1.0.1",
+ "http-errors": "~1.8.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/http-errors": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz",
+ "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==",
+ "license": "MIT",
+ "dependencies": {
+ "depd": "~1.1.2",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
+ "statuses": ">= 1.5.0 < 2",
+ "toidentifier": "1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/http-errors/node_modules/depd": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+ "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/inflation": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.1.0.tgz",
+ "integrity": "sha512-t54PPJHG1Pp7VQvxyVCJ9mBbjG3Hqryges9bXoOO6GExCPa+//i/d5GSuFtpx3ALLd7lgIAur6zrIlBQyJuMlQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "license": "ISC"
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-generator-function": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz",
+ "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==",
+ "license": "MIT",
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/jackspeak": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
+ "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ },
+ "node_modules/joycon": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz",
+ "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "license": "MIT",
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/keygrip": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz",
+ "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==",
+ "license": "MIT",
+ "dependencies": {
+ "tsscmp": "1.0.6"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/koa": {
+ "version": "2.16.3",
+ "resolved": "https://registry.npmjs.org/koa/-/koa-2.16.3.tgz",
+ "integrity": "sha512-zPPuIt+ku1iCpFBRwseMcPYQ1cJL8l60rSmKeOuGfOXyE6YnTBmf2aEFNL2HQGrD0cPcLO/t+v9RTgC+fwEh/g==",
+ "license": "MIT",
+ "dependencies": {
+ "accepts": "^1.3.5",
+ "cache-content-type": "^1.0.0",
+ "content-disposition": "~0.5.2",
+ "content-type": "^1.0.4",
+ "cookies": "~0.9.0",
+ "debug": "^4.3.2",
+ "delegates": "^1.0.0",
+ "depd": "^2.0.0",
+ "destroy": "^1.0.4",
+ "encodeurl": "^1.0.2",
+ "escape-html": "^1.0.3",
+ "fresh": "~0.5.2",
+ "http-assert": "^1.3.0",
+ "http-errors": "^1.6.3",
+ "is-generator-function": "^1.0.7",
+ "koa-compose": "^4.1.0",
+ "koa-convert": "^2.0.0",
+ "on-finished": "^2.3.0",
+ "only": "~0.0.2",
+ "parseurl": "^1.3.2",
+ "statuses": "^1.5.0",
+ "type-is": "^1.6.16",
+ "vary": "^1.1.2"
+ },
+ "engines": {
+ "node": "^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4"
+ }
+ },
+ "node_modules/koa-body": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/koa-body/-/koa-body-5.0.0.tgz",
+ "integrity": "sha512-nHwEODrQGiyKBILCWO8QSS40C87cKr2cp3y/Cw8u9Z8w5t0CdSkGm3+y9WK5BIAlPpo9tTw5RtSbxpVyG79vmw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/formidable": "^2.0.4",
+ "co-body": "^5.1.1",
+ "formidable": "^2.0.1"
+ }
+ },
+ "node_modules/koa-bodyparser": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/koa-bodyparser/-/koa-bodyparser-4.4.1.tgz",
+ "integrity": "sha512-kBH3IYPMb+iAXnrxIhXnW+gXV8OTzCu8VPDqvcDHW9SQrbkHmqPQtiZwrltNmSq6/lpipHnT7k7PsjlVD7kK0w==",
+ "license": "MIT",
+ "dependencies": {
+ "co-body": "^6.0.0",
+ "copy-to": "^2.0.1",
+ "type-is": "^1.6.18"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/koa-bodyparser/node_modules/co-body": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/co-body/-/co-body-6.2.0.tgz",
+ "integrity": "sha512-Kbpv2Yd1NdL1V/V4cwLVxraHDV6K8ayohr2rmH0J87Er8+zJjcTa6dAn9QMPC9CRgU8+aNajKbSf1TzDB1yKPA==",
+ "license": "MIT",
+ "dependencies": {
+ "@hapi/bourne": "^3.0.0",
+ "inflation": "^2.0.0",
+ "qs": "^6.5.2",
+ "raw-body": "^2.3.3",
+ "type-is": "^1.6.16"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/koa-compose": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz",
+ "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==",
+ "license": "MIT"
+ },
+ "node_modules/koa-convert": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-2.0.0.tgz",
+ "integrity": "sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==",
+ "license": "MIT",
+ "dependencies": {
+ "co": "^4.6.0",
+ "koa-compose": "^4.1.0"
+ },
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/koa-range": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/koa-range/-/koa-range-0.3.0.tgz",
+ "integrity": "sha512-Ich3pCz6RhtbajYXRWjIl6O5wtrLs6kE3nkXc9XmaWe+MysJyZO7K4L3oce1Jpg/iMgCbj+5UCiMm/rqVtcDIg==",
+ "license": "MIT",
+ "dependencies": {
+ "stream-slice": "^0.1.2"
+ },
+ "engines": {
+ "node": ">=7"
+ }
+ },
+ "node_modules/koa-router": {
+ "version": "12.0.1",
+ "resolved": "https://registry.npmjs.org/koa-router/-/koa-router-12.0.1.tgz",
+ "integrity": "sha512-gaDdj3GtzoLoeosacd50kBBTnnh3B9AYxDThQUo4sfUyXdOhY6ku1qyZKW88tQCRgc3Sw6ChXYXWZwwgjOxE0w==",
+ "deprecated": "Please use @koa/router instead, starting from v9! ",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.3.4",
+ "http-errors": "^2.0.0",
+ "koa-compose": "^4.1.0",
+ "methods": "^1.1.2",
+ "path-to-regexp": "^6.2.1"
+ },
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/koa-router/node_modules/http-errors": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
+ "license": "MIT",
+ "dependencies": {
+ "depd": "2.0.0",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "toidentifier": "1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/koa-router/node_modules/statuses": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/koa2-cors": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/koa2-cors/-/koa2-cors-2.0.6.tgz",
+ "integrity": "sha512-JRCcSM4lamM+8kvKGDKlesYk2ASrmSTczDtGUnIadqMgnHU4Ct5Gw7Bxt3w3m6d6dy3WN0PU4oMP43HbddDEWg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 7.6.0"
+ }
+ },
+ "node_modules/lilconfig": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz",
+ "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antonk52"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/load-tsconfig": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz",
+ "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.23",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz",
+ "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==",
+ "license": "MIT"
+ },
+ "node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/luxon": {
+ "version": "3.4.4",
+ "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.4.tgz",
+ "integrity": "sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.21",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
+ "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.5"
+ }
+ },
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-4.0.4.tgz",
+ "integrity": "sha512-v8yqInVjhXyqP6+Kw4fV3ZzeMRqEW6FotRsKXjRS5VMTNIuXsdRoAvklpoRgSqXm6o9VNH4/C0mgedko9DdLsQ==",
+ "funding": [
+ "https://github.com/sponsors/broofa"
+ ],
+ "license": "MIT",
+ "bin": {
+ "mime": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/minipass": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/mlly": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz",
+ "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "acorn": "^8.15.0",
+ "pathe": "^2.0.3",
+ "pkg-types": "^1.3.1",
+ "ufo": "^1.6.1"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "license": "MIT"
+ },
+ "node_modules/mz": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "any-promise": "^1.0.0",
+ "object-assign": "^4.0.1",
+ "thenify-all": "^1.0.0"
+ }
+ },
+ "node_modules/negotiator": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.4",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/on-finished": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "license": "MIT",
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "license": "ISC",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/only": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz",
+ "integrity": "sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ=="
+ },
+ "node_modules/package-json-from-dist": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz",
+ "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==",
+ "dev": true,
+ "license": "BlueOak-1.0.0"
+ },
+ "node_modules/parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-scurry": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
+ "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "lru-cache": "^10.2.0",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/path-to-regexp": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz",
+ "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==",
+ "license": "MIT"
+ },
+ "node_modules/pathe": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
+ "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
+ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pirates": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
+ "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/pkg-types": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz",
+ "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "confbox": "^0.1.8",
+ "mlly": "^1.7.4",
+ "pathe": "^2.0.1"
+ }
+ },
+ "node_modules/playwright-core": {
+ "version": "1.58.2",
+ "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.2.tgz",
+ "integrity": "sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==",
+ "license": "Apache-2.0",
+ "bin": {
+ "playwright-core": "cli.js"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/postcss-load-config": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz",
+ "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "lilconfig": "^3.1.1"
+ },
+ "engines": {
+ "node": ">= 18"
+ },
+ "peerDependencies": {
+ "jiti": ">=1.21.0",
+ "postcss": ">=8.0.9",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
+ },
+ "peerDependenciesMeta": {
+ "jiti": {
+ "optional": true
+ },
+ "postcss": {
+ "optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
+ "license": "MIT"
+ },
+ "node_modules/qs": {
+ "version": "6.15.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz",
+ "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "side-channel": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/randombytes": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.3.tgz",
+ "integrity": "sha512-lDVjxQQFoCG1jcrP06LNo2lbWp4QTShEXnhActFBwYuHprllQV6VUpwreApsYqCgD+N1mHoqJ/BI/4eV4R2GYg==",
+ "license": "MIT"
+ },
+ "node_modules/randomstring": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/randomstring/-/randomstring-1.3.0.tgz",
+ "integrity": "sha512-gY7aQ4i1BgwZ8I1Op4YseITAyiDiajeZOPQUbIq9TPGPhUm5FX59izIaOpmKbME1nmnEiABf28d9K2VSii6BBg==",
+ "license": "MIT",
+ "dependencies": {
+ "randombytes": "2.0.3"
+ },
+ "bin": {
+ "randomstring": "bin/randomstring"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/raw-body": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
+ "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "3.1.2",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/raw-body/node_modules/http-errors": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
+ "license": "MIT",
+ "dependencies": {
+ "depd": "2.0.0",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "toidentifier": "1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/raw-body/node_modules/statuses": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
+ "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14.18.0"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.1.tgz",
+ "integrity": "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "1.0.8"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.57.1",
+ "@rollup/rollup-android-arm64": "4.57.1",
+ "@rollup/rollup-darwin-arm64": "4.57.1",
+ "@rollup/rollup-darwin-x64": "4.57.1",
+ "@rollup/rollup-freebsd-arm64": "4.57.1",
+ "@rollup/rollup-freebsd-x64": "4.57.1",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.57.1",
+ "@rollup/rollup-linux-arm-musleabihf": "4.57.1",
+ "@rollup/rollup-linux-arm64-gnu": "4.57.1",
+ "@rollup/rollup-linux-arm64-musl": "4.57.1",
+ "@rollup/rollup-linux-loong64-gnu": "4.57.1",
+ "@rollup/rollup-linux-loong64-musl": "4.57.1",
+ "@rollup/rollup-linux-ppc64-gnu": "4.57.1",
+ "@rollup/rollup-linux-ppc64-musl": "4.57.1",
+ "@rollup/rollup-linux-riscv64-gnu": "4.57.1",
+ "@rollup/rollup-linux-riscv64-musl": "4.57.1",
+ "@rollup/rollup-linux-s390x-gnu": "4.57.1",
+ "@rollup/rollup-linux-x64-gnu": "4.57.1",
+ "@rollup/rollup-linux-x64-musl": "4.57.1",
+ "@rollup/rollup-openbsd-x64": "4.57.1",
+ "@rollup/rollup-openharmony-arm64": "4.57.1",
+ "@rollup/rollup-win32-arm64-msvc": "4.57.1",
+ "@rollup/rollup-win32-ia32-msvc": "4.57.1",
+ "@rollup/rollup-win32-x64-gnu": "4.57.1",
+ "@rollup/rollup-win32-x64-msvc": "4.57.1",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "license": "MIT"
+ },
+ "node_modules/semver": {
+ "version": "7.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
+ "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/setprototypeof": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
+ "license": "ISC"
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/side-channel": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3",
+ "side-channel-list": "^1.0.0",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-list": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
+ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-weakmap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3",
+ "side-channel-map": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.7.6",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz",
+ "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/statuses": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+ "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/stream-slice": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/stream-slice/-/stream-slice-0.1.2.tgz",
+ "integrity": "sha512-QzQxpoacatkreL6jsxnVb7X5R/pGw9OUv2qWTYWnmLpg4NdN31snPy/f3TdQE1ZUXaThRvj1Zw4/OGg0ZkaLMA==",
+ "license": "MIT"
+ },
+ "node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/string-width-cjs": {
+ "name": "string-width",
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/string-width-cjs/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/strip-ansi-cjs": {
+ "name": "strip-ansi",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi-cjs/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/sucrase": {
+ "version": "3.35.0",
+ "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",
+ "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "commander": "^4.0.0",
+ "glob": "^10.3.10",
+ "lines-and-columns": "^1.1.6",
+ "mz": "^2.7.0",
+ "pirates": "^4.0.1",
+ "ts-interface-checker": "^0.1.9"
+ },
+ "bin": {
+ "sucrase": "bin/sucrase",
+ "sucrase-node": "bin/sucrase-node"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/thenify": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
+ "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "any-promise": "^1.0.0"
+ }
+ },
+ "node_modules/thenify-all": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+ "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "thenify": ">= 3.1.0 < 4"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/tinyexec": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz",
+ "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.15",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
+ "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
+ }
+ },
+ "node_modules/toidentifier": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/tree-kill": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
+ "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "tree-kill": "cli.js"
+ }
+ },
+ "node_modules/ts-interface-checker": {
+ "version": "0.1.13",
+ "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
+ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/tsscmp": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz",
+ "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.6.x"
+ }
+ },
+ "node_modules/tsup": {
+ "version": "8.5.1",
+ "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.5.1.tgz",
+ "integrity": "sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bundle-require": "^5.1.0",
+ "cac": "^6.7.14",
+ "chokidar": "^4.0.3",
+ "consola": "^3.4.0",
+ "debug": "^4.4.0",
+ "esbuild": "^0.27.0",
+ "fix-dts-default-cjs-exports": "^1.0.0",
+ "joycon": "^3.1.1",
+ "picocolors": "^1.1.1",
+ "postcss-load-config": "^6.0.1",
+ "resolve-from": "^5.0.0",
+ "rollup": "^4.34.8",
+ "source-map": "^0.7.6",
+ "sucrase": "^3.35.0",
+ "tinyexec": "^0.3.2",
+ "tinyglobby": "^0.2.11",
+ "tree-kill": "^1.2.2"
+ },
+ "bin": {
+ "tsup": "dist/cli-default.js",
+ "tsup-node": "dist/cli-node.js"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@microsoft/api-extractor": "^7.36.0",
+ "@swc/core": "^1",
+ "postcss": "^8.4.12",
+ "typescript": ">=4.5.0"
+ },
+ "peerDependenciesMeta": {
+ "@microsoft/api-extractor": {
+ "optional": true
+ },
+ "@swc/core": {
+ "optional": true
+ },
+ "postcss": {
+ "optional": true
+ },
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/type-is": {
+ "version": "1.6.18",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+ "license": "MIT",
+ "dependencies": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.5.4",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz",
+ "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/ufo": {
+ "version": "1.6.3",
+ "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz",
+ "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/undici-types": {
+ "version": "5.26.5",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
+ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
+ "license": "MIT"
+ },
+ "node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/uuid": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
+ "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs": {
+ "name": "wrap-ansi",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "license": "ISC"
+ },
+ "node_modules/yaml": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz",
+ "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==",
+ "license": "ISC",
+ "bin": {
+ "yaml": "bin.mjs"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/ylru": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.4.0.tgz",
+ "integrity": "sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..1b5d63d
--- /dev/null
+++ b/package.json
@@ -0,0 +1,52 @@
+{
+ "name": "jimeng-free-api",
+ "version": "0.8.6",
+ "description": "jimeng Free API Server",
+ "type": "module",
+ "main": "dist/index.js",
+ "module": "dist/index.mjs",
+ "types": "dist/index.d.ts",
+ "directories": {
+ "dist": "dist"
+ },
+ "files": [
+ "dist/"
+ ],
+ "scripts": {
+ "dev": "tsup src/index.ts --format cjs,esm --sourcemap --dts --publicDir public --watch --onSuccess \"node --enable-source-maps --no-node-snapshot dist/index.js --port 8000\"",
+ "start": "node --enable-source-maps --no-node-snapshot dist/index.js",
+ "build": "tsup src/index.ts --format cjs,esm --sourcemap --dts --clean --publicDir public"
+ },
+ "author": "Vinlic",
+ "license": "ISC",
+ "dependencies": {
+ "axios": "^1.6.7",
+ "colors": "^1.4.0",
+ "crc-32": "^1.2.2",
+ "cron": "^3.1.6",
+ "date-fns": "^3.3.1",
+ "eventsource-parser": "^1.1.2",
+ "form-data": "^4.0.0",
+ "fs-extra": "^11.2.0",
+ "koa": "^2.15.0",
+ "koa-body": "^5.0.0",
+ "koa-bodyparser": "^4.4.1",
+ "koa-range": "^0.3.0",
+ "koa-router": "^12.0.1",
+ "koa2-cors": "^2.0.6",
+ "lodash": "^4.17.21",
+ "mime": "^4.0.1",
+ "minimist": "^1.2.8",
+ "randomstring": "^1.3.0",
+ "semver": "^7.7.2",
+ "uuid": "^9.0.1",
+ "yaml": "^2.3.4",
+ "playwright-core": "^1.49.0"
+ },
+ "devDependencies": {
+ "@types/lodash": "^4.14.202",
+ "@types/mime": "^3.0.4",
+ "tsup": "^8.0.2",
+ "typescript": "^5.3.3"
+ }
+}
\ No newline at end of file
diff --git a/public/welcome.html b/public/welcome.html
new file mode 100644
index 0000000..19de049
--- /dev/null
+++ b/public/welcome.html
@@ -0,0 +1,10 @@
+
+
+
+
+ 🚀 服务已启动
+
+
+ jimeng-free-api已启动!
请通过LobeChat / NextChat / Dify等客户端或OpenAI SDK接入!
+
+
\ No newline at end of file
diff --git a/src/api/consts/exceptions.ts b/src/api/consts/exceptions.ts
new file mode 100644
index 0000000..cbe8e7a
--- /dev/null
+++ b/src/api/consts/exceptions.ts
@@ -0,0 +1,13 @@
+export default {
+ API_TEST: [-9999, 'API异常错误'],
+ API_REQUEST_PARAMS_INVALID: [-2000, '请求参数非法'],
+ API_REQUEST_FAILED: [-2001, '请求失败'],
+ API_TOKEN_EXPIRES: [-2002, 'Token已失效'],
+ API_FILE_URL_INVALID: [-2003, '远程文件URL非法'],
+ API_FILE_EXECEEDS_SIZE: [-2004, '远程文件超出大小'],
+ API_CHAT_STREAM_PUSHING: [-2005, '已有对话流正在输出'],
+ API_CONTENT_FILTERED: [-2006, '内容由于合规问题已被阻止生成'],
+ API_IMAGE_GENERATION_FAILED: [-2007, '图像生成失败'],
+ API_VIDEO_GENERATION_FAILED: [-2008, '视频生成失败'],
+ API_IMAGE_GENERATION_INSUFFICIENT_POINTS: [-2009, '即梦积分不足'],
+}
\ No newline at end of file
diff --git a/src/api/controllers/chat.ts b/src/api/controllers/chat.ts
new file mode 100644
index 0000000..554645a
--- /dev/null
+++ b/src/api/controllers/chat.ts
@@ -0,0 +1,524 @@
+import _ from "lodash";
+import { PassThrough } from "stream";
+
+import APIException from "@/lib/exceptions/APIException.ts";
+import EX from "@/api/consts/exceptions.ts";
+import logger from "@/lib/logger.ts";
+import util from "@/lib/util.ts";
+import { generateImages, DEFAULT_MODEL } from "./images.ts";
+import { generateVideo, generateSeedanceVideo, isSeedanceModel, DEFAULT_MODEL as DEFAULT_VIDEO_MODEL } from "./videos.ts";
+
+// 最大重试次数
+const MAX_RETRY_COUNT = 3;
+// 重试延迟
+const RETRY_DELAY = 5000;
+
+/**
+ * 解析模型
+ *
+ * @param model 模型名称
+ * @returns 模型信息
+ */
+function parseModel(model: string) {
+ const [_model, size] = model.split(":");
+ const [_, width, height] = /(\d+)[\W\w](\d+)/.exec(size) ?? [];
+ return {
+ model: _model,
+ width: size ? Math.ceil(parseInt(width) / 2) * 2 : 1024,
+ height: size ? Math.ceil(parseInt(height) / 2) * 2 : 1024,
+ };
+}
+
+/**
+ * 检测是否为视频生成请求
+ *
+ * @param model 模型名称
+ * @returns 是否为视频生成请求
+ */
+function isVideoModel(model: string) {
+ return model.startsWith("jimeng-video") || model.startsWith("seedance-");
+}
+
+/**
+ * 同步对话补全
+ *
+ * @param messages 参考gpt系列消息格式,多轮对话请完整提供上下文
+ * @param refreshToken 用于刷新access_token的refresh_token
+ * @param assistantId 智能体ID,默认使用jimeng原版
+ * @param retryCount 重试次数
+ */
+export async function createCompletion(
+ messages: any[],
+ refreshToken: string,
+ _model = DEFAULT_MODEL,
+ retryCount = 0
+) {
+ return (async () => {
+ if (messages.length === 0)
+ throw new APIException(EX.API_REQUEST_PARAMS_INVALID, "消息不能为空");
+
+ const { model, width, height } = parseModel(_model);
+ logger.info(messages);
+
+ // 检查是否为视频生成请求
+ if (isVideoModel(_model)) {
+ try {
+ // 视频生成
+ logger.info(`开始生成视频,模型: ${_model}`);
+
+ let videoUrl: string;
+
+ // 判断是否为 Seedance 模型
+ if (isSeedanceModel(_model)) {
+ // Seedance 模型需要图片,在 chat 模式下不支持图片上传
+ // 返回友好提示
+ return {
+ id: util.uuid(),
+ model: _model,
+ object: "chat.completion",
+ choices: [
+ {
+ index: 0,
+ message: {
+ role: "assistant",
+ content: `Seedance 2.0 是多图智能视频生成模型,需要上传图片才能生成视频。\n\n请使用 POST /v1/videos/generations API 接口:\n\n\`\`\`bash\ncurl -X POST http://localhost:3000/v1/videos/generations \\\n -H "Authorization: your_token" \\\n -F "model=jimeng-video-seedance-2.0" \\\n -F "prompt=@1 图片中的人物开始跳舞" \\\n -F "ratio=4:3" \\\n -F "duration=4" \\\n -F "files=@/path/to/image1.jpg" \\\n -F "files=@/path/to/image2.jpg"\n\`\`\`\n\n**参数说明:**\n- \`model\`: jimeng-video-seedance-2.0(推荐)、jimeng-video-seedance-2.0-fast(快速版)或 seedance-2.0(兼容)\n- \`prompt\`: 提示词,使用 @1, @2 等引用上传的图片\n- \`ratio\`: 视频比例 (默认 4:3)\n- \`duration\`: 视频时长 4-15 秒 (默认 4 秒)\n- \`files\`: 上传的图片文件(支持多张)`,
+ },
+ finish_reason: "stop",
+ },
+ ],
+ usage: { prompt_tokens: 1, completion_tokens: 1, total_tokens: 2 },
+ created: util.unixTimestamp(),
+ };
+ }
+
+ videoUrl = await generateVideo(
+ _model,
+ messages[messages.length - 1].content,
+ {
+ ratio: "16:9",
+ resolution: "720p", // 默认分辨率
+ },
+ refreshToken
+ );
+
+ logger.info(`视频生成成功,URL: ${videoUrl}`);
+ return {
+ id: util.uuid(),
+ model: _model,
+ object: "chat.completion",
+ choices: [
+ {
+ index: 0,
+ message: {
+ role: "assistant",
+ content: `\n`,
+ },
+ finish_reason: "stop",
+ },
+ ],
+ usage: { prompt_tokens: 1, completion_tokens: 1, total_tokens: 2 },
+ created: util.unixTimestamp(),
+ };
+ } catch (error) {
+ logger.error(`视频生成失败: ${error.message}`);
+ // 如果是积分不足等特定错误,直接抛出
+ if (error instanceof APIException) {
+ throw error;
+ }
+
+ // 其他错误返回友好提示
+ return {
+ id: util.uuid(),
+ model: _model,
+ object: "chat.completion",
+ choices: [
+ {
+ index: 0,
+ message: {
+ role: "assistant",
+ content: `生成视频失败: ${error.message}\n\n如果您在即梦官网看到已生成的视频,可能是获取结果时出现了问题,请前往即梦官网查看。`,
+ },
+ finish_reason: "stop",
+ },
+ ],
+ usage: { prompt_tokens: 1, completion_tokens: 1, total_tokens: 2 },
+ created: util.unixTimestamp(),
+ };
+ }
+ } else {
+ // 图像生成
+ const imageUrls = await generateImages(
+ model,
+ messages[messages.length - 1].content,
+ {
+ width,
+ height,
+ },
+ refreshToken
+ );
+
+ return {
+ id: util.uuid(),
+ model: _model || model,
+ object: "chat.completion",
+ choices: [
+ {
+ index: 0,
+ message: {
+ role: "assistant",
+ content: imageUrls.reduce(
+ (acc, url, i) => acc + `\n`,
+ ""
+ ),
+ },
+ finish_reason: "stop",
+ },
+ ],
+ usage: { prompt_tokens: 1, completion_tokens: 1, total_tokens: 2 },
+ created: util.unixTimestamp(),
+ };
+ }
+ })().catch((err) => {
+ if (retryCount < MAX_RETRY_COUNT) {
+ logger.error(`Response error: ${err.stack}`);
+ logger.warn(`Try again after ${RETRY_DELAY / 1000}s...`);
+ return (async () => {
+ await new Promise((resolve) => setTimeout(resolve, RETRY_DELAY));
+ return createCompletion(messages, refreshToken, _model, retryCount + 1);
+ })();
+ }
+ throw err;
+ });
+}
+
+/**
+ * 流式对话补全
+ *
+ * @param messages 参考gpt系列消息格式,多轮对话请完整提供上下文
+ * @param refreshToken 用于刷新access_token的refresh_token
+ * @param assistantId 智能体ID,默认使用jimeng原版
+ * @param retryCount 重试次数
+ */
+export async function createCompletionStream(
+ messages: any[],
+ refreshToken: string,
+ _model = DEFAULT_MODEL,
+ retryCount = 0
+) {
+ return (async () => {
+ const { model, width, height } = parseModel(_model);
+ logger.info(messages);
+
+ const stream = new PassThrough();
+
+ if (messages.length === 0) {
+ logger.warn("消息为空,返回空流");
+ stream.end("data: [DONE]\n\n");
+ return stream;
+ }
+
+ // 检查是否为视频生成请求
+ if (isVideoModel(_model)) {
+ // 视频生成
+ stream.write(
+ "data: " +
+ JSON.stringify({
+ id: util.uuid(),
+ model: _model,
+ object: "chat.completion.chunk",
+ choices: [
+ {
+ index: 0,
+ delta: { role: "assistant", content: "🎬 视频生成中,请稍候...\n这可能需要1-2分钟,请耐心等待" },
+ finish_reason: null,
+ },
+ ],
+ }) +
+ "\n\n"
+ );
+
+ // 视频生成
+ logger.info(`开始生成视频,提示词: ${messages[messages.length - 1].content}`);
+
+ // 进度更新定时器
+ const progressInterval = setInterval(() => {
+ stream.write(
+ "data: " +
+ JSON.stringify({
+ id: util.uuid(),
+ model: _model,
+ object: "chat.completion.chunk",
+ choices: [
+ {
+ index: 0,
+ delta: { role: "assistant", content: "." },
+ finish_reason: null,
+ },
+ ],
+ }) +
+ "\n\n"
+ );
+ }, 5000);
+
+ // 设置超时,防止无限等待
+ const timeoutId = setTimeout(() => {
+ clearInterval(progressInterval);
+ logger.warn(`视频生成超时(2分钟),提示用户前往即梦官网查看`);
+ stream.write(
+ "data: " +
+ JSON.stringify({
+ id: util.uuid(),
+ model: _model,
+ object: "chat.completion.chunk",
+ choices: [
+ {
+ index: 1,
+ delta: {
+ role: "assistant",
+ content: "\n\n视频生成时间较长(已等待2分钟),但视频可能仍在生成中。\n\n请前往即梦官网查看您的视频:\n1. 访问 https://jimeng.jianying.com/ai-tool/video/generate\n2. 登录后查看您的创作历史\n3. 如果视频已生成,您可以直接在官网下载或分享\n\n您也可以继续等待,系统将在后台继续尝试获取视频(最长约20分钟)。",
+ },
+ finish_reason: "stop",
+ },
+ ],
+ }) +
+ "\n\n"
+ );
+ // 注意:这里不结束流,让后台继续尝试获取视频
+ // stream.end("data: [DONE]\n\n");
+ }, 2 * 60 * 1000);
+
+ logger.info(`开始生成视频,模型: ${_model}, 提示词: ${messages[messages.length - 1].content.substring(0, 50)}...`);
+
+ // 先给用户一个初始提示
+ stream.write(
+ "data: " +
+ JSON.stringify({
+ id: util.uuid(),
+ model: _model,
+ object: "chat.completion.chunk",
+ choices: [
+ {
+ index: 0,
+ delta: {
+ role: "assistant",
+ content: "\n\n🎬 视频生成已开始,这可能需要几分钟时间...",
+ },
+ finish_reason: null,
+ },
+ ],
+ }) +
+ "\n\n"
+ );
+
+ generateVideo(
+ _model,
+ messages[messages.length - 1].content,
+ { ratio: "16:9", resolution: "720p" },
+ refreshToken
+ )
+ .then((videoUrl) => {
+ clearInterval(progressInterval);
+ clearTimeout(timeoutId);
+
+ logger.info(`视频生成成功,URL: ${videoUrl}`);
+
+ stream.write(
+ "data: " +
+ JSON.stringify({
+ id: util.uuid(),
+ model: _model,
+ object: "chat.completion.chunk",
+ choices: [
+ {
+ index: 1,
+ delta: {
+ role: "assistant",
+ content: `\n\n✅ 视频生成完成!\n\n\n\n您可以:\n1. 直接查看上方视频\n2. 使用以下链接下载或分享:${videoUrl}`,
+ },
+ finish_reason: null,
+ },
+ ],
+ }) +
+ "\n\n"
+ );
+
+ stream.write(
+ "data: " +
+ JSON.stringify({
+ id: util.uuid(),
+ model: _model,
+ object: "chat.completion.chunk",
+ choices: [
+ {
+ index: 2,
+ delta: {
+ role: "assistant",
+ content: "",
+ },
+ finish_reason: "stop",
+ },
+ ],
+ }) +
+ "\n\n"
+ );
+ stream.end("data: [DONE]\n\n");
+ })
+ .catch((err) => {
+ clearInterval(progressInterval);
+ clearTimeout(timeoutId);
+
+ logger.error(`视频生成失败: ${err.message}`);
+ logger.error(`错误详情: ${JSON.stringify(err)}`);
+
+ // 记录详细错误信息
+ logger.error(`视频生成失败: ${err.message}`);
+ logger.error(`错误详情: ${JSON.stringify(err)}`);
+
+ // 构建更详细的错误信息
+ let errorMessage = `⚠️ 视频生成过程中遇到问题: ${err.message}`;
+
+ // 如果是历史记录不存在的错误,提供更具体的建议
+ if (err.message.includes("历史记录不存在")) {
+ errorMessage += "\n\n可能原因:\n1. 视频生成请求已发送,但API无法获取历史记录\n2. 视频生成服务暂时不可用\n3. 历史记录ID无效或已过期\n\n建议操作:\n1. 请前往即梦官网查看您的视频是否已生成:https://jimeng.jianying.com/ai-tool/video/generate\n2. 如果官网已显示视频,但这里无法获取,可能是API连接问题\n3. 如果官网也没有显示,请稍后再试或重新生成视频";
+ } else if (err.message.includes("获取视频生成结果超时")) {
+ errorMessage += "\n\n视频生成可能仍在进行中,但等待时间已超过系统设定的限制。\n\n请前往即梦官网查看您的视频:https://jimeng.jianying.com/ai-tool/video/generate\n\n如果您在官网上看到视频已生成,但这里无法显示,可能是因为:\n1. 获取结果的过程超时\n2. 网络连接问题\n3. API访问限制";
+ } else {
+ errorMessage += "\n\n如果您在即梦官网看到已生成的视频,可能是获取结果时出现了问题。\n\n请访问即梦官网查看您的创作历史:https://jimeng.jianying.com/ai-tool/video/generate";
+ }
+
+ // 添加历史ID信息,方便用户在官网查找
+ if (err.historyId) {
+ errorMessage += `\n\n历史记录ID: ${err.historyId}(您可以使用此ID在官网搜索您的视频)`;
+ }
+
+ stream.write(
+ "data: " +
+ JSON.stringify({
+ id: util.uuid(),
+ model: _model,
+ object: "chat.completion.chunk",
+ choices: [
+ {
+ index: 1,
+ delta: {
+ role: "assistant",
+ content: `\n\n${errorMessage}`,
+ },
+ finish_reason: "stop",
+ },
+ ],
+ }) +
+ "\n\n"
+ );
+ stream.end("data: [DONE]\n\n");
+ });
+ } else {
+ // 图像生成
+ stream.write(
+ "data: " +
+ JSON.stringify({
+ id: util.uuid(),
+ model: _model || model,
+ object: "chat.completion.chunk",
+ choices: [
+ {
+ index: 0,
+ delta: { role: "assistant", content: "🎨 图像生成中,请稍候..." },
+ finish_reason: null,
+ },
+ ],
+ }) +
+ "\n\n"
+ );
+
+ generateImages(
+ model,
+ messages[messages.length - 1].content,
+ { width, height },
+ refreshToken
+ )
+ .then((imageUrls) => {
+ for (let i = 0; i < imageUrls.length; i++) {
+ const url = imageUrls[i];
+ stream.write(
+ "data: " +
+ JSON.stringify({
+ id: util.uuid(),
+ model: _model || model,
+ object: "chat.completion.chunk",
+ choices: [
+ {
+ index: i + 1,
+ delta: {
+ role: "assistant",
+ content: `\n`,
+ },
+ finish_reason: i < imageUrls.length - 1 ? null : "stop",
+ },
+ ],
+ }) +
+ "\n\n"
+ );
+ }
+ stream.write(
+ "data: " +
+ JSON.stringify({
+ id: util.uuid(),
+ model: _model || model,
+ object: "chat.completion.chunk",
+ choices: [
+ {
+ index: imageUrls.length + 1,
+ delta: {
+ role: "assistant",
+ content: "图像生成完成!",
+ },
+ finish_reason: "stop",
+ },
+ ],
+ }) +
+ "\n\n"
+ );
+ stream.end("data: [DONE]\n\n");
+ })
+ .catch((err) => {
+ stream.write(
+ "data: " +
+ JSON.stringify({
+ id: util.uuid(),
+ model: _model || model,
+ object: "chat.completion.chunk",
+ choices: [
+ {
+ index: 1,
+ delta: {
+ role: "assistant",
+ content: `生成图片失败: ${err.message}`,
+ },
+ finish_reason: "stop",
+ },
+ ],
+ }) +
+ "\n\n"
+ );
+ stream.end("data: [DONE]\n\n");
+ });
+ }
+ return stream;
+ })().catch((err) => {
+ if (retryCount < MAX_RETRY_COUNT) {
+ logger.error(`Response error: ${err.stack}`);
+ logger.warn(`Try again after ${RETRY_DELAY / 1000}s...`);
+ return (async () => {
+ await new Promise((resolve) => setTimeout(resolve, RETRY_DELAY));
+ return createCompletionStream(
+ messages,
+ refreshToken,
+ _model,
+ retryCount + 1
+ );
+ })();
+ }
+ throw err;
+ });
+}
diff --git a/src/api/controllers/core.ts b/src/api/controllers/core.ts
new file mode 100644
index 0000000..8110ec3
--- /dev/null
+++ b/src/api/controllers/core.ts
@@ -0,0 +1,458 @@
+import { PassThrough } from "stream";
+import path from "path";
+import _ from "lodash";
+import mime from "mime";
+import axios, { AxiosRequestConfig, AxiosResponse } from "axios";
+
+import APIException from "@/lib/exceptions/APIException.ts";
+import EX from "@/api/consts/exceptions.ts";
+import { createParser } from "eventsource-parser";
+import logger from "@/lib/logger.ts";
+import util from "@/lib/util.ts";
+
+// 模型名称
+const MODEL_NAME = "jimeng";
+// 默认的AgentID
+export const DEFAULT_ASSISTANT_ID = 513695;
+// 版本号
+const VERSION_CODE = "8.4.0";
+// 平台代码
+const PLATFORM_CODE = "7";
+// 设备ID
+const DEVICE_ID = Math.random() * 999999999999999999 + 7000000000000000000;
+// WebID
+export const WEB_ID = Math.random() * 999999999999999999 + 7000000000000000000;
+// 用户ID
+export const USER_ID = util.uuid(false);
+// 最大重试次数
+const MAX_RETRY_COUNT = 3;
+// 重试延迟
+const RETRY_DELAY = 5000;
+// 伪装headers
+const FAKE_HEADERS = {
+ Accept: "application/json, text/plain, */*",
+ "Accept-Encoding": "gzip, deflate, br, zstd",
+ "Accept-language": "zh-CN,zh;q=0.9",
+ "App-Sdk-Version": "48.0.0",
+ "Cache-control": "no-cache",
+ Appid: DEFAULT_ASSISTANT_ID,
+ Appvr: VERSION_CODE,
+ Lan: "zh-Hans",
+ Loc: "cn",
+ Origin: "https://jimeng.jianying.com",
+ Pragma: "no-cache",
+ Priority: "u=1, i",
+ Referer: "https://jimeng.jianying.com",
+ Pf: PLATFORM_CODE,
+ "Sec-Ch-Ua":
+ '"Google Chrome";v="132", "Chromium";v="132", "Not_A Brand";v="8"',
+ "Sec-Ch-Ua-Mobile": "?0",
+ "Sec-Ch-Ua-Platform": '"Windows"',
+ "Sec-Fetch-Dest": "empty",
+ "Sec-Fetch-Mode": "cors",
+ "Sec-Fetch-Site": "same-origin",
+ "User-Agent":
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36",
+};
+// 文件最大大小
+const FILE_MAX_SIZE = 100 * 1024 * 1024;
+
+/**
+ * 获取缓存中的access_token
+ *
+ * 目前jimeng的access_token是固定的,暂无刷新功能
+ *
+ * @param refreshToken 用于刷新access_token的refresh_token
+ */
+export async function acquireToken(refreshToken: string): Promise {
+ return refreshToken;
+}
+
+/**
+ * 生成cookie
+ */
+export function generateCookie(refreshToken: string) {
+ return [
+ `_tea_web_id=${WEB_ID}`,
+ `is_staff_user=false`,
+ `store-region=cn-gd`,
+ `store-region-src=uid`,
+ `sid_guard=${refreshToken}%7C${util.unixTimestamp()}%7C5184000%7CMon%2C+03-Feb-2025+08%3A17%3A09+GMT`,
+ `uid_tt=${USER_ID}`,
+ `uid_tt_ss=${USER_ID}`,
+ `sid_tt=${refreshToken}`,
+ `sessionid=${refreshToken}`,
+ `sessionid_ss=${refreshToken}`,
+ `sid_tt=${refreshToken}`
+ ].join("; ");
+}
+
+/**
+ * 获取浏览器格式的cookie数组(用于Playwright context.addCookies)
+ */
+export function getCookiesForBrowser(refreshToken: string) {
+ const domain = ".jianying.com";
+ return [
+ { name: "_tea_web_id", value: String(WEB_ID), domain, path: "/" },
+ { name: "is_staff_user", value: "false", domain, path: "/" },
+ { name: "store-region", value: "cn-gd", domain, path: "/" },
+ { name: "store-region-src", value: "uid", domain, path: "/" },
+ { name: "uid_tt", value: USER_ID, domain, path: "/" },
+ { name: "uid_tt_ss", value: USER_ID, domain, path: "/" },
+ { name: "sid_tt", value: refreshToken, domain, path: "/" },
+ { name: "sessionid", value: refreshToken, domain, path: "/" },
+ { name: "sessionid_ss", value: refreshToken, domain, path: "/" },
+ ];
+}
+
+/**
+ * 获取积分信息
+ *
+ * @param refreshToken 用于刷新access_token的refresh_token
+ */
+export async function getCredit(refreshToken: string) {
+ const {
+ credit: { gift_credit, purchase_credit, vip_credit }
+ } = await request("POST", "/commerce/v1/benefits/user_credit", refreshToken, {
+ data: {},
+ headers: {
+ // Cookie: 'x-web-secsdk-uid=ef44bd0d-0cf6-448c-b517-fd1b5a7267ba; s_v_web_id=verify_m4b1lhlu_DI8qKRlD_7mJJ_4eqx_9shQ_s8eS2QLAbc4n; passport_csrf_token=86f3619c0c4a9c13f24117f71dc18524; passport_csrf_token_default=86f3619c0c4a9c13f24117f71dc18524; n_mh=9-mIeuD4wZnlYrrOvfzG3MuT6aQmCUtmr8FxV8Kl8xY; sid_guard=a7eb745aec44bb3186dbc2083ea9e1a6%7C1733386629%7C5184000%7CMon%2C+03-Feb-2025+08%3A17%3A09+GMT; uid_tt=59a46c7d3f34bda9588b93590cca2e12; uid_tt_ss=59a46c7d3f34bda9588b93590cca2e12; sid_tt=a7eb745aec44bb3186dbc2083ea9e1a6; sessionid=a7eb745aec44bb3186dbc2083ea9e1a6; sessionid_ss=a7eb745aec44bb3186dbc2083ea9e1a6; is_staff_user=false; sid_ucp_v1=1.0.0-KGRiOGY2ODQyNWU1OTk3NzRhYTE2ZmZhYmFjNjdmYjY3NzRmZGRiZTgKHgjToPCw0cwbEIXDxboGGJ-tHyAMMITDxboGOAhAJhoCaGwiIGE3ZWI3NDVhZWM0NGJiMzE4NmRiYzIwODNlYTllMWE2; ssid_ucp_v1=1.0.0-KGRiOGY2ODQyNWU1OTk3NzRhYTE2ZmZhYmFjNjdmYjY3NzRmZGRiZTgKHgjToPCw0cwbEIXDxboGGJ-tHyAMMITDxboGOAhAJhoCaGwiIGE3ZWI3NDVhZWM0NGJiMzE4NmRiYzIwODNlYTllMWE2; store-region=cn-gd; store-region-src=uid; user_spaces_idc={"7444764277623653426":"lf"}; ttwid=1|cxHJViEev1mfkjntdMziir8SwbU8uPNVSaeh9QpEUs8|1733966961|d8d52f5f56607427691be4ac44253f7870a34d25dd05a01b4d89b8a7c5ea82ad; _tea_web_id=7444838473275573797; fpk1=fa6c6a4d9ba074b90003896f36b6960066521c1faec6a60bdcb69ec8ddf85e8360b4c0704412848ec582b2abca73d57a; odin_tt=efe9dc150207879b88509e651a1c4af4e7ffb4cfcb522425a75bd72fbf894eda570bbf7ffb551c8b1de0aa2bfa0bd1be6c4157411ecdcf4464fcaf8dd6657d66',
+ Referer: "https://jimeng.jianying.com/ai-tool/image/generate",
+ // "Device-Time": 1733966964,
+ // Sign: "f3dbb824b378abea7c03cbb152b3a365"
+ }
+ });
+ logger.info(`\n积分信息: \n赠送积分: ${gift_credit}, 购买积分: ${purchase_credit}, VIP积分: ${vip_credit}`);
+ return {
+ giftCredit: gift_credit,
+ purchaseCredit: purchase_credit,
+ vipCredit: vip_credit,
+ totalCredit: gift_credit + purchase_credit + vip_credit
+ }
+}
+
+/**
+ * 接收今日积分
+ *
+ * @param refreshToken 用于刷新access_token的refresh_token
+ */
+export async function receiveCredit(refreshToken: string) {
+ logger.info("正在收取今日积分...")
+ const { cur_total_credits, receive_quota } = await request("POST", "/commerce/v1/benefits/credit_receive", refreshToken, {
+ data: {
+ time_zone: "Asia/Shanghai"
+ },
+ headers: {
+ Referer: "https://jimeng.jianying.com/ai-tool/image/generate"
+ }
+ });
+ logger.info(`\n今日${receive_quota}积分收取成功\n剩余积分: ${cur_total_credits}`);
+ return cur_total_credits;
+}
+
+/**
+ * 请求jimeng
+ *
+ * @param method 请求方法
+ * @param uri 请求路径
+ * @param params 请求参数
+ * @param headers 请求头
+ */
+export async function request(
+ method: string,
+ uri: string,
+ refreshToken: string,
+ options: AxiosRequestConfig = {}
+) {
+ const token = await acquireToken(refreshToken);
+ const deviceTime = util.unixTimestamp();
+ const sign = util.md5(
+ `9e2c|${uri.slice(-7)}|${PLATFORM_CODE}|${VERSION_CODE}|${deviceTime}||11ac`
+ );
+
+ const fullUrl = `https://jimeng.jianying.com${uri}`;
+ const requestParams = {
+ aid: DEFAULT_ASSISTANT_ID,
+ device_platform: "web",
+ region: "cn",
+ webId: WEB_ID,
+ da_version: "3.3.2",
+ web_component_open_flag: 1,
+ web_version: "7.5.0",
+ aigc_features: "app_lip_sync",
+ ...(options.params || {}),
+ };
+
+ const headers = {
+ ...FAKE_HEADERS,
+ Cookie: generateCookie(token),
+ "Device-Time": deviceTime,
+ Sign: sign,
+ "Sign-Ver": "1",
+ ...(options.headers || {}),
+ };
+
+ logger.info(`发送请求: ${method.toUpperCase()} ${fullUrl}`);
+ logger.info(`请求参数: ${JSON.stringify(requestParams)}`);
+ logger.info(`请求数据: ${JSON.stringify(options.data || {})}`);
+
+ // 添加重试逻辑
+ let retries = 0;
+ const maxRetries = 3; // 最大重试次数
+ let lastError = null;
+
+ while (retries <= maxRetries) {
+ try {
+ if (retries > 0) {
+ logger.info(`第 ${retries} 次重试请求: ${method.toUpperCase()} ${fullUrl}`);
+ // 重试前等待一段时间
+ await new Promise(resolve => setTimeout(resolve, 1000 * retries));
+ }
+
+ const response = await axios.request({
+ method,
+ url: fullUrl,
+ params: requestParams,
+ headers: headers,
+ timeout: 45000, // 增加超时时间到45秒
+ validateStatus: () => true, // 允许任何状态码
+ ..._.omit(options, "params", "headers"),
+ });
+
+ // 记录响应状态和头信息
+ logger.info(`响应状态: ${response.status} ${response.statusText}`);
+
+ // 流式响应直接返回response
+ if (options.responseType == "stream") return response;
+
+ // 记录响应数据摘要
+ const responseDataSummary = JSON.stringify(response.data).substring(0, 500) +
+ (JSON.stringify(response.data).length > 500 ? "..." : "");
+ logger.info(`响应数据摘要: ${responseDataSummary}`);
+
+ // 检查HTTP状态码
+ if (response.status >= 400) {
+ logger.warn(`HTTP错误: ${response.status} ${response.statusText}`);
+ if (retries < maxRetries) {
+ retries++;
+ continue;
+ }
+ }
+
+ return checkResult(response);
+ }
+ catch (error) {
+ lastError = error;
+ logger.error(`请求失败 (尝试 ${retries + 1}/${maxRetries + 1}): ${error.message}`);
+
+ // 如果是网络错误或超时,尝试重试
+ if ((error.code === 'ECONNABORTED' || error.code === 'ETIMEDOUT' ||
+ error.message.includes('timeout') || error.message.includes('network')) &&
+ retries < maxRetries) {
+ retries++;
+ continue;
+ }
+
+ // 其他错误直接抛出
+ break;
+ }
+ }
+
+ // 所有重试都失败了,抛出最后一个错误
+ logger.error(`请求失败,已重试 ${retries} 次: ${lastError.message}`);
+ if (lastError.response) {
+ logger.error(`响应状态: ${lastError.response.status}`);
+ logger.error(`响应数据: ${JSON.stringify(lastError.response.data)}`);
+ }
+ throw lastError;
+ }
+
+ /**
+ * 预检查文件URL有效性
+ *
+ * @param fileUrl 文件URL
+ */
+ export async function checkFileUrl(fileUrl: string) {
+ if (util.isBASE64Data(fileUrl)) return;
+ const result = await axios.head(fileUrl, {
+ timeout: 15000,
+ validateStatus: () => true,
+ });
+ if (result.status >= 400)
+ throw new APIException(
+ EX.API_FILE_URL_INVALID,
+ `File ${fileUrl} is not valid: [${result.status}] ${result.statusText}`
+ );
+ // 检查文件大小
+ if (result.headers && result.headers["content-length"]) {
+ const fileSize = parseInt(result.headers["content-length"], 10);
+ if (fileSize > FILE_MAX_SIZE)
+ throw new APIException(
+ EX.API_FILE_EXECEEDS_SIZE,
+ `File ${fileUrl} is not valid`
+ );
+ }
+}
+
+/**
+ * 上传文件
+ *
+ * @param refreshToken 用于刷新access_token的refresh_token
+ * @param fileUrl 文件URL或BASE64数据
+ * @param isVideoImage 是否是用于视频图像
+ * @returns 上传结果,包含image_uri
+ */
+export async function uploadFile(
+ refreshToken: string,
+ fileUrl: string,
+ isVideoImage: boolean = false
+) {
+ try {
+ logger.info(`开始上传文件: ${fileUrl}, 视频图像模式: ${isVideoImage}`);
+
+ // 预检查远程文件URL可用性
+ await checkFileUrl(fileUrl);
+
+ let filename, fileData, mimeType;
+ // 如果是BASE64数据则直接转换为Buffer
+ if (util.isBASE64Data(fileUrl)) {
+ mimeType = util.extractBASE64DataFormat(fileUrl);
+ const ext = mime.getExtension(mimeType);
+ filename = `${util.uuid()}.${ext}`;
+ fileData = Buffer.from(util.removeBASE64DataHeader(fileUrl), "base64");
+ logger.info(`处理BASE64数据,文件名: ${filename}, 类型: ${mimeType}, 大小: ${fileData.length}字节`);
+ }
+ // 下载文件到内存,如果您的服务器内存很小,建议考虑改造为流直传到下一个接口上,避免停留占用内存
+ else {
+ filename = path.basename(fileUrl);
+ logger.info(`开始下载远程文件: ${fileUrl}`);
+ ({ data: fileData } = await axios.get(fileUrl, {
+ responseType: "arraybuffer",
+ // 100M限制
+ maxContentLength: FILE_MAX_SIZE,
+ // 60秒超时
+ timeout: 60000,
+ }));
+ logger.info(`文件下载完成,文件名: ${filename}, 大小: ${fileData.length}字节`);
+ }
+
+ // 获取文件的MIME类型
+ mimeType = mimeType || mime.getType(filename);
+ logger.info(`文件MIME类型: ${mimeType}`);
+
+ // 构建FormData
+ const formData = new FormData();
+ const blob = new Blob([fileData], { type: mimeType });
+ formData.append('file', blob, filename);
+
+ // 获取上传凭证
+ logger.info(`请求上传凭证,场景: ${isVideoImage ? 'video_cover' : 'aigc_image'}`);
+ const uploadProofUrl = 'https://imagex.bytedanceapi.com/';
+ const proofResult = await request(
+ 'POST',
+ '/mweb/v1/get_upload_image_proof',
+ refreshToken,
+ {
+ data: {
+ scene: isVideoImage ? 'video_cover' : 'aigc_image',
+ file_name: filename,
+ file_size: fileData.length,
+ }
+ }
+ );
+
+ if (!proofResult || !proofResult.proof_info) {
+ logger.error(`获取上传凭证失败: ${JSON.stringify(proofResult)}`);
+ throw new APIException(EX.API_REQUEST_FAILED, '获取上传凭证失败');
+ }
+
+ logger.info(`获取上传凭证成功`);
+
+ // 上传文件
+ const { proof_info } = proofResult;
+ logger.info(`开始上传文件到: ${uploadProofUrl}`);
+
+ const uploadResult = await axios.post(
+ uploadProofUrl,
+ formData,
+ {
+ headers: {
+ ...proof_info.headers,
+ 'Content-Type': 'multipart/form-data',
+ },
+ params: proof_info.query_params,
+ timeout: 60000,
+ validateStatus: () => true, // 允许任何状态码以便详细处理
+ }
+ );
+
+ logger.info(`上传响应状态: ${uploadResult.status}`);
+
+ if (!uploadResult || uploadResult.status !== 200) {
+ logger.error(`上传文件失败: 状态码 ${uploadResult?.status}, 响应: ${JSON.stringify(uploadResult?.data)}`);
+ throw new APIException(EX.API_REQUEST_FAILED, `上传文件失败: 状态码 ${uploadResult?.status}`);
+ }
+
+ // 验证 proof_info.image_uri 是否存在
+ if (!proof_info.image_uri) {
+ logger.error(`上传凭证中缺少 image_uri: ${JSON.stringify(proof_info)}`);
+ throw new APIException(EX.API_REQUEST_FAILED, '上传凭证中缺少 image_uri');
+ }
+
+ logger.info(`文件上传成功: ${proof_info.image_uri}`);
+
+ // 返回上传结果
+ return {
+ image_uri: proof_info.image_uri,
+ uri: proof_info.image_uri,
+ }
+ } catch (error) {
+ logger.error(`文件上传过程中发生错误: ${error.message}`);
+ throw error;
+ }
+}
+
+/**
+ * 检查请求结果
+ *
+ * @param result 结果
+ */
+export function checkResult(result: AxiosResponse) {
+ const { ret, errmsg, data } = result.data;
+ if (!_.isFinite(Number(ret))) return result.data;
+ if (ret === '0') return data;
+ if (ret === '5000')
+ throw new APIException(EX.API_IMAGE_GENERATION_INSUFFICIENT_POINTS, `[无法生成图像]: 即梦积分可能不足,${errmsg}`);
+ throw new APIException(EX.API_REQUEST_FAILED, `[请求jimeng失败]: ${errmsg}`);
+}
+
+/**
+ * Token切分
+ *
+ * @param authorization 认证字符串
+ */
+export function tokenSplit(authorization: string) {
+ return authorization.replace("Bearer ", "").split(",");
+}
+
+/**
+ * 获取Token存活状态
+ */
+export async function getTokenLiveStatus(refreshToken: string) {
+ const result = await request(
+ "POST",
+ "/passport/account/info/v2",
+ refreshToken,
+ {
+ params: {
+ account_sdk_source: "web",
+ },
+ }
+ );
+ try {
+ const { user_id } = checkResult(result);
+ return !!user_id;
+ } catch (err) {
+ return false;
+ }
+}
\ No newline at end of file
diff --git a/src/api/controllers/images.ts b/src/api/controllers/images.ts
new file mode 100644
index 0000000..76886df
--- /dev/null
+++ b/src/api/controllers/images.ts
@@ -0,0 +1,1480 @@
+import _ from "lodash";
+import crypto from "crypto";
+
+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 logger from "@/lib/logger.ts";
+import { getModelConfig } from "@/lib/configs/model-config.ts";
+
+const DEFAULT_ASSISTANT_ID = 513695;
+export const DEFAULT_MODEL = "jimeng-4.5";
+const DRAFT_VERSION = "3.3.4";
+const DRAFT_MIN_VERSION = "3.0.2";
+
+// 支持的图片比例和分辨率配置
+const RESOLUTION_OPTIONS: {
+ [resolution: string]: {
+ [ratio: string]: { width: number; height: number; ratio: number };
+ };
+} = {
+ "1k": {
+ "1:1": { width: 1024, height: 1024, ratio: 1 },
+ "4:3": { width: 768, height: 1024, ratio: 4 },
+ "3:4": { width: 1024, height: 768, ratio: 2 },
+ "16:9": { width: 1024, height: 576, ratio: 3 },
+ "9:16": { width: 576, height: 1024, ratio: 5 },
+ "3:2": { width: 1024, height: 682, ratio: 7 },
+ "2:3": { width: 682, height: 1024, ratio: 6 },
+ "21:9": { width: 1195, height: 512, ratio: 8 },
+ },
+ "2k": {
+ "1:1": { width: 2048, height: 2048, ratio: 1 },
+ "4:3": { width: 2304, height: 1728, ratio: 4 },
+ "3:4": { width: 1728, height: 2304, ratio: 2 },
+ "16:9": { width: 2560, height: 1440, ratio: 3 },
+ "9:16": { width: 1440, height: 2560, ratio: 5 },
+ "3:2": { width: 2496, height: 1664, ratio: 7 },
+ "2:3": { width: 1664, height: 2496, ratio: 6 },
+ "21:9": { width: 3024, height: 1296, ratio: 8 },
+ },
+ "4k": {
+ "1:1": { width: 4096, height: 4096, ratio: 101 },
+ "4:3": { width: 4608, height: 3456, ratio: 104 },
+ "3:4": { width: 3456, height: 4608, ratio: 102 },
+ "16:9": { width: 5120, height: 2880, ratio: 103 },
+ "9:16": { width: 2880, height: 5120, ratio: 105 },
+ "3:2": { width: 4992, height: 3328, ratio: 107 },
+ "2:3": { width: 3328, height: 4992, ratio: 106 },
+ "21:9": { width: 6048, height: 2592, ratio: 108 },
+ },
+};
+
+// 解析分辨率参数
+function resolveResolution(
+ resolution: string = "2k",
+ ratio: string = "1:1"
+): { width: number; height: number; imageRatio: number; resolutionType: string } {
+ const resolutionGroup = RESOLUTION_OPTIONS[resolution];
+ if (!resolutionGroup) {
+ const supportedResolutions = Object.keys(RESOLUTION_OPTIONS).join(", ");
+ throw new Error(`不支持的分辨率 "${resolution}"。支持的分辨率: ${supportedResolutions}`);
+ }
+
+ const ratioConfig = resolutionGroup[ratio];
+ if (!ratioConfig) {
+ const supportedRatios = Object.keys(resolutionGroup).join(", ");
+ throw new Error(`在 "${resolution}" 分辨率下,不支持的比例 "${ratio}"。支持的比例: ${supportedRatios}`);
+ }
+
+ return {
+ width: ratioConfig.width,
+ height: ratioConfig.height,
+ imageRatio: ratioConfig.ratio,
+ resolutionType: resolution,
+ };
+}
+
+// 模型特定的版本配置
+const MODEL_DRAFT_VERSIONS: { [key: string]: string } = {
+ "jimeng-5.0": "3.3.9",
+ "jimeng-4.6": "3.3.9",
+ "jimeng-4.5": "3.3.4",
+ "jimeng-4.1": "3.3.4",
+ "jimeng-4.0": "3.3.4",
+ "jimeng-3.1": "3.0.2",
+ "jimeng-3.0": "3.0.2",
+ "jimeng-2.1": "3.0.2",
+ "jimeng-2.0-pro": "3.0.2",
+ "jimeng-2.0": "3.0.2",
+ "jimeng-1.4": "3.0.2",
+ "jimeng-xl-pro": "3.0.2",
+};
+
+// 获取模型对应的draft版本
+function getDraftVersion(model: string): string {
+ try {
+ const config = getModelConfig(model);
+ return config.draftVersion;
+ } catch (e) {
+ // 如果配置中没有,使用旧的映射
+ return MODEL_DRAFT_VERSIONS[model] || DRAFT_VERSION;
+ }
+}
+const MODEL_MAP = {
+ "jimeng-5.0": "high_aes_general_v50",
+ "jimeng-4.6": "high_aes_general_v42",
+ "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",
+ "jimeng-2.0-pro": "high_aes_general_v20_L:general_v2.0_L",
+ "jimeng-2.0": "high_aes_general_v20:general_v2.0",
+ "jimeng-1.4": "high_aes_general_v14:general_v1.4",
+ "jimeng-xl-pro": "text2img_xl_sft",
+};
+
+// 向后兼容的函数
+export function getModel(model: string) {
+ try {
+ const config = getModelConfig(model);
+ return config.internalModel;
+ } catch (e) {
+ // 如果配置中没有,使用旧的映射
+ return MODEL_MAP[model] || MODEL_MAP[DEFAULT_MODEL];
+ }
+}
+
+
+// AWS4-HMAC-SHA256 签名生成函数
+function createSignature(
+ method: string,
+ url: string,
+ headers: { [key: string]: string },
+ accessKeyId: string,
+ secretAccessKey: string,
+ sessionToken?: string,
+ payload: string = ''
+) {
+ const urlObj = new URL(url);
+ const pathname = urlObj.pathname || '/';
+ const search = urlObj.search;
+
+ // 创建规范请求
+ const timestamp = headers['x-amz-date'];
+ const date = timestamp.substr(0, 8);
+ const region = 'cn-north-1';
+ const service = 'imagex';
+
+ // 规范化查询参数 - 手动处理以确保正确的顺序
+ const queryParams: Array<[string, string]> = [];
+ const searchParams = new URLSearchParams(search);
+ searchParams.forEach((value, key) => {
+ queryParams.push([key, value]);
+ });
+
+ // 按键名排序 - 大小写敏感,先大写字母,后小写字母
+ queryParams.sort(([a], [b]) => {
+ // AWS要求大小写敏感的ASCII排序
+ if (a < b) return -1;
+ if (a > b) return 1;
+ return 0;
+ });
+
+ // 构建规范查询字符串(不进行额外编码,因为URL中已经编码)
+ const canonicalQueryString = queryParams
+ .map(([key, value]) => `${key}=${value}`)
+ .join('&');
+
+ // 规范化头部 - 只包含必要的头部
+ const headersToSign: { [key: string]: string } = {
+ 'x-amz-date': timestamp
+ };
+
+ // 添加 session token
+ if (sessionToken) {
+ headersToSign['x-amz-security-token'] = sessionToken;
+ }
+
+ // 如果是POST请求且包含payload,添加content-sha256头
+ let payloadHash = crypto.createHash('sha256').update('').digest('hex'); // 默认空payload
+ if (method.toUpperCase() === 'POST' && payload) {
+ payloadHash = crypto.createHash('sha256').update(payload, 'utf8').digest('hex');
+ headersToSign['x-amz-content-sha256'] = payloadHash;
+ }
+
+ const signedHeaders = Object.keys(headersToSign)
+ .map(key => key.toLowerCase())
+ .sort()
+ .join(';');
+
+ const canonicalHeaders = Object.keys(headersToSign)
+ .sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()))
+ .map(key => `${key.toLowerCase()}:${headersToSign[key].trim()}\n`)
+ .join('');
+
+ // 创建规范请求
+ const canonicalRequest = [
+ method.toUpperCase(),
+ pathname,
+ canonicalQueryString,
+ canonicalHeaders,
+ signedHeaders,
+ payloadHash
+ ].join('\n');
+
+ // 调试输出
+ logger.debug(`规范请求:
+Method: ${method.toUpperCase()}
+Path: ${pathname}
+Query: ${canonicalQueryString}
+Headers: ${canonicalHeaders}
+SignedHeaders: ${signedHeaders}
+PayloadHash: ${payloadHash}
+---完整规范请求---
+${canonicalRequest}
+---结束---`);
+
+ // 创建待签名字符串
+ const credentialScope = `${date}/${region}/${service}/aws4_request`;
+ const stringToSign = [
+ 'AWS4-HMAC-SHA256',
+ timestamp,
+ credentialScope,
+ crypto.createHash('sha256').update(canonicalRequest, 'utf8').digest('hex')
+ ].join('\n');
+
+ logger.debug(`待签名字符串:
+${stringToSign}`);
+
+ // 生成签名
+ const kDate = crypto.createHmac('sha256', `AWS4${secretAccessKey}`).update(date).digest();
+ const kRegion = crypto.createHmac('sha256', kDate).update(region).digest();
+ const kService = crypto.createHmac('sha256', kRegion).update(service).digest();
+ const kSigning = crypto.createHmac('sha256', kService).update('aws4_request').digest();
+ const signature = crypto.createHmac('sha256', kSigning).update(stringToSign, 'utf8').digest('hex');
+
+ return `AWS4-HMAC-SHA256 Credential=${accessKeyId}/${credentialScope}, SignedHeaders=${signedHeaders}, Signature=${signature}`;
+}
+
+// 计算文件的CRC32值
+function calculateCRC32(buffer: ArrayBuffer): string {
+ const crcTable = [];
+ for (let i = 0; i < 256; i++) {
+ let crc = i;
+ for (let j = 0; j < 8; j++) {
+ crc = (crc & 1) ? (0xEDB88320 ^ (crc >>> 1)) : (crc >>> 1);
+ }
+ crcTable[i] = crc;
+ }
+
+ let crc = 0 ^ (-1);
+ const bytes = new Uint8Array(buffer);
+ for (let i = 0; i < bytes.length; i++) {
+ crc = (crc >>> 8) ^ crcTable[(crc ^ bytes[i]) & 0xFF];
+ }
+ return ((crc ^ (-1)) >>> 0).toString(16).padStart(8, '0');
+}
+
+// 图片上传功能:将外部图片URL上传到即梦系统
+async function uploadImageFromUrl(imageUrl: string, refreshToken: string): Promise {
+ try {
+ logger.info(`开始上传图片: ${imageUrl}`);
+
+ // 第一步:获取上传令牌
+ const tokenResult = await request("post", "/mweb/v1/get_upload_token", refreshToken, {
+ data: {
+ scene: 2, // AIGC 图片上传场景
+ },
+ });
+
+ const { access_key_id, secret_access_key, session_token, service_id } = tokenResult;
+ if (!access_key_id || !secret_access_key || !session_token) {
+ throw new Error("获取上传令牌失败");
+ }
+
+ // 使用固定的service_id
+ const actualServiceId = service_id || "tb4s082cfz";
+
+ logger.info(`获取上传令牌成功: service_id=${actualServiceId}`);
+
+ // 下载图片数据
+ const imageResponse = await fetch(imageUrl);
+ if (!imageResponse.ok) {
+ throw new Error(`下载图片失败: ${imageResponse.status}`);
+ }
+
+ const imageBuffer = await imageResponse.arrayBuffer();
+ const fileSize = imageBuffer.byteLength;
+ const crc32 = calculateCRC32(imageBuffer);
+
+ logger.info(`图片下载完成: 大小=${fileSize}字节, CRC32=${crc32}`);
+
+ // 第二步:申请图片上传权限
+ // 使用UTC时间格式 YYYYMMDD'T'HHMMSS'Z'
+ const now = new Date();
+ const timestamp = now.toISOString().replace(/[:\-]/g, '').replace(/\.\d{3}Z$/, 'Z');
+
+ // 生成随机字符串作为签名参数
+ const randomStr = Math.random().toString(36).substring(2, 12);
+ // 保持原始的参数顺序(这是API期望的顺序)
+ const applyUrl = `https://imagex.bytedanceapi.com/?Action=ApplyImageUpload&Version=2018-08-01&ServiceId=${actualServiceId}&FileSize=${fileSize}&s=${randomStr}`;
+
+ logger.debug(`原始URL: ${applyUrl}`);
+
+ // 构建AWS签名所需的头部
+ const requestHeaders = {
+ 'x-amz-date': timestamp,
+ 'x-amz-security-token': session_token
+ };
+
+ // 生成AWS签名
+ const authorization = createSignature('GET', applyUrl, requestHeaders, access_key_id, secret_access_key, session_token);
+
+ // 调试日志
+ logger.info(`AWS签名调试信息:
+ URL: ${applyUrl}
+ AccessKeyId: ${access_key_id}
+ SessionToken: ${session_token ? '存在' : '不存在'}
+ Timestamp: ${timestamp}
+ Authorization: ${authorization}
+ `);
+
+ const applyResponse = await fetch(applyUrl, {
+ method: 'GET',
+ headers: {
+ 'accept': '*/*',
+ 'accept-language': 'zh-CN,zh;q=0.9',
+ 'authorization': authorization,
+ 'origin': 'https://jimeng.jianying.com',
+ 'referer': 'https://jimeng.jianying.com/ai-tool/generate',
+ 'sec-ch-ua': '"Not A(Brand";v="8", "Chromium";v="132", "Google Chrome";v="132"',
+ 'sec-ch-ua-mobile': '?0',
+ 'sec-ch-ua-platform': '"Windows"',
+ 'sec-fetch-dest': 'empty',
+ 'sec-fetch-mode': 'cors',
+ 'sec-fetch-site': 'cross-site',
+ 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36',
+ 'x-amz-date': timestamp,
+ 'x-amz-security-token': session_token,
+ },
+ });
+
+ if (!applyResponse.ok) {
+ const errorText = await applyResponse.text();
+ throw new Error(`申请上传权限失败: ${applyResponse.status} - ${errorText}`);
+ }
+
+ const applyResult = await applyResponse.json();
+
+ // 检查是否有错误
+ if (applyResult?.ResponseMetadata?.Error) {
+ throw new Error(`申请上传权限失败: ${JSON.stringify(applyResult.ResponseMetadata.Error)}`);
+ }
+
+ logger.info(`申请上传权限成功`);
+
+ // 解析上传信息
+ const uploadAddress = applyResult?.Result?.UploadAddress;
+ if (!uploadAddress || !uploadAddress.StoreInfos || !uploadAddress.UploadHosts) {
+ throw new Error(`获取上传地址失败: ${JSON.stringify(applyResult)}`);
+ }
+
+ const storeInfo = uploadAddress.StoreInfos[0];
+ const uploadHost = uploadAddress.UploadHosts[0];
+ const auth = storeInfo.Auth;
+
+ // 构建上传URL
+ const uploadUrl = `https://${uploadHost}/upload/v1/${storeInfo.StoreUri}`;
+
+ // 提取图片ID (StoreUri最后一个斜杠后的部分)
+ const imageId = storeInfo.StoreUri.split('/').pop();
+
+ logger.info(`准备上传图片: imageId=${imageId}, uploadUrl=${uploadUrl}`);
+
+ // 第三步:上传图片文件
+ const uploadResponse = await fetch(uploadUrl, {
+ method: 'POST',
+ headers: {
+ 'Accept': '*/*',
+ 'Accept-Language': 'zh-CN,zh;q=0.9',
+ 'Authorization': auth,
+ 'Connection': 'keep-alive',
+ 'Content-CRC32': crc32,
+ 'Content-Disposition': 'attachment; filename="undefined"',
+ 'Content-Type': 'application/octet-stream',
+ 'Origin': 'https://jimeng.jianying.com',
+ 'Referer': 'https://jimeng.jianying.com/ai-tool/generate',
+ 'Sec-Fetch-Dest': 'empty',
+ 'Sec-Fetch-Mode': 'cors',
+ 'Sec-Fetch-Site': 'cross-site',
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36',
+ 'X-Storage-U': '704135154117550', // 用户ID,可以从token或其他地方获取
+ },
+ body: imageBuffer,
+ });
+
+ if (!uploadResponse.ok) {
+ const errorText = await uploadResponse.text();
+ throw new Error(`图片上传失败: ${uploadResponse.status} - ${errorText}`);
+ }
+
+ logger.info(`图片文件上传成功`);
+
+ // 第四步:提交上传
+ const commitUrl = `https://imagex.bytedanceapi.com/?Action=CommitImageUpload&Version=2018-08-01&ServiceId=${actualServiceId}`;
+
+ const commitTimestamp = new Date().toISOString().replace(/[:\-]/g, '').replace(/\.\d{3}Z$/, 'Z');
+ const commitPayload = JSON.stringify({
+ SessionKey: uploadAddress.SessionKey,
+ SuccessActionStatus: "200"
+ });
+
+ // 计算payload的SHA256哈希值
+ const payloadHash = crypto.createHash('sha256').update(commitPayload, 'utf8').digest('hex');
+
+ // 构建AWS签名所需的头部
+ const commitRequestHeaders = {
+ 'x-amz-date': commitTimestamp,
+ 'x-amz-security-token': session_token,
+ 'x-amz-content-sha256': payloadHash
+ };
+
+ // 生成AWS签名
+ const commitAuthorization = createSignature('POST', commitUrl, commitRequestHeaders, access_key_id, secret_access_key, session_token, commitPayload);
+
+ const commitResponse = await fetch(commitUrl, {
+ method: 'POST',
+ headers: {
+ 'accept': '*/*',
+ 'accept-language': 'zh-CN,zh;q=0.9',
+ 'authorization': commitAuthorization,
+ 'content-type': 'application/json',
+ 'origin': 'https://jimeng.jianying.com',
+ 'referer': 'https://jimeng.jianying.com/ai-tool/generate',
+ 'sec-ch-ua': '"Not A(Brand";v="8", "Chromium";v="132", "Google Chrome";v="132"',
+ 'sec-ch-ua-mobile': '?0',
+ 'sec-ch-ua-platform': '"Windows"',
+ 'sec-fetch-dest': 'empty',
+ 'sec-fetch-mode': 'cors',
+ 'sec-fetch-site': 'cross-site',
+ 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36',
+ 'x-amz-date': commitTimestamp,
+ 'x-amz-security-token': session_token,
+ 'x-amz-content-sha256': payloadHash,
+ },
+ body: commitPayload,
+ });
+
+ if (!commitResponse.ok) {
+ const errorText = await commitResponse.text();
+ throw new Error(`提交上传失败: ${commitResponse.status} - ${errorText}`);
+ }
+
+ const commitResult = await commitResponse.json();
+
+ // 检查提交结果
+ if (commitResult?.ResponseMetadata?.Error) {
+ throw new Error(`提交上传失败: ${JSON.stringify(commitResult.ResponseMetadata.Error)}`);
+ }
+
+ if (!commitResult?.Result?.Results || commitResult.Result.Results.length === 0) {
+ throw new Error(`提交上传响应缺少结果: ${JSON.stringify(commitResult)}`);
+ }
+
+ const uploadResult = commitResult.Result.Results[0];
+ if (uploadResult.UriStatus !== 2000) {
+ throw new Error(`图片上传状态异常: UriStatus=${uploadResult.UriStatus}`);
+ }
+
+ // 获取完整的URI(包含前缀)
+ const fullImageUri = uploadResult.Uri; // 如: "tos-cn-i-tb4s082cfz/bab623359bd9410da0c1f07897b16fec"
+
+ // 验证图片信息
+ const pluginResult = commitResult.Result?.PluginResult?.[0];
+ if (pluginResult) {
+ logger.info(`图片上传成功详情:`, {
+ imageUri: pluginResult.ImageUri,
+ sourceUri: pluginResult.SourceUri,
+ size: `${pluginResult.ImageWidth}x${pluginResult.ImageHeight}`,
+ format: pluginResult.ImageFormat,
+ fileSize: pluginResult.ImageSize,
+ md5: pluginResult.ImageMd5
+ });
+
+ // 优先使用PluginResult中的ImageUri,因为它可能是最准确的
+ if (pluginResult.ImageUri) {
+ logger.info(`图片上传完成: ${pluginResult.ImageUri}`);
+ return pluginResult.ImageUri; // 返回完整的URI
+ }
+ }
+
+ logger.info(`图片上传完成: ${fullImageUri}`);
+ return fullImageUri; // 返回完整的URI
+
+ } catch (error) {
+ logger.error(`图片上传失败: ${error.message}`);
+ throw error;
+ }
+}
+
+// 从Buffer上传图片
+async function uploadImageBuffer(buffer: Buffer, refreshToken: string): Promise {
+ try {
+ logger.info(`开始从Buffer上传图片,大小: ${buffer.length}字节`);
+
+ // 获取上传凭证
+ const proofResult = await request(
+ 'POST',
+ '/mweb/v1/get_upload_image_proof',
+ refreshToken,
+ {
+ data: {
+ scene: 'aigc_image',
+ file_name: `${util.uuid()}.jpg`,
+ file_size: buffer.length,
+ }
+ }
+ );
+
+ if (!proofResult || !proofResult.proof_info) {
+ logger.error(`获取上传凭证失败: ${JSON.stringify(proofResult)}`);
+ throw new APIException(EX.API_REQUEST_FAILED, '获取上传凭证失败');
+ }
+
+ logger.info(`获取上传凭证成功`);
+
+ // 上传文件
+ const { proof_info } = proofResult;
+ const uploadProofUrl = 'https://imagex.bytedanceapi.com/';
+
+ const formData = new FormData();
+ const blob = new Blob([buffer], { type: 'image/jpeg' });
+ formData.append('file', blob, `${util.uuid()}.jpg`);
+
+ const uploadResult = await fetch(uploadProofUrl + '?' + new URLSearchParams(proof_info.query_params).toString(), {
+ method: 'POST',
+ headers: proof_info.headers,
+ body: formData,
+ });
+
+ if (!uploadResult.ok) {
+ logger.error(`上传文件失败: 状态码 ${uploadResult.status}`);
+ throw new APIException(EX.API_REQUEST_FAILED, `上传文件失败: 状态码 ${uploadResult.status}`);
+ }
+
+ // 验证 proof_info.image_uri 是否存在
+ if (!proof_info.image_uri) {
+ logger.error(`上传凭证中缺少 image_uri: ${JSON.stringify(proof_info)}`);
+ throw new APIException(EX.API_REQUEST_FAILED, '上传凭证中缺少 image_uri');
+ }
+
+ logger.info(`Buffer图片上传成功: ${proof_info.image_uri}`);
+ return proof_info.image_uri;
+ } catch (error) {
+ logger.error(`Buffer图片上传失败: ${error.message}`);
+ throw error;
+ }
+}
+
+// 图片合成功能:先上传图片,然后进行图生图
+export async function generateImageComposition(
+ _model: string,
+ prompt: string,
+ imageUrls: (string | Buffer)[],
+ {
+ ratio = "1:1",
+ resolution = "2k",
+ sampleStrength = 0.5,
+ negativePrompt = "",
+ intelligentRatio = false,
+ }: {
+ ratio?: string;
+ resolution?: string;
+ sampleStrength?: number;
+ negativePrompt?: string;
+ intelligentRatio?: boolean;
+ },
+ refreshToken: string
+) {
+ const model = getModel(_model);
+ const draftVersion = getDraftVersion(_model);
+ const imageCount = imageUrls.length;
+
+ // 解析分辨率
+ const resolutionResult = resolveResolution(resolution, ratio);
+ const { width, height, imageRatio, resolutionType } = resolutionResult;
+
+ logger.info(`使用模型: ${_model} 映射模型: ${model} 图生图功能 ${imageCount}张图片 ${width}x${height} (${ratio}@${resolution}) 精细度: ${sampleStrength}`);
+
+ const { totalCredit } = await getCredit(refreshToken);
+ if (totalCredit <= 0)
+ await receiveCredit(refreshToken);
+
+ // 上传所有输入图片
+ const uploadedImageIds: string[] = [];
+ for (let i = 0; i < imageUrls.length; i++) {
+ try {
+ const image = imageUrls[i];
+ let imageId: string;
+ if (typeof image === 'string') {
+ logger.info(`正在处理第 ${i + 1}/${imageCount} 张图片 (URL)...`);
+ imageId = await uploadImageFromUrl(image, refreshToken);
+ } else {
+ logger.info(`正在处理第 ${i + 1}/${imageCount} 张图片 (Buffer)...`);
+ imageId = await uploadImageBuffer(image, refreshToken);
+ }
+ uploadedImageIds.push(imageId);
+ logger.info(`图片 ${i + 1}/${imageCount} 上传成功: ${imageId}`);
+ } catch (error) {
+ logger.error(`图片 ${i + 1}/${imageCount} 上传失败: ${error.message}`);
+ throw new APIException(EX.API_IMAGE_GENERATION_FAILED, `图片上传失败: ${error.message}`);
+ }
+ }
+
+ logger.info(`所有图片上传完成,开始图生图: ${uploadedImageIds.join(', ')}`);
+
+ const componentId = util.uuid();
+ const submitId = util.uuid();
+
+ // 构建图生图的 sceneOptions(不包含 benefitCount 以避免扣积分)
+ // 注意:sceneOptions 需要是对象,在 metrics_extra 中会被 JSON.stringify
+ const sceneOption = {
+ type: "image",
+ scene: "ImageBasicGenerate",
+ modelReqKey: _model,
+ resolutionType,
+ abilityList: uploadedImageIds.map(() => ({
+ abilityName: "byte_edit",
+ strength: sampleStrength,
+ source: {
+ imageUrl: `blob:https://jimeng.jianying.com/${util.uuid()}`
+ }
+ })),
+ reportParams: {
+ enterSource: "generate",
+ vipSource: "generate",
+ extraVipFunctionKey: `${_model}-${resolutionType}`,
+ useVipFunctionDetailsReporterHoc: true,
+ },
+ };
+
+ const { aigc_data } = await request(
+ "post",
+ "/mweb/v1/aigc_draft/generate",
+ refreshToken,
+ {
+ data: {
+ extend: {
+ root_model: model,
+ },
+ submit_id: submitId,
+ metrics_extra: JSON.stringify({
+ promptSource: "custom",
+ generateCount: 1,
+ enterFrom: "click",
+ sceneOptions: JSON.stringify([sceneOption]),
+ generateId: submitId,
+ isRegenerate: false
+ }),
+ draft_content: JSON.stringify({
+ type: "draft",
+ id: util.uuid(),
+ min_version: "3.2.9",
+ min_features: [],
+ is_from_tsn: true,
+ version: "3.2.9",
+ main_component_id: componentId,
+ component_list: [
+ {
+ type: "image_base_component",
+ id: componentId,
+ min_version: "3.0.2",
+ aigc_mode: "workbench",
+ metadata: {
+ type: "",
+ id: util.uuid(),
+ created_platform: 3,
+ created_platform_version: "",
+ created_time_in_ms: Date.now().toString(),
+ created_did: "",
+ },
+ generate_type: "blend",
+ abilities: {
+ type: "",
+ id: util.uuid(),
+ blend: {
+ type: "",
+ id: util.uuid(),
+ min_version: "3.2.9",
+ min_features: [],
+ core_param: {
+ type: "",
+ id: util.uuid(),
+ model,
+ prompt: `${'#'.repeat(imageCount * 2)}${prompt}`,
+ sample_strength: sampleStrength,
+ image_ratio: imageRatio,
+ large_image_info: {
+ type: "",
+ id: util.uuid(),
+ height,
+ width,
+ resolution_type: resolutionType
+ },
+ intelligent_ratio: intelligentRatio,
+ },
+ ability_list: uploadedImageIds.map((imageId) => ({
+ type: "",
+ id: util.uuid(),
+ name: "byte_edit",
+ image_uri_list: [imageId],
+ image_list: [{
+ type: "image",
+ id: util.uuid(),
+ source_from: "upload",
+ platform_type: 1,
+ name: "",
+ image_uri: imageId,
+ width: 0,
+ height: 0,
+ format: "",
+ uri: imageId
+ }],
+ strength: 0.5
+ })),
+ prompt_placeholder_info_list: uploadedImageIds.map((_, index) => ({
+ type: "",
+ id: util.uuid(),
+ ability_index: index
+ })),
+ postedit_param: {
+ type: "",
+ id: util.uuid(),
+ generate_type: 0
+ }
+ },
+ },
+ },
+ ],
+ }),
+ http_common_info: {
+ aid: DEFAULT_ASSISTANT_ID,
+ },
+ },
+ }
+ );
+
+ const historyId = aigc_data?.history_record_id;
+ if (!historyId)
+ throw new APIException(EX.API_IMAGE_GENERATION_FAILED, "记录ID不存在");
+
+ logger.info(`图生图任务已提交,history_id: ${historyId},等待生成完成...`);
+
+ let status = 20, failCode, item_list = [];
+ let pollCount = 0;
+ const maxPollCount = 600; // 最多轮询10分钟
+
+ while (pollCount < maxPollCount) {
+ await new Promise((resolve) => setTimeout(resolve, 1000));
+ pollCount++;
+
+ if (pollCount % 30 === 0) {
+ logger.info(`图生图进度: 第 ${pollCount} 次轮询 (history_id: ${historyId}),当前状态: ${status},已生成: ${item_list.length} 张图片...`);
+ }
+
+ const result = await request("post", "/mweb/v1/get_history_by_ids", refreshToken, {
+ data: {
+ history_ids: [historyId],
+ image_info: {
+ width: 2048,
+ height: 2048,
+ format: "webp",
+ image_scene_list: [
+ {
+ scene: "smart_crop",
+ width: 360,
+ height: 360,
+ uniq_key: "smart_crop-w:360-h:360",
+ format: "webp",
+ },
+ {
+ scene: "smart_crop",
+ width: 480,
+ height: 480,
+ uniq_key: "smart_crop-w:480-h:480",
+ format: "webp",
+ },
+ {
+ scene: "smart_crop",
+ width: 720,
+ height: 720,
+ uniq_key: "smart_crop-w:720-h:720",
+ format: "webp",
+ },
+ {
+ scene: "smart_crop",
+ width: 720,
+ height: 480,
+ uniq_key: "smart_crop-w:720-h:480",
+ format: "webp",
+ },
+ {
+ scene: "normal",
+ width: 2400,
+ height: 2400,
+ uniq_key: "2400",
+ format: "webp",
+ },
+ {
+ scene: "normal",
+ width: 1080,
+ height: 1080,
+ uniq_key: "1080",
+ format: "webp",
+ },
+ {
+ scene: "normal",
+ width: 720,
+ height: 720,
+ uniq_key: "720",
+ format: "webp",
+ },
+ {
+ scene: "normal",
+ width: 480,
+ height: 480,
+ uniq_key: "480",
+ format: "webp",
+ },
+ {
+ scene: "normal",
+ width: 360,
+ height: 360,
+ uniq_key: "360",
+ format: "webp",
+ },
+ ],
+ },
+ http_common_info: {
+ aid: DEFAULT_ASSISTANT_ID,
+ },
+ },
+ });
+
+ if (!result[historyId])
+ throw new APIException(EX.API_IMAGE_GENERATION_FAILED, "记录不存在");
+
+ status = result[historyId].status;
+ failCode = result[historyId].fail_code;
+ item_list = result[historyId].item_list || [];
+
+ // 检查是否已生成图片
+ if (item_list.length > 0) {
+ logger.info(`图生图完成: 状态=${status}, 已生成 ${item_list.length} 张图片`);
+ break;
+ }
+
+ // 记录详细状态
+ if (pollCount % 60 === 0) {
+ logger.info(`图生图详细状态: status=${status}, item_list.length=${item_list.length}, failCode=${failCode || 'none'}`);
+ }
+
+ // 如果状态是完成但图片数量为0,记录并继续等待
+ if (status === 10 && item_list.length === 0 && pollCount % 30 === 0) {
+ logger.info(`图生图状态已完成但无图片生成: 状态=${status}, 继续等待...`);
+ }
+ }
+
+ if (pollCount >= maxPollCount) {
+ logger.warn(`图生图超时: 轮询了 ${pollCount} 次,当前状态: ${status},已生成图片数: ${item_list.length}`);
+ }
+
+ if (status === 30) {
+ if (failCode === '2038')
+ throw new APIException(EX.API_CONTENT_FILTERED);
+ else
+ throw new APIException(EX.API_IMAGE_GENERATION_FAILED, `图生图失败,错误代码: ${failCode}`);
+ }
+
+ const resultImageUrls = item_list.map((item) => {
+ if(!item?.image?.large_images?.[0]?.image_url)
+ return item?.common_attr?.cover_url || null;
+ return item.image.large_images[0].image_url;
+ }).filter(url => url !== null);
+
+ logger.info(`图生图结果: 成功生成 ${resultImageUrls.length} 张图片`);
+ return resultImageUrls;
+}
+
+// 多图生成函数(支持jimeng-4.0及以上版本)
+async function generateMultiImages(
+ _model: string,
+ prompt: string,
+ {
+ ratio = "1:1",
+ resolution = "2k",
+ sampleStrength = 0.5,
+ negativePrompt = "",
+ intelligentRatio = false,
+ }: {
+ ratio?: string;
+ resolution?: string;
+ sampleStrength?: number;
+ negativePrompt?: string;
+ intelligentRatio?: boolean;
+ },
+ refreshToken: string
+) {
+ const model = getModel(_model);
+
+ // 解析分辨率
+ const resolutionResult = resolveResolution(resolution, ratio);
+ const { width, height, imageRatio, resolutionType } = resolutionResult;
+
+ // 从prompt中提取图片数量,默认为4张
+ const targetImageCount = prompt.match(/(\d+)张/) ? parseInt(prompt.match(/(\d+)张/)[1]) : 4;
+
+ logger.info(`使用 ${_model} 多图生成: ${targetImageCount}张图片 ${width}x${height} (${ratio}@${resolution}) 精细度: ${sampleStrength}`);
+
+ const componentId = util.uuid();
+ const submitId = util.uuid();
+
+ // 构建多图模式的 sceneOptions(不包含 benefitCount 以避免扣积分)
+ const sceneOption = {
+ type: "image",
+ scene: "ImageMultiGenerate",
+ modelReqKey: _model,
+ resolutionType,
+ abilityList: [],
+ reportParams: {
+ enterSource: "generate",
+ vipSource: "generate",
+ extraVipFunctionKey: `${_model}-${resolutionType}`,
+ useVipFunctionDetailsReporterHoc: true,
+ },
+ };
+
+ const { aigc_data } = await request(
+ "post",
+ "/mweb/v1/aigc_draft/generate",
+ refreshToken,
+ {
+ data: {
+ extend: {
+ root_model: model,
+ },
+ submit_id: submitId,
+ metrics_extra: JSON.stringify({
+ promptSource: "custom",
+ generateCount: 1,
+ enterFrom: "click",
+ sceneOptions: JSON.stringify([sceneOption]),
+ generateId: submitId,
+ isRegenerate: false,
+ templateId: "",
+ templateSource: "",
+ lastRequestId: "",
+ originRequestId: "",
+ }),
+ draft_content: JSON.stringify({
+ type: "draft",
+ id: util.uuid(),
+ min_version: DRAFT_MIN_VERSION,
+ min_features: [],
+ is_from_tsn: true,
+ version: DRAFT_VERSION,
+ main_component_id: componentId,
+ component_list: [
+ {
+ type: "image_base_component",
+ id: componentId,
+ min_version: DRAFT_MIN_VERSION,
+ aigc_mode: "workbench",
+ metadata: {
+ type: "",
+ id: util.uuid(),
+ created_platform: 3,
+ created_platform_version: "",
+ created_time_in_ms: Date.now().toString(),
+ created_did: "",
+ },
+ generate_type: "generate",
+ 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: imageRatio,
+ large_image_info: {
+ type: "",
+ id: util.uuid(),
+ min_version: DRAFT_MIN_VERSION,
+ height,
+ width,
+ resolution_type: resolutionType,
+ },
+ intelligent_ratio: intelligentRatio,
+ },
+ gen_option: {
+ type: "",
+ id: util.uuid(),
+ generate_all: false,
+ },
+ },
+ },
+ },
+ ],
+ }),
+ http_common_info: {
+ aid: DEFAULT_ASSISTANT_ID,
+ },
+ },
+ }
+ );
+
+ const historyId = aigc_data?.history_record_id;
+ if (!historyId)
+ throw new APIException(EX.API_IMAGE_GENERATION_FAILED, "记录ID不存在");
+
+ logger.info(`多图生成任务已提交,submit_id: ${submitId}, history_id: ${historyId},等待生成 ${targetImageCount} 张图片...`);
+
+ // 直接使用 history_id 轮询生成结果(增加轮询时间)
+ let status = 20, failCode, item_list = [];
+ let pollCount = 0;
+ const maxPollCount = 600; // 最多轮询10分钟(600次 * 1秒)
+
+ while (pollCount < maxPollCount) {
+ await new Promise((resolve) => setTimeout(resolve, 1000)); // 每1秒轮询一次
+ pollCount++;
+
+ if (pollCount % 30 === 0) {
+ logger.info(`多图生成进度: 第 ${pollCount} 次轮询 (history_id: ${historyId}),当前状态: ${status},已生成: ${item_list.length}/${targetImageCount} 张图片...`);
+ }
+
+ const result = await request("post", "/mweb/v1/get_history_by_ids", refreshToken, {
+ data: {
+ history_ids: [historyId],
+ image_info: {
+ width: 2048,
+ height: 2048,
+ format: "webp",
+ image_scene_list: [
+ {
+ scene: "smart_crop",
+ width: 360,
+ height: 360,
+ uniq_key: "smart_crop-w:360-h:360",
+ format: "webp",
+ },
+ {
+ scene: "smart_crop",
+ width: 480,
+ height: 480,
+ uniq_key: "smart_crop-w:480-h:480",
+ format: "webp",
+ },
+ {
+ scene: "smart_crop",
+ width: 720,
+ height: 720,
+ uniq_key: "smart_crop-w:720-h:720",
+ format: "webp",
+ },
+ {
+ scene: "smart_crop",
+ width: 720,
+ height: 480,
+ uniq_key: "smart_crop-w:720-h:480",
+ format: "webp",
+ },
+ {
+ scene: "normal",
+ width: 2400,
+ height: 2400,
+ uniq_key: "2400",
+ format: "webp",
+ },
+ {
+ scene: "normal",
+ width: 1080,
+ height: 1080,
+ uniq_key: "1080",
+ format: "webp",
+ },
+ {
+ scene: "normal",
+ width: 720,
+ height: 720,
+ uniq_key: "720",
+ format: "webp",
+ },
+ {
+ scene: "normal",
+ width: 480,
+ height: 480,
+ uniq_key: "480",
+ format: "webp",
+ },
+ {
+ scene: "normal",
+ width: 360,
+ height: 360,
+ uniq_key: "360",
+ format: "webp",
+ },
+ ],
+ },
+ http_common_info: {
+ aid: DEFAULT_ASSISTANT_ID,
+ },
+ },
+ });
+
+ if (!result[historyId])
+ throw new APIException(EX.API_IMAGE_GENERATION_FAILED, "记录不存在");
+
+ status = result[historyId].status;
+ failCode = result[historyId].fail_code;
+ item_list = result[historyId].item_list || [];
+
+ // 检查是否已生成足够的图片
+ if (item_list.length >= targetImageCount) {
+ logger.info(`多图生成完成: 状态=${status}, 已生成 ${item_list.length} 张图片`);
+ break;
+ }
+
+ // 记录详细状态
+ if (pollCount % 60 === 0) {
+ logger.info(`jimeng-4.0 详细状态: status=${status}, item_list.length=${item_list.length}, failCode=${failCode || 'none'}`);
+ }
+
+ // 如果状态是完成但图片数量不够,记录并继续等待
+ if (status === 10 && item_list.length < targetImageCount && pollCount % 30 === 0) {
+ logger.info(`jimeng-4.0 状态已完成但图片数量不足: 状态=${status}, 已生成 ${item_list.length}/${targetImageCount} 张图片,继续等待...`);
+ }
+ }
+
+ if (pollCount >= maxPollCount) {
+ logger.warn(`多图生成超时: 轮询了 ${pollCount} 次,当前状态: ${status},已生成图片数: ${item_list.length}`);
+ }
+
+ if (status === 30) {
+ if (failCode === '2038')
+ throw new APIException(EX.API_CONTENT_FILTERED);
+ else
+ throw new APIException(EX.API_IMAGE_GENERATION_FAILED, `生成失败,错误代码: ${failCode}`);
+ }
+
+ const imageUrls = item_list.map((item) => {
+ if(!item?.image?.large_images?.[0]?.image_url)
+ return item?.common_attr?.cover_url || null;
+ return item.image.large_images[0].image_url;
+ }).filter(url => url !== null);
+
+ logger.info(`多图生成结果: 成功生成 ${imageUrls.length} 张图片`);
+ return imageUrls;
+}
+
+export async function generateImages(
+ _model: string,
+ prompt: string,
+ {
+ ratio = "1:1",
+ resolution = "2k",
+ sampleStrength = 0.5,
+ negativePrompt = "",
+ intelligentRatio = false,
+ }: {
+ ratio?: string;
+ resolution?: string;
+ sampleStrength?: number;
+ negativePrompt?: string;
+ intelligentRatio?: boolean;
+ },
+ refreshToken: string
+) {
+ const model = getModel(_model);
+
+ // 解析分辨率
+ const resolutionResult = resolveResolution(resolution, ratio);
+ const { width, height, imageRatio, resolutionType } = resolutionResult;
+
+ logger.info(`使用模型: ${_model} 映射模型: ${model} ${width}x${height} (${ratio}@${resolution}) 精细度: ${sampleStrength}`);
+
+
+ const { totalCredit } = await getCredit(refreshToken);
+ if (totalCredit <= 0)
+ await receiveCredit(refreshToken);
+
+ // 检测是否为多图生成请求
+ const isMultiImageRequest = (/jimeng-[45]\.[0-9]/.test(_model)) && (
+ prompt.includes("连续") ||
+ prompt.includes("绘本") ||
+ prompt.includes("故事") ||
+ /\d+张/.test(prompt)
+ );
+
+ // 如果是多图请求,使用专门的处理逻辑
+ if (isMultiImageRequest) {
+ return await generateMultiImages(_model, prompt, { ratio, resolution, sampleStrength, negativePrompt, intelligentRatio }, refreshToken);
+ }
+
+ const componentId = util.uuid();
+ const submitId = util.uuid();
+
+ // 构建 sceneOptions 用于 metrics_extra(不包含 benefitCount 以避免扣积分)
+ const sceneOption = {
+ type: "image",
+ scene: "ImageBasicGenerate",
+ modelReqKey: _model,
+ resolutionType,
+ abilityList: [],
+ reportParams: {
+ enterSource: "generate",
+ vipSource: "generate",
+ extraVipFunctionKey: `${_model}-${resolutionType}`,
+ useVipFunctionDetailsReporterHoc: true,
+ },
+ };
+
+ const { aigc_data } = await request(
+ "post",
+ "/mweb/v1/aigc_draft/generate",
+ refreshToken,
+ {
+ data: {
+ extend: {
+ root_model: model,
+ },
+ submit_id: submitId,
+ metrics_extra: JSON.stringify({
+ promptSource: "custom",
+ generateCount: 1,
+ enterFrom: "click",
+ sceneOptions: JSON.stringify([sceneOption]),
+ generateId: submitId,
+ isRegenerate: false,
+ }),
+ draft_content: JSON.stringify({
+ type: "draft",
+ id: util.uuid(),
+ min_version: DRAFT_MIN_VERSION,
+ min_features: [],
+ is_from_tsn: true,
+ version: DRAFT_VERSION,
+ main_component_id: componentId,
+ component_list: [
+ {
+ type: "image_base_component",
+ id: componentId,
+ min_version: DRAFT_MIN_VERSION,
+ aigc_mode: "workbench",
+ metadata: {
+ type: "",
+ id: util.uuid(),
+ created_platform: 3,
+ created_platform_version: "",
+ created_time_in_ms: Date.now().toString(),
+ created_did: "",
+ },
+ generate_type: "generate",
+ 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: imageRatio,
+ large_image_info: {
+ type: "",
+ id: util.uuid(),
+ min_version: DRAFT_MIN_VERSION,
+ height,
+ width,
+ resolution_type: resolutionType,
+ },
+ intelligent_ratio: intelligentRatio,
+ },
+ gen_option: {
+ type: "",
+ id: util.uuid(),
+ generate_all: false,
+ },
+ },
+ },
+ },
+ ],
+ }),
+ http_common_info: {
+ aid: DEFAULT_ASSISTANT_ID,
+ },
+ },
+ }
+ );
+ const historyId = aigc_data.history_record_id;
+ if (!historyId)
+ throw new APIException(EX.API_IMAGE_GENERATION_FAILED, "记录ID不存在");
+
+ logger.info(`文生图任务已提交,submit_id: ${submitId}, history_id: ${historyId},等待生成完成...`);
+
+ let status = 20, failCode, item_list = [];
+ let pollCount = 0;
+ const maxPollCount = 600; // 最多轮询10分钟
+
+ while (pollCount < maxPollCount) {
+ await new Promise((resolve) => setTimeout(resolve, 1000));
+ pollCount++;
+
+ if (pollCount % 30 === 0) {
+ logger.info(`文生图进度: 第 ${pollCount} 次轮询 (history_id: ${historyId}),当前状态: ${status},已生成: ${item_list.length} 张图片...`);
+ }
+
+ const result = await request("post", "/mweb/v1/get_history_by_ids", refreshToken, {
+ data: {
+ history_ids: [historyId],
+ image_info: {
+ width: 2048,
+ height: 2048,
+ format: "webp",
+ image_scene_list: [
+ {
+ scene: "smart_crop",
+ width: 360,
+ height: 360,
+ uniq_key: "smart_crop-w:360-h:360",
+ format: "webp",
+ },
+ {
+ scene: "smart_crop",
+ width: 480,
+ height: 480,
+ uniq_key: "smart_crop-w:480-h:480",
+ format: "webp",
+ },
+ {
+ scene: "smart_crop",
+ width: 720,
+ height: 720,
+ uniq_key: "smart_crop-w:720-h:720",
+ format: "webp",
+ },
+ {
+ scene: "smart_crop",
+ width: 720,
+ height: 480,
+ uniq_key: "smart_crop-w:720-h:480",
+ format: "webp",
+ },
+ {
+ scene: "smart_crop",
+ width: 360,
+ height: 240,
+ uniq_key: "smart_crop-w:360-h:240",
+ format: "webp",
+ },
+ {
+ scene: "smart_crop",
+ width: 240,
+ height: 320,
+ uniq_key: "smart_crop-w:240-h:320",
+ format: "webp",
+ },
+ {
+ scene: "smart_crop",
+ width: 480,
+ height: 640,
+ uniq_key: "smart_crop-w:480-h:640",
+ format: "webp",
+ },
+ {
+ scene: "normal",
+ width: 2400,
+ height: 2400,
+ uniq_key: "2400",
+ format: "webp",
+ },
+ {
+ scene: "normal",
+ width: 1080,
+ height: 1080,
+ uniq_key: "1080",
+ format: "webp",
+ },
+ {
+ scene: "normal",
+ width: 720,
+ height: 720,
+ uniq_key: "720",
+ format: "webp",
+ },
+ {
+ scene: "normal",
+ width: 480,
+ height: 480,
+ uniq_key: "480",
+ format: "webp",
+ },
+ {
+ scene: "normal",
+ width: 360,
+ height: 360,
+ uniq_key: "360",
+ format: "webp",
+ },
+ ],
+ },
+ http_common_info: {
+ aid: DEFAULT_ASSISTANT_ID,
+ },
+ },
+ });
+ if (!result[historyId])
+ throw new APIException(EX.API_IMAGE_GENERATION_FAILED, "记录不存在");
+
+ status = result[historyId].status;
+ failCode = result[historyId].fail_code;
+ item_list = result[historyId].item_list || [];
+
+ // 检查是否已生成图片
+ if (item_list.length > 0) {
+ logger.info(`文生图完成: 状态=${status}, 已生成 ${item_list.length} 张图片`);
+ break;
+ }
+
+ // 记录详细状态
+ if (pollCount % 60 === 0) {
+ logger.info(`文生图详细状态: status=${status}, item_list.length=${item_list.length}, failCode=${failCode || 'none'}`);
+ }
+
+ // 如果状态是完成但图片数量为0,记录并继续等待
+ if (status === 10 && item_list.length === 0 && pollCount % 30 === 0) {
+ logger.info(`文生图状态已完成但无图片生成: 状态=${status}, 继续等待...`);
+ }
+ }
+
+ if (pollCount >= maxPollCount) {
+ logger.warn(`文生图超时: 轮询了 ${pollCount} 次,当前状态: ${status},已生成图片数: ${item_list.length}`);
+ }
+
+ if (status === 30) {
+ if (failCode === '2038')
+ throw new APIException(EX.API_CONTENT_FILTERED);
+ else
+ throw new APIException(EX.API_IMAGE_GENERATION_FAILED);
+ }
+
+ const imageUrls = item_list.map((item) => {
+ if(!item?.image?.large_images?.[0]?.image_url)
+ return item?.common_attr?.cover_url || null;
+ return item.image.large_images[0].image_url;
+ }).filter(url => url !== null);
+
+ logger.info(`文生图结果: 成功生成 ${imageUrls.length} 张图片`);
+ return imageUrls;
+}
+
+export default {
+ generateImages,
+ generateImageComposition,
+};
diff --git a/src/api/controllers/videos.ts b/src/api/controllers/videos.ts
new file mode 100644
index 0000000..f4d0a3c
--- /dev/null
+++ b/src/api/controllers/videos.ts
@@ -0,0 +1,2003 @@
+import _ from "lodash";
+import crypto from "crypto";
+import fs from "fs";
+
+import APIException from "@/lib/exceptions/APIException.ts";
+import EX from "@/api/consts/exceptions.ts";
+import util from "@/lib/util.ts";
+import { getCredit, receiveCredit, request, DEFAULT_ASSISTANT_ID as CORE_ASSISTANT_ID, WEB_ID, acquireToken } from "./core.ts";
+import logger from "@/lib/logger.ts";
+import browserService from "@/lib/browser-service.ts";
+
+const DEFAULT_ASSISTANT_ID = 513695;
+export const DEFAULT_MODEL = "jimeng-video-3.0";
+const DEFAULT_DRAFT_VERSION = "3.2.8";
+
+const MODEL_DRAFT_VERSIONS: { [key: string]: string } = {
+ "jimeng-video-3.5-pro": "3.3.4",
+ "jimeng-video-3.0-pro": "3.2.8",
+ "jimeng-video-3.0": "3.2.8",
+ "jimeng-video-2.0": "3.2.8",
+ "jimeng-video-2.0-pro": "3.2.8",
+ // Seedance 模型(与上游 iptag/jimeng-api 保持一致)
+ "jimeng-video-seedance-2.0": "3.3.9",
+ "seedance-2.0": "3.3.9",
+ "seedance-2.0-pro": "3.3.9",
+ // Seedance 2.0-fast 模型(v1.9.3 新增)
+ "jimeng-video-seedance-2.0-fast": "3.3.9",
+ "seedance-2.0-fast": "3.3.9",
+};
+
+const MODEL_MAP = {
+ "jimeng-video-3.5-pro": "dreamina_ic_generate_video_model_vgfm_3.5_pro",
+ "jimeng-video-3.0-pro": "dreamina_ic_generate_video_model_vgfm_3.0_pro",
+ "jimeng-video-3.0": "dreamina_ic_generate_video_model_vgfm_3.0",
+ "jimeng-video-2.0": "dreamina_ic_generate_video_model_vgfm_lite",
+ "jimeng-video-2.0-pro": "dreamina_ic_generate_video_model_vgfm1.0",
+ // Seedance 多图智能视频生成模型(jimeng-video-seedance-2.0 为上游标准名称)
+ "jimeng-video-seedance-2.0": "dreamina_seedance_40_pro",
+ "seedance-2.0": "dreamina_seedance_40_pro",
+ "seedance-2.0-pro": "dreamina_seedance_40_pro",
+ // Seedance 2.0-fast 快速生成模型(v1.9.3 新增,内部模型为 dreamina_seedance_40)
+ "jimeng-video-seedance-2.0-fast": "dreamina_seedance_40",
+ "seedance-2.0-fast": "dreamina_seedance_40",
+};
+
+// Seedance 模型的 benefit_type 映射
+const SEEDANCE_BENEFIT_TYPE_MAP: { [key: string]: string } = {
+ "jimeng-video-seedance-2.0": "dreamina_video_seedance_20_pro",
+ "seedance-2.0": "dreamina_video_seedance_20_pro",
+ "seedance-2.0-pro": "dreamina_video_seedance_20_pro",
+ // Seedance 2.0-fast(v1.9.3 新增,注意:无 "video_" 前缀)
+ "jimeng-video-seedance-2.0-fast": "dreamina_seedance_20_fast",
+ "seedance-2.0-fast": "dreamina_seedance_20_fast",
+};
+
+// 判断是否为 Seedance 模型
+export function isSeedanceModel(model: string): boolean {
+ return model.startsWith("seedance-") || model.startsWith("jimeng-video-seedance-");
+}
+
+// ========== Seedance 多类型素材支持 ==========
+
+// 素材类型
+type SeedanceMaterialType = "image" | "video" | "audio";
+
+// 上传结果统一接口
+interface UploadedMaterial {
+ type: SeedanceMaterialType;
+ // 图片
+ uri?: string;
+ // 视频/音频(VOD)
+ vid?: string;
+ // 通用
+ width?: number;
+ height?: number;
+ duration?: number;
+ fps?: number;
+ name?: string;
+}
+
+// MIME 类型 → 素材类型映射
+const MIME_TO_MATERIAL_TYPE: Record = {
+ "image/jpeg": "image", "image/png": "image", "image/webp": "image",
+ "image/gif": "image", "image/bmp": "image",
+ "video/mp4": "video", "video/quicktime": "video", "video/x-m4v": "video",
+ "audio/mpeg": "audio", "audio/wav": "audio", "audio/x-wav": "audio",
+ "audio/mp3": "audio",
+};
+
+// 扩展名 → 素材类型映射(兜底)
+const EXT_TO_MATERIAL_TYPE: Record = {
+ ".jpg": "image", ".jpeg": "image", ".png": "image", ".webp": "image",
+ ".gif": "image", ".bmp": "image",
+ ".mp4": "video", ".mov": "video", ".m4v": "video",
+ ".mp3": "audio", ".wav": "audio",
+};
+
+// materialTypes 编码映射
+const MATERIAL_TYPE_CODE: Record = {
+ image: 1, video: 2, audio: 3,
+};
+
+/**
+ * 检测上传文件的素材类型
+ * 优先通过 MIME 类型判断,兜底通过文件扩展名
+ */
+function detectMaterialType(file: any): SeedanceMaterialType {
+ // 优先通过 MIME 类型判断
+ const mime = (file.mimetype || file.mimeType || "").toLowerCase();
+ if (mime && MIME_TO_MATERIAL_TYPE[mime]) return MIME_TO_MATERIAL_TYPE[mime];
+ // 兜底:通过文件扩展名判断
+ const filename = (file.originalFilename || file.newFilename || "").toLowerCase();
+ const dotIdx = filename.lastIndexOf(".");
+ if (dotIdx >= 0) {
+ const ext = filename.substring(dotIdx);
+ if (EXT_TO_MATERIAL_TYPE[ext]) return EXT_TO_MATERIAL_TYPE[ext];
+ }
+ // 默认视为图片(向后兼容)
+ return "image";
+}
+
+/**
+ * 从 URL 检测素材类型
+ * 通过 URL 路径的扩展名判断
+ */
+function detectMaterialTypeFromUrl(url: string): SeedanceMaterialType {
+ try {
+ const pathname = new URL(url).pathname.toLowerCase();
+ const dotIdx = pathname.lastIndexOf(".");
+ if (dotIdx >= 0) {
+ const ext = pathname.substring(dotIdx);
+ if (EXT_TO_MATERIAL_TYPE[ext]) return EXT_TO_MATERIAL_TYPE[ext];
+ }
+ } catch {}
+ // 默认视为图片(向后兼容)
+ return "image";
+}
+
+// 视频支持的分辨率和比例配置
+const VIDEO_RESOLUTION_OPTIONS: {
+ [resolution: string]: {
+ [ratio: string]: { width: number; height: number };
+ };
+} = {
+ "480p": {
+ "1:1": { width: 480, height: 480 },
+ "4:3": { width: 640, height: 480 },
+ "3:4": { width: 480, height: 640 },
+ "16:9": { width: 854, height: 480 },
+ "9:16": { width: 480, height: 854 },
+ },
+ "720p": {
+ "1:1": { width: 720, height: 720 },
+ "4:3": { width: 960, height: 720 },
+ "3:4": { width: 720, height: 960 },
+ "16:9": { width: 1280, height: 720 },
+ "9:16": { width: 720, height: 1280 },
+ },
+ "1080p": {
+ "1:1": { width: 1080, height: 1080 },
+ "4:3": { width: 1440, height: 1080 },
+ "3:4": { width: 1080, height: 1440 },
+ "16:9": { width: 1920, height: 1080 },
+ "9:16": { width: 1080, height: 1920 },
+ },
+};
+
+// 解析视频分辨率参数
+function resolveVideoResolution(
+ resolution: string = "720p",
+ ratio: string = "1:1"
+): { width: number; height: number } {
+ const resolutionGroup = VIDEO_RESOLUTION_OPTIONS[resolution];
+ if (!resolutionGroup) {
+ const supportedResolutions = Object.keys(VIDEO_RESOLUTION_OPTIONS).join(", ");
+ throw new Error(`不支持的视频分辨率 "${resolution}"。支持的分辨率: ${supportedResolutions}`);
+ }
+
+ const ratioConfig = resolutionGroup[ratio];
+ if (!ratioConfig) {
+ const supportedRatios = Object.keys(resolutionGroup).join(", ");
+ throw new Error(`在 "${resolution}" 分辨率下,不支持的比例 "${ratio}"。支持的比例: ${supportedRatios}`);
+ }
+
+ return {
+ width: ratioConfig.width,
+ height: ratioConfig.height,
+ };
+}
+
+export function getModel(model: string) {
+ return MODEL_MAP[model] || MODEL_MAP[DEFAULT_MODEL];
+}
+
+// AWS4-HMAC-SHA256 签名生成函数(从 images.ts 复制)
+function createSignature(
+ method: string,
+ url: string,
+ headers: { [key: string]: string },
+ accessKeyId: string,
+ secretAccessKey: string,
+ sessionToken?: string,
+ payload: string = '',
+ awsRegion: string = 'cn-north-1',
+ serviceName: string = 'imagex'
+) {
+ const urlObj = new URL(url);
+ const pathname = urlObj.pathname || '/';
+ const search = urlObj.search;
+
+ // 创建规范请求
+ const timestamp = headers['x-amz-date'];
+ const date = timestamp.substr(0, 8);
+ const region = awsRegion;
+ const service = serviceName;
+
+ // 规范化查询参数
+ const queryParams: Array<[string, string]> = [];
+ const searchParams = new URLSearchParams(search);
+ searchParams.forEach((value, key) => {
+ queryParams.push([key, value]);
+ });
+
+ // 按键名排序
+ queryParams.sort(([a], [b]) => {
+ if (a < b) return -1;
+ if (a > b) return 1;
+ return 0;
+ });
+
+ const canonicalQueryString = queryParams
+ .map(([key, value]) => `${key}=${value}`)
+ .join('&');
+
+ // 规范化头部
+ const headersToSign: { [key: string]: string } = {
+ 'x-amz-date': timestamp
+ };
+
+ if (sessionToken) {
+ headersToSign['x-amz-security-token'] = sessionToken;
+ }
+
+ let payloadHash = crypto.createHash('sha256').update('').digest('hex');
+ if (method.toUpperCase() === 'POST' && payload) {
+ payloadHash = crypto.createHash('sha256').update(payload, 'utf8').digest('hex');
+ headersToSign['x-amz-content-sha256'] = payloadHash;
+ }
+
+ const signedHeaders = Object.keys(headersToSign)
+ .map(key => key.toLowerCase())
+ .sort()
+ .join(';');
+
+ const canonicalHeaders = Object.keys(headersToSign)
+ .sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()))
+ .map(key => `${key.toLowerCase()}:${headersToSign[key].trim()}\n`)
+ .join('');
+
+ const canonicalRequest = [
+ method.toUpperCase(),
+ pathname,
+ canonicalQueryString,
+ canonicalHeaders,
+ signedHeaders,
+ payloadHash
+ ].join('\n');
+
+ // 创建待签名字符串
+ const credentialScope = `${date}/${region}/${service}/aws4_request`;
+ const stringToSign = [
+ 'AWS4-HMAC-SHA256',
+ timestamp,
+ credentialScope,
+ crypto.createHash('sha256').update(canonicalRequest, 'utf8').digest('hex')
+ ].join('\n');
+
+ // 生成签名
+ const kDate = crypto.createHmac('sha256', `AWS4${secretAccessKey}`).update(date).digest();
+ const kRegion = crypto.createHmac('sha256', kDate).update(region).digest();
+ const kService = crypto.createHmac('sha256', kRegion).update(service).digest();
+ const kSigning = crypto.createHmac('sha256', kService).update('aws4_request').digest();
+ const signature = crypto.createHmac('sha256', kSigning).update(stringToSign, 'utf8').digest('hex');
+
+ return `AWS4-HMAC-SHA256 Credential=${accessKeyId}/${credentialScope}, SignedHeaders=${signedHeaders}, Signature=${signature}`;
+}
+
+// 计算文件的CRC32值(从 images.ts 复制)
+function calculateCRC32(buffer: ArrayBuffer): string {
+ const crcTable = [];
+ for (let i = 0; i < 256; i++) {
+ let crc = i;
+ for (let j = 0; j < 8; j++) {
+ crc = (crc & 1) ? (0xEDB88320 ^ (crc >>> 1)) : (crc >>> 1);
+ }
+ crcTable[i] = crc;
+ }
+
+ let crc = 0 ^ (-1);
+ const bytes = new Uint8Array(buffer);
+ for (let i = 0; i < bytes.length; i++) {
+ crc = (crc >>> 8) ^ crcTable[(crc ^ bytes[i]) & 0xFF];
+ }
+ return ((crc ^ (-1)) >>> 0).toString(16).padStart(8, '0');
+}
+
+// 视频专用图片上传功能(基于 images.ts 的 uploadImageFromUrl)
+async function uploadImageForVideo(imageUrl: string, refreshToken: string): Promise {
+ try {
+ logger.info(`开始上传视频图片: ${imageUrl}`);
+
+ // 第一步:获取上传令牌
+ const tokenResult = await request("post", "/mweb/v1/get_upload_token", refreshToken, {
+ data: {
+ scene: 2, // AIGC 图片上传场景
+ },
+ });
+
+ const { access_key_id, secret_access_key, session_token, service_id } = tokenResult;
+ if (!access_key_id || !secret_access_key || !session_token) {
+ throw new Error("获取上传令牌失败");
+ }
+
+ const actualServiceId = service_id || "tb4s082cfz";
+ logger.info(`获取上传令牌成功: service_id=${actualServiceId}`);
+
+ // 下载图片数据
+ const imageResponse = await fetch(imageUrl);
+ if (!imageResponse.ok) {
+ throw new Error(`下载图片失败: ${imageResponse.status}`);
+ }
+
+ const imageBuffer = await imageResponse.arrayBuffer();
+ const fileSize = imageBuffer.byteLength;
+ const crc32 = calculateCRC32(imageBuffer);
+
+ logger.info(`图片下载完成: 大小=${fileSize}字节, CRC32=${crc32}`);
+
+ // 第二步:申请图片上传权限
+ const now = new Date();
+ const timestamp = now.toISOString().replace(/[:\-]/g, '').replace(/\.\d{3}Z$/, 'Z');
+
+ const randomStr = Math.random().toString(36).substring(2, 12);
+ const applyUrl = `https://imagex.bytedanceapi.com/?Action=ApplyImageUpload&Version=2018-08-01&ServiceId=${actualServiceId}&FileSize=${fileSize}&s=${randomStr}`;
+
+ const requestHeaders = {
+ 'x-amz-date': timestamp,
+ 'x-amz-security-token': session_token
+ };
+
+ const authorization = createSignature('GET', applyUrl, requestHeaders, access_key_id, secret_access_key, session_token);
+
+ logger.info(`申请上传权限: ${applyUrl}`);
+
+ const applyResponse = await fetch(applyUrl, {
+ method: 'GET',
+ headers: {
+ 'accept': '*/*',
+ 'accept-language': 'zh-CN,zh;q=0.9',
+ 'authorization': authorization,
+ 'origin': 'https://jimeng.jianying.com',
+ 'referer': 'https://jimeng.jianying.com/ai-tool/video/generate',
+ 'sec-ch-ua': '"Not A(Brand";v="8", "Chromium";v="132", "Google Chrome";v="132"',
+ 'sec-ch-ua-mobile': '?0',
+ 'sec-ch-ua-platform': '"Windows"',
+ 'sec-fetch-dest': 'empty',
+ 'sec-fetch-mode': 'cors',
+ 'sec-fetch-site': 'cross-site',
+ 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36',
+ 'x-amz-date': timestamp,
+ 'x-amz-security-token': session_token,
+ },
+ });
+
+ if (!applyResponse.ok) {
+ const errorText = await applyResponse.text();
+ throw new Error(`申请上传权限失败: ${applyResponse.status} - ${errorText}`);
+ }
+
+ const applyResult = await applyResponse.json();
+
+ if (applyResult?.ResponseMetadata?.Error) {
+ throw new Error(`申请上传权限失败: ${JSON.stringify(applyResult.ResponseMetadata.Error)}`);
+ }
+
+ logger.info(`申请上传权限成功`);
+
+ // 解析上传信息
+ const uploadAddress = applyResult?.Result?.UploadAddress;
+ if (!uploadAddress || !uploadAddress.StoreInfos || !uploadAddress.UploadHosts) {
+ throw new Error(`获取上传地址失败: ${JSON.stringify(applyResult)}`);
+ }
+
+ const storeInfo = uploadAddress.StoreInfos[0];
+ const uploadHost = uploadAddress.UploadHosts[0];
+ const auth = storeInfo.Auth;
+
+ const uploadUrl = `https://${uploadHost}/upload/v1/${storeInfo.StoreUri}`;
+ const imageId = storeInfo.StoreUri.split('/').pop();
+
+ logger.info(`准备上传图片: imageId=${imageId}, uploadUrl=${uploadUrl}`);
+
+ // 第三步:上传图片文件
+ const uploadResponse = await fetch(uploadUrl, {
+ method: 'POST',
+ headers: {
+ 'Accept': '*/*',
+ 'Accept-Language': 'zh-CN,zh;q=0.9',
+ 'Authorization': auth,
+ 'Connection': 'keep-alive',
+ 'Content-CRC32': crc32,
+ 'Content-Disposition': 'attachment; filename="undefined"',
+ 'Content-Type': 'application/octet-stream',
+ 'Origin': 'https://jimeng.jianying.com',
+ 'Referer': 'https://jimeng.jianying.com/ai-tool/video/generate',
+ 'Sec-Fetch-Dest': 'empty',
+ 'Sec-Fetch-Mode': 'cors',
+ 'Sec-Fetch-Site': 'cross-site',
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36',
+ 'X-Storage-U': '704135154117550',
+ },
+ body: imageBuffer,
+ });
+
+ if (!uploadResponse.ok) {
+ const errorText = await uploadResponse.text();
+ throw new Error(`图片上传失败: ${uploadResponse.status} - ${errorText}`);
+ }
+
+ logger.info(`图片文件上传成功`);
+
+ // 第四步:提交上传
+ const commitUrl = `https://imagex.bytedanceapi.com/?Action=CommitImageUpload&Version=2018-08-01&ServiceId=${actualServiceId}`;
+
+ const commitTimestamp = new Date().toISOString().replace(/[:\-]/g, '').replace(/\.\d{3}Z$/, 'Z');
+ const commitPayload = JSON.stringify({
+ SessionKey: uploadAddress.SessionKey,
+ SuccessActionStatus: "200"
+ });
+
+ const payloadHash = crypto.createHash('sha256').update(commitPayload, 'utf8').digest('hex');
+
+ const commitRequestHeaders = {
+ 'x-amz-date': commitTimestamp,
+ 'x-amz-security-token': session_token,
+ 'x-amz-content-sha256': payloadHash
+ };
+
+ const commitAuthorization = createSignature('POST', commitUrl, commitRequestHeaders, access_key_id, secret_access_key, session_token, commitPayload);
+
+ const commitResponse = await fetch(commitUrl, {
+ method: 'POST',
+ headers: {
+ 'accept': '*/*',
+ 'accept-language': 'zh-CN,zh;q=0.9',
+ 'authorization': commitAuthorization,
+ 'content-type': 'application/json',
+ 'origin': 'https://jimeng.jianying.com',
+ 'referer': 'https://jimeng.jianying.com/ai-tool/video/generate',
+ 'sec-ch-ua': '"Not A(Brand";v="8", "Chromium";v="132", "Google Chrome";v="132"',
+ 'sec-ch-ua-mobile': '?0',
+ 'sec-ch-ua-platform': '"Windows"',
+ 'sec-fetch-dest': 'empty',
+ 'sec-fetch-mode': 'cors',
+ 'sec-fetch-site': 'cross-site',
+ 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36',
+ 'x-amz-date': commitTimestamp,
+ 'x-amz-security-token': session_token,
+ 'x-amz-content-sha256': payloadHash,
+ },
+ body: commitPayload,
+ });
+
+ if (!commitResponse.ok) {
+ const errorText = await commitResponse.text();
+ throw new Error(`提交上传失败: ${commitResponse.status} - ${errorText}`);
+ }
+
+ const commitResult = await commitResponse.json();
+
+ if (commitResult?.ResponseMetadata?.Error) {
+ throw new Error(`提交上传失败: ${JSON.stringify(commitResult.ResponseMetadata.Error)}`);
+ }
+
+ if (!commitResult?.Result?.Results || commitResult.Result.Results.length === 0) {
+ throw new Error(`提交上传响应缺少结果: ${JSON.stringify(commitResult)}`);
+ }
+
+ const uploadResult = commitResult.Result.Results[0];
+ if (uploadResult.UriStatus !== 2000) {
+ throw new Error(`图片上传状态异常: UriStatus=${uploadResult.UriStatus}`);
+ }
+
+ const fullImageUri = uploadResult.Uri;
+
+ // 验证图片信息
+ const pluginResult = commitResult.Result?.PluginResult?.[0];
+ if (pluginResult && pluginResult.ImageUri) {
+ logger.info(`视频图片上传完成: ${pluginResult.ImageUri}`);
+ return pluginResult.ImageUri;
+ }
+
+ logger.info(`视频图片上传完成: ${fullImageUri}`);
+ return fullImageUri;
+
+ } catch (error) {
+ logger.error(`视频图片上传失败: ${error.message}`);
+ throw error;
+ }
+}
+
+// 从Buffer上传视频图片
+async function uploadImageBufferForVideo(buffer: Buffer, refreshToken: string): Promise {
+ try {
+ logger.info(`开始从Buffer上传视频图片,大小: ${buffer.length}字节`);
+
+ // 第一步:获取上传令牌
+ const tokenResult = await request("post", "/mweb/v1/get_upload_token", refreshToken, {
+ data: {
+ scene: 2,
+ },
+ });
+
+ const { access_key_id, secret_access_key, session_token, service_id } = tokenResult;
+ if (!access_key_id || !secret_access_key || !session_token) {
+ throw new Error("获取上传令牌失败");
+ }
+
+ const actualServiceId = service_id || "tb4s082cfz";
+ logger.info(`获取上传令牌成功: service_id=${actualServiceId}`);
+
+ const fileSize = buffer.length;
+ const crc32 = calculateCRC32(buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength));
+
+ logger.info(`Buffer大小: ${fileSize}字节, CRC32=${crc32}`);
+
+ // 第二步:申请图片上传权限
+ const now = new Date();
+ const timestamp = now.toISOString().replace(/[:\-]/g, '').replace(/\.\d{3}Z$/, 'Z');
+
+ const randomStr = Math.random().toString(36).substring(2, 12);
+ const applyUrl = `https://imagex.bytedanceapi.com/?Action=ApplyImageUpload&Version=2018-08-01&ServiceId=${actualServiceId}&FileSize=${fileSize}&s=${randomStr}`;
+
+ const requestHeaders = {
+ 'x-amz-date': timestamp,
+ 'x-amz-security-token': session_token
+ };
+
+ const authorization = createSignature('GET', applyUrl, requestHeaders, access_key_id, secret_access_key, session_token);
+
+ const applyResponse = await fetch(applyUrl, {
+ method: 'GET',
+ headers: {
+ 'accept': '*/*',
+ 'accept-language': 'zh-CN,zh;q=0.9',
+ 'authorization': authorization,
+ 'origin': 'https://jimeng.jianying.com',
+ 'referer': 'https://jimeng.jianying.com/ai-tool/video/generate',
+ 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36',
+ 'x-amz-date': timestamp,
+ 'x-amz-security-token': session_token,
+ },
+ });
+
+ if (!applyResponse.ok) {
+ const errorText = await applyResponse.text();
+ throw new Error(`申请上传权限失败: ${applyResponse.status} - ${errorText}`);
+ }
+
+ const applyResult = await applyResponse.json();
+
+ if (applyResult?.ResponseMetadata?.Error) {
+ throw new Error(`申请上传权限失败: ${JSON.stringify(applyResult.ResponseMetadata.Error)}`);
+ }
+
+ const uploadAddress = applyResult?.Result?.UploadAddress;
+ if (!uploadAddress || !uploadAddress.StoreInfos || !uploadAddress.UploadHosts) {
+ throw new Error(`获取上传地址失败: ${JSON.stringify(applyResult)}`);
+ }
+
+ const storeInfo = uploadAddress.StoreInfos[0];
+ const uploadHost = uploadAddress.UploadHosts[0];
+ const auth = storeInfo.Auth;
+
+ const uploadUrl = `https://${uploadHost}/upload/v1/${storeInfo.StoreUri}`;
+
+ // 第三步:上传图片文件
+ const uploadResponse = await fetch(uploadUrl, {
+ method: 'POST',
+ headers: {
+ 'Accept': '*/*',
+ 'Authorization': auth,
+ 'Content-CRC32': crc32,
+ 'Content-Disposition': 'attachment; filename="undefined"',
+ 'Content-Type': 'application/octet-stream',
+ 'Origin': 'https://jimeng.jianying.com',
+ 'Referer': 'https://jimeng.jianying.com/ai-tool/video/generate',
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36',
+ },
+ body: buffer,
+ });
+
+ if (!uploadResponse.ok) {
+ const errorText = await uploadResponse.text();
+ throw new Error(`图片上传失败: ${uploadResponse.status} - ${errorText}`);
+ }
+
+ logger.info(`Buffer图片文件上传成功`);
+
+ // 第四步:提交上传
+ const commitUrl = `https://imagex.bytedanceapi.com/?Action=CommitImageUpload&Version=2018-08-01&ServiceId=${actualServiceId}`;
+
+ const commitTimestamp = new Date().toISOString().replace(/[:\-]/g, '').replace(/\.\d{3}Z$/, 'Z');
+ const commitPayload = JSON.stringify({
+ SessionKey: uploadAddress.SessionKey,
+ SuccessActionStatus: "200"
+ });
+
+ const payloadHash = crypto.createHash('sha256').update(commitPayload, 'utf8').digest('hex');
+
+ const commitRequestHeaders = {
+ 'x-amz-date': commitTimestamp,
+ 'x-amz-security-token': session_token,
+ 'x-amz-content-sha256': payloadHash
+ };
+
+ const commitAuthorization = createSignature('POST', commitUrl, commitRequestHeaders, access_key_id, secret_access_key, session_token, commitPayload);
+
+ const commitResponse = await fetch(commitUrl, {
+ method: 'POST',
+ headers: {
+ 'accept': '*/*',
+ 'authorization': commitAuthorization,
+ 'content-type': 'application/json',
+ 'origin': 'https://jimeng.jianying.com',
+ 'referer': 'https://jimeng.jianying.com/ai-tool/video/generate',
+ 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36',
+ 'x-amz-date': commitTimestamp,
+ 'x-amz-security-token': session_token,
+ 'x-amz-content-sha256': payloadHash,
+ },
+ body: commitPayload,
+ });
+
+ if (!commitResponse.ok) {
+ const errorText = await commitResponse.text();
+ throw new Error(`提交上传失败: ${commitResponse.status} - ${errorText}`);
+ }
+
+ const commitResult = await commitResponse.json();
+
+ if (commitResult?.ResponseMetadata?.Error) {
+ throw new Error(`提交上传失败: ${JSON.stringify(commitResult.ResponseMetadata.Error)}`);
+ }
+
+ if (!commitResult?.Result?.Results || commitResult.Result.Results.length === 0) {
+ throw new Error(`提交上传响应缺少结果: ${JSON.stringify(commitResult)}`);
+ }
+
+ const uploadResult = commitResult.Result.Results[0];
+ if (uploadResult.UriStatus !== 2000) {
+ throw new Error(`图片上传状态异常: UriStatus=${uploadResult.UriStatus}`);
+ }
+
+ const fullImageUri = uploadResult.Uri;
+
+ const pluginResult = commitResult.Result?.PluginResult?.[0];
+ if (pluginResult && pluginResult.ImageUri) {
+ logger.info(`Buffer视频图片上传完成: ${pluginResult.ImageUri}`);
+ return pluginResult.ImageUri;
+ }
+
+ logger.info(`Buffer视频图片上传完成: ${fullImageUri}`);
+ return fullImageUri;
+
+ } catch (error) {
+ logger.error(`Buffer视频图片上传失败: ${error.message}`);
+ throw error;
+ }
+}
+
+/**
+ * 解析音频文件时长(毫秒)
+ * 支持 WAV 格式精确解析,其他格式按 128kbps 估算
+ */
+function parseAudioDuration(buffer: Buffer): number {
+ try {
+ // WAV: RIFF header check
+ if (buffer.length >= 44 &&
+ buffer[0] === 0x52 && buffer[1] === 0x49 && buffer[2] === 0x46 && buffer[3] === 0x46 &&
+ buffer[8] === 0x57 && buffer[9] === 0x41 && buffer[10] === 0x56 && buffer[11] === 0x45) {
+ const byteRate = buffer.readUInt32LE(28);
+ if (byteRate > 0) {
+ // 查找 data chunk 获取精确大小
+ let offset = 12;
+ while (offset < buffer.length - 8) {
+ const chunkId = buffer.toString('ascii', offset, offset + 4);
+ const chunkSize = buffer.readUInt32LE(offset + 4);
+ if (chunkId === 'data') {
+ return Math.round(chunkSize / byteRate * 1000);
+ }
+ offset += 8 + chunkSize;
+ }
+ // 兜底:用文件大小估算
+ return Math.round((buffer.length - 44) / byteRate * 1000);
+ }
+ }
+ // 非 WAV:按 128kbps 估算
+ return Math.round(buffer.length / (128 * 1000 / 8) * 1000);
+ } catch {
+ return 0;
+ }
+}
+
+/**
+ * 上传视频/音频文件
+ * 通过 ByteDance VOD (视频点播) API 上传
+ * 流程: get_upload_token(scene=1) → ApplyUploadInner → Upload → CommitUploadInner
+ *
+ * @param buffer 文件 Buffer
+ * @param mediaType "video" 或 "audio"
+ * @param refreshToken 刷新令牌
+ * @param filename 原始文件名(可选)
+ * @returns { vid, width?, height?, duration?, fps? }
+ */
+async function uploadMediaForVideo(
+ buffer: Buffer,
+ mediaType: "video" | "audio",
+ refreshToken: string,
+ filename?: string
+): Promise<{ vid: string; width?: number; height?: number; duration?: number; fps?: number }> {
+ const label = mediaType === "audio" ? "音频" : "视频";
+ const fileSize = buffer.length;
+ logger.info(`开始上传${label}文件,大小: ${fileSize} 字节`);
+
+ // 第一步:获取 VOD 上传令牌(scene=1)
+ const tokenResult = await request("post", "/mweb/v1/get_upload_token", refreshToken, {
+ data: { scene: 1 },
+ });
+
+ const { access_key_id, secret_access_key, session_token, space_name } = tokenResult;
+ if (!access_key_id || !secret_access_key || !session_token) {
+ throw new Error(`获取${label}上传令牌失败`);
+ }
+
+ const spaceName = space_name || "dreamina";
+ logger.info(`获取${label}上传令牌成功: spaceName=${spaceName}`);
+
+ // 第二步:申请 VOD 上传权限(ApplyUploadInner)
+ const now = new Date();
+ const timestamp = now.toISOString().replace(/[:\-]/g, '').replace(/\.\d{3}Z$/, 'Z');
+ const randomStr = Math.random().toString(36).substring(2, 12);
+
+ const vodHost = "https://vod.bytedanceapi.com";
+ const applyUrl = `${vodHost}/?Action=ApplyUploadInner&Version=2020-11-19&SpaceName=${spaceName}&FileType=video&IsInner=1&FileSize=${fileSize}&s=${randomStr}`;
+
+ const requestHeaders: Record = {
+ 'x-amz-date': timestamp,
+ 'x-amz-security-token': session_token,
+ };
+
+ const authorization = createSignature(
+ 'GET', applyUrl, requestHeaders,
+ access_key_id, secret_access_key, session_token,
+ '', 'cn-north-1', 'vod'
+ );
+
+ logger.info(`申请${label}上传权限: ${applyUrl}`);
+
+ const applyResponse = await fetch(applyUrl, {
+ method: 'GET',
+ headers: {
+ 'accept': '*/*',
+ 'accept-language': 'zh-CN,zh;q=0.9',
+ 'authorization': authorization,
+ 'origin': 'https://jimeng.jianying.com',
+ 'referer': 'https://jimeng.jianying.com/ai-tool/video/generate',
+ 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36',
+ 'x-amz-date': timestamp,
+ 'x-amz-security-token': session_token,
+ },
+ });
+
+ if (!applyResponse.ok) {
+ const errorText = await applyResponse.text();
+ throw new Error(`申请${label}上传权限失败: ${applyResponse.status} - ${errorText}`);
+ }
+
+ const applyResult: any = await applyResponse.json();
+ if (applyResult?.ResponseMetadata?.Error) {
+ throw new Error(`申请${label}上传权限失败: ${JSON.stringify(applyResult.ResponseMetadata.Error)}`);
+ }
+
+ const uploadNodes = applyResult?.Result?.InnerUploadAddress?.UploadNodes;
+ if (!uploadNodes || uploadNodes.length === 0) {
+ throw new Error(`获取${label}上传节点失败: ${JSON.stringify(applyResult)}`);
+ }
+
+ const uploadNode = uploadNodes[0];
+ const storeInfo = uploadNode.StoreInfos?.[0];
+ if (!storeInfo) {
+ throw new Error(`获取${label}上传存储信息失败: ${JSON.stringify(uploadNode)}`);
+ }
+
+ const uploadHost = uploadNode.UploadHost;
+ const storeUri = storeInfo.StoreUri;
+ const auth = storeInfo.Auth;
+ const sessionKey = uploadNode.SessionKey;
+ const vid = uploadNode.Vid;
+
+ logger.info(`获取${label}上传节点成功: host=${uploadHost}, vid=${vid}`);
+
+ // 第三步:上传文件
+ const uploadUrl = `https://${uploadHost}/upload/v1/${storeUri}`;
+ const crc32 = calculateCRC32(buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength));
+
+ logger.info(`开始上传${label}文件: ${uploadUrl}, CRC32=${crc32}`);
+
+ const uploadResponse = await fetch(uploadUrl, {
+ method: 'POST',
+ headers: {
+ 'Accept': '*/*',
+ 'Authorization': auth,
+ 'Content-CRC32': crc32,
+ 'Content-Type': 'application/octet-stream',
+ 'Origin': 'https://jimeng.jianying.com',
+ 'Referer': 'https://jimeng.jianying.com/ai-tool/video/generate',
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36',
+ },
+ body: buffer,
+ });
+
+ if (!uploadResponse.ok) {
+ const errorText = await uploadResponse.text();
+ throw new Error(`${label}文件上传失败: ${uploadResponse.status} - ${errorText}`);
+ }
+
+ const uploadData: any = await uploadResponse.json();
+ if (uploadData?.code !== 2000) {
+ throw new Error(`${label}文件上传失败: code=${uploadData?.code}, message=${uploadData?.message}`);
+ }
+
+ logger.info(`${label}文件上传成功: crc32=${uploadData.data?.crc32}`);
+
+ // 第四步:确认上传(CommitUploadInner)
+ const commitUrl = `${vodHost}/?Action=CommitUploadInner&Version=2020-11-19&SpaceName=${spaceName}`;
+ const commitTimestamp = new Date().toISOString().replace(/[:\-]/g, '').replace(/\.\d{3}Z$/, 'Z');
+ const commitPayload = JSON.stringify({
+ SessionKey: sessionKey,
+ Functions: [],
+ });
+
+ const payloadHash = crypto.createHash('sha256').update(commitPayload, 'utf8').digest('hex');
+
+ const commitRequestHeaders: Record = {
+ 'x-amz-date': commitTimestamp,
+ 'x-amz-security-token': session_token,
+ 'x-amz-content-sha256': payloadHash,
+ };
+
+ const commitAuthorization = createSignature(
+ 'POST', commitUrl, commitRequestHeaders,
+ access_key_id, secret_access_key, session_token,
+ commitPayload, 'cn-north-1', 'vod'
+ );
+
+ logger.info(`提交${label}上传确认: ${commitUrl}`);
+
+ const commitResponse = await fetch(commitUrl, {
+ method: 'POST',
+ headers: {
+ 'accept': '*/*',
+ 'authorization': commitAuthorization,
+ 'content-type': 'application/json',
+ 'origin': 'https://jimeng.jianying.com',
+ 'referer': 'https://jimeng.jianying.com/ai-tool/video/generate',
+ 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36',
+ 'x-amz-date': commitTimestamp,
+ 'x-amz-security-token': session_token,
+ 'x-amz-content-sha256': payloadHash,
+ },
+ body: commitPayload,
+ });
+
+ if (!commitResponse.ok) {
+ const errorText = await commitResponse.text();
+ throw new Error(`提交${label}上传失败: ${commitResponse.status} - ${errorText}`);
+ }
+
+ const commitResult: any = await commitResponse.json();
+ if (commitResult?.ResponseMetadata?.Error) {
+ throw new Error(`提交${label}上传失败: ${JSON.stringify(commitResult.ResponseMetadata.Error)}`);
+ }
+
+ if (!commitResult?.Result?.Results || commitResult.Result.Results.length === 0) {
+ throw new Error(`提交${label}上传响应缺少结果: ${JSON.stringify(commitResult)}`);
+ }
+
+ const result = commitResult.Result.Results[0];
+ if (!result.Vid) {
+ throw new Error(`提交${label}上传响应缺少 Vid: ${JSON.stringify(result)}`);
+ }
+
+ // 从 VOD 返回的元数据中获取信息(音频有 Duration)
+ const videoMeta = result.VideoMeta || {};
+ let duration = videoMeta.Duration ? Math.round(videoMeta.Duration * 1000) : 0;
+
+ // 如果 VOD 未返回时长,用本地解析兜底
+ if (duration <= 0 && mediaType === "audio") {
+ duration = parseAudioDuration(buffer);
+ logger.info(`VOD 未返回${label}时长,本地解析: ${duration}ms`);
+ }
+
+ logger.info(`${label}上传完成: vid=${result.Vid}, duration=${duration}ms`);
+
+ return {
+ vid: result.Vid,
+ width: videoMeta.Width || 0,
+ height: videoMeta.Height || 0,
+ duration,
+ fps: videoMeta.Fps || 0,
+ };
+}
+
+/**
+ * 通过 get_local_item_list API 获取高质量视频下载URL
+ * 浏览器下载视频时使用此API获取高码率版本(~6297 vs 预览版 ~1152)
+ *
+ * @param itemId 视频项目ID
+ * @param refreshToken 刷新令牌
+ * @returns 高质量视频URL,失败时返回 null
+ */
+async function fetchHighQualityVideoUrl(itemId: string, refreshToken: string): Promise {
+ try {
+ logger.info(`尝试获取高质量视频下载URL,item_id: ${itemId}`);
+
+ const result = await request("post", "/mweb/v1/get_local_item_list", refreshToken, {
+ data: {
+ item_id_list: [itemId],
+ pack_item_opt: {
+ scene: 1,
+ need_data_integrity: true,
+ },
+ is_for_video_download: true,
+ },
+ });
+
+ const responseStr = JSON.stringify(result);
+ logger.info(`get_local_item_list 响应大小: ${responseStr.length} 字符`);
+
+ // 策略1: 从结构化字段中提取视频URL
+ const itemList = result.item_list || result.local_item_list || [];
+ if (itemList.length > 0) {
+ const item = itemList[0];
+ const videoUrl =
+ item?.video?.transcoded_video?.origin?.video_url ||
+ item?.video?.download_url ||
+ item?.video?.play_url ||
+ item?.video?.url;
+
+ if (videoUrl) {
+ logger.info(`从get_local_item_list结构化字段获取到高清视频URL: ${videoUrl}`);
+ return videoUrl;
+ }
+ }
+
+ // 策略2: 正则匹配 dreamnia.jimeng.com 高质量URL
+ const hqUrlMatch = responseStr.match(/https:\/\/v[0-9]+-dreamnia\.jimeng\.com\/[^"\s\\]+/);
+ if (hqUrlMatch && hqUrlMatch[0]) {
+ logger.info(`正则提取到高质量视频URL (dreamnia): ${hqUrlMatch[0]}`);
+ return hqUrlMatch[0];
+ }
+
+ // 策略3: 匹配任何 jimeng.com 域名的视频URL
+ const jimengUrlMatch = responseStr.match(/https:\/\/v[0-9]+-[^"\\]*\.jimeng\.com\/[^"\s\\]+/);
+ if (jimengUrlMatch && jimengUrlMatch[0]) {
+ logger.info(`正则提取到jimeng视频URL: ${jimengUrlMatch[0]}`);
+ return jimengUrlMatch[0];
+ }
+
+ // 策略4: 匹配任何视频URL(兜底)
+ const anyVideoUrlMatch = responseStr.match(/https:\/\/v[0-9]+-[^"\\]*\.(vlabvod|jimeng)\.com\/[^"\s\\]+/);
+ if (anyVideoUrlMatch && anyVideoUrlMatch[0]) {
+ logger.info(`从get_local_item_list提取到视频URL: ${anyVideoUrlMatch[0]}`);
+ return anyVideoUrlMatch[0];
+ }
+
+ logger.warn(`未能从get_local_item_list响应中提取到视频URL`);
+ return null;
+ } catch (error) {
+ logger.warn(`获取高质量视频下载URL失败: ${error.message}`);
+ return null;
+ }
+}
+
+/**
+ * 生成视频
+ *
+ * @param _model 模型名称
+ * @param prompt 提示词
+ * @param options 选项
+ * @param refreshToken 刷新令牌
+ * @returns 视频URL
+ */
+export async function generateVideo(
+ _model: string,
+ prompt: string,
+ {
+ ratio = "1:1",
+ resolution = "720p",
+ duration = 5,
+ filePaths = [],
+ files = [],
+ }: {
+ ratio?: string;
+ resolution?: string;
+ duration?: number;
+ filePaths?: string[];
+ files?: any[];
+ },
+ refreshToken: string
+) {
+ const model = getModel(_model);
+
+ // 解析分辨率参数获取实际的宽高
+ const { width, height } = resolveVideoResolution(resolution, ratio);
+
+ logger.info(`使用模型: ${_model} 映射模型: ${model} ${width}x${height} (${ratio}@${resolution}) 时长: ${duration}秒`);
+
+ // 检查积分
+ const { totalCredit } = await getCredit(refreshToken);
+ if (totalCredit <= 0)
+ await receiveCredit(refreshToken);
+
+ // 处理首帧和尾帧图片
+ let first_frame_image = undefined;
+ let end_frame_image = undefined;
+
+ // 处理上传的文件(multipart/form-data)
+ if (files && files.length > 0) {
+ let uploadIDs: string[] = [];
+ logger.info(`开始处理 ${files.length} 个上传文件用于视频生成`);
+
+ for (let i = 0; i < files.length; i++) {
+ const file = files[i];
+ if (!file || !file.filepath) {
+ logger.warn(`第 ${i + 1} 个文件无效,跳过`);
+ continue;
+ }
+
+ try {
+ logger.info(`开始上传第 ${i + 1} 个文件: ${file.originalFilename || file.filepath}`);
+
+ // 读取文件内容并上传
+ const buffer = fs.readFileSync(file.filepath);
+ const imageUri = await uploadImageBufferForVideo(buffer, refreshToken);
+
+ if (imageUri) {
+ uploadIDs.push(imageUri);
+ logger.info(`第 ${i + 1} 个文件上传成功: ${imageUri}`);
+ } else {
+ logger.error(`第 ${i + 1} 个文件上传失败: 未获取到 image_uri`);
+ }
+ } catch (error) {
+ logger.error(`第 ${i + 1} 个文件上传失败: ${error.message}`);
+
+ if (i === 0) {
+ logger.error(`首帧文件上传失败,停止视频生成以避免浪费积分`);
+ throw new APIException(EX.API_REQUEST_FAILED, `首帧文件上传失败: ${error.message}`);
+ } else {
+ logger.warn(`第 ${i + 1} 个文件上传失败,将跳过此文件继续处理`);
+ }
+ }
+ }
+
+ logger.info(`文件上传完成,成功上传 ${uploadIDs.length} 个文件`);
+
+ if (uploadIDs.length === 0) {
+ logger.error(`所有文件上传失败,停止视频生成以避免浪费积分`);
+ throw new APIException(EX.API_REQUEST_FAILED, '所有文件上传失败,请检查文件是否有效');
+ }
+
+ // 构建首帧图片对象
+ if (uploadIDs[0]) {
+ first_frame_image = {
+ format: "",
+ height: height,
+ id: util.uuid(),
+ image_uri: uploadIDs[0],
+ name: "",
+ platform_type: 1,
+ source_from: "upload",
+ type: "image",
+ uri: uploadIDs[0],
+ width: width,
+ };
+ logger.info(`设置首帧图片: ${uploadIDs[0]}`);
+ }
+
+ // 构建尾帧图片对象
+ if (uploadIDs[1]) {
+ end_frame_image = {
+ format: "",
+ height: height,
+ id: util.uuid(),
+ image_uri: uploadIDs[1],
+ name: "",
+ platform_type: 1,
+ source_from: "upload",
+ type: "image",
+ uri: uploadIDs[1],
+ width: width,
+ };
+ logger.info(`设置尾帧图片: ${uploadIDs[1]}`);
+ }
+ } else if (filePaths && filePaths.length > 0) {
+ let uploadIDs: string[] = [];
+ logger.info(`开始上传 ${filePaths.length} 张图片用于视频生成`);
+
+ for (let i = 0; i < filePaths.length; i++) {
+ const filePath = filePaths[i];
+ if (!filePath) {
+ logger.warn(`第 ${i + 1} 张图片路径为空,跳过`);
+ continue;
+ }
+
+ try {
+ logger.info(`开始上传第 ${i + 1} 张图片: ${filePath}`);
+
+ // 使用Amazon S3上传方式
+ const imageUri = await uploadImageForVideo(filePath, refreshToken);
+
+ if (imageUri) {
+ uploadIDs.push(imageUri);
+ logger.info(`第 ${i + 1} 张图片上传成功: ${imageUri}`);
+ } else {
+ logger.error(`第 ${i + 1} 张图片上传失败: 未获取到 image_uri`);
+ }
+ } catch (error) {
+ logger.error(`第 ${i + 1} 张图片上传失败: ${error.message}`);
+
+ // 图片上传失败时,停止视频生成避免浪费积分
+ if (i === 0) {
+ logger.error(`首帧图片上传失败,停止视频生成以避免浪费积分`);
+ throw new APIException(EX.API_REQUEST_FAILED, `首帧图片上传失败: ${error.message}`);
+ } else {
+ logger.warn(`第 ${i + 1} 张图片上传失败,将跳过此图片继续处理`);
+ }
+ }
+ }
+
+ logger.info(`图片上传完成,成功上传 ${uploadIDs.length} 张图片`);
+
+ // 如果没有成功上传任何图片,停止视频生成
+ if (uploadIDs.length === 0) {
+ logger.error(`所有图片上传失败,停止视频生成以避免浪费积分`);
+ throw new APIException(EX.API_REQUEST_FAILED, '所有图片上传失败,请检查图片URL是否有效');
+ }
+
+ // 构建首帧图片对象
+ if (uploadIDs[0]) {
+ first_frame_image = {
+ format: "",
+ height: height,
+ id: util.uuid(),
+ image_uri: uploadIDs[0],
+ name: "",
+ platform_type: 1,
+ source_from: "upload",
+ type: "image",
+ uri: uploadIDs[0],
+ width: width,
+ };
+ logger.info(`设置首帧图片: ${uploadIDs[0]}`);
+ }
+
+ // 构建尾帧图片对象
+ if (uploadIDs[1]) {
+ end_frame_image = {
+ format: "",
+ height: height,
+ id: util.uuid(),
+ image_uri: uploadIDs[1],
+ name: "",
+ platform_type: 1,
+ source_from: "upload",
+ type: "image",
+ uri: uploadIDs[1],
+ width: width,
+ };
+ logger.info(`设置尾帧图片: ${uploadIDs[1]}`);
+ } else if (filePaths.length > 1) {
+ logger.warn(`第二张图片上传失败或未提供,将仅使用首帧图片`);
+ }
+ } else {
+ logger.info(`未提供图片文件,将进行纯文本视频生成`);
+ }
+
+ const componentId = util.uuid();
+ const metricsExtra = JSON.stringify({
+ "enterFrom": "click",
+ "isDefaultSeed": 1,
+ "promptSource": "custom",
+ "isRegenerate": false,
+ "originSubmitId": util.uuid(),
+ });
+
+ // 获取当前模型的 draft 版本
+ const draftVersion = MODEL_DRAFT_VERSIONS[_model] || DEFAULT_DRAFT_VERSION;
+
+ // 计算视频宽高比
+ const gcd = (a: number, b: number): number => b === 0 ? a : gcd(b, a % b);
+ const divisor = gcd(width, height);
+ const aspectRatio = `${width / divisor}:${height / divisor}`;
+
+ // 构建请求参数
+ const { aigc_data } = await request(
+ "post",
+ "/mweb/v1/aigc_draft/generate",
+ refreshToken,
+ {
+ params: {
+ aigc_features: "app_lip_sync",
+ web_version: "6.6.0",
+ da_version: draftVersion,
+ },
+ data: {
+ "extend": {
+ "root_model": end_frame_image ? MODEL_MAP['jimeng-video-3.0'] : model,
+ "m_video_commerce_info": {
+ benefit_type: "basic_video_operation_vgfm_v_three",
+ resource_id: "generate_video",
+ resource_id_type: "str",
+ resource_sub_type: "aigc"
+ },
+ "m_video_commerce_info_list": [{
+ benefit_type: "basic_video_operation_vgfm_v_three",
+ resource_id: "generate_video",
+ resource_id_type: "str",
+ resource_sub_type: "aigc"
+ }]
+ },
+ "submit_id": util.uuid(),
+ "metrics_extra": metricsExtra,
+ "draft_content": JSON.stringify({
+ "type": "draft",
+ "id": util.uuid(),
+ "min_version": "3.0.5",
+ "is_from_tsn": true,
+ "version": draftVersion,
+ "main_component_id": componentId,
+ "component_list": [{
+ "type": "video_base_component",
+ "id": componentId,
+ "min_version": "1.0.0",
+ "metadata": {
+ "type": "",
+ "id": util.uuid(),
+ "created_platform": 3,
+ "created_platform_version": "",
+ "created_time_in_ms": Date.now(),
+ "created_did": ""
+ },
+ "generate_type": "gen_video",
+ "aigc_mode": "workbench",
+ "abilities": {
+ "type": "",
+ "id": util.uuid(),
+ "gen_video": {
+ "id": util.uuid(),
+ "type": "",
+ "text_to_video_params": {
+ "type": "",
+ "id": util.uuid(),
+ "model_req_key": model,
+ "priority": 0,
+ "seed": Math.floor(Math.random() * 100000000) + 2500000000,
+ "video_aspect_ratio": aspectRatio,
+ "video_gen_inputs": [{
+ duration_ms: duration * 1000,
+ first_frame_image: first_frame_image,
+ end_frame_image: end_frame_image,
+ fps: 24,
+ id: util.uuid(),
+ min_version: "3.0.5",
+ prompt: prompt,
+ resolution: resolution,
+ type: "",
+ video_mode: 2
+ }]
+ },
+ "video_task_extra": metricsExtra,
+ }
+ }
+ }],
+ }),
+ http_common_info: {
+ aid: DEFAULT_ASSISTANT_ID,
+ },
+ },
+ }
+ );
+
+ const historyId = aigc_data.history_record_id;
+ if (!historyId)
+ throw new APIException(EX.API_IMAGE_GENERATION_FAILED, "记录ID不存在");
+
+ // 轮询获取结果
+ let status = 20, failCode, item_list = [];
+ let retryCount = 0;
+ const maxRetries = 60; // 增加重试次数,支持约20分钟的总重试时间
+
+ // 首次查询前等待更长时间,让服务器有时间处理请求
+ await new Promise((resolve) => setTimeout(resolve, 5000));
+
+ logger.info(`开始轮询视频生成结果,历史ID: ${historyId},最大重试次数: ${maxRetries}`);
+ logger.info(`即梦官网API地址: https://jimeng.jianying.com/mweb/v1/get_history_by_ids`);
+ logger.info(`视频生成请求已发送,请同时在即梦官网查看: https://jimeng.jianying.com/ai-tool/video/generate`);
+
+ while (status === 20 && retryCount < maxRetries) {
+ try {
+ // 构建请求URL和参数
+ const requestUrl = "/mweb/v1/get_history_by_ids";
+ const requestData = {
+ history_ids: [historyId],
+ };
+
+ // 尝试两种不同的API请求方式
+ let result;
+ let useAlternativeApi = retryCount > 10 && retryCount % 2 === 0; // 在重试10次后,每隔一次尝试备用API
+
+ if (useAlternativeApi) {
+ // 备用API请求方式
+ logger.info(`尝试备用API请求方式,URL: ${requestUrl}, 历史ID: ${historyId}, 重试次数: ${retryCount + 1}/${maxRetries}`);
+ const alternativeRequestData = {
+ history_record_ids: [historyId],
+ };
+ result = await request("post", "/mweb/v1/get_history_records", refreshToken, {
+ data: alternativeRequestData,
+ });
+ logger.info(`备用API响应摘要: ${JSON.stringify(result).substring(0, 500)}...`);
+ } else {
+ // 标准API请求方式
+ logger.info(`发送请求获取视频生成结果,URL: ${requestUrl}, 历史ID: ${historyId}, 重试次数: ${retryCount + 1}/${maxRetries}`);
+ result = await request("post", requestUrl, refreshToken, {
+ data: requestData,
+ });
+ const responseStr = JSON.stringify(result);
+ logger.info(`标准API响应摘要: ${responseStr.substring(0, 300)}...`);
+ }
+
+
+ // 检查结果是否有效
+ let historyData;
+
+ if (useAlternativeApi && result.history_records && result.history_records.length > 0) {
+ // 处理备用API返回的数据格式
+ historyData = result.history_records[0];
+ logger.info(`从备用API获取到历史记录`);
+ } else if (result.history_list && result.history_list.length > 0) {
+ // 处理标准API返回的数据格式
+ historyData = result.history_list[0];
+ logger.info(`从标准API获取到历史记录`);
+ } else if (result[historyId]) {
+ // get_history_by_ids 返回数据以 historyId 为键(如 result["8918159809292"])
+ historyData = result[historyId];
+ logger.info(`从historyId键获取到历史记录`);
+ } else {
+ // 所有API都没有返回有效数据
+ logger.warn(`历史记录不存在,重试中 (${retryCount + 1}/${maxRetries})... 历史ID: ${historyId}`);
+ logger.info(`请同时在即梦官网检查视频是否已生成: https://jimeng.jianying.com/ai-tool/video/generate`);
+
+ retryCount++;
+ // 增加重试间隔时间,但设置上限为30秒
+ const waitTime = Math.min(2000 * (retryCount + 1), 30000);
+ logger.info(`等待 ${waitTime}ms 后进行第 ${retryCount + 1} 次重试`);
+ await new Promise((resolve) => setTimeout(resolve, waitTime));
+ continue;
+ }
+
+ // 记录获取到的结果详情
+ logger.info(`获取到历史记录结果: ${JSON.stringify(historyData)}`);
+
+
+ // 从历史数据中提取状态和结果
+ status = historyData.status;
+ failCode = historyData.fail_code;
+ item_list = historyData.item_list || [];
+
+ logger.info(`视频生成状态: ${status}, 失败代码: ${failCode || '无'}, 项目列表长度: ${item_list.length}`);
+
+ // 如果有视频URL,提前记录
+ let tempVideoUrl = item_list?.[0]?.video?.transcoded_video?.origin?.video_url;
+ if (!tempVideoUrl) {
+ // 尝试从其他可能的路径获取
+ tempVideoUrl = item_list?.[0]?.video?.play_url ||
+ item_list?.[0]?.video?.download_url ||
+ item_list?.[0]?.video?.url;
+ }
+
+ if (tempVideoUrl) {
+ logger.info(`检测到视频URL: ${tempVideoUrl}`);
+ }
+
+ if (status === 30) {
+ const error = failCode === 2038
+ ? new APIException(EX.API_CONTENT_FILTERED, "内容被过滤")
+ : new APIException(EX.API_IMAGE_GENERATION_FAILED, `生成失败,错误码: ${failCode}`);
+ // 添加历史ID到错误对象,以便在chat.ts中显示
+ error.historyId = historyId;
+ throw error;
+ }
+
+ // 如果状态仍在处理中,等待后继续
+ if (status === 20) {
+ const waitTime = 2000 * (Math.min(retryCount + 1, 5)); // 随着重试次数增加等待时间,但最多10秒
+ logger.info(`视频生成中,状态码: ${status},等待 ${waitTime}ms 后继续查询`);
+ await new Promise((resolve) => setTimeout(resolve, waitTime));
+ }
+ } catch (error) {
+ logger.error(`轮询视频生成结果出错: ${error.message}`);
+ retryCount++;
+ await new Promise((resolve) => setTimeout(resolve, 2000 * (retryCount + 1)));
+ }
+ }
+
+ // 如果达到最大重试次数仍未成功
+ if (retryCount >= maxRetries && status === 20) {
+ logger.error(`视频生成超时,已尝试 ${retryCount} 次,总耗时约 ${Math.floor(retryCount * 2000 / 1000 / 60)} 分钟`);
+ const error = new APIException(EX.API_IMAGE_GENERATION_FAILED, "获取视频生成结果超时,请稍后在即梦官网查看您的视频");
+ // 添加历史ID到错误对象,以便在chat.ts中显示
+ error.historyId = historyId;
+ throw error;
+ }
+
+ // 尝试通过 get_local_item_list 获取高质量视频下载URL
+ const itemId = item_list?.[0]?.item_id
+ || item_list?.[0]?.id
+ || item_list?.[0]?.local_item_id
+ || item_list?.[0]?.common_attr?.id;
+
+ if (itemId) {
+ try {
+ const hqVideoUrl = await fetchHighQualityVideoUrl(String(itemId), refreshToken);
+ if (hqVideoUrl) {
+ logger.info(`视频生成成功(高质量),URL: ${hqVideoUrl}`);
+ return hqVideoUrl;
+ }
+ } catch (error) {
+ logger.warn(`获取高质量视频URL失败,将使用预览URL作为回退: ${error.message}`);
+ }
+ } else {
+ logger.warn(`未能从item_list中提取item_id,将使用预览URL。item_list[0]键: ${item_list?.[0] ? Object.keys(item_list[0]).join(', ') : '无'}`);
+ }
+
+ // 回退:提取预览视频URL
+ let videoUrl = item_list?.[0]?.video?.transcoded_video?.origin?.video_url;
+
+ // 如果通过常规路径无法获取视频URL,尝试其他可能的路径
+ if (!videoUrl) {
+ // 尝试从item_list中的其他可能位置获取
+ if (item_list?.[0]?.video?.play_url) {
+ videoUrl = item_list[0].video.play_url;
+ logger.info(`从play_url获取到视频URL: ${videoUrl}`);
+ } else if (item_list?.[0]?.video?.download_url) {
+ videoUrl = item_list[0].video.download_url;
+ logger.info(`从download_url获取到视频URL: ${videoUrl}`);
+ } else if (item_list?.[0]?.video?.url) {
+ videoUrl = item_list[0].video.url;
+ logger.info(`从url获取到视频URL: ${videoUrl}`);
+ } else {
+ // 如果仍然找不到,记录错误并抛出异常
+ logger.error(`未能获取视频URL,item_list: ${JSON.stringify(item_list)}`);
+ const error = new APIException(EX.API_IMAGE_GENERATION_FAILED, "未能获取视频URL,请稍后在即梦官网查看");
+ // 添加历史ID到错误对象,以便在chat.ts中显示
+ error.historyId = historyId;
+ throw error;
+ }
+ }
+
+ logger.info(`视频生成成功,URL: ${videoUrl}`);
+ return videoUrl;
+}
+
+/**
+ * Seedance 2.0 多图智能视频生成
+ * 支持多张图片与文本混合生成视频
+ *
+ * @param _model 模型名称
+ * @param prompt 提示词(支持 @1 @2 等引用图片占位符)
+ * @param options 选项
+ * @param refreshToken 刷新令牌
+ * @returns 视频URL
+ */
+export async function generateSeedanceVideo(
+ _model: string,
+ prompt: string,
+ {
+ ratio = "4:3",
+ resolution = "720p",
+ duration = 4,
+ filePaths = [],
+ files = [],
+ }: {
+ ratio?: string;
+ resolution?: string;
+ duration?: number;
+ filePaths?: string[];
+ files?: any[];
+ },
+ refreshToken: string
+) {
+ const model = getModel(_model);
+ const benefitType = SEEDANCE_BENEFIT_TYPE_MAP[_model] || "dreamina_video_seedance_20_pro";
+
+ // Seedance 2.0 默认时长为4秒
+ const actualDuration = duration || 4;
+
+ // 解析分辨率参数获取实际的宽高
+ const { width, height } = resolveVideoResolution(resolution, ratio);
+
+ logger.info(`Seedance 2.0 生成: 模型=${_model} 映射=${model} ${width}x${height} (${ratio}@${resolution}) 时长=${actualDuration}秒`);
+
+ // 检查积分
+ const { totalCredit } = await getCredit(refreshToken);
+ if (totalCredit <= 0)
+ await receiveCredit(refreshToken);
+
+ // 上传所有文件(支持图片/视频/音频)
+ let uploadedMaterials: UploadedMaterial[] = [];
+
+ // 处理上传的文件(multipart/form-data)
+ if (files && files.length > 0) {
+ logger.info(`Seedance: 开始处理 ${files.length} 个上传文件`);
+
+ for (let i = 0; i < files.length; i++) {
+ const file = files[i];
+ if (!file || !file.filepath) {
+ logger.warn(`Seedance: 第 ${i + 1} 个文件无效,跳过`);
+ continue;
+ }
+
+ const materialType = detectMaterialType(file);
+ try {
+ logger.info(`Seedance: 开始上传第 ${i + 1} 个文件 (${materialType}): ${file.originalFilename || file.filepath}`);
+ const buffer = fs.readFileSync(file.filepath);
+
+ if (materialType === "image") {
+ const imageUri = await uploadImageBufferForVideo(buffer, refreshToken);
+ if (imageUri) {
+ uploadedMaterials.push({ type: "image", uri: imageUri, width, height });
+ logger.info(`Seedance: 第 ${i + 1} 个图片上传成功: ${imageUri}`);
+ }
+ } else {
+ // 视频或音频 → VOD 上传
+ const vodResult = await uploadMediaForVideo(buffer, materialType, refreshToken, file.originalFilename);
+ uploadedMaterials.push({
+ type: materialType,
+ vid: vodResult.vid,
+ width: vodResult.width,
+ height: vodResult.height,
+ duration: vodResult.duration,
+ fps: vodResult.fps,
+ name: file.originalFilename || "",
+ });
+ logger.info(`Seedance: 第 ${i + 1} 个${materialType === "video" ? "视频" : "音频"}上传成功: ${vodResult.vid}`);
+ }
+ } catch (error) {
+ logger.error(`Seedance: 第 ${i + 1} 个文件上传失败: ${error.message}`);
+ if (i === 0) {
+ throw new APIException(EX.API_REQUEST_FAILED, `首个文件上传失败: ${error.message}`);
+ }
+ }
+ }
+ } else if (filePaths && filePaths.length > 0) {
+ logger.info(`Seedance: 开始上传 ${filePaths.length} 个文件`);
+
+ for (let i = 0; i < filePaths.length; i++) {
+ const filePath = filePaths[i];
+ if (!filePath) continue;
+
+ const materialType = detectMaterialTypeFromUrl(filePath);
+ try {
+ logger.info(`Seedance: 开始上传第 ${i + 1} 个文件 (${materialType}): ${filePath}`);
+
+ if (materialType === "image") {
+ const imageUri = await uploadImageForVideo(filePath, refreshToken);
+ if (imageUri) {
+ uploadedMaterials.push({ type: "image", uri: imageUri, width, height });
+ logger.info(`Seedance: 第 ${i + 1} 个图片上传成功: ${imageUri}`);
+ }
+ } else {
+ // 视频或音频 URL → 下载后 VOD 上传
+ const response = await fetch(filePath);
+ if (!response.ok) throw new Error(`下载文件失败: ${response.status}`);
+ const arrayBuffer = await response.arrayBuffer();
+ const buffer = Buffer.from(arrayBuffer);
+ const vodResult = await uploadMediaForVideo(buffer, materialType, refreshToken);
+ uploadedMaterials.push({
+ type: materialType,
+ vid: vodResult.vid,
+ width: vodResult.width,
+ height: vodResult.height,
+ duration: vodResult.duration,
+ fps: vodResult.fps,
+ });
+ logger.info(`Seedance: 第 ${i + 1} 个${materialType === "video" ? "视频" : "音频"}上传成功: ${vodResult.vid}`);
+ }
+ } catch (error) {
+ logger.error(`Seedance: 第 ${i + 1} 个文件上传失败: ${error.message}`);
+ if (i === 0) {
+ throw new APIException(EX.API_REQUEST_FAILED, `首个文件上传失败: ${error.message}`);
+ }
+ }
+ }
+ }
+
+ if (uploadedMaterials.length === 0) {
+ throw new APIException(EX.API_REQUEST_FAILED, 'Seedance 2.0 需要至少一个文件(图片/视频/音频)');
+ }
+
+ logger.info(`Seedance: 成功上传 ${uploadedMaterials.length} 个文件`);
+
+ // 动态 benefit_type:包含视频素材时追加 _with_video 后缀
+ const hasVideoMaterial = uploadedMaterials.some(m => m.type === "video");
+ const finalBenefitType = hasVideoMaterial ? `${benefitType}_with_video` : benefitType;
+
+ // 构建 material_list(支持图片/视频/音频)
+ const materialList = uploadedMaterials.map((mat) => {
+ const base = { type: "", id: util.uuid() };
+ if (mat.type === "image") {
+ return {
+ ...base,
+ material_type: "image",
+ image_info: {
+ type: "image",
+ id: util.uuid(),
+ source_from: "upload",
+ platform_type: 1,
+ name: "",
+ image_uri: mat.uri,
+ aigc_image: { type: "", id: util.uuid() },
+ width: mat.width,
+ height: mat.height,
+ format: "",
+ uri: mat.uri,
+ }
+ };
+ } else if (mat.type === "video") {
+ return {
+ ...base,
+ material_type: "video",
+ video_info: {
+ type: "video",
+ id: util.uuid(),
+ source_from: "upload",
+ name: mat.name || "",
+ vid: mat.vid,
+ fps: mat.fps || 0,
+ width: mat.width || 0,
+ height: mat.height || 0,
+ duration: mat.duration || 0,
+ }
+ };
+ } else {
+ // audio
+ return {
+ ...base,
+ material_type: "audio",
+ audio_info: {
+ type: "audio",
+ id: util.uuid(),
+ source_from: "upload",
+ vid: mat.vid,
+ duration: mat.duration || 0,
+ name: mat.name || "",
+ }
+ };
+ }
+ });
+
+ // 解析 prompt 中的素材占位符(@1, @2 等)并构建 meta_list
+ const metaList = buildMetaListFromPrompt(prompt, uploadedMaterials);
+
+ const componentId = util.uuid();
+ const submitId = util.uuid();
+ const draftVersion = MODEL_DRAFT_VERSIONS[_model] || "3.3.9";
+
+ // 计算视频宽高比
+ const gcd = (a: number, b: number): number => b === 0 ? a : gcd(b, a % b);
+ const divisor = gcd(width, height);
+ const aspectRatio = `${width / divisor}:${height / divisor}`;
+
+ const metricsExtra = JSON.stringify({
+ isDefaultSeed: 1,
+ originSubmitId: submitId,
+ isRegenerate: false,
+ enterFrom: "click",
+ position: "page_bottom_box",
+ functionMode: "omni_reference",
+ sceneOptions: JSON.stringify([{
+ type: "video",
+ scene: "BasicVideoGenerateButton",
+ modelReqKey: model,
+ videoDuration: actualDuration,
+ reportParams: {
+ enterSource: "generate",
+ vipSource: "generate",
+ extraVipFunctionKey: model,
+ useVipFunctionDetailsReporterHoc: true
+ },
+ materialTypes: [...new Set(uploadedMaterials.map(m => MATERIAL_TYPE_CODE[m.type]))]
+ }])
+ });
+
+ // 构建 Seedance 2.0 专用请求(通过浏览器代理,绕过 shark a_bogus 检测)
+ const token = await acquireToken(refreshToken);
+ const generateQueryParams = new URLSearchParams({
+ aid: String(CORE_ASSISTANT_ID),
+ device_platform: "web",
+ region: "cn",
+ webId: String(WEB_ID),
+ da_version: draftVersion,
+ web_component_open_flag: "1",
+ web_version: "7.5.0",
+ aigc_features: "app_lip_sync",
+ });
+ const generateUrl = `https://jimeng.jianying.com/mweb/v1/aigc_draft/generate?${generateQueryParams.toString()}`;
+ const generateBody = {
+ extend: {
+ root_model: model,
+ m_video_commerce_info: {
+ benefit_type: finalBenefitType,
+ resource_id: "generate_video",
+ resource_id_type: "str",
+ resource_sub_type: "aigc"
+ },
+ m_video_commerce_info_list: [{
+ benefit_type: finalBenefitType,
+ resource_id: "generate_video",
+ resource_id_type: "str",
+ resource_sub_type: "aigc"
+ }]
+ },
+ submit_id: submitId,
+ metrics_extra: metricsExtra,
+ draft_content: JSON.stringify({
+ type: "draft",
+ id: util.uuid(),
+ min_version: draftVersion,
+ min_features: ["AIGC_Video_UnifiedEdit"],
+ is_from_tsn: true,
+ version: draftVersion,
+ main_component_id: componentId,
+ component_list: [{
+ type: "video_base_component",
+ id: componentId,
+ min_version: "1.0.0",
+ aigc_mode: "workbench",
+ metadata: {
+ type: "",
+ id: util.uuid(),
+ created_platform: 3,
+ created_platform_version: "",
+ created_time_in_ms: String(Date.now()),
+ created_did: ""
+ },
+ generate_type: "gen_video",
+ abilities: {
+ type: "",
+ id: util.uuid(),
+ gen_video: {
+ type: "",
+ id: util.uuid(),
+ text_to_video_params: {
+ type: "",
+ id: util.uuid(),
+ video_gen_inputs: [{
+ type: "",
+ id: util.uuid(),
+ min_version: draftVersion,
+ prompt: "", // Seedance 2.0 prompt 在 meta_list 中
+ video_mode: 2,
+ fps: 24,
+ duration_ms: actualDuration * 1000,
+ idip_meta_list: [],
+ unified_edit_input: {
+ type: "",
+ id: util.uuid(),
+ material_list: materialList,
+ meta_list: metaList
+ }
+ }],
+ video_aspect_ratio: aspectRatio,
+ seed: Math.floor(Math.random() * 1000000000),
+ model_req_key: model,
+ priority: 0
+ },
+ video_task_extra: metricsExtra
+ }
+ },
+ process_type: 1
+ }]
+ }),
+ http_common_info: {
+ aid: CORE_ASSISTANT_ID,
+ },
+ };
+
+ logger.info(`Seedance: 通过浏览器代理发送 generate 请求...`);
+ const generateResult = await browserService.fetch(
+ token,
+ generateUrl,
+ {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify(generateBody),
+ }
+ );
+
+ // 检查浏览器代理返回的结果
+ const { ret, errmsg, data: generateData } = generateResult;
+ if (ret !== undefined && Number(ret) !== 0) {
+ if (Number(ret) === 5000) {
+ throw new APIException(EX.API_IMAGE_GENERATION_INSUFFICIENT_POINTS, `[无法生成视频]: 即梦积分可能不足,${errmsg}`);
+ }
+ throw new APIException(EX.API_REQUEST_FAILED, `[请求jimeng失败]: ${errmsg}`);
+ }
+ const aigc_data = generateData?.aigc_data || generateResult.aigc_data;
+
+ const historyId = aigc_data.history_record_id;
+ if (!historyId)
+ throw new APIException(EX.API_IMAGE_GENERATION_FAILED, "记录ID不存在");
+
+ // 轮询获取结果(与普通视频相同的逻辑)
+ let status = 20, failCode, item_list = [];
+ let retryCount = 0;
+ const maxRetries = 60;
+
+ await new Promise((resolve) => setTimeout(resolve, 5000));
+
+ logger.info(`Seedance: 开始轮询视频生成结果,历史ID: ${historyId}`);
+
+ while (status === 20 && retryCount < maxRetries) {
+ try {
+ const result = await request("post", "/mweb/v1/get_history_by_ids", refreshToken, {
+ data: { history_ids: [historyId] },
+ });
+
+ const responseStr = JSON.stringify(result);
+ logger.info(`Seedance: 轮询响应摘要: ${responseStr.substring(0, 300)}...`);
+
+ // get_history_by_ids 返回的数据可能以 historyId 为键(如 result["8918159809292"]),
+ // 也可能在 result.history_list 数组中
+ let historyData = result.history_list?.[0] || result[historyId];
+
+ if (!historyData) {
+ retryCount++;
+ const waitTime = Math.min(2000 * (retryCount + 1), 30000);
+ await new Promise((resolve) => setTimeout(resolve, waitTime));
+ continue;
+ }
+ status = historyData.status;
+ failCode = historyData.fail_code;
+ item_list = historyData.item_list || [];
+
+ logger.info(`Seedance: 状态=${status}, 失败码=${failCode || '无'}`);
+
+ if (status === 30) {
+ const error = failCode === 2038
+ ? new APIException(EX.API_CONTENT_FILTERED, "内容被过滤")
+ : new APIException(EX.API_IMAGE_GENERATION_FAILED, `生成失败,错误码: ${failCode}`);
+ error.historyId = historyId;
+ throw error;
+ }
+
+ if (status === 20) {
+ const waitTime = 2000 * Math.min(retryCount + 1, 5);
+ await new Promise((resolve) => setTimeout(resolve, waitTime));
+ }
+
+ retryCount++;
+ } catch (error) {
+ if (error instanceof APIException) throw error;
+ logger.error(`Seedance: 轮询出错: ${error.message}`);
+ retryCount++;
+ await new Promise((resolve) => setTimeout(resolve, 2000 * (retryCount + 1)));
+ }
+ }
+
+ if (retryCount >= maxRetries && status === 20) {
+ const error = new APIException(EX.API_IMAGE_GENERATION_FAILED, "视频生成超时");
+ error.historyId = historyId;
+ throw error;
+ }
+
+ // 尝试通过 get_local_item_list 获取高质量视频下载URL
+ const seedanceItemId = item_list?.[0]?.item_id
+ || item_list?.[0]?.id
+ || item_list?.[0]?.local_item_id
+ || item_list?.[0]?.common_attr?.id;
+
+ if (seedanceItemId) {
+ try {
+ const hqVideoUrl = await fetchHighQualityVideoUrl(String(seedanceItemId), refreshToken);
+ if (hqVideoUrl) {
+ logger.info(`Seedance: 视频生成成功(高质量),URL: ${hqVideoUrl}`);
+ return hqVideoUrl;
+ }
+ } catch (error) {
+ logger.warn(`Seedance: 获取高质量视频URL失败,将使用预览URL作为回退: ${error.message}`);
+ }
+ } else {
+ logger.warn(`Seedance: 未能从item_list中提取item_id,将使用预览URL。item_list[0]键: ${item_list?.[0] ? Object.keys(item_list[0]).join(', ') : '无'}`);
+ }
+
+ // 回退:提取预览视频URL
+ let videoUrl = item_list?.[0]?.video?.transcoded_video?.origin?.video_url
+ || item_list?.[0]?.video?.play_url
+ || item_list?.[0]?.video?.download_url
+ || item_list?.[0]?.video?.url;
+
+ if (!videoUrl) {
+ const error = new APIException(EX.API_IMAGE_GENERATION_FAILED, "未能获取视频URL");
+ error.historyId = historyId;
+ throw error;
+ }
+
+ logger.info(`Seedance: 视频生成成功,URL: ${videoUrl}`);
+ return videoUrl;
+}
+
+/**
+ * 解析 prompt 中的素材占位符并构建 meta_list
+ * 支持格式: "使用 @1 图片,@2 图片做动画" -> [text, material(0), text, material(1), text]
+ * meta_type 根据素材实际类型动态匹配(image/video/audio)
+ */
+function buildMetaListFromPrompt(prompt: string, materials: Array<{ type: SeedanceMaterialType }>): Array<{meta_type: string, text?: string, material_ref?: {material_idx: number}}> {
+ const metaList: Array<{meta_type: string, text?: string, material_ref?: {material_idx: number}}> = [];
+ const materialCount = materials.length;
+
+ // 匹配 @1, @2, @图1, @图2, @image1 等格式
+ const placeholderRegex = /@(?:图|image)?(\d+)/gi;
+
+ let lastIndex = 0;
+ let match;
+
+ while ((match = placeholderRegex.exec(prompt)) !== null) {
+ // 添加占位符前的文本
+ if (match.index > lastIndex) {
+ const textBefore = prompt.substring(lastIndex, match.index);
+ if (textBefore.trim()) {
+ metaList.push({ meta_type: "text", text: textBefore });
+ }
+ }
+
+ // 添加素材引用(使用对应素材的类型作为 meta_type)
+ const materialIndex = parseInt(match[1]) - 1; // @1 对应 index 0
+ if (materialIndex >= 0 && materialIndex < materialCount) {
+ metaList.push({
+ meta_type: materials[materialIndex].type,
+ text: "",
+ material_ref: { material_idx: materialIndex }
+ });
+ }
+
+ lastIndex = match.index + match[0].length;
+ }
+
+ // 添加剩余的文本
+ if (lastIndex < prompt.length) {
+ const remainingText = prompt.substring(lastIndex);
+ if (remainingText.trim()) {
+ metaList.push({ meta_type: "text", text: remainingText });
+ }
+ }
+
+ // 如果没有找到任何占位符,默认引用所有素材并附加整个prompt作为文本
+ if (metaList.length === 0) {
+ // 先添加所有素材引用
+ for (let i = 0; i < materialCount; i++) {
+ if (i === 0) {
+ metaList.push({ meta_type: "text", text: "使用" });
+ }
+ metaList.push({
+ meta_type: materials[i].type,
+ text: "",
+ material_ref: { material_idx: i }
+ });
+ if (i < materialCount - 1) {
+ metaList.push({ meta_type: "text", text: "和" });
+ }
+ }
+ // 添加描述文本
+ if (prompt && prompt.trim()) {
+ metaList.push({ meta_type: "text", text: `素材,${prompt}` });
+ } else {
+ metaList.push({ meta_type: "text", text: "素材生成视频" });
+ }
+ }
+
+ return metaList;
+}
\ No newline at end of file
diff --git a/src/api/routes/chat.ts b/src/api/routes/chat.ts
new file mode 100644
index 0000000..405f21b
--- /dev/null
+++ b/src/api/routes/chat.ts
@@ -0,0 +1,36 @@
+import _ from 'lodash';
+
+import Request from '@/lib/request/Request.ts';
+import Response from '@/lib/response/Response.ts';
+import { tokenSplit } from '@/api/controllers/core.ts';
+import { createCompletion, createCompletionStream } from '@/api/controllers/chat.ts';
+
+export default {
+
+ prefix: '/v1/chat',
+
+ post: {
+
+ '/completions': async (request: Request) => {
+ request
+ .validate('body.model', v => _.isUndefined(v) || _.isString(v))
+ .validate('body.messages', _.isArray)
+ .validate('headers.authorization', _.isString)
+ // refresh_token切分
+ const tokens = tokenSplit(request.headers.authorization);
+ // 随机挑选一个refresh_token
+ const token = _.sample(tokens);
+ const { model, messages, stream } = request.body;
+ if (stream) {
+ const stream = await createCompletionStream(messages, token, model);
+ return new Response(stream, {
+ type: "text/event-stream"
+ });
+ }
+ else
+ return await createCompletion(messages, token, model);
+ }
+
+ }
+
+}
\ No newline at end of file
diff --git a/src/api/routes/images.ts b/src/api/routes/images.ts
new file mode 100644
index 0000000..af3e691
--- /dev/null
+++ b/src/api/routes/images.ts
@@ -0,0 +1,278 @@
+import fs from "fs";
+import _ from "lodash";
+
+import Request from "@/lib/request/Request.ts";
+import { generateImages, generateImageComposition } from "@/api/controllers/images.ts";
+import { tokenSplit } from "@/api/controllers/core.ts";
+import util from "@/lib/util.ts";
+
+export default {
+ prefix: "/v1/images",
+
+ post: {
+ "/generations": async (request: Request) => {
+ // 检查是否使用了不支持的参数
+ const unsupportedParams = ['size', 'width', 'height'];
+ const bodyKeys = Object.keys(request.body);
+ const foundUnsupported = unsupportedParams.filter(param => bodyKeys.includes(param));
+
+ if (foundUnsupported.length > 0) {
+ throw new Error(`不支持的参数: ${foundUnsupported.join(', ')}。请使用 ratio 和 resolution 参数控制图像尺寸。`);
+ }
+
+ const contentType = request.headers['content-type'] || '';
+ const isMultiPart = contentType.startsWith('multipart/form-data');
+
+ // 根据请求类型进行不同的参数验证
+ if (isMultiPart) {
+ request
+ .validate("body.model", v => _.isUndefined(v) || _.isString(v))
+ .validate("body.prompt", _.isString)
+ .validate("body.negative_prompt", v => _.isUndefined(v) || _.isString(v))
+ .validate("body.ratio", v => _.isUndefined(v) || _.isString(v))
+ .validate("body.resolution", v => _.isUndefined(v) || _.isString(v))
+ .validate("body.intelligent_ratio", v => _.isUndefined(v) || (typeof v === 'string' && (v === 'true' || v === 'false')) || _.isBoolean(v))
+ .validate("body.sample_strength", v => _.isUndefined(v) || (typeof v === 'string' && !isNaN(parseFloat(v))) || _.isFinite(v))
+ .validate("body.response_format", v => _.isUndefined(v) || _.isString(v))
+ .validate("headers.authorization", _.isString);
+ } else {
+ request
+ .validate("body.model", v => _.isUndefined(v) || _.isString(v))
+ .validate("body.prompt", _.isString)
+ .validate("body.images", v => _.isUndefined(v) || _.isArray(v))
+ .validate("body.negative_prompt", v => _.isUndefined(v) || _.isString(v))
+ .validate("body.ratio", v => _.isUndefined(v) || _.isString(v))
+ .validate("body.resolution", v => _.isUndefined(v) || _.isString(v))
+ .validate("body.intelligent_ratio", v => _.isUndefined(v) || _.isBoolean(v))
+ .validate("body.sample_strength", v => _.isUndefined(v) || _.isFinite(v))
+ .validate("body.response_format", v => _.isUndefined(v) || _.isString(v))
+ .validate("headers.authorization", _.isString);
+ }
+
+ // 处理图片数据(如果提供)
+ let images: (string | Buffer)[] | null = null;
+ if (isMultiPart) {
+ const files = (request.files as any)?.images;
+ if (files) {
+ const imageFiles = Array.isArray(files) ? files : [files];
+ if (imageFiles.length > 0) {
+ if (imageFiles.length > 10) {
+ throw new Error("最多支持10张输入图片");
+ }
+ images = imageFiles.map((file: any) => fs.readFileSync(file.filepath));
+ }
+ }
+ } else {
+ const bodyImages = request.body.images;
+ if (bodyImages && Array.isArray(bodyImages) && bodyImages.length > 0) {
+ if (bodyImages.length > 10) {
+ throw new Error("最多支持10张输入图片");
+ }
+ bodyImages.forEach((image: any, index: number) => {
+ if (!_.isString(image) && !_.isObject(image)) {
+ throw new Error(`图片 ${index + 1} 格式不正确:应为URL字符串或包含url字段的对象`);
+ }
+ if (_.isObject(image) && !(image as any).url) {
+ throw new Error(`图片 ${index + 1} 缺少url字段`);
+ }
+ });
+ images = bodyImages.map((image: any) => _.isString(image) ? image : (image as any).url);
+ }
+ }
+
+ // refresh_token切分
+ const tokens = tokenSplit(request.headers.authorization);
+ // 随机挑选一个refresh_token
+ const token = _.sample(tokens);
+
+ const {
+ model,
+ prompt,
+ negative_prompt: negativePrompt,
+ ratio,
+ resolution,
+ intelligent_ratio: intelligentRatio,
+ sample_strength: sampleStrength,
+ response_format,
+ } = request.body;
+
+ // 如果是 multipart/form-data,需要将字符串转换为数字和布尔值
+ const finalSampleStrength = isMultiPart && typeof sampleStrength === 'string'
+ ? parseFloat(sampleStrength)
+ : sampleStrength;
+
+ const finalIntelligentRatio = isMultiPart && typeof intelligentRatio === 'string'
+ ? intelligentRatio === 'true'
+ : intelligentRatio;
+
+ const responseFormat = _.defaultTo(response_format, "url");
+
+ // 根据是否有图片数据决定调用文生图还是图生图
+ let imageUrls: string[];
+ let resultData: any = {
+ created: util.unixTimestamp(),
+ };
+
+ if (images && images.length > 0) {
+ // 图生图模式
+ imageUrls = await generateImageComposition(model, prompt, images, {
+ ratio,
+ resolution,
+ sampleStrength: finalSampleStrength,
+ negativePrompt,
+ intelligentRatio: finalIntelligentRatio,
+ }, token);
+ resultData.input_images = images.length;
+ resultData.composition_type = "multi_image_synthesis";
+ } else {
+ // 文生图模式
+ imageUrls = await generateImages(model, prompt, {
+ ratio,
+ resolution,
+ sampleStrength: finalSampleStrength,
+ negativePrompt,
+ intelligentRatio: finalIntelligentRatio,
+ }, token);
+ }
+
+ let data = [];
+ if (responseFormat == "b64_json") {
+ data = (
+ await Promise.all(imageUrls.map((url) => util.fetchFileBASE64(url)))
+ ).map((b64) => ({ b64_json: b64 }));
+ } else {
+ data = imageUrls.map((url) => ({
+ url,
+ }));
+ }
+
+ resultData.data = data;
+ return resultData;
+ },
+
+ // 图片合成路由(图生图)
+ "/compositions": async (request: Request) => {
+ // 检查是否使用了不支持的参数
+ const unsupportedParams = ['size', 'width', 'height'];
+ const bodyKeys = Object.keys(request.body);
+ const foundUnsupported = unsupportedParams.filter(param => bodyKeys.includes(param));
+
+ if (foundUnsupported.length > 0) {
+ throw new Error(`不支持的参数: ${foundUnsupported.join(', ')}。请使用 ratio 和 resolution 参数控制图像尺寸。`);
+ }
+
+ const contentType = request.headers['content-type'] || '';
+ const isMultiPart = contentType.startsWith('multipart/form-data');
+
+ if (isMultiPart) {
+ request
+ .validate("body.model", v => _.isUndefined(v) || _.isString(v))
+ .validate("body.prompt", _.isString)
+ .validate("body.negative_prompt", v => _.isUndefined(v) || _.isString(v))
+ .validate("body.ratio", v => _.isUndefined(v) || _.isString(v))
+ .validate("body.resolution", v => _.isUndefined(v) || _.isString(v))
+ .validate("body.intelligent_ratio", v => _.isUndefined(v) || (typeof v === 'string' && (v === 'true' || v === 'false')) || _.isBoolean(v))
+ .validate("body.sample_strength", v => _.isUndefined(v) || (typeof v === 'string' && !isNaN(parseFloat(v))) || _.isFinite(v))
+ .validate("body.response_format", v => _.isUndefined(v) || _.isString(v))
+ .validate("headers.authorization", _.isString);
+ } else {
+ request
+ .validate("body.model", v => _.isUndefined(v) || _.isString(v))
+ .validate("body.prompt", _.isString)
+ .validate("body.images", _.isArray)
+ .validate("body.negative_prompt", v => _.isUndefined(v) || _.isString(v))
+ .validate("body.ratio", v => _.isUndefined(v) || _.isString(v))
+ .validate("body.resolution", v => _.isUndefined(v) || _.isString(v))
+ .validate("body.intelligent_ratio", v => _.isUndefined(v) || _.isBoolean(v))
+ .validate("body.sample_strength", v => _.isUndefined(v) || _.isFinite(v))
+ .validate("body.response_format", v => _.isUndefined(v) || _.isString(v))
+ .validate("headers.authorization", _.isString);
+ }
+
+ let images: (string | Buffer)[] = [];
+ if (isMultiPart) {
+ const files = (request.files as any)?.images;
+ if (!files) {
+ throw new Error("在form-data中缺少 'images' 字段");
+ }
+ const imageFiles = Array.isArray(files) ? files : [files];
+ if (imageFiles.length === 0) {
+ throw new Error("至少需要提供1张输入图片");
+ }
+ if (imageFiles.length > 10) {
+ throw new Error("最多支持10张输入图片");
+ }
+ images = imageFiles.map((file: any) => fs.readFileSync(file.filepath));
+ } else {
+ const bodyImages = request.body.images;
+ if (!bodyImages || bodyImages.length === 0) {
+ throw new Error("至少需要提供1张输入图片");
+ }
+ if (bodyImages.length > 10) {
+ throw new Error("最多支持10张输入图片");
+ }
+ bodyImages.forEach((image: any, index: number) => {
+ if (!_.isString(image) && !_.isObject(image)) {
+ throw new Error(`图片 ${index + 1} 格式不正确:应为URL字符串或包含url字段的对象`);
+ }
+ if (_.isObject(image) && !(image as any).url) {
+ throw new Error(`图片 ${index + 1} 缺少url字段`);
+ }
+ });
+ images = bodyImages.map((image: any) => _.isString(image) ? image : (image as any).url);
+ }
+
+ // refresh_token切分
+ const tokens = tokenSplit(request.headers.authorization);
+ // 随机挑选一个refresh_token
+ const token = _.sample(tokens);
+
+ const {
+ model,
+ prompt,
+ negative_prompt: negativePrompt,
+ ratio,
+ resolution,
+ intelligent_ratio: intelligentRatio,
+ sample_strength: sampleStrength,
+ response_format,
+ } = request.body;
+
+ // 如果是 multipart/form-data,需要将字符串转换为数字和布尔值
+ const finalSampleStrength = isMultiPart && typeof sampleStrength === 'string'
+ ? parseFloat(sampleStrength)
+ : sampleStrength;
+
+ const finalIntelligentRatio = isMultiPart && typeof intelligentRatio === 'string'
+ ? intelligentRatio === 'true'
+ : intelligentRatio;
+
+ const responseFormat = _.defaultTo(response_format, "url");
+ const resultUrls = await generateImageComposition(model, prompt, images, {
+ ratio,
+ resolution,
+ sampleStrength: finalSampleStrength,
+ negativePrompt,
+ intelligentRatio: finalIntelligentRatio,
+ }, token);
+
+ let data = [];
+ if (responseFormat == "b64_json") {
+ data = (
+ await Promise.all(resultUrls.map((url) => util.fetchFileBASE64(url)))
+ ).map((b64) => ({ b64_json: b64 }));
+ } else {
+ data = resultUrls.map((url) => ({
+ url,
+ }));
+ }
+
+ return {
+ created: util.unixTimestamp(),
+ data,
+ input_images: images.length,
+ composition_type: "multi_image_synthesis",
+ };
+ },
+ },
+};
diff --git a/src/api/routes/index.ts b/src/api/routes/index.ts
new file mode 100644
index 0000000..7aa2de5
--- /dev/null
+++ b/src/api/routes/index.ts
@@ -0,0 +1,33 @@
+import fs from 'fs-extra';
+
+import Response from '@/lib/response/Response.ts';
+import images from "./images.ts";
+import chat from "./chat.ts";
+import ping from "./ping.ts";
+import token from './token.js';
+import models from './models.ts';
+import videos from './videos.ts';
+import video from './video.ts';
+
+export default [
+ {
+ get: {
+ '/': async () => {
+ const content = await fs.readFile('public/welcome.html');
+ return new Response(content, {
+ type: 'html',
+ headers: {
+ Expires: '-1'
+ }
+ });
+ }
+ }
+ },
+ images,
+ chat,
+ ping,
+ token,
+ models,
+ videos,
+ video
+];
\ No newline at end of file
diff --git a/src/api/routes/models.ts b/src/api/routes/models.ts
new file mode 100644
index 0000000..ded8054
--- /dev/null
+++ b/src/api/routes/models.ts
@@ -0,0 +1,153 @@
+import _ from 'lodash';
+
+export default {
+
+ prefix: '/v1',
+
+ get: {
+ '/models': async () => {
+ return {
+ "data": [
+ {
+ "id": "jimeng",
+ "object": "model",
+ "owned_by": "jimeng-free-api"
+ },
+ {
+ "id": "jimeng-5.0",
+ "object": "model",
+ "owned_by": "jimeng-free-api",
+ "description": "即梦AI图像生成模型 5.0 版本(最新)"
+ },
+ {
+ "id": "jimeng-4.6",
+ "object": "model",
+ "owned_by": "jimeng-free-api",
+ "description": "即梦AI图像生成模型 4.6 版本(最新)"
+ },
+ {
+ "id": "jimeng-4.5",
+ "object": "model",
+ "owned_by": "jimeng-free-api",
+ "description": "即梦AI图像生成模型 4.5 版本"
+ },
+ {
+ "id": "jimeng-4.1",
+ "object": "model",
+ "owned_by": "jimeng-free-api",
+ "description": "即梦AI图像生成模型 4.1 版本"
+ },
+ {
+ "id": "jimeng-4.0",
+ "object": "model",
+ "owned_by": "jimeng-free-api",
+ "description": "即梦AI图像生成模型 4.0 版本"
+ },
+ {
+ "id": "jimeng-3.1",
+ "object": "model",
+ "owned_by": "jimeng-free-api",
+ "description": "即梦AI图像生成模型 3.1 版本"
+ },
+ {
+ "id": "jimeng-3.0",
+ "object": "model",
+ "owned_by": "jimeng-free-api",
+ "description": "即梦AI图像生成模型 3.0 版本"
+ },
+ {
+ "id": "jimeng-2.1",
+ "object": "model",
+ "owned_by": "jimeng-free-api",
+ "description": "即梦AI图像生成模型 2.1 版本"
+ },
+ {
+ "id": "jimeng-2.0-pro",
+ "object": "model",
+ "owned_by": "jimeng-free-api",
+ "description": "即梦AI图像生成模型 2.0 专业版"
+ },
+ {
+ "id": "jimeng-2.0",
+ "object": "model",
+ "owned_by": "jimeng-free-api",
+ "description": "即梦AI图像生成模型 2.0 版本"
+ },
+ {
+ "id": "jimeng-1.4",
+ "object": "model",
+ "owned_by": "jimeng-free-api",
+ "description": "即梦AI图像生成模型 1.4 版本"
+ },
+ {
+ "id": "jimeng-xl-pro",
+ "object": "model",
+ "owned_by": "jimeng-free-api",
+ "description": "即梦AI图像生成模型 XL Pro 版本"
+ },
+ {
+ "id": "jimeng-video-3.5-pro",
+ "object": "model",
+ "owned_by": "jimeng-free-api",
+ "description": "即梦AI视频生成模型 3.5 专业版"
+ },
+ {
+ "id": "jimeng-video-3.0",
+ "object": "model",
+ "owned_by": "jimeng-free-api",
+ "description": "即梦AI视频生成模型 3.0 版本"
+ },
+ {
+ "id": "jimeng-video-3.0-pro",
+ "object": "model",
+ "owned_by": "jimeng-free-api",
+ "description": "即梦AI视频生成模型 3.0 专业版"
+ },
+ {
+ "id": "jimeng-video-2.0",
+ "object": "model",
+ "owned_by": "jimeng-free-api",
+ "description": "即梦AI视频生成模型 2.0 版本"
+ },
+ {
+ "id": "jimeng-video-2.0-pro",
+ "object": "model",
+ "owned_by": "jimeng-free-api",
+ "description": "即梦AI视频生成模型 2.0 专业版"
+ },
+ {
+ "id": "jimeng-video-seedance-2.0",
+ "object": "model",
+ "owned_by": "jimeng-free-api",
+ "description": "Seedance 2.0 多图智能视频生成模型(上游标准名称,支持4-15秒,多张图片混合生成视频)"
+ },
+ {
+ "id": "seedance-2.0",
+ "object": "model",
+ "owned_by": "jimeng-free-api",
+ "description": "Seedance 2.0 多图智能视频生成模型(jimeng-video-seedance-2.0 的别名,向后兼容)"
+ },
+ {
+ "id": "seedance-2.0-pro",
+ "object": "model",
+ "owned_by": "jimeng-free-api",
+ "description": "Seedance 2.0 Pro 多图智能视频生成模型(jimeng-video-seedance-2.0 的别名,向后兼容)"
+ },
+ {
+ "id": "jimeng-video-seedance-2.0-fast",
+ "object": "model",
+ "owned_by": "jimeng-free-api",
+ "description": "Seedance 2.0-fast 快速多图智能视频生成模型(上游标准名称,支持4-15秒)"
+ },
+ {
+ "id": "seedance-2.0-fast",
+ "object": "model",
+ "owned_by": "jimeng-free-api",
+ "description": "Seedance 2.0-fast 快速多图智能视频生成模型(jimeng-video-seedance-2.0-fast 的别名,向后兼容)"
+ }
+ ]
+ };
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/src/api/routes/ping.ts b/src/api/routes/ping.ts
new file mode 100644
index 0000000..dc9af72
--- /dev/null
+++ b/src/api/routes/ping.ts
@@ -0,0 +1,6 @@
+export default {
+ prefix: '/ping',
+ get: {
+ '': async () => "pong"
+ }
+}
\ No newline at end of file
diff --git a/src/api/routes/token.ts b/src/api/routes/token.ts
new file mode 100644
index 0000000..9cc0b3f
--- /dev/null
+++ b/src/api/routes/token.ts
@@ -0,0 +1,39 @@
+import _ from 'lodash';
+
+import Request from '@/lib/request/Request.ts';
+import Response from '@/lib/response/Response.ts';
+import { getTokenLiveStatus, getCredit, tokenSplit } from '@/api/controllers/core.ts';
+import logger from '@/lib/logger.ts';
+
+export default {
+
+ prefix: '/token',
+
+ post: {
+
+ '/check': async (request: Request) => {
+ request
+ .validate('body.token', _.isString)
+ const live = await getTokenLiveStatus(request.body.token);
+ return {
+ live
+ }
+ },
+
+ '/points': async (request: Request) => {
+ request
+ .validate('headers.authorization', _.isString)
+ // refresh_token切分
+ const tokens = tokenSplit(request.headers.authorization);
+ const points = await Promise.all(tokens.map(async (token) => {
+ return {
+ token,
+ points: await getCredit(token)
+ }
+ }))
+ return points;
+ }
+
+ }
+
+}
\ No newline at end of file
diff --git a/src/api/routes/video.ts b/src/api/routes/video.ts
new file mode 100644
index 0000000..7c02483
--- /dev/null
+++ b/src/api/routes/video.ts
@@ -0,0 +1,6 @@
+import videos from './videos.ts';
+
+export default {
+ ...videos,
+ prefix: '/v1/video'
+};
diff --git a/src/api/routes/videos.ts b/src/api/routes/videos.ts
new file mode 100644
index 0000000..cf70943
--- /dev/null
+++ b/src/api/routes/videos.ts
@@ -0,0 +1,135 @@
+import _ from 'lodash';
+
+import Request from '@/lib/request/Request.ts';
+import Response from '@/lib/response/Response.ts';
+import { tokenSplit } from '@/api/controllers/core.ts';
+import { generateVideo, generateSeedanceVideo, isSeedanceModel, DEFAULT_MODEL } from '@/api/controllers/videos.ts';
+import util from '@/lib/util.ts';
+
+export default {
+
+ prefix: '/v1/videos',
+
+ post: {
+
+ '/generations': async (request: Request) => {
+ // 检查是否使用了不支持的参数
+ const unsupportedParams = ['size', 'width', 'height'];
+ const bodyKeys = Object.keys(request.body);
+ const foundUnsupported = unsupportedParams.filter(param => bodyKeys.includes(param));
+
+ if (foundUnsupported.length > 0) {
+ throw new Error(`不支持的参数: ${foundUnsupported.join(', ')}。请使用 ratio 和 resolution 参数控制视频尺寸。`);
+ }
+
+ const contentType = request.headers['content-type'] || '';
+ const isMultiPart = contentType.startsWith('multipart/form-data');
+
+ request
+ .validate('body.model', v => _.isUndefined(v) || _.isString(v))
+ .validate('body.prompt', v => _.isUndefined(v) || _.isString(v))
+ .validate('body.ratio', v => _.isUndefined(v) || _.isString(v))
+ .validate('body.resolution', v => _.isUndefined(v) || _.isString(v))
+ .validate('body.duration', v => {
+ if (_.isUndefined(v)) return true;
+ // 对于 multipart/form-data,允许字符串类型的数字
+ if (isMultiPart && typeof v === 'string') {
+ const num = parseInt(v);
+ // Seedance 支持 4-15 秒连续范围,普通视频支持 5 或 10 秒
+ return (num >= 4 && num <= 15) || num === 5 || num === 10;
+ }
+ // 对于 JSON,要求数字类型
+ // Seedance 支持 4-15 秒连续范围,普通视频支持 5 或 10 秒
+ return _.isFinite(v) && ((v >= 4 && v <= 15) || v === 5 || v === 10);
+ })
+ .validate('body.file_paths', v => _.isUndefined(v) || _.isArray(v))
+ .validate('body.filePaths', v => _.isUndefined(v) || _.isArray(v))
+ .validate('body.response_format', v => _.isUndefined(v) || _.isString(v))
+ .validate('headers.authorization', _.isString);
+
+ // refresh_token切分
+ const tokens = tokenSplit(request.headers.authorization);
+ // 随机挑选一个refresh_token
+ const token = _.sample(tokens);
+
+ const {
+ model = DEFAULT_MODEL,
+ prompt,
+ ratio = "1:1",
+ resolution = "720p",
+ duration = 5,
+ file_paths = [],
+ filePaths = [],
+ response_format = "url"
+ } = request.body;
+
+ // 如果是 multipart/form-data,需要将字符串转换为数字
+ const finalDuration = isMultiPart && typeof duration === 'string'
+ ? parseInt(duration)
+ : duration;
+
+ // 兼容两种参数名格式:file_paths 和 filePaths
+ const finalFilePaths = filePaths.length > 0 ? filePaths : file_paths;
+
+ // 根据模型类型选择不同的生成函数
+ let videoUrl: string;
+ if (isSeedanceModel(model)) {
+ // Seedance 2.0 多图智能视频生成
+ // Seedance 默认时长为 4 秒,默认比例为 4:3
+ const seedanceDuration = finalDuration === 5 ? 4 : finalDuration; // 如果是默认的5秒,转为4秒
+ const seedanceRatio = ratio === "1:1" ? "4:3" : ratio; // 如果是默认的1:1,转为4:3
+
+ videoUrl = await generateSeedanceVideo(
+ model,
+ prompt,
+ {
+ ratio: seedanceRatio,
+ resolution,
+ duration: seedanceDuration,
+ filePaths: finalFilePaths,
+ files: request.files,
+ },
+ token
+ );
+ } else {
+ // 普通视频生成
+ videoUrl = await generateVideo(
+ model,
+ prompt,
+ {
+ ratio,
+ resolution,
+ duration: finalDuration,
+ filePaths: finalFilePaths,
+ files: request.files,
+ },
+ token
+ );
+ }
+
+ // 根据response_format返回不同格式的结果
+ if (response_format === "b64_json") {
+ // 获取视频内容并转换为BASE64
+ const videoBase64 = await util.fetchFileBASE64(videoUrl);
+ return {
+ created: util.unixTimestamp(),
+ data: [{
+ b64_json: videoBase64,
+ revised_prompt: prompt
+ }]
+ };
+ } else {
+ // 默认返回URL
+ return {
+ created: util.unixTimestamp(),
+ data: [{
+ url: videoUrl,
+ revised_prompt: prompt
+ }]
+ };
+ }
+ }
+
+ }
+
+}
diff --git a/src/daemon.ts b/src/daemon.ts
new file mode 100644
index 0000000..0c5fe69
--- /dev/null
+++ b/src/daemon.ts
@@ -0,0 +1,82 @@
+/**
+ * 守护进程
+ */
+
+import process from 'process';
+import path from 'path';
+import { spawn } from 'child_process';
+
+import fs from 'fs-extra';
+import { format as dateFormat } from 'date-fns';
+import 'colors';
+
+const CRASH_RESTART_LIMIT = 600; //进程崩溃重启次数限制
+const CRASH_RESTART_DELAY = 5000; //进程崩溃重启延迟
+const LOG_PATH = path.resolve("./logs/daemon.log"); //守护进程日志路径
+let crashCount = 0; //进程崩溃次数
+let currentProcess; //当前运行进程
+
+/**
+ * 写入守护进程日志
+ */
+function daemonLog(value, color?: string) {
+ try {
+ const head = `[daemon][${dateFormat(new Date(), "yyyy-MM-dd HH:mm:ss.SSS")}] `;
+ value = head + value;
+ console.log(color ? value[color] : value);
+ fs.ensureDirSync(path.dirname(LOG_PATH));
+ fs.appendFileSync(LOG_PATH, value + "\n");
+ }
+ catch(err) {
+ console.error("daemon log write error:", err);
+ }
+}
+
+daemonLog(`daemon pid: ${process.pid}`);
+
+function createProcess() {
+ const childProcess = spawn("node", ["index.js", ...process.argv.slice(2)]); //启动子进程
+ childProcess.stdout.pipe(process.stdout, { end: false }); //将子进程输出管道到当前进程输出
+ childProcess.stderr.pipe(process.stderr, { end: false }); //将子进程错误输出管道到当前进程输出
+ currentProcess = childProcess; //更新当前进程
+ daemonLog(`process(${childProcess.pid}) has started`);
+ childProcess.on("error", err => daemonLog(`process(${childProcess.pid}) error: ${err.stack}`, "red"));
+ childProcess.on("close", code => {
+ if(code === 0) //进程正常退出
+ daemonLog(`process(${childProcess.pid}) has exited`);
+ else if(code === 2) //进程已被杀死
+ daemonLog(`process(${childProcess.pid}) has been killed!`, "bgYellow");
+ else if(code === 3) { //进程主动重启
+ daemonLog(`process(${childProcess.pid}) has restart`, "yellow");
+ createProcess(); //重新创建进程
+ }
+ else { //进程发生崩溃
+ if(crashCount++ < CRASH_RESTART_LIMIT) { //进程崩溃次数未达重启次数上限前尝试重启
+ daemonLog(`process(${childProcess.pid}) has crashed! delay ${CRASH_RESTART_DELAY}ms try restarting...(${crashCount})`, "bgRed");
+ setTimeout(() => createProcess(), CRASH_RESTART_DELAY); //延迟指定时长后再重启
+ }
+ else //进程已崩溃,且无法重启
+ daemonLog(`process(${childProcess.pid}) has crashed! unable to restart`, "bgRed");
+ }
+ }); //子进程关闭监听
+}
+
+process.on("exit", code => {
+ if(code === 0)
+ daemonLog("daemon process exited");
+ else if(code === 2)
+ daemonLog("daemon process has been killed!");
+}); //守护进程退出事件
+
+process.on("SIGTERM", () => {
+ daemonLog("received kill signal", "yellow");
+ currentProcess && currentProcess.kill("SIGINT");
+ process.exit(2);
+}); //kill退出守护进程
+
+process.on("SIGINT", () => {
+ currentProcess && currentProcess.kill("SIGINT");
+ process.exit(0);
+}); //主动退出守护进程
+
+createProcess(); //创建进程
diff --git a/src/index.ts b/src/index.ts
new file mode 100644
index 0000000..67618d2
--- /dev/null
+++ b/src/index.ts
@@ -0,0 +1,32 @@
+"use strict";
+
+import environment from "@/lib/environment.ts";
+import config from "@/lib/config.ts";
+import "@/lib/initialize.ts";
+import server from "@/lib/server.ts";
+import routes from "@/api/routes/index.ts";
+import logger from "@/lib/logger.ts";
+
+const startupTime = performance.now();
+
+(async () => {
+ logger.header();
+
+ logger.info("<<<< jimeng free server >>>>");
+ logger.info("Version:", environment.package.version);
+ logger.info("Process id:", process.pid);
+ logger.info("Environment:", environment.env);
+ logger.info("Service name:", config.service.name);
+
+ server.attachRoutes(routes);
+ await server.listen();
+
+ config.service.bindAddress &&
+ logger.success("Service bind address:", config.service.bindAddress);
+})()
+ .then(() =>
+ logger.success(
+ `Service startup completed (${Math.floor(performance.now() - startupTime)}ms)`
+ )
+ )
+ .catch((err) => console.error(err));
diff --git a/src/lib/browser-service.ts b/src/lib/browser-service.ts
new file mode 100644
index 0000000..6b739d7
--- /dev/null
+++ b/src/lib/browser-service.ts
@@ -0,0 +1,289 @@
+import { chromium, Browser, BrowserContext, Page } from "playwright-core";
+import logger from "@/lib/logger.ts";
+import { getCookiesForBrowser } from "@/api/controllers/core.ts";
+
+// bdms SDK 相关脚本的白名单域名
+const SCRIPT_WHITELIST_DOMAINS = [
+ "vlabstatic.com",
+ "bytescm.com",
+ "jianying.com",
+ "byteimg.com",
+];
+
+// 需要屏蔽的资源类型(加速加载、减少内存)
+const BLOCKED_RESOURCE_TYPES = ["image", "font", "stylesheet", "media"];
+
+// 会话空闲超时时间(毫秒)
+const SESSION_IDLE_TIMEOUT = 10 * 60 * 1000;
+
+// bdms SDK 就绪等待超时(毫秒)
+const BDMS_READY_TIMEOUT = 30000;
+
+interface BrowserSession {
+ context: BrowserContext;
+ page: Page;
+ lastUsed: number;
+ idleTimer: NodeJS.Timeout | null;
+}
+
+class BrowserService {
+ private browser: Browser | null = null;
+ private sessions: Map = new Map();
+ private launching: Promise | null = null;
+
+ /**
+ * 懒启动浏览器实例
+ */
+ private async ensureBrowser(): Promise {
+ if (this.browser?.isConnected()) {
+ return this.browser;
+ }
+
+ // 防止并发启动
+ if (this.launching) {
+ return this.launching;
+ }
+
+ this.launching = (async () => {
+ logger.info("BrowserService: 正在启动 Chromium 浏览器...");
+ try {
+ this.browser = await chromium.launch({
+ headless: true,
+ args: [
+ "--no-sandbox",
+ "--disable-setuid-sandbox",
+ "--disable-dev-shm-usage",
+ "--disable-gpu",
+ "--no-first-run",
+ "--no-zygote",
+ "--single-process",
+ ],
+ });
+
+ this.browser.on("disconnected", () => {
+ logger.warn("BrowserService: 浏览器已断开连接");
+ this.browser = null;
+ this.sessions.clear();
+ });
+
+ logger.info("BrowserService: Chromium 浏览器启动成功");
+ return this.browser;
+ } finally {
+ this.launching = null;
+ }
+ })();
+
+ return this.launching;
+ }
+
+ /**
+ * 获取或创建指定 token 的浏览器会话
+ */
+ private async getSession(token: string): Promise {
+ const existing = this.sessions.get(token);
+ if (existing) {
+ existing.lastUsed = Date.now();
+ // 重置空闲计时器
+ if (existing.idleTimer) {
+ clearTimeout(existing.idleTimer);
+ }
+ existing.idleTimer = setTimeout(() => this.closeSession(token), SESSION_IDLE_TIMEOUT);
+ return existing;
+ }
+
+ return this.createSession(token);
+ }
+
+ /**
+ * 创建新的浏览器会话
+ */
+ private async createSession(token: string): Promise {
+ const browser = await this.ensureBrowser();
+
+ logger.info(`BrowserService: 为 token ${token.substring(0, 8)}... 创建新会话`);
+
+ const context = await browser.newContext({
+ userAgent:
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36",
+ viewport: { width: 1920, height: 1080 },
+ locale: "zh-CN",
+ });
+
+ // 注入 cookies
+ const cookies = getCookiesForBrowser(token);
+ await context.addCookies(cookies);
+
+ // 配置资源拦截
+ await context.route("**/*", (route) => {
+ const request = route.request();
+ const resourceType = request.resourceType();
+ const url = request.url();
+
+ // 屏蔽不需要的资源类型
+ if (BLOCKED_RESOURCE_TYPES.includes(resourceType)) {
+ return route.abort();
+ }
+
+ // 对于脚本资源,只允许白名单域名
+ if (resourceType === "script") {
+ const isWhitelisted = SCRIPT_WHITELIST_DOMAINS.some((domain) =>
+ url.includes(domain)
+ );
+ if (!isWhitelisted) {
+ return route.abort();
+ }
+ }
+
+ return route.continue();
+ });
+
+ const page = await context.newPage();
+
+ // 导航到即梦页面,让 bdms SDK 加载
+ logger.info("BrowserService: 正在导航到 jimeng.jianying.com ...");
+ await page.goto("https://jimeng.jianying.com", {
+ waitUntil: "domcontentloaded",
+ timeout: 30000,
+ });
+
+ // 等待 bdms SDK 就绪
+ logger.info("BrowserService: 等待 bdms SDK 就绪...");
+ try {
+ await page.waitForFunction(
+ () => {
+ // bdms SDK 会替换 window.fetch,检测其是否被替换
+ // 也可以检测 window.bdms 或 window.byted_acrawler
+ return (
+ (window as any).bdms?.init ||
+ (window as any).byted_acrawler ||
+ // 检测 fetch 是否被替换(bdms 会替换原生 fetch)
+ window.fetch.toString().indexOf("native code") === -1
+ );
+ },
+ { timeout: BDMS_READY_TIMEOUT }
+ );
+ logger.info("BrowserService: bdms SDK 已就绪");
+ } catch (err) {
+ logger.warn(
+ "BrowserService: bdms SDK 等待超时,可能未完全加载,继续尝试..."
+ );
+ }
+
+ const session: BrowserSession = {
+ context,
+ page,
+ lastUsed: Date.now(),
+ idleTimer: setTimeout(() => this.closeSession(token), SESSION_IDLE_TIMEOUT),
+ };
+
+ this.sessions.set(token, session);
+ return session;
+ }
+
+ /**
+ * 关闭指定 token 的会话
+ */
+ private async closeSession(token: string) {
+ const session = this.sessions.get(token);
+ if (!session) return;
+
+ logger.info(`BrowserService: 关闭空闲会话 ${token.substring(0, 8)}...`);
+ if (session.idleTimer) {
+ clearTimeout(session.idleTimer);
+ }
+
+ try {
+ await session.context.close();
+ } catch (err) {
+ // 忽略关闭错误
+ }
+
+ this.sessions.delete(token);
+ }
+
+ /**
+ * 通过浏览器代理发送 fetch 请求
+ * bdms SDK 会自动拦截 fetch 并注入 a_bogus 签名
+ *
+ * @param token sessionid
+ * @param url 完整的请求 URL
+ * @param options fetch 选项 (method, headers, body)
+ * @returns 解析后的 JSON 响应
+ */
+ async fetch(
+ token: string,
+ url: string,
+ options: { method?: string; headers?: Record; body?: string }
+ ): Promise {
+ const session = await this.getSession(token);
+
+ logger.info(`BrowserService: 代理请求 ${options.method || "GET"} ${url.substring(0, 100)}...`);
+
+ try {
+ const result = await session.page.evaluate(
+ async ({ url, options }) => {
+ try {
+ const res = await fetch(url, {
+ method: options.method || "GET",
+ headers: {
+ "Content-Type": "application/json",
+ ...(options.headers || {}),
+ },
+ body: options.body,
+ credentials: "include",
+ });
+ const text = await res.text();
+ return { ok: res.ok, status: res.status, text };
+ } catch (err: any) {
+ return { ok: false, status: 0, text: "", error: err.message };
+ }
+ },
+ { url, options }
+ );
+
+ if (result.error) {
+ throw new Error(`浏览器 fetch 失败: ${result.error}`);
+ }
+
+ logger.info(`BrowserService: 响应状态 ${result.status}`);
+
+ try {
+ return JSON.parse(result.text);
+ } catch {
+ logger.warn(`BrowserService: 响应不是有效 JSON: ${result.text.substring(0, 200)}`);
+ return result.text;
+ }
+ } catch (err) {
+ // 如果执行失败(页面崩溃等),清理会话以便下次重建
+ logger.error(`BrowserService: 请求执行失败: ${(err as Error).message}`);
+ await this.closeSession(token);
+ throw err;
+ }
+ }
+
+ /**
+ * 关闭所有会话和浏览器实例
+ */
+ async close() {
+ logger.info("BrowserService: 正在关闭所有会话和浏览器...");
+
+ for (const [token] of this.sessions) {
+ await this.closeSession(token);
+ }
+
+ if (this.browser) {
+ try {
+ await this.browser.close();
+ } catch (err) {
+ // 忽略关闭错误
+ }
+ this.browser = null;
+ }
+
+ logger.info("BrowserService: 已关闭");
+ }
+}
+
+// 单例导出
+const browserService = new BrowserService();
+export default browserService;
diff --git a/src/lib/config.ts b/src/lib/config.ts
new file mode 100644
index 0000000..b6072d2
--- /dev/null
+++ b/src/lib/config.ts
@@ -0,0 +1,14 @@
+import serviceConfig from "./configs/service-config.ts";
+import systemConfig from "./configs/system-config.ts";
+
+class Config {
+
+ /** 服务配置 */
+ service = serviceConfig;
+
+ /** 系统配置 */
+ system = systemConfig;
+
+}
+
+export default new Config();
\ No newline at end of file
diff --git a/src/lib/configs/model-config.ts b/src/lib/configs/model-config.ts
new file mode 100644
index 0000000..3c1eeed
--- /dev/null
+++ b/src/lib/configs/model-config.ts
@@ -0,0 +1,407 @@
+/**
+ * 模型配置文件
+ * 定义不同模型的特定参数和配置
+ */
+
+export interface ModelConfig {
+ // 模型内部名称
+ internalModel: string;
+ // draft版本
+ draftVersion: string;
+ // 支持的功能
+ features: {
+ // 是否支持多图生成
+ multiImage: boolean;
+ // 是否支持图生图
+ imageToImage: boolean;
+ // 是否支持视频生成
+ videoGeneration: boolean;
+ };
+ // 默认参数
+ defaultParams: {
+ // 默认宽度
+ width: number;
+ // 默认高度
+ height: number;
+ // 支持的分辨率列表
+ resolutions: Array<{ width: number; height: number }>;
+ // 采样强度范围
+ sampleStrengthRange: [number, number];
+ };
+ // 特殊配置
+ specialConfig?: {
+ // 是否需要特定的头部信息
+ specialHeaders?: Record;
+ // 是否有特殊的参数要求
+ extraParams?: Record;
+ };
+}
+
+// 模型配置映射
+export const MODEL_CONFIGS: Record = {
+ "jimeng-5.0": {
+ internalModel: "high_aes_general_v50",
+ draftVersion: "3.3.9",
+ features: {
+ multiImage: true,
+ imageToImage: true,
+ videoGeneration: false,
+ },
+ defaultParams: {
+ width: 2048,
+ height: 2048,
+ resolutions: [
+ { width: 1024, height: 1024 },
+ { width: 768, height: 1024 },
+ { width: 1024, height: 768 },
+ { width: 1024, height: 576 },
+ { width: 576, height: 1024 },
+ { width: 1024, height: 682 },
+ { width: 682, height: 1024 },
+ { width: 1195, height: 512 },
+ { width: 2048, height: 2048 },
+ { width: 2304, height: 1728 },
+ { width: 1728, height: 2304 },
+ { width: 2560, height: 1440 },
+ { width: 1440, height: 2560 },
+ { width: 2496, height: 1664 },
+ { width: 1664, height: 2496 },
+ { width: 3024, height: 1296 },
+ ],
+ sampleStrengthRange: [0.1, 1.0],
+ },
+ },
+ "jimeng-4.6": {
+ internalModel: "high_aes_general_v42",
+ draftVersion: "3.3.9",
+ features: {
+ multiImage: true,
+ imageToImage: true,
+ videoGeneration: false,
+ },
+ defaultParams: {
+ width: 2048,
+ height: 2048,
+ resolutions: [
+ { width: 1024, height: 1024 },
+ { width: 768, height: 1024 },
+ { width: 1024, height: 768 },
+ { width: 1024, height: 576 },
+ { width: 576, height: 1024 },
+ { width: 1024, height: 682 },
+ { width: 682, height: 1024 },
+ { width: 1195, height: 512 },
+ { width: 2048, height: 2048 },
+ { width: 2304, height: 1728 },
+ { width: 1728, height: 2304 },
+ { width: 2560, height: 1440 },
+ { width: 1440, height: 2560 },
+ { width: 2496, height: 1664 },
+ { width: 1664, height: 2496 },
+ { width: 3024, height: 1296 },
+ ],
+ sampleStrengthRange: [0.1, 1.0],
+ },
+ },
+ "jimeng-video-3.5-pro": {
+ internalModel: "dreamina_ic_generate_video_model_vgfm_3.5_pro",
+ draftVersion: "3.3.4",
+ features: {
+ multiImage: false,
+ imageToImage: true,
+ videoGeneration: true,
+ },
+ defaultParams: {
+ width: 1280,
+ height: 720,
+ resolutions: [
+ { width: 1280, height: 720 },
+ { width: 720, height: 1280 },
+ { width: 1080, height: 1080 },
+ { width: 1920, height: 1080 },
+ { width: 1080, height: 1920 },
+ ],
+ sampleStrengthRange: [0.1, 1.0],
+ },
+ },
+ "jimeng-4.5": {
+ internalModel: "high_aes_general_v40l",
+ draftVersion: "3.3.4",
+ features: {
+ multiImage: true,
+ imageToImage: true,
+ videoGeneration: false,
+ },
+ defaultParams: {
+ width: 2048,
+ height: 2048,
+ resolutions: [
+ { width: 1024, height: 1024 },
+ { width: 768, height: 1024 },
+ { width: 1024, height: 768 },
+ { width: 1024, height: 576 },
+ { width: 576, height: 1024 },
+ { width: 1024, height: 682 },
+ { width: 682, height: 1024 },
+ { width: 1195, height: 512 },
+ { width: 2048, height: 2048 },
+ { width: 2304, height: 1728 },
+ { width: 1728, height: 2304 },
+ { width: 2560, height: 1440 },
+ { width: 1440, height: 2560 },
+ { width: 2496, height: 1664 },
+ { width: 1664, height: 2496 },
+ { width: 3024, height: 1296 },
+ ],
+ sampleStrengthRange: [0.1, 1.0],
+ },
+ },
+ "jimeng-4.1": {
+ internalModel: "high_aes_general_v41",
+ draftVersion: "3.3.4",
+ features: {
+ multiImage: true,
+ imageToImage: true,
+ videoGeneration: false,
+ },
+ defaultParams: {
+ width: 2048,
+ height: 2048,
+ resolutions: [
+ { width: 1024, height: 1024 },
+ { width: 768, height: 1024 },
+ { width: 1024, height: 768 },
+ { width: 1024, height: 576 },
+ { width: 576, height: 1024 },
+ { width: 1024, height: 682 },
+ { width: 682, height: 1024 },
+ { width: 1195, height: 512 },
+ { width: 2048, height: 2048 },
+ { width: 2304, height: 1728 },
+ { width: 1728, height: 2304 },
+ { width: 2560, height: 1440 },
+ { width: 1440, height: 2560 },
+ { width: 2496, height: 1664 },
+ { width: 1664, height: 2496 },
+ { width: 3024, height: 1296 },
+ ],
+ sampleStrengthRange: [0.1, 1.0],
+ },
+ },
+ "jimeng-4.0": {
+ internalModel: "high_aes_general_v40",
+ draftVersion: "3.3.4",
+ features: {
+ multiImage: true,
+ imageToImage: true,
+ videoGeneration: false,
+ },
+ defaultParams: {
+ width: 2048,
+ height: 2048,
+ resolutions: [
+ { width: 1024, height: 1024 },
+ { width: 768, height: 1024 },
+ { width: 1024, height: 768 },
+ { width: 1024, height: 576 },
+ { width: 576, height: 1024 },
+ { width: 1024, height: 682 },
+ { width: 682, height: 1024 },
+ { width: 1195, height: 512 },
+ { width: 2048, height: 2048 },
+ { width: 2304, height: 1728 },
+ { width: 1728, height: 2304 },
+ { width: 2560, height: 1440 },
+ { width: 1440, height: 2560 },
+ { width: 2496, height: 1664 },
+ { width: 1664, height: 2496 },
+ { width: 3024, height: 1296 },
+ ],
+ sampleStrengthRange: [0.1, 1.0],
+ },
+ },
+ "jimeng-3.1": {
+ internalModel: "high_aes_general_v30l_art_fangzhou:general_v3.0_18b",
+ draftVersion: "3.0.2",
+ features: {
+ multiImage: false,
+ imageToImage: true,
+ videoGeneration: false,
+ },
+ defaultParams: {
+ width: 1024,
+ height: 1024,
+ resolutions: [
+ { width: 512, height: 512 },
+ { width: 768, height: 768 },
+ { width: 1024, height: 1024 },
+ ],
+ sampleStrengthRange: [0.1, 0.8],
+ },
+ },
+ "jimeng-3.0": {
+ internalModel: "high_aes_general_v30l:general_v3.0_18b",
+ draftVersion: "3.0.2",
+ features: {
+ multiImage: false,
+ imageToImage: true,
+ videoGeneration: false,
+ },
+ defaultParams: {
+ width: 1024,
+ height: 1024,
+ resolutions: [
+ { width: 512, height: 512 },
+ { width: 768, height: 768 },
+ { width: 1024, height: 1024 },
+ ],
+ sampleStrengthRange: [0.1, 0.8],
+ },
+ },
+ "jimeng-2.1": {
+ internalModel: "high_aes_general_v21_L:general_v2.1_L",
+ draftVersion: "3.0.2",
+ features: {
+ multiImage: false,
+ imageToImage: true,
+ videoGeneration: false,
+ },
+ defaultParams: {
+ width: 512,
+ height: 512,
+ resolutions: [
+ { width: 512, height: 512 },
+ { width: 768, height: 768 },
+ ],
+ sampleStrengthRange: [0.1, 0.7],
+ },
+ },
+ "jimeng-2.0-pro": {
+ internalModel: "high_aes_general_v20_L:general_v2.0_L",
+ draftVersion: "3.0.2",
+ features: {
+ multiImage: false,
+ imageToImage: true,
+ videoGeneration: false,
+ },
+ defaultParams: {
+ width: 512,
+ height: 512,
+ resolutions: [
+ { width: 512, height: 512 },
+ { width: 768, height: 768 },
+ ],
+ sampleStrengthRange: [0.1, 0.7],
+ },
+ },
+ "jimeng-2.0": {
+ internalModel: "high_aes_general_v20",
+ draftVersion: "3.0.2",
+ features: {
+ multiImage: false,
+ imageToImage: true,
+ videoGeneration: false,
+ },
+ defaultParams: {
+ width: 512,
+ height: 512,
+ resolutions: [
+ { width: 512, height: 512 },
+ { width: 768, height: 768 },
+ ],
+ sampleStrengthRange: [0.1, 0.7],
+ },
+ },
+ "jimeng-1.4": {
+ internalModel: "high_aes_general_v14:general_v1.4",
+ draftVersion: "3.0.2",
+ features: {
+ multiImage: false,
+ imageToImage: true,
+ videoGeneration: false,
+ },
+ defaultParams: {
+ width: 512,
+ height: 512,
+ resolutions: [
+ { width: 512, height: 512 },
+ { width: 768, height: 768 },
+ ],
+ sampleStrengthRange: [0.1, 0.6],
+ },
+ },
+ "jimeng-xl-pro": {
+ internalModel: "text2img_xl_sft",
+ draftVersion: "3.0.2",
+ features: {
+ multiImage: false,
+ imageToImage: true,
+ videoGeneration: false,
+ },
+ defaultParams: {
+ width: 1024,
+ height: 1024,
+ resolutions: [
+ { width: 1024, height: 1024 },
+ { width: 1280, height: 720 },
+ { width: 720, height: 1280 },
+ ],
+ sampleStrengthRange: [0.1, 0.8],
+ },
+ },
+};
+
+// 获取模型配置
+export function getModelConfig(modelName: string): ModelConfig {
+ const config = MODEL_CONFIGS[modelName];
+ if (!config) {
+ throw new Error(`Unsupported model: ${modelName}`);
+ }
+ return config;
+}
+
+// 获取所有支持的图像生成模型
+export function getSupportedImageModels(): string[] {
+ return Object.keys(MODEL_CONFIGS);
+}
+
+// 检查模型是否支持特定功能
+export function doesModelSupport(modelName: string, feature: keyof ModelConfig['features']): boolean {
+ const config = getModelConfig(modelName);
+ return config.features[feature];
+}
+
+// 验证参数是否在模型支持的范围内
+export function validateModelParams(modelName: string, params: {
+ width?: number;
+ height?: number;
+ sampleStrength?: number;
+}): { isValid: boolean; errors: string[] } {
+ const config = getModelConfig(modelName);
+ const errors: string[] = [];
+
+ // 验证分辨率
+ if (params.width && params.height) {
+ const isValidResolution = config.defaultParams.resolutions.some(
+ res => res.width === params.width && res.height === params.height
+ );
+ if (!isValidResolution) {
+ errors.push(
+ `Unsupported resolution ${params.width}x${params.height}. Supported resolutions: ${config.defaultParams.resolutions.map(r => `${r.width}x${r.height}`).join(', ')}`
+ );
+ }
+ }
+
+ // 验证采样强度
+ if (params.sampleStrength !== undefined) {
+ const [min, max] = config.defaultParams.sampleStrengthRange;
+ if (params.sampleStrength < min || params.sampleStrength > max) {
+ errors.push(`Sample strength must be between ${min} and ${max}`);
+ }
+ }
+
+ return {
+ isValid: errors.length === 0,
+ errors
+ };
+}
\ No newline at end of file
diff --git a/src/lib/configs/service-config.ts b/src/lib/configs/service-config.ts
new file mode 100644
index 0000000..3419a8f
--- /dev/null
+++ b/src/lib/configs/service-config.ts
@@ -0,0 +1,68 @@
+import path from 'path';
+
+import fs from 'fs-extra';
+import yaml from 'yaml';
+import _ from 'lodash';
+
+import environment from '../environment.ts';
+import util from '../util.ts';
+
+const CONFIG_PATH = path.join(path.resolve(), 'configs/', environment.env, "/service.yml");
+
+/**
+ * 服务配置
+ */
+export class ServiceConfig {
+
+ /** 服务名称 */
+ name: string;
+ /** @type {string} 服务绑定主机地址 */
+ host;
+ /** @type {number} 服务绑定端口 */
+ port;
+ /** @type {string} 服务路由前缀 */
+ urlPrefix;
+ /** @type {string} 服务绑定地址(外部访问地址) */
+ bindAddress;
+
+ constructor(options?: any) {
+ const { name, host, port, urlPrefix, bindAddress } = options || {};
+ this.name = _.defaultTo(name, 'jimeng-free-api');
+ this.host = _.defaultTo(host, '0.0.0.0');
+ this.port = _.defaultTo(port, 5566);
+ this.urlPrefix = _.defaultTo(urlPrefix, '');
+ this.bindAddress = bindAddress;
+ }
+
+ get addressHost() {
+ if(this.bindAddress) return this.bindAddress;
+ const ipAddresses = util.getIPAddressesByIPv4();
+ for(let ipAddress of ipAddresses) {
+ if(ipAddress === this.host)
+ return ipAddress;
+ }
+ return ipAddresses[0] || "127.0.0.1";
+ }
+
+ get address() {
+ return `${this.addressHost}:${this.port}`;
+ }
+
+ get pageDirUrl() {
+ return `http://127.0.0.1:${this.port}/page`;
+ }
+
+ get publicDirUrl() {
+ return `http://127.0.0.1:${this.port}/public`;
+ }
+
+ static load() {
+ const external = _.pickBy(environment, (v, k) => ["name", "host", "port"].includes(k) && !_.isUndefined(v));
+ if(!fs.pathExistsSync(CONFIG_PATH)) return new ServiceConfig(external);
+ const data = yaml.parse(fs.readFileSync(CONFIG_PATH).toString());
+ return new ServiceConfig({ ...data, ...external });
+ }
+
+}
+
+export default ServiceConfig.load();
\ No newline at end of file
diff --git a/src/lib/configs/system-config.ts b/src/lib/configs/system-config.ts
new file mode 100644
index 0000000..af0e77b
--- /dev/null
+++ b/src/lib/configs/system-config.ts
@@ -0,0 +1,84 @@
+import path from 'path';
+
+import fs from 'fs-extra';
+import yaml from 'yaml';
+import _ from 'lodash';
+
+import environment from '../environment.ts';
+
+const CONFIG_PATH = path.join(path.resolve(), 'configs/', environment.env, "/system.yml");
+
+/**
+ * 系统配置
+ */
+export class SystemConfig {
+
+ /** 是否开启请求日志 */
+ requestLog: boolean;
+ /** 临时目录路径 */
+ tmpDir: string;
+ /** 日志目录路径 */
+ logDir: string;
+ /** 日志写入间隔(毫秒) */
+ logWriteInterval: number;
+ /** 日志文件有效期(毫秒) */
+ logFileExpires: number;
+ /** 公共目录路径 */
+ publicDir: string;
+ /** 临时文件有效期(毫秒) */
+ tmpFileExpires: number;
+ /** 请求体配置 */
+ requestBody: any;
+ /** 是否调试模式 */
+ debug: boolean;
+
+ constructor(options?: any) {
+ const { requestLog, tmpDir, logDir, logWriteInterval, logFileExpires, publicDir, tmpFileExpires, requestBody, debug } = options || {};
+ this.requestLog = _.defaultTo(requestLog, false);
+ this.tmpDir = _.defaultTo(tmpDir, './tmp');
+ this.logDir = _.defaultTo(logDir, './logs');
+ this.logWriteInterval = _.defaultTo(logWriteInterval, 200);
+ this.logFileExpires = _.defaultTo(logFileExpires, 2626560000);
+ this.publicDir = _.defaultTo(publicDir, './public');
+ this.tmpFileExpires = _.defaultTo(tmpFileExpires, 86400000);
+ this.requestBody = Object.assign(requestBody || {}, {
+ enableTypes: ['form', 'text', 'xml'], // 移除 json,由自定义中间件处理
+ encoding: 'utf-8',
+ formLimit: '100mb',
+ jsonLimit: '100mb',
+ textLimit: '100mb',
+ xmlLimit: '100mb',
+ formidable: {
+ maxFileSize: '100mb'
+ },
+ multipart: true,
+ parsedMethods: ['POST', 'PUT', 'PATCH']
+ });
+ this.debug = _.defaultTo(debug, true);
+ }
+
+ get rootDirPath() {
+ return path.resolve();
+ }
+
+ get tmpDirPath() {
+ return path.resolve(this.tmpDir);
+ }
+
+ get logDirPath() {
+ return path.resolve(this.logDir);
+ }
+
+ get publicDirPath() {
+ return path.resolve(this.publicDir);
+ }
+
+ static load() {
+ if (!fs.pathExistsSync(CONFIG_PATH)) return new SystemConfig();
+ const data = yaml.parse(fs.readFileSync(CONFIG_PATH).toString());
+ return new SystemConfig(data);
+ }
+
+}
+
+export default SystemConfig.load();
\ No newline at end of file
diff --git a/src/lib/consts/exceptions.ts b/src/lib/consts/exceptions.ts
new file mode 100644
index 0000000..7a9b788
--- /dev/null
+++ b/src/lib/consts/exceptions.ts
@@ -0,0 +1,5 @@
+export default {
+ SYSTEM_ERROR: [-1000, '系统异常'],
+ SYSTEM_REQUEST_VALIDATION_ERROR: [-1001, '请求参数校验错误'],
+ SYSTEM_NOT_ROUTE_MATCHING: [-1002, '无匹配的路由']
+} as Record
\ No newline at end of file
diff --git a/src/lib/environment.ts b/src/lib/environment.ts
new file mode 100644
index 0000000..6e52a84
--- /dev/null
+++ b/src/lib/environment.ts
@@ -0,0 +1,44 @@
+import path from 'path';
+
+import fs from 'fs-extra';
+import minimist from 'minimist';
+import _ from 'lodash';
+
+const cmdArgs = minimist(process.argv.slice(2)); //获取命令行参数
+const envVars = process.env; //获取环境变量
+
+class Environment {
+
+ /** 命令行参数 */
+ cmdArgs: any;
+ /** 环境变量 */
+ envVars: any;
+ /** 环境名称 */
+ env?: string;
+ /** 服务名称 */
+ name?: string;
+ /** 服务地址 */
+ host?: string;
+ /** 服务端口 */
+ port?: number;
+ /** 包参数 */
+ package: any;
+
+ constructor(options: any = {}) {
+ const { cmdArgs, envVars, package: _package } = options;
+ this.cmdArgs = cmdArgs;
+ this.envVars = envVars;
+ this.env = _.defaultTo(cmdArgs.env || envVars.SERVER_ENV, 'dev');
+ this.name = cmdArgs.name || envVars.SERVER_NAME || undefined;
+ this.host = cmdArgs.host || envVars.SERVER_HOST || undefined;
+ this.port = Number(cmdArgs.port || envVars.SERVER_PORT) ? Number(cmdArgs.port || envVars.SERVER_PORT) : undefined;
+ this.package = _package;
+ }
+
+}
+
+export default new Environment({
+ cmdArgs,
+ envVars,
+ package: JSON.parse(fs.readFileSync(path.join(path.resolve(), "package.json")).toString())
+});
\ No newline at end of file
diff --git a/src/lib/exceptions/APIException.ts b/src/lib/exceptions/APIException.ts
new file mode 100644
index 0000000..515c806
--- /dev/null
+++ b/src/lib/exceptions/APIException.ts
@@ -0,0 +1,14 @@
+import Exception from './Exception.js';
+
+export default class APIException extends Exception {
+
+ /**
+ * 构造异常
+ *
+ * @param {[number, string]} exception 异常
+ */
+ constructor(exception: (string | number)[], errmsg?: string) {
+ super(exception, errmsg);
+ }
+
+}
\ No newline at end of file
diff --git a/src/lib/exceptions/Exception.ts b/src/lib/exceptions/Exception.ts
new file mode 100644
index 0000000..ef0372f
--- /dev/null
+++ b/src/lib/exceptions/Exception.ts
@@ -0,0 +1,47 @@
+import assert from 'assert';
+
+import _ from 'lodash';
+
+export default class Exception extends Error {
+
+ /** 错误码 */
+ errcode: number;
+ /** 错误消息 */
+ errmsg: string;
+ /** 数据 */
+ data: any;
+ /** HTTP状态码 */
+ httpStatusCode: number;
+
+ /**
+ * 构造异常
+ *
+ * @param exception 异常
+ * @param _errmsg 异常消息
+ */
+ constructor(exception: (string | number)[], _errmsg?: string) {
+ assert(_.isArray(exception), 'Exception must be Array');
+ const [errcode, errmsg] = exception as [number, string];
+ assert(_.isFinite(errcode), 'Exception errcode invalid');
+ assert(_.isString(errmsg), 'Exception errmsg invalid');
+ super(_errmsg || errmsg);
+ this.errcode = errcode;
+ this.errmsg = _errmsg || errmsg;
+ }
+
+ compare(exception: (string | number)[]) {
+ const [errcode] = exception as [number, string];
+ return this.errcode == errcode;
+ }
+
+ setHTTPStatusCode(value: number) {
+ this.httpStatusCode = value;
+ return this;
+ }
+
+ setData(value: any) {
+ this.data = _.defaultTo(value, null);
+ return this;
+ }
+
+}
\ No newline at end of file
diff --git a/src/lib/http-status-codes.ts b/src/lib/http-status-codes.ts
new file mode 100644
index 0000000..cc0c571
--- /dev/null
+++ b/src/lib/http-status-codes.ts
@@ -0,0 +1,61 @@
+export default {
+
+ CONTINUE: 100, //客户端应当继续发送请求。这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝。客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应。服务器必须在请求完成后向客户端发送一个最终响应
+ SWITCHING_PROTOCOLS: 101, //服务器已经理解了客户端的请求,并将通过Upgrade 消息头通知客户端采用不同的协议来完成这个请求。在发送完这个响应最后的空行后,服务器将会切换到在Upgrade 消息头中定义的那些协议。只有在切换新的协议更有好处的时候才应该采取类似措施。例如,切换到新的HTTP 版本比旧版本更有优势,或者切换到一个实时且同步的协议以传送利用此类特性的资源
+ PROCESSING: 102, //处理将被继续执行
+
+ OK: 200, //请求已成功,请求所希望的响应头或数据体将随此响应返回
+ CREATED: 201, //请求已经被实现,而且有一个新的资源已经依据请求的需要而建立,且其 URI 已经随Location 头信息返回。假如需要的资源无法及时建立的话,应当返回 '202 Accepted'
+ ACCEPTED: 202, //服务器已接受请求,但尚未处理。正如它可能被拒绝一样,最终该请求可能会也可能不会被执行。在异步操作的场合下,没有比发送这个状态码更方便的做法了。返回202状态码的响应的目的是允许服务器接受其他过程的请求(例如某个每天只执行一次的基于批处理的操作),而不必让客户端一直保持与服务器的连接直到批处理操作全部完成。在接受请求处理并返回202状态码的响应应当在返回的实体中包含一些指示处理当前状态的信息,以及指向处理状态监视器或状态预测的指针,以便用户能够估计操作是否已经完成
+ NON_AUTHORITATIVE_INFO: 203, //服务器已成功处理了请求,但返回的实体头部元信息不是在原始服务器上有效的确定集合,而是来自本地或者第三方的拷贝。当前的信息可能是原始版本的子集或者超集。例如,包含资源的元数据可能导致原始服务器知道元信息的超级。使用此状态码不是必须的,而且只有在响应不使用此状态码便会返回200 OK的情况下才是合适的
+ NO_CONTENT: 204, //服务器成功处理了请求,但不需要返回任何实体内容,并且希望返回更新了的元信息。响应可能通过实体头部的形式,返回新的或更新后的元信息。如果存在这些头部信息,则应当与所请求的变量相呼应。如果客户端是浏览器的话,那么用户浏览器应保留发送了该请求的页面,而不产生任何文档视图上的变化,即使按照规范新的或更新后的元信息应当被应用到用户浏览器活动视图中的文档。由于204响应被禁止包含任何消息体,因此它始终以消息头后的第一个空行结尾
+ RESET_CONTENT: 205, //服务器成功处理了请求,且没有返回任何内容。但是与204响应不同,返回此状态码的响应要求请求者重置文档视图。该响应主要是被用于接受用户输入后,立即重置表单,以便用户能够轻松地开始另一次输入。与204响应一样,该响应也被禁止包含任何消息体,且以消息头后的第一个空行结束
+ PARTIAL_CONTENT: 206, //服务器已经成功处理了部分 GET 请求。类似于FlashGet或者迅雷这类的HTTP下载工具都是使用此类响应实现断点续传或者将一个大文档分解为多个下载段同时下载。该请求必须包含 Range 头信息来指示客户端希望得到的内容范围,并且可能包含 If-Range 来作为请求条件。响应必须包含如下的头部域:Content-Range 用以指示本次响应中返回的内容的范围;如果是Content-Type为multipart/byteranges的多段下载,则每一段multipart中都应包含Content-Range域用以指示本段的内容范围。假如响应中包含Content-Length,那么它的数值必须匹配它返回的内容范围的真实字节数。Date和ETag或Content-Location,假如同样的请求本应该返回200响应。Expires, Cache-Control,和/或 Vary,假如其值可能与之前相同变量的其他响应对应的值不同的话。假如本响应请求使用了 If-Range 强缓存验证,那么本次响应不应该包含其他实体头;假如本响应的请求使用了 If-Range 弱缓存验证,那么本次响应禁止包含其他实体头;这避免了缓存的实体内容和更新了的实体头信息之间的不一致。否则,本响应就应当包含所有本应该返回200响应中应当返回的所有实体头部域。假如 ETag 或 Latest-Modified 头部不能精确匹配的话,则客户端缓存应禁止将206响应返回的内容与之前任何缓存过的内容组合在一起。任何不支持 Range 以及 Content-Range 头的缓存都禁止缓存206响应返回的内容
+ MULTIPLE_STATUS: 207, //代表之后的消息体将是一个XML消息,并且可能依照之前子请求数量的不同,包含一系列独立的响应代码
+
+ MULTIPLE_CHOICES: 300, //被请求的资源有一系列可供选择的回馈信息,每个都有自己特定的地址和浏览器驱动的商议信息。用户或浏览器能够自行选择一个首选的地址进行重定向。除非这是一个HEAD请求,否则该响应应当包括一个资源特性及地址的列表的实体,以便用户或浏览器从中选择最合适的重定向地址。这个实体的格式由Content-Type定义的格式所决定。浏览器可能根据响应的格式以及浏览器自身能力,自动作出最合适的选择。当然,RFC 2616规范并没有规定这样的自动选择该如何进行。如果服务器本身已经有了首选的回馈选择,那么在Location中应当指明这个回馈的 URI;浏览器可能会将这个 Location 值作为自动重定向的地址。此外,除非额外指定,否则这个响应也是可缓存的
+ MOVED_PERMANENTLY: 301, //被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个URI之一。如果可能,拥有链接编辑功能的客户端应当自动把请求的地址修改为从服务器反馈回来的地址。除非额外指定,否则这个响应也是可缓存的。新的永久性的URI应当在响应的Location域中返回。除非这是一个HEAD请求,否则响应的实体中应当包含指向新的URI的超链接及简短说明。如果这不是一个GET或者HEAD请求,因此浏览器禁止自动进行重定向,除非得到用户的确认,因为请求的条件可能因此发生变化。注意:对于某些使用 HTTP/1.0 协议的浏览器,当它们发送的POST请求得到了一个301响应的话,接下来的重定向请求将会变成GET方式
+ FOUND: 302, //请求的资源现在临时从不同的URI响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有在Cache-Control或Expires中进行了指定的情况下,这个响应才是可缓存的。新的临时性的URI应当在响应的 Location 域中返回。除非这是一个HEAD请求,否则响应的实体中应当包含指向新的URI的超链接及简短说明。如果这不是一个GET或者HEAD请求,那么浏览器禁止自动进行重定向,除非得到用户的确认,因为请求的条件可能因此发生变化。注意:虽然RFC 1945和RFC 2068规范不允许客户端在重定向时改变请求的方法,但是很多现存的浏览器将302响应视作为303响应,并且使用GET方式访问在Location中规定的URI,而无视原先请求的方法。状态码303和307被添加了进来,用以明确服务器期待客户端进行何种反应
+ SEE_OTHER: 303, //对应当前请求的响应可以在另一个URI上被找到,而且客户端应当采用 GET 的方式访问那个资源。这个方法的存在主要是为了允许由脚本激活的POST请求输出重定向到一个新的资源。这个新的 URI 不是原始资源的替代引用。同时,303响应禁止被缓存。当然,第二个请求(重定向)可能被缓存。新的 URI 应当在响应的Location域中返回。除非这是一个HEAD请求,否则响应的实体中应当包含指向新的URI的超链接及简短说明。注意:许多 HTTP/1.1 版以前的浏览器不能正确理解303状态。如果需要考虑与这些浏览器之间的互动,302状态码应该可以胜任,因为大多数的浏览器处理302响应时的方式恰恰就是上述规范要求客户端处理303响应时应当做的
+ NOT_MODIFIED: 304, //如果客户端发送了一个带条件的GET请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个状态码。304响应禁止包含消息体,因此始终以消息头后的第一个空行结尾。该响应必须包含以下的头信息:Date,除非这个服务器没有时钟。假如没有时钟的服务器也遵守这些规则,那么代理服务器以及客户端可以自行将Date字段添加到接收到的响应头中去(正如RFC 2068中规定的一样),缓存机制将会正常工作。ETag或 Content-Location,假如同样的请求本应返回200响应。Expires, Cache-Control,和/或Vary,假如其值可能与之前相同变量的其他响应对应的值不同的话。假如本响应请求使用了强缓存验证,那么本次响应不应该包含其他实体头;否则(例如,某个带条件的 GET 请求使用了弱缓存验证),本次响应禁止包含其他实体头;这避免了缓存了的实体内容和更新了的实体头信息之间的不一致。假如某个304响应指明了当前某个实体没有缓存,那么缓存系统必须忽视这个响应,并且重复发送不包含限制条件的请求。假如接收到一个要求更新某个缓存条目的304响应,那么缓存系统必须更新整个条目以反映所有在响应中被更新的字段的值
+ USE_PROXY: 305, //被请求的资源必须通过指定的代理才能被访问。Location域中将给出指定的代理所在的URI信息,接收者需要重复发送一个单独的请求,通过这个代理才能访问相应资源。只有原始服务器才能建立305响应。注意:RFC 2068中没有明确305响应是为了重定向一个单独的请求,而且只能被原始服务器建立。忽视这些限制可能导致严重的安全后果
+ UNUSED: 306, //在最新版的规范中,306状态码已经不再被使用
+ TEMPORARY_REDIRECT: 307, //请求的资源现在临时从不同的URI 响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有在Cache-Control或Expires中进行了指定的情况下,这个响应才是可缓存的。新的临时性的URI 应当在响应的Location域中返回。除非这是一个HEAD请求,否则响应的实体中应当包含指向新的URI 的超链接及简短说明。因为部分浏览器不能识别307响应,因此需要添加上述必要信息以便用户能够理解并向新的 URI 发出访问请求。如果这不是一个GET或者HEAD请求,那么浏览器禁止自动进行重定向,除非得到用户的确认,因为请求的条件可能因此发生变化
+
+ BAD_REQUEST: 400, //1.语义有误,当前请求无法被服务器理解。除非进行修改,否则客户端不应该重复提交这个请求 2.请求参数有误
+ UNAUTHORIZED: 401, //当前请求需要用户验证。该响应必须包含一个适用于被请求资源的 WWW-Authenticate 信息头用以询问用户信息。客户端可以重复提交一个包含恰当的 Authorization 头信息的请求。如果当前请求已经包含了 Authorization 证书,那么401响应代表着服务器验证已经拒绝了那些证书。如果401响应包含了与前一个响应相同的身份验证询问,且浏览器已经至少尝试了一次验证,那么浏览器应当向用户展示响应中包含的实体信息,因为这个实体信息中可能包含了相关诊断信息。参见RFC 2617
+ PAYMENT_REQUIRED: 402, //该状态码是为了将来可能的需求而预留的
+ FORBIDDEN: 403, //服务器已经理解请求,但是拒绝执行它。与401响应不同的是,身份验证并不能提供任何帮助,而且这个请求也不应该被重复提交。如果这不是一个HEAD请求,而且服务器希望能够讲清楚为何请求不能被执行,那么就应该在实体内描述拒绝的原因。当然服务器也可以返回一个404响应,假如它不希望让客户端获得任何信息
+ NOT_FOUND: 404, //请求失败,请求所希望得到的资源未被在服务器上发现。没有信息能够告诉用户这个状况到底是暂时的还是永久的。假如服务器知道情况的话,应当使用410状态码来告知旧资源因为某些内部的配置机制问题,已经永久的不可用,而且没有任何可以跳转的地址。404这个状态码被广泛应用于当服务器不想揭示到底为何请求被拒绝或者没有其他适合的响应可用的情况下
+ METHOD_NOT_ALLOWED: 405, //请求行中指定的请求方法不能被用于请求相应的资源。该响应必须返回一个Allow 头信息用以表示出当前资源能够接受的请求方法的列表。鉴于PUT,DELETE方法会对服务器上的资源进行写操作,因而绝大部分的网页服务器都不支持或者在默认配置下不允许上述请求方法,对于此类请求均会返回405错误
+ NO_ACCEPTABLE: 406, //请求的资源的内容特性无法满足请求头中的条件,因而无法生成响应实体。除非这是一个 HEAD 请求,否则该响应就应当返回一个包含可以让用户或者浏览器从中选择最合适的实体特性以及地址列表的实体。实体的格式由Content-Type头中定义的媒体类型决定。浏览器可以根据格式及自身能力自行作出最佳选择。但是,规范中并没有定义任何作出此类自动选择的标准
+ PROXY_AUTHENTICATION_REQUIRED: 407, //与401响应类似,只不过客户端必须在代理服务器上进行身份验证。代理服务器必须返回一个Proxy-Authenticate用以进行身份询问。客户端可以返回一个Proxy-Authorization信息头用以验证。参见RFC 2617
+ REQUEST_TIMEOUT: 408, //请求超时。客户端没有在服务器预备等待的时间内完成一个请求的发送。客户端可以随时再次提交这一请求而无需进行任何更改
+ CONFLICT: 409, //由于和被请求的资源的当前状态之间存在冲突,请求无法完成。这个代码只允许用在这样的情况下才能被使用:用户被认为能够解决冲突,并且会重新提交新的请求。该响应应当包含足够的信息以便用户发现冲突的源头。冲突通常发生于对PUT请求的处理中。例如,在采用版本检查的环境下,某次PUT提交的对特定资源的修改请求所附带的版本信息与之前的某个(第三方)请求向冲突,那么此时服务器就应该返回一个409错误,告知用户请求无法完成。此时,响应实体中很可能会包含两个冲突版本之间的差异比较,以便用户重新提交归并以后的新版本
+ GONE: 410, //被请求的资源在服务器上已经不再可用,而且没有任何已知的转发地址。这样的状况应当被认为是永久性的。如果可能,拥有链接编辑功能的客户端应当在获得用户许可后删除所有指向这个地址的引用。如果服务器不知道或者无法确定这个状况是否是永久的,那么就应该使用404状态码。除非额外说明,否则这个响应是可缓存的。410响应的目的主要是帮助网站管理员维护网站,通知用户该资源已经不再可用,并且服务器拥有者希望所有指向这个资源的远端连接也被删除。这类事件在限时、增值服务中很普遍。同样,410响应也被用于通知客户端在当前服务器站点上,原本属于某个个人的资源已经不再可用。当然,是否需要把所有永久不可用的资源标记为'410 Gone',以及是否需要保持此标记多长时间,完全取决于服务器拥有者
+ LENGTH_REQUIRED: 411, //服务器拒绝在没有定义Content-Length头的情况下接受请求。在添加了表明请求消息体长度的有效Content-Length头之后,客户端可以再次提交该请求
+ PRECONDITION_FAILED: 412, //服务器在验证在请求的头字段中给出先决条件时,没能满足其中的一个或多个。这个状态码允许客户端在获取资源时在请求的元信息(请求头字段数据)中设置先决条件,以此避免该请求方法被应用到其希望的内容以外的资源上
+ REQUEST_ENTITY_TOO_LARGE: 413, //服务器拒绝处理当前请求,因为该请求提交的实体数据大小超过了服务器愿意或者能够处理的范围。此种情况下,服务器可以关闭连接以免客户端继续发送此请求。如果这个状况是临时的,服务器应当返回一个 Retry-After 的响应头,以告知客户端可以在多少时间以后重新尝试
+ REQUEST_URI_TOO_LONG: 414, //请求的URI长度超过了服务器能够解释的长度,因此服务器拒绝对该请求提供服务。这比较少见,通常的情况包括:本应使用POST方法的表单提交变成了GET方法,导致查询字符串(Query String)过长。重定向URI “黑洞”,例如每次重定向把旧的URI作为新的URI的一部分,导致在若干次重定向后URI超长。客户端正在尝试利用某些服务器中存在的安全漏洞攻击服务器。这类服务器使用固定长度的缓冲读取或操作请求的URI,当GET后的参数超过某个数值后,可能会产生缓冲区溢出,导致任意代码被执行[1]。没有此类漏洞的服务器,应当返回414状态码
+ UNSUPPORTED_MEDIA_TYPE: 415, //对于当前请求的方法和所请求的资源,请求中提交的实体并不是服务器中所支持的格式,因此请求被拒绝
+ REQUESTED_RANGE_NOT_SATISFIABLE: 416, //如果请求中包含了Range请求头,并且Range中指定的任何数据范围都与当前资源的可用范围不重合,同时请求中又没有定义If-Range请求头,那么服务器就应当返回416状态码。假如Range使用的是字节范围,那么这种情况就是指请求指定的所有数据范围的首字节位置都超过了当前资源的长度。服务器也应当在返回416状态码的同时,包含一个Content-Range实体头,用以指明当前资源的长度。这个响应也被禁止使用multipart/byteranges作为其 Content-Type
+ EXPECTION_FAILED: 417, //在请求头Expect中指定的预期内容无法被服务器满足,或者这个服务器是一个代理服务器,它有明显的证据证明在当前路由的下一个节点上,Expect的内容无法被满足
+ TOO_MANY_CONNECTIONS: 421, //从当前客户端所在的IP地址到服务器的连接数超过了服务器许可的最大范围。通常,这里的IP地址指的是从服务器上看到的客户端地址(比如用户的网关或者代理服务器地址)。在这种情况下,连接数的计算可能涉及到不止一个终端用户
+ UNPROCESSABLE_ENTITY: 422, //请求格式正确,但是由于含有语义错误,无法响应
+ FAILED_DEPENDENCY: 424, //由于之前的某个请求发生的错误,导致当前请求失败,例如PROPPATCH
+ UNORDERED_COLLECTION: 425, //在WebDav Advanced Collections 草案中定义,但是未出现在《WebDAV 顺序集协议》(RFC 3658)中
+ UPGRADE_REQUIRED: 426, //客户端应当切换到TLS/1.0
+ RETRY_WITH: 449, //由微软扩展,代表请求应当在执行完适当的操作后进行重试
+
+ INTERNAL_SERVER_ERROR: 500, //服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器的程序码出错时出现
+ NOT_IMPLEMENTED: 501, //服务器不支持当前请求所需要的某个功能。当服务器无法识别请求的方法,并且无法支持其对任何资源的请求
+ BAD_GATEWAY: 502, //作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应
+ SERVICE_UNAVAILABLE: 503, //由于临时的服务器维护或者过载,服务器当前无法处理请求。这个状况是临时的,并且将在一段时间以后恢复。如果能够预计延迟时间,那么响应中可以包含一个 Retry-After 头用以标明这个延迟时间。如果没有给出这个 Retry-After 信息,那么客户端应当以处理500响应的方式处理它。注意:503状态码的存在并不意味着服务器在过载的时候必须使用它。某些服务器只不过是希望拒绝客户端的连接
+ GATEWAY_TIMEOUT: 504, //作为网关或者代理工作的服务器尝试执行请求时,未能及时从上游服务器(URI标识出的服务器,例如HTTP、FTP、LDAP)或者辅助服务器(例如DNS)收到响应。注意:某些代理服务器在DNS查询超时时会返回400或者500错误
+ HTTP_VERSION_NOT_SUPPORTED: 505, //服务器不支持,或者拒绝支持在请求中使用的HTTP版本。这暗示着服务器不能或不愿使用与客户端相同的版本。响应中应当包含一个描述了为何版本不被支持以及服务器支持哪些协议的实体
+ VARIANT_ALSO_NEGOTIATES: 506, //服务器存在内部配置错误:被请求的协商变元资源被配置为在透明内容协商中使用自己,因此在一个协商处理中不是一个合适的重点
+ INSUFFICIENT_STORAGE: 507, //服务器无法存储完成请求所必须的内容。这个状况被认为是临时的
+ BANDWIDTH_LIMIT_EXCEEDED: 509, //服务器达到带宽限制。这不是一个官方的状态码,但是仍被广泛使用
+ NOT_EXTENDED: 510 //获取资源所需要的策略并没有没满足
+
+};
\ No newline at end of file
diff --git a/src/lib/initialize.ts b/src/lib/initialize.ts
new file mode 100644
index 0000000..3200374
--- /dev/null
+++ b/src/lib/initialize.ts
@@ -0,0 +1,29 @@
+import logger from './logger.js';
+import browserService from './browser-service.js';
+
+// 允许无限量的监听器
+process.setMaxListeners(Infinity);
+// 输出未捕获异常
+process.on("uncaughtException", (err, origin) => {
+ logger.error(`An unhandled error occurred: ${origin}`, err);
+});
+// 输出未处理的Promise.reject
+process.on("unhandledRejection", (_, promise) => {
+ promise.catch(err => logger.error("An unhandled rejection occurred:", err));
+});
+// 输出系统警告信息
+process.on("warning", warning => logger.warn("System warning: ", warning));
+// 进程退出监听
+process.on("exit", () => {
+ logger.info("Service exit");
+ logger.footer();
+});
+// 进程被kill
+process.on("SIGTERM", () => {
+ logger.warn("received kill signal");
+ browserService.close().finally(() => process.exit(2));
+});
+// Ctrl-C进程退出
+process.on("SIGINT", () => {
+ browserService.close().finally(() => process.exit(0));
+});
\ No newline at end of file
diff --git a/src/lib/interfaces/ICompletionMessage.ts b/src/lib/interfaces/ICompletionMessage.ts
new file mode 100644
index 0000000..5aad345
--- /dev/null
+++ b/src/lib/interfaces/ICompletionMessage.ts
@@ -0,0 +1,4 @@
+export default interface ICompletionMessage {
+ role: 'system' | 'assistant' | 'user' | 'function';
+ content: string;
+}
\ No newline at end of file
diff --git a/src/lib/logger.ts b/src/lib/logger.ts
new file mode 100644
index 0000000..32cb3a6
--- /dev/null
+++ b/src/lib/logger.ts
@@ -0,0 +1,184 @@
+import path from 'path';
+import _util from 'util';
+
+import 'colors';
+import _ from 'lodash';
+import fs from 'fs-extra';
+import { format as dateFormat } from 'date-fns';
+
+import config from './config.ts';
+import util from './util.ts';
+
+const isVercelEnv = process.env.VERCEL;
+
+class LogWriter {
+
+ #buffers = [];
+
+ constructor() {
+ !isVercelEnv && fs.ensureDirSync(config.system.logDirPath);
+ !isVercelEnv && this.work();
+ }
+
+ push(content) {
+ const buffer = Buffer.from(content);
+ this.#buffers.push(buffer);
+ }
+
+ writeSync(buffer) {
+ !isVercelEnv && fs.appendFileSync(path.join(config.system.logDirPath, `/${util.getDateString()}.log`), buffer);
+ }
+
+ async write(buffer) {
+ !isVercelEnv && await fs.appendFile(path.join(config.system.logDirPath, `/${util.getDateString()}.log`), buffer);
+ }
+
+ flush() {
+ if(!this.#buffers.length) return;
+ !isVercelEnv && fs.appendFileSync(path.join(config.system.logDirPath, `/${util.getDateString()}.log`), Buffer.concat(this.#buffers));
+ }
+
+ work() {
+ if (!this.#buffers.length) return setTimeout(this.work.bind(this), config.system.logWriteInterval);
+ const buffer = Buffer.concat(this.#buffers);
+ this.#buffers = [];
+ this.write(buffer)
+ .finally(() => setTimeout(this.work.bind(this), config.system.logWriteInterval))
+ .catch(err => console.error("Log write error:", err));
+ }
+
+}
+
+class LogText {
+
+ /** @type {string} 日志级别 */
+ level;
+ /** @type {string} 日志文本 */
+ text;
+ /** @type {string} 日志来源 */
+ source;
+ /** @type {Date} 日志发生时间 */
+ time = new Date();
+
+ constructor(level, ...params) {
+ this.level = level;
+ this.text = _util.format.apply(null, params);
+ this.source = this.#getStackTopCodeInfo();
+ }
+
+ #getStackTopCodeInfo() {
+ const unknownInfo = { name: "unknown", codeLine: 0, codeColumn: 0 };
+ const stackArray = new Error().stack.split("\n");
+ const text = stackArray[4];
+ if (!text)
+ return unknownInfo;
+ const match = text.match(/at (.+) \((.+)\)/) || text.match(/at (.+)/);
+ if (!match || !_.isString(match[2] || match[1]))
+ return unknownInfo;
+ const temp = match[2] || match[1];
+ const _match = temp.match(/([a-zA-Z0-9_\-\.]+)\:(\d+)\:(\d+)$/);
+ if (!_match)
+ return unknownInfo;
+ const [, scriptPath, codeLine, codeColumn] = _match as any;
+ return {
+ name: scriptPath ? scriptPath.replace(/.js$/, "") : "unknown",
+ path: scriptPath || null,
+ codeLine: parseInt(codeLine || 0),
+ codeColumn: parseInt(codeColumn || 0)
+ };
+ }
+
+ toString() {
+ return `[${dateFormat(this.time, "yyyy-MM-dd HH:mm:ss.SSS")}][${this.level}][${this.source.name}<${this.source.codeLine},${this.source.codeColumn}>] ${this.text}`;
+ }
+
+}
+
+class Logger {
+
+ /** @type {Object} 系统配置 */
+ config = {};
+ /** @type {Object} 日志级别映射 */
+ static Level = {
+ Success: "success",
+ Info: "info",
+ Log: "log",
+ Debug: "debug",
+ Warning: "warning",
+ Error: "error",
+ Fatal: "fatal"
+ };
+ /** @type {Object} 日志级别文本颜色樱色 */
+ static LevelColor = {
+ [Logger.Level.Success]: "green",
+ [Logger.Level.Info]: "brightCyan",
+ [Logger.Level.Debug]: "white",
+ [Logger.Level.Warning]: "brightYellow",
+ [Logger.Level.Error]: "brightRed",
+ [Logger.Level.Fatal]: "red"
+ };
+ #writer;
+
+ constructor() {
+ this.#writer = new LogWriter();
+ }
+
+ header() {
+ this.#writer.writeSync(Buffer.from(`\n\n===================== LOG START ${dateFormat(new Date(), "yyyy-MM-dd HH:mm:ss.SSS")} =====================\n\n`));
+ }
+
+ footer() {
+ this.#writer.flush(); //将未写入文件的日志缓存写入
+ this.#writer.writeSync(Buffer.from(`\n\n===================== LOG END ${dateFormat(new Date(), "yyyy-MM-dd HH:mm:ss.SSS")} =====================\n\n`));
+ }
+
+ success(...params) {
+ const content = new LogText(Logger.Level.Success, ...params).toString();
+ console.info(content[Logger.LevelColor[Logger.Level.Success]]);
+ this.#writer.push(content + "\n");
+ }
+
+ info(...params) {
+ const content = new LogText(Logger.Level.Info, ...params).toString();
+ console.info(content[Logger.LevelColor[Logger.Level.Info]]);
+ this.#writer.push(content + "\n");
+ }
+
+ log(...params) {
+ const content = new LogText(Logger.Level.Log, ...params).toString();
+ console.log(content[Logger.LevelColor[Logger.Level.Log]]);
+ this.#writer.push(content + "\n");
+ }
+
+ debug(...params) {
+ if(!config.system.debug) return; //非调试模式忽略debug
+ const content = new LogText(Logger.Level.Debug, ...params).toString();
+ console.debug(content[Logger.LevelColor[Logger.Level.Debug]]);
+ this.#writer.push(content + "\n");
+ }
+
+ warn(...params) {
+ const content = new LogText(Logger.Level.Warning, ...params).toString();
+ console.warn(content[Logger.LevelColor[Logger.Level.Warning]]);
+ this.#writer.push(content + "\n");
+ }
+
+ error(...params) {
+ const content = new LogText(Logger.Level.Error, ...params).toString();
+ console.error(content[Logger.LevelColor[Logger.Level.Error]]);
+ this.#writer.push(content);
+ }
+
+ fatal(...params) {
+ const content = new LogText(Logger.Level.Fatal, ...params).toString();
+ console.error(content[Logger.LevelColor[Logger.Level.Fatal]]);
+ this.#writer.push(content);
+ }
+
+ destory() {
+ this.#writer.destory();
+ }
+
+}
+
+export default new Logger();
\ No newline at end of file
diff --git a/src/lib/request/Request.ts b/src/lib/request/Request.ts
new file mode 100644
index 0000000..e484cf4
--- /dev/null
+++ b/src/lib/request/Request.ts
@@ -0,0 +1,95 @@
+import _ from 'lodash';
+
+import APIException from '@/lib/exceptions/APIException.ts';
+import EX from '@/api/consts/exceptions.ts';
+import logger from '@/lib/logger.ts';
+import util from '@/lib/util.ts';
+
+export interface RequestOptions {
+ time?: number;
+}
+
+export default class Request {
+
+ /** 请求方法 */
+ method: string;
+ /** 请求URL */
+ url: string;
+ /** 请求路径 */
+ path: string;
+ /** 请求载荷类型 */
+ type: string;
+ /** 请求headers */
+ headers: any;
+ /** 请求原始查询字符串 */
+ search: string;
+ /** 请求查询参数 */
+ query: any;
+ /** 请求URL参数 */
+ params: any;
+ /** 请求载荷 */
+ body: any;
+ /** 上传的文件 */
+ files: any[];
+ /** 客户端IP地址 */
+ remoteIP: string | null;
+ /** 请求接受时间戳(毫秒) */
+ time: number;
+
+ constructor(ctx, options: RequestOptions = {}) {
+ const { time } = options;
+ this.method = ctx.request.method;
+ this.url = ctx.request.url;
+ this.path = ctx.request.path;
+ this.type = ctx.request.type;
+ this.headers = ctx.request.headers || {};
+ this.search = ctx.request.search;
+ this.query = ctx.query || {};
+ this.params = ctx.params || {};
+ this.body = ctx.request.body || {};
+ // koa-body 的 files 可能是对象 { files: [File, File] } 或 { files: File }
+ // 需要统一转换为数组格式
+ const rawFiles = ctx.request.files;
+ if (rawFiles) {
+ if (Array.isArray(rawFiles)) {
+ this.files = rawFiles;
+ } else if (typeof rawFiles === 'object') {
+ // 遍历对象,提取所有文件
+ const filesArray: any[] = [];
+ for (const key in rawFiles) {
+ const fileOrFiles = rawFiles[key];
+ if (Array.isArray(fileOrFiles)) {
+ filesArray.push(...fileOrFiles);
+ } else if (fileOrFiles) {
+ filesArray.push(fileOrFiles);
+ }
+ }
+ this.files = filesArray;
+ } else {
+ this.files = [];
+ }
+ } else {
+ this.files = [];
+ }
+ this.remoteIP = this.headers["X-Real-IP"] || this.headers["x-real-ip"] || this.headers["X-Forwarded-For"] || this.headers["x-forwarded-for"] || ctx.ip || null;
+ this.time = Number(_.defaultTo(time, util.timestamp()));
+ }
+
+ validate(key: string, fn?: Function, message?: string) {
+ try {
+ const value = _.get(this, key);
+ if (fn) {
+ if (fn(value) === false)
+ throw `[Mismatch] -> ${fn}`;
+ }
+ else if (_.isUndefined(value))
+ throw '[Undefined]';
+ }
+ catch (err) {
+ logger.warn(`Params ${key} invalid:`, err);
+ throw new APIException(EX.API_REQUEST_PARAMS_INVALID, message || `Params ${key} invalid`);
+ }
+ return this;
+ }
+
+}
\ No newline at end of file
diff --git a/src/lib/response/Body.ts b/src/lib/response/Body.ts
new file mode 100644
index 0000000..9cf8574
--- /dev/null
+++ b/src/lib/response/Body.ts
@@ -0,0 +1,41 @@
+import _ from 'lodash';
+
+export interface BodyOptions {
+ code?: number;
+ message?: string;
+ data?: any;
+ statusCode?: number;
+}
+
+export default class Body {
+
+ /** 状态码 */
+ code: number;
+ /** 状态消息 */
+ message: string;
+ /** 载荷 */
+ data: any;
+ /** HTTP状态码 */
+ statusCode: number;
+
+ constructor(options: BodyOptions = {}) {
+ const { code, message, data, statusCode } = options;
+ this.code = Number(_.defaultTo(code, 0));
+ this.message = _.defaultTo(message, 'OK');
+ this.data = _.defaultTo(data, null);
+ this.statusCode = Number(_.defaultTo(statusCode, 200));
+ }
+
+ toObject() {
+ return {
+ code: this.code,
+ message: this.message,
+ data: this.data
+ };
+ }
+
+ static isInstance(value) {
+ return value instanceof Body;
+ }
+
+}
\ No newline at end of file
diff --git a/src/lib/response/FailureBody.ts b/src/lib/response/FailureBody.ts
new file mode 100644
index 0000000..33d7fb9
--- /dev/null
+++ b/src/lib/response/FailureBody.ts
@@ -0,0 +1,31 @@
+import _ from 'lodash';
+
+import Body from './Body.ts';
+import Exception from '../exceptions/Exception.ts';
+import APIException from '../exceptions/APIException.ts';
+import EX from '../consts/exceptions.ts';
+import HTTP_STATUS_CODES from '../http-status-codes.ts';
+
+export default class FailureBody extends Body {
+
+ constructor(error: APIException | Exception | Error, _data?: any) {
+ let errcode, errmsg, data = _data, httpStatusCode = HTTP_STATUS_CODES.OK;;
+ if(_.isString(error))
+ error = new Exception(EX.SYSTEM_ERROR, error);
+ else if(error instanceof APIException || error instanceof Exception)
+ ({ errcode, errmsg, data, httpStatusCode } = error);
+ else if(_.isError(error))
+ ({ errcode, errmsg, data, httpStatusCode } = new Exception(EX.SYSTEM_ERROR, error.message));
+ super({
+ code: errcode || -1,
+ message: errmsg || 'Internal error',
+ data,
+ statusCode: httpStatusCode
+ });
+ }
+
+ static isInstance(value) {
+ return value instanceof FailureBody;
+ }
+
+}
\ No newline at end of file
diff --git a/src/lib/response/Response.ts b/src/lib/response/Response.ts
new file mode 100644
index 0000000..816397d
--- /dev/null
+++ b/src/lib/response/Response.ts
@@ -0,0 +1,63 @@
+import mime from 'mime';
+import _ from 'lodash';
+
+import Body from './Body.ts';
+import util from '../util.ts';
+
+export interface ResponseOptions {
+ statusCode?: number;
+ type?: string;
+ headers?: Record;
+ redirect?: string;
+ body?: any;
+ size?: number;
+ time?: number;
+}
+
+export default class Response {
+
+ /** 响应HTTP状态码 */
+ statusCode: number;
+ /** 响应内容类型 */
+ type: string;
+ /** 响应headers */
+ headers: Record;
+ /** 重定向目标 */
+ redirect: string;
+ /** 响应载荷 */
+ body: any;
+ /** 响应载荷大小 */
+ size: number;
+ /** 响应时间戳 */
+ time: number;
+
+ constructor(body: any, options: ResponseOptions = {}) {
+ const { statusCode, type, headers, redirect, size, time } = options;
+ this.statusCode = Number(_.defaultTo(statusCode, Body.isInstance(body) ? body.statusCode : undefined))
+ this.type = type;
+ this.headers = headers;
+ this.redirect = redirect;
+ this.size = size;
+ this.time = Number(_.defaultTo(time, util.timestamp()));
+ this.body = body;
+ }
+
+ injectTo(ctx) {
+ this.redirect && ctx.redirect(this.redirect);
+ this.statusCode && (ctx.status = this.statusCode);
+ this.type && (ctx.type = mime.getType(this.type) || this.type);
+ const headers = this.headers || {};
+ if(this.size && !headers["Content-Length"] && !headers["content-length"])
+ headers["Content-Length"] = this.size;
+ ctx.set(headers);
+ if(Body.isInstance(this.body))
+ ctx.body = this.body.toObject();
+ else
+ ctx.body = this.body;
+ }
+
+ static isInstance(value) {
+ return value instanceof Response;
+ }
+
+}
\ No newline at end of file
diff --git a/src/lib/response/SuccessfulBody.ts b/src/lib/response/SuccessfulBody.ts
new file mode 100644
index 0000000..639d0d8
--- /dev/null
+++ b/src/lib/response/SuccessfulBody.ts
@@ -0,0 +1,19 @@
+import _ from 'lodash';
+
+import Body from './Body.ts';
+
+export default class SuccessfulBody extends Body {
+
+ constructor(data: any, message?: string) {
+ super({
+ code: 0,
+ message: _.defaultTo(message, "OK"),
+ data
+ });
+ }
+
+ static isInstance(value) {
+ return value instanceof SuccessfulBody;
+ }
+
+}
\ No newline at end of file
diff --git a/src/lib/server.ts b/src/lib/server.ts
new file mode 100644
index 0000000..a43acf4
--- /dev/null
+++ b/src/lib/server.ts
@@ -0,0 +1,241 @@
+import Koa from 'koa';
+import KoaRouter from 'koa-router';
+import koaRange from 'koa-range';
+import koaCors from "koa2-cors";
+import koaBody from 'koa-body';
+import _ from 'lodash';
+
+import Exception from './exceptions/Exception.ts';
+import Request from './request/Request.ts';
+import Response from './response/Response.js';
+import FailureBody from './response/FailureBody.ts';
+import EX from './consts/exceptions.ts';
+import logger from './logger.ts';
+import config from './config.ts';
+
+class Server {
+
+ app;
+ router;
+ koaBodyMiddleware;
+
+ constructor() {
+ this.app = new Koa();
+ this.app.use(koaCors());
+ // 范围请求支持
+ this.app.use(koaRange);
+ this.router = new KoaRouter({ prefix: config.service.urlPrefix });
+
+ // 预先创建 koa-body 中间件,支持 multipart 文件上传
+ this.koaBodyMiddleware = koaBody({
+ multipart: true,
+ formidable: {
+ maxFileSize: 100 * 1024 * 1024, // 100MB
+ keepExtensions: true,
+ },
+ formLimit: '100mb',
+ jsonLimit: '100mb',
+ textLimit: '100mb',
+ parsedMethods: ['POST', 'PUT', 'PATCH'],
+ });
+
+ // 前置处理异常拦截
+ this.app.use(async (ctx: any, next: Function) => {
+ if(ctx.request.type === "application/xml" || ctx.request.type === "application/ssml+xml")
+ ctx.req.headers["content-type"] = "text/xml";
+ try { await next() }
+ catch (err) {
+ logger.error(err);
+ const failureBody = new FailureBody(err);
+ new Response(failureBody).injectTo(ctx);
+ }
+ });
+ // 自定义 JSON 解析中间件
+ this.app.use(async (ctx: any, next: Function) => {
+ // 跳过 multipart 请求,让 koa-body 处理
+ if (ctx.is('multipart')) {
+ await next();
+ return;
+ }
+ if (ctx.is('application/json') && ['POST', 'PUT', 'PATCH'].includes(ctx.method)) {
+ logger.debug('开始自定义 JSON 解析');
+ const chunks: Buffer[] = [];
+
+ await new Promise((resolve, reject) => {
+ ctx.req.on('data', (chunk: Buffer) => {
+ chunks.push(chunk);
+ });
+
+ ctx.req.on('end', () => {
+ resolve(null);
+ });
+
+ ctx.req.on('error', reject);
+ });
+
+ const body = Buffer.concat(chunks).toString('utf8');
+
+ // 清理问题字符
+ let cleanedBody = body
+ .replace(/\r\n/g, '\n')
+ .replace(/\r/g, '\n')
+ .replace(/\u00A0/g, ' ')
+ .replace(/[\u2000-\u200B]/g, ' ')
+ .replace(/\uFEFF/g, '')
+ .trim();
+
+ const parsedBody = JSON.parse(cleanedBody);
+
+ logger.debug('JSON 解析成功,跳过 koa-body');
+
+ ctx.request.body = parsedBody;
+ ctx.request.rawBody = cleanedBody;
+
+ // 标记已处理,避免 koa-body 再次处理
+ ctx._jsonProcessed = true;
+ }
+ await next();
+ });
+
+ // 载荷解析器支持(只处理未被自定义解析器处理的请求)
+ this.app.use(async (ctx: any, next: Function) => {
+ if (!ctx._jsonProcessed) {
+ await this.koaBodyMiddleware(ctx, next);
+ } else {
+ await next();
+ }
+ });
+ this.app.on("error", (err: any) => {
+ // 忽略连接重试、中断、管道、取消错误
+ if (["ECONNRESET", "ECONNABORTED", "EPIPE", "ECANCELED"].includes(err.code)) return;
+ logger.error(err);
+ });
+ logger.success("Server initialized");
+ }
+
+ /**
+ * 附加路由
+ *
+ * @param routes 路由列表
+ */
+ attachRoutes(routes: any[]) {
+ routes.forEach((route: any) => {
+ const prefix = route.prefix || "";
+ for (let method in route) {
+ if(method === "prefix") continue;
+ if (!_.isObject(route[method])) {
+ logger.warn(`Router ${prefix} ${method} invalid`);
+ continue;
+ }
+ for (let uri in route[method]) {
+ this.router[method](`${prefix}${uri}`, async ctx => {
+ const { request, response } = await this.#requestProcessing(ctx, route[method][uri]);
+ if(response != null && config.system.requestLog)
+ logger.info(`<- ${request.method} ${request.url} ${response.time - request.time}ms`);
+ });
+ }
+ }
+ logger.info(`Route ${config.service.urlPrefix || ""}${prefix} attached`);
+ });
+ this.app.use(this.router.routes());
+ this.app.use((ctx: any) => {
+ const request = new Request(ctx);
+ logger.debug(`-> ${ctx.request.method} ${ctx.request.url} request is not supported - ${request.remoteIP || "unknown"}`);
+ // const failureBody = new FailureBody(new Exception(EX.SYSTEM_NOT_ROUTE_MATCHING, "Request is not supported"));
+ // const response = new Response(failureBody);
+ const message = `[请求有误]: 正确请求为 POST -> /v1/chat/completions,当前请求为 ${ctx.request.method} -> ${ctx.request.url} 请纠正`;
+ logger.warn(message);
+ const failureBody = new FailureBody(new Error(message));
+ const response = new Response(failureBody);
+ response.injectTo(ctx);
+ if(config.system.requestLog)
+ logger.info(`<- ${request.method} ${request.url} ${response.time - request.time}ms`);
+ });
+ }
+
+ /**
+ * 请求处理
+ *
+ * @param ctx 上下文
+ * @param routeFn 路由方法
+ */
+ #requestProcessing(ctx: any, routeFn: Function): Promise {
+ return new Promise(resolve => {
+ const request = new Request(ctx);
+ try {
+ if(config.system.requestLog)
+ logger.info(`-> ${request.method} ${request.url}`);
+ routeFn(request)
+ .then(response => {
+ try {
+ if(!Response.isInstance(response)) {
+ const _response = new Response(response);
+ _response.injectTo(ctx);
+ return resolve({ request, response: _response });
+ }
+ response.injectTo(ctx);
+ resolve({ request, response });
+ }
+ catch(err) {
+ logger.error(err);
+ const failureBody = new FailureBody(err);
+ const response = new Response(failureBody);
+ response.injectTo(ctx);
+ resolve({ request, response });
+ }
+ })
+ .catch(err => {
+ try {
+ logger.error(err);
+ const failureBody = new FailureBody(err);
+ const response = new Response(failureBody);
+ response.injectTo(ctx);
+ resolve({ request, response });
+ }
+ catch(err) {
+ logger.error(err);
+ const failureBody = new FailureBody(err);
+ const response = new Response(failureBody);
+ response.injectTo(ctx);
+ resolve({ request, response });
+ }
+ });
+ }
+ catch(err) {
+ logger.error(err);
+ const failureBody = new FailureBody(err);
+ const response = new Response(failureBody);
+ response.injectTo(ctx);
+ resolve({ request, response });
+ }
+ });
+ }
+
+ /**
+ * 监听端口
+ */
+ async listen() {
+ const host = config.service.host;
+ const port = config.service.port;
+ await Promise.all([
+ new Promise((resolve, reject) => {
+ if(host === "0.0.0.0" || host === "localhost" || host === "127.0.0.1")
+ return resolve(null);
+ this.app.listen(port, "localhost", err => {
+ if(err) return reject(err);
+ resolve(null);
+ });
+ }),
+ new Promise((resolve, reject) => {
+ this.app.listen(port, host, err => {
+ if(err) return reject(err);
+ resolve(null);
+ });
+ })
+ ]);
+ logger.success(`Server listening on port ${port} (${host})`);
+ }
+
+}
+
+export default new Server();
\ No newline at end of file
diff --git a/src/lib/util.ts b/src/lib/util.ts
new file mode 100644
index 0000000..0f3fd16
--- /dev/null
+++ b/src/lib/util.ts
@@ -0,0 +1,307 @@
+import os from "os";
+import path from "path";
+import crypto from "crypto";
+import { Readable, Writable } from "stream";
+
+import "colors";
+import mime from "mime";
+import axios from "axios";
+import fs from "fs-extra";
+import { v1 as uuid } from "uuid";
+import { format as dateFormat } from "date-fns";
+import CRC32 from "crc-32";
+import randomstring from "randomstring";
+import _ from "lodash";
+import { CronJob } from "cron";
+
+import HTTP_STATUS_CODE from "./http-status-codes.ts";
+
+const autoIdMap = new Map();
+
+const util = {
+ is2DArrays(value: any) {
+ return (
+ _.isArray(value) &&
+ (!value[0] || (_.isArray(value[0]) && _.isArray(value[value.length - 1])))
+ );
+ },
+
+ uuid: (separator = true) => (separator ? uuid() : uuid().replace(/\-/g, "")),
+
+ autoId: (prefix = "") => {
+ let index = autoIdMap.get(prefix);
+ if (index > 999999) index = 0; //超过最大数字则重置为0
+ autoIdMap.set(prefix, (index || 0) + 1);
+ return `${prefix}${index || 1}`;
+ },
+
+ ignoreJSONParse(value: string) {
+ const result = _.attempt(() => JSON.parse(value));
+ if (_.isError(result)) return null;
+ return result;
+ },
+
+ generateRandomString(options: any): string {
+ return randomstring.generate(options);
+ },
+
+ getResponseContentType(value: any): string | null {
+ return value.headers
+ ? value.headers["content-type"] || value.headers["Content-Type"]
+ : null;
+ },
+
+ mimeToExtension(value: string) {
+ let extension = mime.getExtension(value);
+ if (extension == "mpga") return "mp3";
+ return extension;
+ },
+
+ extractURLExtension(value: string) {
+ const extname = path.extname(new URL(value).pathname);
+ return extname.substring(1).toLowerCase();
+ },
+
+ createCronJob(cronPatterns: any, callback?: Function) {
+ if (!_.isFunction(callback))
+ throw new Error("callback must be an Function");
+ return new CronJob(
+ cronPatterns,
+ () => callback(),
+ null,
+ false,
+ "Asia/Shanghai"
+ );
+ },
+
+ getDateString(format = "yyyy-MM-dd", date = new Date()) {
+ return dateFormat(date, format);
+ },
+
+ getIPAddressesByIPv4(): string[] {
+ const interfaces = os.networkInterfaces();
+ const addresses = [];
+ for (let name in interfaces) {
+ const networks = interfaces[name];
+ const results = networks.filter(
+ (network) =>
+ network.family === "IPv4" &&
+ network.address !== "127.0.0.1" &&
+ !network.internal
+ );
+ if (results[0] && results[0].address) addresses.push(results[0].address);
+ }
+ return addresses;
+ },
+
+ getMACAddressesByIPv4(): string[] {
+ const interfaces = os.networkInterfaces();
+ const addresses = [];
+ for (let name in interfaces) {
+ const networks = interfaces[name];
+ const results = networks.filter(
+ (network) =>
+ network.family === "IPv4" &&
+ network.address !== "127.0.0.1" &&
+ !network.internal
+ );
+ if (results[0] && results[0].mac) addresses.push(results[0].mac);
+ }
+ return addresses;
+ },
+
+ generateSSEData(event?: string, data?: string, retry?: number) {
+ return `event: ${event || "message"}\ndata: ${(data || "")
+ .replace(/\n/g, "\\n")
+ .replace(/\s/g, "\\s")}\nretry: ${retry || 3000}\n\n`;
+ },
+
+ buildDataBASE64(type, ext, buffer) {
+ return `data:${type}/${ext.replace("jpg", "jpeg")};base64,${buffer.toString(
+ "base64"
+ )}`;
+ },
+
+ isLinux() {
+ return os.platform() !== "win32";
+ },
+
+ isIPAddress(value) {
+ return (
+ _.isString(value) &&
+ (/^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$/.test(
+ value
+ ) ||
+ /\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*/.test(
+ value
+ ))
+ );
+ },
+
+ isPort(value) {
+ return _.isNumber(value) && value > 0 && value < 65536;
+ },
+
+ isReadStream(value): boolean {
+ return (
+ value &&
+ (value instanceof Readable || "readable" in value || value.readable)
+ );
+ },
+
+ isWriteStream(value): boolean {
+ return (
+ value &&
+ (value instanceof Writable || "writable" in value || value.writable)
+ );
+ },
+
+ isHttpStatusCode(value) {
+ return _.isNumber(value) && Object.values(HTTP_STATUS_CODE).includes(value);
+ },
+
+ isURL(value) {
+ return !_.isUndefined(value) && /^(http|https)/.test(value);
+ },
+
+ isSrc(value) {
+ return !_.isUndefined(value) && /^\/.+\.[0-9a-zA-Z]+(\?.+)?$/.test(value);
+ },
+
+ isBASE64(value) {
+ return !_.isUndefined(value) && /^[a-zA-Z0-9\/\+]+(=?)+$/.test(value);
+ },
+
+ isBASE64Data(value) {
+ return /^data:/.test(value);
+ },
+
+ extractBASE64DataFormat(value): string | null {
+ const match = value.trim().match(/^data:(.+);base64,/);
+ if (!match) return null;
+ return match[1];
+ },
+
+ removeBASE64DataHeader(value): string {
+ return value.replace(/^data:(.+);base64,/, "");
+ },
+
+ isDataString(value): boolean {
+ return /^(base64|json):/.test(value);
+ },
+
+ isStringNumber(value) {
+ return _.isFinite(Number(value));
+ },
+
+ isUnixTimestamp(value) {
+ return /^[0-9]{10}$/.test(`${value}`);
+ },
+
+ isTimestamp(value) {
+ return /^[0-9]{13}$/.test(`${value}`);
+ },
+
+ isEmail(value) {
+ return /^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/.test(
+ value
+ );
+ },
+
+ isAsyncFunction(value) {
+ return Object.prototype.toString.call(value) === "[object AsyncFunction]";
+ },
+
+ async isAPNG(filePath) {
+ let head;
+ const readStream = fs.createReadStream(filePath, { start: 37, end: 40 });
+ const readPromise = new Promise((resolve, reject) => {
+ readStream.once("end", resolve);
+ readStream.once("error", reject);
+ });
+ readStream.once("data", (data) => (head = data));
+ await readPromise;
+ return head.compare(Buffer.from([0x61, 0x63, 0x54, 0x4c])) === 0;
+ },
+
+ unixTimestamp() {
+ return parseInt(`${Date.now() / 1000}`);
+ },
+
+ timestamp() {
+ return Date.now();
+ },
+
+ urlJoin(...values) {
+ let url = "";
+ for (let i = 0; i < values.length; i++)
+ url += `${i > 0 ? "/" : ""}${values[i]
+ .replace(/^\/*/, "")
+ .replace(/\/*$/, "")}`;
+ return url;
+ },
+
+ millisecondsToHmss(milliseconds) {
+ if (_.isString(milliseconds)) return milliseconds;
+ milliseconds = parseInt(milliseconds);
+ const sec = Math.floor(milliseconds / 1000);
+ const hours = Math.floor(sec / 3600);
+ const minutes = Math.floor((sec - hours * 3600) / 60);
+ const seconds = sec - hours * 3600 - minutes * 60;
+ const ms = (milliseconds % 60000) - seconds * 1000;
+ return `${hours > 9 ? hours : "0" + hours}:${
+ minutes > 9 ? minutes : "0" + minutes
+ }:${seconds > 9 ? seconds : "0" + seconds}.${ms}`;
+ },
+
+ millisecondsToTimeString(milliseconds) {
+ if (milliseconds < 1000) return `${milliseconds}ms`;
+ if (milliseconds < 60000)
+ return `${parseFloat((milliseconds / 1000).toFixed(2))}s`;
+ return `${Math.floor(milliseconds / 1000 / 60)}m${Math.floor(
+ (milliseconds / 1000) % 60
+ )}s`;
+ },
+
+ rgbToHex(r, g, b): string {
+ return ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
+ },
+
+ hexToRgb(hex) {
+ const value = parseInt(hex.replace(/^#/, ""), 16);
+ return [(value >> 16) & 255, (value >> 8) & 255, value & 255];
+ },
+
+ md5(value) {
+ return crypto.createHash("md5").update(value).digest("hex");
+ },
+
+ crc32(value) {
+ return _.isBuffer(value) ? CRC32.buf(value) : CRC32.str(value);
+ },
+
+ arrayParse(value): any[] {
+ return _.isArray(value) ? value : [value];
+ },
+
+ booleanParse(value) {
+ return value === "true" || value === true ? true : false;
+ },
+
+ encodeBASE64(value) {
+ return Buffer.from(value).toString("base64");
+ },
+
+ decodeBASE64(value) {
+ return Buffer.from(value, "base64").toString();
+ },
+
+ async fetchFileBASE64(url: string) {
+ const result = await axios.get(url, {
+ responseType: "arraybuffer",
+ });
+ return result.data.toString("base64");
+ },
+};
+
+export default util;
diff --git a/test-seedance-media.py b/test-seedance-media.py
new file mode 100644
index 0000000..c40e5b2
--- /dev/null
+++ b/test-seedance-media.py
@@ -0,0 +1,55 @@
+#!/usr/bin/env python3
+"""Seedance 2.0 测试3: 图片+音频混合上传"""
+
+import sys
+import requests
+
+TOKEN = sys.argv[1] if len(sys.argv) > 1 else "99999"
+BASE_URL = "http://localhost:8000"
+IMAGE_FILE = "/mnt/f/tmp/2026年2月20日/11.png"
+AUDIO_FILE = "/mnt/f/tmp/2026年2月20日/22.wav"
+
+print("=" * 42)
+print(" [测试3] 图片+音频混合上传")
+print("=" * 42)
+print(f"POST {BASE_URL}/v1/videos/generations")
+print(f" model=seedance-2.0-fast")
+print(f" files=11.png (image) + 22.wav (audio)")
+print()
+
+resp = requests.post(
+ f"{BASE_URL}/v1/videos/generations",
+ headers={"Authorization": f"Bearer {TOKEN}"},
+ data={
+ "model": "seedance-2.0-fast",
+ "prompt": "@1 图片中的人物随着音乐 @2 开始跳舞",
+ "ratio": "9:16",
+ "duration": "5",
+ },
+ files=[
+ ("files", ("11.png", open(IMAGE_FILE, "rb"), "image/png")),
+ ("files", ("22.wav", open(AUDIO_FILE, "rb"), "audio/wav")),
+ ],
+)
+
+print(f"HTTP {resp.status_code}")
+print()
+
+if resp.status_code == 200:
+ result = resp.json()
+ print(f"created: {result.get('created', '')}")
+ data = result.get("data", [])
+ if data:
+ for i, item in enumerate(data):
+ url = item.get("url", "")
+ prompt = item.get("revised_prompt", "")
+ print(f"revised_prompt: {prompt}")
+ print()
+ print(f"Video URL:")
+ print(url)
+ else:
+ print("data 为空,未生成视频")
+ print(f"原始响应: {resp.text}")
+else:
+ print(f"请求失败:")
+ print(resp.text)
diff --git a/test-seedance-media.sh b/test-seedance-media.sh
new file mode 100644
index 0000000..97a99b7
--- /dev/null
+++ b/test-seedance-media.sh
@@ -0,0 +1,94 @@
+#!/bin/bash
+# Seedance 2.0 多类型素材(图片+音频)测试脚本
+# 用法: bash test-seedance-media.sh [sessionid]
+
+TOKEN="${1:-99999}"
+BASE_URL="http://localhost:8000"
+IMAGE_FILE="/mnt/f/tmp/2026年2月20日/11.png"
+AUDIO_FILE="/mnt/f/tmp/2026年2月20日/22.wav"
+
+echo "=========================================="
+echo " Seedance 2.0 多类型素材测试"
+echo "=========================================="
+echo ""
+
+# 测试1: 健康检查
+echo "[测试1] 健康检查 /ping"
+echo "------------------------------------------"
+curl -s "${BASE_URL}/ping"
+echo ""
+echo ""
+
+# 测试2: 仅图片(回归测试,验证原有功能不受影响)
+echo "[测试2] 仅图片上传(回归测试)"
+echo "------------------------------------------"
+echo "POST /v1/videos/generations"
+echo " model=seedance-2.0-fast"
+echo " files=11.png (image)"
+echo ""
+curl -v -X POST "${BASE_URL}/v1/videos/generations" \
+ -H "Authorization: Bearer ${TOKEN}" \
+ -F "model=seedance-2.0" \
+ -F "prompt=图片中的场景开始动起来" \
+ -F "ratio=9:16" \
+ -F "duration=4" \
+ -F "files=@${IMAGE_FILE}" \
+ 2>&1
+echo ""
+echo ""
+
+# 测试3: 图片+音频混合上传
+echo "[测试3] 图片+音频混合上传"
+echo "------------------------------------------"
+echo "POST /v1/videos/generations"
+echo " model=seedance-2.0-fast"
+echo " files=11.png (image) + 22.wav (audio)"
+echo ""
+curl -v -X POST "${BASE_URL}/v1/videos/generations" \
+ -H "Authorization: Bearer ${TOKEN}" \
+ -F "model=seedance-2.0-fast" \
+ -F "prompt=@1 图片中的人物随着音乐 @2 开始跳舞" \
+ -F "ratio=9:16" \
+ -F "duration=5" \
+ -F "files=@${IMAGE_FILE}" \
+ -F "files=@${AUDIO_FILE}" \
+ 2>&1
+echo ""
+echo ""
+
+# 测试4: seedance-2.0-fast 图片+音频
+echo "[测试4] seedance-2.0-fast 图片+音频"
+echo "------------------------------------------"
+echo "POST /v1/videos/generations"
+echo " model=seedance-2.0-fast"
+echo " files=11.png (image) + 22.wav (audio)"
+echo ""
+curl -v -X POST "${BASE_URL}/v1/videos/generations" \
+ -H "Authorization: Bearer ${TOKEN}" \
+ -F "model=seedance-2.0-fast" \
+ -F "prompt=@1 配合 @2 的音乐节奏动起来" \
+ -F "ratio=4:3" \
+ -F "duration=5" \
+ -F "files=@${IMAGE_FILE}" \
+ -F "files=@${AUDIO_FILE}" \
+ 2>&1
+echo ""
+echo ""
+
+# 测试5: 仅音频(无图片)
+echo "[测试5] 仅音频上传(预期:音频上传暂未实现的错误)"
+echo "------------------------------------------"
+curl -v -X POST "${BASE_URL}/v1/videos/generations" \
+ -H "Authorization: Bearer ${TOKEN}" \
+ -F "model=seedance-2.0-fast" \
+ -F "prompt=根据音乐生成舞蹈视频" \
+ -F "ratio=9:16" \
+ -F "duration=4" \
+ -F "files=@${AUDIO_FILE}" \
+ 2>&1
+echo ""
+echo ""
+
+echo "=========================================="
+echo " 测试完成"
+echo "=========================================="
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..b6477c3
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,16 @@
+{
+ "compilerOptions": {
+ "baseUrl": ".",
+ "module": "NodeNext",
+ "moduleResolution": "NodeNext",
+ "allowImportingTsExtensions": true,
+ "allowSyntheticDefaultImports": true,
+ "noEmit": true,
+ "paths": {
+ "@/*": ["src/*"]
+ },
+ "outDir": "./dist"
+ },
+ "include": ["src/**/*", "libs.d.ts"],
+ "exclude": ["node_modules", "dist"]
+}
\ No newline at end of file
diff --git a/vercel.json b/vercel.json
new file mode 100644
index 0000000..74f98bc
--- /dev/null
+++ b/vercel.json
@@ -0,0 +1,27 @@
+{
+ "builds": [
+ {
+ "src": "./dist/*.html",
+ "use": "@vercel/static"
+ },
+ {
+ "src": "./dist/index.js",
+ "use": "@vercel/node"
+ }
+ ],
+ "routes": [
+ {
+ "src": "/",
+ "dest": "/dist/welcome.html"
+ },
+ {
+ "src": "/(.*)",
+ "dest": "/dist",
+ "headers": {
+ "Access-Control-Allow-Credentials": "true",
+ "Access-Control-Allow-Methods": "GET,OPTIONS,PATCH,DELETE,POST,PUT",
+ "Access-Control-Allow-Headers": "X-CSRF-Token, X-Requested-With, Accept, Accept-Version, Content-Length, Content-MD5, Content-Type, Date, X-Api-Version, Content-Type, Authorization"
+ }
+ }
+ ]
+}
\ No newline at end of file