MeUtils 2024.3.18.15.56.48__py3-none-any.whl → 2025.1.17.17.55.21__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 (587) hide show
  1. {MeUtils-2024.3.18.15.56.48.dist-info → MeUtils-2025.1.17.17.55.21.dist-info}/METADATA +39 -33
  2. MeUtils-2025.1.17.17.55.21.dist-info/RECORD +869 -0
  3. {MeUtils-2024.3.18.15.56.48.dist-info → MeUtils-2025.1.17.17.55.21.dist-info}/WHEEL +1 -1
  4. {MeUtils-2024.3.18.15.56.48.dist-info → MeUtils-2025.1.17.17.55.21.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/aitools/__init__.py +11 -0
  126. meutils/apis/aitools/baidu/__init__.py +11 -0
  127. meutils/apis/aitools/baidu/sdk.py +37 -0
  128. meutils/apis/ali_apis.py +60 -0
  129. meutils/apis/audio/__init__.py +10 -0
  130. meutils/apis/audio/deepinfra.py +59 -0
  131. meutils/apis/audio/fish.py +248 -0
  132. meutils/apis/baidu/__init__.py +9 -0
  133. meutils/apis/baidu/bdaitpzs.py +229 -0
  134. meutils/apis/baidu/test.py +78 -0
  135. meutils/apis/chatglm/__init__.py +11 -0
  136. meutils/apis/chatglm/glm_video.py +273 -0
  137. meutils/apis/chatglm/glm_video_api.py +116 -0
  138. meutils/apis/chatglm/images.py +63 -0
  139. meutils/apis/chatglm/temp.py +259 -0
  140. meutils/apis/chatglm/x.py +31 -0
  141. meutils/{api → apis}/common.py +10 -6
  142. meutils/apis/fal/__init__.py +11 -0
  143. meutils/apis/fal/files.py +53 -0
  144. meutils/apis/fal/images.py +57 -0
  145. meutils/apis/fal/images_.py +72 -0
  146. meutils/apis/fal/videos.py +77 -0
  147. meutils/apis/firecrawl.py +45 -0
  148. meutils/apis/gitee/__init__.py +11 -0
  149. meutils/apis/gitee/images/__init__.py +9 -0
  150. meutils/apis/gitee/images/kolors.py +99 -0
  151. meutils/apis/gitee//350/211/262/346/203/205/345/233/276/347/211/207/350/257/206/345/210/253.py +33 -0
  152. meutils/apis/hailuoai/__init__.py +11 -0
  153. meutils/apis/hailuoai/demo.py +34 -0
  154. meutils/apis/hailuoai/hasha_new.py +248 -0
  155. meutils/apis/hailuoai/music.py +11 -0
  156. meutils/apis/hailuoai/upload.py +116 -0
  157. meutils/apis/hailuoai/videos.py +460 -0
  158. meutils/apis/hailuoai/yy.py +242 -0
  159. meutils/apis/hf/__init__.py +11 -0
  160. meutils/apis/hf/got_ocr.py +64 -0
  161. meutils/apis/hf/gradio.py +34 -0
  162. meutils/apis/hf/hivisionidphotos.py +80 -0
  163. meutils/apis/hf/kolors.py +68 -0
  164. meutils/apis/hf/kolors_virtual_try_on.py +107 -0
  165. meutils/apis/hf/r.py +53 -0
  166. meutils/apis/hf/x.py +26 -0
  167. meutils/apis/hf//350/257/201/344/273/266/347/205/247.py +41 -0
  168. meutils/apis/hunyuan/__init__.py +11 -0
  169. meutils/apis/hunyuan/image_tools.py +84 -0
  170. meutils/apis/images/__init__.py +11 -0
  171. meutils/apis/images/deepinfra.py +92 -0
  172. meutils/apis/images/demo.py +150 -0
  173. meutils/apis/images/edits.py +146 -0
  174. meutils/apis/images/eidt.py +36 -0
  175. meutils/apis/images/flux/__init__.py +11 -0
  176. meutils/apis/images/flux/fluxpro.py +108 -0
  177. meutils/apis/images/flux/mystic.py +116 -0
  178. meutils/apis/images/ideogram/__init__.py +10 -0
  179. meutils/apis/images/ideogram/ideogram_images.py +193 -0
  180. meutils/apis/images/prodia/__init__.py +12 -0
  181. meutils/apis/images/prodia/faceswap.py +76 -0
  182. meutils/apis/images/recraft.py +152 -0
  183. meutils/apis/images/virtual_try_on/__init__.py +11 -0
  184. meutils/apis/images/virtual_try_on/images.py +65 -0
  185. meutils/apis/jiema/24mail.py +96 -0
  186. meutils/apis/jiema/__init__.py +11 -0
  187. meutils/apis/jiema/yezi.py +97 -0
  188. meutils/apis/jimeng/__init__.py +11 -0
  189. meutils/apis/jimeng/common.py +328 -0
  190. meutils/apis/jimeng/doubao.py +68 -0
  191. meutils/apis/jimeng/doubao_utils.py +175 -0
  192. meutils/apis/jimeng/files.py +263 -0
  193. meutils/apis/jimeng/images.py +140 -0
  194. meutils/apis/jimeng/lip_sync.py +11 -0
  195. meutils/apis/jina.py +55 -0
  196. meutils/apis/kling/__init__.py +11 -0
  197. meutils/apis/kling/api.py +60 -0
  198. meutils/apis/kling/images.py +174 -0
  199. meutils/apis/kling/kolors_virtual_try_on.py +111 -0
  200. meutils/apis/kling/kolors_virtual_try_on_web.py +126 -0
  201. meutils/apis/kling/videos.py +67 -0
  202. meutils/apis/kling//351/211/264/346/235/203.py +34 -0
  203. meutils/apis/kuaidi.py +32 -0
  204. meutils/apis/kuaishou/__init__.py +10 -0
  205. meutils/apis/kuaishou/klingai.py +523 -0
  206. meutils/apis/kuaishou/klingai_video.py +197 -0
  207. meutils/apis/kuaishou/kolors.py +189 -0
  208. meutils/apis/llm_qa.py +55 -0
  209. meutils/apis/luma/__init__.py +11 -0
  210. meutils/apis/luma/luma.py +123 -0
  211. meutils/apis/minicpm/__init__.py +9 -0
  212. meutils/apis/minicpm/luca.py +137 -0
  213. meutils/apis/monica/__init__.py +11 -0
  214. meutils/apis/monica/llm.py +11 -0
  215. meutils/apis/napkin/__init__.py +11 -0
  216. meutils/apis/napkin/icons.py +42 -0
  217. meutils/apis/niutrans.py +73 -0
  218. meutils/apis/oneapi/__init__.py +11 -0
  219. meutils/apis/oneapi/channel.py +68 -0
  220. meutils/apis/oneapi/common.py +135 -0
  221. meutils/apis/oneapi/log.py +47 -0
  222. meutils/apis/oneapi/token.py +48 -0
  223. meutils/apis/oneapi/token_.py +112 -0
  224. meutils/apis/oneapi/user.py +100 -0
  225. meutils/apis/oneapi/utils.py +47 -0
  226. meutils/apis/pixverse/__init__.py +11 -0
  227. meutils/apis/pixverse/pixverse.py +150 -0
  228. meutils/apis/proxy/__init__.py +11 -0
  229. meutils/apis/proxy/ips.py +178 -0
  230. meutils/apis/remini/__init__.py +11 -0
  231. meutils/apis/remini/remini.py +89 -0
  232. meutils/apis/replicateai/__init__.py +11 -0
  233. meutils/apis/replicateai/images.py +79 -0
  234. meutils/apis/replicateai/raw.py +53 -0
  235. meutils/apis/runwayml/__init__.py +10 -0
  236. meutils/apis/runwayml/gen.py +143 -0
  237. meutils/apis/search/__init__.py +11 -0
  238. meutils/apis/search/baichuan.py +11 -0
  239. meutils/apis/search/metaso.py +218 -0
  240. meutils/apis/search/metaso_.py +77 -0
  241. meutils/apis/search/n.py +99 -0
  242. meutils/apis/search/searxng.py +42 -0
  243. meutils/apis/search_music.py +39 -0
  244. meutils/apis/siliconflow/__init__.py +9 -0
  245. meutils/apis/siliconflow/audio.py +63 -0
  246. meutils/apis/siliconflow/image_to_image.py +116 -0
  247. meutils/apis/siliconflow/images.py +154 -0
  248. meutils/apis/siliconflow/rerankers.py +40 -0
  249. meutils/apis/siliconflow/text_to_image.py +132 -0
  250. meutils/apis/siliconflow/utils.py +66 -0
  251. meutils/apis/siliconflow/videos.py +102 -0
  252. meutils/apis/sunoai/__init__.py +10 -0
  253. meutils/apis/sunoai/haimian.py +135 -0
  254. meutils/apis/sunoai/suno.py +373 -0
  255. meutils/apis/textcard/__init__.py +11 -0
  256. meutils/apis/textcard/demo.py +25 -0
  257. meutils/apis/textcard/hanyuxinjie.py +81 -0
  258. meutils/apis/textin.py +159 -0
  259. meutils/apis/to_image/__init__.py +11 -0
  260. meutils/apis/to_image/html2image.py +29 -0
  261. meutils/apis/to_image/md.py +29 -0
  262. meutils/apis/to_image/url2image.py +41 -0
  263. meutils/apis/together/__init__.py +11 -0
  264. meutils/apis/together/images.py +80 -0
  265. meutils/apis/translator/__init__.py +9 -0
  266. meutils/apis/translator/deeplx.py +55 -0
  267. meutils/apis/tripo3d/__init__.py +11 -0
  268. meutils/apis/tripo3d/images.py +106 -0
  269. meutils/apis/ts.py +60 -0
  270. meutils/apis/uptime_kuma/__init__.py +11 -0
  271. meutils/apis/uptime_kuma/common.py +56 -0
  272. meutils/apis/uptime_kuma//345/233/275/344/272/247/345/210/206/347/273/204.py +68 -0
  273. meutils/apis/utils.py +73 -0
  274. meutils/apis/videos/__init__.py +11 -0
  275. meutils/apis/videos/sora.py +16 -0
  276. meutils/apis/vidu/__init__.py +9 -0
  277. meutils/apis/vidu/vidu_video.py +256 -0
  278. meutils/apis/voice_clone/__init__.py +10 -0
  279. meutils/apis/voice_clone/fish.py +236 -0
  280. meutils/apis/voice_clone/fish_api.py +16 -0
  281. meutils/apis/web_search.py +31 -0
  282. meutils/apis/yezi.py +97 -0
  283. meutils/async_task/__init__.py +13 -0
  284. meutils/async_task/celery_config.py +106 -0
  285. meutils/async_task/common.py +37 -0
  286. meutils/async_task/demo_create_tasks.py +73 -0
  287. meutils/async_task/tasks/__init__.py +11 -0
  288. meutils/async_task/tasks/_all.py +20 -0
  289. meutils/async_task/tasks/hailuo.py +24 -0
  290. meutils/async_task/tasks/kling.py +30 -0
  291. meutils/async_task/tasks/replicateai.py +24 -0
  292. meutils/async_task/tasks/test.py +124 -0
  293. meutils/async_task/tasks/vidu.py +28 -0
  294. meutils/async_task/utils.py +191 -0
  295. meutils/async_task//351/200/232/347/224/250/350/256/276/350/256/241.py +119 -0
  296. meutils/async_utils/asyncer_.py +37 -0
  297. meutils/async_utils/background.py +68 -0
  298. meutils/async_utils/common.py +136 -16
  299. meutils/async_utils/test.py +47 -0
  300. meutils/cache_utils.py +29 -23
  301. meutils/caches/__init__.py +9 -0
  302. meutils/caches/acache.py +45 -0
  303. meutils/caches/redis_cache.py +63 -0
  304. meutils/clis/check_api.py +66 -0
  305. meutils/clis/cli.py +1 -1
  306. meutils/common.py +56 -17
  307. meutils/config_utils/__init__.py +11 -0
  308. meutils/config_utils/lark_utils/__init__.py +11 -0
  309. meutils/config_utils/lark_utils/common.py +385 -0
  310. meutils/config_utils/lark_utils/demo.py +13 -0
  311. meutils/config_utils/lark_utils/x.py +50 -0
  312. meutils/config_utils/manager.py +108 -0
  313. meutils/crawlers/__init__.py +11 -0
  314. meutils/data/VERSION +1 -1
  315. meutils/data/cowboy-hat-face.webp +0 -0
  316. meutils/data/oneapi/FOOTER.md +7 -0
  317. meutils/data/oneapi/NOTICE.md +138 -0
  318. meutils/data/oneapi/__init__.py +15 -0
  319. meutils/db/orm.py +179 -0
  320. meutils/db/redis_db.py +87 -0
  321. meutils/decorators/cache.py +1 -1
  322. meutils/decorators/common.py +84 -5
  323. meutils/decorators/contextmanagers.py +17 -6
  324. meutils/decorators/fastapi_decorator.py +77 -3
  325. meutils/decorators/polling.py +46 -0
  326. meutils/decorators/retry.py +150 -26
  327. meutils/fastapi_utils/__init__.py +11 -0
  328. meutils/fastapi_utils/exceptions/http_error.py +72 -0
  329. meutils/fastapi_utils/exceptions/validation_error.py +44 -0
  330. meutils/hash_utils.py +9 -4
  331. meutils/hooks/__init__.py +11 -0
  332. meutils/hooks/hook_test.py +174 -0
  333. meutils/hooks/wechat.py +162 -0
  334. meutils/hooks/wechat_channel.py +303 -0
  335. meutils/init/evn.py +1 -1
  336. meutils/io/files_utils.py +236 -0
  337. meutils/io/image.py +146 -15
  338. meutils/io/x.py +75 -0
  339. meutils/llm/__init__.py +10 -0
  340. meutils/llm/check_api.py +109 -0
  341. meutils/llm/check_utils.py +106 -0
  342. meutils/llm/clients.py +38 -0
  343. meutils/llm/completions/__init__.py +11 -0
  344. meutils/llm/completions/agents/__init__.py +11 -0
  345. meutils/llm/completions/agents/file.py +125 -0
  346. meutils/llm/completions/cp.py +112 -0
  347. meutils/llm/completions/delilegal.py +135 -0
  348. meutils/llm/completions/dify.py +81 -0
  349. meutils/llm/completions/kimi.py +47 -0
  350. meutils/llm/completions/modelscope.py +11 -0
  351. meutils/{fileparser/filetype.py → llm/completions/oi.py} +5 -3
  352. meutils/llm/completions/qwenllm.py +56 -0
  353. meutils/llm/completions/rag/__init__.py +11 -0
  354. meutils/llm/completions/rag/fire.py +157 -0
  355. meutils/llm/completions/rag/qwen.py +11 -0
  356. meutils/llm/completions/rag/rag.py +41 -0
  357. meutils/llm/completions/rag.py +38 -0
  358. meutils/llm/completions/tryblend.py +201 -0
  359. meutils/llm/completions/tune.py +284 -0
  360. meutils/llm/completions/x.py +26 -0
  361. meutils/llm/completions/xx.py +61 -0
  362. meutils/llm/completions/yuanbao.py +176 -0
  363. meutils/llm/demo.py +114 -0
  364. meutils/llm/functions/__init__.py +11 -0
  365. meutils/llm/mappers.py +15 -0
  366. meutils/llm/openai_utils/__init__.py +11 -0
  367. meutils/llm/openai_utils/common.py +284 -0
  368. meutils/llm/openai_utils/tool_outputs.py +45 -0
  369. meutils/llm/output_parsers/__init__.py +80 -0
  370. meutils/llm/prompts/__init__.py +244 -0
  371. meutils/llm/prompts/demo.py +155 -0
  372. meutils/llm/prompts/html2image_test.py +19 -0
  373. meutils/llm/utils.py +133 -0
  374. meutils/llm/x.py +75 -0
  375. meutils/notice/feishu.py +40 -9
  376. meutils/notice/wechat.py +5 -7
  377. meutils/np_utils.py +10 -1
  378. meutils/office_automation/pdf.py +6 -1
  379. meutils/oss/__init__.py +9 -0
  380. meutils/oss/minio_oss.py +81 -26
  381. meutils/oss/minio_utils.py +1 -1
  382. meutils/other/__demo.py +6 -4
  383. meutils/pandas_utils/__init__.py +1 -0
  384. meutils/pandas_utils/common.py +31 -0
  385. meutils/pandas_utils/pd_utils.py +10 -6
  386. meutils/parsers/__init__.py +10 -0
  387. meutils/parsers/file_parsers.py +110 -0
  388. meutils/parsers/fileparser/demo.py +41 -0
  389. meutils/parsers/fileparser/filetype.py +41 -0
  390. meutils/pay.py +37 -0
  391. meutils/pipe.py +37 -4
  392. meutils/playwright_utils/common.py +20 -12
  393. meutils/plots/common.py +35 -34
  394. meutils/queues/demo.py +56 -0
  395. meutils/queues/smooth_queue.py +120 -0
  396. meutils/queues/uniform_queue.py +3 -1
  397. meutils/request_utils/__init__.py +26 -2
  398. meutils/request_utils/ark.py +47 -0
  399. meutils/request_utils/crawler.py +34 -5
  400. meutils/request_utils/jwt_utils/__init__.py +11 -0
  401. meutils/request_utils/jwt_utils/common.py +42 -0
  402. meutils/request_utils/volc.py +160 -0
  403. meutils/schemas/__init__.py +0 -1
  404. meutils/schemas/baidu_types.py +70 -0
  405. meutils/schemas/batch_types.py +450 -0
  406. meutils/schemas/celery_types.py +64 -0
  407. meutils/schemas/chatfire_types.py +15 -0
  408. meutils/schemas/chatglm_types.py +197 -0
  409. meutils/schemas/db/__init__.py +11 -0
  410. meutils/schemas/db/oneapi_types.py +117 -0
  411. meutils/schemas/dify_types.py +40 -0
  412. meutils/schemas/embedding.py +31 -0
  413. meutils/schemas/fal_types.py +13 -0
  414. meutils/schemas/fish_types.py +11 -0
  415. meutils/schemas/hailuo_types.py +208 -0
  416. meutils/schemas/haimian_types.py +51 -0
  417. meutils/schemas/idphoto_types.py +43 -0
  418. meutils/schemas/image_types.py +491 -0
  419. meutils/schemas/jimeng_types.py +28 -0
  420. meutils/schemas/jina_types.py +67 -0
  421. meutils/schemas/kimi_types.py +86 -0
  422. meutils/schemas/kling_types.py +235 -0
  423. meutils/schemas/kuaishou_types.py +328 -0
  424. meutils/schemas/luma_types.py +59 -0
  425. meutils/schemas/message_types.py +165 -0
  426. meutils/schemas/message_types_.py +219 -0
  427. meutils/schemas/metaso_types.py +64 -0
  428. meutils/schemas/napkin_types.py +85 -0
  429. meutils/schemas/ocr_types.py +37 -0
  430. meutils/schemas/oneapi/__init__.py +11 -0
  431. meutils/schemas/oneapi/_types.py +49 -0
  432. meutils/schemas/oneapi/common.py +883 -0
  433. meutils/schemas/oneapi/icons.py +30 -0
  434. meutils/schemas/oneapi/model_group_info.py +48 -0
  435. meutils/schemas/oneapi/model_info.py +34 -0
  436. meutils/schemas/oneapi/models.py +26 -0
  437. meutils/schemas/oneapi/x.py +26 -0
  438. meutils/schemas/oneapi//351/207/215/345/256/232/345/220/221.py +132 -0
  439. meutils/schemas/openai_api_protocol.py +411 -0
  440. meutils/schemas/openai_types.py +366 -0
  441. meutils/schemas/pixverse_types.py +88 -0
  442. meutils/schemas/playwright_types.py +57 -0
  443. meutils/schemas/prodia_types.py +19 -0
  444. meutils/schemas/replicate_types.py +112 -0
  445. meutils/schemas/request_types.py +20 -0
  446. meutils/schemas/runwayml_types.py +190 -0
  447. meutils/schemas/siliconflow_types.py +80 -0
  448. meutils/schemas/step_types.py +19 -0
  449. meutils/schemas/suno_types.py +319 -0
  450. meutils/schemas/task_types.py +192 -0
  451. meutils/schemas/translator_types.py +29 -0
  452. meutils/schemas/tripo3d_types.py +57 -0
  453. meutils/schemas/tryblend_types.py +51 -0
  454. meutils/schemas/video_types.py +62 -0
  455. meutils/schemas/vidu_types.py +350 -0
  456. meutils/schemas/wechat_types.py +316 -0
  457. meutils/schemas/yuanbao_types.py +260 -0
  458. meutils/serving/celery/__init__.py +8 -0
  459. meutils/serving/celery/config.py +115 -0
  460. meutils/serving/celery/router.py +4 -6
  461. meutils/serving/celery/tasks.py +6 -4
  462. meutils/serving/celery//351/200/232/347/224/250/350/256/276/350/256/241.py +119 -0
  463. meutils/serving/fastapi/common.py +27 -31
  464. meutils/serving/fastapi/dependencies/__init__.py +0 -1
  465. meutils/serving/fastapi/dependencies/auth.py +55 -2
  466. meutils/serving/fastapi/exceptions/http_error.py +68 -2
  467. meutils/serving/fastapi/exceptions/validation_error.py +18 -2
  468. meutils/serving/fastapi/lifespans.py +73 -0
  469. meutils/serving/fastapi/routers/scheduler.py +12 -0
  470. meutils/serving/fastapi/routers/screenshot.py +47 -0
  471. meutils/serving/fastapi/routers/spider.py +8 -3
  472. meutils/serving/fastapi/routers/task.py +48 -0
  473. meutils/serving/fastapi/utils.py +1 -1
  474. meutils/serving/streamlit/common.py +1 -1
  475. meutils/smooth_utils.py +3 -0
  476. meutils/str_utils/__init__.py +22 -3
  477. meutils/str_utils/json_utils.py +7 -0
  478. meutils/str_utils/regular_expression.py +102 -10
  479. meutils/templates/xx.html +21 -0
  480. meutils/templates/xxx.html +117 -0
  481. meutils/todo.py +12 -0
  482. meutils/tools/token_monitor.py +33 -0
  483. MeUtils-2024.3.18.15.56.48.dist-info/RECORD +0 -543
  484. meutils/ai_audio/asr/subtitle.srt +0 -40
  485. meutils/ai_audio/demo.ipynb +0 -1215
  486. meutils/ai_audio/example.srt +0 -348
  487. meutils/ai_audio/new.srt +0 -179
  488. meutils/ai_audio/subtitles.srt +0 -696
  489. meutils/ai_audio/tts/new.srt +0 -179
  490. meutils/ai_audio//350/247/206/351/242/221/345/220/210/345/271/266.sh +0 -32
  491. meutils/ai_cv/1.jpg +0 -0
  492. meutils/ai_cv/197.jpg +0 -0
  493. meutils/ai_cv/2.jpg +0 -0
  494. meutils/ai_cv/img.png +0 -0
  495. meutils/ai_cv/invoice.jpg +0 -0
  496. meutils/ai_cv/tbl.png +0 -0
  497. meutils/ai_cv/test.png +0 -0
  498. meutils/ann/README.md +0 -33
  499. meutils/ann/README_gensim.md +0 -47
  500. meutils/ann/examples/client.py +0 -59
  501. meutils/ann/examples/demo.py +0 -24
  502. meutils/api/deeplx.py +0 -29
  503. meutils/api/qr.png +0 -0
  504. meutils/clis/README.md +0 -29
  505. meutils/clis/__test.sh +0 -17
  506. meutils/clis/deepseek.txt +0 -8
  507. meutils/clis/deepseek_13003330042.json +0 -1
  508. meutils/clis/deepseek_13003872192.json +0 -1
  509. meutils/clis/deepseek_13852263862.json +0 -1
  510. meutils/clis/deepseek_13913898681.json +0 -1
  511. meutils/clis/deepseek_13962978617.json +0 -1
  512. meutils/clis/deepseek_15251801790.json +0 -1
  513. meutils/clis/deepseek_15720826383.json +0 -1
  514. meutils/clis/deepseek_18395563611.json +0 -1
  515. meutils/clis/deepseek_313303303@qq.com.json +0 -1
  516. meutils/clis/kimi_state.json +0 -1
  517. meutils/cmds/README.md +0 -55
  518. meutils/coding/__init__.py +0 -11
  519. meutils/coding/find132.py +0 -40
  520. meutils/db/README.md +0 -51
  521. meutils/decorators/README.md +0 -17
  522. meutils/docarray_utils/demo_es.py +0 -34
  523. meutils/docarray_utils/demo_hnsw.py +0 -55
  524. meutils/docarray_utils/in_memory.py +0 -38
  525. meutils/docarray_utils//346/224/271/351/200/240/344/270/213hnsw.py +0 -43
  526. meutils/io/file.py +0 -20
  527. meutils/io/img.png +0 -0
  528. meutils/io/x.yml +0 -1
  529. meutils/notice/img.png +0 -0
  530. meutils/notice/todo.md +0 -10
  531. 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
  532. meutils/playwright_utils/__test.sh +0 -2
  533. meutils/playwright_utils/kimi1_cookies.json +0 -1
  534. meutils/playwright_utils/kimi2_cookies.json +0 -1
  535. meutils/playwright_utils/kimi_cookies.json +0 -93
  536. meutils/serving/README.md +0 -1
  537. meutils/serving/celery/_run.sh +0 -10
  538. meutils/serving/gui/run.sh +0 -9
  539. meutils/serving/jina/__demo/client.py +0 -42
  540. meutils/serving/jina/__demo/flow.svg +0 -1
  541. meutils/serving/jina/__demo/s.py +0 -34
  542. meutils/serving/jina/__demo/s2.py +0 -37
  543. meutils/serving/jina/__demo/server.py +0 -83
  544. meutils/serving/jina/__demo/test.py +0 -40
  545. meutils/serving/jina/executors/SentenceEncoder.py +0 -62
  546. meutils/serving/jina/executors/SentenceEncoder_.py +0 -63
  547. meutils/serving/jina/executors/__init__.py +0 -46
  548. meutils/serving/jina/executors/base.py +0 -40
  549. meutils/serving/jina/nlp_serving/__init__.py +0 -11
  550. meutils/serving/jina/nlp_serving/word_segmentation.py +0 -40
  551. meutils/serving/streamlit/conf.yaml +0 -5
  552. meutils/serving/streamlit/ocr.png +0 -0
  553. meutils/serving/streamlit/run.sh +0 -17
  554. meutils/serving/webui/.streamlit/_config.toml +0 -186
  555. meutils/serving/webui/.streamlit/config.toml +0 -26
  556. meutils/serving/webui/pages/_1_/345/210/206/350/257/215.py +0 -56
  557. 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
  558. meutils/serving/webui/pages/_3_/346/226/207/346/234/254/345/214/271/351/205/215.py +0 -64
  559. meutils/serving/webui/run.sh +0 -9
  560. meutils/spark/__init__.py +0 -26
  561. meutils/tools/monitor.yml +0 -29
  562. {MeUtils-2024.3.18.15.56.48.dist-info → MeUtils-2025.1.17.17.55.21.dist-info}/LICENSE +0 -0
  563. {MeUtils-2024.3.18.15.56.48.dist-info → MeUtils-2025.1.17.17.55.21.dist-info}/top_level.txt +0 -0
  564. {meutils → examples}/comp_utils/__init__.py +0 -0
  565. {meutils → examples}/comp_utils/reverse_metric.py +0 -0
  566. /meutils/{fileparser/README.md → fastapi_utils/exceptions/__init__.py} +0 -0
  567. /meutils/{fileparser → parsers/fileparser}/PDF/346/212/275/345/217/226.py" +0 -0
  568. /meutils/{fileparser → parsers/fileparser}/__init__.py +0 -0
  569. /meutils/{fileparser → parsers/fileparser}/common.py +0 -0
  570. /meutils/{fileparser → parsers/fileparser}/filetype/__init__.py +0 -0
  571. /meutils/{fileparser → parsers/fileparser}/filetype/__main__.py +0 -0
  572. /meutils/{fileparser → parsers/fileparser}/filetype/filetype.py +0 -0
  573. /meutils/{fileparser → parsers/fileparser}/filetype/helpers.py +0 -0
  574. /meutils/{fileparser → parsers/fileparser}/filetype/match.py +0 -0
  575. /meutils/{fileparser → parsers/fileparser}/filetype/types/__init__.py +0 -0
  576. /meutils/{fileparser → parsers/fileparser}/filetype/types/application.py +0 -0
  577. /meutils/{fileparser → parsers/fileparser}/filetype/types/archive.py +0 -0
  578. /meutils/{fileparser → parsers/fileparser}/filetype/types/audio.py +0 -0
  579. /meutils/{fileparser → parsers/fileparser}/filetype/types/base.py +0 -0
  580. /meutils/{fileparser → parsers/fileparser}/filetype/types/document.py +0 -0
  581. /meutils/{fileparser → parsers/fileparser}/filetype/types/font.py +0 -0
  582. /meutils/{fileparser → parsers/fileparser}/filetype/types/image.py +0 -0
  583. /meutils/{fileparser → parsers/fileparser}/filetype/types/isobmff.py +0 -0
  584. /meutils/{fileparser → parsers/fileparser}/filetype/types/video.py +0 -0
  585. /meutils/{fileparser → parsers/fileparser}/filetype/utils.py +0 -0
  586. /meutils/{fileparser → parsers/fileparser}/pdf.py +0 -0
  587. /meutils/{fileparser → parsers/fileparser}//350/241/250/346/240/274/346/212/275/345/217/226.py" +0 -0
@@ -8,8 +8,61 @@
8
8
  # @Software : PyCharm
9
9
  # @Description :
10
10
 
11
- from meutils.pipe import *
11
+ import numpy as np
12
+ from typing import Optional, Union
12
13
 
13
14
  from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
15
+ from fastapi import Depends, HTTPException, status
14
16
 
15
- get_bearer_token = HTTPBearer()
17
+ http_bearer = HTTPBearer()
18
+
19
+
20
+ # 定义获取token的函数
21
+
22
+ async def get_bearer_token(
23
+ auth: Optional[HTTPAuthorizationCredentials] = Depends(http_bearer)
24
+ ) -> Optional[str]:
25
+ """
26
+ 获取Bearer token
27
+ :param auth: HTTP认证凭证
28
+ :return: token字符串
29
+ """
30
+ if auth is None:
31
+ return None
32
+
33
+ token = auth.credentials
34
+ if token.startswith('redis:'): # 初始化吧,太长?
35
+ pass
36
+ if ',' in token: # 初始化redis
37
+ pass
38
+ elif ',' in token: # 分隔符
39
+ token = np.random.choice(token.split(','))
40
+
41
+ return token
42
+
43
+
44
+ # async def get_next_token(redis_key):
45
+ # """轮询"""
46
+ # if api_key := await redis_aclient.lpop(redis_key):
47
+ # await redis_aclient.rpush(redis_key, api_key)
48
+ # return api_key
49
+
50
+
51
+ async def get_bearer_token_for_oneapi(
52
+ auth: Optional[HTTPAuthorizationCredentials] = Depends(http_bearer)
53
+ ) -> Optional[str]:
54
+ """
55
+ # todo: oneapi userinfo apikey info
56
+ """
57
+ if auth is None:
58
+ return None
59
+
60
+ token = auth.credentials
61
+
62
+ return token
63
+
64
+
65
+ if __name__ == '__main__':
66
+ from meutils.pipe import *
67
+
68
+ arun(get_bearer_token(HTTPAuthorizationCredentials(scheme="Bearer", credentials="123")))
@@ -1,11 +1,35 @@
1
- from fastapi import HTTPException, status
1
+ import json
2
+ import traceback
3
+ from functools import partial
4
+ from httpx import HTTPStatusError
5
+ from openai import APIStatusError
6
+
7
+ from fastapi import status
2
8
  from starlette.requests import Request
3
9
  from starlette.responses import JSONResponse
4
10
 
11
+ from fastapi.exceptions import RequestValidationError, HTTPException
12
+
13
+ from meutils.notice.feishu import send_message as _send_message
14
+
15
+ send_message = partial(
16
+ _send_message,
17
+ title=__name__,
18
+ url="https://open.feishu.cn/open-apis/bot/v2/hook/d1c7b67d-b0f8-4067-a2f5-109f20eeb696"
19
+ )
20
+
5
21
 
6
22
  async def http_error_handler(_: Request, exc: HTTPException) -> JSONResponse:
23
+ # print(exc)
24
+ content = {
25
+ "error":
26
+ {
27
+ "message": f"{exc.detail}",
28
+ "type": "http-error",
29
+ }
30
+ }
7
31
  return JSONResponse(
8
- {"errors": [exc.detail]},
32
+ content=content,
9
33
  status_code=exc.status_code
10
34
  )
11
35
 
@@ -15,3 +39,45 @@ async def general_exception_handler(request: Request, exc: Exception):
15
39
  content={"message": str(exc)},
16
40
  status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
17
41
  )
