MeUtils 2024.11.29.11.8.36__py3-none-any.whl → 2024.11.29.18.21.1__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: MeUtils
3
- Version: 2024.11.29.11.8.36
3
+ Version: 2024.11.29.18.21.1
4
4
  Summary: description
5
5
  Home-page: https://github.com/yuanjie-ai/MeUtils
6
6
  Author: yuanjie
@@ -61,42 +61,42 @@ Requires-Dist: sse-starlette ; extra == 'ai'
61
61
  Requires-Dist: openai ; extra == 'ai'
62
62
  Requires-Dist: langchain ; extra == 'ai'
63
63
  Provides-Extra: all
64
+ Requires-Dist: thriftpy2 ; extra == 'all'
65
+ Requires-Dist: seaborn ; extra == 'all'
64
66
  Requires-Dist: faiss-cpu ; extra == 'all'
65
- Requires-Dist: cachetools ; extra == 'all'
67
+ Requires-Dist: pymupd ; extra == 'all'
68
+ Requires-Dist: pymongo ; extra == 'all'
66
69
  Requires-Dist: openai ; extra == 'all'
67
- Requires-Dist: iteration-utilities ; extra == 'all'
68
- Requires-Dist: asyncmy ; extra == 'all'
69
- Requires-Dist: jmespath ; extra == 'all'
70
- Requires-Dist: uvicorn ; extra == 'all'
71
- Requires-Dist: pymilvus ; extra == 'all'
72
- Requires-Dist: pretty-errors ; extra == 'all'
73
- Requires-Dist: gunicorn ; extra == 'all'
74
- Requires-Dist: schedule ; extra == 'all'
75
- Requires-Dist: jieba ; extra == 'all'
70
+ Requires-Dist: thefuck ; extra == 'all'
76
71
  Requires-Dist: fastapi[all] ; extra == 'all'
77
- Requires-Dist: thriftpy2 ; extra == 'all'
78
- Requires-Dist: streamlit ; extra == 'all'
79
- Requires-Dist: pandas-profiling[notebook] ; extra == 'all'
80
- Requires-Dist: seaborn ; extra == 'all'
81
- Requires-Dist: pyarrow ; extra == 'all'
82
- Requires-Dist: redis-py-cluster ; extra == 'all'
83
- Requires-Dist: langchain ; extra == 'all'
84
- Requires-Dist: simplejson ; extra == 'all'
85
- Requires-Dist: missingno ; extra == 'all'
72
+ Requires-Dist: sse-starlette ; extra == 'all'
86
73
  Requires-Dist: filetype ; extra == 'all'
87
- Requires-Dist: geopy ; extra == 'all'
74
+ Requires-Dist: cachetools ; extra == 'all'
75
+ Requires-Dist: gunicorn ; extra == 'all'
88
76
  Requires-Dist: fastapi ; extra == 'all'
89
- Requires-Dist: pymupd ; extra == 'all'
90
- Requires-Dist: pymongo ; extra == 'all'
77
+ Requires-Dist: pymilvus ; extra == 'all'
78
+ Requires-Dist: iteration-utilities ; extra == 'all'
79
+ Requires-Dist: geopy ; extra == 'all'
91
80
  Requires-Dist: pymysql ; extra == 'all'
92
- Requires-Dist: thefuck ; extra == 'all'
93
- Requires-Dist: polars ; extra == 'all'
81
+ Requires-Dist: missingno ; extra == 'all'
82
+ Requires-Dist: jieba ; extra == 'all'
83
+ Requires-Dist: schedule ; extra == 'all'
84
+ Requires-Dist: asyncmy ; extra == 'all'
94
85
  Requires-Dist: reportlab ; extra == 'all'
95
- Requires-Dist: dataframe-image ; extra == 'all'
96
- Requires-Dist: sse-starlette ; extra == 'all'
86
+ Requires-Dist: redis-py-cluster ; extra == 'all'
87
+ Requires-Dist: pretty-errors ; extra == 'all'
88
+ Requires-Dist: jmespath ; extra == 'all'
89
+ Requires-Dist: polars ; extra == 'all'
97
90
  Requires-Dist: sqlalchemy ; extra == 'all'
98
- Requires-Dist: jinja2 ; extra == 'all'
99
91
  Requires-Dist: pandas-summary ; extra == 'all'
92
+ Requires-Dist: langchain ; extra == 'all'
93
+ Requires-Dist: jinja2 ; extra == 'all'
94
+ Requires-Dist: simplejson ; extra == 'all'
95
+ Requires-Dist: pandas-profiling[notebook] ; extra == 'all'
96
+ Requires-Dist: dataframe-image ; extra == 'all'
97
+ Requires-Dist: pyarrow ; extra == 'all'
98
+ Requires-Dist: uvicorn ; extra == 'all'
99
+ Requires-Dist: streamlit ; extra == 'all'
100
100
  Provides-Extra: ann
101
101
  Requires-Dist: pymilvus ; extra == 'ann'
102
102
  Requires-Dist: faiss-cpu ; extra == 'ann'
@@ -105,7 +105,7 @@ examples/_openaisdk/openai_search.py,sha256=HKRTU6y9j_nUfZgrJt2eZ84d7TVT39WN-dcA
105
105
  examples/_openaisdk/openai_sensenova.py,sha256=TnJpHcD1tG5w_x5DsgFgBRWrU8XUkww0uCebgNFfZDM,3216
