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.
- {MeUtils-2024.3.4.13.4.45.dist-info → MeUtils-2025.1.16.17.15.52.dist-info}/METADATA +38 -32
- MeUtils-2025.1.16.17.15.52.dist-info/RECORD +864 -0
- {MeUtils-2024.3.4.13.4.45.dist-info → MeUtils-2025.1.16.17.15.52.dist-info}/WHEEL +1 -1
- {MeUtils-2024.3.4.13.4.45.dist-info → MeUtils-2025.1.16.17.15.52.dist-info}/entry_points.txt +1 -0
- apps/spider.py +24 -8
- examples/_openaisdk/4v.py +110 -0
- examples/_openaisdk/__init__.py +11 -0
- examples/_openaisdk/baichuan.py +38 -0
- examples/_openaisdk/bpo.py +138 -0
- examples/_openaisdk/chat_latex.py +95 -0
- examples/_openaisdk/chattts.py +85 -0
- examples/_openaisdk/copilot.py +48 -0
- examples/_openaisdk/dalle3.py +48 -0
- examples/_openaisdk/deeplx.py +31 -0
- examples/_openaisdk/demo.py +77 -0
- examples/_openaisdk/embeddings.py +34 -0
- examples/_openaisdk/gpt4all.py +69 -0
- examples/_openaisdk/gpt_fc.py +23 -0
- examples/_openaisdk/gr_vl.py +46 -0
- examples/_openaisdk/json_mode.py +12 -0
- examples/_openaisdk/kimi.py +91 -0
- examples/_openaisdk/kimi_qa.py +57 -0
- examples/_openaisdk/minimax.py +75 -0
- examples/_openaisdk/open_router.py +48 -0
- examples/_openaisdk/openai_aiplus.py +54 -0
- examples/_openaisdk/openai_audio.py +20 -0
- examples/_openaisdk/openai_baichuan.py +59 -0
- examples/_openaisdk/openai_cache.py +37 -0
- examples/_openaisdk/openai_chatfire.py +228 -0
- examples/_openaisdk/openai_chatfire_all.py +166 -0
- examples/_openaisdk/openai_deepinfra.py +55 -0
- examples/_openaisdk/openai_deepseek.py +29 -0
- examples/_openaisdk/openai_doubao.py +43 -0
- examples/_openaisdk/openai_embeddings.py +36 -0
- examples/_openaisdk/openai_files.py +57 -0
- examples/_openaisdk/openai_gitee.py +33 -0
- examples/_openaisdk/openai_god.py +45 -0
- examples/_openaisdk/openai_groq.py +240 -0
- examples/_openaisdk/openai_images.py +203 -0
- examples/_openaisdk/openai_json.py +78 -0
- examples/_openaisdk/openai_lingyi.py +59 -0
- examples/_openaisdk/openai_modelscope.py +54 -0
- examples/_openaisdk/openai_moon.py +55 -0
- examples/_openaisdk/openai_oi.py +61 -0
- examples/_openaisdk/openai_ppu.py +47 -0
- examples/_openaisdk/openai_qwen.py +58 -0
- examples/_openaisdk/openai_search.py +42 -0
- examples/_openaisdk/openai_sensenova.py +81 -0
- examples/_openaisdk/openai_siliconflow.py +52 -0
- examples/_openaisdk/openai_step.py +45 -0
- examples/_openaisdk/openai_test.py +66 -0
- examples/_openaisdk/openai_together.py +57 -0
- examples/_openaisdk/openai_tune.py +38 -0
- examples/_openaisdk/openai_zhipu.py +59 -0
- examples/_openaisdk/ppu.py +28 -0
- examples/_openaisdk/rag.py +54 -0
- examples/_openaisdk/rag_.py +26 -0
- examples/_openaisdk/test.py +52 -0
- examples/_openaisdk/x.py +32 -0
- examples/_openaisdk/xx.py +29 -0
- examples/_openaisdk/zhipu_files.py +47 -0
- examples/_openaisdk/zhipu_/346/231/272/350/203/275/344/275/223.py +45 -0
- examples/_openaisdk//345/205/234/345/272/225/346/265/213/350/257/225.py +50 -0
- examples/_openaisdk//345/244/232/346/250/241/346/200/201/346/265/213/350/257/225.py +76 -0
- examples/_openaisdk//345/244/232/346/250/241/346/200/201/346/265/213/350/257/225_.py +56 -0
- examples/_openaisdk//346/226/207/344/273/266/351/227/256/347/255/224.py +36 -0
- examples/_openaisdk//346/226/207/346/241/243/350/247/243/346/236/220.py +34 -0
- examples/_openaisdk//346/250/241/345/236/213/346/265/213/350/257/225.py +53 -0
- examples/_openaisdk//351/230/277/351/207/214.py +80 -0
- {meutils/serving/jina/__demo → examples/ann}/__init__.py +1 -1
- examples/ann/main.py +31 -0
- examples/apis/kl.py +28 -0
- examples/apis/x.py +17 -0
- examples/apis/xx.py +17 -0
- examples/arq_demo/demo.py +3 -0
- examples/backgroundtasks.py +25 -0
- examples/bserver.py +513 -21
- examples/cache_demo/HermesCache_demo.py +81 -0
- examples/cache_demo/acacge.py +26 -0
- examples/cache_demo/x.py +31 -0
- {meutils/docarray_utils → examples/caches}/__init__.py +1 -1
- examples/caches/llmcache.py +18 -0
- examples/celery_demo/product_task.py +2 -0
- examples/demo.py +17 -1
- examples/fastapi_caching.py +59 -0
- {meutils/dependencies → examples/gr}/__init__.py +1 -1
- examples/gr/d.py +22 -0
- examples/gr/demo.py +30 -0
- examples/ip2/345/234/260/345/214/272.py +16 -0
- examples/jinja2_demo/j2_demo.py +20 -1
- examples/json/346/240/207/345/207/206/345/214/226.py +54 -0
- examples/md.py +29 -0
- {meutils/serving/jina → examples/nesc}/__init__.py +1 -1
- examples/nesc/main.py +76 -0
- examples/orm/mysql_orm.py +113 -0
- examples/orm/sql_creater.py +57 -0
- examples/orm/sqlm.py +134 -0
- examples/rq_demo/fns.py +18 -0
- examples/rq_demo/redis/351/230/237/345/210/227.py +14 -7
- examples/rq_demo/redis/351/230/237/345/210/227_add_chatfire.py +30 -0
- examples/size_map.py +43 -0
- examples/test.py +59 -0
- examples/webs/__init__.py +11 -0
- examples/webs/main.py +34 -0
- examples/x.py +13 -0
- examples//345/216/273/346/260/264/345/215/260.py +20 -0
- examples//346/226/207/346/241/243/346/231/272/350/203/275/__init__.py +11 -0
- meutils/_utils.py +15 -6
- meutils/ai_audio/asr/__init__.py +3 -2
- meutils/ai_audio/asr/cf_asr.py +53 -0
- meutils/ai_audio/asr/de.py +11 -0
- meutils/ai_audio/asr/fast_asr.py +15 -7
- meutils/ai_audio/asr/openai_asr.py +83 -6
- meutils/ai_audio/fast_asr.py +8 -4
- meutils/ai_audio/tts/EdgeTTS.py +33 -7
- meutils/ai_audio/tts/openai_tts.py +24 -20
- meutils/ai_audio/tts/tts_ui.py +1 -0
- meutils/ai_audio/utils.py +9 -0
- meutils/ai_cv/__init__.py +0 -1
- meutils/ai_cv/ocr.py +3 -2
- meutils/ai_cv/utils.py +154 -0
- meutils/ai_video/avmerge.py +6 -0
- meutils/ai_video/video.py +11 -2
- meutils/{api → apis}/__init__.py +1 -1
- meutils/apis/ali_apis.py +60 -0
- meutils/apis/audio/__init__.py +10 -0
- meutils/apis/audio/deepinfra.py +59 -0
- meutils/apis/audio/fish.py +248 -0
- meutils/apis/baidu/__init__.py +9 -0
- meutils/apis/baidu/bdaitpzs.py +229 -0
- meutils/apis/baidu/test.py +78 -0
- meutils/apis/chatglm/__init__.py +11 -0
- meutils/apis/chatglm/glm_video.py +273 -0
- meutils/apis/chatglm/glm_video_api.py +116 -0
- meutils/apis/chatglm/images.py +63 -0
- meutils/apis/chatglm/temp.py +259 -0
- meutils/apis/chatglm/x.py +31 -0
- meutils/{api → apis}/common.py +10 -6
- meutils/apis/fal/__init__.py +11 -0
- meutils/apis/fal/files.py +53 -0
- meutils/apis/fal/images.py +57 -0
- meutils/apis/fal/images_.py +72 -0
- meutils/apis/fal/videos.py +77 -0
- meutils/apis/firecrawl.py +45 -0
- meutils/apis/gitee/__init__.py +11 -0
- meutils/apis/gitee/images/__init__.py +9 -0
- meutils/apis/gitee/images/kolors.py +99 -0
- meutils/apis/hailuoai/__init__.py +11 -0
- meutils/apis/hailuoai/demo.py +34 -0
- meutils/apis/hailuoai/hasha_new.py +248 -0
- meutils/apis/hailuoai/music.py +11 -0
- meutils/apis/hailuoai/upload.py +116 -0
- meutils/apis/hailuoai/videos.py +460 -0
- meutils/apis/hailuoai/yy.py +242 -0
- meutils/apis/hf/__init__.py +11 -0
- meutils/apis/hf/got_ocr.py +64 -0
- meutils/apis/hf/gradio.py +34 -0
- meutils/apis/hf/hivisionidphotos.py +80 -0
- meutils/apis/hf/kolors.py +68 -0
- meutils/apis/hf/kolors_virtual_try_on.py +107 -0
- meutils/apis/hf/r.py +53 -0
- meutils/apis/hf/x.py +26 -0
- meutils/apis/hf//350/257/201/344/273/266/347/205/247.py +41 -0
- meutils/apis/hunyuan/__init__.py +11 -0
- meutils/apis/hunyuan/image_tools.py +84 -0
- meutils/apis/images/__init__.py +11 -0
- meutils/apis/images/deepinfra.py +92 -0
- meutils/apis/images/demo.py +150 -0
- meutils/apis/images/eidt.py +36 -0
- meutils/apis/images/flux/__init__.py +11 -0
- meutils/apis/images/flux/fluxpro.py +108 -0
- meutils/apis/images/flux/mystic.py +116 -0
- meutils/apis/images/ideogram/__init__.py +10 -0
- meutils/apis/images/ideogram/ideogram_images.py +193 -0
- meutils/apis/images/prodia/__init__.py +12 -0
- meutils/apis/images/prodia/faceswap.py +76 -0
- meutils/apis/images/recraft.py +152 -0
- meutils/apis/images/virtual_try_on/__init__.py +11 -0
- meutils/apis/images/virtual_try_on/images.py +65 -0
- meutils/apis/jiema/24mail.py +96 -0
- meutils/apis/jiema/__init__.py +11 -0
- meutils/apis/jiema/yezi.py +97 -0
- meutils/apis/jimeng/__init__.py +11 -0
- meutils/apis/jimeng/common.py +328 -0
- meutils/apis/jimeng/doubao.py +68 -0
- meutils/apis/jimeng/doubao_utils.py +175 -0
- meutils/apis/jimeng/files.py +263 -0
- meutils/apis/jimeng/images.py +140 -0
- meutils/apis/jimeng/lip_sync.py +11 -0
- meutils/apis/jina.py +55 -0
- meutils/apis/kling/__init__.py +11 -0
- meutils/apis/kling/api.py +60 -0
- meutils/apis/kling/images.py +174 -0
- meutils/apis/kling/kolors_virtual_try_on.py +111 -0
- meutils/apis/kling/kolors_virtual_try_on_web.py +126 -0
- meutils/apis/kling/videos.py +67 -0
- meutils/apis/kling//351/211/264/346/235/203.py +34 -0
- meutils/apis/kuaidi.py +32 -0
- meutils/apis/kuaishou/__init__.py +10 -0
- meutils/apis/kuaishou/klingai.py +523 -0
- meutils/apis/kuaishou/klingai_video.py +197 -0
- meutils/apis/kuaishou/kolors.py +189 -0
- meutils/apis/llm_qa.py +55 -0
- meutils/apis/luma/__init__.py +11 -0
- meutils/apis/luma/luma.py +123 -0
- meutils/apis/minicpm/__init__.py +9 -0
- meutils/apis/minicpm/luca.py +137 -0
- meutils/apis/monica/__init__.py +11 -0
- meutils/apis/monica/llm.py +11 -0
- meutils/apis/napkin/__init__.py +11 -0
- meutils/apis/napkin/icons.py +42 -0
- meutils/apis/niutrans.py +73 -0
- meutils/apis/oneapi/__init__.py +11 -0
- meutils/apis/oneapi/channel.py +68 -0
- meutils/apis/oneapi/common.py +135 -0
- meutils/apis/oneapi/log.py +47 -0
- meutils/apis/oneapi/token.py +48 -0
- meutils/apis/oneapi/token_.py +112 -0
- meutils/apis/oneapi/user.py +100 -0
- meutils/apis/oneapi/utils.py +47 -0
- meutils/apis/pixverse/__init__.py +11 -0
- meutils/apis/pixverse/pixverse.py +150 -0
- meutils/apis/proxy/__init__.py +11 -0
- meutils/apis/proxy/ips.py +178 -0
- meutils/apis/remini/__init__.py +11 -0
- meutils/apis/remini/remini.py +89 -0
- meutils/apis/replicateai/__init__.py +11 -0
- meutils/apis/replicateai/images.py +79 -0
- meutils/apis/replicateai/raw.py +53 -0
- meutils/apis/runwayml/__init__.py +10 -0
- meutils/apis/runwayml/gen.py +143 -0
- meutils/apis/search/__init__.py +11 -0
- meutils/apis/search/baichuan.py +11 -0
- meutils/apis/search/metaso.py +218 -0
- meutils/apis/search/metaso_.py +77 -0
- meutils/apis/search/n.py +99 -0
- meutils/apis/search/searxng.py +42 -0
- meutils/apis/search_music.py +39 -0
- meutils/apis/siliconflow/__init__.py +9 -0
- meutils/apis/siliconflow/audio.py +63 -0
- meutils/apis/siliconflow/image_to_image.py +116 -0
- meutils/apis/siliconflow/images.py +154 -0
- meutils/apis/siliconflow/rerankers.py +40 -0
- meutils/apis/siliconflow/text_to_image.py +132 -0
- meutils/apis/siliconflow/utils.py +66 -0
- meutils/apis/siliconflow/videos.py +102 -0
- meutils/apis/sunoai/__init__.py +10 -0
- meutils/apis/sunoai/haimian.py +135 -0
- meutils/apis/sunoai/suno.py +373 -0
- meutils/apis/textcard/__init__.py +11 -0
- meutils/apis/textcard/demo.py +25 -0
- meutils/apis/textcard/hanyuxinjie.py +81 -0
- meutils/apis/textin.py +159 -0
- meutils/apis/to_image/__init__.py +11 -0
- meutils/apis/to_image/html2image.py +29 -0
- meutils/apis/to_image/md.py +29 -0
- meutils/apis/to_image/url2image.py +41 -0
- meutils/apis/together/__init__.py +11 -0
- meutils/apis/together/images.py +80 -0
- meutils/apis/translator/__init__.py +9 -0
- meutils/apis/translator/deeplx.py +55 -0
- meutils/apis/tripo3d/__init__.py +11 -0
- meutils/apis/tripo3d/images.py +106 -0
- meutils/apis/ts.py +60 -0
- meutils/apis/uptime_kuma/__init__.py +11 -0
- meutils/apis/uptime_kuma/common.py +56 -0
- meutils/apis/uptime_kuma//345/233/275/344/272/247/345/210/206/347/273/204.py +68 -0
- meutils/apis/utils.py +47 -0
- meutils/apis/videos/__init__.py +11 -0
- meutils/apis/videos/sora.py +16 -0
- meutils/apis/vidu/__init__.py +9 -0
- meutils/apis/vidu/vidu_video.py +254 -0
- meutils/apis/vidu/x.py +14 -0
- meutils/apis/voice_clone/__init__.py +10 -0
- meutils/apis/voice_clone/fish.py +236 -0
- meutils/apis/voice_clone/fish_api.py +16 -0
- meutils/apis/web_search.py +31 -0
- meutils/apis/yezi.py +97 -0
- meutils/async_task/__init__.py +13 -0
- meutils/async_task/celery_config.py +106 -0
- meutils/async_task/common.py +37 -0
- meutils/async_task/demo_create_tasks.py +73 -0
- meutils/async_task/tasks/__init__.py +11 -0
- meutils/async_task/tasks/_all.py +20 -0
- meutils/async_task/tasks/hailuo.py +24 -0
- meutils/async_task/tasks/kling.py +30 -0
- meutils/async_task/tasks/replicateai.py +24 -0
- meutils/async_task/tasks/test.py +124 -0
- meutils/async_task/tasks/vidu.py +28 -0
- meutils/async_task/utils.py +191 -0
- meutils/async_task//351/200/232/347/224/250/350/256/276/350/256/241.py +119 -0
- meutils/async_utils/asyncer_.py +37 -0
- meutils/async_utils/background.py +68 -0
- meutils/async_utils/common.py +136 -16
- meutils/async_utils/test.py +47 -0
- meutils/cache_utils.py +29 -23
- meutils/caches/__init__.py +9 -0
- meutils/caches/acache.py +45 -0
- meutils/caches/redis_cache.py +63 -0
- meutils/clis/check_api.py +66 -0
- meutils/clis/cli.py +1 -1
- meutils/common.py +56 -17
- meutils/config_utils/__init__.py +11 -0
- meutils/config_utils/lark_utils/__init__.py +11 -0
- meutils/config_utils/lark_utils/common.py +385 -0
- meutils/config_utils/lark_utils/demo.py +13 -0
- meutils/config_utils/lark_utils/x.py +50 -0
- meutils/config_utils/manager.py +108 -0
- meutils/crawlers/__init__.py +11 -0
- meutils/data/VERSION +1 -1
- meutils/data/cowboy-hat-face.webp +0 -0
- meutils/data/oneapi/FOOTER.md +7 -0
- meutils/data/oneapi/NOTICE.md +138 -0
- meutils/data/oneapi/__init__.py +15 -0
- meutils/db/orm.py +179 -0
- meutils/db/redis_db.py +87 -0
- meutils/decorators/cache.py +1 -1
- meutils/decorators/common.py +84 -5
- meutils/decorators/contextmanagers.py +17 -6
- meutils/decorators/fastapi_decorator.py +77 -3
- meutils/decorators/polling.py +46 -0
- meutils/decorators/retry.py +150 -26
- meutils/fastapi_utils/__init__.py +11 -0
- meutils/fastapi_utils/exceptions/http_error.py +72 -0
- meutils/fastapi_utils/exceptions/validation_error.py +44 -0
- meutils/hash_utils.py +9 -4
- meutils/hooks/__init__.py +11 -0
- meutils/hooks/hook_test.py +174 -0
- meutils/hooks/wechat.py +162 -0
- meutils/hooks/wechat_channel.py +303 -0
- meutils/init/evn.py +1 -1
- meutils/io/files_utils.py +232 -0
- meutils/io/image.py +148 -10
- meutils/io/x.py +75 -0
- meutils/llm/__init__.py +10 -0
- meutils/llm/check_api.py +109 -0
- meutils/llm/check_utils.py +106 -0
- meutils/llm/clients.py +38 -0
- meutils/llm/completions/__init__.py +11 -0
- meutils/llm/completions/agents/__init__.py +11 -0
- meutils/llm/completions/agents/file.py +125 -0
- meutils/llm/completions/cp.py +112 -0
- meutils/llm/completions/delilegal.py +135 -0
- meutils/llm/completions/dify.py +81 -0
- meutils/llm/completions/kimi.py +47 -0
- meutils/llm/completions/modelscope.py +11 -0
- meutils/{fileparser/filetype.py → llm/completions/oi.py} +5 -3
- meutils/llm/completions/rag/__init__.py +11 -0
- meutils/llm/completions/rag/fire.py +157 -0
- meutils/llm/completions/rag/qwen.py +11 -0
- meutils/llm/completions/rag/rag.py +41 -0
- meutils/llm/completions/rag.py +38 -0
- meutils/llm/completions/tryblend.py +201 -0
- meutils/llm/completions/tune.py +284 -0
- meutils/llm/completions/x.py +26 -0
- meutils/llm/completions/xx.py +61 -0
- meutils/llm/completions/yuanbao.py +176 -0
- meutils/llm/demo.py +114 -0
- meutils/llm/functions/__init__.py +11 -0
- meutils/llm/mappers.py +15 -0
- meutils/llm/openai_utils/__init__.py +11 -0
- meutils/llm/openai_utils/common.py +284 -0
- meutils/llm/openai_utils/tool_outputs.py +45 -0
- meutils/llm/output_parsers/__init__.py +80 -0
- meutils/llm/prompts/__init__.py +244 -0
- meutils/llm/prompts/demo.py +155 -0
- meutils/llm/prompts/html2image_test.py +19 -0
- meutils/llm/utils.py +133 -0
- meutils/llm/x.py +75 -0
- meutils/notice/feishu.py +40 -9
- meutils/notice/wechat.py +23 -21
- meutils/np_utils.py +10 -1
- meutils/office_automation/pdf.py +6 -1
- meutils/oss/__init__.py +20 -0
- meutils/oss/minio_oss.py +184 -0
- meutils/oss/minio_utils.py +48 -0
- meutils/other/__demo.py +6 -4
- meutils/pandas_utils/__init__.py +1 -0
- meutils/pandas_utils/common.py +31 -0
- meutils/pandas_utils/pd_utils.py +10 -6
- meutils/parsers/__init__.py +10 -0
- meutils/parsers/file_parsers.py +110 -0
- meutils/parsers/fileparser/demo.py +41 -0
- meutils/parsers/fileparser/filetype.py +41 -0
- meutils/pay.py +37 -0
- meutils/pipe.py +37 -4
- meutils/playwright_utils/common.py +20 -12
- meutils/plots/common.py +35 -34
- meutils/queues/demo.py +56 -0
- meutils/queues/smooth_queue.py +120 -0
- meutils/queues/uniform_queue.py +3 -1
- meutils/request_utils/__init__.py +26 -2
- meutils/request_utils/ark.py +47 -0
- meutils/request_utils/crawler.py +34 -5
- meutils/request_utils/jwt_utils/__init__.py +11 -0
- meutils/request_utils/jwt_utils/common.py +42 -0
- meutils/request_utils/volc.py +160 -0
- meutils/schemas/__init__.py +0 -1
- meutils/schemas/baidu_types.py +70 -0
- meutils/schemas/batch_types.py +450 -0
- meutils/schemas/celery_types.py +64 -0
- meutils/schemas/chatfire_types.py +15 -0
- meutils/schemas/chatglm_types.py +197 -0
- meutils/schemas/db/__init__.py +11 -0
- meutils/schemas/db/oneapi_types.py +117 -0
- meutils/schemas/dify_types.py +40 -0
- meutils/schemas/embedding.py +31 -0
- meutils/schemas/fal_types.py +13 -0
- meutils/schemas/fish_types.py +11 -0
- meutils/schemas/hailuo_types.py +208 -0
- meutils/schemas/haimian_types.py +51 -0
- meutils/schemas/idphoto_types.py +43 -0
- meutils/schemas/image_types.py +476 -0
- meutils/schemas/jimeng_types.py +28 -0
- meutils/schemas/jina_types.py +67 -0
- meutils/schemas/kimi_types.py +86 -0
- meutils/schemas/kling_types.py +235 -0
- meutils/schemas/kuaishou_types.py +328 -0
- meutils/schemas/luma_types.py +59 -0
- meutils/schemas/message_types.py +165 -0
- meutils/schemas/message_types_.py +219 -0
- meutils/schemas/metaso_types.py +64 -0
- meutils/schemas/napkin_types.py +85 -0
- meutils/schemas/ocr_types.py +37 -0
- meutils/schemas/oneapi/__init__.py +11 -0
- meutils/schemas/oneapi/_types.py +49 -0
- meutils/schemas/oneapi/common.py +883 -0
- meutils/schemas/oneapi/icons.py +30 -0
- meutils/schemas/oneapi/model_group_info.py +48 -0
- meutils/schemas/oneapi/model_info.py +34 -0
- meutils/schemas/oneapi/models.py +26 -0
- meutils/schemas/oneapi/x.py +26 -0
- meutils/schemas/oneapi//351/207/215/345/256/232/345/220/221.py +132 -0
- meutils/schemas/openai_api_protocol.py +411 -0
- meutils/schemas/openai_types.py +366 -0
- meutils/schemas/pixverse_types.py +88 -0
- meutils/schemas/playwright_types.py +57 -0
- meutils/schemas/prodia_types.py +19 -0
- meutils/schemas/replicate_types.py +112 -0
- meutils/schemas/request_types.py +20 -0
- meutils/schemas/runwayml_types.py +190 -0
- meutils/schemas/siliconflow_types.py +80 -0
- meutils/schemas/step_types.py +19 -0
- meutils/schemas/suno_types.py +319 -0
- meutils/schemas/task_types.py +192 -0
- meutils/schemas/translator_types.py +29 -0
- meutils/schemas/tripo3d_types.py +57 -0
- meutils/schemas/tryblend_types.py +51 -0
- meutils/schemas/video_types.py +62 -0
- meutils/schemas/vidu_types.py +350 -0
- meutils/schemas/wechat_types.py +316 -0
- meutils/schemas/yuanbao_types.py +260 -0
- meutils/serving/celery/__init__.py +8 -0
- meutils/serving/celery/config.py +115 -0
- meutils/serving/celery/router.py +4 -6
- meutils/serving/celery/tasks.py +6 -4
- meutils/serving/celery//351/200/232/347/224/250/350/256/276/350/256/241.py +119 -0
- meutils/serving/fastapi/common.py +27 -31
- meutils/serving/fastapi/dependencies/__init__.py +0 -1
- meutils/serving/fastapi/dependencies/auth.py +55 -2
- meutils/serving/fastapi/exceptions/http_error.py +67 -2
- meutils/serving/fastapi/exceptions/validation_error.py +18 -2
- meutils/serving/fastapi/lifespans.py +73 -0
- meutils/serving/fastapi/routers/scheduler.py +12 -0
- meutils/serving/fastapi/routers/screenshot.py +47 -0
- meutils/serving/fastapi/routers/spider.py +8 -3
- meutils/serving/fastapi/routers/task.py +48 -0
- meutils/serving/fastapi/utils.py +48 -1
- meutils/serving/streamlit/common.py +1 -1
- meutils/smooth_utils.py +3 -0
- meutils/str_utils/__init__.py +22 -3
- meutils/str_utils/json_utils.py +7 -0
- meutils/str_utils/regular_expression.py +102 -10
- meutils/templates/xx.html +21 -0
- meutils/templates/xxx.html +117 -0
- meutils/todo.py +12 -0
- meutils/tools/token_monitor.py +33 -0
- MeUtils-2024.3.4.13.4.45.dist-info/RECORD +0 -540
- meutils/ai_audio/asr/subtitle.srt +0 -40
- meutils/ai_audio/demo.ipynb +0 -1215
- meutils/ai_audio/example.srt +0 -348
- meutils/ai_audio/new.srt +0 -179
- meutils/ai_audio/subtitles.srt +0 -696
- meutils/ai_audio/tts/new.srt +0 -179
- meutils/ai_audio//350/247/206/351/242/221/345/220/210/345/271/266.sh +0 -32
- meutils/ai_cv/1.jpg +0 -0
- meutils/ai_cv/197.jpg +0 -0
- meutils/ai_cv/2.jpg +0 -0
- meutils/ai_cv/img.png +0 -0
- meutils/ai_cv/invoice.jpg +0 -0
- meutils/ai_cv/tbl.png +0 -0
- meutils/ai_cv/test.png +0 -0
- meutils/ann/README.md +0 -33
- meutils/ann/README_gensim.md +0 -47
- meutils/ann/examples/client.py +0 -59
- meutils/ann/examples/demo.py +0 -24
- meutils/api/deeplx.py +0 -29
- meutils/api/qr.png +0 -0
- meutils/clis/README.md +0 -29
- meutils/clis/__test.sh +0 -17
- meutils/clis/deepseek.txt +0 -8
- meutils/clis/deepseek_13003330042.json +0 -1
- meutils/clis/deepseek_13003872192.json +0 -1
- meutils/clis/deepseek_13852263862.json +0 -1
- meutils/clis/deepseek_13913898681.json +0 -1
- meutils/clis/deepseek_13962978617.json +0 -1
- meutils/clis/deepseek_15251801790.json +0 -1
- meutils/clis/deepseek_15720826383.json +0 -1
- meutils/clis/deepseek_18395563611.json +0 -1
- meutils/clis/deepseek_313303303@qq.com.json +0 -1
- meutils/clis/kimi_state.json +0 -1
- meutils/cmds/README.md +0 -55
- meutils/coding/__init__.py +0 -11
- meutils/coding/find132.py +0 -40
- meutils/db/README.md +0 -51
- meutils/decorators/README.md +0 -17
- meutils/docarray_utils/demo_es.py +0 -34
- meutils/docarray_utils/demo_hnsw.py +0 -55
- meutils/docarray_utils/in_memory.py +0 -38
- meutils/docarray_utils//346/224/271/351/200/240/344/270/213hnsw.py +0 -43
- meutils/io/file.py +0 -20
- meutils/io/img.png +0 -0
- meutils/io/x.yml +0 -1
- meutils/notice/img.png +0 -0
- meutils/notice/todo.md +0 -10
- 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
- meutils/playwright_utils/__test.sh +0 -2
- meutils/playwright_utils/kimi1_cookies.json +0 -1
- meutils/playwright_utils/kimi2_cookies.json +0 -1
- meutils/playwright_utils/kimi_cookies.json +0 -93
- meutils/serving/README.md +0 -1
- meutils/serving/celery/_run.sh +0 -10
- meutils/serving/gui/run.sh +0 -9
- meutils/serving/jina/__demo/client.py +0 -42
- meutils/serving/jina/__demo/flow.svg +0 -1
- meutils/serving/jina/__demo/s.py +0 -34
- meutils/serving/jina/__demo/s2.py +0 -37
- meutils/serving/jina/__demo/server.py +0 -83
- meutils/serving/jina/__demo/test.py +0 -40
- meutils/serving/jina/executors/SentenceEncoder.py +0 -62
- meutils/serving/jina/executors/SentenceEncoder_.py +0 -63
- meutils/serving/jina/executors/__init__.py +0 -46
- meutils/serving/jina/executors/base.py +0 -40
- meutils/serving/jina/nlp_serving/__init__.py +0 -11
- meutils/serving/jina/nlp_serving/word_segmentation.py +0 -40
- meutils/serving/streamlit/conf.yaml +0 -5
- meutils/serving/streamlit/ocr.png +0 -0
- meutils/serving/streamlit/run.sh +0 -17
- meutils/serving/webui/.streamlit/_config.toml +0 -186
- meutils/serving/webui/.streamlit/config.toml +0 -26
- meutils/serving/webui/pages/_1_/345/210/206/350/257/215.py +0 -56
- 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
- meutils/serving/webui/pages/_3_/346/226/207/346/234/254/345/214/271/351/205/215.py +0 -64
- meutils/serving/webui/run.sh +0 -9
- meutils/spark/__init__.py +0 -26
- meutils/tools/monitor.yml +0 -29
- {MeUtils-2024.3.4.13.4.45.dist-info → MeUtils-2025.1.16.17.15.52.dist-info}/LICENSE +0 -0
- {MeUtils-2024.3.4.13.4.45.dist-info → MeUtils-2025.1.16.17.15.52.dist-info}/top_level.txt +0 -0
- {meutils → examples}/comp_utils/__init__.py +0 -0
- {meutils → examples}/comp_utils/reverse_metric.py +0 -0
- /meutils/{fileparser/README.md → fastapi_utils/exceptions/__init__.py} +0 -0
- /meutils/{fileparser → parsers/fileparser}/PDF/346/212/275/345/217/226.py" +0 -0
- /meutils/{fileparser → parsers/fileparser}/__init__.py +0 -0
- /meutils/{fileparser → parsers/fileparser}/common.py +0 -0
- /meutils/{fileparser → parsers/fileparser}/filetype/__init__.py +0 -0
- /meutils/{fileparser → parsers/fileparser}/filetype/__main__.py +0 -0
- /meutils/{fileparser → parsers/fileparser}/filetype/filetype.py +0 -0
- /meutils/{fileparser → parsers/fileparser}/filetype/helpers.py +0 -0
- /meutils/{fileparser → parsers/fileparser}/filetype/match.py +0 -0
- /meutils/{fileparser → parsers/fileparser}/filetype/types/__init__.py +0 -0
- /meutils/{fileparser → parsers/fileparser}/filetype/types/application.py +0 -0
- /meutils/{fileparser → parsers/fileparser}/filetype/types/archive.py +0 -0
- /meutils/{fileparser → parsers/fileparser}/filetype/types/audio.py +0 -0
- /meutils/{fileparser → parsers/fileparser}/filetype/types/base.py +0 -0
- /meutils/{fileparser → parsers/fileparser}/filetype/types/document.py +0 -0
- /meutils/{fileparser → parsers/fileparser}/filetype/types/font.py +0 -0
- /meutils/{fileparser → parsers/fileparser}/filetype/types/image.py +0 -0
- /meutils/{fileparser → parsers/fileparser}/filetype/types/isobmff.py +0 -0
- /meutils/{fileparser → parsers/fileparser}/filetype/types/video.py +0 -0
- /meutils/{fileparser → parsers/fileparser}/filetype/utils.py +0 -0
- /meutils/{fileparser → parsers/fileparser}/pdf.py +0 -0
- /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
|
+
|
meutils/async_utils/common.py
CHANGED
@@ -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
|
20
|
-
|
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
|
-
|
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
|
-
|
61
|
-
|
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
|
-
|
65
|
-
|
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
|
-
|
69
|
-
|
70
|
-
|
71
|
-
yield i
|
158
|
+
|
159
|
+
if __name__ == '__main__':
|
160
|
+
from meutils.pipe import *
|
72
161
|
|
73
162
|
|
74
|
-
async_generator()
|
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 =
|
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(
|
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 =
|
149
|
-
|
150
|
-
|
151
|
-
|
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
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
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
|
meutils/caches/acache.py
ADDED
@@ -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))
|