42
+
43
+
44
+ async def chatfire_api_exception_handler(request: Request, exc: Exception):
45
+ content = {
46
+ "error":
47
+ {
48
+ "message": f"{exc}",
49
+ "type": "cf-api-error",
50
+ },
51
+
52
+ "code": status.HTTP_500_INTERNAL_SERVER_ERROR
53
+ }
54
+
55
+ # 默认值
56
+ reps = None
57
+ request_json = {"body": await request.body()}
58
+ if isinstance(exc, (HTTPStatusError, APIStatusError)):
59
+ status_code = exc.response.status_code or 500
60
+
61
+ content['code'] = status_code
62
+ content['error']['message'] = f"{exc.response.text}"
63
+
64
+ reps = JSONResponse(
65
+ content=content,
66
+ status_code=status_code,
67
+ )
68
+
69
+ # send_message
70
+ content_detail = f"{traceback.format_exc()}"
71
+ if any(code in content_detail for code in {'451', }):
72
+ content_detail = ""
73
+
74
+ send_message([request_json, content, content_detail])
75
+
76
+ return reps or JSONResponse(
77
+ content=content,
78
+ status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
79
+ )
80
+
81
+
82
+ if __name__ == '__main__':
83
+ pass
@@ -1,5 +1,6 @@
1
1
  from typing import Union