106
106
  examples/_openaisdk/openai_siliconflow.py,sha256=SuOwW7XmoBpKtLRbi7MFovjfeI2sFWhgOYh11O0vBR4,1349
107
107
  examples/_openaisdk/openai_step.py,sha256=KSSnBwJZbjpPuevqBXGiEBHQidHedePsr4Jfj6ruVO0,943
108
- examples/_openaisdk/openai_tune.py,sha256=SwwRZg571nAcQ5ossfJIvLw-hiEPxwonOPv57oCc6tM,1232
108
+ examples/_openaisdk/openai_tune.py,sha256=rDmX_EMsAhD0gKJPQ8P0-icZQAjV6OMkMLX67uwJtvU,674
109
109
  examples/_openaisdk/openai_zhipu.py,sha256=K13ogb2IZO0-_ItLqHIAFWaN6FH2vd72PdieIXMZNx8,1626
110
110
  examples/_openaisdk/ppu.py,sha256=jPBufoYt2ZrqNKjgbHr49YZI5vBM-32eBYbhbYduhnY,602
111
111
  examples/_openaisdk/rag.py,sha256=NwNHhfi5FZ2XKCmsScjmM5cxCSfJuqx2jV-69ZXh244,1372
@@ -415,15 +415,16 @@ meutils/apis/vidu/x.py,sha256=UD1QlAQTtLgFiDfWYVxM-1ppfrX_LaVYASk2yNviMuk,322
415
415
  meutils/apis/voice_clone/__init__.py,sha256=y7Rpn90LocHhA0ywrDP_fT4QAK7sr4JsIX5wLJgkNHA,241
416
416
  meutils/apis/voice_clone/fish.py,sha256=6m8zcS2KEqmalKy2ArnOaNovyxsQp_sw4d_O1kVZR2s,7146
417
417
  meutils/apis/voice_clone/fish_api.py,sha256=pDpE-B8HFiGIOV3NVd1HmFrCC2GQc3wH-81oNbTS0mY,307
418
- meutils/async_task/__init__.py,sha256=QpkvoT6u-IBAlVgIevDkvEe_kVfW96UkS7i3NQHG63Y,303
418
+ meutils/async_task/__init__.py,sha256=45cUr-GWvQ1JFYGOYPOIkHLyTR3JbfP_PEYrmktpMLo,367
419
419
  meutils/async_task/celery_config.py,sha256=Mv8YjLQlHsWbVHw3wkauMw2H1g46KNnJa4EPehFj6dw,3308
420
- meutils/async_task/common.py,sha256=LDoHKK8ouiN06NrwRn5vtmIyfGGH76iodtiS8Qjz-rM,1218
421
- meutils/async_task/demo_create_tasks.py,sha256=emeDUNtZAlZ6kNwt3_6ta0ART0Bj6T2DhivZDzOMx-o,1762
420
+ meutils/async_task/common.py,sha256=ZJ4e0CsEJf1ppPmGSwPCwhZBAkUL5xsi_t1ny-bJuko,845
421
+ meutils/async_task/demo_create_tasks.py,sha256=DBUxi8lp4iJZrubn6XztRHB4DuZDEXpohSxCH6NMKuc,2219
422
+ meutils/async_task/utils.py,sha256=IgGcKkD6yut_CagnRanRPY180kM6FpYO0dFyJKJ50zQ,2933
422
423
  meutils/async_task/通用设计.py,sha256=kGdrJHJu9VoOkyGHREn0KUtBTibAaLIcG0O6hEJNhLA,3232
423
- meutils/async_task/tasks/__init__.py,sha256=2ilRdLq7JNpFU_xFc54r5JGOuNhx5r-zoyXqxC4WWIg,244
424
+ meutils/async_task/tasks/__init__.py,sha256=flHRXJMdts_9az9T9V1c5l3Y-gaDD88COWrARr4WAKU,246
424
425
  meutils/async_task/tasks/_all.py,sha256=Vz63k9yvgj-IBGjekm0u2t571TTT0nMRMqcPvPqJAbY,533
425
- meutils/async_task/tasks/kling.py,sha256=xfD_Ec9ZMPJsK9KkwOU5lnsfeq9tjtt1AWSMLAgH_ss,608
426
- meutils/async_task/tasks/test.py,sha256=U61SWjQoHjbdNWY7QUhOVsMjLa-FLoBIxoXqTD0Q_0U,1797
426
+ meutils/async_task/tasks/kling.py,sha256=DwOUHyNDBpM1olCpow_cVct8iPpg2PEqY180wpTt07o,904
427
+ meutils/async_task/tasks/test.py,sha256=f-QY-k81ixe4x-rRO7yqStZ1w8MdVoq-ooq9bDzXOeI,2148
427
428
  meutils/async_task/tasks/vidu.py,sha256=obBG4_bf1oPIlLxeca1s1dGOnlyam2xYRy-8TrH3ZTk,620
428
429
  meutils/async_utils/__init__.py,sha256=IiJLRm258jkM4xAjUKOD7tVwHIemj7_1CuzXCu3TuQU,284
429
430
  meutils/async_utils/asyncer_.py,sha256=S1Sp5WZx_uKM7kJyRVYU8QhmbjOh61JmfN2IN_PJNX4,736
@@ -458,7 +459,7 @@ meutils/config_utils/lark_utils/demo.py,sha256=3g0Fs7oLaeW75T60gYWMLgyNg1OnfOjfH
458
459
  meutils/config_utils/lark_utils/x.py,sha256=MlMQGhehP9xMEgetxVCX68XFaosfKoW1JA5cZ3JqN2w,1857
