MeUtils 2024.12.23.16.36.51__py3-none-any.whl → 2024.12.31.17.51.53__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.
Files changed (44) hide show
  1. {MeUtils-2024.12.23.16.36.51.dist-info → MeUtils-2024.12.31.17.51.53.dist-info}/METADATA +26 -26
  2. {MeUtils-2024.12.23.16.36.51.dist-info → MeUtils-2024.12.31.17.51.53.dist-info}/RECORD +44 -38
  3. examples/_openaisdk/4v.py +5 -3
  4. examples/_openaisdk/openai_chatfire.py +9 -1
  5. examples/_openaisdk/openai_modelscope.py +6 -2
  6. examples/_openaisdk/openai_siliconflow.py +1 -1
  7. examples/_openaisdk/openai_tune.py +7 -4
  8. examples/_openaisdk/openai_zhipu.py +7 -5
  9. examples/_openaisdk/zhipu_/346/231/272/350/203/275/344/275/223.py +45 -0
  10. meutils/_utils.py +15 -1
  11. meutils/apis/chatglm/glm_video_api.py +34 -2
  12. meutils/apis/hailuoai/videos.py +1 -1
  13. meutils/apis/images/recraft.py +2 -3
  14. meutils/apis/jimeng/common.py +6 -3
  15. meutils/apis/jimeng/images.py +41 -6
  16. meutils/apis/kling/kolors_virtual_try_on.py +29 -5
  17. meutils/apis/oneapi/user.py +3 -3
  18. meutils/apis/oneapi/utils.py +32 -0
  19. meutils/async_utils/common.py +11 -1
  20. meutils/common.py +2 -0
  21. meutils/config_utils/lark_utils/common.py +2 -2
  22. meutils/data/VERSION +1 -1
  23. meutils/data/oneapi/NOTICE.md +15 -0
  24. meutils/db/orm.py +40 -5
  25. meutils/db/redis_db.py +8 -5
  26. meutils/decorators/polling.py +46 -0
  27. meutils/init/evn.py +1 -1
  28. meutils/llm/completions/modelscope.py +11 -0
  29. meutils/llm/completions/rag/fire.py +42 -12
  30. meutils/llm/openai_utils/common.py +1 -1
  31. meutils/request_utils/ark.py +47 -0
  32. meutils/{jwt_utils → request_utils/jwt_utils}/common.py +1 -0
  33. meutils/request_utils/volc.py +160 -0
  34. meutils/schemas/db/oneapi_types.py +30 -0
  35. meutils/schemas/image_types.py +2 -0
  36. meutils/schemas/oneapi/common.py +27 -10
  37. meutils/schemas/openai_types.py +17 -6
  38. meutils/schemas/video_types.py +34 -1
  39. meutils/serving/fastapi/dependencies/auth.py +34 -6
  40. {MeUtils-2024.12.23.16.36.51.dist-info → MeUtils-2024.12.31.17.51.53.dist-info}/LICENSE +0 -0
  41. {MeUtils-2024.12.23.16.36.51.dist-info → MeUtils-2024.12.31.17.51.53.dist-info}/WHEEL +0 -0
  42. {MeUtils-2024.12.23.16.36.51.dist-info → MeUtils-2024.12.31.17.51.53.dist-info}/entry_points.txt +0 -0
  43. {MeUtils-2024.12.23.16.36.51.dist-info → MeUtils-2024.12.31.17.51.53.dist-info}/top_level.txt +0 -0
  44. /meutils/{jwt_utils → request_utils/jwt_utils}/__init__.py +0 -0
@@ -335,7 +335,7 @@ async def get_task(task_id: str, token: str):
335
335
  response = VideoResponse(
336
336
  task_id=task_id,
337
337
  base_resp=data.get('statusInfo', {}),
338
- videos=data.get('data', {}).get("videos")
338
+ videos=(data.get('data') or {}).get("videos")
339
339
  )
340
340
  return response
341
341
 
@@ -122,6 +122,5 @@ if __name__ == '__main__':
122
122
 
123
123
  tokens = list(arun(aget_spreadsheet_values(feishu_url=FEISHU_URL, to_dataframe=True))[0]) | xfilter_
124
124
 