2
2
 
3
+ from fastapi import status
3
4
  from fastapi.exceptions import RequestValidationError
4
5
  from fastapi.openapi.constants import REF_PREFIX
5
6
  from fastapi.openapi.utils import validation_error_response_definition
@@ -10,8 +11,8 @@ from starlette.status import HTTP_422_UNPROCESSABLE_ENTITY
10
11
 
11
12
 
12
13
  async def http422_error_handler(
13
- _: Request,
14
- exc: Union[RequestValidationError, ValidationError],
14
+ _: Request,
15
+ exc: Union[RequestValidationError, ValidationError],
15
16
  ) -> JSONResponse:
16
17
  return JSONResponse(
17
18
  {"errors": exc.errors()},
@@ -26,3 +27,18 @@ validation_error_response_definition["properties"] = {
26
27
  "items": {"$ref": "{0}ValidationError".format(REF_PREFIX)},
27
28
  },
28
29
  }
30
+
31
+
32
+ async def validation_exception_handler(_: Request, exc: RequestValidationError) -> JSONResponse:
33
+ # print(exc)
34
+ content = {
35
+ "error":
36
+ {
37
+ "message": f"{exc}",
38
+ "type": "RequestValidationError",
39
+ }
40
+ }
41
+ return JSONResponse(
42
+ content=content,
43
+ status_code=status.HTTP_400_BAD_REQUEST
44
+ )
@@ -0,0 +1,73 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+ # @Project : AI. @by PyCharm
4
+ # @File : lifespans
5
+ # @Time : 2024/12/13 10:50
6
+ # @Author : betterme
7
+ # @WeChat : meutils
8
+ # @Software : PyCharm
9
+ # @Description :
10
+ from contextlib import asynccontextmanager
11
+
12
+ from meutils.pipe import *
13
+ from meutils.config_utils.manager import ConfigManager
14
+
15
+
16
+ class Resources(BaseModel):
17
+ config_manager: Optional[ConfigManager] = None
18
+
19
+ class Config:
20
+ # 允许额外字段,增加灵活性
21
+ extra = 'allow'
22
+ arbitrary_types_allowed = True
23
+
24
+
25
+ # def fake_answer_to_everything_ml_model(x: float):
26
+ # return x * 42
27
+ #
28
+ #
29
+ # ml_models = {}
30
+ #
31
+ #
32
+ # @asynccontextmanager
33
+ # async def lifespan(app):
34
+ # # Load the ML model
35
+ # ml_models["answer_to_everything"] = fake_answer_to_everything_ml_model
36
+ # yield
37
+ # # Clean up the ML models and release the resources
38
+ # ml_models.clear()
39
+
40
+
41
+ resources = Resources()
42
+
43
+
44
+ @asynccontextmanager
45
+ async def nacos_lifespan(app):
46
+ import gc
47
+
48
+ logger.debug("Init lifespans")
49
+
50
+ config_manager = ConfigManager("test", "testdata")
51
+
52
+ resources.config_manager = config_manager
53
+
54
+ yield
55
+
56
+ # release the resources
57
+ logger.debug("Release the resources")
58
+ del config_manager
59
+ gc.collect()
60
+
61
+
62
+ if __name__ == '__main__':
63
+ from fastapi import FastAPI
64
+
65
+ app = FastAPI(lifespan=lifespan)
66
+
67
+ app.state.config_manager = ConfigManager("test", "testdata")
68
+
69
+
70
+ @app.get("/predict")
71
+ async def predict(x: float):
72
+ result = ml_models["answer_to_everything"](x)
73
+ return {"result": result}
@@ -49,3 +49,15 @@ async def start_scheduler():
49
49
  # scheduler = Scheduler(timezone="Asia/Shanghai")
