MeUtils 2024.3.4.13.4.45__py3-none-any.whl → 2025.1.16.17.15.52__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 (582) hide show
  1. {MeUtils-2024.3.4.13.4.45.dist-info → MeUtils-2025.1.16.17.15.52.dist-info}/METADATA +38 -32
  2. MeUtils-2025.1.16.17.15.52.dist-info/RECORD +864 -0
  3. {MeUtils-2024.3.4.13.4.45.dist-info → MeUtils-2025.1.16.17.15.52.dist-info}/WHEEL +1 -1
  4. {MeUtils-2024.3.4.13.4.45.dist-info → MeUtils-2025.1.16.17.15.52.dist-info}/entry_points.txt +1 -0
  5. apps/spider.py +24 -8
  6. examples/_openaisdk/4v.py +110 -0
  7. examples/_openaisdk/__init__.py +11 -0
  8. examples/_openaisdk/baichuan.py +38 -0
  9. examples/_openaisdk/bpo.py +138 -0
  10. examples/_openaisdk/chat_latex.py +95 -0
  11. examples/_openaisdk/chattts.py +85 -0
  12. examples/_openaisdk/copilot.py +48 -0
  13. examples/_openaisdk/dalle3.py +48 -0
  14. examples/_openaisdk/deeplx.py +31 -0
  15. examples/_openaisdk/demo.py +77 -0
  16. examples/_openaisdk/embeddings.py +34 -0
  17. examples/_openaisdk/gpt4all.py +69 -0
  18. examples/_openaisdk/gpt_fc.py +23 -0
  19. examples/_openaisdk/gr_vl.py +46 -0
  20. examples/_openaisdk/json_mode.py +12 -0
  21. examples/_openaisdk/kimi.py +91 -0
  22. examples/_openaisdk/kimi_qa.py +57 -0
  23. examples/_openaisdk/minimax.py +75 -0
  24. examples/_openaisdk/open_router.py +48 -0
  25. examples/_openaisdk/openai_aiplus.py +54 -0
  26. examples/_openaisdk/openai_audio.py +20 -0
  27. examples/_openaisdk/openai_baichuan.py +59 -0
  28. examples/_openaisdk/openai_cache.py +37 -0
  29. examples/_openaisdk/openai_chatfire.py +228 -0
  30. examples/_openaisdk/openai_chatfire_all.py +166 -0
  31. examples/_openaisdk/openai_deepinfra.py +55 -0
  32. examples/_openaisdk/openai_deepseek.py +29 -0
  33. examples/_openaisdk/openai_doubao.py +43 -0
  34. examples/_openaisdk/openai_embeddings.py +36 -0
  35. examples/_openaisdk/openai_files.py +57 -0
  36. examples/_openaisdk/openai_gitee.py +33 -0
  37. examples/_openaisdk/openai_god.py +45 -0
  38. examples/_openaisdk/openai_groq.py +240 -0
  39. examples/_openaisdk/openai_images.py +203 -0
  40. examples/_openaisdk/openai_json.py +78 -0
  41. examples/_openaisdk/openai_lingyi.py +59 -0
  42. examples/_openaisdk/openai_modelscope.py +54 -0
  43. examples/_openaisdk/openai_moon.py +55 -0
  44. examples/_openaisdk/openai_oi.py +61 -0
  45. examples/_openaisdk/openai_ppu.py +47 -0
  46. examples/_openaisdk/openai_qwen.py +58 -0
  47. examples/_openaisdk/openai_search.py +42 -0
  48. examples/_openaisdk/openai_sensenova.py +81 -0
  49. examples/_openaisdk/openai_siliconflow.py +52 -0
  50. examples/_openaisdk/openai_step.py +45 -0
  51. examples/_openaisdk/openai_test.py +66 -0
  52. examples/_openaisdk/openai_together.py +57 -0
  53. examples/_openaisdk/openai_tune.py +38 -0
  54. examples/_openaisdk/openai_zhipu.py +59 -0
  55. examples/_openaisdk/ppu.py +28 -0
  56. examples/_openaisdk/rag.py +54 -0
  57. examples/_openaisdk/rag_.py +26 -0
  58. examples/_openaisdk/test.py +52 -0
  59. examples/_openaisdk/x.py +32 -0
  60. examples/_openaisdk/xx.py +29 -0
  61. examples/_openaisdk/zhipu_files.py +47 -0
  62. examples/_openaisdk/zhipu_/346/231/272/350/203/275/344/275/223.py +45 -0
  63. examples/_openaisdk//345/205/234/345/272/225/346/265/213/350/257/225.py +50 -0
  64. examples/_openaisdk//345/244/232/346/250/241/346/200/201/346/265/213/350/257/225.py +76 -0
  65. examples/_openaisdk//345/244/232/346/250/241/346/200/201/346/265/213/350/257/225_.py +56 -0
  66. examples/_openaisdk//346/226/207/344/273/266/351/227/256/347/255/224.py +36 -0
  67. examples/_openaisdk//346/226/207/346/241/243/350/247/243/346/236/220.py +34 -0
  68. examples/_openaisdk//346/250/241/345/236/213/346/265/213/350/257/225.py +53 -0
  69. examples/_openaisdk//351/230/277/351/207/214.py +80 -0
  70. {meutils/serving/jina/__demo → examples/ann}/__init__.py +1 -1
  71. examples/ann/main.py +31 -0
  72. examples/apis/kl.py +28 -0
  73. examples/apis/x.py +17 -0
  74. examples/apis/xx.py +17 -0
  75. examples/arq_demo/demo.py +3 -0
  76. examples/backgroundtasks.py +25 -0
  77. examples/bserver.py +513 -21
  78. examples/cache_demo/HermesCache_demo.py +81 -0
  79. examples/cache_demo/acacge.py +26 -0
  80. examples/cache_demo/x.py +31 -0
  81. {meutils/docarray_utils → examples/caches}/__init__.py +1 -1
  82. examples/caches/llmcache.py +18 -0
  83. examples/celery_demo/product_task.py +2 -0
  84. examples/demo.py +17 -1
  85. examples/fastapi_caching.py +59 -0
  86. {meutils/dependencies → examples/gr}/__init__.py +1 -1
  87. examples/gr/d.py +22 -0
  88. examples/gr/demo.py +30 -0
  89. examples/ip2/345/234/260/345/214/272.py +16 -0
  90. examples/jinja2_demo/j2_demo.py +20 -1
  91. examples/json/346/240/207/345/207/206/345/214/226.py +54 -0
  92. examples/md.py +29 -0
  93. {meutils/serving/jina → examples/nesc}/__init__.py +1 -1
  94. examples/nesc/main.py +76 -0
  95. examples/orm/mysql_orm.py +113 -0
  96. examples/orm/sql_creater.py +57 -0
  97. examples/orm/sqlm.py +134 -0
  98. examples/rq_demo/fns.py +18 -0
  99. examples/rq_demo/redis/351/230/237/345/210/227.py +14 -7
  100. examples/rq_demo/redis/351/230/237/345/210/227_add_chatfire.py +30 -0
  101. examples/size_map.py +43 -0
  102. examples/test.py +59 -0
  103. examples/webs/__init__.py +11 -0
  104. examples/webs/main.py +34 -0
  105. examples/x.py +13 -0
  106. examples//345/216/273/346/260/264/345/215/260.py +20 -0
  107. examples//346/226/207/346/241/243/346/231/272/350/203/275/__init__.py +11 -0
  108. meutils/_utils.py +15 -6
  109. meutils/ai_audio/asr/__init__.py +3 -2
  110. meutils/ai_audio/asr/cf_asr.py +53 -0
  111. meutils/ai_audio/asr/de.py +11 -0
  112. meutils/ai_audio/asr/fast_asr.py +15 -7
  113. meutils/ai_audio/asr/openai_asr.py +83 -6
  114. meutils/ai_audio/fast_asr.py +8 -4
  115. meutils/ai_audio/tts/EdgeTTS.py +33 -7
  116. meutils/ai_audio/tts/openai_tts.py +24 -20
  117. meutils/ai_audio/tts/tts_ui.py +1 -0
  118. meutils/ai_audio/utils.py +9 -0
  119. meutils/ai_cv/__init__.py +0 -1
  120. meutils/ai_cv/ocr.py +3 -2
  121. meutils/ai_cv/utils.py +154 -0
  122. meutils/ai_video/avmerge.py +6 -0
  123. meutils/ai_video/video.py +11 -2
  124. meutils/{api → apis}/__init__.py +1 -1
  125. meutils/apis/ali_apis.py +60 -0
  126. meutils/apis/audio/__init__.py +10 -0
  127. meutils/apis/audio/deepinfra.py +59 -0
  128. meutils/apis/audio/fish.py +248 -0
  129. meutils/apis/baidu/__init__.py +9 -0
  130. meutils/apis/baidu/bdaitpzs.py +229 -0
  131. meutils/apis/baidu/test.py +78 -0
  132. meutils/apis/chatglm/__init__.py +11 -0
  133. meutils/apis/chatglm/glm_video.py +273 -0
  134. meutils/apis/chatglm/glm_video_api.py +116 -0
  135. meutils/apis/chatglm/images.py +63 -0
  136. meutils/apis/chatglm/temp.py +259 -0
  137. meutils/apis/chatglm/x.py +31 -0
  138. meutils/{api → apis}/common.py +10 -6
  139. meutils/apis/fal/__init__.py +11 -0
  140. meutils/apis/fal/files.py +53 -0
  141. meutils/apis/fal/images.py +57 -0
  142. meutils/apis/fal/images_.py +72 -0
  143. meutils/apis/fal/videos.py +77 -0
  144. meutils/apis/firecrawl.py +45 -0
  145. meutils/apis/gitee/__init__.py +11 -0
  146. meutils/apis/gitee/images/__init__.py +9 -0
  147. meutils/apis/gitee/images/kolors.py +99 -0
  148. meutils/apis/hailuoai/__init__.py +11 -0
  149. meutils/apis/hailuoai/demo.py +34 -0
  150. meutils/apis/hailuoai/hasha_new.py +248 -0
  151. meutils/apis/hailuoai/music.py +11 -0
  152. meutils/apis/hailuoai/upload.py +116 -0
  153. meutils/apis/hailuoai/videos.py +460 -0
  154. meutils/apis/hailuoai/yy.py +242 -0
  155. meutils/apis/hf/__init__.py +11 -0
  156. meutils/apis/hf/got_ocr.py +64 -0
  157. meutils/apis/hf/gradio.py +34 -0
  158. meutils/apis/hf/hivisionidphotos.py +80 -0
  159. meutils/apis/hf/kolors.py +68 -0
  160. meutils/apis/hf/kolors_virtual_try_on.py +107 -0
  161. meutils/apis/hf/r.py +53 -0
  162. meutils/apis/hf/x.py +26 -0
  163. meutils/apis/hf//350/257/201/344/273/266/347/205/247.py +41 -0
  164. meutils/apis/hunyuan/__init__.py +11 -0
  165. meutils/apis/hunyuan/image_tools.py +84 -0
  166. meutils/apis/images/__init__.py +11 -0
  167. meutils/apis/images/deepinfra.py +92 -0
  168. meutils/apis/images/demo.py +150 -0
  169. meutils/apis/images/eidt.py +36 -0
  170. meutils/apis/images/flux/__init__.py +11 -0
  171. meutils/apis/images/flux/fluxpro.py +108 -0
  172. meutils/apis/images/flux/mystic.py +116 -0
  173. meutils/apis/images/ideogram/__init__.py +10 -0
  174. meutils/apis/images/ideogram/ideogram_images.py +193 -0
  175. meutils/apis/images/prodia/__init__.py +12 -0
  176. meutils/apis/images/prodia/faceswap.py +76 -0
  177. meutils/apis/images/recraft.py +152 -0
  178. meutils/apis/images/virtual_try_on/__init__.py +11 -0
  179. meutils/apis/images/virtual_try_on/images.py +65 -0
  180. meutils/apis/jiema/24mail.py +96 -0
  181. meutils/apis/jiema/__init__.py +11 -0
  182. meutils/apis/jiema/yezi.py +97 -0
  183. meutils/apis/jimeng/__init__.py +11 -0
  184. meutils/apis/jimeng/common.py +328 -0
  185. meutils/apis/jimeng/doubao.py +68 -0
  186. meutils/apis/jimeng/doubao_utils.py +175 -0
  187. meutils/apis/jimeng/files.py +263 -0
  188. meutils/apis/jimeng/images.py +140 -0
  189. meutils/apis/jimeng/lip_sync.py +11 -0
  190. meutils/apis/jina.py +55 -0
  191. meutils/apis/kling/__init__.py +11 -0
  192. meutils/apis/kling/api.py +60 -0
  193. meutils/apis/kling/images.py +174 -0
  194. meutils/apis/kling/kolors_virtual_try_on.py +111 -0
  195. meutils/apis/kling/kolors_virtual_try_on_web.py +126 -0
  196. meutils/apis/kling/videos.py +67 -0
  197. meutils/apis/kling//351/211/264/346/235/203.py +34 -0
  198. meutils/apis/kuaidi.py +32 -0
  199. meutils/apis/kuaishou/__init__.py +10 -0
  200. meutils/apis/kuaishou/klingai.py +523 -0
  201. meutils/apis/kuaishou/klingai_video.py +197 -0
  202. meutils/apis/kuaishou/kolors.py +189 -0
  203. meutils/apis/llm_qa.py +55 -0
  204. meutils/apis/luma/__init__.py +11 -0
  205. meutils/apis/luma/luma.py +123 -0
  206. meutils/apis/minicpm/__init__.py +9 -0
  207. meutils/apis/minicpm/luca.py +137 -0
  208. meutils/apis/monica/__init__.py +11 -0
  209. meutils/apis/monica/llm.py +11 -0
  210. meutils/apis/napkin/__init__.py +11 -0
  211. meutils/apis/napkin/icons.py +42 -0
  212. meutils/apis/niutrans.py +73 -0
  213. meutils/apis/oneapi/__init__.py +11 -0
  214. meutils/apis/oneapi/channel.py +68 -0
  215. meutils/apis/oneapi/common.py +135 -0
  216. meutils/apis/oneapi/log.py +47 -0
  217. meutils/apis/oneapi/token.py +48 -0
  218. meutils/apis/oneapi/token_.py +112 -0
  219. meutils/apis/oneapi/user.py +100 -0
  220. meutils/apis/oneapi/utils.py +47 -0
  221. meutils/apis/pixverse/__init__.py +11 -0
  222. meutils/apis/pixverse/pixverse.py +150 -0
  223. meutils/apis/proxy/__init__.py +11 -0
  224. meutils/apis/proxy/ips.py +178 -0
  225. meutils/apis/remini/__init__.py +11 -0
  226. meutils/apis/remini/remini.py +89 -0
  227. meutils/apis/replicateai/__init__.py +11 -0
  228. meutils/apis/replicateai/images.py +79 -0
  229. meutils/apis/replicateai/raw.py +53 -0
  230. meutils/apis/runwayml/__init__.py +10 -0
  231. meutils/apis/runwayml/gen.py +143 -0
  232. meutils/apis/search/__init__.py +11 -0
  233. meutils/apis/search/baichuan.py +11 -0
  234. meutils/apis/search/metaso.py +218 -0
  235. meutils/apis/search/metaso_.py +77 -0
  236. meutils/apis/search/n.py +99 -0
  237. meutils/apis/search/searxng.py +42 -0
  238. meutils/apis/search_music.py +39 -0
  239. meutils/apis/siliconflow/__init__.py +9 -0
  240. meutils/apis/siliconflow/audio.py +63 -0
  241. meutils/apis/siliconflow/image_to_image.py +116 -0
  242. meutils/apis/siliconflow/images.py +154 -0
  243. meutils/apis/siliconflow/rerankers.py +40 -0
  244. meutils/apis/siliconflow/text_to_image.py +132 -0
  245. meutils/apis/siliconflow/utils.py +66 -0
  246. meutils/apis/siliconflow/videos.py +102 -0
  247. meutils/apis/sunoai/__init__.py +10 -0
  248. meutils/apis/sunoai/haimian.py +135 -0
  249. meutils/apis/sunoai/suno.py +373 -0
  250. meutils/apis/textcard/__init__.py +11 -0
  251. meutils/apis/textcard/demo.py +25 -0
  252. meutils/apis/textcard/hanyuxinjie.py +81 -0
  253. meutils/apis/textin.py +159 -0
  254. meutils/apis/to_image/__init__.py +11 -0
  255. meutils/apis/to_image/html2image.py +29 -0
  256. meutils/apis/to_image/md.py +29 -0
  257. meutils/apis/to_image/url2image.py +41 -0
  258. meutils/apis/together/__init__.py +11 -0
  259. meutils/apis/together/images.py +80 -0
  260. meutils/apis/translator/__init__.py +9 -0
  261. meutils/apis/translator/deeplx.py +55 -0
  262. meutils/apis/tripo3d/__init__.py +11 -0
  263. meutils/apis/tripo3d/images.py +106 -0
  264. meutils/apis/ts.py +60 -0
  265. meutils/apis/uptime_kuma/__init__.py +11 -0
  266. meutils/apis/uptime_kuma/common.py +56 -0
  267. meutils/apis/uptime_kuma//345/233/275/344/272/247/345/210/206/347/273/204.py +68 -0
  268. meutils/apis/utils.py +47 -0
  269. meutils/apis/videos/__init__.py +11 -0
  270. meutils/apis/videos/sora.py +16 -0
  271. meutils/apis/vidu/__init__.py +9 -0
  272. meutils/apis/vidu/vidu_video.py +254 -0
  273. meutils/apis/vidu/x.py +14 -0
  274. meutils/apis/voice_clone/__init__.py +10 -0
  275. meutils/apis/voice_clone/fish.py +236 -0
  276. meutils/apis/voice_clone/fish_api.py +16 -0
  277. meutils/apis/web_search.py +31 -0
  278. meutils/apis/yezi.py +97 -0
  279. meutils/async_task/__init__.py +13 -0
  280. meutils/async_task/celery_config.py +106 -0
  281. meutils/async_task/common.py +37 -0
  282. meutils/async_task/demo_create_tasks.py +73 -0
  283. meutils/async_task/tasks/__init__.py +11 -0
  284. meutils/async_task/tasks/_all.py +20 -0
  285. meutils/async_task/tasks/hailuo.py +24 -0
  286. meutils/async_task/tasks/kling.py +30 -0
  287. meutils/async_task/tasks/replicateai.py +24 -0
  288. meutils/async_task/tasks/test.py +124 -0
  289. meutils/async_task/tasks/vidu.py +28 -0
  290. meutils/async_task/utils.py +191 -0
  291. meutils/async_task//351/200/232/347/224/250/350/256/276/350/256/241.py +119 -0
  292. meutils/async_utils/asyncer_.py +37 -0
  293. meutils/async_utils/background.py +68 -0
  294. meutils/async_utils/common.py +136 -16
  295. meutils/async_utils/test.py +47 -0
  296. meutils/cache_utils.py +29 -23
  297. meutils/caches/__init__.py +9 -0
  298. meutils/caches/acache.py +45 -0
  299. meutils/caches/redis_cache.py +63 -0
  300. meutils/clis/check_api.py +66 -0
  301. meutils/clis/cli.py +1 -1
  302. meutils/common.py +56 -17
  303. meutils/config_utils/__init__.py +11 -0
  304. meutils/config_utils/lark_utils/__init__.py +11 -0
  305. meutils/config_utils/lark_utils/common.py +385 -0
  306. meutils/config_utils/lark_utils/demo.py +13 -0
  307. meutils/config_utils/lark_utils/x.py +50 -0
  308. meutils/config_utils/manager.py +108 -0
  309. meutils/crawlers/__init__.py +11 -0
  310. meutils/data/VERSION +1 -1
  311. meutils/data/cowboy-hat-face.webp +0 -0
  312. meutils/data/oneapi/FOOTER.md +7 -0
  313. meutils/data/oneapi/NOTICE.md +138 -0
  314. meutils/data/oneapi/__init__.py +15 -0
  315. meutils/db/orm.py +179 -0
  316. meutils/db/redis_db.py +87 -0
  317. meutils/decorators/cache.py +1 -1
  318. meutils/decorators/common.py +84 -5
  319. meutils/decorators/contextmanagers.py +17 -6
  320. meutils/decorators/fastapi_decorator.py +77 -3
  321. meutils/decorators/polling.py +46 -0
  322. meutils/decorators/retry.py +150 -26
  323. meutils/fastapi_utils/__init__.py +11 -0
  324. meutils/fastapi_utils/exceptions/http_error.py +72 -0
  325. meutils/fastapi_utils/exceptions/validation_error.py +44 -0
  326. meutils/hash_utils.py +9 -4
  327. meutils/hooks/__init__.py +11 -0
  328. meutils/hooks/hook_test.py +174 -0
  329. meutils/hooks/wechat.py +162 -0
  330. meutils/hooks/wechat_channel.py +303 -0
  331. meutils/init/evn.py +1 -1
  332. meutils/io/files_utils.py +232 -0
  333. meutils/io/image.py +148 -10
  334. meutils/io/x.py +75 -0
  335. meutils/llm/__init__.py +10 -0
  336. meutils/llm/check_api.py +109 -0
  337. meutils/llm/check_utils.py +106 -0
  338. meutils/llm/clients.py +38 -0
  339. meutils/llm/completions/__init__.py +11 -0
  340. meutils/llm/completions/agents/__init__.py +11 -0
  341. meutils/llm/completions/agents/file.py +125 -0
  342. meutils/llm/completions/cp.py +112 -0
  343. meutils/llm/completions/delilegal.py +135 -0
  344. meutils/llm/completions/dify.py +81 -0
  345. meutils/llm/completions/kimi.py +47 -0
  346. meutils/llm/completions/modelscope.py +11 -0
  347. meutils/{fileparser/filetype.py → llm/completions/oi.py} +5 -3
  348. meutils/llm/completions/rag/__init__.py +11 -0
  349. meutils/llm/completions/rag/fire.py +157 -0
  350. meutils/llm/completions/rag/qwen.py +11 -0
  351. meutils/llm/completions/rag/rag.py +41 -0
  352. meutils/llm/completions/rag.py +38 -0
  353. meutils/llm/completions/tryblend.py +201 -0
  354. meutils/llm/completions/tune.py +284 -0
  355. meutils/llm/completions/x.py +26 -0
  356. meutils/llm/completions/xx.py +61 -0
  357. meutils/llm/completions/yuanbao.py +176 -0
  358. meutils/llm/demo.py +114 -0
  359. meutils/llm/functions/__init__.py +11 -0
  360. meutils/llm/mappers.py +15 -0
  361. meutils/llm/openai_utils/__init__.py +11 -0
  362. meutils/llm/openai_utils/common.py +284 -0
  363. meutils/llm/openai_utils/tool_outputs.py +45 -0
  364. meutils/llm/output_parsers/__init__.py +80 -0
  365. meutils/llm/prompts/__init__.py +244 -0
  366. meutils/llm/prompts/demo.py +155 -0
  367. meutils/llm/prompts/html2image_test.py +19 -0
  368. meutils/llm/utils.py +133 -0
  369. meutils/llm/x.py +75 -0
  370. meutils/notice/feishu.py +40 -9
  371. meutils/notice/wechat.py +23 -21
  372. meutils/np_utils.py +10 -1
  373. meutils/office_automation/pdf.py +6 -1
  374. meutils/oss/__init__.py +20 -0
  375. meutils/oss/minio_oss.py +184 -0
  376. meutils/oss/minio_utils.py +48 -0
  377. meutils/other/__demo.py +6 -4
  378. meutils/pandas_utils/__init__.py +1 -0
  379. meutils/pandas_utils/common.py +31 -0
  380. meutils/pandas_utils/pd_utils.py +10 -6
  381. meutils/parsers/__init__.py +10 -0
  382. meutils/parsers/file_parsers.py +110 -0
  383. meutils/parsers/fileparser/demo.py +41 -0
  384. meutils/parsers/fileparser/filetype.py +41 -0
  385. meutils/pay.py +37 -0
  386. meutils/pipe.py +37 -4
  387. meutils/playwright_utils/common.py +20 -12
  388. meutils/plots/common.py +35 -34
  389. meutils/queues/demo.py +56 -0
  390. meutils/queues/smooth_queue.py +120 -0
  391. meutils/queues/uniform_queue.py +3 -1
  392. meutils/request_utils/__init__.py +26 -2
  393. meutils/request_utils/ark.py +47 -0
  394. meutils/request_utils/crawler.py +34 -5
  395. meutils/request_utils/jwt_utils/__init__.py +11 -0
  396. meutils/request_utils/jwt_utils/common.py +42 -0
  397. meutils/request_utils/volc.py +160 -0
  398. meutils/schemas/__init__.py +0 -1
  399. meutils/schemas/baidu_types.py +70 -0
  400. meutils/schemas/batch_types.py +450 -0
  401. meutils/schemas/celery_types.py +64 -0
  402. meutils/schemas/chatfire_types.py +15 -0
  403. meutils/schemas/chatglm_types.py +197 -0
  404. meutils/schemas/db/__init__.py +11 -0
  405. meutils/schemas/db/oneapi_types.py +117 -0
  406. meutils/schemas/dify_types.py +40 -0
  407. meutils/schemas/embedding.py +31 -0
  408. meutils/schemas/fal_types.py +13 -0
  409. meutils/schemas/fish_types.py +11 -0
  410. meutils/schemas/hailuo_types.py +208 -0
  411. meutils/schemas/haimian_types.py +51 -0
  412. meutils/schemas/idphoto_types.py +43 -0
  413. meutils/schemas/image_types.py +476 -0
  414. meutils/schemas/jimeng_types.py +28 -0
  415. meutils/schemas/jina_types.py +67 -0
  416. meutils/schemas/kimi_types.py +86 -0
  417. meutils/schemas/kling_types.py +235 -0
  418. meutils/schemas/kuaishou_types.py +328 -0
  419. meutils/schemas/luma_types.py +59 -0
  420. meutils/schemas/message_types.py +165 -0
  421. meutils/schemas/message_types_.py +219 -0
  422. meutils/schemas/metaso_types.py +64 -0
  423. meutils/schemas/napkin_types.py +85 -0
  424. meutils/schemas/ocr_types.py +37 -0
  425. meutils/schemas/oneapi/__init__.py +11 -0
  426. meutils/schemas/oneapi/_types.py +49 -0
  427. meutils/schemas/oneapi/common.py +883 -0
  428. meutils/schemas/oneapi/icons.py +30 -0
  429. meutils/schemas/oneapi/model_group_info.py +48 -0
  430. meutils/schemas/oneapi/model_info.py +34 -0
  431. meutils/schemas/oneapi/models.py +26 -0
  432. meutils/schemas/oneapi/x.py +26 -0
  433. meutils/schemas/oneapi//351/207/215/345/256/232/345/220/221.py +132 -0
  434. meutils/schemas/openai_api_protocol.py +411 -0
  435. meutils/schemas/openai_types.py +366 -0
  436. meutils/schemas/pixverse_types.py +88 -0
  437. meutils/schemas/playwright_types.py +57 -0
  438. meutils/schemas/prodia_types.py +19 -0
  439. meutils/schemas/replicate_types.py +112 -0
  440. meutils/schemas/request_types.py +20 -0
  441. meutils/schemas/runwayml_types.py +190 -0
  442. meutils/schemas/siliconflow_types.py +80 -0
  443. meutils/schemas/step_types.py +19 -0
  444. meutils/schemas/suno_types.py +319 -0
  445. meutils/schemas/task_types.py +192 -0
  446. meutils/schemas/translator_types.py +29 -0
  447. meutils/schemas/tripo3d_types.py +57 -0
  448. meutils/schemas/tryblend_types.py +51 -0
  449. meutils/schemas/video_types.py +62 -0
  450. meutils/schemas/vidu_types.py +350 -0
  451. meutils/schemas/wechat_types.py +316 -0
  452. meutils/schemas/yuanbao_types.py +260 -0
  453. meutils/serving/celery/__init__.py +8 -0
  454. meutils/serving/celery/config.py +115 -0
  455. meutils/serving/celery/router.py +4 -6
  456. meutils/serving/celery/tasks.py +6 -4
  457. meutils/serving/celery//351/200/232/347/224/250/350/256/276/350/256/241.py +119 -0
  458. meutils/serving/fastapi/common.py +27 -31
  459. meutils/serving/fastapi/dependencies/__init__.py +0 -1
  460. meutils/serving/fastapi/dependencies/auth.py +55 -2
  461. meutils/serving/fastapi/exceptions/http_error.py +67 -2
  462. meutils/serving/fastapi/exceptions/validation_error.py +18 -2
  463. meutils/serving/fastapi/lifespans.py +73 -0
  464. meutils/serving/fastapi/routers/scheduler.py +12 -0
  465. meutils/serving/fastapi/routers/screenshot.py +47 -0
  466. meutils/serving/fastapi/routers/spider.py +8 -3
  467. meutils/serving/fastapi/routers/task.py +48 -0
  468. meutils/serving/fastapi/utils.py +48 -1
  469. meutils/serving/streamlit/common.py +1 -1
  470. meutils/smooth_utils.py +3 -0
  471. meutils/str_utils/__init__.py +22 -3
  472. meutils/str_utils/json_utils.py +7 -0
  473. meutils/str_utils/regular_expression.py +102 -10
  474. meutils/templates/xx.html +21 -0
  475. meutils/templates/xxx.html +117 -0
  476. meutils/todo.py +12 -0
  477. meutils/tools/token_monitor.py +33 -0
  478. MeUtils-2024.3.4.13.4.45.dist-info/RECORD +0 -540
  479. meutils/ai_audio/asr/subtitle.srt +0 -40
  480. meutils/ai_audio/demo.ipynb +0 -1215
  481. meutils/ai_audio/example.srt +0 -348
  482. meutils/ai_audio/new.srt +0 -179
  483. meutils/ai_audio/subtitles.srt +0 -696
  484. meutils/ai_audio/tts/new.srt +0 -179
  485. meutils/ai_audio//350/247/206/351/242/221/345/220/210/345/271/266.sh +0 -32
  486. meutils/ai_cv/1.jpg +0 -0
  487. meutils/ai_cv/197.jpg +0 -0
  488. meutils/ai_cv/2.jpg +0 -0
  489. meutils/ai_cv/img.png +0 -0
  490. meutils/ai_cv/invoice.jpg +0 -0
  491. meutils/ai_cv/tbl.png +0 -0
  492. meutils/ai_cv/test.png +0 -0
  493. meutils/ann/README.md +0 -33
  494. meutils/ann/README_gensim.md +0 -47
  495. meutils/ann/examples/client.py +0 -59
  496. meutils/ann/examples/demo.py +0 -24
  497. meutils/api/deeplx.py +0 -29
  498. meutils/api/qr.png +0 -0
  499. meutils/clis/README.md +0 -29
  500. meutils/clis/__test.sh +0 -17
  501. meutils/clis/deepseek.txt +0 -8
  502. meutils/clis/deepseek_13003330042.json +0 -1
  503. meutils/clis/deepseek_13003872192.json +0 -1
  504. meutils/clis/deepseek_13852263862.json +0 -1
  505. meutils/clis/deepseek_13913898681.json +0 -1
  506. meutils/clis/deepseek_13962978617.json +0 -1
  507. meutils/clis/deepseek_15251801790.json +0 -1
  508. meutils/clis/deepseek_15720826383.json +0 -1
  509. meutils/clis/deepseek_18395563611.json +0 -1
  510. meutils/clis/deepseek_313303303@qq.com.json +0 -1
  511. meutils/clis/kimi_state.json +0 -1
  512. meutils/cmds/README.md +0 -55
  513. meutils/coding/__init__.py +0 -11
  514. meutils/coding/find132.py +0 -40
  515. meutils/db/README.md +0 -51
  516. meutils/decorators/README.md +0 -17
  517. meutils/docarray_utils/demo_es.py +0 -34
  518. meutils/docarray_utils/demo_hnsw.py +0 -55
  519. meutils/docarray_utils/in_memory.py +0 -38
  520. meutils/docarray_utils//346/224/271/351/200/240/344/270/213hnsw.py +0 -43
  521. meutils/io/file.py +0 -20
  522. meutils/io/img.png +0 -0
  523. meutils/io/x.yml +0 -1
  524. meutils/notice/img.png +0 -0
  525. meutils/notice/todo.md +0 -10
  526. meutils/office_automation//346/212/225/350/265/204/347/256/241/347/220/206/347/263/273/347/273/237O3.2_/344/272/244/346/230/223/347/273/204.pdm +0 -22469
  527. meutils/playwright_utils/__test.sh +0 -2
  528. meutils/playwright_utils/kimi1_cookies.json +0 -1
  529. meutils/playwright_utils/kimi2_cookies.json +0 -1
  530. meutils/playwright_utils/kimi_cookies.json +0 -93
  531. meutils/serving/README.md +0 -1
  532. meutils/serving/celery/_run.sh +0 -10
  533. meutils/serving/gui/run.sh +0 -9
  534. meutils/serving/jina/__demo/client.py +0 -42
  535. meutils/serving/jina/__demo/flow.svg +0 -1
  536. meutils/serving/jina/__demo/s.py +0 -34
  537. meutils/serving/jina/__demo/s2.py +0 -37
  538. meutils/serving/jina/__demo/server.py +0 -83
  539. meutils/serving/jina/__demo/test.py +0 -40
  540. meutils/serving/jina/executors/SentenceEncoder.py +0 -62
  541. meutils/serving/jina/executors/SentenceEncoder_.py +0 -63
  542. meutils/serving/jina/executors/__init__.py +0 -46
  543. meutils/serving/jina/executors/base.py +0 -40
  544. meutils/serving/jina/nlp_serving/__init__.py +0 -11
  545. meutils/serving/jina/nlp_serving/word_segmentation.py +0 -40
  546. meutils/serving/streamlit/conf.yaml +0 -5
  547. meutils/serving/streamlit/ocr.png +0 -0
  548. meutils/serving/streamlit/run.sh +0 -17
  549. meutils/serving/webui/.streamlit/_config.toml +0 -186
  550. meutils/serving/webui/.streamlit/config.toml +0 -26
  551. meutils/serving/webui/pages/_1_/345/210/206/350/257/215.py +0 -56
  552. meutils/serving/webui/pages/_2_/350/257/215/346/200/247/346/240/207/346/263/250/344/270/216/345/256/236/344/275/223/350/257/206/345/210/253.py +0 -54
  553. meutils/serving/webui/pages/_3_/346/226/207/346/234/254/345/214/271/351/205/215.py +0 -64
  554. meutils/serving/webui/run.sh +0 -9
  555. meutils/spark/__init__.py +0 -26
  556. meutils/tools/monitor.yml +0 -29
  557. {MeUtils-2024.3.4.13.4.45.dist-info → MeUtils-2025.1.16.17.15.52.dist-info}/LICENSE +0 -0
  558. {MeUtils-2024.3.4.13.4.45.dist-info → MeUtils-2025.1.16.17.15.52.dist-info}/top_level.txt +0 -0
  559. {meutils → examples}/comp_utils/__init__.py +0 -0
  560. {meutils → examples}/comp_utils/reverse_metric.py +0 -0
  561. /meutils/{fileparser/README.md → fastapi_utils/exceptions/__init__.py} +0 -0
  562. /meutils/{fileparser → parsers/fileparser}/PDF/346/212/275/345/217/226.py" +0 -0
  563. /meutils/{fileparser → parsers/fileparser}/__init__.py +0 -0
  564. /meutils/{fileparser → parsers/fileparser}/common.py +0 -0
  565. /meutils/{fileparser → parsers/fileparser}/filetype/__init__.py +0 -0
  566. /meutils/{fileparser → parsers/fileparser}/filetype/__main__.py +0 -0
  567. /meutils/{fileparser → parsers/fileparser}/filetype/filetype.py +0 -0
  568. /meutils/{fileparser → parsers/fileparser}/filetype/helpers.py +0 -0
  569. /meutils/{fileparser → parsers/fileparser}/filetype/match.py +0 -0
  570. /meutils/{fileparser → parsers/fileparser}/filetype/types/__init__.py +0 -0
  571. /meutils/{fileparser → parsers/fileparser}/filetype/types/application.py +0 -0
  572. /meutils/{fileparser → parsers/fileparser}/filetype/types/archive.py +0 -0
  573. /meutils/{fileparser → parsers/fileparser}/filetype/types/audio.py +0 -0
  574. /meutils/{fileparser → parsers/fileparser}/filetype/types/base.py +0 -0
  575. /meutils/{fileparser → parsers/fileparser}/filetype/types/document.py +0 -0
  576. /meutils/{fileparser → parsers/fileparser}/filetype/types/font.py +0 -0
  577. /meutils/{fileparser → parsers/fileparser}/filetype/types/image.py +0 -0
  578. /meutils/{fileparser → parsers/fileparser}/filetype/types/isobmff.py +0 -0
  579. /meutils/{fileparser → parsers/fileparser}/filetype/types/video.py +0 -0
  580. /meutils/{fileparser → parsers/fileparser}/filetype/utils.py +0 -0
  581. /meutils/{fileparser → parsers/fileparser}/pdf.py +0 -0
  582. /meutils/{fileparser → parsers/fileparser}//350/241/250/346/240/274/346/212/275/345/217/226.py" +0 -0