125
- # tokens = "__Host-next-auth.csrf-token=78920fc4c6bf5aef5c2063e3a4397b1e41074713e35020cf7049156e02d53355%7C2c8e6897101210b68ba31cec5c6232d8ab76a3e070cda7b82ad051680ab93fe0; _gcl_au=1.1.906962865.1730362257; _ga=GA1.1.435165527.1730362257; _fbp=fb.1.1730362257600.714008794112161913; AMP_MKTG_7268c9db0f=JTdCJTdE; _tt_enable_cookie=1; _pin_unauth=dWlkPU0yWmxPR1JsWkRJdE5qZGlZeTAwTWpNeUxXRmpNVEV0TlRrd1l6RTNZelEwTldZMw; __zlcmid=1OVn8OoYVNvKEWM; __stripe_mid=d21b2291-edb8-4cb1-8fac-05c6a9493ca8d85a3c; _ga_ME15C3DGRL=deleted; _ttp=412qSInHGw3jjdyNR6K4tBIYmNZ.tt.1; x-recraft-referral-code=3h7wfOgFGn; __Secure-next-auth.callback-url=https%3A%2F%2Fwww.recraft.ai%2Fprojects; _clck=uflztg%7C2%7Cfra%7C0%7C1765; __Secure-next-auth.session-token.0=eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIn0..OMh8sDyFkAVpghZU.iIKkMX3OhmwVyO8CjwCH-8YFQE-J8zE52SImLqu-imuV9q0jNKxBDr9Zo-n2I-TdREv4ffj0FFagny27pL7vjMyp04X2VD_Lh5rv9OMAObho9TsX8AzyLZOu_xbXR1ip98ZSv432BcDq5ppm5ava-ZVqm0Tp0hvJGSWD1yq4S7XjqiIAGeKZfR5Efm1k85fO6CHp-nNiIFVc6f2sw0Y_DcfdAzB4tMxKmJPoa4VHteErM2n41XUA9TvftKK5xVLHDWi0poRXkfB6Tol2xF83jUi2f2Il1BzQ-7q-MsRD-kkxJkEbv2Zcex_HFsaFWN9ohDB_wttuDxBZYCwdjflE-XyLwurtLO4XwbZTRKOR0Jgl6SdF-tBgsKSUrDUdmPGt9oiZv-MzMpTiOYRhTFjTap34rjUOpqlCoPXtiI-YExDCuKs2Dy57wRHF5GHldb3-vuaxKV5tVIq3Uj0Z2uq1SRn2hFhbvcuywlHcyF9HnGur9M6-JBxDaS0W3hrhtHgegIj_kbe6Zl1KBT5knx_IDcVu3KXhiZaLI4kfn_3EQI5zZN9Ay6412fqjP1atd0BpeS5joJl_7O0ni8-0k1I6bRxhnD3uHD5dlQxBJXXHjyisoXTckUXNUKnRbc0x3pL0ObMP7VJ4-mov1KCc_YB3Msh0yfcIa_CXRTJCWH5Q-jkO0pJCVtWjfRegN8G-UpT9k3IDfu6z59O5qFYHM0SjFeee4yJNdAHJRpbuxxNBSBS8aIOey-UN-I2UDme_iGoQnkF9nvOI1zrVHtIhhazxc5YLOyDnVuyhI9ghm2PfYYIxp8sM-Y9VNPjuAKJvg6_q1tSVyiej-qHjV3um1n44AaChgrJ0JXU0gxQV_--xL2n28Tm4sOWb5VUGYAmI32Mvo5bC-kBatusIlkFvnfiQkZT-9fNPAfDiarG-W6T9VsLKhWn2UVBqSJtJgj56uCaw1QilqaKUSYGyUkStWEn0YXsye9vxKSDjm4LJTJdGlkKW0v4qElfwzzV0d9ErjohWN915IzVY-hTRSo8tgt_QHafO3hsyiTpGqalDuT_-BMBShRLozMvGhlQ9jA0QsDueosaNt9OWyk7ZliVSuyt17lI4ApFnaTf3MBjcrnUmk7aejOAQzuy5atNo-HmxxclEYsMuMblcp9kkAsrtx87RHrPYe7DmOorGqJRiKk27S2Nog5ZlBc8RAkq4u4eub9ezwMhFUAYKsv5tnaS6NiggXVbhNiN33uwk2jI7R9ZmJtCnw-b0Nnk2ln4_9CCSa8Ds9VMkiyS6S0QLaPlkmaBzgCYPM7sxTzyuw9BryOlo3akvYJHWegVvxWfN3ap8DdqgXE87zFPE3K3PmJodcv2lVz9FfwUtI81bwRkVpt4VNY7yqGNu33637cufapQsmZJilp5GfHv1FY1lXfrm0LQ19SUjgBHobZ6SrQPUcauypDNFOOAAt9MeVVScsY_5xcyRlPglsA31piiYnDcsBFwOIf-h5GxxYtqf8pDmvUMmXf1zn-97DLpa0D83rKFFA6BralkFCMq0gbBzH4CIeYW35-q1P9Ghq4FIxVxgreueSa5KP96BtFuzIuGEccN478JnsO-DkJWRzTToYTiNUieDjjuhQXFdOFooAHvTrEyvt0HM-ZchJcto4F6xKM3tuJAk2Ng9HCYiIy7rlYzW-gL0v07gI_hwKQ-8dOungh3ggfjooGSayAbsnLeRpAm3P9sTgKrnPp3fyBzzLDkpPj4wBxADpg4sYDyJk3hTa0ec9Kg4ssReU5K77vKg4-YkDAvKvYeQbX69FjXcHf1_XtBQVh2T-teb9G-0kAy6kLVarSJLjp6Mw_Uj3eYV9gbgmNiyBrCcHmUATA6FJkuxVH5W6YVChgEZgIYS1K-PZj-3uchfa6VoSCab1VnreJ6f5aYeY-4ZI5-vDwGJDpd2XkVIrf8zWPFqUkZRpyJHYRwXAGf8MCBFTRXBqzNgPnVjkh_iP9tbmb4_pbgBaTz3Izubx9lWUmso-y0_SPAn1M6x4V2zNHZR6ZVJKAxuNCQrqfIk0Q6-zFHdAHJFPrJSVjKMIDadIpxqQ5zkMeR0O6T204oVwfrtsMnuiAo3dk4ve5qa-MlaFyc0SpfxQkhzCTA3YVXKWo9G5Jp8OYBRmZwDhg4MTvgBeri-hyMsiS025J9vreey3BSyJun7IQJhzDZ6-PVO35qpVB65CNfNSDCO8rI_kAD8xKf893nHBovBumEU_FGC4xz6Yen-7W5TX4yR_2U2CBYX5Iplw5UXHgjXymPbfHjETIh_dyKnuN9fonl8fgi2xk5DDc-oyDaE1qq4g3oBMmXeFA8XpRvcOyXeDyYs5j-KiH0yMlel0xbFluk_UsuiElluUKx5IhnAf04-TX5SCmwubvssyTjs4bWeTw3rjwpvDV9EpLDgPt_WJnHgbbT7e9zRLqQWYnCGro8tnBVsLej-j73L4KdWJQeM8b-Q95l5TfhPrkmbUI-6qyV5tRawBO3ie-c836Bz7YUY1CnopG4qzUfZasJZ8ltrAr7qtwI1c-IJ6CAwDhT_SjhQwyMVUQb7OhvCryf5trtl29kVwsRCeuw8K9uVWmrAKIk5nf3IczDeKNpR0EEnpPMfblkEAaeCSz1KX2fSiURQ2GDUUAOICnhXEhJ9-NcNTHj4ssjU_8RAltnHxTiecwhsLX1qmxi0mrjf-32el6TgQ95FsNDRITKaZ1807lFiQnj3Um9Bqb8ZPxzBBEqJh0WKoD4xT1dqLc1f4HdebodGJva35Nw1Qc9ssNihz2Tziq56J1Zx8vOtz8ibmSJ6Gm3gzWD09h2CQN9Vxwx8kxmF_LECGwgkUsI77029-bayN_t2Mv_s3jeEOAQl-BBNMGHbPPPkcZi5siduzjpphVOAX8wOiqau0MqECstDqh8nemuSvhlomElxmU9mHiRTnUqlAfbO_P1581AUfyOh_InN3ydLnkgrziI58OEWIbHKXXEhRAcCGQrX4nynwOTymiWuzIR0OqhIyi3cLfz3e51uEVmBVVSZfbZuDySiY4yOzA2cMExG1te_NjjhEsvBZ8m3Fjf-PEwBJhrXDQgXlXFp80ERZQ6xVNzt7dVd0GzsQT1-03JaLR6S9tJYXO4QOf9sgXp-R4nvP7mZDuhP-kXbI0rzAmnuPA-eR4joGugTgbH0RWHnZ6z2a8k2kBD_VdjYdbxSZ1vRXtSIpNohuaun4rzXNbRz9kwNNK_Fz-q84fAJ_J1Yb1XHBMrJYQxwVdhRqvSh_jW5zroDFjTFNKwFruMaGa4KESccnTKy8mUH7Cd6S2OCjzDrcl4mQcXBu90FKOH-pYhobFNefJq6LooejPhdN_XBdfm2kQrcTRBYbMk4vekzZxs-wPrlgZkQYSAxKj4i_XTiqztmroaNRYdfFoq4hoArBBsISxRagLukwyL2yvSKnHiqMo9T7whwYF_tXQFGk1T8dQ_9ospLy9EMBMP7tdqw7UX5S051rqADt9q2Rozx7hRuAMHWeAyfRCFgMx0lR3B2txRxxRVWrBNJAqulmG3hJk9px8LpWmlm9CorOkN7cZT6CJKIJdSClkj0VDFiDUjWsZWJLiN_DSRaqcCpgwdkXJKZ4zpUKjH6xQSKzhvbmom9ZkFkNPWO35Vf7e_rLKLCyltHmsTDlgRylqPMkigL6Rds9S07c7fCwcr4d5xWvlV78iKjmg_c4RdxrmGsqeQZl4EmbnmwZfQj3qllIEn7MJ7N5_jE_BO1huH522Ds6hTRFTn_RmA4FtIbqyuvbK1v5MlCoToKiYgBwPI79PzQSEjM4LMMbeUiJx0E5C2Wd3bpTnbc-mfY8uIpFfxnK2_0Mk7rSbm8rqtomgPyqcmAT2mwQS-; __Secure-next-auth.session-token.1=DfJBMjFpUwPYqCIaGMxrX_WtlNau_0B5y61DkoPxCwi6_MziMSz6KUgDB9o4d6xXg5mn-UBR0gXWjPFrIXzP0kdNvCSF9pSGCyiOLmdtKfi3BscGIK70dpfUfKwY972YF6TTb6tXOdLkf3JFyN0cjLd5pcBfSKFAKRt5shH4iNMu6ZwgwZd0guK8IcIddc9KTGxTZlHc6dJ1Rc-QHfBm_DPgYUvf9yKjGSguPuYFqnHwA2T91Ughu9VT2lAuCKjvEX13KOsHB-Vr1i7Ts3TrQtIoS9pMM_NnhdILOp3Od5NGfkJGqAbsfFLYU193V3cK4cib9QisQmKm4hxvlMflKA1IQNlz_isB1vi2JN04AQg.z8GHyaN7ezsgo22MdsiVvQ; _uetsid=84c52090adf211efb65c0dc3b78a1976; _uetvid=a8a766f0975f11ef9b7921e48a0cd258; _ga_ME15C3DGRL=GS1.1.1732844258.46.1.1732845589.0.0.0; _clsk=c52eh1%7C1732845591268%7C3%7C0%7Ce.clarity.ms%2Fcollect; AMP_7268c9db0f=JTdCJTIyZGV2aWNlSWQlMjIlM0ElMjI2OTE1YzI1My1jMTJjLTQ5ODYtYjM3Ni0xMTI3Y2ZmMTFlMjglMjIlMkMlMjJ1c2VySWQlMjIlM0ElMjJjNDdkY2ZiYi0yOWE5LTQ1Y2EtYWRiZS1hM2ZhYWZiODhkNzQlMjIlMkMlMjJzZXNzaW9uSWQlMjIlM0ExNzMyODQ0MjU3NzEzJTJDJTIyb3B0T3V0JTIyJTNBZmFsc2UlMkMlMjJsYXN0RXZlbnRUaW1lJTIyJTNBMTczMjg0NTY0OTcyNSUyQyUyMmxhc3RFdmVudElkJTIyJTNBOTA1JTJDJTIycGFnZUNvdW50ZXIlMjIlM0E0JTdE"
126
- #
127
- arun(check_token(tokens))
125
+
126
+ r = arun(check_token(tokens))
@@ -89,8 +89,8 @@ async def get_credit(token):
89
89
  async def check_token(token, threshold: int = 1):