50
50
  # scheduler.add_job(tick, 'interval', seconds=3)
51
51
  # scheduler.start()
52
+
53
+
54
+ # from meutils.pipe import *
55
+ # from meutils.serving.fastapi import App
56
+ # from meutils.serving.fastapi.routers import scheduler
57
+ #
58
+ # if __name__ == '__main__':
59
+ # app = App()
60
+ # scheduler.scheduler.add_job(lambda: print("hello"), 'interval', seconds=3)
61
+ #
62
+ # app.include_router(scheduler.router)
63
+ # app.run(port=8899)
@@ -0,0 +1,47 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+ # @Project : AI. @by PyCharm
4
+ # @File : screenshot
5
+ # @Time : 2024/9/18 16:02
6
+ # @Author : betterme
7
+ # @WeChat : meutils
8
+ # @Software : PyCharm
9
+ # @Description :
10
+
11
+ from meutils.pipe import *
12
+ from meutils.io.files_utils import to_url
13
+ from meutils.playwright_utils import get_new_page
14
+ from meutils.schemas.playwright_types import ScreenshotRequest
15
+
16
+ from fastapi import APIRouter, File, UploadFile, Query, Form, Response, Request
17
+
18
+ router = APIRouter()
19
+
20
+ HTML_PARSER = re.compile(r'```html(.*?)```', re.DOTALL)
21
+
22
+
23
+ @router.post("/screenshot") # todo: 多个url
24
+ async def capture_screenshot(
25
+ request: ScreenshotRequest,
26
+ ):
27
+ htmls = HTML_PARSER.findall(request.html)
28
+ if htmls:
29
+ request.html = htmls[0]
30
+
31
+ page = await get_new_page()
32
+ await page.set_content(request.html)
33
+ await page.set_viewport_size({"width": request.width, "height": request.height})
34
+
35
+ with tempfile.NamedTemporaryFile(suffix='.png') as file:
36
+ await page.screenshot(path=file.name)
37
+ url = await to_url(file.name)
38
+ page.close()
39
+ return {"url": url}
40
+
41
+
42
+ if __name__ == '__main__':
43
+ from meutils.serving.fastapi import App
44
+
45
+ app = App()
46
+ app.include_router(router)
47
+ app.run(port=39666)
@@ -17,7 +17,7 @@ router = APIRouter()
17
17
 