@@ -0,0 +1,119 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+ # @Project : AI. @by PyCharm
4
+ # @File : 通用设计
5
+ # @Time : 2024/11/25 18:13
6
+ # @Author : betterme
7
+ # @WeChat : meutils
8
+ # @Software : PyCharm
9
+ # @Description : https://github.com/GregaVrbancic/fastapi-celery/blob/master/app/main.py#L31
10
+
11
+ from meutils.pipe import *
12
+ from typing import Any, Dict, Optional
13
+ from celery.result import AsyncResult
14
+
15
+ from fastapi import FastAPI, APIRouter, Request, HTTPException
16
+ from enum import Enum
17
+ from pydantic import BaseModel
18
+
19
+
20
+ # 1. 定义标准响应模型
21
+ class TaskStatus(str, Enum):
22
+ PENDING = "PENDING"
23
+ SUCCESS = "SUCCESS"
24
+ FAILURE = "FAILURE"
25
+ RUNNING = "RUNNING"
26
+
27
+
28
+ class TaskResponse(BaseModel):
29
+ code: int
30
+ message: str
31
+ task_id: str
32
+ status: TaskStatus
33
+ data: Optional[Any] = None
34
+
35
+
36
+ # 2. 定义任务管理器
37
+ class TaskManager:
38
+ @staticmethod
39
+ async def create_task(task_func, **kwargs) -> TaskResponse:
40
+ try:
41
+ task = task_func.delay(**kwargs)
42
+ return TaskResponse(
43
+ code=0,
44
+ message="Task created successfully",
45
+ task_id=task.id,
46
+ status=TaskStatus.PENDING
47
+ )
48
+ except Exception as e:
49
+ raise HTTPException(status_code=500, detail=str(e))
50
+
51
+ @staticmethod
52
+ async def get_task_result(task_id: str) -> TaskResponse:
53
+ result = AsyncResult(id=task_id)
54
+
55
+ if result.ready():
56
+ if result.successful():
57
+ return TaskResponse(
58
+ code=0,
59
+ message="Task completed successfully",
60
+ task_id=task_id,
61
+ status=TaskStatus.SUCCESS,
62
+ data=result.get()
63
+ )
64
+ else:
65
+ return TaskResponse(
66
+ code=1,
67
+ message=str(result.result),
68
+ task_id=task_id,
69
+ status=TaskStatus.FAILURE
70
+ )
71
+ else:
72
+ return TaskResponse(
73
+ code=0,
74
+ message="Task is still running",
75
+ task_id=task_id,
76
+ status=TaskStatus.RUNNING
77
+ )
78
+
79
+
80
+ # 3. 路由实现
81
+ router = APIRouter(prefix="/celery")
82
+
83
+
84
+ @router.get("/{task_id}", response_model=TaskResponse)
85
+ async def get_result(task_id: str):
86
+ return await TaskManager.get_task_result(task_id)
87
+
88
+
89
+ @router.post("/task", response_model=TaskResponse)
90
+ async def create_task(request: Request):
91
+ try:
92
+ kwargs = await request.json()
93
+ return await TaskManager.create_task(proxy_task, **kwargs)
94
+ except Exception as e:
95
+ raise HTTPException(status_code=400, detail=str(e))
96
+
97
+
98
+ # 4. 错误处理装饰器
99
+ def handle_task_errors(func):
100
+ async def wrapper(*args, **kwargs):
101
+ try:
102
+ return await func(*args, **kwargs)
103
+ except Exception as e:
104
+ return TaskResponse(
105
+ code=1,
106
+ message=str(e),
107
+ task_id="",
108
+ status=TaskStatus.FAILURE
109
+ )
110
+
111
+ return wrapper
112
+
113
+
114
+ if __name__ == '__main__':
115
+ from meutils.serving.fastapi import App
116
+
117
+ app = App()
118
+ app.include_router(router)
119
+ app.run(port=8899)
@@ -0,0 +1,37 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+ # @Project : AI. @by PyCharm
4
+ # @File : x
5
+ # @Time : 2024/11/28 19:30
6
+ # @Author : betterme
7
+ # @WeChat : meutils
8
+ # @Software : PyCharm
9
+ # @Description : https://github.com/fastapi/asyncer
10
+
11
+ from meutils.pipe import *
12
+ import time
13
+
14
+ import anyio
15
+ from asyncer import asyncify, syncify
16
+
17
+ @asyncify
18
+ def do_sync_work(name: str):
19
+ time.sleep(1)
20
+ return f"Hello, {name}"
21
+
22
+
23
+ @syncify
24
+ async def do_async_work(name: str):
25
+ await asyncio.sleep(1)
26
+ return f"Hello, a{name}"
27
+
28
+ async def main():
29
+ message = await asyncify(do_sync_work)(name="World")
30
+ print(message)
31
+
32
+
33
+ if __name__ == '__main__':
34
+
35
+
36
+ # arun(do_sync_work('xx'))
37
+ arun(do_async_work('xxx'))
@@ -0,0 +1,68 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+ # @Project : AI. @by PyCharm
4
+ # @File : background
5
+ # @Time : 2024/6/12 11:00
6
+ # @Author : betterme
7
+ # @WeChat : meutils
8
+ # @Software : PyCharm
9
+ # @Description :
10
+
11
+ from meutils.decorators import background_task
12
+
13
+ from asgiref.sync import async_to_sync
14
+ from starlette.background import BackgroundTask as _BackgroundTask, BackgroundTasks as _BackgroundTasks
15
+
16
+
17
+ class BackgroundTask(_BackgroundTask):
18
+ """
19
+ async def f(x):
20
+ for i in range(100):
21
+ logger.debug(i)
22
+ await asyncio.sleep(1)
23
+ BackgroundTask(f, x='xxxxxxxxxx').call()
24
+
25
+ bt = BackgroundTasks()
26
+ bt.add_task(f, x='xxxxxxxxxx')
27
+ bt.call()
28
+ """
29
+
30
+ @background_task
31
+ def call(self):
32
+ async_to_sync(super().__call__)()
33
+
34
+
35
+ class BackgroundTasks(_BackgroundTasks):
36
+ """
37
+ async def f(x):
38
+ for i in range(100):
39
+ logger.debug(i)
40
+ await asyncio.sleep(1)
41
+ BackgroundTask(f, x='xxxxxxxxxx').call()
42
+
43
+ bt = BackgroundTasks()
44
+ bt.add_task(f, x='xxxxxxxxxx')
45
+ bt.call()
46
+ """
47
+
48
+ @background_task
49
+ def call(self):
50
+ async_to_sync(super().__call__)()
51
+
52
+
53
+ if __name__ == '__main__':
54
+ from meutils.pipe import *
55
+
56
+
57
+ async def f(x):
58
+ logger.debug(x)
59
+
60
+ for i in range(100):
61
+ logger.debug(i)
62
+ await asyncio.sleep(1)
63
+
64
+
65
+ bt = BackgroundTasks()
66
+ bt.add_task(f, x='xxxxxxxxxx')
67
+ bt.call()
68
+
@@ -10,14 +10,94 @@
10
10
 