459
460
  meutils/crawlers/__init__.py,sha256=TBU4xA-IOsHV-0yIkW7YXxn_QT7TT8NncqxO7IykEfs,271
460
461
  meutils/data/SimHei.ttf,sha256=-XEnekS5yHP_URkT4XBI2w22ylV-KxudhkeIYFbrILA,10062565
461
- meutils/data/VERSION,sha256=D5JpDI561ARAq5jBz_Efv6kW8jnEwhy-74urB5xD0MI,19
462
+ meutils/data/VERSION,sha256=DLrVpDq7LFcQTu5Bosj924g93X879qfc52nPn1RrbTo,19
462
463
  meutils/data/_FLAG,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
463
464
  meutils/data/_SUCCESS,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
464
465
  meutils/data/__init__.py,sha256=Hfwkkxs4zHqKhxht0YrhS566a9P5axtmgNvM5wF8ceQ,243
@@ -470,7 +471,7 @@ meutils/data/oneapi/__init__.py,sha256=cm2Kq2RDXPfdVMWcoBB77bu00zJpTDd21Rgc6bTlh
470
471
  meutils/db/__init__.py,sha256=HR99rqxoFTWXUHDhLVl33tzIn8M86gigHLmEzOKH1Ec,7637
471
472
  meutils/db/mongo.py,sha256=B-B_t939rxtnNGt0PxhivjIUwinmHPzLUpXsjUIaTkQ,2337
472
473
  meutils/db/neo4j.py,sha256=eYd3jP3COWlOFBaF20UXphW67-HwlZ1t0Q34Cp-j6o0,2168
473
- meutils/db/orm.py,sha256=PTFQCYzQB33knBK3kn4WdQCs-RA0XDA0CNeI_nq4kHM,4005
474
+ meutils/db/orm.py,sha256=dyV8tlVDUw_8tS6uiz_nyPzpNg8UX-ob7zarLVfvvqE,4060
474
475
  meutils/db/redis_db.py,sha256=vBe-Yj2JxZS8-G7bmMB4oxxMrV1xUwy22kGaETMb0DE,2085
475
476
  meutils/decorators/__ai.py,sha256=QAz005-Wa-sp0YUUoelaR1pMbt6hPSBML5j0My6TbEI,1681
476
477
  meutils/decorators/__init__.py,sha256=hgpHo40pfFWYXEnrW74o8W7SIfCD0GHr3gnujBw1hIQ,3284
@@ -653,7 +654,7 @@ meutils/schemas/runwayml_types.py,sha256=q6g00kg1PYCDjpw-notgbcUGwRAlIa8kAmU52Zu
653
654
  meutils/schemas/siliconflow_types.py,sha256=amOygjMqbSss4021sCNX1p5d-k1wa2tNLr0gnke1Vrc,8429
654
655
  meutils/schemas/step_types.py,sha256=nGTPXZ7RwOF2RTsPBQguLLcIaBxHs4bsZkYa_LalcJ0,648
655
656
  meutils/schemas/suno_types.py,sha256=KTdcwaJNDUFiY8izVJSZdGZgEMb0OhdiRR_dJVN-Cz0,14967
656
- meutils/schemas/task_types.py,sha256=s6-pN8SEazi7yCkH47pxxmpH9SI90ePNoi6hZVcR7Uw,2834
657
+ meutils/schemas/task_types.py,sha256=G2qzqdNfYKzeJwps_QNiqV4_Qo0MSdxwqqITD8dtajo,4317
657
658
  meutils/schemas/translator_types.py,sha256=xufNQeyim7RhkzAK_J5_JchZfqaUBDXFwMtrPUu1xzI,627
658
659
  meutils/schemas/tripo3d_types.py,sha256=mQF65HwHYmczRgAIuXK5hGxWDWNYDq-Xu9pja7Dwy4o,1452
659
660
  meutils/schemas/tryblend_types.py,sha256=glZ0diRJvZmfQotcCWYBA832inihy8TvVWxWZ64CzWA,27793
@@ -662,10 +663,10 @@ meutils/schemas/vidu_types.py,sha256=Wa947mT5pL9yR4utM-A9oQvNvgaJorr9YRccryHnHH4
662
663
  meutils/schemas/wechat_types.py,sha256=XtIJpMNBzkqBcU68Qno8bnUfHzDOXwFNCIL-6VYQKOA,9260
663
664
  meutils/schemas/yuanbao_types.py,sha256=ZmB-7_eAuTU3QDonNgy0vcVP4YQNwA5yJ8G4mvfOmUE,11966
664
665
  meutils/schemas/db/__init__.py,sha256=m1maURVoM6dIW0yt6ELZrZTzULtkHybVOSXtHNJRVIU,272
665
- meutils/schemas/db/oneapi_types.py,sha256=yQEpaoOY-YWl9PP4INqapX9TENUVqfY7rjGFgBGKIT8,3459
666
+ meutils/schemas/db/oneapi_types.py,sha256=1QEcIkT5dp1SnjEj2cwiZXPjjh6StGf0_gpGFDbGrNI,2806
666
667
  meutils/schemas/oneapi/__init__.py,sha256=uevbi3QAvFzN9WPbx9bYKTDyKt7P2ueZO6W0nSiD0sk,289
667
668
  meutils/schemas/oneapi/_types.py,sha256=ClvAaNy3SahEN8lL8KEErHTD6HANelXUeKc_3iLfosQ,1488
