MeUtils 2025.1.3.16.13.27__py3-none-any.whl → 2025.1.6.14.2.0__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: 2025.1.3.16.13.27
3
+ Version: 2025.1.6.14.2.0
4
4
  Summary: description
5
5
  Home-page: https://github.com/yuanjie-ai/MeUtils
6
6
  Author: yuanjie
@@ -63,42 +63,42 @@ Requires-Dist: sse-starlette ; extra == 'ai'
63
63
  Requires-Dist: openai ; extra == 'ai'
64
64
  Requires-Dist: langchain ; extra == 'ai'
65
65
  Provides-Extra: all
66
+ Requires-Dist: pymongo ; extra == 'all'
67
+ Requires-Dist: sse-starlette ; extra == 'all'
66
68
  Requires-Dist: jmespath ; extra == 'all'
67
- Requires-Dist: pandas-profiling[notebook] ; extra == 'all'
68
- Requires-Dist: filetype ; extra == 'all'
69
- Requires-Dist: gunicorn ; extra == 'all'
69
+ Requires-Dist: openai ; extra == 'all'
70
70
  Requires-Dist: pretty-errors ; extra == 'all'
71
- Requires-Dist: redis-py-cluster ; extra == 'all'
72
- Requires-Dist: sqlalchemy ; extra == 'all'
73
- Requires-Dist: missingno ; extra == 'all'
74
- Requires-Dist: langchain ; extra == 'all'
75
- Requires-Dist: pymysql ; extra == 'all'
76
- Requires-Dist: geopy ; extra == 'all'
71
+ Requires-Dist: fastapi[all] ; extra == 'all'
72
+ Requires-Dist: filetype ; extra == 'all'
73
+ Requires-Dist: reportlab ; extra == 'all'
77
74
  Requires-Dist: pyarrow ; extra == 'all'
75
+ Requires-Dist: simplejson ; extra == 'all'
76
+ Requires-Dist: seaborn ; extra == 'all'
77
+ Requires-Dist: cachetools ; extra == 'all'
78
+ Requires-Dist: fastapi ; extra == 'all'
79
+ Requires-Dist: iteration-utilities ; extra == 'all'
78
80
  Requires-Dist: faiss-cpu ; extra == 'all'
79
- Requires-Dist: jieba ; extra == 'all'
80
- Requires-Dist: openai ; extra == 'all'
81
- Requires-Dist: thefuck ; extra == 'all'
81
+ Requires-Dist: redis-py-cluster ; extra == 'all'
82
+ Requires-Dist: thriftpy2 ; extra == 'all'
83
+ Requires-Dist: geopy ; extra == 'all'
84
+ Requires-Dist: sqlalchemy ; extra == 'all'
82
85
  Requires-Dist: asyncmy ; extra == 'all'
86
+ Requires-Dist: gunicorn ; extra == 'all'
87
+ Requires-Dist: missingno ; extra == 'all'
83
88
  Requires-Dist: schedule ; extra == 'all'
84
- Requires-Dist: seaborn ; extra == 'all'
89
+ Requires-Dist: thefuck ; extra == 'all'
90
+ Requires-Dist: pandas-profiling[notebook] ; extra == 'all'
91
+ Requires-Dist: pymysql ; extra == 'all'
85
92
  Requires-Dist: pymilvus ; extra == 'all'
86
- Requires-Dist: thriftpy2 ; extra == 'all'
87
- Requires-Dist: sse-starlette ; extra == 'all'
88
- Requires-Dist: dataframe-image ; extra == 'all'
89
93
  Requires-Dist: jinja2 ; extra == 'all'
90
- Requires-Dist: fastapi[all] ; extra == 'all'
91
- Requires-Dist: pymupd ; extra == 'all'
92
- Requires-Dist: cachetools ; extra == 'all'
93
- Requires-Dist: iteration-utilities ; extra == 'all'
94
- Requires-Dist: fastapi ; extra == 'all'
95
94
  Requires-Dist: polars ; extra == 'all'
96
- Requires-Dist: pandas-summary ; extra == 'all'
97
- Requires-Dist: pymongo ; extra == 'all'
98
- Requires-Dist: simplejson ; extra == 'all'
99
- Requires-Dist: reportlab ; extra == 'all'
95
+ Requires-Dist: jieba ; extra == 'all'
100
96
  Requires-Dist: streamlit ; extra == 'all'
97
+ Requires-Dist: langchain ; extra == 'all'
101
98
  Requires-Dist: uvicorn ; extra == 'all'
99
+ Requires-Dist: dataframe-image ; extra == 'all'
100
+ Requires-Dist: pymupd ; extra == 'all'
101
+ Requires-Dist: pandas-summary ; extra == 'all'
102
102
  Provides-Extra: ann
103
103
  Requires-Dist: pymilvus ; extra == 'ann'
104
104
  Requires-Dist: faiss-cpu ; extra == 'ann'
@@ -92,9 +92,9 @@ examples/_openaisdk/openai_aiplus.py,sha256=7sT2t4jjZBABFiwKQwUjgdilO8s006NuPAPx
92
92
  examples/_openaisdk/openai_audio.py,sha256=ZyYslH9RfdJBpNUpjKn_5x0d94_H291Qt31u_6weISc,484
93
93
  examples/_openaisdk/openai_baichuan.py,sha256=4_Gz8FeRrW5Zwnh-KFmaLOXr6sn3AxU47Qd2j8VDiQU,1527
94
94
  examples/_openaisdk/openai_cache.py,sha256=89GbJ1QlqQbVxlUeuFgEbwDYHOkum7BK0zB-CqmDAZU,726
95
- examples/_openaisdk/openai_chatfire.py,sha256=nuaGDz1ANW2AAYxyfKD8Glr-n1C2-l1GmFw_Ea56xT0,17303
95
+ examples/_openaisdk/openai_chatfire.py,sha256=KJMFPM37-9Vb9aE4mLFHt-xgtscjMgiZm5u0UQYPNdY,17249
96
96
  examples/_openaisdk/openai_chatfire_all.py,sha256=DaiI1NfDeK655QvXyczkgXK9Awxp7NBe71LHA7trxGE,4831