11
11
  import inspect
12
12
  import asyncio
13
- from typing import Coroutine
13
+ from typing import Union, Any, Coroutine, AsyncIterator, Iterator, Iterable, AsyncIterable, Optional, Callable
14
14
 
15
+ import numpy as np
16
+ import pandas as pd
15
17
  from async_lru import alru_cache
16
- from asgiref.sync import sync_to_async
18
+ from asgiref.sync import sync_to_async, async_to_sync
19
+ from httpx import Client, AsyncClient
20
+ from loguru import logger
21
+ from pprint import pprint
22
+ from aiostream import stream
23
+ from functools import wraps
17
24
 
18
25
 
19
- def arun(coroutine: Coroutine, debug=None):
20
- return asyncio.run(coroutine, debug=debug)
26
+ def async_to_sync_pro(func):
27
+ @wraps(func) # 添加这行来保留原函数的属性
28
+ def wrapper(*args, **kwargs):
29
+ return async_to_sync(func)(*args, **kwargs)
30
+
31
+ return wrapper
32
+
33
+
34
+ async def achain(*iterables: Union[Iterator[Any], AsyncIterator[Any]], delay: int = 0) -> AsyncIterator[Any]:
35
+ """
36
+ async def async_generator_1() -> AsyncIterator[str]:
37
+ for i in range(1, 6):
38
+ await asyncio.sleep(1)
39
+ yield f'gen1-{i}'
40
+
41
+
42
+ async def async_generator_2() -> AsyncIterator[str]:
43
+ for i in range(1, 6):
44
+ await asyncio.sleep(1.5)
45
+ yield f'gen2-{i}'
46
+
47
+
48
+ async def main():
49
+ async for value in achain(async_generator_1(), async_generator_2()):
50
+ print(value)
51
+
52
+
53
+ asyncio.run(main())
54
+ :param iterables:
55
+ :return:
56
+ """
57
+
58
+ for iterable in iterables or []:
59
+
60
+ # logger.debug(f"{iterable}: {type(iterable)}")
61
+
62
+ if isinstance(iterable, AsyncIterator):
63
+ async for item in iterable:
64
+ yield item
65
+ delay and await asyncio.sleep(delay)
66
+
67
+ else:
68
+ # await asyncio.sleep(0) # 神奇的代码:不起作用
69
+
70
+ for item in iterable or []:
71
+ # logger.debug(item)
72
+ yield item
73
+ await asyncio.sleep(delay) # 神奇的代码:同步转异步
74
+
75
+
76
+ def arun(awaitable_object: Union[Coroutine, AsyncIterator], debug: bool = True):
77
+ # asyncio.iscoroutine(coroutine)
78
+ # logger.debug(type(awaitable_object))
79
+ # logger.debug(isinstance(awaitable_object, Coroutine))
80
+ # logger.debug(isinstance(awaitable_object, AsyncIterator))
81
+ #
82
+ # logger.debug(inspect.isawaitable(awaitable_object))
83
+ # logger.debug(inspect.isasyncgen(awaitable_object))
84
+ # logger.debug(inspect.isasyncgenfunction(awaitable_object))
85
+
86
+ # asyncio.iscoroutine(awaitable_object)
87
+ if inspect.isasyncgen(awaitable_object):
88
+ async def main():
89
+ async for i in awaitable_object:
90
+ print(i, end='')
91
+ # return await stream.list(awaitable_object)
92
+
93
+ _awaitable_object = main()
94
+ else:
95
+ _awaitable_object = awaitable_object
96
+
97
+ _ = asyncio.run(_awaitable_object, debug=debug)
98
+ if debug:
99
+ isinstance(_, (np.ndarray, pd.Series, pd.DataFrame)) or _ and pprint(_)
100
+ return _
21
101
 