18
18
 
19
19
  @router.get("/playwright") # todo: 多个url
20
- @alru_cache(maxsize=10240)
20
+ @alru_cache(maxsize=10240, ttl=3 * 24 * 3600)
21
21
  async def get_content(
22
22
  url: str,
23
23
  # page=Depends(get_new_page) # Depends get_new_page 里面的参数也会暴露出来
@@ -31,8 +31,13 @@ async def get_content(
31
31
  content = await page.inner_text('//*[@id="page-content"]') # 使用page.query_selector_all获取a节点列表
32
32
  else:
33
33
  # todo: xpath
34
+ # wait
35
+ await page.wait_for_load_state(state='load')
36
+ await page.wait_for_load_state(state='networkidle')
37
+ await page.wait_for_load_state(state='domcontentloaded')
38
+ await page.wait_for_selector('body')
39
+
34
40
  content = await page.inner_text('body')
35
- # page.wait_for_load_state("networkidle")
36
41
 
37
42
  return {"content": content}
38
43
 
@@ -42,4 +47,4 @@ if __name__ == '__main__':
42
47
 
43
48
  app = App()
44
49
  app.include_router(router)
45
- app.run()
50
+ app.run(port=39666)
@@ -0,0 +1,48 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+ # @Project : AI. @by PyCharm
4
+ # @File : task
5
+ # @Time : 2024/5/9 15:41
6
+ # @Author : betterme
7
+ # @WeChat : meutils
8
+ # @Software : PyCharm
9
+ # @Description :
10
+
11
+ from meutils.pipe import *
12
+ from meutils.db.redis_db import redis_aclient
13
+ from fastapi import status
14
+ from fastapi import APIRouter, File, UploadFile, Query, Form, Response, Request, FastAPI
15
+ from fastapi.responses import JSONResponse
16
+
17
+ router = APIRouter()
18
+
19
+
20
+ @router.get("/redis/{task_id}")
21
+ @alru_cache(ttl=60) # 缓存
22
+ async def get_task_from_redis(task_id: str):
23
+ task_info = await redis_aclient.get(task_id)
24
+ return task_info
25
+
26
+
27
+ class RedisRequest(BaseModel):
28
+ task_id: str
29
+ task_info: str
30
+ ttl: Optional[int] = None
31
+
32
+
33
+ @router.post("/redis")
34
+ async def set_task_for_redis(requst: RedisRequest):
35
+ await redis_aclient.set(requst.task_id, requst.task_info, ex=requst.ttl)
36
+ # return JSONResponse(content="", status_code=status.HTTP_200_OK)
37
+
38
+
39
+
40
+ redis_aclient.response_callbacks
41
+
42
+
43
+ if __name__ == '__main__':
44
+ from meutils.serving.fastapi import App
45
+
46
+ app = App()
47
+ app.include_router(router)
48
+ app.run()
@@ -78,7 +78,7 @@ def limit(limit_value='3/second', error_message: Optional[str] = None, **kwargs)
78
78
 
79
79
 
80
80
  def check_api_key(auth: HTTPAuthorizationCredentials):
81
- api_key = auth and auth.credentials or None
81
+ api_key = auth
82
82
  if api_key is None:
83
83
  detail = {
84
84
  "error": {
@@ -232,7 +232,7 @@ def st_chat_message(
232
232
 
233
233
  with st.chat_message(name=message.name, avatar=message.avatar):
234
234
  written_content = write(message.generator, unsafe_allow_html=unsafe_allow_html, **kwargs)
235
- message.generator = written_content | xfilter | xjoin('')
235
+ message.generator = written_content | xfilter(lambda x: x is None) | xjoin('')
236
236
 
237
237
  if bhook: bhook()
238
238
 
meutils/smooth_utils.py CHANGED
@@ -59,3 +59,6 @@ def walson_ctr(num_click, num_pv, z=1.96):
59
59
  return ctr
60
60
 
61
61
 
62
+ if __name__ == '__main__':
63
+ for i in range(10): # SLEEP
64
+ print(exponential_decay(i, 10, 10, 3))
@@ -33,6 +33,9 @@ def remove_punctuation(sentence: str, punctuation='!"#$%&\'()*+,-./:;<=>?@[\\]^_
33
33
 
34
34
  def chinese_convert(s, config='t2s'):
35
35
  """https://github.com/BYVoid/OpenCC
36
+ pip install opencc
37
+ pip install opencc-python-reimplemented
38
+
36
39
  s2t.json Simplified Chinese to Traditional Chinese 簡體到繁體
37
40
  t2s.json Traditional Chinese to Simplified Chinese 繁體到簡體
38
41
  s2tw.json Simplified Chinese to Traditional Chinese (Taiwan Standard) 簡體到臺灣正體
@@ -49,7 +52,7 @@ def chinese_convert(s, config='t2s'):
49
52
  tw2t.json Traditional Chinese (Taiwan standard) to Traditional Chinese 臺灣正體到繁體(OpenCC 標準)
50
53
  @return:
51
54
  """
52
- import opencc # pip install opencc opencc-python-reimplemented
55
+ opencc = try_import("opencc", pip_name="opencc-python-reimplemented")
53
56
  converter = opencc.OpenCC(config)
54
57
  return converter.convert(s)
55
58
 
@@ -89,7 +92,7 @@ def half2all(ustring):
89
92
 
90
93
  def all2half(all_string):
91
94
  """全角转半角"""
92
- from idna import unichr
95
+ from idna import chr
93
96
 
94
97
  half_string = ""
95
98
  for char in all_string:
@@ -179,6 +182,11 @@ class Encrypt(object):
179
182
  return b.decode("utf-8")
180
183
 
181
184
 
185
+ def unicode_normalize(s):
186
+ import unicodedata
187
+ return unicodedata.normalize('NFKC', s)
188
+
189
+
182
190
  if __name__ == '__main__':
183
191
  # print(str_replace('abcd', {'a': '8', 'd': '88'}))
184
192
  # print(unquote())
@@ -188,4 +196,15 @@ if __name__ == '__main__':
188
196
 
189
197
  # print(json_loads("{1: 1}"))
190
198
 
191
- print(Encrypt().encrypt('123'*100))
199
+ # print(Encrypt().encrypt('123' * 100))
200
+
201
+ # print(query_params2json("act=get&uid=134597&vkey=07A1D82FDDE1E96DB5CEF4EF12C8125F&num=1&time=30&plat=1&re=1&type=0&so=1&ow=1&spl=1&addr=&db=1"))
202
+
203
+ print(half2all('⽉月'))
204
+ print(all2half('⽉月'))
205
+
206
+ # import chardet
207
+ #
208
+ # def detect_encoding(byte_content):
209
+ # result = chardet.detect(byte_content)
210
+ # return result['encoding']
@@ -7,6 +7,9 @@
7
7
  # @WeChat : 313303303
8
8
  # @Software : PyCharm
9
9
  # @Description : pd.io.json.json_normalize
10
+ import jsonpath
11
+
12
+ # json https://blog.csdn.net/freeking101/article/details/103048514
10
13
  # https://github.com/ijl/orjson#quickstart
11
14
  # https://jmespath.org/tutorial.html
12
15
  # https://goessner.net/articles/JsonPath/
@@ -41,3 +44,7 @@ def json_loads(s):
41
44
  logger.warning(e)
42
45
 
43
46
  return eval(s)
47
+
48
+
49
+ if __name__ == '__main__':
50
+ print(jsonpath.jsonpath({"a": 1}, expr='$.a'))
@@ -6,16 +6,41 @@
6
6
  # @Author : yuanjie
7
7
  # @WeChat : meutils
8
8
  # @Software : PyCharm
9
- # @Description :
9
+ # @Description :
10
+ import json
10
11
 
11
12
  from meutils.pipe import *
13
+ from urllib.parse import unquote, unquote_plus
12
14
 
13
15
  zh = re.compile('[a-zA-Z\u4e00-\u9fa5]+') # 中文 + 字母
14
16
  nozh = re.compile('[^a-zA-Z\u4e00-\u9fa5]+') # 中文 + 字母
15
17
 
18
+ HTML_PARSER = re.compile(r'```html(.*?)```', re.DOTALL)
19
+
16
20
 
17
21
  # re.sub(r'=(.+)', r'=123','s=xxxxx')
18
22
 
23
+ @lru_cache()
24
+ def remove_date_suffix(filename):
25
+ """
26
+ # 测试示例
27
+ filenames = [
28
+ "claude-3-5-haiku-20241022",
29
+ "o1-mini-2024-09-12",
30
+ "gpt-3.5-turbo-0125"
31
+ ]
32
+
33
+ # 输出结果
34
+ for fname in filenames:
35
+ print(remove_date_suffix(fname))
36
+ :param filename:
37
+ :return:
38
+ """
39
+ # 匹配日期格式(YYYYMMDD 或 YYYY-MM-DD)
40
+ pattern = r'(-\d{8}|-\d{4}-\d{2}-\d{2}|-\d+)$'
41
+ # 使用正则表达式替换日期后缀
42
+ return re.sub(pattern, '', filename)
43
+
19
44
 
20
45
  def get_parse_and_index(text, pattern):
21
46
  """
@@ -33,17 +58,58 @@ def get_parse_and_index(text, pattern):
33
58
  yield match.start(), match.end(), match.group()
34
59
 
35
60
 
36
- @lru_cache
37
- def parse_url(text: str):
61
+ @lru_cache()
62
+ def parse_url(text: str, for_image=False):
38
63
  # url_pattern = r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+'
39
64
  url_pattern = r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+|#]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+'
40
- # url_pattern = 'https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+'
41
- url = re.findall(url_pattern, str(text))
42
65
 
43
- return url
66
+ # url_pattern = r"((https?|ftp|www\\.)?:\\/\\/)?([a-zA-Z0-9.-]+\\.[a-zA-Z]{2,})(:[0-9]+)?(\\/[^\\s]*)?"
67
+
68
+ if for_image:
69
+ text = unquote_plus(text)
70
+ # suffix = [
71
+ # ".jpg",
72
+ # ".jpeg",
73
+ # ".png",
74
+ # ".gif",
75
+ # ".bmp",
76
+ # ".tiff",
77
+ # ".psd",
78
+ # ".ai",
79
+ # ".svg",
80
+ # ".webp",
81
+ # ".ico",
82
+ # ".raw",
83
+ # ".dng"
84
+ # ]
85
+ # url_pattern = r'https?://[\w\-\.]+/\S+\.(?:png|jpg|jpeg|gif)'
86
+ url_pattern = r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[#]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+\.(?:jpg|jpeg|png|gif|svg|webp)'
87
+
88
+ urls = re.findall(url_pattern, text)
89
+
90
+ valid_urls = []
91
+ for url in urls:
92
+ url = url.strip(r"\n")
93
+ valid_urls.append(url)
94
+
95
+ return valid_urls
96
+
97
+
98
+ def parse_url_from_json():
99
+ pass
44
100
 
45
101
 
46
102
  if __name__ == '__main__':
103
+ # from urllib.parse import urlparse
104
+ #
105
+ #
106
+ # def is_valid_url(url):
107
+ # try:
108
+ # result = urlparse(url)
109
+ # return all([result.scheme, result.netloc])
110
+ # except:
111
+ # return False
112
+
47
113
  text = """7个正规url
48
114
  这是一段包含URL的文本,https://www.google.com 是一个URL,另一个URL是http://www.baidu.com
49
115
  解读这个文本https://www.url1.com
@@ -51,12 +117,38 @@ if __name__ == '__main__':
51
117
  http://www.url2.com 解读这个文本
52
118
 
53
119
  https://www.url2.com解读这个文本
54
-
120
+
55
121
  总结 waptianqi.2345.com/wea_history/58238.html
56
-
122
+
57
123
  总结 https://waptianqi.2345.com/wea_history/58238.htm
124
+ 解释下这张照片 https://img-home.csdnimg.cn/images/20201124032511.png
125
+ 解释下这张https://img-home.csdnimg.cn/images/x.png
126
+
127
+ img-home.csdnimg.cn/images/20201124032511.png
128
+
129
+
130
+ https://oss.ffire.cc/files/百炼系列手机产品介绍.docx
131
+
132
+ https://mj101-1317487292.cos.ap-shanghai.myqcloud.com/ai/test.pdf\n\n文档里说了什么?
133
+
134
+
135
+ 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 这个文件讲了什么?
136
+
58
137
  """
138
+ # 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 正则匹配会卡死
139
+ # from urllib3.util import parse_url
140
+ # text = "@firebot /换衣 https://oss.ffire.cc/files/try-on.png"
141
+ # text = "@firebot /换衣 https://oss.ffire.cc/files/try-on.pn"
142
+
143
+ # print(parse_url(text))
144
+ # print(parse_url(text, for_image=True))
145
+ print(parse_url(text, for_image=False))
146
+
147
+ d = {"url": "https://mj101-1317487292.cos.ap-shanghai.myqcloud.com/ai/test.pdf\n\n总结下"}
148
+ print(parse_url(str(d)))
149
+
150
+ print('https://mj101-1317487292.cos.ap-shanghai.myqcloud.com/ai/test.pdf\\n\\n'.strip(r"\n"))
59
151
 
60
- print(parse_url(text))
152
+ # print(parse_url("http://154.3.0.117:39666/docs#/default/get_content_preview_spider_playwright_get"))
61
153
 
62
- print(parse_url("http://154.3.0.117:39666/docs#/default/get_content_preview_spider_playwright_get"))
154
+ # print(parse_url(text, True))
@@ -0,0 +1,21 @@
1
+ <style> h1 {
2
+ text-align: center;
3
+ font-size: 24px;
4
+ margin-bottom: 10px;
5
+ }
6
+
7
+ table {
8
+ border-collapse: collapse;
9
+ width: 100%;
10
+ }
11
+
12
+ th, td {
13
+ border: 1px solid black;
14
+ padding: 8px;
15
+ text-align: center;
16
+ }
17
+
18
+ th {
19
+ background-color: #f2f2f2;
20
+ } </style>
21
+ <head><title>2023年胡润百富榜</title></head><h1>2023年胡润百富榜</h1>