90
90
  try:
91
91
  response = await get_credit(token)
92
+ logger.debug(bjson(response))
92
93
  credits = sum(response['data']['credit'].values())
93
- # logger.debug(credits)
94
94
  return credits >= threshold
95
95
  except Exception as e:
96
96
  return False
@@ -244,8 +244,11 @@ async def create_draft_content(request: ImageRequest, token: str):
244
244
  if __name__ == '__main__':
245
245
  token = "693701c43e477b7c405cc7e2fef0ddbd"
246
246
  token = "eb4d120829cfd3ee957943f63d6152ed"
247
- arun(get_credit(token))
248
- # arun(check_token(token))
247
+ token = "dcf7bbc31faed9740b0bf748cd4d2c74"
248
+ token = "38d7d300b5e0a803431ef88d8d2acfef"
249
+ token = "916fed81175f5186a2c05375699ea40d"
250
+ # arun(get_credit(token))
251
+ arun(check_token(token))
249
252
 
250
253
  # arun(get_upload_token(token))
251
254
  #
@@ -70,8 +70,19 @@ async def get_task(task_id, token):
70
70
  response = await client.post(url, json=payload)
71
71
  response.raise_for_status()
72
72
  data = response.json()
73
+ logger.debug(bjson(data))
73
74
  # {'ret': '1015', 'errmsg': 'login error', 'systime': '1734524280', 'logid': '20241218201800AC3267447B287E9E6C46', 'data': None}