22
102
 
23
103
  def aclose():
@@ -25,9 +105,7 @@ def aclose():
25
105
  nest_asyncio.apply()
26
106
 
27
107
 
28
- def close_event_loop():
29
- import nest_asyncio
30
- nest_asyncio.apply()
108
+ close_event_loop = aclose
31
109
 
32
110
 
33
111
  def async2sync_generator(generator):
@@ -57,18 +135,60 @@ def async2sync_generator(generator):
57
135
  yield from generator
58
136
 
59
137
 
60
- # from asgiref.sync import sync_to_async
61
- # anyio.to_thread.run_sync
138
+ async def arequest(url, method='get', payload=None, **client_params):
139
+ if payload:
140
+ if method.lower() == 'get':
141
+ payload = {"params": payload}
142
+ else:
143
+ payload = {"json": payload}
144
+ async with AsyncClient(**client_params) as client:
145
+ resp = await client.request(method=method, url=url, **payload)
146
+ return resp
62
147
 
63
148
 
64
- if __name__ == '__main__':
65
- from meutils.pipe import *
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
66
152
 
153
+ for i in range(n):
154
+ await asyncio.sleep(sleep_fn(i))
155
+ if _ := await fn(): # 跳出
156
+ return _
67
157
 
68
- async def async_generator():
69
- for i in range(10):
70
- await asyncio.sleep(1)
71
- yield i
158
+
159
+ if __name__ == '__main__':
160
+ from meutils.pipe import *
72
161
 