668
- meutils/schemas/oneapi/common.py,sha256=Q6l0LuqvtdJTs3IqpxXRRIwGW89RYrEwKwZEwgnkPYM,22573
669
+ meutils/schemas/oneapi/common.py,sha256=DPo8jsY0ytKFTILKi3-Apz6VK6cM_lBJ1xKqDNRjT88,22573
669
670
  meutils/schemas/oneapi/icons.py,sha256=T7W5gInBJoHe62wzMimbG_UI-wn3_-rmQ1O4O2z-CQY,1089
670
671
  meutils/schemas/oneapi/model_group_info.py,sha256=rGtflYJuFIjk5MsVEvK9JUR4IciX8jfErqeLqf8DIlQ,1586
671
672
  meutils/schemas/oneapi/model_info.py,sha256=_uwKEPIIqm7ZYfhmpxtXB2QNsS83SpJY-OaBzvogC9w,772
@@ -684,11 +685,11 @@ meutils/serving/celery/通用设计.py,sha256=kGdrJHJu9VoOkyGHREn0KUtBTibAaLIcG0
684
685
  meutils/serving/fastapi/__init__.py,sha256=_NvGfai2sMzsywCQk-hYRm-nTz0O6op2ln5kEUiqGqM,290
685
686
  meutils/serving/fastapi/common.py,sha256=xuVlnF_U4s9LQnwhUK3cbH5OcfEM0M6NqJ3gZm9enic,4681
686
687
  meutils/serving/fastapi/gunicorn.conf.py,sha256=1ylGijXbW8bVQoJu9TUCvkurVUGk0ZGHL2GYKtm2DfY,7791
687
- meutils/serving/fastapi/utils.py,sha256=vVQWig0-KBn9PmLYfbj-AQ7gpiOTXg7wdSrXL9Qn2nE,2994
688
+ meutils/serving/fastapi/utils.py,sha256=H5lQSU7-IfJ2w9FWbaJ34LCbQSaNTFSU7z1pG5wZlRo,2965
688
689
  meutils/serving/fastapi/__demo/__init__.py,sha256=TxXjqy2ZxAkadPxqN92Xq3ixCUYkQ-4X6UxsReRpHhc,271
689
690
  meutils/serving/fastapi/__demo/异步任务.py,sha256=60_ruA4ljlTLIP5zxcejmm9WJ0SDuqpsO49SZK9vA_s,1444
690
691
  meutils/serving/fastapi/dependencies/__init__.py,sha256=shI1EgfH4gFuajmHGlzt_ArdDrFq8DqnUg7ycpFuYl0,245
691
- meutils/serving/fastapi/dependencies/auth.py,sha256=cZ5a5ibUc4BxHnuGgRkKl6GNe3vYKwYE8mhMXXQjZH4,342
692
+ meutils/serving/fastapi/dependencies/auth.py,sha256=WDdFPRApBJrL8-APHAnQyMFrT7OnfeHg0oABwLVKm6Q,822
692
693
  meutils/serving/fastapi/exceptions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
693
694
  meutils/serving/fastapi/exceptions/http_error.py,sha256=6NW48Iadu-LyDBtp_P7YHWhBfwkz3OKTerz585FSGUk,2064
694
695
  meutils/serving/fastapi/exceptions/validation_error.py,sha256=Q71wYfzGsVjLA-SQ3R5a8iT0kDG01mwriVUXHhvsTv0,1234
@@ -791,9 +792,9 @@ meutils/tools/seize.py,sha256=nOKAS63w-Lbi48I0m2MPhdsokUTwxco0laPxYVmW4Mw,1064
791
792
  meutils/tools/service_monitor.py,sha256=ibsLtBN2g2DL7ZnLJ8vhiZOiOcqTAyx711djDdBK-3M,1255
792
793
  meutils/tools/sys_monitor.py,sha256=6MoyzrItqDUOSjfHcMJmMofQkEPTW36CT_aKui0rg84,429
793
794
  meutils/tools/token_monitor.py,sha256=Np-YK-R4P4IPAXyZvMxwvXI4sFmNJQAQK1lSegNaYpA,997
794
- MeUtils-2024.11.29.11.8.36.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
795
- MeUtils-2024.11.29.11.8.36.dist-info/METADATA,sha256=tOMVYi2Fm1-fZ86b8Aw6PTSDWnHFTtPO1OpILfurCzE,6143
796
- MeUtils-2024.11.29.11.8.36.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
797
- MeUtils-2024.11.29.11.8.36.dist-info/entry_points.txt,sha256=lufZlBHRqqZKdY-ZQJ4CSZb0qhV5hQC37egZna9M7ug,357
798
- MeUtils-2024.11.29.11.8.36.dist-info/top_level.txt,sha256=cInfxMmkgNOskurdjwP5unau4rA7Uw48nu07tYhS7KY,22
799
- MeUtils-2024.11.29.11.8.36.dist-info/RECORD,,
795
+ MeUtils-2024.11.29.18.21.1.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
796
+ MeUtils-2024.11.29.18.21.1.dist-info/METADATA,sha256=wWYffD75OIT0ZB6bzHGhCLoE9jhXH1kv5rein1bU1v0,6143
797
+ MeUtils-2024.11.29.18.21.1.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
798
+ MeUtils-2024.11.29.18.21.1.dist-info/entry_points.txt,sha256=lufZlBHRqqZKdY-ZQJ4CSZb0qhV5hQC37egZna9M7ug,357
799
+ MeUtils-2024.11.29.18.21.1.dist-info/top_level.txt,sha256=cInfxMmkgNOskurdjwP5unau4rA7Uw48nu07tYhS7KY,22
800
+ MeUtils-2024.11.29.18.21.1.dist-info/RECORD,,
@@ -8,33 +8,14 @@
8
8
  # @Software : PyCharm
