MeUtils 2025.3.19.19.13.35__py3-none-any.whl → 2025.3.20.17.3.20__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {MeUtils-2025.3.19.19.13.35.dist-info → MeUtils-2025.3.20.17.3.20.dist-info}/METADATA +265 -265
- {MeUtils-2025.3.19.19.13.35.dist-info → MeUtils-2025.3.20.17.3.20.dist-info}/RECORD +26 -23
- examples/_openaisdk/openai_audio.py +7 -2
- meutils/apis/audio/fish.py +1 -1
- meutils/apis/baidu/bdaitpzs.py +1 -1
- meutils/apis/hunyuan/image_tools.py +1 -1
- meutils/apis/images/eidt.py +22 -12
- meutils/apis/proxy/ips.py +4 -23
- meutils/apis/textin.py +1 -1
- meutils/config_utils/lark_utils/common.py +5 -1
- meutils/data/VERSION +1 -1
- meutils/io/files_utils.py +29 -19
- meutils/llm/check_api.py +3 -1
- meutils/llm/check_utils.py +4 -1
- meutils/llm/completions/chat_gemini.py +51 -1
- meutils/llm/completions/chat_plus.py +22 -14
- meutils/llm/completions/chat_videos.py +95 -0
- meutils/llm/completions/deep2x.py +100 -0
- meutils/llm/completions/openai_gemini.py +13 -0
- meutils/oss/__init__.py +0 -6
- meutils/schemas/openai_types.py +33 -7
- meutils/str_utils/regular_expression.py +4 -0
- {MeUtils-2025.3.19.19.13.35.dist-info → MeUtils-2025.3.20.17.3.20.dist-info}/LICENSE +0 -0
- {MeUtils-2025.3.19.19.13.35.dist-info → MeUtils-2025.3.20.17.3.20.dist-info}/WHEEL +0 -0
- {MeUtils-2025.3.19.19.13.35.dist-info → MeUtils-2025.3.20.17.3.20.dist-info}/entry_points.txt +0 -0
- {MeUtils-2025.3.19.19.13.35.dist-info → MeUtils-2025.3.20.17.3.20.dist-info}/top_level.txt +0 -0
@@ -92,7 +92,7 @@ examples/_openaisdk/kimi_qa.py,sha256=dNBIe01vK7p-8cFnbgVXJ5H3xPSW32-cc0rwZx3K_1
|
|
92
92
|
examples/_openaisdk/minimax.py,sha256=zOshBkL1bHgRlj4z6k2FQRScNTr7ysZkfh2-OaAynkU,2116
|
93
93
|
examples/_openaisdk/open_router.py,sha256=ky_tdPX9CZkq4rAnjaFrOY_bygZuy6V8jIQfh6bq9U0,1497
|
94
94
|
examples/_openaisdk/openai_aiplus.py,sha256=7sT2t4jjZBABFiwKQwUjgdilO8s006NuPAPx7neHER8,1182
|
95
|
-
examples/_openaisdk/openai_audio.py,sha256=
|
95
|
+
examples/_openaisdk/openai_audio.py,sha256=KVJOmPdwD5_6Aa5nttRQLSa824-JKGGyuIyHh2IOl8E,1181
|
96
96
|
examples/_openaisdk/openai_baichuan.py,sha256=-xhHovkFmWOTX25CJjIon0my-ocmwfAZJu1C0eS80Xs,1614
|
97
97
|
examples/_openaisdk/openai_baidu.py,sha256=qnrxP66lY7Qf2jEbFEHrt0FrR5_Aji1AgwSI_46IabY,1969
|
98
98
|
examples/_openaisdk/openai_cache.py,sha256=89GbJ1QlqQbVxlUeuFgEbwDYHOkum7BK0zB-CqmDAZU,726
|
@@ -327,7 +327,7 @@ meutils/apis/kuaidi.py,sha256=4KrtOkbGlsLpyvbY80UMSo03iFqFiBHnE0CiqAWWQ4Y,998
|
|
327
327
|
meutils/apis/llm_qa.py,sha256=XM1VMkOTb4xKzgVk56dPC1e8lg7SbnfobBVgfLXiX9A,1207
|
328
328
|
meutils/apis/niutrans.py,sha256=tWUyGH5SReLBQyVuB7kZvoFB35dsN6gXN-anbiHc_B4,2298
|
329
329
|
meutils/apis/search_music.py,sha256=HBLtdterztrccnLAPZrWBlrYSx4WCRflCqz-V30fOA8,972
|
330
|
-
meutils/apis/textin.py,sha256=
|
330
|
+
meutils/apis/textin.py,sha256=Alodn8U5J1Pty_sv1in_-f3B_G5PDERQRaxOCtH7Xcc,4894
|
331
331
|
meutils/apis/ts.py,sha256=Q13EOS9Q-Y2-KwOG_cFMVmGj9RUmDtxk5A3E27dxbN0,1511
|
332
332
|
meutils/apis/utils.py,sha256=hwIj67IsuI3255l3rDDHmcwUIlRoK_xLnE6iCvqOi74,2045
|
333
333
|
meutils/apis/web_search.py,sha256=6gS3leIB2iyeLtqhB0IbpL_mKzDgArRTqnR7odTWT3E,1035
|
@@ -337,9 +337,9 @@ meutils/apis/aitools/baidu/__init__.py,sha256=4fRDQV9EezQDG4bg-WDaB3jOCr_BcSVChH
|
|
337
337
|
meutils/apis/aitools/baidu/sdk.py,sha256=5uA1bEqwNYpJirFnwoMTI6Jua3r3DlVNr90RffG9rcs,1132
|
338
338
|
meutils/apis/audio/__init__.py,sha256=y7Rpn90LocHhA0ywrDP_fT4QAK7sr4JsIX5wLJgkNHA,241
|
339
339
|
meutils/apis/audio/deepinfra.py,sha256=O-IpAnHfx25QCjhB5xaIYVBy5AbyPzmVz-Pr40gpnsM,1773
|
340
|
-
meutils/apis/audio/fish.py,sha256=
|
340
|
+
meutils/apis/audio/fish.py,sha256=jPvTveRcDtvGDgRT6EA9WJitAQxftneHxvEJ63yY_cM,8392
|
341
341
|
meutils/apis/baidu/__init__.py,sha256=XPkz3DHrDdxCneaZct3y7MaX0Aw9IIseOYOn1YuVBII,243
|
342
|
-
meutils/apis/baidu/bdaitpzs.py,sha256=
|
342
|
+
meutils/apis/baidu/bdaitpzs.py,sha256=JuBTTSm0AyD1I_N7xj-s0iOGOwCw-cUF2OthLR3rFGE,12826
|
343
343
|
meutils/apis/baidu/test.py,sha256=nb9ivelHIw84-d1V-MNGRpGoTpLFsNXPk-TTKpjwOfQ,2058
|
344
344
|
meutils/apis/chatglm/__init__.py,sha256=uFuc9qY-ZjGqbsfcdGZkcEkhjATojWpzk2WXTTujc70,271
|
345
345
|
meutils/apis/chatglm/glm_video.py,sha256=9LA9pyeIcDDHXGhJbZSJfjxrLeNC3SIuCKJwDIXRKR8,14015
|
@@ -374,12 +374,12 @@ meutils/apis/hf/r.py,sha256=jvD0WBM5dEZGG4rfdGZnUIh2W9sv-fqTFo-8ouLea60,1272
|
|
374
374
|
meutils/apis/hf/x.py,sha256=QYLiTlTZk1b0wczGHeJMjQABQUQmI_Wk45gbCcCAdIc,862
|
375
375
|
meutils/apis/hf/证件照.py,sha256=NVfFp-wO1YCpvf7ClInK-jVJO9atZuk9VN93GrPohoc,1262
|
376
376
|
meutils/apis/hunyuan/__init__.py,sha256=vJg28p4USaiGt3vAPKurjuxTPtk_LdmThw3cNc48vpI,272
|
377
|
-
meutils/apis/hunyuan/image_tools.py,sha256=
|
377
|
+
meutils/apis/hunyuan/image_tools.py,sha256=SYovMKvv0QCPAYnIPqpDfXyVSOvyEuFlNNCA1nJ2RcU,4692
|
378
378
|
meutils/apis/images/__init__.py,sha256=hs7HUJZvw_3DAtoapPnbZsEb4ng1p0a6fJGFFWwUcUk,272
|
379
379
|
meutils/apis/images/deepinfra.py,sha256=lMqfU0LIXEzHiAS31dCcoTnPIE6tpoDJhq61H0TVJPg,3219
|
380
380
|
meutils/apis/images/demo.py,sha256=Cjk-EKMKbp44czykW_44qR0TzElX8nNCALqXBBw5sJA,4405
|
381
381
|
meutils/apis/images/edits.py,sha256=vyX5AEZcNvLHB4fXWo2PdviNv0jMMO34e1k-IbedjO0,9935
|
382
|
-
meutils/apis/images/eidt.py,sha256=
|
382
|
+
meutils/apis/images/eidt.py,sha256=s8IBbCjwwoogIUf-d2O7nkawUmly9n19nvLYPaLEeg4,1217
|
383
383
|
meutils/apis/images/recraft.py,sha256=WG__BYqTaImMFQPxDHp_l90RkonOU2aI_paAO6bRtEc,64911
|
384
384
|
meutils/apis/images/flux/__init__.py,sha256=W_PZabQm6EmtJYmzEiEpL_WCXTAW0AiJ-t_n5UTrE8c,271
|
385
385
|
meutils/apis/images/flux/fluxpro.py,sha256=NFl9t9C3R3jsNJpez4o9tOz3r-fjRXj-vKMxCSTRDTU,4022
|
@@ -432,7 +432,7 @@ meutils/apis/oneapi/utils.py,sha256=p7zI7QYPqTaVHjk4jLJxb6EsLDNQQ6DVp_wZTgE8d2Y,
|
|
432
432
|
meutils/apis/pixverse/__init__.py,sha256=WiboEUfJ_3Hs2WI3OymEspx8_ZSTgMglxTJd97Qk7qo,271
|
433
433
|
meutils/apis/pixverse/pixverse.py,sha256=dvnyYVUXCEY_cLnmX9lvq9TesvplCMCuJmmP7ShchQk,5534
|
434
434
|
meutils/apis/proxy/__init__.py,sha256=by7_6GT3xeDjAWLLqbw8uvGaZ3RdprEW-zJ2DFLOdwA,271
|
435
|
-
meutils/apis/proxy/ips.py,sha256=
|
435
|
+
meutils/apis/proxy/ips.py,sha256=JqW7f2eWKmykfDYNBXUccw9QIloK91F4zfphERbYT2o,5090
|
436
436
|
meutils/apis/remini/__init__.py,sha256=8TbAnbI_bDfH8g0Y9EHXHBum7C0rZt9MzgAAz_MbAeI,271
|
437
437
|
meutils/apis/remini/remini.py,sha256=bJjvtqrCNlAu7No4gYGjoWAM0ch6dCsofYSy2jPZrXg,4239
|
438
438
|
meutils/apis/replicateai/__init__.py,sha256=PK7e7-xhn5aj5WOyGHLzpsHQvpeM5uTOiMylvj40ZmU,272
|
@@ -526,12 +526,12 @@ meutils/cmds/subprocess_demo.py,sha256=oTeTIx8k6XwtOT6hZpmy9XNcRErzilqWcdoxcrVcH
|
|
526
526
|
meutils/config_utils/__init__.py,sha256=GhgsStfGJDC8F_YgC6X5Jnj9HkgXJXxeYiJWTAkWKTo,271
|
527
527
|
meutils/config_utils/manager.py,sha256=du-8e9Zdgnrn9e0b4GPR6FGtuQY7DLWNJqgkoU0TZ48,3147
|
528
528
|
meutils/config_utils/lark_utils/__init__.py,sha256=Gf-5Y8uZiqY9jdbfiIboL92MQjOTOo0ZZ245PGxCbaY,297
|
529
|
-
meutils/config_utils/lark_utils/common.py,sha256=
|
529
|
+
meutils/config_utils/lark_utils/common.py,sha256=ksNs7adou8rbL5AzI6dBbDLu3bnpF6pv-hPvNKyn7vg,14501
|
530
530
|
meutils/config_utils/lark_utils/demo.py,sha256=3g0Fs7oLaeW75T60gYWMLgyNg1OnfOjfHOno5NxNAio,293
|
531
531
|
meutils/config_utils/lark_utils/x.py,sha256=MlMQGhehP9xMEgetxVCX68XFaosfKoW1JA5cZ3JqN2w,1857
|
532
532
|
meutils/crawlers/__init__.py,sha256=TBU4xA-IOsHV-0yIkW7YXxn_QT7TT8NncqxO7IykEfs,271
|
533
533
|
meutils/data/SimHei.ttf,sha256=-XEnekS5yHP_URkT4XBI2w22ylV-KxudhkeIYFbrILA,10062565
|
534
|
-
meutils/data/VERSION,sha256=
|
534
|
+
meutils/data/VERSION,sha256=lyrjjsX_hhcujVr2zABVP2vhVdNayBQ2n2NpX14jq1c,19
|
535
535
|
meutils/data/_FLAG,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
536
536
|
meutils/data/_SUCCESS,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
537
537
|
meutils/data/__init__.py,sha256=Hfwkkxs4zHqKhxht0YrhS566a9P5axtmgNvM5wF8ceQ,243
|
@@ -578,7 +578,7 @@ meutils/init/evn.py,sha256=GPw9Un8YbgYJmjwd-uYWQ8JeVr6pRxwyYbDv3W8fb1s,1588
|
|
578
578
|
meutils/init/oo.py,sha256=jXWaCWWFYVPGgTIas47Z3J7sIq-CD7DyK6fKDBsq8GA,12884
|
579
579
|
meutils/io/__init__.py,sha256=uW43ZfdWu7adRvwvcTzUGtn4CseRmbzEJdlZV-oqHEA,2107
|
580
580
|
meutils/io/_openai_files.py,sha256=UIiu6Zg7iSFIn1xIcpLznFlnfCxAJFGuvuPtxvTNHfI,1005
|
581
|
-
meutils/io/files_utils.py,sha256=
|
581
|
+
meutils/io/files_utils.py,sha256=WrLVGR0zFueyQKJs8dkPk6h4FoNvU0UfPs-2ujUFXGc,8030
|
582
582
|
meutils/io/image.py,sha256=BJmYzx7o66X7C32gOfVmfr5tBRXOi0IYQY7BpGLsGrg,6926
|
583
583
|
meutils/io/minio_utils.py,sha256=i1YuxwDJzLse0smMXuPqnD1wirBBb8psmB_kd1oPoVU,1274
|
584
584
|
meutils/io/openai_files.py,sha256=wJ-N03Ip4QCyh10uwWEQuqnbvZEys9hEP4ABLybR_DI,5474
|
@@ -612,22 +612,25 @@ meutils/io/parsers/fileparser/filetype/types/video.py,sha256=DfkFd5ofnEK25r_n71L
|
|
612
612
|
meutils/jwt_utils/__init__.py,sha256=hU1CYBK90Q9QKVrf1s6VFKZwWjHioHa6bO2AuDn7_eo,272
|
613
613
|
meutils/jwt_utils/common.py,sha256=MlWDLtxiF-WeRl3oyK94KIa6BKFIXVeJtaQUnpa9ayo,814
|
614
614
|
meutils/llm/__init__.py,sha256=mYv0QpACLd-wz4htIduPuTU3mX06_Y8ZprxDohtZGBM,244
|
615
|
-
meutils/llm/check_api.py,sha256=
|
616
|
-
meutils/llm/check_utils.py,sha256=
|
615
|
+
meutils/llm/check_api.py,sha256=Cu60Rvp7zLmmazuLXxpK4z-FCab4NrO4nH5LzfYjjoM,3591
|
616
|
+
meutils/llm/check_utils.py,sha256=OMRrUrPaIVuXODi-3TCaW5C-XFyq8sE0FDiLvCVpvcM,4917
|
617
617
|
meutils/llm/clients.py,sha256=h-KHaHhzAjE1paW1tHX_LbCi9bfWmkub8NyV6ctsB08,2523
|
618
618
|
meutils/llm/demo.py,sha256=gyGjTxuNFMOa1X4CXaChkq0lcjbKiRsnSRhkeMvsoQk,3822
|
619
619
|
meutils/llm/mappers.py,sha256=ZQLl3OuD06kVMP8bwIpVgAB1UVzMJWUJiZ3vgk-ZjeI,303
|
620
620
|
meutils/llm/utils.py,sha256=4u3b8VO3wX3xKny1AdV4579qXux1YA4k5gI-CYPtx0o,4279
|
621
621
|
meutils/llm/x.py,sha256=ETvKKDTmDNrik0K2-_a_SEQxyV4X4-fy0JPrAOLNPv4,1732
|
622
622
|
meutils/llm/completions/__init__.py,sha256=q5FEYPpo2f_P44Ghdh9fkrmqZLX2Asso8p-nf-ZTqks,244
|
623
|
-
meutils/llm/completions/chat_gemini.py,sha256=
|
624
|
-
meutils/llm/completions/chat_plus.py,sha256=
|
623
|
+
meutils/llm/completions/chat_gemini.py,sha256=AqNaoDRbfDVCv2Q8xyqJuuGCz6ndBKTueSzsnM4tEDs,3862
|
624
|
+
meutils/llm/completions/chat_plus.py,sha256=mZIAAZ0r_uJeOWRAcidVhuFFuWORB7J2D_BnX1GpKE0,7142
|
625
625
|
meutils/llm/completions/chat_spark.py,sha256=WKXRSCj4Uive95pgPDXcJpQT0tTL0TgFIRY6AQZbYl0,9529
|
626
|
+
meutils/llm/completions/chat_videos.py,sha256=P3Yz34dkNlxCxzOuKHJ9pHIA4UXK3Y5RXPzVnQjb9rc,2915
|
626
627
|
meutils/llm/completions/cp.py,sha256=tGf3umHKXDH0KuTfN7BLr8yAvN6MYWLYR5UVaJkJs0c,4172
|
628
|
+
meutils/llm/completions/deep2x.py,sha256=v3L5GJMsG0qY67W23o1sXo3N8lB8AetI3mzu_-pGuyI,3331
|
627
629
|
meutils/llm/completions/delilegal.py,sha256=mr53ps7I33SC8Fjy4rma-xoNF-mLgwdZfHgdSOyLtQY,5131
|
628
630
|
meutils/llm/completions/dify.py,sha256=dqL_8uxAp2d8M00pkyh2I30tflwi4pUyX-V6pwe3_BA,3048
|
629
631
|
meutils/llm/completions/kimi.py,sha256=TSkLObebIAb_oivOMq3aKx9qoXcMy611_g2yIKex9eo,1541
|
630
632
|
meutils/llm/completions/modelscope.py,sha256=umPlJuHSL2RR0oNdTIAqts8iqEmGp_MR6Vh49g-UZuc,271
|
633
|
+
meutils/llm/completions/openai_gemini.py,sha256=5MwyXkWScE8tRKj6nU7YEhyRCT_ndA8cYjqDJUXfPBw,325
|
631
634
|
meutils/llm/completions/qwenllm.py,sha256=9fTIqtdS4ahPcNqi61YQspVnV2AZlfNU9wiq65QaMpo,10421
|
632
635
|
meutils/llm/completions/rag.py,sha256=cpQ1aZX2QI1QDfFpODTxWHPYglK6_3qrlUM_KHLBNhc,1112
|
633
636
|
meutils/llm/completions/reasoner.py,sha256=rPIxW1iuvLuGhcOa6PkfcJmrTKtJV-8wRKfA09X09tg,6169
|
@@ -672,7 +675,7 @@ meutils/office_automation/pdf.py,sha256=B8ScuLpqLwVOm4iIaUWGkyQDtJtwEXdmxZHJrbIj
|
|
672
675
|
meutils/office_automation/pdm.py,sha256=AFKdLd80v0XJThs6toigSdzaW1xT02VdqbDtUWBxdGo,11894
|
673
676
|
meutils/office_automation/pdm_run.py,sha256=GF4VlAXDFQ6oGTrWsLqF4YvrbINhL9Ei8A59cYDeriE,13502
|
674
677
|
meutils/office_automation/report/__init__.py,sha256=llPWtGZdUcsw__Eym2FLOVh4Bew5PgPUDfuKS2s1RMA,244
|
675
|
-
meutils/oss/__init__.py,sha256=
|
678
|
+
meutils/oss/__init__.py,sha256=CdZLxZtw_3aWFrajRu2D_PhVRvnwgtFyvbY4yAbTGuo,248
|
676
679
|
meutils/oss/minio_oss.py,sha256=CqDbQzSp9zaQp_AAyRswof8_q9rybweZAPRlX53T-lg,6438
|
677
680
|
meutils/oss/minio_utils.py,sha256=e0Vg7i4ncgB6PAs1rJt209jHWzrufkout_PUmb8UWlM,1298
|
678
681
|
meutils/other/__demo.py,sha256=-cAInEF7G_JbOp3v8UHHwQpSrzPk0zqz4XoFnJ81Ixs,979
|
@@ -763,7 +766,7 @@ meutils/schemas/metaso_types.py,sha256=r_X0Exs_2S3rNS71RneemMpz7EvBIOLBfAMmWMQRn
|
|
763
766
|
meutils/schemas/napkin_types.py,sha256=Kp0MbpRxzMBz4HWW4DrfcgOvHZVEF3N7P5yNeC1XGI4,2664
|
764
767
|
meutils/schemas/ocr_types.py,sha256=fZWYQAKii7HaTlSU9DS0wHyiEoOHuLnhvgoiH4Cn498,1381
|
765
768
|
meutils/schemas/openai_api_protocol.py,sha256=0GhmhUTEr54N_XCVuZI1MSxJldvwMNJjUAAAdWznw58,12716
|
766
|
-
meutils/schemas/openai_types.py,sha256=
|
769
|
+
meutils/schemas/openai_types.py,sha256=v9Vk66A7Efco3_-yQimo1gSUecwjxD6Yr5zE09nCx8U,21383
|
767
770
|
meutils/schemas/pixverse_types.py,sha256=3mHg2KxvszV1U8K3GdzsODZz4uocLVRjEeJgYhX0Xmw,2347
|
768
771
|
meutils/schemas/playwright_types.py,sha256=zhZd53m1Wg4zlGtq2JM4z7Aon-u_eF6rzs-_TFYWvkU,1177
|
769
772
|
meutils/schemas/prodia_types.py,sha256=knh_lzAxMfWMoqAPmvyMweay9PmQmsoQ1X6Mj17ohWg,476
|
@@ -840,7 +843,7 @@ meutils/settings/demo.py,sha256=Ht3t6LREQsKa5W2owNrOZNAoZfS-zItIFNwGhhPj-4k,484
|
|
840
843
|
meutils/str_utils/Translator.py,sha256=tfvNQIeVCqmX9yW6jobeibDHG6X-XecSSAx9kJIFFyw,1258
|
841
844
|
meutils/str_utils/__init__.py,sha256=BzTEbffNPWoJxEgjaRyGIWBxb9FxxlNesOUb7anJRGw,7215
|
842
845
|
meutils/str_utils/json_utils.py,sha256=OXilMxLDtoFq5DAo3mHrIGx3GTOqHARgkcq8-gVYELM,1913
|
843
|
-
meutils/str_utils/regular_expression.py,sha256=
|
846
|
+
meutils/str_utils/regular_expression.py,sha256=yDinNxZTicBdm8lcOlco3OsSkf4mDSKKDBMlCtjO0eo,5163
|
844
847
|
meutils/str_utils/__translater/__init__.py,sha256=mtDbKL_Qdkeq5VPVO1M4ejf9H8PzKM5h7iepqkBG8N0,277
|
845
848
|
meutils/str_utils/__translater/tencent.py,sha256=1E_56l6-A49Yuz2ZrMKxt-QJfcf0xDYN2X0dg58Dytk,1408
|
846
849
|
meutils/str_utils/__translater/translater.py,sha256=A_9NLVvkjzPd9omIcJGhux21D-gcCxemyrZ7o6uGx_Q,1238
|
@@ -914,9 +917,9 @@ meutils/tools/seize.py,sha256=nOKAS63w-Lbi48I0m2MPhdsokUTwxco0laPxYVmW4Mw,1064
|
|
914
917
|
meutils/tools/service_monitor.py,sha256=ibsLtBN2g2DL7ZnLJ8vhiZOiOcqTAyx711djDdBK-3M,1255
|
915
918
|
meutils/tools/sys_monitor.py,sha256=6MoyzrItqDUOSjfHcMJmMofQkEPTW36CT_aKui0rg84,429
|
916
919
|
meutils/tools/token_monitor.py,sha256=Np-YK-R4P4IPAXyZvMxwvXI4sFmNJQAQK1lSegNaYpA,997
|
917
|
-
MeUtils-2025.3.
|
918
|
-
MeUtils-2025.3.
|
919
|
-
MeUtils-2025.3.
|
920
|
-
MeUtils-2025.3.
|
921
|
-
MeUtils-2025.3.
|
922
|
-
MeUtils-2025.3.
|
920
|
+
MeUtils-2025.3.20.17.3.20.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
921
|
+
MeUtils-2025.3.20.17.3.20.dist-info/METADATA,sha256=UpKGInStBbGW9Uh8cb1uHxfGCHd1wNn4NoGMk5qMNXI,32833
|
922
|
+
MeUtils-2025.3.20.17.3.20.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
|
923
|
+
MeUtils-2025.3.20.17.3.20.dist-info/entry_points.txt,sha256=lufZlBHRqqZKdY-ZQJ4CSZb0qhV5hQC37egZna9M7ug,357
|
924
|
+
MeUtils-2025.3.20.17.3.20.dist-info/top_level.txt,sha256=cInfxMmkgNOskurdjwP5unau4rA7Uw48nu07tYhS7KY,22
|
925
|
+
MeUtils-2025.3.20.17.3.20.dist-info/RECORD,,
|
@@ -7,6 +7,8 @@
|
|
7
7
|
# @WeChat : meutils
|
8
8
|
# @Software : PyCharm
|
9
9
|
# @Description :
|
10
|
+
import os
|
11
|
+
|
10
12
|
from openai import OpenAI
|
11
13
|
from meutils.pipe import *
|
12
14
|
|
@@ -28,12 +30,15 @@ text = """
|
|
28
30
|
“至简”:简约简朴、脚踏实地、知行合一
|
29
31
|
"""
|
30
32
|
r = OpenAI(
|
31
|
-
# base_url=
|
33
|
+
# base_url="https://go.sbgpt.site/v1",
|
34
|
+
# api_key="sk-PyICIMVRnckfQFjCTvnWjiFxpwYQvQmlwgw4EktV73tSkvXG",
|
35
|
+
|
36
|
+
api_key=os.getenv("OPENAI_API_KEY_OPENAI") + "-2738"
|
32
37
|
).audio.speech.create(input=text,
|
33
38
|
model='tts-1',
|
34
39
|
# model=model,
|
35
40
|
# voice="1"
|
36
|
-
voice="alloy"
|
41
|
+
voice="alloy"
|
37
42
|
)
|
38
43
|
|
39
44
|
r.stream_to_file('nesc.mp3')
|
meutils/apis/audio/fish.py
CHANGED
@@ -15,7 +15,7 @@ import shortuuid
|
|
15
15
|
from fish_audio_sdk import Session, TTSRequest, ASRRequest
|
16
16
|
|
17
17
|
from meutils.pipe import *
|
18
|
-
from meutils.io.files_utils import to_url
|
18
|
+
from meutils.io.files_utils import to_url_fal as to_url
|
19
19
|
|
20
20
|
from meutils.config_utils.lark_utils import get_next_token_for_polling
|
21
21
|
from meutils.notice.feishu import send_message as _send_message
|
meutils/apis/baidu/bdaitpzs.py
CHANGED
@@ -20,7 +20,7 @@ from meutils.decorators.contextmanagers import try_catcher
|
|
20
20
|
from meutils.schemas.baidu_types import BDAITPZSRequest
|
21
21
|
from meutils.schemas.task_types import Task, TaskType
|
22
22
|
from meutils.io.image import image_to_base64, crop_polygon
|
23
|
-
from meutils.io.files_utils import
|
23
|
+
from meutils.io.files_utils import to_bytes, to_base64, to_url_fal as to_url, to_url_fal
|
24
24
|
from meutils.apis.proxy.ips import get_one_proxy
|
25
25
|
from fake_useragent import UserAgent
|
26
26
|
|
@@ -15,7 +15,7 @@ from meutils.schemas.yuanbao_types import FEISHU_URL, YUANBAO_BASE_URL
|
|
15
15
|
from meutils.schemas.image_types import HunyuanImageProcessRequest
|
16
16
|
|
17
17
|
from meutils.config_utils.lark_utils import get_next_token_for_polling
|
18
|
-
from meutils.io.files_utils import to_url
|
18
|
+
from meutils.io.files_utils import to_url_fal as to_url
|
19
19
|
from meutils.notice.feishu import send_message
|
20
20
|
|
21
21
|
|
meutils/apis/images/eidt.py
CHANGED
@@ -10,27 +10,37 @@
|
|
10
10
|
|
11
11
|
from meutils.pipe import *
|
12
12
|
|
13
|
-
|
14
13
|
from meutils.pipe import *
|
14
|
+
from meutils.io.files_utils import to_url_fal
|
15
15
|
|
16
16
|
from openai import OpenAI
|
17
17
|
|
18
18
|
client = OpenAI(
|
19
|
-
base_url="https://ai.gitee.com/v1",
|
20
|
-
api_key="WPCSA3ZYD8KBQQ2ZKTAPVUA059J2Q47TLWGB2ZMQ",
|
21
|
-
default_headers={"X-Failover-Enabled": "true", "X-Package": "1910"},
|
19
|
+
# base_url="https://ai.gitee.com/v1",
|
20
|
+
# api_key="WPCSA3ZYD8KBQQ2ZKTAPVUA059J2Q47TLWGB2ZMQ",
|
21
|
+
# default_headers={"X-Failover-Enabled": "true", "X-Package": "1910"},
|
22
|
+
|
22
23
|
)
|
23
24
|
|
25
|
+
"https://api.aiguoguo199.com/v1/images/generations"
|
26
|
+
# client = OpenAI(
|
27
|
+
# base_url="https://ai.gitee.com/v1",
|
28
|
+
# api_key="WPCSA3ZYD8KBQQ2ZKTAPVUA059J2Q47TLWGB2ZMQ",
|
29
|
+
# default_headers={"X-Failover-Enabled": "true", "X-Package": "1910"},
|
30
|
+
# )
|
24
31
|
response = client.images.edit(
|
25
|
-
model="Kolors",
|
32
|
+
# model="Kolors",
|
33
|
+
model="gemini-2.0-flash-exp-image-generation",
|
26
34
|
prompt="笑起来",
|
27
35
|
size="1024x1024",
|
28
|
-
extra_body={
|
29
|
-
|
30
|
-
|
31
|
-
},
|
32
|
-
|
33
|
-
mask=open("test.png", "rb"),
|
36
|
+
# extra_body={
|
37
|
+
# "steps": 25,
|
38
|
+
# "guidance_scale": 6,
|
39
|
+
# },
|
34
40
|
|
41
|
+
# mask=open("test.png", "rb"),
|
35
42
|
image=open("test.png", "rb"),
|
36
|
-
)
|
43
|
+
)
|
44
|
+
|
45
|
+
if __name__ == '__main__':
|
46
|
+
arun(to_url_fal(response.data[0].b64_json, content_type="image/png"))
|
meutils/apis/proxy/ips.py
CHANGED
@@ -118,25 +118,9 @@ async def get_proxies(request_type: str = "httpx", **kwargs):
|
|
118
118
|
return proxies
|
119
119
|
|
120
120
|
|
121
|
-
async def check_proxy(
|
122
|
-
"""
|
123
|
-
{
|
124
|
-
"origin": "125.106.86.83"
|
125
|
-
}
|
126
|
-
|
127
|
-
:param proxies:
|
128
|
-
:return:
|
129
|
-
"""
|
130
|
-
_proxies = proxies.copy()
|
131
|
-
|
132
|
-
if 'http://' not in _proxies:
|
133
|
-
_proxies = {
|
134
|
-
"http://": proxies['http://'],
|
135
|
-
"https://": proxies['https://'],
|
136
|
-
}
|
137
|
-
|
121
|
+
async def check_proxy(proxy):
|
138
122
|
try:
|
139
|
-
async with httpx.AsyncClient(
|
123
|
+
async with httpx.AsyncClient(proxy=proxy) as client:
|
140
124
|
response = await client.get("http://icanhazip.com", timeout=5) # http://httpbin.org/ip
|
141
125
|
logger.debug(response.status_code)
|
142
126
|
logger.debug(response.text)
|
@@ -164,12 +148,9 @@ if __name__ == '__main__':
|
|
164
148
|
ip = "http://154.9.252.28:38443"
|
165
149
|
ip = "http://110.42.51.223:38443"
|
166
150
|
ip = "http://154.40.54.76:38443"
|
151
|
+
proxy = "http://120.26.134.112:22443"
|
167
152
|
|
168
|
-
|
169
|
-
|
170
|
-
# print(proxies)
|
171
|
-
|
172
|
-
# arun(check_proxy(proxies))
|
153
|
+
# arun(check_proxy(proxy))
|
173
154
|
|
174
155
|
arun(get_one_proxy())
|
175
156
|
|
meutils/apis/textin.py
CHANGED
@@ -14,7 +14,7 @@
|
|
14
14
|
from meutils.pipe import *
|
15
15
|
from meutils.decorators.retry import retrying
|
16
16
|
from meutils.notice.feishu import send_message
|
17
|
-
from meutils.io.files_utils import to_url
|
17
|
+
from meutils.io.files_utils import to_url_fal as to_url
|
18
18
|
from meutils.apis.proxy.ips import get_one_proxy
|
19
19
|
|
20
20
|
from fake_useragent import UserAgent
|
@@ -48,7 +48,11 @@ async def aget_app_access_token():
|
|
48
48
|
"app_id": os.getenv("FEISHU_APP_ID"),
|
49
49
|
"app_secret": os.getenv("FEISHU_APP_SECRET")
|
50
50
|
}
|
51
|
-
|
51
|
+
logger.debug(payload)
|
52
|
+
kwargs = {
|
53
|
+
"proxy": np.random.choice(["http://110.42.51.223:38443", None])
|
54
|
+
}
|
55
|
+
async with httpx.AsyncClient(base_url=FEISHU_BASE_URL, timeout=30, **kwargs) as client:
|
52
56
|
response = await client.post("/auth/v3/app_access_token/internal", json=payload)
|
53
57
|
|
54
58
|
return response.is_success and response.json().get("app_access_token") # False / None
|
meutils/data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2025.03.
|
1
|
+
2025.03.20.17.03.20
|
meutils/io/files_utils.py
CHANGED
@@ -9,6 +9,9 @@
|
|
9
9
|
# @Description :
|
10
10
|
|
11
11
|
import mimetypes
|
12
|
+
|
13
|
+
import shortuuid
|
14
|
+
|
12
15
|
from meutils.pipe import *
|
13
16
|
from meutils.decorators.retry import retrying
|
14
17
|
from meutils.caches.redis_cache import cache
|
@@ -111,7 +114,7 @@ async def to_url_fal(
|
|
111
114
|
headers: Optional[dict] = None,
|
112
115
|
content_type: str = "application/octet-stream",
|
113
116
|
):
|
114
|
-
"""对象存储"""
|
117
|
+
"""对象存储 todo: minio"""
|
115
118
|
if isinstance(file, list):
|
116
119
|
tasks = [to_url_fal(_, filename, headers, content_type) for _ in file]
|
117
120
|
urls = await asyncio.gather(*tasks)
|
@@ -139,22 +142,14 @@ async def to_url(
|
|
139
142
|
file: Union[UploadFile, str, bytes],
|
140
143
|
filename: Optional[str] = None,
|
141
144
|
headers: Optional[dict] = None,
|
142
|
-
content_type: Optional[str] = "image
|
145
|
+
content_type: Optional[str] = "image/png" # todo: 适配 mime_type = "application/octet-stream"
|
143
146
|
):
|
144
147
|
"""对象存储"""
|
145
148
|
if not file: return
|
146
149
|
|
147
150
|
from openai.types.file_object import FileObject
|
148
151
|
from meutils.oss.minio_oss import Minio
|
149
|
-
uploads = [partial(Minio().put_object_for_openai, filename=filename)]
|
150
|
-
|
151
|
-
if len(file) < 1024 and isinstance(file, str) or filename: # 不指定就自行判断 url
|
152
|
-
content_type = mimetypes.guess_type(filename)[0] or mimetypes.guess_type(file)[0] or content_type
|
153
|
-
|
154
|
-
if content_type and content_type.startswith("image"):
|
155
|
-
from meutils.apis.chatglm.glm_video import upload_task as glm_upload
|
156
|
-
|
157
|
-
uploads = [glm_upload, ] + uploads
|
152
|
+
uploads = [partial(Minio().put_object_for_openai, filename=filename, content_type=content_type)]
|
158
153
|
|
159
154
|
for upload in uploads:
|
160
155
|
try:
|
@@ -199,6 +194,17 @@ async def to_file(file: Union[UploadFile, str, bytes], filename: Optional[str] =
|
|
199
194
|
return Path(filename).resolve()
|
200
195
|
|
201
196
|
|
197
|
+
async def markdown_base64_to_url(text, pattern=r'!\[Image_\d+\]\((.+?)\)'):
|
198
|
+
base64_strings = re.findall(pattern, text)
|
199
|
+
|
200
|
+
tasks = [to_url(base64_string, filename=f"{shortuuid.random()}.png") for base64_string in base64_strings]
|
201
|
+
urls = await asyncio.gather(*tasks)
|
202
|
+
|
203
|
+
for base64_string, url in zip(base64_strings, urls):
|
204
|
+
text = text.replace(base64_string, url)
|
205
|
+
return text
|
206
|
+
|
207
|
+
|
202
208
|
if __name__ == '__main__':
|
203
209
|
# import tempfile
|
204
210
|
#
|
@@ -226,14 +232,14 @@ if __name__ == '__main__':
|
|
226
232
|
|
227
233
|
# arun(to_url_fal([file] * 1))
|
228
234
|
|
229
|
-
print(mimetypes.guess_type("http://url"))
|
230
|
-
print(mimetypes.guess_type("http://url.pdf"))
|
231
|
-
print(mimetypes.guess_type("http://url.php"))
|
232
|
-
|
233
|
-
print(mimetypes.guess_type("xx.txt"))
|
234
|
-
print(mimetypes.guess_type("xx.html"))
|
235
|
-
print(mimetypes.guess_type("xx.mp3"))
|
236
|
-
print(mimetypes.guess_type("xx.mp4"))
|
235
|
+
# print(mimetypes.guess_type("http://url"))
|
236
|
+
# print(mimetypes.guess_type("http://url.pdf"))
|
237
|
+
# print(mimetypes.guess_type("http://url.php"))
|
238
|
+
#
|
239
|
+
# print(mimetypes.guess_type("xx.txt"))
|
240
|
+
# print(mimetypes.guess_type("xx.html"))
|
241
|
+
# print(mimetypes.guess_type("xx.mp3"))
|
242
|
+
# print(mimetypes.guess_type("xx.mp4"))
|
237
243
|
|
238
244
|
# print(guess_mime_type("http://url")) # application # msword
|
239
245
|
|
@@ -251,3 +257,7 @@ if __name__ == '__main__':
|
|
251
257
|
|
252
258
|
# arun(to_url_fal(url))
|
253
259
|
# print(guess_mime_type("base64xxxxxxxxxxxxxxxxxx.png"))
|
260
|
+
|
261
|
+
# arun(to_url(Path('img_1.png').read_bytes()))
|
262
|
+
|
263
|
+
arun(markdown_base64_to_url(""))
|
meutils/llm/check_api.py
CHANGED
meutils/llm/check_utils.py
CHANGED
@@ -146,4 +146,7 @@ if __name__ == '__main__':
|
|
146
146
|
|
147
147
|
# arun(check_token_for_jina(["jina_c8da77fed9704d558c8def39837960edplTLkNYrsPTJHBF1HcYg_RkRVh0X"]*10))
|
148
148
|
|
149
|
-
arun(check_token_for_siliconflow("sk-zdsfykbjrdzobopoienanvlpqdsttbbmgpayctqokkrwqazg"))
|
149
|
+
# arun(check_token_for_siliconflow("sk-zdsfykbjrdzobopoienanvlpqdsttbbmgpayctqokkrwqazg"))
|
150
|
+
"https://xchatllm.feishu.cn/sheets/Bmjtst2f6hfMqFttbhLcdfRJnNf?sheet=79272d"
|
151
|
+
|
152
|
+
arun(check_token_for_moonshot("sk-Qnr87vtf2Q6MEfc2mVNkVZ4qaoZg3smH9527I25QgcFe7HrT"))
|
@@ -6,12 +6,16 @@
|
|
6
6
|
# @Author : betterme
|
7
7
|
# @WeChat : meutils
|
8
8
|
# @Software : PyCharm
|
9
|
-
# @Description :
|
9
|
+
# @Description :
|
10
|
+
import asyncio
|
10
11
|
|
12
|
+
import shortuuid
|
11
13
|
|
12
14
|
from meutils.pipe import *
|
13
15
|
from meutils.llm.openai_utils import to_openai_params
|
14
16
|
from meutils.llm.clients import AsyncOpenAI
|
17
|
+
from meutils.str_utils.regular_expression import parse_url
|
18
|
+
from meutils.io.files_utils import to_url, markdown_base64_to_url
|
15
19
|
|
16
20
|
from meutils.schemas.openai_types import chat_completion, chat_completion_chunk, CompletionRequest, CompletionUsage
|
17
21
|
|
@@ -31,12 +35,18 @@ class Completions(object):
|
|
31
35
|
base_url: Optional[str] = None,
|
32
36
|
api_key: Optional[str] = None
|
33
37
|
):
|
38
|
+
|
39
|
+
base_url = "https://api.aiguoguo199.com/v1"
|
40
|
+
|
34
41
|
self.client = AsyncOpenAI(
|
35
42
|
base_url=base_url,
|
36
43
|
api_key=api_key,
|
37
44
|
)
|
38
45
|
|
39
46
|
async def create(self, request: CompletionRequest):
|
47
|
+
if request.model == "gemini-2.0-flash-exp-image-generation":
|
48
|
+
return await self.images_create(request)
|
49
|
+
|
40
50
|
urls = sum(request.last_urls.values(), [])
|
41
51
|
for url in urls:
|
42
52
|
request.messages[-1]["content"].append({"type": "image_url", "image_url": {"url": url}})
|
@@ -44,6 +54,46 @@ class Completions(object):
|
|
44
54
|
data = to_openai_params(request)
|
45
55
|
return await self.client.chat.completions.create(**data)
|
46
56
|
|
57
|
+
async def images_create(self, request: CompletionRequest):
|
58
|
+
|
59
|
+
if request.last_assistant_content and (urls := parse_url(request.last_assistant_content)):
|
60
|
+
for message in request.messages[::-1]:
|
61
|
+
if message.get("role") == "assistant":
|
62
|
+
message["content"] = [
|
63
|
+
{"type": "image_url", "image_url": {"url": url.removesuffix(")")}} for url in urls
|
64
|
+
]
|
65
|
+
|
66
|
+
if urls := parse_url(request.last_user_content): # 修正提问格式, 兼容 url
|
67
|
+
for message in request.messages[::-1]:
|
68
|
+
if message.get("role") == "user":
|
69
|
+
message["content"] = [
|
70
|
+
{"type": "image_url", "image_url": {"url": url.removesuffix(")")}} for url in urls
|
71
|
+
]
|
72
|
+
message["content"] += [{"type": "text", "text": request.last_user_content}]
|
73
|
+
|
74
|
+
# 调用模型
|
75
|
+
logger.debug(request.model_dump_json(indent=4))
|
76
|
+
|
77
|
+
data = to_openai_params(request)
|
78
|
+
response = await self.client.chat.completions.create(**data)
|
79
|
+
|
80
|
+
if request.stream:
|
81
|
+
return self.stream_create(response)
|
82
|
+
|
83
|
+
else:
|
84
|
+
content = response.choices[0].message.content
|
85
|
+
response.choices[0].message.content = await markdown_base64_to_url(content) # base64 转 url
|
86
|
+
|
87
|
+
return response
|
88
|
+
|
89
|
+
async def stream_create(self, chunks):
|
90
|
+
async for chunk in chunks:
|
91
|
+
if (content := chunk.choices[0].delta.content) and content.startswith("!["):
|
92
|
+
chunk.choices[0].delta.content = await markdown_base64_to_url(content)
|
93
|
+
yield chunk
|
94
|
+
else:
|
95
|
+
yield chunk
|
96
|
+
|
47
97
|
|
48
98
|
if __name__ == '__main__':
|
49
99
|
url = "https://oss.ffire.cc/files/lipsync.mp3"
|
@@ -76,7 +76,7 @@ class Completions(object):
|
|
76
76
|
}
|
77
77
|
]
|
78
78
|
data = to_openai_params(request)
|
79
|
-
return self.client.chat.completions.create(**data)
|
79
|
+
return await self.client.chat.completions.create(**data)
|
80
80
|
|
81
81
|
elif guess_mime_type(file_url).startswith(("video", "audio")): # 音频 视频
|
82
82
|
request.model = "gemini" # 果果
|
@@ -98,7 +98,7 @@ class Completions(object):
|
|
98
98
|
}
|
99
99
|
]
|
100
100
|
data = to_openai_params(request)
|
101
|
-
return self.client.chat.completions.create(**data)
|
101
|
+
return await self.client.chat.completions.create(**data)
|
102
102
|
|
103
103
|
else:
|
104
104
|
|
@@ -111,18 +111,18 @@ class Completions(object):
|
|
111
111
|
}
|
112
112
|
]
|
113
113
|
data = to_openai_params(request)
|
114
|
-
return self.client.chat.completions.create(**data)
|
114
|
+
return await self.client.chat.completions.create(**data)
|
115
115
|
|
116
116
|
if image_urls := request.last_urls.get("image_url"): # 识图
|
117
117
|
request.model = "glm-4v-flash"
|
118
118
|
data = to_openai_params(request)
|
119
|
-
return self.client.chat.completions.create(**data)
|
119
|
+
return await self.client.chat.completions.create(**data)
|
120
120
|
|
121
121
|
elif file_urls := request.last_urls.get("file_url"):
|
122
|
-
return self.chat_files(request)
|
122
|
+
return await self.chat_files(request)
|
123
123
|
|
124
124
|
data = to_openai_params(request)
|
125
|
-
return self.client.chat.completions.create(**data)
|
125
|
+
return await self.client.chat.completions.create(**data)
|
126
126
|
|
127
127
|
async def chat_files(self, request: CompletionRequest): # 多轮
|
128
128
|
for i, message in enumerate(request.messages[::-1], 1):
|
@@ -142,7 +142,7 @@ class Completions(object):
|
|
142
142
|
break # 截断:从最新的文件开始
|
143
143
|
|
144
144
|
data = to_openai_params(request)
|
145
|
-
return self.client.chat.completions.create(**data)
|
145
|
+
return await self.client.chat.completions.create(**data)
|
146
146
|
|
147
147
|
async def create_images(self, request: CompletionRequest):
|
148
148
|
|
@@ -153,7 +153,13 @@ class Completions(object):
|
|
153
153
|
)
|
154
154
|
image_url = response.data[0].url
|
155
155
|
tool_desc = """> images.generate\n\n"""
|
156
|
-
|
156
|
+
tool_desc += f""
|
157
|
+
if not request.stream:
|
158
|
+
chat_completion.choices[0].message.content = tool_desc
|
159
|
+
return chat_completion
|
160
|
+
return tool_desc
|
161
|
+
|
162
|
+
# chat_completion_chunk
|
157
163
|
|
158
164
|
# async def create_videos(self, request: CompletionRequest):
|
159
165
|
#
|
@@ -169,9 +175,9 @@ if __name__ == '__main__':
|
|
169
175
|
c = Completions()
|
170
176
|
|
171
177
|
request = CompletionRequest(
|
172
|
-
model="qwen-turbo-2024-11-01",
|
178
|
+
# model="qwen-turbo-2024-11-01",
|
173
179
|
# model="claude-3-5-sonnet-20241022",
|
174
|
-
|
180
|
+
model="gpt-4o-mini",
|
175
181
|
|
176
182
|
messages=[{
|
177
183
|
'role': 'user',
|
@@ -181,10 +187,12 @@ if __name__ == '__main__':
|
|
181
187
|
"text": "总结下"
|
182
188
|
},
|
183
189
|
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
190
|
+
{
|
191
|
+
"type": "file_url",
|
192
|
+
"file_url": {
|
193
|
+
"url": "https://oss.ffire.cc/files/招标文件备案表(第二次).pdf"
|
194
|
+
}
|
195
|
+
}
|
188
196
|
]
|
189
197
|
}])
|
190
198
|
|