73
162
 
74
- async_generator() | xprint
163
+ # async def async_generator():
164
+ # for i in range(10):
165
+ # await asyncio.sleep(1)
166
+ # yield i
167
+ #
168
+ #
169
+ # async_generator() | xprint
170
+
171
+ # async def async_generator_1() -> AsyncIterator[str]:
172
+ # for i in range(1, 6):
173
+ # await asyncio.sleep(1)
174
+ # yield f'gen1-{i}'
175
+ #
176
+ #
177
+ # def async_generator_2():
178
+ # for i in range(1, 6):
179
+ # yield f'gen2-{i}'
180
+ #
181
+ #
182
+ # async def main():
183
+ # async for value in achain(async_generator_1(), async_generator_2()):
184
+ # print(value)
185
+ #
186
+ #
187
+ # asyncio.run(main())
188
+
189
+ async def main():
190
+ async for value in achain():
191
+ print(value)
192
+
193
+
194
+ asyncio.run(main())
@@ -0,0 +1,47 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+ # @Project : AI. @by PyCharm
4
+ # @File : test
5
+ # @Time : 2024/6/12 10:47
6
+ # @Author : betterme
7
+ # @WeChat : meutils
8
+ # @Software : PyCharm
9
+ # @Description : todo; 并没有啥用
10
+
11
+ from meutils.pipe import *
12
+ from starlette.background import BackgroundTask as _BackgroundTask, BackgroundTasks as _BackgroundTasks
13
+ from asgiref.sync import sync_to_async, async_to_sync
14
+
15
+
16
+ class BackgroundTask(_BackgroundTask):
17
+ """
18
+ async def f(x):
19
+ for i in range(100):
20
+ logger.debug(i)
21
+ await asyncio.sleep(1)
22
+ BackgroundTask(f, x='xxxxxxxxxx').call()
23
+
24
+ bt = BackgroundTasks()
25
+ bt.add_task(f, x='xxxxxxxxxx')
26
+ bt.call()
27
+ """
28
+
29
+ def call(self):
30
+ async_to_sync(super().__call__)()
31
+
32
+
33
+ class BackgroundTasks(_BackgroundTasks):
34
+ """
35
+ async def f(x):
36
+ for i in range(100):
37
+ logger.debug(i)
38
+ await asyncio.sleep(1)
39
+ BackgroundTask(f, x='xxxxxxxxxx').call()
40
+
41
+ bt = BackgroundTasks()
42
+ bt.add_task(f, x='xxxxxxxxxx')
43
+ bt.call()
44
+ """
45
+
46
+ def call(self):
47
+ async_to_sync(super().__call__)()
meutils/cache_utils.py CHANGED
@@ -7,6 +7,8 @@
7
7
  # @WeChat : 313303303