74
- item_list = (data.get("data") or {}).get(task_id, {}).get("item_list")
75
+ task_info = (data.get("data") or {}).get(task_id, {})
76
+ item_list = task_info.get("item_list") # "status": 30,
77
+
78
+ status_code = task_info.get("status")
79
+ logger.debug(f"status: {status_code}")
80
+
81
+ """
82
+ "status": 30, # 内容审核
83
+ "status": 50,
84
+ """
85
+
75
86
  image_data = map(lambda x: x.get("image", {}).get("large_images"), item_list)
76
87
 
77
88
  task_data = sum(image_data, []) | xmap_(lambda x: {"url": x.get("image_url")})
@@ -79,18 +90,29 @@ async def get_task(task_id, token):
79
90
  return TaskResponse(
80
91
  task_id=task_id,
81
92
  data=task_data,
82
- message=data.get("errmsg"),
83
- status="success" if task_data else None,
93
+ message=data.get("errmsg") if status_code!=30 else "触发内容审核451",
94
+ status="success" if item_list else 'processing',
95
+ code=status_code,
84
96
  )
85
97
 
86
98
 
99
+ async def generate(request: ImageRequest):
100
+ task_response = await create_task(request)
101
+ for i in range(1, 10):
102
+ await asyncio.sleep(max(10 / i, 1))
103
+ response = await get_task(task_response.task_id, task_response.system_fingerprint)
104
+ logger.debug(response)
105
+ if data := response.data:
106
+ return {"data": data}
107
+
108
+
87
109
  if __name__ == '__main__':
88
- token = "693701c43e477b7c405cc7e2fef0ddbd"
110
+ token = "eb4d120829cfd3ee957943f63d6152ed"
89
111
 
90
- request = ImageRequest(prompt="一个漂亮的姑娘", size="1024x1024")
112
+ # request = ImageRequest(prompt="做一个圣诞节的海报", size="1024x1024")
91
113
  # request = ImageRequest(prompt="https://oss.ffire.cc/files/kling_watermark.png 让她带上墨镜", size="1024x1024")
92
114
 
93
- arun(create_task(request))
115
+ # task = arun(create_task(request))
94
116
 
95
117
  # task_id = "10040025470722"
96
118
 
@@ -103,3 +125,16 @@ if __name__ == '__main__':
103
125
  # task_id = "10082971040514"
104
126
  #
105
127
  # arun(get_task(task_id, token))
128
+
129
+ # arun(get_task(task.task_id, task.system_fingerprint))
130
+
131
+ task_id = "10184295086338"
132
+ system_fingerprint = "eb4d120829cfd3ee957943f63d6152ed"
133
+
134
+ t1 = ("10184295086338", "eb4d120829cfd3ee957943f63d6152ed")
135
+ t2 = ("10184877310722", "dcf7bbc31faed9740b0bf748cd4d2c74")
136
+ t3 = ("10186352959490", "eb4d120829cfd3ee957943f63d6152ed")
137
+
138
+ arun(get_task(*t3))
139
+
140
+ # arun(generate(ImageRequest(prompt="做一个圣诞节的海报")))
@@ -10,10 +10,13 @@
10
10
  import jwt