97
- examples/_openaisdk/openai_deepinfra.py,sha256=uFbjFWSKIiUb79_mgOlMe00rQITKS4INsi1Heb4stNQ,1171
97
+ examples/_openaisdk/openai_deepinfra.py,sha256=RuIU7-7JFOpgFo19nLK2yqv3b8_XXYzGA4VJlmqD0oc,1188
98
98
  examples/_openaisdk/openai_deepseek.py,sha256=-1WyTX5EfB8bdVhZ-y2yZQ04fVzujp4OPmOQR6i3QxI,660
99
99
  examples/_openaisdk/openai_doubao.py,sha256=dp0SLvDBYpIJPNs_vnV2GBIEFa9FglNtYvfGKtJ9Bqk,1053
100
100
  examples/_openaisdk/openai_embeddings.py,sha256=cBF0bK_saOadjietR1uZ3TrlhO30H4CuYdEEC1bwV2Q,866
@@ -102,7 +102,7 @@ examples/_openaisdk/openai_files.py,sha256=gfUbKGZg5P7c3kSMfwalIThi_SEs8O-JTqx49
102
102
  examples/_openaisdk/openai_gitee.py,sha256=TfuvFl6E2MubHJQO4hv-5r80bQUgwUWP1jAtIY9bDaU,870
103
103
  examples/_openaisdk/openai_god.py,sha256=O8fbhyxiIlVR7pTvBTXgQ2QTwfcZ2MkEIyDe_jp797A,1056
104
104
  examples/_openaisdk/openai_groq.py,sha256=_5Ue1yEx0Gp6theFioB_D8kepR0UlqMU96PVGH-LkVY,7363
105
- examples/_openaisdk/openai_images.py,sha256=IZJY6h2Aq0HUWMwOWupwsSKVn11SVeiqSmzaiO0384c,5185
105
+ examples/_openaisdk/openai_images.py,sha256=mse55VRZqAnymnJRtfpaQwXOqvbHI9-HY_9G127QSMQ,5208
106
106
  examples/_openaisdk/openai_json.py,sha256=M4tq_IkzYbmtgbFilGQHmRdJhH0OltiwGk7cK7uc-sQ,1850
107
107
  examples/_openaisdk/openai_modelscope.py,sha256=sOtTaoy56nONKRzEFODa1Rg7YZd81ksEGQNuxL0H858,1390
108
108
  examples/_openaisdk/openai_moon.py,sha256=Y7RrB6SUi9taQOlA50nfGTpQa9ON6XmPmrxtL-hSL8M,1753
@@ -367,11 +367,12 @@ meutils/apis/jiema/24mail.py,sha256=GUszRtoDe3T9q-X4embwT5YhcjgQ3XnkTJMKX93sCF4,
367
367
  meutils/apis/jiema/__init__.py,sha256=YBybggoDRYCNYcwJOypxR7MzfTjIhqO7BkGlTt7NDo4,271
368
368
  meutils/apis/jiema/yezi.py,sha256=26vhnA3lC5049Rqx-CHO-wyGKbdZAfvjEOG90W38cr0,3675
369
369
  meutils/apis/jimeng/__init__.py,sha256=a8CE_cOl9jqal0hycwaLm4Mnga8jmZlz9nCze_9bBqA,272
370
- meutils/apis/jimeng/common.py,sha256=wIduTWmtJJQWIbxDMVvQ9BlDheiGbeROPNuulfiwiNY,8819
370
+ meutils/apis/jimeng/common.py,sha256=5pH-qJsas8ocnwXWuHnBa0Pbniv6a6Q3uRyt53kjjno,11363
371
371
  meutils/apis/jimeng/doubao.py,sha256=vSEaTQHQdyhpHwCoq6CIikDZkUC9ncyTgKxGUC8cMCI,4345
372
372
  meutils/apis/jimeng/doubao_utils.py,sha256=XCHnvwfCOtJmPQuzDOCfKDMP_Pcqh-Y4w2h5f7Y2gzM,5999
373
- meutils/apis/jimeng/files.py,sha256=aFKg5iesJNVbXclaMR0yDpnKzjqW1yZxkyp9qrGTybo,5365
373
+ meutils/apis/jimeng/files.py,sha256=CBJ8W9pFy7D_GpV7buX3J9LMoqBYxl-EvrxkIYSu9s8,7523
374
374
  meutils/apis/jimeng/images.py,sha256=Z1w8Jxqvom-rBB9MSfQz4QvfPLTEoamwyb9X9_yUmBk,4641
375
+ meutils/apis/jimeng/lip_sync.py,sha256=rynQPNngltS73GmuWbpMIuuAr0srZP5kUh0FMY6Ynas,267
375
376
  meutils/apis/kling/__init__.py,sha256=pKz40SEjui1dhHBD-icyNTJOYhzLvxLxJCwszuH4vio,271
376
377
  meutils/apis/kling/api.py,sha256=AuVQ9URmrbTlz7dEv_kIyhA9fMTZPL9rF3Td6KxTIMA,2183
377
378
  meutils/apis/kling/images.py,sha256=FcCkvA4x1Po3SuugfQa8klT0Lrj7fq4N8kbzx6luUxI,5095
@@ -446,7 +447,7 @@ meutils/apis/uptime_kuma/国产分组.py,sha256=OIiUUFfjWEEJHg5fr8Vf5xSBWkbXboQ4
446
447
  meutils/apis/videos/__init__.py,sha256=OCykr_XRIOH18Xh5hfBq5yMxbk8e9Myk4KuAtrtgAWw,272
447
448
  meutils/apis/videos/sora.py,sha256=G3wGlvTYl4YfG20L2HXPhmhZ4HwrlIFSU-KYM-TdALg,295
448
449
  meutils/apis/vidu/__init__.py,sha256=8nQN-RiZGJlZaZGVFbtHgK57_Ml5g_vFCiOImWwBm0I,242