8
8
  # @Software : PyCharm
9
9
  # @Description : https://cachetools.readthedocs.io/en/stable/
10
+
11
+ # https://github.com/awolverp/cachebox 缓存 todo
10
12
  """
11
13
  异步缓存 from aiocache import cached
12
14
 
@@ -23,6 +25,7 @@ RR:Random Replacement,就是随机替换。
23
25
  TTL:time-to-live 的简称,也就是说,Cache 中的每个元素都是有过期时间的,如果超过了这个时间,那这个元素就会被自动销毁。
24
26
  如果都没过期并且 Cache 已经满了的话,那就会采用 LRU 置换算法来替换掉最久不用的,以此来保证数量。
25
27
  """
28
+ import time
26
29
  import sys
27
30
  import math
28
31
  import pickle
@@ -32,8 +35,8 @@ import pandas as pd
32
35
  import inspect
33
36
  import joblib
34
37
 
35
- from typing import Iterable
36
- from functools import lru_cache
38
+ from typing import Iterable, Optional
39
+ from functools import lru_cache as _lru_cache
37
40
  from pathlib import Path
38
41
  from joblib import Memory
39
42
  from joblib.func_inspect import filter_args
@@ -49,7 +52,8 @@ from cachetools import cached, cachedmethod, LRUCache, RRCache, TTLCache as _TTL
49
52
  from meutils.decorators import decorator, singleton, background_task