11
11
 
12
12
  from meutils.pipe import *
13
- from meutils.schemas.task_types import TaskResponse ############# 根据这个重构
13
+ from meutils.schemas.task_types import TaskResponse
14
+ from meutils.schemas.image_types import ImageRequest, ImagesResponse
15
+
14
16
  from meutils.schemas.kling_types import API_BASE_URL, TryOnRequest, TaskResponse
15
17
  from meutils.config_utils.lark_utils import get_next_token_for_polling
16
18
  from meutils.decorators.retry import retrying
19
+ from meutils.str_utils.regular_expression import parse_url
17
20
 
18
21
  FEISHU_URL = "https://xchatllm.feishu.cn/sheets/GYCHsvI4qhnDPNtI4VPcdw2knEd?sheet=cjTepf"
19
22
 
@@ -39,7 +42,7 @@ def encode_jwt_token(token):
39
42
  ######################################################################
40
43
  @alru_cache(ttl=3600)
41
44
  @retrying(title=__name__)
42
- async def create_task(request: TryOnRequest, token: Optional[str] = None): ###### 所有的 TaskResponse标准化
45
+ async def create_task(request: TryOnRequest, token: Optional[str] = None):
43
46
  token = token or await get_next_token_for_polling(FEISHU_URL)
44
47
  token = encode_jwt_token(token)
45
48
 
@@ -68,8 +71,23 @@ async def get_task(task_id, token):
68
71
  return TaskResponse(**data)
69
72
 
70
73
 
74
+ async def generate(request: ImageRequest):
75
+ human_image, cloth_image = parse_url(request.prompt) # 两张图片
76
+
77
+ request = TryOnRequest(human_image=human_image, cloth_image=cloth_image)
78
+ task_response = await create_task(request)
79
+
80
+ for i in range(1, 10):
81
+ await asyncio.sleep(max(10 / i, 1))
82
+
83
+ response = await get_task(task_response.data.task_id, task_response.system_fingerprint)
84
+ if task_result := response.data.task_result:
85
+ images = task_result.get('images', [])
86
+ return ImagesResponse(data=images)
87
+
88
+
71
89
  if __name__ == '__main__':
72
- request = TryOnRequest()
90
+ # request = TryOnRequest()
73
91
  # arun(create_task(request))
74
92
  # {
75
93
  # "code": 0,
@@ -83,5 +101,11 @@ if __name__ == '__main__':
83
101
  # }
84
102
  # }
85
103
 
86
- token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJkMmU1NmZkY2ZiODY0MmZmYWEyMjZlZWIxNzY4MzMyMiIsImV4cCI6MTczMzE4OTI4OSwibmJmIjoxNzMzMTAyODg0fQ.YjB792REbuFaUoyUXvd5bpI76_0PBWawDHDjPHOBA5Q'
87
- arun(get_task("CjiL9mdJhswAAAAAAG2C6g", token))
104
+ # token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJkMmU1NmZkY2ZiODY0MmZmYWEyMjZlZWIxNzY4MzMyMiIsImV4cCI6MTczMzE4OTI4OSwibmJmIjoxNzMzMTAyODg0fQ.YjB792REbuFaUoyUXvd5bpI76_0PBWawDHDjPHOBA5Q'
105
+ # arun(get_task("CjiL9mdJhswAAAAAAG2C6g", token))
106
+
107
+ human_image: str = "https://oss.ffire.cc/files/try-on.png"
108
+ cloth_image: str = "https://oss.ffire.cc/files/x.png"
109
+
110
+ request = ImageRequest(prompt=f"{human_image}\n{cloth_image}")
111
+ arun(generate(request))
@@ -91,10 +91,10 @@ async def put_user(payload, add_money: float = 0):
91
91
 
92
92
  if __name__ == '__main__':
93
93
  # api-key => get_one_log => get_user => put_user
94
- # arun(get_user(814))
94
+ arun(get_user(814))
95
95
  # payload = arun(get_user(924))
96
96
  # print(payload)
97
97
  # arun(put_user(payload, -1))
98
98
 
99
- arun(get_api_key_log('sk-gpoH1z3G6nHovD8MY40i6xx5tsC1vbh7B3Aao2jmejYNoKhv'))
100
- # arun(get_user_money("sk-1UNhOrvuJ4PeBBpsB202577c14114f7fA234F32d3e8dF767"))
99
+ # arun(get_api_key_log('sk-gpoH1z3G6nHovD8MY40i6xx5tsC1vbh7B3Aao2jmejYNoKhv'))
100
+ # arun(get_user_money("sk-gpoH1z3G6nHovD8MY40i6xx5tsC1vbh7B3Aao2jmejYNoKhv"))
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+ # @Project : AI. @by PyCharm
4
+ # @File : utils
5
+ # @Time : 2024/12/25 18:13
6
+ # @Author : betterme
7
+ # @WeChat : meutils
8
+ # @Software : PyCharm
9
+ # @Description :
10
+
11
+ from meutils.pipe import *
12
+
13
+ from meutils.caches.redis_cache import cache
14
+ from meutils.db.orm import select_first
15
+ from meutils.schemas.db.oneapi_types import OneapiTask, OneapiUser, OneapiToken
16
+
17
+
18
+ # engine
19
+
20
+
21
+ @cache()
22
+ async def token2user(api_key: str):
23
+ logger.debug(api_key)
24
+ filter_kwargs = {
25
+ "key": api_key[3:],
26
+ }
27
+
28
+ return await select_first(OneapiToken, filter_kwargs)
29
+
30
+
31
+ if __name__ == '__main__':
32
+ arun(token2user('sk-q3uMFm0TFWi5lBQVhGwAWKup28j4omr9vThL4V5ynvdWdeZ8'))
@@ -10,7 +10,7 @@
10
10
 