9
9
  # @Description :
10
10
 
11
- from meutils.pipe import *
12
- # curl -X POST "https://any2chat.chatfire.cn/tune/v1/chat/completions" \
13
- # -H "Authorization: Bearer sk-tune-0UkSny4Fe7ouhF3GPI0lIAKIAj7B2kkJmOV" \
14
- # -H "Content-Type: application/json" \
15
- # -d '{
16
- # "temperature": 0.8,
17
- # "messages": [
18
- # {
19
- # "role": "user",
20
- # "content": "1+1"
21
- # }
22
- # ],
23
- # "model": "anthropic/claude-3.5-sonnet",
24
- # "stream": true,
25
- # "frequency_penalty": 0,
26
- # "max_tokens": 900
27
- # }'
11
+
28
12
 
29
13
 
30
14
  from meutils.pipe import *
31
15
  from openai import OpenAI
32
16
 
33
- base_url = "http://154.40.54.76:3000/v1"
34
- api_key = "sk-tune-0UkSny4Fe7ouhF3GPI0lIAKIAj7B2kkJmOV"
35
17
  client = OpenAI(
36
- api_key=api_key,
37
- base_url=base_url,
18
+
38
19
  )
39
20
 
40
21
  completion = client.chat.completions.create(
@@ -42,12 +23,13 @@ completion = client.chat.completions.create(
42
23
  # model="openai/gpt-4o-mini",
43
24
  # model="openai/gpt-4o",
44
25
  # model="anthropic/claude-3.5-sonnet",
45
- model="gpt-4o-mini",
26
+ # model="gpt-4o-mini",
27
+ model="gpt-4-turbo",
46
28
 
47
29
  messages=[
48
30
  {"role": "user", "content": "1+1"},
49
31
  ],
50
- # max_tokens=10
32
+ max_tokens=10000
51
33
  )
52
34
 
53
35
  print(completion)
@@ -8,4 +8,6 @@
8
8
  # @Software : PyCharm
9
9
  # @Description :
10
10
 
11
- from meutils.async_task.common import worker, shared_task
11
+
12
+ # from meutils.async_task.common import worker, shared_task, AsyncResult, states
13
+ from meutils.async_task.common import *
@@ -10,25 +10,12 @@
10
10
 
11
11
  from meutils.pipe import *
12
12
  from meutils.decorators.retry import retrying
13
+
13
14
  from meutils.async_task import celery_config
14
15
 
15
16
  from celery import Celery, Task, shared_task, states
16
17
 
17
18
 
18
- class RetryableTask(Task): # 实际上 在具体任务支持 执行重试就行
19
- """shared_task(base=RetryableTask)"""
20
-
21
- # 使用 tenacity 进行更灵活的重试控制
22
- @retrying(
23
- max_retries=6,
24
- title="Celery 任务重试"
25
- )
26
- def run_with_retry(self, *args, **kwargs):
27
- return self.run(*args, **kwargs)
28
-
29
- def __call__(self, *args, **kwargs):
30
- return self.run_with_retry(*args, **kwargs)
31
-
32
19
 
33
20
  worker = Celery()
34
21
 
@@ -41,9 +28,10 @@ worker.conf.update(
41
28
  task_track_started=True,
42
29
  )
43
30
 
44
-
45
31
  if __name__ == '__main__':
46
32
  print(worker.conf.humanize(with_defaults=False))
47
33
 
48
34
  print(worker.conf.broker_url)
49
35
  print(worker.conf.result_backend)
36
+
37
+ print(arun(get_task("59ddf636-3f27-4110-948e-5977c8cbe1b3")))
@@ -44,12 +44,22 @@ if __name__ == '__main__':
44
44
  # test.ado_sync_task.apply_async(kwargs={'a': 1, 'b': 3})
45
45
  # print(AsyncResult("42e191a0-6099-419e-b61d-07bf7e2df2fc").result)
46
46
  # result.backend
47
-
47
+ # AsyncResult("42e191a0-6099-419e-b61d-07bf7e2df2fc").get()
48
48
  # AsyncResult(r.id).result
49
49
 
50
50
 
51
51
  # test.do_pydantic_task.apply_async(kwargs={'request': test.Request()})
52
52
 
53
53
  test.do_pydantic_task.apply_async(kwargs={"request": {"method": "POST", "url": "测试"}})
54
- test.do_pydantic_task.apply_async(kwargs={"request": {"method": "xx"}})
55
- test.do_pydantic_task.apply_async(args=({"method": "xxxxxxx"},))
54
+
55
+ print(type(test.do_pydantic_task))
56
+
57
+
58
+ # test.do_pydantic_task.apply_async(kwargs={"request": {"method": "POST", "url": "测试"}})
59
+ # test.do_pydantic_task.apply_async(kwargs={"request": {"method": "xx"}})
60
+ # test.do_pydantic_task.apply_async(args=({"method": "xxxxxxx"},))
61
+
62
+ #
63
+ # test.do_task_retrying.apply_async(kwargs={'name': "###do_task_retrying"})
64
+ # test.do_task_retry.apply_async(kwargs={'name': "###do_task_retry"})
65
+ # test.do_task_retry_backoff.apply_async(kwargs={'name': "###do_task_retry_backoff"})
@@ -7,3 +7,5 @@
7
7
  # @WeChat : meutils
8
8
  # @Software : PyCharm
9
9
  # @Description :
10
+
11
+
@@ -6,28 +6,27 @@
6
6
  # @Author : betterme
7
7
  # @WeChat : meutils
8
8
  # @Software : PyCharm
9
- # @Description :
9
+ # @Description : 注册任务
10
10
 
11
11
  from meutils.pipe import *
12
+ from meutils.async_utils import async_to_sync_pro
12
13
  from meutils.decorators.retry import retrying
13
14
  from meutils.async_task import worker, shared_task
14
15
 
15
16
  from meutils.apis.kling import kolors_virtual_try_on
16
17
 
17
18
 
18
- @shared_task
19
- async def do_task(**kwargs):
20
- return kwargs
21
-
22
-
23
- @shared_task
24
- @retrying(3)
25
- async def proxy_task(**kwargs):
26
- pass
27
-
19
+ @shared_task(pydantic=True, retry_kwargs={'max_retries': 5, 'countdown': 10})
20
+ @async_to_sync_pro
21
+ async def create_task(request: kolors_virtual_try_on.TryOnRequest, **kwargs):
22
+ response = await kolors_virtual_try_on.create_task(request)
28
23
  return response
29
24
 
30
25
 
26
+ # celery_task
31
27
 
32
28
 
33
- # kolors_virtual_try_on.create_task
29
+ if __name__ == '__main__':
30
+ pass
31
+ # create_task.apply_async()
32
+ # kling.create_task.apply_async(kwargs={"request": request.model_dump()})
@@ -45,23 +45,36 @@ def do_pydantic_task(request: Request):
45
45
 
46
46
 
47
47
  @shared_task(retry_kwargs={'max_retries': 10})
48
- def do_task_retry(args, kwargs):
48
+ def do_task_retry(*args, **kwargs):
49
+ logger.debug("do_task_retry")
50
+
49
51
  return 1 / 0
50
52
 
53
+ @shared_task(
54
+ default_retry_delay=3,
55
+ retry_backoff=True,
56
+ retry_kwargs={'max_retries': 10}
57
+ )
58
+ def do_task_retry_backoff_noautoretry(*args, **kwargs):
59
+ logger.debug("do_task_retry_backoff")
51
60
 
61
+ return 1 / 0
52
62
  @shared_task(
53
- # autoretry_for=(Exception,),
63
+ autoretry_for=(Exception,),
54
64
  default_retry_delay=3,
55
65
  retry_backoff=True,
56
66
  retry_kwargs={'max_retries': 10}
57
67
  )
58
- def do_task_retry_backoff(args, kwargs):
68
+ def do_task_retry_backoff(*args, **kwargs):
69
+ logger.debug("do_task_retry_backoff autoretry")
70
+
59
71
  return 1 / 0
60
72
 
61
73
 
62
74
  @shared_task(retry_kwargs={'max_retries': 3})
63
75
  @retrying(10)
64
- def do_task_retrying(args, kwargs):
76
+ def do_task_retrying(*args, **kwargs):
77
+ logger.debug("do_task_retrying")
65
78
  return 1 / 0
66
79
 
67
80
 
@@ -0,0 +1,97 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+ # @Project : AI. @by PyCharm
4
+ # @File : utils
5
+ # @Time : 2024/11/29 16:22
6
+ # @Author : betterme
7
+ # @WeChat : meutils
8
+ # @Software : PyCharm
9
+ # @Description : 通用异步设计,兼容oneapi监控
10
+
11
+ from celery.result import AsyncResult
12
+
13
+ from meutils.pipe import *
14
+ from meutils.schemas.task_types import TaskResponse
15
+
16
+ from meutils.db.orm import update_or_insert
17
+ from meutils.schemas.db.oneapi_types import OneapiTask
18
+
19
+
20
+ async def create_task(async_task, request: Union[BaseModel, dict]):
21
+ if not isinstance(request, dict):
22
+ request = request.model_dump()
23
+
24
+ result = async_task.apply_async(kwargs={"request": request})
25
+ task_id = result.id
26
+ return TaskResponse(task_id=task_id)
27
+
28
+
29
+ async def get_task(
30
+ task_id: str,
31
+ remote_get_task: Optional[Callable] = None,
32
+ filter_kwargs: Optional[dict] = None
33
+ ):
34
+ result = AsyncResult(id=task_id)
35
+
36
+ if result.ready():
37
+ if result.successful():
38
+ data = result.get() # system_fingerprint
39
+ token = data.pop("system_fingerprint", None) # 远程任务 token/apikey
40
+
41
+ response = TaskResponse(
42
+ task_id=task_id,
43
+
44
+ message="Task completed successfully",
45
+ status=result.status,
46
+ data=data
47
+ )
48
+
49
+ if remote_get_task: # 获取远程任务
50
+ response: TaskResponse = await remote_get_task(task_id, token) # todo: 缓存一份
51
+
52
+ if not isinstance(data, dict):
53
+ data = data.model_dump()
54
+ response.__dict__.update(data)
55
+
56
+ else:
57
+ response = TaskResponse(
58
+ task_id=task_id,
59
+
60
+ code=1,
61
+ message=str(result.result),
62
+ status=result.status,
63
+ )
64
+ else:
65
+ response = TaskResponse(
66
+ task_id=task_id,
67
+
68
+ message="Task is still running",
69
+ status=result.status,
70
+ )
71
+
72
+ # 更新到数据库:异步任务
73
+ update_fn = partial(update_oneapi_from_response, task_response=response)
74
+ asyncio.create_task(update_or_insert(OneapiTask, filter_kwargs, update_fn)) # 测试是否会执行
75
+
76
+ return response
77
+
78
+
79
+ # todo: 可以设计更通用的
80
+ async def update_oneapi_from_response(task: OneapiTask, task_response: TaskResponse):
81
+ if task.status in {"SUCCESS", "FAILURE"}: return False # 跳出轮询,不再更新
82
+
83
+ task.data = task_response.model_dump(exclude_none=True, exclude={"system_fingerprint"})
84
+ task.status = task_response.status
85
+ task.progress = time.time() // 10 % 100
86
+
87
+ if task.status == "SUCCESS":
88
+ task.progress = "100%"
89
+ elif task.status == "FAILURE":
90
+ task.fail_reason = "查看详情"
91
+
92
+ task.updated_at = int(time.time())
93
+ task.finish_time = int(time.time()) # 不是实际时间
94
+
95
+
96
+ if __name__ == '__main__':
97
+ pass
meutils/data/VERSION CHANGED
@@ -1 +1 @@
1
- 2024.11.29.11.08.36
1
+ 2024.11.29.18.21.01
meutils/db/orm.py CHANGED
@@ -42,12 +42,12 @@ async def get_db():
42
42
  yield session
43
43
 
44
44
 
45
- async def update_or_insert(entity, kwargs: Optional[dict] = None, update_fn: Optional[Callable] = None,
45
+ async def update_or_insert(entity, filter_kwargs: Optional[dict] = None, update_fn: Optional[Callable] = None,
46
46
  n: int = 1):
47
47
  """
48
48
 
49
49
  :param entity: TASK 类
50
- :param ident: 查询条件 字典 元组 第一个值是id
50
+ :param filter_kwargs: 查询条件 字典 元组 第一个值是id
51
51
  :param update_fn:
52
52
 
53
53
  def update_fn(data):
@@ -61,14 +61,14 @@ async def update_or_insert(entity, kwargs: Optional[dict] = None, update_fn: Opt
61
61
  await asyncio.sleep(n / i, 1)
62
62
 
63
63
  logger.debug(f"UPDATE_OR_INSERT: {entity.__name__}-{i}")
64
- update_flag = await update_or_insert(entity, kwargs, update_fn)
64
+ update_flag = await update_or_insert(entity, filter_kwargs, update_fn)
65
65
  if update_flag is False:
66
66
  logger.debug("提前跳出轮询")
67
67
  break
68
68
 
69
- kwargs = kwargs or {}
69
+ filter_kwargs = filter_kwargs or {}
70
70
  async with AsyncSession(engine) as session:
71
- statement = select(entity).filter_by(**kwargs)
71
+ statement = select(entity).filter_by(**filter_kwargs)
72
72
  result = await session.exec(statement)
73
73
  data = result.first() # result.all()
74
74
 
@@ -87,7 +87,7 @@ async def update_or_insert(entity, kwargs: Optional[dict] = None, update_fn: Opt
87
87
  await session.refresh(data)
88
88
  return data
89
89
  else:
90
- data = entity(**kwargs)
90
+ data = entity(**filter_kwargs)
91
91
  logger.debug(f"INSERT: {data}")
92
92
 
93
93
  session.add(data)
@@ -124,7 +124,7 @@ if __name__ == '__main__':
124
124
  #
125
125
  # arun(create_db_and_tables())
126
126
 
127
- from meutils.schemas.db.oneapi_types import Tasks
127
+ from meutils.schemas.db.oneapi_types import OneapiTask
128
128
 
129
129
  filter_kwargs = {
130
130
  "task_id": "888",
@@ -13,38 +13,6 @@ from meutils.pipe import *
13
13
  from sqlalchemy import JSON
14
14
  from sqlmodel import Field, Session, SQLModel, create_engine, select, insert, update, Column, DateTime, func
15
15
 
16
- # "NOT_START", "SUBMITTED", "QUEUED", "IN_PROGRESS", "FAILURE", "SUCCESS", "UNKNOWN"
17
-
18
- STATUSES = {
19
- "not_start": "NOT_START",
20
-
21
- "submitted": "SUBMITTED",
22
-
23
- "starting": "QUEUED",
24
- "queued": "QUEUED",
25
- "STARTED": "QUEUED",
26
- "started": "QUEUED",
27
- "pending": "QUEUED",
28
- "PENDING": "QUEUED",
29
-
30
- "processing": "IN_PROGRESS",
31
- "in_progress": "IN_PROGRESS",
32
- "received": "IN_PROGRESS",
33
- "RECEIVED": "IN_PROGRESS",
34
-
35
- "succeed": "SUCCESS",
36
- "success": "SUCCESS",
37
- "succeeded": "SUCCESS",
38
-
39
- "failed": "FAILURE",
40
- "canceled": "FAILURE",
41
- "FAILURE": "FAILURE",
42
- "failure": "FAILURE",
43
-
44
- "unknown": "UNKNOWN",
45
-
46
- }
47
-
48
16
 
49
17
  def get_default_name():
50
18
  return "xx"
@@ -63,7 +31,7 @@ class Hero(SQLModel, table=True):
63
31
  )
64
32
 
65
33
 
66
- class Tasks(SQLModel, table=True):
34
+ class OneapiTask(SQLModel, table=True):
67
35
  """https://github.com/Calcium-Ion/new-api/blob/main/model/task.go"""
68
36
  id: Optional[int] = Field(default=None, primary_key=True)
69
37
 
@@ -294,7 +294,7 @@ MODEL_RATIO = {
294
294
  "qwen2.5-math-72b-instruct": 4.13 / 2,
295
295
  "qwen2.5-coder-32b-instruct": 0.5,
296
296
  "qwen/qwq-32b-preview": 1,
297
- "QWEN/QWQ-32B-PREVIEW": 1,
297
+ "Qwen/QwQ-32B-Preview": 1,
298
298
 
299
299
  "qwen1.5-7b-chat": 0.05, # 特价
300
300
  "qwen1.5-14b-chat": 0.7,
@@ -606,7 +606,7 @@ COMPLETION_RATIO = {
606
606
 
607
607
  "qwen-turbo-2024-11-01": 3,
608
608
  "qwen/qwq-32b-preview": 2,
609
- "QWEN/QWQ-32B-PREVIEW": 2,
609
+ "Qwen/QwQ-32B-Preview": 2,
610
610
 
611
611
  }
612
612
 
@@ -11,6 +11,60 @@ from enum import Enum
11
11
 
12
12
  from meutils.pipe import *
13
13
 
14
+ # "NOT_START", "SUBMITTED", "QUEUED", "IN_PROGRESS", "FAILURE", "SUCCESS", "UNKNOWN"
15
+
16
+ STATUSES = {
17
+ "not_start": "NOT_START",
18
+
19
+ "submitted": "SUBMITTED",
20
+
21
+ "starting": "QUEUED",
22
+ "queued": "QUEUED",
23
+ "STARTED": "QUEUED",
24
+ "started": "QUEUED",
25
+ "pending": "QUEUED",
26
+ "PENDING": "QUEUED",
27
+
28
+ "processing": "IN_PROGRESS",
29
+ "in_progress": "IN_PROGRESS",
30
+ "received": "IN_PROGRESS",
31
+ "RECEIVED": "IN_PROGRESS",
32
+
33
+ "succeed": "SUCCESS",
34
+ "success": "SUCCESS",
35
+ "succeeded": "SUCCESS",
36
+
37
+ "failed": "FAILURE",
38
+ "canceled": "FAILURE",
39
+ "FAILURE": "FAILURE",
40
+ "failure": "FAILURE",
41
+
42
+ "unknown": "UNKNOWN",
43
+
44
+ }
45
+
46
+
47
+ class TaskResponse(BaseModel):
48
+ """异步任务 通用响应体"""
49
+ task_id: Optional[str] = None
50
+
51
+ code: Optional[int] = 0
52
+ message: Optional[str] = None
53
+ status: Optional[str] = "submitted"
54
+ data: Optional[Any] = None
55
+
56
+ # 系统水印:可以存token
57
+ # user_id: Optional[str] = None
58
+ system_fingerprint: Optional[str] = None
59
+
60
+ def __init__(self, /, **data: Any):
61
+ super().__init__(**data)
62
+ self.status = STATUSES.get(self.status, "UNKNOWN")
63
+
64
+ class Config:
65
+ # 允许额外字段,增加灵活性
66
+ extra = 'allow'
67
+
14
68
 
15
69
  class TaskType(str, Enum):
16
70
  # 存储
@@ -115,7 +169,16 @@ if __name__ == '__main__':
115
169
 
116
170
  # print('kling_vip'.startswith(TaskType.kling))
117
171
 
118
- print(Purpose.__members__)
119
- print(list(Purpose))
172
+ # print(Purpose.__members__)
173
+ # print(list(Purpose))
174
+ #
175
+ # print(Purpose.oss in Purpose.__members__)
176
+
177
+ # , ** {"a": 1, "system_fingerprint": 1}
178
+ response = TaskResponse(system_fingerprint="121")
179
+
180
+ print(response.model_dump())
181
+
182
+ response.__dict__.update({"a": 1, "system_fingerprint": 1})
120
183
 
121
- print(Purpose.oss in Purpose.__members__)
184
+ print(response.model_dump())
@@ -8,7 +8,31 @@
8
8
  # @Software : PyCharm
9
9
  # @Description :
10
10
 
11
+ from typing import Optional, Union
11
12
 
12
13
  from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
14
+ from fastapi import Depends, HTTPException, status
13
15
 
14
- get_bearer_token = HTTPBearer()
16
+ http_bearer = HTTPBearer()
17
+
18
+
19
+ # get_bearer_token = http_bearer
20
+
21
+
22
+ # 定义获取token的函数
23
+ async def get_bearer_token(
24
+ auth: Optional[HTTPAuthorizationCredentials] = Depends(http_bearer)
25
+ ) -> Optional[str]:
26
+ """
27
+ 获取Bearer token
28
+ :param auth: HTTP认证凭证
29
+ :return: token字符串
30
+ """
31
+ if auth is None:
32
+ return None
33
+
34
+ return auth.credentials
35
+
36
+
37
+ if __name__ == '__main__':
38
+ pass
@@ -78,7 +78,7 @@ def limit(limit_value='3/second', error_message: Optional[str] = None, **kwargs)
78
78
 
79
79
 
80
80
  def check_api_key(auth: HTTPAuthorizationCredentials):
81
- api_key = auth and auth.credentials or None
81
+ api_key = auth
82
82
  if api_key is None:
83
83
  detail = {
84
84
  "error": {