50
53
  from meutils.hash_utils import md5
51
54
 
52
- TTLCache = lru_cache()(_TTLCache)
55
+ TTLCache = _lru_cache()(_TTLCache)
56
+
53
57
 
54
58
  # todo: cache_clear 很重要
55
59
  def map_cache():
@@ -83,7 +87,7 @@ def ttl_cache(ttl=np.inf, maxsize=1024, key=key_fn):
83
87
  def redis_cache(func, rc=None, ex=3, ignore=None, verbose=1, *args, **kwargs):
84
88
  """redis 缓存"""
85
89
  import redis
86
- rc = rc or redis.Redis(host='localhost', port=6379, db=0)
90
+ rc = rc or redis.Redis()
87
91
 
88
92
  ##############################################################################
89
93
  fn_name = func.__name__ if hasattr(func, '__name__') else 'fn'
@@ -130,7 +134,7 @@ def joblib_cache(func, location='cachedir', ignore=None, verbose=1, *args, **kwa
130
134
 
131
135
 
132
136
  @decorator
133
- def diskcache(func, location='cachedir', ttl=None, ignore=None, verbose=1, tag=None, *args, **kwargs):
137
+ def diskcache(func, location='cachedir', ttl=None, ignore: Optional[list] = None, verbose=1, tag=None, *args, **kwargs):
134
138
  """
135
139
  https://zhuanlan.zhihu.com/p/356447502
136
140
  https://grantjenks.com/docs/diskcache/
@@ -145,11 +149,12 @@ def diskcache(func, location='cachedir', ttl=None, ignore=None, verbose=1, tag=N
145
149
  raw_key = {**raw_key.pop('**', {}), **raw_key, '__tag__': tag or func.__name__}
146
150
 
147
151
  # self cls 看场景选择
148
- ignore = (ignore or []) + [
149
- 'api_base', 'api_key', 'openai_api_base', 'openai_api_key',
150
- 'organization', 'openai_organization',
151
- 'request_timeout'
152
- ]
152
+ ignore = ignore or []
153
+ # ignore += [
154
+ # 'api_base', 'api_key', 'openai_api_base', 'openai_api_key',
155
+ # 'organization', 'openai_organization',
156
+ # 'request_timeout'
157
+ # ]
153
158
  for arg in ignore:
154
159
  raw_key.pop(arg, None)
155
160
 
@@ -261,16 +266,17 @@ def cache(func, cache_name='cachedir', ttl=None, ignore=None, verbose=1, tag=Non
261
266
 
262
267
 
263
268
  if __name__ == '__main__':
264
-
265
- import time
266
-
267
-
268
- @redis_cache(ex=15 * 60)
269
- def f(x):
270
- time.sleep(1)
271
- return x
272
-
273
-
274
- for i in range(110):
275
- print(f(i))
276
- print(f(i))
269
+ # import time
270
+ #
271
+ #
272
+ # @redis_cache(ex=15 * 60)
273
+ # def f(x):
274
+ # time.sleep(1)
275
+ # return x
276
+ #
277
+ #
278
+ # for i in range(110):
279
+ # print(f(i))
280
+ # print(f(i))
281
+
282
+ pass
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+ # @Project : AI. @by PyCharm
4
+ # @File : __init__.py
5
+ # @Time : 2024/6/14 10:16
6
+ # @Author : betterme
7
+ # @WeChat : meutils
8
+ # @Software : PyCharm
9
+ # @Description :
@@ -0,0 +1,45 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+ # @Project : AI. @by PyCharm
4
+ # @File : acache
5
+ # @Time : 2025/1/14 09:45
6
+ # @Author : betterme
7
+ # @WeChat : meutils
8
+ # @Software : PyCharm
9
+ # @Description :
10
+ import os
11
+
12
+ from meutils.pipe import *
13
+
14
+ from aiocache import cached, Cache, RedisCache
15
+ from aiocache import multi_cached
16
+
17
+ # @multi_cached(ttl=60, caches=[Cache.MEMORY, Cache.MEMORY])
18
+ # async def complex_function(user_id, **kwargs):
19
+ # logger.debug(user_id)
20
+ # return False
21
+
22
+
23
+ # Cache.MEMORY
24
+
25
+ # Cache.REDIS
26
+ # mcache = cached(ttl=60, cache=Cache.REDIS)(cached)
27
+
28
+
29
+ rcache = Cache.from_url("redis://:chatfirechatfire@110.42.51.201:6379/11")
30
+ print(rcache)
31
+
32
+
33
+ # @cached(ttl=60)
34
+ @cached(ttl=15, cache=rcache)
35
+ async def complex_function(user_id, **kwargs):
36
+ logger.debug(user_id)
37
+ return False
38
+
39
+
40
+ class A(BaseModel):
41
+ a: Any = 1
42
+
43
+
44
+ if __name__ == '__main__':
45
+ arun(complex_function(A(a={})))
@@ -0,0 +1,63 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+ # @Project : AI. @by PyCharm
4
+ # @File : redis_cache
5
+ # @Time : 2024/12/6 10:46
6
+ # @Author : betterme
7
+ # @WeChat : meutils
8
+ # @Software : PyCharm
9
+ # @Description : https://hermescache.readthedocs.io/en/latest/
10
+ # https://mp.weixin.qq.com/s/-T2UmkinmtQoNQo4DVpnfw
11
+
12
+
13
+ import hermes.backend.redis
14
+ import hermes.backend.inprocess
15
+
16
+ from meutils.db.redis_db import pool
17
+
18
+ cache = hermes.Hermes(
19
+ backend=hermes.backend.redis.Backend,
20
+ connection_pool=pool
21
+ )
22
+
23
+ cache_inmemory = hermes.Hermes(
24
+ backend=hermes.backend.inprocess.Backend,
25
+ )
26
+
27
+ acache_inmemory = hermes.Hermes(
28
+ backend=hermes.backend.inprocess.AsyncBackend,
29
+ )
30
+
31
+
32
+ from aiocache import cached, Cache, RedisCache
33
+
34
+
35
+ if __name__ == '__main__':
36
+ from meutils.pipe import *
37
+
38
+ @cached(ttl=100)
39
+ @cache(tags=('test',))
40
+ async def foo(a, b):
41
+ time.sleep(3)
42
+ logger.debug('没有缓存')
43
+
44
+ return a * b
45
+
46
+
47
+ # @cache(tags=('test',), key=lambda fn, a, b: f'avg:{a}') # 这样可以忽略b
48
+ # async def func_ignore(a, b):
49
+ # await asyncio.sleep(5)
50
+ # logger.debug('异步函数')
51
+ # return a, b
52
+
53
+
54
+ # arun(func_ignore(1, 1))
55
+ # ttl: Optional[int] = None,
56
+ # tags: Sequence[str] = (),
57
+ # key: Optional[Callable] = None,
58
+ # @cache(ttl=100, key=lambda fn, a, b: (a, b))
59
+ # def func(x, y):
60
+ # logger.debug('xxxxxxx')
61
+ # return x
62
+
63
+ arun(foo(1, 2))