11
11
  import inspect
12
12
  import asyncio
13
- from typing import Union, Any, Coroutine, AsyncIterator, Iterator, Iterable, AsyncIterable
13
+ from typing import Union, Any, Coroutine, AsyncIterator, Iterator, Iterable, AsyncIterable, Optional, Callable
14
14
 
15
15
  import numpy as np
16
16
  import pandas as pd
@@ -146,6 +146,16 @@ async def arequest(url, method='get', payload=None, **client_params):
146
146
  return resp
147
147
 
148
148
 
149
+ async def poll(fn, n: int = 30, sleep_fn: Optional[Callable] = None):
150
+ if sleep_fn is None:
151
+ sleep_fn = lambda i: max(n / (i + 1), 1) # 预估大概 2~3 *n
152
+
153
+ for i in range(n):
154
+ await asyncio.sleep(sleep_fn(i))
155
+ if _ := await fn(): # 跳出
156
+ return _
157
+
158
+
149
159
  if __name__ == '__main__':
150
160
  from meutils.pipe import *
151
161
 
meutils/common.py CHANGED
@@ -31,6 +31,8 @@ import warnings
31
31
  warnings.filterwarnings("ignore")
32
32
 
33
33
  import functools
34
+ from functools import wraps
35
+
34
36
  import argparse
35
37
  import traceback
36
38
  import threading
@@ -382,5 +382,5 @@ if __name__ == '__main__':
382
382
  # with timer():
383
383
  # token = arun(get_next_token(feishu_url))
384
384
 
385
- FEISHU_URL = "https://xchatllm.feishu.cn/sheets/XfjqszII3hZAEvtTOgecOgv2nye?sheet=c14b34"
386
- print(arun(get_series(FEISHU_URL)))
385
+ # FEISHU_URL = "https://xchatllm.feishu.cn/sheets/XfjqszII3hZAEvtTOgecOgv2nye?sheet=c14b34"
386
+ # print(arun(get_series(FEISHU_URL)))
meutils/data/VERSION CHANGED
@@ -1 +1 @@
1
- 2024.12.23.16.36.51
1
+ 2024.12.31.17.51.53
@@ -31,6 +31,21 @@
31
31
 
32
32
  </details>
33
33
 