449
- meutils/apis/vidu/vidu_video.py,sha256=GO9ghu9K5IfOiCySUi9y2P7PYG67t7GBjfDJ8jtSB60,17435
450
+ meutils/apis/vidu/vidu_video.py,sha256=-_fA8UqOEY586ZKY5tcPulprtLczjGYdx7B3f_Y5jRg,17503
450
451
  meutils/apis/vidu/x.py,sha256=UD1QlAQTtLgFiDfWYVxM-1ppfrX_LaVYASk2yNviMuk,322
451
452
  meutils/apis/voice_clone/__init__.py,sha256=y7Rpn90LocHhA0ywrDP_fT4QAK7sr4JsIX5wLJgkNHA,241
452
453
  meutils/apis/voice_clone/fish.py,sha256=6m8zcS2KEqmalKy2ArnOaNovyxsQp_sw4d_O1kVZR2s,7146
@@ -496,14 +497,14 @@ meutils/config_utils/lark_utils/demo.py,sha256=3g0Fs7oLaeW75T60gYWMLgyNg1OnfOjfH
496
497
  meutils/config_utils/lark_utils/x.py,sha256=MlMQGhehP9xMEgetxVCX68XFaosfKoW1JA5cZ3JqN2w,1857
497
498
  meutils/crawlers/__init__.py,sha256=TBU4xA-IOsHV-0yIkW7YXxn_QT7TT8NncqxO7IykEfs,271
498
499
  meutils/data/SimHei.ttf,sha256=-XEnekS5yHP_URkT4XBI2w22ylV-KxudhkeIYFbrILA,10062565
499
- meutils/data/VERSION,sha256=Z6hm0dQGKZhARlzt9gXSisXp3qnswB3cIZfQHxjx8k4,19
500
+ meutils/data/VERSION,sha256=IzPvVWYL2-sLGYcTp81LyEEKQT85xqXi_ENDakkB9m0,19
500
501
  meutils/data/_FLAG,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
501
502
  meutils/data/_SUCCESS,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
502
503
  meutils/data/__init__.py,sha256=Hfwkkxs4zHqKhxht0YrhS566a9P5axtmgNvM5wF8ceQ,243
503
504
  meutils/data/coordinate.py,sha256=VbFtcdho0XG4j-rZD0DgqcIf2_LR2LlbLtfhLXbxiDY,600
504
505
  meutils/data/cowboy-hat-face.webp,sha256=AHi2t-WclDVKWgGEe-oZzI4xKACNlgGWUgd622y0K-E,24814
505
506
  meutils/data/oneapi/FOOTER.md,sha256=UHv39ey2ICocxPoCj-UI_PWyyWxZYLS8zG1inqtWNQ4,448
506
- meutils/data/oneapi/NOTICE.md,sha256=9DgXxAvF4OBuo1-r8UW32gy2T2f0WtGT2iDNBilHgHw,6353
507
+ meutils/data/oneapi/NOTICE.md,sha256=P1H4grW302AXVljWHZq9o2FQvGyiznpdDsDItogUofg,6224
507
508
  meutils/data/oneapi/__init__.py,sha256=cm2Kq2RDXPfdVMWcoBB77bu00zJpTDd21Rgc6bTlhws,398
508
509
  meutils/db/__init__.py,sha256=HR99rqxoFTWXUHDhLVl33tzIn8M86gigHLmEzOKH1Ec,7637
509
510
  meutils/db/mongo.py,sha256=B-B_t939rxtnNGt0PxhivjIUwinmHPzLUpXsjUIaTkQ,2337
@@ -708,14 +709,14 @@ meutils/schemas/translator_types.py,sha256=xufNQeyim7RhkzAK_J5_JchZfqaUBDXFwMtrP
708
709
  meutils/schemas/tripo3d_types.py,sha256=mQF65HwHYmczRgAIuXK5hGxWDWNYDq-Xu9pja7Dwy4o,1452
709
710
  meutils/schemas/tryblend_types.py,sha256=glZ0diRJvZmfQotcCWYBA832inihy8TvVWxWZ64CzWA,27793
710
711
  meutils/schemas/video_types.py,sha256=UxKg4BT5WGHdzRDqnumWX3dDmZ3M7s6baWqVn_pETtk,1783
711
- meutils/schemas/vidu_types.py,sha256=F1ysI-LvO7mlv0uGkqQ_fyUD5g6qs027SV50g-bWdyo,5423
712
+ meutils/schemas/vidu_types.py,sha256=KQ1V-vjs11n3C7G6mowoucEL4KUsc5JdL5P45VtdehI,6075
712
713
  meutils/schemas/wechat_types.py,sha256=XtIJpMNBzkqBcU68Qno8bnUfHzDOXwFNCIL-6VYQKOA,9260
713
714
  meutils/schemas/yuanbao_types.py,sha256=ZmB-7_eAuTU3QDonNgy0vcVP4YQNwA5yJ8G4mvfOmUE,11966
714
715
  meutils/schemas/db/__init__.py,sha256=m1maURVoM6dIW0yt6ELZrZTzULtkHybVOSXtHNJRVIU,272
715
716
  meutils/schemas/db/oneapi_types.py,sha256=U_foX82tejUT7efCqyMMTLfq-C4LXMXsmwz5pfldwNw,3734
716
717
  meutils/schemas/oneapi/__init__.py,sha256=uevbi3QAvFzN9WPbx9bYKTDyKt7P2ueZO6W0nSiD0sk,289
717
718
  meutils/schemas/oneapi/_types.py,sha256=ClvAaNy3SahEN8lL8KEErHTD6HANelXUeKc_3iLfosQ,1488
718
- meutils/schemas/oneapi/common.py,sha256=3Oe6a4-a7suvonJokPzNdU8i470mFzg_K3pGfdCE9Oc,24038
719
+ meutils/schemas/oneapi/common.py,sha256=8hsws_zwIRq4SsgjS1oyunbx9npyblAC7OMUPfBSbf0,24073
719
720
  meutils/schemas/oneapi/icons.py,sha256=T7W5gInBJoHe62wzMimbG_UI-wn3_-rmQ1O4O2z-CQY,1089
720
721
  meutils/schemas/oneapi/model_group_info.py,sha256=rGtflYJuFIjk5MsVEvK9JUR4IciX8jfErqeLqf8DIlQ,1586
