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
@@ -8,8 +8,61 @@
|
|
8
8
|
# @Software : PyCharm
|
9
9
|
# @Description :
|
10
10
|
|
11
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
32
|
+
content=content,
|
9
33
|
status_code=exc.status_code
|
10
34
|
)
|
11
35
|
|
@@ -14,5 +38,46 @@ async def general_exception_handler(request: Request, exc: Exception):
|
|
14
38
|
return JSONResponse(
|
15
39
|
content={"message": str(exc)},
|
16
40
|
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
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
|
+
}
|
17
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,
|
18
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
|
-
|
14
|
-
|
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()
|
meutils/serving/fastapi/utils.py
CHANGED
@@ -8,9 +8,33 @@
|
|
8
8
|
# @Software : PyCharm
|
9
9
|
# @Description :
|
10
10
|
|
11
|
-
from starlette.requests import Request
|
12
11
|
from meutils.pipe import *
|
13
12
|
|
13
|
+
from starlette.requests import Request
|
14
|
+
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
|
15
|
+
|
16
|
+
from fastapi import APIRouter, File, UploadFile, Query, Form, BackgroundTasks, Depends, HTTPException as _HTTPException, \
|
17
|
+
Request, status
|
18
|
+
|
19
|
+
|
20
|
+
class HTTPException(_HTTPException):
|
21
|
+
message: str = ""
|
22
|
+
type: str = "error"
|
23
|
+
param: Optional[Any] = None
|
24
|
+
code: Optional[Any] = None
|
25
|
+
|
26
|
+
def __init__(self, **kwargs):
|
27
|
+
super().__init__(**kwargs)
|
28
|
+
|
29
|
+
self.detail = self.detail or {
|
30
|
+
"error": {
|
31
|
+
"message": self.message,
|
32
|
+
"type": self.type,
|
33
|
+
"param": self.param,
|
34
|
+
"code": self.code or self.status_code,
|
35
|
+
}
|
36
|
+
}
|
37
|
+
|
14
38
|
|
15
39
|
def get_ipaddr(request: Request) -> str:
|
16
40
|
"""
|
@@ -51,3 +75,26 @@ def limit(limit_value='3/second', error_message: Optional[str] = None, **kwargs)
|
|
51
75
|
|
52
76
|
limiter = Limiter(key_func=get_remote_address)
|
53
77
|
return limiter.limit(limit_value=limit_value, error_message=error_message, **kwargs)
|
78
|
+
|
79
|
+
|
80
|
+
def check_api_key(auth: HTTPAuthorizationCredentials):
|
81
|
+
api_key = auth
|
82
|
+
if api_key is None:
|
83
|
+
detail = {
|
84
|
+
"error": {
|
85
|
+
"message": "invalid_api_key",
|
86
|
+
"type": "invalid_request_error",
|
87
|
+
"param": None,
|
88
|
+
"code": None,
|
89
|
+
}
|
90
|
+
}
|
91
|
+
raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=detail)
|
92
|
+
|
93
|
+
|
94
|
+
if __name__ == '__main__':
|
95
|
+
d = {
|
96
|
+
"error": {
|
97
|
+
"message": "当前分组 chatfire 下对于模型 ERNIE-Bot 无可用渠道 (request id: 20240314180638675032749TVFiqyF1)",
|
98
|
+
"type": "new_api_error"
|
99
|
+
}
|
100
|
+
}
|
@@ -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
meutils/str_utils/__init__.py
CHANGED
@@ -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
|
-
|
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
|
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']
|
meutils/str_utils/json_utils.py
CHANGED
@@ -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'))
|