34
+ ## 2024-12-27
35
+ - deepseek-v3
36
+ - deepseek-r1:deepseek-v3的思考模型
37
+ - deepseek-search:deepseek-v3的联网模型
38
+
39
+ ## 2024-12-24
40
+ - 上线新模型
41
+ - doubao-pro-256k:相比Doubao-pro-128k/240628,长文任务效果显著提升10%以上,要点提取、字数遵循、多轮对话上文记忆等能力大幅提升
42
+ - [qvq-72b-preview](https://mp.weixin.qq.com/s/WzL7tbFUZOgE2IFMeHT-sQ):Qwen开源视觉推理模型QVQ,更睿智地看世界!
43
+
44
+ - 增加gemini-2.0配额,支持多模型,默认分组可用
45
+ - "gemini-2.0-flash"
46
+ - "gemini-2.0-flash-exp"
47
+
48
+
34
49
  ## 2024-12-20
35
50
  - 修复SunoV4无水印版本
36
51
  - [异步任务接口文档](https://api.chatfire.cn/docs/api-246593467)
meutils/db/orm.py CHANGED
@@ -97,6 +97,16 @@ async def update_or_insert(entity, filter_kwargs: Optional[dict] = None, update_
97
97
  return data
98
98
 
99
99
 
100
+ async def select_first(entity, filter_kwargs: Optional[dict] = None):
101
+ async with AsyncSession(engine) as session:
102
+ statement = select(entity).filter_by(**filter_kwargs)
103
+
104
+ if result := await session.exec(statement):
105
+ _ = result.first()
106
+ logger.debug(_)
107
+ return _
108
+
109
+
100
110
  if __name__ == '__main__':
101
111
  pass
102
112
 
@@ -124,21 +134,46 @@ if __name__ == '__main__':
124
134
  #
125
135
  # arun(create_db_and_tables())
126
136
 
127
- from meutils.schemas.db.oneapi_types import OneapiTask
137
+ from meutils.schemas.db.oneapi_types import OneapiTask, OneapiUser, OneapiToken
138
+
139
+ # filter_kwargs = {
140
+ # "task_id": "888",
141
+ # }
142
+ #
143
+ #
144
+ # async def main():
145
+ # async with AsyncSession(engine) as session:
146
+ # statement = select(OneapiTask).filter_by(**filter_kwargs)
147
+ # result = await session.exec(statement)
148
+ # logger.debug(result)
149
+ # if result:
150
+ # logger.debug(result.first())
151
+ # # await session.commit()
152
+ #
153
+ #
154
+ # arun(update_or_insert(OneapiTask, filter_kwargs))
128
155
 
129
156
  filter_kwargs = {
130
- "task_id": "888",
157
+ "id": "1",
131
158
  }
132
159
 
133
160
 
134
161
  async def main():
135
162
  async with AsyncSession(engine) as session:
136
- statement = select(Tasks).filter_by(**filter_kwargs)
163
+ # filter_kwargs = {
164
+ # "id": "1",
165
+ # }
166
+ # statement = select(OneapiUser).filter_by(**filter_kwargs)
167
+
168
+ filter_kwargs = {
169
+ "key": "gpoH1z3G6nHovD8MY40i6xx5tsC1vbh7B3Aao2jmejYNoKhv",
170
+ }
171
+ statement = select(OneapiToken).filter_by(**filter_kwargs)
172
+
137
173
  result = await session.exec(statement)
138
- logger.debug(result)
139
174
  if result:
140
175
  logger.debug(result.first())
141
176
  # await session.commit()
142
177
 
143
178
 
144
- arun(update_or_insert(Tasks, filter_kwargs))
179
+ arun(main())
meutils/db/redis_db.py CHANGED
@@ -28,9 +28,6 @@ if REDIS_URL := os.getenv("REDIS_URL"):
28
28
  # redis_client = Redis.from_url(REDIS_URL, **kwargs)
29
29
  # redis_aclient = AsyncRedis.from_url(REDIS_URL, **kwargs)
30
30
 
31
-
32
-
33
-
34
31
  else:
35
32
  redis_client = Redis(**kwargs) # decode_responses=True
36
33
  redis_aclient = AsyncRedis(**kwargs)
@@ -76,9 +73,15 @@ if __name__ == '__main__':
76
73
  #
77
74
  # arun(redis_aclient.select(1))
78
75
 
76
+ # async def main():
77
+ # r = await redis_aclient.select(1)
78
+ # return await redis_aclient.get(task_id)
79
+ #
80
+ #
81
+ # arun(main())
82
+
79
83
  async def main():
80
- r = await redis_aclient.select(1)
81
- return await redis_aclient.get(task_id)
84
+ return await redis_aclient.lpop("redis_key")
82
85
 
83
86
 
84
87
  arun(main())
@@ -0,0 +1,46 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+ # @Project : AI. @by PyCharm
4
+ # @File : polling
5
+ # @Time : 2024/12/26 14:08
6
+ # @Author : betterme
7
+ # @WeChat : meutils
8
+ # @Software : PyCharm
9
+ # @Description :
10
+ import time
11
+
12
+ from meutils.pipe import *
13
+
14
+
15
+ def poll(n: int = 30, sleep_fn: Optional[Callable] = None):
16
+ if sleep_fn is None:
17
+ sleep_fn = lambda i: max(n / (i + 1), 1) # 预估大概 2~3 *n
18
+
19
+ def decorator(fn):
20
+ is_coroutine = inspect.iscoroutinefunction(fn)
21
+
22
+ @wraps(fn)
23
+ async def wrapper(*args, **kwargs):
24
+ for i in range(n):
25
+ await asyncio.sleep(sleep_fn(i))
26
+ # 根据函数类型选择调用方式
27
+ result = await fn(*args, **kwargs) if is_coroutine else fn(*args, **kwargs)
28
+ if result: # 跳出
29
+ return result
30
+ return None
31
+
32
+ return wrapper
33
+
34
+ return decorator
35
+
36
+
37
+ if __name__ == '__main__':
38
+ @poll(n=5)
39
+ async def check_something():
40
+ # 你的检查逻辑
41
+
42
+ logger.debug(time.ctime())
43
+ return {"status": "ok"}
44
+
45
+
46
+ arun(check_something())
meutils/init/evn.py CHANGED
@@ -35,7 +35,7 @@ os.environ['PROMPT_TEMPLATE'] = """
35
35
  # 如果无法从中得到答案,请回答“根据已知信息无法回答该问题”或“没有提供足够的信息”。请使用中文回答,不允许添加编造内容。
36
36
  # """
37
37
 
38
- # MODELSCOPE_CACHE
38
+ # modelscope_cache
39
39
  # PPNLP
40
40
  if __name__ == '__main__':
41
41
  from pprint import pprint
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+ # @Project : AI. @by PyCharm
4
+ # @File : modelscope
5
+ # @Time : 2024/12/25 11:01
6
+ # @Author : betterme
7
+ # @WeChat : meutils
8
+ # @Software : PyCharm
9
+ # @Description :
10
+
11
+ from meutils.pipe import *
@@ -12,6 +12,7 @@ import mimetypes
12
12
  from meutils.pipe import *
13
13
  from meutils.io.files_utils import to_bytes
14
14
  from meutils.llm.openai_utils import to_openai_params
15
+ from meutils.str_utils.regular_expression import parse_url
15
16
 
16
17
  from openai import OpenAI, AsyncOpenAI
17
18
  from meutils.schemas.openai_types import chat_completion, chat_completion_chunk, ChatCompletionRequest, CompletionUsage
@@ -66,6 +67,22 @@ class Completions(object):
66
67
 
67
68
  request.messages = request.system_messages + [{'role': 'user', 'content': request.last_content}]
68
69
 
70
+ elif isinstance(request.last_content, str) and (urls := parse_url(request.last_content)):
71
+ logger.debug(urls)
72
+
73
+ url = urls[-1]
74
+ request.last_content = request.last_content.replace(url, '')
75
+
76
+ files = await asyncio.gather(*map(self.file_extract, urls))
77
+
78
+ for file_content in files:
79
+ request.system_messages.append({
80
+ "role": "system",
81
+ "content": file_content,
82
+ })
83
+
84
+ request.messages = request.system_messages + [{'role': 'user', 'content': request.last_content}]
85
+
69
86
  logger.debug(request)
70
87
 
71
88
  data = to_openai_params(request)
@@ -78,30 +95,43 @@ if __name__ == '__main__':
78
95
 
79
96
  request = ChatCompletionRequest(
80
97
  # model="qwen-turbo-2024-11-01",
81
- model="claude-3-5-sonnet-20241022",
98
+ # model="claude-3-5-sonnet-20241022",
99
+ model="gpt-4o-mini",
100
+
82
101
  messages=[
83
102
  {
84
103
  'role': 'system',
85
104
  'content': '你是一个文件问答助手'
86
105
  },
106
+ # {
107
+ # 'role': 'user',
108
+ # # 'content': {
109
+ # # "type": "file_url",
110
+ # # "file_url": {"url": "https://oss.ffire.cc/files/招标文件备案表(第二次).pdf", "detai": "auto"}
111
+ # # },
112
+ # 'content': [
113
+ # {
114
+ # "type": "text",
115
+ # "text": "这个文件讲了什么?"
116
+ # },
117
+ # # 多轮的时候要剔除
118
+ # {
119
+ # "type": "file_url",
120
+ # "file_url": {"url": "https://oss.ffire.cc/files/招标文件备案表(第二次).pdf", "detai": "auto"}
121
+ # }
122
+ # ]
123
+ # },
124
+
87
125
  {
88
126
  'role': 'user',
89
127
  # 'content': {
90
128
  # "type": "file_url",
91
129
  # "file_url": {"url": "https://oss.ffire.cc/files/招标文件备案表(第二次).pdf", "detai": "auto"}
92
130
  # },
93
- 'content': [
94
- {
95
- "type": "text",
96
- "text": "这个文件讲了什么?"
97
- },
98
- # 多轮的时候要剔除
99
- {
100
- "type": "file_url",
101
- "file_url": {"url": "https://oss.ffire.cc/files/招标文件备案表(第二次).pdf", "detai": "auto"}
102
- }
103
- ]
131
+ 'content': "https://oss.ffire.cc/files/%E6%8B%9B%E6%A0%87%E6%96%87%E4%BB%B6%E5%A4%87%E6%A1%88%E8%A1%A8%EF%BC%88%E7%AC%AC%E4%BA%8C%E6%AC%A1%EF%BC%89.pdf 这个文件讲了什么?",
132
+
104
133
  },
134
+
105
135
  # {'role': 'assistant', 'content': "好的"},
106
136
  # {
107
137
  # 'role': 'user',
@@ -266,7 +266,7 @@ if __name__ == '__main__':
266
266
  with timer():
267
267
  try:
268
268
  async with ppu_flow(api_key="sk-OYK4YxtTlWauT2TdGR5FTAJpkRmSnDwPly4cve0cAvMcrBkZ", post="api-oss",
269
- n=10000):
269
+ n=100):
270
270
  logger.debug("消费了哦")
271
271
 
272
272
  except Exception as e:
@@ -0,0 +1,47 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+ # @Project : AI. @by PyCharm
4
+ # @File : ark
5
+ # @Time : 2024/12/31 13:44
6
+ # @Author : betterme
7
+ # @WeChat : meutils
8
+ # @Software : PyCharm
9
+ # @Description :
10
+ import json
11
+ import os
12
+
13
+ from meutils.pipe import *
14
+ import volcenginesdkcore
15
+ from volcenginesdkcore.signv4 import SignerV4
16
+ import volcenginesdkark
17
+
18
+ # sign(path, method, headers, body, query, ak, sk, region, service)
19
+
20
+ headers = {}
21
+ payload = {
22
+ "Prompt": "关于星空的歌",
23
+ "Genre": "R&B/Soul",
24
+ "Mood": "Dynamic/Energetic",
25
+ "Gender": "Male",
26
+ "ModelVersion": "v4.0"
27
+ }
28
+ params = {"Action": "GenLyrics", "Version": "2024-08-12"}
29
+ SignerV4.sign(
30
+ path="/",
31
+ method="POST",
32
+ query=params,
33
+ body=json.dumps(payload),
34
+ headers=headers,
35
+ ak=os.getenv("ARK_ACCESS_KEY"),
36
+ sk=os.getenv("ARK_SECRET_ACCESS_KEY"),
37
+ region="cn-beijing",
38
+ service="imagination"
39
+ )
40
+
41
+ print(headers)
42
+
43
+ s = ''
44
+ for k, v in headers.items():
45
+ s += f"{k}:{v}\n"
46
+
47
+ print(s)
@@ -33,6 +33,7 @@ payload = {
33
33
  # Your secret key
34
34
  secret = ""
35
35
 
36
+
36
37
  # Create the JWT
37
38
  token = jwt.encode(payload, secret, algorithm="HS256", headers=header)
38
39