721
722
  meutils/schemas/oneapi/model_info.py,sha256=_uwKEPIIqm7ZYfhmpxtXB2QNsS83SpJY-OaBzvogC9w,772
@@ -843,9 +844,9 @@ meutils/tools/seize.py,sha256=nOKAS63w-Lbi48I0m2MPhdsokUTwxco0laPxYVmW4Mw,1064
843
844
  meutils/tools/service_monitor.py,sha256=ibsLtBN2g2DL7ZnLJ8vhiZOiOcqTAyx711djDdBK-3M,1255
844
845
  meutils/tools/sys_monitor.py,sha256=6MoyzrItqDUOSjfHcMJmMofQkEPTW36CT_aKui0rg84,429
845
846
  meutils/tools/token_monitor.py,sha256=Np-YK-R4P4IPAXyZvMxwvXI4sFmNJQAQK1lSegNaYpA,997
846
- MeUtils-2025.1.3.16.13.27.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
847
- MeUtils-2025.1.3.16.13.27.dist-info/METADATA,sha256=uhe4zsF0-u8MggPXHiNUPNXM5EsQJg0BFxUMHd1ChR8,6201
848
- MeUtils-2025.1.3.16.13.27.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
849
- MeUtils-2025.1.3.16.13.27.dist-info/entry_points.txt,sha256=lufZlBHRqqZKdY-ZQJ4CSZb0qhV5hQC37egZna9M7ug,357
850
- MeUtils-2025.1.3.16.13.27.dist-info/top_level.txt,sha256=cInfxMmkgNOskurdjwP5unau4rA7Uw48nu07tYhS7KY,22
851
- MeUtils-2025.1.3.16.13.27.dist-info/RECORD,,
847
+ MeUtils-2025.1.6.14.2.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
848
+ MeUtils-2025.1.6.14.2.0.dist-info/METADATA,sha256=FnRl_F5YO0UdqhhNkghgqoVz2VGReJ_iuYe1Kmzy06E,6199
849
+ MeUtils-2025.1.6.14.2.0.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
850
+ MeUtils-2025.1.6.14.2.0.dist-info/entry_points.txt,sha256=lufZlBHRqqZKdY-ZQJ4CSZb0qhV5hQC37egZna9M7ug,357
851
+ MeUtils-2025.1.6.14.2.0.dist-info/top_level.txt,sha256=cInfxMmkgNOskurdjwP5unau4rA7Uw48nu07tYhS7KY,22
852
+ MeUtils-2025.1.6.14.2.0.dist-info/RECORD,,
@@ -199,12 +199,12 @@ if __name__ == '__main__':
199
199
  models = [
200
200
  # 'doubao-pro-128k',
201
201
  # "ai-search-pro:scholar",
202
- "ppu-1"
202
+ # "gpt-4o-2024-11-20"
203
+ "grok-2-1212"
203
204
  ]
204
- # check_models(models, api_key=os.getenv("OPENAI_API_KEY"))
205
+ check_models(models, api_key=os.getenv("OPENAI_API_KEY"))
205
206
  # check_models(models, api_key=os.getenv("OPENAI_API_KEY_OPENAI"))
206
207
 
207
- check_models(models, api_key="sk-iPNbgHSRkQ9VUb6iAcCa7a4539D74255A6462d29619d6519")
208
208
 
209
209
 
210
210
  #
@@ -27,7 +27,7 @@ try:
27
27
  model="deepseek-ai/DeepSeek-V3",
28
28
  # model="xxxxxxxxxxxxx",
29
29
  messages=[
30
- {"role": "user", "content": "你是谁"}
30
+ {"role": "user", "content": "你是deepseek什么版本"}
31
31
  ],
32
32
  # # top_p=0.7,
33
33
  # top_p=None,
@@ -130,8 +130,9 @@ with timer('image'):
130
130
  # model = "black-forest-labs/FLUX.1-dev"
131
131
  # model = "flux-dev"
132
132
 
133
+
133
134
  client = OpenAI(
134
- # api_key=os.getenv("OPENAI_API_KEY") + "-359",
135
+ api_key=os.getenv("OPENAI_API_KEY") + "-531",
135
136
  # api_key='13OafcA8KSNO4XLrBR4DpvgVV9d59KCvPAmEdrtsvOIcU4T50B0EGstjLEqPnBI2N',
136
137
 
137
138
  # api_key=os.getenv("SILICONFLOW_API_KEY"),
@@ -166,6 +167,8 @@ with timer('image'):
166
167
  model = 'flux-schnell'
167
168
  model = 'flux-schnell'
168
169
  model = 'seededit'
170
+ model = 'dall-e-3'
171
+
169
172
 
170
173
  # response = client.images.generate(
171
174
  # model=model,
@@ -12,6 +12,8 @@ from openai import AsyncClient
12
12
  from meutils.pipe import *
13
13
  from meutils.hash_utils import md5
14
14
  from meutils.schemas.image_types import ImageRequest
15
+ from meutils.schemas.openai_types import TTSRequest
16
+
15
17
  from meutils.schemas.jimeng_types import BASE_URL, MODELS_MAP
16
18
  from meutils.str_utils.regular_expression import parse_url
17
19
  from meutils.apis.jimeng.files import upload
@@ -241,6 +243,76 @@ async def create_draft_content(request: ImageRequest, token: str):
241
243
  return draft_content
242
244
 
243
245
 
246
+ def create_photo_lip_sync(request: TTSRequest):
247
+ # 映射
248
+ tts_info = {
249
+ "name": request.voice or "魅力姐姐",
250
+ "text": request.input, # "永远相信美好的事情即将发生"
251
+ "speed": request.seed or 1,
252
+ "source_type": "text-to-speech",
253
+ "tone_category_id": 0,
254
+ "tone_category_key": "all",
255
+ "tone_id": "7382879492752019995",
256
+ "toneKey": request.voice or "魅力姐姐",
257
+ }
258
+ payload = {
259
+ "promptSource": "photo_lip_sync",
260
+ "generateTimes": 1,
261
+ "lipSyncInfo": tts_info,
262
+ "isUseAiGenPrompt": False,
263
+ "batchNumber": 1
264
+ }
265
+
266
+ return {
267
+ "submit_id": "",
268
+ "task_extra": json.dumps(payload),
269
+ "http_common_info": {
270
+ "aid": 513695
271
+ },
272
+ "input": {
273
+ "seed": 1834980836,
274
+ "video_gen_inputs": [
275
+ {
276
+ "v2v_opt": {},
277
+ "i2v_opt": {
278
+ "realman_avatar": {
279
+ "enable": true,
280
+ "origin_image": {
281
+ "width": 480,
282
+ "height": 270,
283
+ "image_uri": "tos-cn-i-tb4s082cfz/fae8f746367b40f5a708bf0f1e84de11",
284
+ "image_url": "" ########## https://oss.ffire.cc/files/kling_watermark.png
285
+ },
286
+ "resource_id_loopy": "34464cac-5e3e-46be-88ff-ccbc7da4d742",
287
+ "resource_id_std": "2f66b408-37c3-4de5-b8a4-ba15c104612e",
288
+ "origin_audio": {
289
+ "duration": 3.216,
290
+ "vid": "v02bc3g10000ctrpqrfog65purfpn7a0"
291
+ },
292
+ "tts_info": json.dumps(tts_info)
293
+ }
294
+ },
295
+ "audio_vid": "v02bc3g10000ctrpqrfog65purfpn7a0",
296
+ "video_mode": 4
297
+ }
298
+ ]
299
+ },
300
+ "mode": "workbench",
301
+ "history_option": {},
302
+ "commerce_info": {
303
+ "resource_id": "generate_video",
304
+ "resource_id_type": "str",
305
+ "resource_sub_type": "aigc",
306
+ "benefit_type": "lip_sync_avatar_std"
307
+ },
308
+ "scene": "lip_sync_image",
309
+ "client_trace_data": {},
310
+ "submit_id_list": [
311
+ "d4554e2c-707f-4ebe-b4e6-93aa6687d1c1"
312
+ ]
313
+ }
314
+
315
+
244
316
  if __name__ == '__main__':
245
317
  token = "693701c43e477b7c405cc7e2fef0ddbd"
246
318
  token = "eb4d120829cfd3ee957943f63d6152ed"
@@ -42,7 +42,7 @@ def u(params):
42
42
 
43
43
 
44
44
  class JJRequest:
45
- def __init__(self, e, t, api, method="GET", params=None, data=None):
45
+ def __init__(self, e, t, api, method="GET", params=None, data=None, serviceName="imagex"):
46
46
  self.t = t
47
47
  self.e = e
48
48
  self.api = api
@@ -50,14 +50,18 @@ class JJRequest:
50
50
  self.params = params
51
51
  self.data = data
52
52
 
53
+ self.serviceName = serviceName
54
+
53
55
  def getAuthorization(self):
54
- return f"AWS4-HMAC-SHA256 Credential={self.e['access_key_id']}/{self.t[0:8]}/cn-north-1/imagex/aws4_request, SignedHeaders=x-amz-date;x-amz-security-token, Signature={self.signature()}"
56
+ return f"AWS4-HMAC-SHA256 Credential={self.e['access_key_id']}/{self.t[0:8]}/cn-north-1/{self.serviceName}/aws4_request, SignedHeaders=x-amz-date;x-amz-security-token, Signature={self.signature()}"
55
57
 
56
58
  def signature(self):
57
59
  r = self.getSigningKey()
58
60
  return hmac_hash256(r, self.stringToSign()).hexdigest()
59
61
 
60
- def getSigningKey(self, r="cn-north-1", n="imagex"):
62
+ def getSigningKey(self, r="cn-north-1"):
63
+ n = self.serviceName
64
+
61
65
  o = hmac_hash256("AWS4" + self.e['secret_access_key'], str(self.t[0:8]))
62
66
  i = hmac_hash256(o, str(r))
63
67
  s = hmac_hash256(i, str(n))
@@ -71,8 +75,8 @@ class JJRequest:
71
75
  t.append(hash256(self.canonicalString()))
72
76
  return "\n".join(t)
73
77
 
74
- def credentialString(self, region="cn-north-1", serviceName="imagex"):
75
- return "/".join([self.t[0:8], region, serviceName, "aws4_request"])
78
+ def credentialString(self, region="cn-north-1"):
79
+ return "/".join([self.t[0:8], region, self.serviceName, "aws4_request"])
76
80
 
77
81
  def canonicalString(self):
78
82
  e = []
@@ -169,6 +173,77 @@ def upload(image: bytes, upload_token: dict): # oss 跨账号不知道是否可
169
173
  return oss_uri
170
174
 
171
175
 
176
+ @cache(ttl=15 * 60)
177
+ def upload_for_vod(image: bytes, upload_token: dict): # oss 跨账号不知道是否可以使用
178
+ # e = auth = upload_token['data']['auth'] # 豆包
179
+ data = upload_token['data']
180
+ service_id = data.get('service_id', '3jr8j4ixpe') # 即梦 3jr8j4ixpe 豆包 a9rns2rl98
181
+
182
+ if 'auth' in data:
183
+ data = data['auth']
184
+
185
+ session_token = data['session_token']
186
+
187
+ t = time.strftime("%Y%m%dT%H%M%SZ", time.gmtime())
188
+
189
+ params = {
190
+ "Action": "ApplyUploadInner",
191
+ "Version": "2020-11-19",
192
+ # "ServiceId": service_id,
193
+ "SpaceName": "artist_op",
194
+
195
+ "s": random_str(10),
196
+
197
+ "FileType": "video",
198
+ "FileSize": len(image),
199
+
200
+ }
201
+
202
+ r = JJRequest(data, t, "https://vod.bytedanceapi.com/", method="GET", params=params, serviceName="vod")
203
+ headers = {
204
+ 'authorization': r.getAuthorization(),
205
+ 'x-amz-date': t,
206
+ 'x-amz-security-token': session_token,
207
+ }
208
+ # logger.debug(headers)
209
+ response = requests.get(r.api, params=params, headers=headers)
210
+ response.raise_for_status()
211
+ logger.debug(response.status_code)
212
+ response = response.json()
213
+
214
+ logger.debug(bjson(response))
215
+ if "Result" not in response:
216
+ return
217
+
218
+ upload_node = response['Result']['InnerUploadAddress']['UploadNodes'][0]
219
+ store_info = upload_node['StoreInfos'][0]
220
+ logger.debug(bjson(store_info))
221
+
222
+ vid = upload_node['Vid']
223
+ upload_host = upload_node['UploadHost']
224
+
225
+ oss_uri = store_info['StoreUri']
226
+ oss_token = store_info['Auth']
227
+
228
+ headers = {
229
+ "authorization": oss_token,
230
+ "content-length": str(len(image)),
231
+ "content-Type": "image/jpeg",
232
+ "content-crc32": fileCRC32(image),
233
+ }
234
+
235
+ # upload_url = f"https://tos-hl-x.snssdk.com/upload/v1/{oss_uri}"
236
+ upload_url = f"https://{upload_host}/upload/v1/{oss_uri}"
237
+
238
+ response = requests.post(upload_url, headers=headers, data=image)
239
+ response.raise_for_status()
240
+ response = response.json()
241
+
242
+ logger.debug(response)
243
+
244
+ return oss_uri
245
+
246
+
172
247
  if __name__ == "__main__":
173
248
  from meutils.apis.jimeng.common import get_upload_token
174
249
 
@@ -176,12 +251,13 @@ if __name__ == "__main__":
176
251
  token = "de2215a7bb8e442774cf388f03fac84c"
177
252
 
178
253
  # jimeng
179
- token = "693701c43e477b7c405cc7e2fef0ddbd"
254
+ token = "eb4d120829cfd3ee957943f63d6152ed"
180
255
  #
181
256
  upload_token = arun(get_upload_token(token))
182
257
 
183
258
  #
184
- # with open("11.jpg", "rb") as f:
185
- # file = image = f.read()
186
- #
187
- # upload(image, upload_token)
259
+ with open("11.jpg", "rb") as f:
260
+ file = image = f.read()
261
+
262
+ # upload(image, upload_token)
263
+ print(upload_for_vod(image, upload_token))
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+ # @Project : AI. @by PyCharm
4
+ # @File : lip_sync
5
+ # @Time : 2025/1/3 16:17
6
+ # @Author : betterme
7
+ # @WeChat : meutils
8
+ # @Software : PyCharm
9
+ # @Description :
10
+
11
+ from meutils.pipe import *
@@ -206,20 +206,21 @@ if __name__ == '__main__':
206
206
  # arun(get_credits(token))
207
207
  #
208
208
  d = {
209
- "prompt": "一条可爱的狗跑过来",
210
- # "url": url # failed to save uploads
209
+ "model": 'vidu-1.5',
210
+ "prompt": "这个女人笑起来",
211
+ "url": "https://oss.ffire.cc/files/kling_watermark.png" # failed to save uploads
211
212
  }
212
213
  token = None
213
214
  # print(bjson(ViduRequest(**d).payload))
214
- # arun(create_task(ViduRequest(**d)))
215
+ arun(create_task(ViduRequest(**d)))
215
216
  # arun(create_task(ViduRequest(**d), vip=False))
216
217
  # # pass
217
218
  # token = "sensorsdata2015jssdkcross=dfm-enc-%7B%22Va28a6y8_aV%22%3A%22sSsAAnHAInAGEtIG%22%2C%22gae28_aV%22%3A%22EGEuAnststSEirt-ARSAigSVHIiHVs-EtHsHnIR-sARInAA-EGEuAnststHsIti%22%2C%22OemO2%22%3A%7B%22%24ki8r28_8eiggay_2mbeyr_8cOr%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24ki8r28_2rieyz_lrcMmeV%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%2C%22%24ki8r28_ergreere%22%3A%22%22%7D%2C%22aVr68a8ar2%22%3A%22rc3liZ7ku67OV5kgPsGCiskkDskl3qmawFlJPq0swqfcpXNJPZKSBF0IQXLzWq7lQFQzQZNcBF1SQF3EQqwIBF3MQhwswX08wFlJPq0swqfcpXKcwhzz3aMax9klWZHAiD7HDsJCWskbDskl3qmawqNcwX0sQF0hQq0HwFfhp4xG%22%2C%22za28mec_kmfa6_aV%22%3A%7B%226ior%22%3A%22%24aVr68a8c_kmfa6_aV%22%2C%22Cikbr%22%3A%22sSsAAnHAInAGEtIG%22%7D%7D;_ga=GA1.1.2058758439.1724312077;_ga_ZJBV7VYP55=GS1.1.1727080335.38.1.1727080510.0.0.0;JWT=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MjgzNTAzODAsImlhdCI6MTcyNzA1NDM4MCwiaXNzIjoiaWFtIiwic3ViIjoiMjQyMDA2NTAzNjA5MTgzOSJ9.PkjQqjYB56vYetYwmlagnWn_6bSCwoxCjI7BjfelBOU;Shunt="
218
219
  # # token = "_ga=GA1.1.2058758439.1724312077; JWT=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MjgzNTAzODAsImlhdCI6MTcyNzA1NDM4MCwiaXNzIjoiaWFtIiwic3ViIjoiMjQyMDA2NTAzNjA5MTgzOSJ9.PkjQqjYB56vYetYwmlagnWn_6bSCwoxCjI7BjfelBOU; Shunt=; sensorsdata2015jssdkcross=dfm-enc-%7B%22Va28a6y8_aV%22%3A%22sSsAAnHAInAGEtIG%22%2C%22gae28_aV%22%3A%22EGEuAnststSEirt-ARSAigSVHIiHVs-EtHsHnIR-sARInAA-EGEuAnststHsIti%22%2C%22OemO2%22%3A%7B%22%24ki8r28_8eiggay_2mbeyr_8cOr%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24ki8r28_2rieyz_lrcMmeV%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%2C%22%24ki8r28_ergreere%22%3A%22%22%7D%2C%22aVr68a8ar2%22%3A%22rc3liZ7ku67OV5kgPsGCiskkDskl3qmawFlJPq0swqfcpXNJPZKSBF0IQXLzWq7lQFQzQZNcBF1SQF3EQqwIBF3MQhwswX08wFlJPq0swqfcpXKcwhzz3aMax9klWZHAiD7HDsJCWskbDskl3qmawqNcwX0sQF0hQq0HwFfhp4xG%22%2C%22za28mec_kmfa6_aV%22%3A%7B%226ior%22%3A%22%24aVr68a8c_kmfa6_aV%22%2C%22Cikbr%22%3A%22sSsAAnHAInAGEtIG%22%7D%7D; _ga_ZJBV7VYP55=GS1.1.1727080335.38.1.1727080510.0.0.0"
219
220
  # token = "JWT=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MjgzNDkyNzQsImlhdCI6MTcyNzA1MzI3NCwiaXNzIjoiaWFtIiwic3ViIjoiMjQyMDg5NjA4MTIwNTkwNyJ9.MRXmSr48PifQgRN1-yTTu8d7Sq1An4OS7G5WoYpJ_PU"
220
221
 
221
- token = "_ga=GA1.1.1191408146.1725443726; Shunt=; JWT=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MzY0NzgzODIsImlhdCI6MTczNTE4MjM4MiwiaXNzIjoiaWFtIiwic3ViIjoiMjU3NTg1MzI5MDUyNzYwNiJ9.AJBuQH0B9aQ2znnczYoqBw9YvHkLh0uZF0QQx5xdxrc; sensorsdata2015jssdkcross=dfm-enc-%7B%22Va28a6y8_aV%22%3A%22sHRHtHIsGAHsRnAn%22%2C%22gae28_aV%22%3A%22EGEuyRHVigIEtAG-AGRuSsHrVAGRuS-EtHsHnIR-sARInAA-EGEuyRHVigSEuIR%22%2C%22OemO2%22%3A%7B%22%24ki8r28_8eiggay_2mbeyr_8cOr%22%3A%22%E8%87%AA%E7%84%B6%E6%90%9C%E7%B4%A2%E6%B5%81%E9%87%8F%22%2C%22%24ki8r28_2rieyz_lrcMmeV%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC%22%2C%22%24ki8r28_ergreere%22%3A%22z88O2%3A%2F%2Fiyymb682.fmmfkr.ymo%2F%22%7D%2C%22aVr68a8ar2%22%3A%22rc3liZ7ku67OV5kgPsGCiskkDskl3qmawFlJPowIQZ7zWqwJpX0HBF0HQs3AwqdkWX0HQs3ABF1SQF3EQqwIBF3MQhwswX08wFlJPowIQZ7zWqNJPqwI3aMax9klWZHAiD7HDsJCWskbDskl3qmawqKIQFfEwh3HwXKcQhPMQaxG%22%2C%22za28mec_kmfa6_aV%22%3A%7B%226ior%22%3A%22%24aVr68a8c_kmfa6_aV%22%2C%22Cikbr%22%3A%22sHRHtHIsGAHsRnAn%22%7D%7D; _ga_ZJBV7VYP55=GS1.1.1735182278.4.1.1735182405.26.0.0"
222
- arun(check_token(token))
222
+ # token = "_ga=GA1.1.1191408146.1725443726; Shunt=; JWT=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MzY0NzgzODIsImlhdCI6MTczNTE4MjM4MiwiaXNzIjoiaWFtIiwic3ViIjoiMjU3NTg1MzI5MDUyNzYwNiJ9.AJBuQH0B9aQ2znnczYoqBw9YvHkLh0uZF0QQx5xdxrc; sensorsdata2015jssdkcross=dfm-enc-%7B%22Va28a6y8_aV%22%3A%22sHRHtHIsGAHsRnAn%22%2C%22gae28_aV%22%3A%22EGEuyRHVigIEtAG-AGRuSsHrVAGRuS-EtHsHnIR-sARInAA-EGEuyRHVigSEuIR%22%2C%22OemO2%22%3A%7B%22%24ki8r28_8eiggay_2mbeyr_8cOr%22%3A%22%E8%87%AA%E7%84%B6%E6%90%9C%E7%B4%A2%E6%B5%81%E9%87%8F%22%2C%22%24ki8r28_2rieyz_lrcMmeV%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC%22%2C%22%24ki8r28_ergreere%22%3A%22z88O2%3A%2F%2Fiyymb682.fmmfkr.ymo%2F%22%7D%2C%22aVr68a8ar2%22%3A%22rc3liZ7ku67OV5kgPsGCiskkDskl3qmawFlJPowIQZ7zWqwJpX0HBF0HQs3AwqdkWX0HQs3ABF1SQF3EQqwIBF3MQhwswX08wFlJPowIQZ7zWqNJPqwI3aMax9klWZHAiD7HDsJCWskbDskl3qmawqKIQFfEwh3HwXKcQhPMQaxG%22%2C%22za28mec_kmfa6_aV%22%3A%7B%226ior%22%3A%22%24aVr68a8c_kmfa6_aV%22%2C%22Cikbr%22%3A%22sHRHtHIsGAHsRnAn%22%7D%7D; _ga_ZJBV7VYP55=GS1.1.1735182278.4.1.1735182405.26.0.0"
223
+ # arun(check_token(token))
223
224
  #
224
225
  # FEISHU_URL = "https://xchatllm.feishu.cn/sheets/GYCHsvI4qhnDPNtI4VPcdw2knEd?sheet=rxldsA"
225
226
  # FEISHU_URL="https://xchatllm.feishu.cn/sheets/GYCHsvI4qhnDPNtI4VPcdw2knEd?sheet=Hcr2i8"
meutils/data/VERSION CHANGED
@@ -1 +1 @@
1
- 2025.01.03.16.13.27
1
+ 2025.01.06.14.02.00
@@ -32,16 +32,15 @@
32
32
  </details>
33
33
 
34
34
  <details markdown="1">
35
- <summary><b>预祝大家新年快乐🎁元旦礼物☺</b></summary>
35
+ <summary><b>大额充值优惠</b></summary>
36
36
 
37
- - 联系企微客服
38
- - 充值100-200 增送5%
39
- - 充值200-500 增送10%
40
- - 充值500-1000 增送15%
41
- - 充值1000-2000 增送20%
37
+ - 充值1000-2000 增送10%
42
38
 
43
39
  </details>
44
40
 
41
+ ## 2025-01-04
42
+ - 增加模型配额 gemini-2.0-flash-exp、gemini-2.0-flash-thinking-exp-1219
43
+
45
44
  ## 2024-12-31
46
45
 
47
46
  - 上线新模型
@@ -49,7 +48,6 @@
49
48
  在不显著降低通用任务能力的情况下,在专家任务能力方面表现大幅提升。其在 AIME 2024、MATH500 和 LiveCodeBench 评测中,效果与
50
49
  OpenAI-o1-Preview 相当。
51
50
  - 兼容SparkAI客户端,文件问答&图片问答:baseurl改为`https://api.chatfire.cn/sparkai/v1`
52
- ![](https://sfile.chatglm.cn/chatglm4/e5b99a34-f859-4880-a0ea-a9c6dbc8a60f.png)
53
51
 
54
52
  ## 2024-12-27
55
53
 
@@ -153,6 +153,7 @@ MODEL_PRICE = {
153
153
 
154
154
  "api-kling": 0.1,
155
155
  "api-kling-vip": 0.5,
156
+
156
157
  "api-kling-v1.6-std-5s": 1 * 0.8,
157
158
  "api-kling-v1.6-std-10s": 2 * 0.8,
158
159
  "api-kling-v1.6-pro-5s": 1 * 0.8 * 1.75,
@@ -483,6 +484,7 @@ MODEL_RATIO = {
483
484
  "google/gemini-flash-1.5-8b-exp": 0.1, # openrouter免费
484
485
  "gemini-2.0-flash": 0.5,
485
486
  "gemini-2.0-flash-exp": 0.5,
487
+ "gemini-2.0-flash-thinking-exp-1219": 1,
486
488
 
487
489
  "gemini-1.5-pro-001": 1,
488
490
  "gemini-1.5-pro-002": 1,
@@ -647,6 +649,7 @@ COMPLETION_RATIO = {
647
649
 
648
650
  "gemini-2.0-flash": 5,
649
651
  "gemini-2.0-flash-exp": 5,
652
+ "gemini-2.0-flash-thinking-exp-1219": 5,
650
653
 
651
654
  "hunyuan-a52b-instruct": 5,
652
655
  "qwen2.5-coder-32b-instruct": 3,
@@ -853,7 +856,7 @@ GROUP_RATIO = {
853
856
  # 定制分组:不公开
854
857
  "35": 1,
855
858
 
856
- "agent": 2
859
+ "images": 0.5
857
860
 
858
861
  }
859
862
  USER_USABLE_GROUPS = {
@@ -864,9 +867,6 @@ USER_USABLE_GROUPS = {
864
867
  "国产": "0.5¥=1$直连🔥国产大模型api,可申请商用独立分组",
865
868
 
866
869
  "特价": "0.5¥=1$主打性价比🔥claude系列&gpt/o1系列&国产热门大模型",
867
-
868
- "agent": "2.0¥=1$智能体:联网&文件问答",
869
-
870
870
  }
871
871
 
872
872
  if _ := {k: f"888¥=1$🈲🈲🈲误用不退" for k, v in GROUP_RATIO.items() if k.endswith(("代理",))}:
@@ -91,7 +91,7 @@ class VideoRequest(BaseModel):
91
91
 
92
92
  class ViduRequest(BaseModel):
93
93
  """quality 倍率2"""
94
- model: Union[str, Literal['vidu-high-performance', 'vidu-high-quality']] = "vidu-high-performance" # vidu-1.5
94
+ model: Union[str, Literal['vidu-1.5', 'vidu-high-performance', 'vidu-high-quality']] = "vidu-high-performance"
95
95
 
96
96
  prompt: Optional[str] = None
97
97
  url: Optional[str] = None # ssupload:?id=
@@ -101,6 +101,10 @@ class ViduRequest(BaseModel):
101
101
 
102
102
  type: Optional[str] = None # text2video img2video character2video
103
103
 
104
+ """vidu-1.5"""
105
+ resolution: Literal['512', '720p', 'vidu-high-quality'] = "512"
106
+ movement_amplitude: Optional[str] = "auto" # small medium high
107
+
104
108
  payload: dict = {}
105
109
 
106
110
  def __init__(self, **data):
@@ -135,22 +139,39 @@ class ViduRequest(BaseModel):
135
139
  }
136
140
  )
137
141
 
138
- self.payload = {
139
- "input": input,
140
- "type": self.type or type,
141
- "settings": {
142
- "model": self.model,
143
- "model_version": "1.0",
144
- # "resolution": "512", 1.5才有的参数 先适配1.0
142
+ if self.model == "vidu-1.5":
143
+ self.payload = {
144
+ "input": input,
145
+ "type": self.type or type,
146
+ "settings": {
147
+ "model_version": "1.5",
148
+ "style": "general",
149
+ "duration": self.duration,
150
+
151
+ "resolution": self.resolution,
152
+ "aspect_ratio": self.aspect_ratio,
153
+
154
+ "movement_amplitude": self.movement_amplitude,
155
+
156
+ }
157
+ }
158
+ else:
159
+
160
+ self.payload = {
161
+ "input": input,
162
+ "type": self.type or type,
163
+ "settings": {
164
+ "model": self.model,
165
+ "model_version": "1.0",
145
166
 
146
- "style": self.style,
167
+ "style": self.style,
147
168
 
148
- # "aspect_ratio": self.aspect_ratio,
169
+ "aspect_ratio": self.aspect_ratio,
149
170
 
150
- "duration": self.duration,
171
+ "duration": self.duration,
151
172
 
173
+ }
152
174
  }
153
- }
154
175
 
155
176
  class Config:
156
177
  json_schema_extra = {