From 69534f7cad7a69612782717f57f590f07061086d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=AC=91=E5=B0=8F=E6=9E=AB?= Date: Tue, 16 Dec 2025 17:48:59 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E4=BA=8C=E6=89=8B=E8=BD=A6=E5=87=BA?= =?UTF-8?q?=E6=B5=B7=E5=8A=A9=E6=89=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../used_car_export_agent/.gitignore" | 17 + .../used_car_export_agent/README.md" | 102 + .../lazyllm/__init__.py" | 93 + .../lazyllm/cli/README.md" | 56 + .../lazyllm/cli/__init__.py" | 0 .../lazyllm/cli/deploy.py" | 125 + .../lazyllm/cli/install.py" | 214 + .../lazyllm/cli/main.py" | 32 + .../used_car_export_agent/lazyllm/cli/run.py" | 102 + .../lazyllm/common/__init__.py" | 105 + .../lazyllm/common/bind.py" | 155 + .../lazyllm/common/common.py" | 500 + .../lazyllm/common/deprecated.py" | 43 + .../lazyllm/common/globals.py" | 301 + .../lazyllm/common/logger.py" | 159 + .../lazyllm/common/multiprocessing.py" | 52 + .../lazyllm/common/option.py" | 70 + .../lazyllm/common/queue.py" | 228 + .../lazyllm/common/redis_client.py" | 49 + .../lazyllm/common/registry.py" | 188 + .../lazyllm/common/text.py" | 16 + .../lazyllm/common/threading.py" | 40 + .../lazyllm/common/utils.py" | 174 + .../lazyllm/components/__init__.py" | 42 + .../lazyllm/components/auto/__init__.py" | 7 + .../lazyllm/components/auto/auto_helper.py" | 52 + .../lazyllm/components/auto/autodeploy.py" | 79 + .../lazyllm/components/auto/autofinetune.py" | 73 + .../components/auto/dependencies/__init__.py" | 0 .../auto/dependencies/modelsconfig.py" | 10 + .../auto/dependencies/requirements.py" | 17 + .../lazyllm/components/core.py" | 57 + .../lazyllm/components/data.py" | 10 + .../lazyllm/components/deploy/__init__.py" | 34 + .../lazyllm/components/deploy/base.py" | 99 + .../lazyllm/components/deploy/embed.py" | 247 + .../components/deploy/graphrag/__init__.py" | 0 .../lazyllm/components/deploy/infinity.py" | 100 + .../lazyllm/components/deploy/lightllm.py" | 99 + .../lazyllm/components/deploy/lmdeploy.py" | 83 + .../deploy/lmdeploy/chat_template.json" | 13 + .../lazyllm/components/deploy/mindie.py" | 143 + .../components/deploy/mindie/config.json" | 101 + .../components/deploy/mineru/__init__.py" | 0 .../deploy/mineru/mineru_patches.py" | 224 + .../deploy/mineru/mineru_server_module.py" | 412 + .../components/deploy/ocr/__init__.py" | 5 + .../lazyllm/components/deploy/ocr/pp_ocr.py" | 107 + .../lazyllm/components/deploy/ray.py" | 63 + .../components/deploy/relay/__init__.py" | 6 + .../lazyllm/components/deploy/relay/base.py" | 98 + .../components/deploy/relay/server.py" | 182 + .../deploy/speech_to_text/__init__.py" | 5 + .../deploy/speech_to_text/sense_voice.py" | 102 + .../deploy/stable_diffusion/__init__.py" | 5 + .../stable_diffusion/stable_diffusion3.py" | 235 + .../deploy/text_to_speech/__init__.py" | 30 + .../components/deploy/text_to_speech/bark.py" | 44 + .../components/deploy/text_to_speech/base.py" | 59 + .../deploy/text_to_speech/chattts.py" | 76 + .../deploy/text_to_speech/musicgen.py" | 21 + .../deploy/text_to_speech/utils.py" | 47 + .../lazyllm/components/deploy/utils.py" | 19 + .../lazyllm/components/deploy/vllm.py" | 138 + .../lazyllm/components/finetune/__init__.py" | 15 + .../components/finetune/alpaca-lora/ds.json" | 27 + .../finetune/alpaca-lora/finetune.py" | 341 + .../finetune/alpaca-lora/requirements.txt" | 17 + .../finetune/alpaca-lora/utils/__init__.py" | 0 .../alpaca-lora/utils/merge_weights.py" | 38 + .../finetune/alpaca-lora/utils/prompter.py" | 1 + .../components/finetune/alpacalora.py" | 91 + .../lazyllm/components/finetune/base.py" | 28 + .../lazyllm/components/finetune/collie.py" | 86 + .../components/finetune/collie/finetune.py" | 315 + .../components/finetune/collie/prompter.py" | 1 + .../components/finetune/easy_r1/config.yaml" | 103 + .../easy_r1/format_prompt/dapo.jinja" | 1 + .../easy_r1/format_prompt/math.jinja" | 1 + .../finetune/easy_r1/format_prompt/r1v.jinja" | 1 + .../finetune/easy_r1/model_merger.py" | 198 + .../finetune/easy_r1/reward_function/dapo.py" | 59 + .../finetune/easy_r1/reward_function/math.py" | 49 + .../finetune/easy_r1/reward_function/r1v.py" | 50 + .../lazyllm/components/finetune/easyllm.py" | 0 .../lazyllm/components/finetune/easyr1.py" | 128 + .../finetune/flag_embedding/ds_stage0.json" | 45 + .../finetune/flag_embedding/ds_stage1.json" | 50 + .../components/finetune/flagembedding.py" | 120 + .../finetune/llama_factory/__init__.py" | 0 .../finetune/llama_factory/lora_export.yaml" | 12 + .../finetune/llama_factory/model_mapping.py" | 81 + .../finetune/llama_factory/sft.yaml" | 262 + .../components/finetune/llamafactory.py" | 181 + .../lazyllm/components/formatter/__init__.py" | 21 + .../components/formatter/formatterbase.py" | 340 + .../components/formatter/jsonformatter.py" | 50 + .../components/formatter/yamlformatter.py" | 12 + .../lazyllm/components/prompter/__init__.py" | 13 + .../components/prompter/alpacaPrompter.py" | 22 + .../components/prompter/builtinPrompt.py" | 232 + .../components/prompter/chatPrompter.py" | 19 + .../lazyllm/components/prompter/prompter.py" | 85 + .../lazyllm/components/utils/__init__.py" | 6 + .../components/utils/downloader/__init__.py" | 6 + .../utils/downloader/model_directory.py" | 127 + .../utils/downloader/model_downloader.py" | 409 + .../utils/downloader/model_mapping.py" | 359 + .../lazyllm/components/utils/file_operate.py" | 206 + .../lazyllm/components/validate.py" | 5 + .../used_car_export_agent/lazyllm/configs.py" | 155 + .../lazyllm/docs/__init__.py" | 8 + .../lazyllm/docs/common.py" | 1361 ++ .../lazyllm/docs/components.py" | 3963 ++++++ .../lazyllm/docs/configs.py" | 166 + .../lazyllm/docs/flow.py" | 1241 ++ .../lazyllm/docs/hook.py" | 98 + .../lazyllm/docs/launcher.py" | 513 + .../lazyllm/docs/module.py" | 3008 +++++ .../lazyllm/docs/patch.py" | 132 + .../lazyllm/docs/prompt_template.py" | 309 + .../lazyllm/docs/tools.py" | 10360 ++++++++++++++++ .../lazyllm/docs/utils.py" | 162 + .../lazyllm/engine/__init__.py" | 13 + .../lazyllm/engine/engine.py" | 1070 ++ .../lazyllm/engine/lightengine.py" | 143 + .../lazyllm/engine/node.py" | 40 + .../lazyllm/engine/node_meta_hook.py" | 67 + .../lazyllm/engine/scripts/__init__.py" | 13 + .../scripts/dataset_format/__init__.py" | 0 .../scripts/dataset_format/pt_x2alpaca.py" | 12 + .../scripts/dataset_format/sft_x2alpaca.py" | 140 + .../lazyllm/engine/utils.py" | 23 + .../lazyllm/flow/__init__.py" | 29 + .../lazyllm/flow/flow.py" | 700 ++ .../used_car_export_agent/lazyllm/hook.py" | 60 + .../lazyllm/launcher.py" | 1709 +++ .../used_car_export_agent/lazyllm/lazyml.py" | 1 + .../lazyllm/module/__init__.py" | 23 + .../lazyllm/module/llms/__init__.py" | 32 + .../lazyllm/module/llms/automodel.py" | 28 + .../module/llms/onlinemodule/__init__.py" | 13 + .../llms/onlinemodule/base/__init__.py" | 9 + .../base/onlineChatModuleBase.py" | 334 + .../base/onlineEmbeddingModuleBase.py" | 145 + .../base/onlineMultiModalBase.py" | 55 + .../module/llms/onlinemodule/base/utils.py" | 13 + .../lazyllm/module/llms/onlinemodule/chat.py" | 71 + .../module/llms/onlinemodule/embedding.py" | 81 + .../module/llms/onlinemodule/fileHandler.py" | 80 + .../llms/onlinemodule/map_model_type.py" | 510 + .../module/llms/onlinemodule/multimodal.py" | 126 + .../llms/onlinemodule/supplier/__init__.py" | 0 .../llms/onlinemodule/supplier/deepseek.py" | 29 + .../llms/onlinemodule/supplier/doubao.py" | 122 + .../module/llms/onlinemodule/supplier/glm.py" | 317 + .../llms/onlinemodule/supplier/kimi.py" | 43 + .../llms/onlinemodule/supplier/minimax.py" | 237 + .../llms/onlinemodule/supplier/openai.py" | 262 + .../llms/onlinemodule/supplier/qwen.py" | 524 + .../llms/onlinemodule/supplier/sensenova.py" | 253 + .../onlinemodule/supplier/siliconflow.py" | 197 + .../lazyllm/module/llms/trainablemodule.py" | 643 + .../lazyllm/module/llms/utils.py" | 247 + .../lazyllm/module/module.py" | 567 + .../lazyllm/module/servermodule.py" | 294 + .../lazyllm/module/trialmodule.py" | 35 + .../lazyllm/module/utils.py" | 13 + .../used_car_export_agent/lazyllm/patch.py" | 134 + .../lazyllm/prompt_templates/__init__.py" | 5 + .../lazyllm/prompt_templates/base.py" | 16 + .../few_shot_prompt_template.py" | 134 + .../prompt_templates/prompt_template.py" | 103 + .../lazyllm/thirdparty/__init__.py" | 114 + .../lazyllm/thirdparty/modules.py" | 11 + .../lazyllm/tools/__init__.py" | 67 + .../lazyllm/tools/actors/__init__.py" | 9 + .../lazyllm/tools/actors/code_generator.py" | 75 + .../tools/actors/parameter_extractor.py" | 117 + .../lazyllm/tools/actors/qustion_rewrite.py" | 71 + .../lazyllm/tools/agent/__init__.py" | 16 + .../lazyllm/tools/agent/functionCall.py" | 126 + .../lazyllm/tools/agent/planAndSolveAgent.py" | 83 + .../lazyllm/tools/agent/reactAgent.py" | 57 + .../lazyllm/tools/agent/rewooAgent.py" | 101 + .../lazyllm/tools/agent/toolsManager.py" | 337 + .../lazyllm/tools/classifier/__init__.py" | 5 + .../tools/classifier/intent_classifier.py" | 149 + .../lazyllm/tools/common.py" | 33 + .../lazyllm/tools/eval/__init__.py" | 11 + .../lazyllm/tools/eval/eval_base.py" | 93 + .../tools/eval/rag_generator_metrics.py" | 187 + .../tools/eval/rag_retriever_metrics.py" | 155 + .../lazyllm/tools/formatter/__init__.py" | 0 .../lazyllm/tools/http_request/__init__.py" | 7 + .../http_request/http_executor_response.py" | 52 + .../tools/http_request/http_request.py" | 81 + .../lazyllm/tools/infer_service/__init__.py" | 5 + .../lazyllm/tools/infer_service/serve.py" | 249 + .../lazyllm/tools/mcp/__init__.py" | 5 + .../lazyllm/tools/mcp/client.py" | 79 + .../lazyllm/tools/mcp/deploy.py" | 199 + .../lazyllm/tools/mcp/tool_adaptor.py" | 129 + .../lazyllm/tools/mcp/utils.py" | 49 + .../lazyllm/tools/memory/__init__.py" | 3 + .../lazyllm/tools/memory/base.py" | 28 + .../lazyllm/tools/memory/memory.py" | 22 + .../tools/memory/supplier/__init__.py" | 7 + .../lazyllm/tools/memory/supplier/mem0.py" | 42 + .../lazyllm/tools/memory/supplier/memu.py" | 44 + .../lazyllm/tools/rag/__init__.py" | 74 + .../lazyllm/tools/rag/component/__init__.py" | 0 .../lazyllm/tools/rag/component/bm25.py" | 46 + .../lazyllm/tools/rag/component/stopwords.py" | 843 ++ .../lazyllm/tools/rag/dataReader.py" | 310 + .../lazyllm/tools/rag/data_loaders.py" | 37 + .../lazyllm/tools/rag/data_type.py" | 12 + .../lazyllm/tools/rag/default_index.py" | 86 + .../lazyllm/tools/rag/doc_impl.py" | 538 + .../lazyllm/tools/rag/doc_manager.py" | 382 + .../lazyllm/tools/rag/doc_node.py" | 348 + .../lazyllm/tools/rag/doc_to_db/__init__.py" | 14 + .../tools/rag/doc_to_db/doc_analysis.py" | 209 + .../tools/rag/doc_to_db/doc_processor.py" | 186 + .../lazyllm/tools/rag/doc_to_db/extractor.py" | 860 ++ .../lazyllm/tools/rag/doc_to_db/model.py" | 81 + .../lazyllm/tools/rag/doc_to_db/prompts.py" | 124 + .../lazyllm/tools/rag/doc_to_db/utils.py" | 25 + .../lazyllm/tools/rag/document.py" | 418 + .../lazyllm/tools/rag/embed_wrapper.py" | 45 + .../lazyllm/tools/rag/global_metadata.py" | 26 + .../lazyllm/tools/rag/graph_document.py" | 57 + .../lazyllm/tools/rag/graph_retriever.py" | 35 + .../lazyllm/tools/rag/index_base.py" | 17 + .../tools/rag/parsing_service/__init__.py" | 9 + .../tools/rag/parsing_service/base.py" | 156 + .../tools/rag/parsing_service/impl.py" | 203 + .../tools/rag/parsing_service/queue.py" | 144 + .../tools/rag/parsing_service/server.py" | 518 + .../tools/rag/parsing_service/worker.py" | 284 + .../lazyllm/tools/rag/prompts/__init__.py" | 5 + .../tools/rag/prompts/transform_prompt.py" | 204 + .../rank_fusion/reciprocal_rank_fusion.py" | 45 + .../lazyllm/tools/rag/readers/__init__.py" | 32 + .../lazyllm/tools/rag/readers/docxReader.py" | 19 + .../lazyllm/tools/rag/readers/epubReader.py" | 37 + .../lazyllm/tools/rag/readers/hwpReader.py" | 82 + .../lazyllm/tools/rag/readers/imageReader.py" | 97 + .../lazyllm/tools/rag/readers/ipynbReader.py" | 36 + .../tools/rag/readers/markdownReader.py" | 64 + .../lazyllm/tools/rag/readers/mboxreader.py" | 67 + .../tools/rag/readers/mineru_pdf_reader.py" | 279 + .../tools/rag/readers/pandasReader.py" | 69 + .../lazyllm/tools/rag/readers/pdfReader.py" | 38 + .../lazyllm/tools/rag/readers/pptxReader.py" | 79 + .../lazyllm/tools/rag/readers/readerBase.py" | 64 + .../lazyllm/tools/rag/readers/readme.md" | 1 + .../tools/rag/readers/videoAudioReader.py" | 47 + .../lazyllm/tools/rag/rerank.py" | 121 + .../lazyllm/tools/rag/retriever.py" | 153 + .../lazyllm/tools/rag/similarity.py" | 96 + .../tools/rag/smart_embedding_index.py" | 26 + .../lazyllm/tools/rag/store/__init__.py" | 26 + .../tools/rag/store/document_store.py" | 395 + .../tools/rag/store/hybrid/__init__.py" | 6 + .../tools/rag/store/hybrid/hybrid_store.py" | 73 + .../tools/rag/store/hybrid/map_store.py" | 278 + .../rag/store/hybrid/oceanbase_store.py" | 916 ++ .../rag/store/hybrid/sensecore_store.py" | 430 + .../tools/rag/store/segment/__init__.py" | 4 + .../rag/store/segment/elasticsearch_store.py" | 428 + .../rag/store/segment/opensearch_store.py" | 374 + .../lazyllm/tools/rag/store/store_base.py" | 101 + .../lazyllm/tools/rag/store/utils.py" | 196 + .../tools/rag/store/vector/__init__.py" | 4 + .../tools/rag/store/vector/chroma_store.py" | 278 + .../tools/rag/store/vector/milvus_store.py" | 587 + .../lazyllm/tools/rag/tools/__init__.py" | 0 .../lazyllm/tools/rag/transform/__init__.py" | 16 + .../lazyllm/tools/rag/transform/base.py" | 432 + .../lazyllm/tools/rag/transform/character.py" | 143 + .../lazyllm/tools/rag/transform/code.py" | 976 ++ .../lazyllm/tools/rag/transform/factory.py" | 133 + .../lazyllm/tools/rag/transform/markdown.py" | 412 + .../lazyllm/tools/rag/transform/recursive.py" | 30 + .../lazyllm/tools/rag/transform/sentence.py" | 60 + .../lazyllm/tools/rag/utils.py" | 1033 ++ .../lazyllm/tools/rag/web.py" | 255 + .../graphrag/graphrag_server_module.py" | 154 + .../graphrag/graphrag_service_impl.py" | 327 + .../lazyllm/tools/servers/mineru.py" | 25 + .../lazyllm/tools/services/__init__.py" | 7 + .../lazyllm/tools/services/client.py" | 22 + .../lazyllm/tools/services/services.py" | 127 + .../lazyllm/tools/sql/__init__.py" | 5 + .../lazyllm/tools/sql/db_manager.py" | 54 + .../lazyllm/tools/sql/mongodb_manager.py" | 104 + .../lazyllm/tools/sql/sql_manager.py" | 353 + .../lazyllm/tools/sql_call/__init__.py" | 3 + .../lazyllm/tools/sql_call/sql_call.py" | 180 + .../lazyllm/tools/tools/__init__.py" | 16 + .../lazyllm/tools/tools/calculator.py" | 9 + .../lazyllm/tools/tools/http_tool.py" | 47 + .../lazyllm/tools/tools/json.py" | 264 + .../lazyllm/tools/tools/search/__init__.py" | 4 + .../tools/tools/search/google_search.py" | 27 + .../tools/tools/search/tencent_search.py" | 30 + .../lazyllm/tools/tools/weather.py" | 35 + .../lazyllm/tools/train_service/__init__.py" | 0 .../lazyllm/tools/train_service/serve.py" | 355 + .../lazyllm/tools/utils.py" | 24 + .../lazyllm/tools/webpages/__init__.py" | 5 + .../lazyllm/tools/webpages/webmodule.py" | 473 + .../requirements.full.txt" | 102 + .../used_car_export_agent/requirements.txt" | 36 + .../used_car_export_agent/assistant.py" | 203 + .../components/__init__.py" | 1 + .../used_car_export_agent/index.html" | 390 + .../used_car_export_agent/main.py" | 86 + .../used_car_export_agent/web_ui.py" | 471 + ...00\346\234\257\346\226\207\346\241\243.md" | 192 + 321 files changed, 63652 insertions(+) create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/.gitignore" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/README.md" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/cli/README.md" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/cli/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/cli/deploy.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/cli/install.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/cli/main.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/cli/run.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/common/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/common/bind.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/common/common.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/common/deprecated.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/common/globals.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/common/logger.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/common/multiprocessing.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/common/option.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/common/queue.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/common/redis_client.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/common/registry.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/common/text.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/common/threading.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/common/utils.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/auto/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/auto/auto_helper.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/auto/autodeploy.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/auto/autofinetune.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/auto/dependencies/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/auto/dependencies/modelsconfig.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/auto/dependencies/requirements.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/core.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/data.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/deploy/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/deploy/base.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/deploy/embed.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/deploy/graphrag/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/deploy/infinity.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/deploy/lightllm.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/deploy/lmdeploy.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/deploy/lmdeploy/chat_template.json" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/deploy/mindie.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/deploy/mindie/config.json" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/deploy/mineru/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/deploy/mineru/mineru_patches.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/deploy/mineru/mineru_server_module.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/deploy/ocr/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/deploy/ocr/pp_ocr.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/deploy/ray.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/deploy/relay/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/deploy/relay/base.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/deploy/relay/server.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/deploy/speech_to_text/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/deploy/speech_to_text/sense_voice.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/deploy/stable_diffusion/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/deploy/stable_diffusion/stable_diffusion3.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/deploy/text_to_speech/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/deploy/text_to_speech/bark.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/deploy/text_to_speech/base.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/deploy/text_to_speech/chattts.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/deploy/text_to_speech/musicgen.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/deploy/text_to_speech/utils.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/deploy/utils.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/deploy/vllm.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/finetune/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/finetune/alpaca-lora/ds.json" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/finetune/alpaca-lora/finetune.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/finetune/alpaca-lora/requirements.txt" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/finetune/alpaca-lora/utils/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/finetune/alpaca-lora/utils/merge_weights.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/finetune/alpaca-lora/utils/prompter.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/finetune/alpacalora.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/finetune/base.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/finetune/collie.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/finetune/collie/finetune.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/finetune/collie/prompter.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/finetune/easy_r1/config.yaml" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/finetune/easy_r1/format_prompt/dapo.jinja" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/finetune/easy_r1/format_prompt/math.jinja" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/finetune/easy_r1/format_prompt/r1v.jinja" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/finetune/easy_r1/model_merger.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/finetune/easy_r1/reward_function/dapo.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/finetune/easy_r1/reward_function/math.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/finetune/easy_r1/reward_function/r1v.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/finetune/easyllm.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/finetune/easyr1.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/finetune/flag_embedding/ds_stage0.json" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/finetune/flag_embedding/ds_stage1.json" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/finetune/flagembedding.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/finetune/llama_factory/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/finetune/llama_factory/lora_export.yaml" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/finetune/llama_factory/model_mapping.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/finetune/llama_factory/sft.yaml" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/finetune/llamafactory.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/formatter/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/formatter/formatterbase.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/formatter/jsonformatter.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/formatter/yamlformatter.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/prompter/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/prompter/alpacaPrompter.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/prompter/builtinPrompt.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/prompter/chatPrompter.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/prompter/prompter.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/utils/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/utils/downloader/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/utils/downloader/model_directory.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/utils/downloader/model_downloader.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/utils/downloader/model_mapping.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/utils/file_operate.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/components/validate.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/configs.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/docs/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/docs/common.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/docs/components.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/docs/configs.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/docs/flow.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/docs/hook.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/docs/launcher.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/docs/module.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/docs/patch.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/docs/prompt_template.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/docs/tools.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/docs/utils.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/engine/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/engine/engine.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/engine/lightengine.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/engine/node.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/engine/node_meta_hook.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/engine/scripts/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/engine/scripts/dataset_format/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/engine/scripts/dataset_format/pt_x2alpaca.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/engine/scripts/dataset_format/sft_x2alpaca.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/engine/utils.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/flow/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/flow/flow.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/hook.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/launcher.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/lazyml.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/module/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/module/llms/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/module/llms/automodel.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/module/llms/onlinemodule/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/module/llms/onlinemodule/base/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/module/llms/onlinemodule/base/onlineChatModuleBase.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/module/llms/onlinemodule/base/onlineEmbeddingModuleBase.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/module/llms/onlinemodule/base/onlineMultiModalBase.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/module/llms/onlinemodule/base/utils.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/module/llms/onlinemodule/chat.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/module/llms/onlinemodule/embedding.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/module/llms/onlinemodule/fileHandler.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/module/llms/onlinemodule/map_model_type.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/module/llms/onlinemodule/multimodal.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/module/llms/onlinemodule/supplier/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/module/llms/onlinemodule/supplier/deepseek.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/module/llms/onlinemodule/supplier/doubao.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/module/llms/onlinemodule/supplier/glm.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/module/llms/onlinemodule/supplier/kimi.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/module/llms/onlinemodule/supplier/minimax.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/module/llms/onlinemodule/supplier/openai.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/module/llms/onlinemodule/supplier/qwen.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/module/llms/onlinemodule/supplier/sensenova.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/module/llms/onlinemodule/supplier/siliconflow.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/module/llms/trainablemodule.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/module/llms/utils.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/module/module.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/module/servermodule.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/module/trialmodule.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/module/utils.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/patch.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/prompt_templates/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/prompt_templates/base.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/prompt_templates/few_shot_prompt_template.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/prompt_templates/prompt_template.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/thirdparty/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/thirdparty/modules.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/actors/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/actors/code_generator.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/actors/parameter_extractor.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/actors/qustion_rewrite.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/agent/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/agent/functionCall.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/agent/planAndSolveAgent.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/agent/reactAgent.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/agent/rewooAgent.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/agent/toolsManager.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/classifier/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/classifier/intent_classifier.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/common.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/eval/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/eval/eval_base.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/eval/rag_generator_metrics.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/eval/rag_retriever_metrics.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/formatter/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/http_request/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/http_request/http_executor_response.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/http_request/http_request.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/infer_service/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/infer_service/serve.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/mcp/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/mcp/client.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/mcp/deploy.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/mcp/tool_adaptor.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/mcp/utils.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/memory/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/memory/base.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/memory/memory.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/memory/supplier/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/memory/supplier/mem0.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/memory/supplier/memu.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/component/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/component/bm25.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/component/stopwords.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/dataReader.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/data_loaders.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/data_type.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/default_index.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/doc_impl.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/doc_manager.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/doc_node.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/doc_to_db/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/doc_to_db/doc_analysis.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/doc_to_db/doc_processor.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/doc_to_db/extractor.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/doc_to_db/model.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/doc_to_db/prompts.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/doc_to_db/utils.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/document.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/embed_wrapper.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/global_metadata.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/graph_document.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/graph_retriever.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/index_base.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/parsing_service/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/parsing_service/base.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/parsing_service/impl.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/parsing_service/queue.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/parsing_service/server.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/parsing_service/worker.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/prompts/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/prompts/transform_prompt.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/rank_fusion/reciprocal_rank_fusion.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/readers/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/readers/docxReader.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/readers/epubReader.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/readers/hwpReader.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/readers/imageReader.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/readers/ipynbReader.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/readers/markdownReader.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/readers/mboxreader.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/readers/mineru_pdf_reader.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/readers/pandasReader.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/readers/pdfReader.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/readers/pptxReader.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/readers/readerBase.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/readers/readme.md" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/readers/videoAudioReader.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/rerank.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/retriever.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/similarity.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/smart_embedding_index.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/store/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/store/document_store.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/store/hybrid/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/store/hybrid/hybrid_store.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/store/hybrid/map_store.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/store/hybrid/oceanbase_store.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/store/hybrid/sensecore_store.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/store/segment/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/store/segment/elasticsearch_store.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/store/segment/opensearch_store.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/store/store_base.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/store/utils.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/store/vector/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/store/vector/chroma_store.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/store/vector/milvus_store.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/tools/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/transform/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/transform/base.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/transform/character.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/transform/code.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/transform/factory.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/transform/markdown.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/transform/recursive.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/transform/sentence.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/utils.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/rag/web.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/servers/graphrag/graphrag_server_module.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/servers/graphrag/graphrag_service_impl.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/servers/mineru.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/services/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/services/client.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/services/services.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/sql/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/sql/db_manager.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/sql/mongodb_manager.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/sql/sql_manager.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/sql_call/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/sql_call/sql_call.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/tools/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/tools/calculator.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/tools/http_tool.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/tools/json.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/tools/search/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/tools/search/google_search.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/tools/search/tencent_search.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/tools/weather.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/train_service/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/train_service/serve.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/utils.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/webpages/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/tools/webpages/webmodule.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/requirements.full.txt" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/requirements.txt" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/used_car_export_agent/assistant.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/used_car_export_agent/components/__init__.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/used_car_export_agent/index.html" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/used_car_export_agent/main.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/used_car_export_agent/web_ui.py" create mode 100644 "\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/\346\212\200\346\234\257\346\226\207\346\241\243.md" diff --git "a/\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/.gitignore" "b/\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/.gitignore" new file mode 100644 index 0000000..935b84d --- /dev/null +++ "b/\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/.gitignore" @@ -0,0 +1,17 @@ +__pycache__ +*.pyc +test/ +dist/ +tmp/ +.vscode +build +*.lock +*.db +mkdocs.yml +.temp +lazyllm_chroma/ +docs/en/assets +docs/zh/assets +infer_log/ +*.log +log.txt diff --git "a/\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/README.md" "b/\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/README.md" new file mode 100644 index 0000000..5a64305 --- /dev/null +++ "b/\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/README.md" @@ -0,0 +1,102 @@ +# 二手车出口助手 + +一个基于LazyLLM的二手车出口智能助手,提供专业的二手车出口政策咨询、行业信息查询和车源搜索功能。 + +## 功能特点 + +- 📋 **政策咨询**:提供最新的二手车出口政策解读,包括出口资质、流程、标准和税收政策等信息。 +- 📊 **行业信息**:提供二手车行业市场规模、发展趋势和主要出口市场等最新行业信息。 +- 🚗 **车源搜索**:提供热门出口车型、价格评估和车源渠道等信息,帮助您找到合适的车源。 +- 🎨 **现代化界面**:简洁美观的用户界面,提供良好的用户体验。 +- 💬 **智能对话**:基于自然语言处理技术,理解用户意图并提供准确回答。 + +## 安装与使用 + +### 环境要求 + +- Python 3.8+ +- LazyLLM + + +### 运行应用 + +1. 使用默认配置运行: + +```bash +python main.py +``` + +2. 自定义配置运行: + +```bash +python main.py --host 0.0.0.0 --port 7860 --share +``` + +3. 使用本地模型运行: + +```bash +python main.py --model_path /path/to/your/model +``` + +### 命令行参数 + +- `--model_path`:本地模型路径,如果为None则使用在线模型 +- `--host`:服务器主机地址,默认为"0.0.0.0" +- `--port`:服务器端口,默认为7860 +- `--share`:是否创建公共分享链接 +- `--data_dir`:数据目录路径,默认为"data" + +## 项目结构 + +``` +used_car_export_agent/ +├── main.py # 主程序入口 +├── assistant.py # 核心助手模块 +├── web_ui.py # Web界面模块 +└── README.md # 项目说明 +``` + +## 功能说明 + +### 政策咨询 + +提供二手车出口相关的政策咨询服务,包括: + +- 出口资质要求 +- 出口流程 +- 出口标准 +- 税收政策 + +### 行业信息 + +提供二手车行业相关的信息查询,包括: + +- 市场规模 +- 出口趋势 +- 行业政策 + +### 车源搜索 + +提供二手车相关的搜索服务,包括: + +- 车源渠道 +- 热门车型 +- 价格评估 + +## 技术架构 + +- **前端**:基于Html构建的Web界面 +- **后端**:基于LazyLLM的智能对话系统 + +## 开发与扩展 + +### 添加新功能 + +1. 在`assistant.py`中添加新的业务逻辑 +2. 在`web_ui.py`中添加对应的UI组件 + +## 页面展示 + +![image-20251216174014896](https://image.xiaoxiaofeng.site/blog/image/image-20251216174014896.png?xiaoxiaofeng) + +![image-20251216174212625](https://image.xiaoxiaofeng.site/blog/image/image-20251216174212625.png?xiaoxiaofeng) diff --git "a/\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/__init__.py" "b/\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/__init__.py" new file mode 100644 index 0000000..ae09928 --- /dev/null +++ "b/\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/__init__.py" @@ -0,0 +1,93 @@ +# -*- coding: utf-8 -*- + +__version__ = '0.7.0' + +from .configs import config +from .configs import * # noqa F401 of Config +from .common import * # noqa F403 +from .launcher import LazyLLMLaunchersBase +from .flow import * # noqa F403 +from .components import (LazyLLMDataprocBase, LazyLLMFinetuneBase, LazyLLMDeployBase, + LazyLLMValidateBase, register as component_register, Prompter, + AlpacaPrompter, ChatPrompter, FastapiApp, JsonFormatter, FileFormatter) + +from .module import (ModuleBase, ModuleBase as Module, UrlModule, TrainableModule, ActionModule, + ServerModule, TrialModule, register as module_register, + OnlineChatModule, OnlineEmbeddingModule, AutoModel, OnlineMultiModalModule) +from .hook import LazyLLMHook, LazyLLMFuncHook +from .tools import (Document, Reranker, Retriever, WebModule, ToolManager, FunctionCall, + FunctionCallAgent, fc_register, ReactAgent, PlanAndSolveAgent, ReWOOAgent, SentenceSplitter, + LLMParser) +from .docs import add_doc +from .patch import patch_os_env + +config.done() +patch_os_env(lambda key, value: config.refresh(key), config.refresh) + + + +del LazyLLMRegisterMetaClass # noqa F821 +del LazyLLMRegisterMetaABCClass # noqa F821 +del _get_base_cls_from_registry # noqa F821 +del patch_os_env + + +__all__ = [ + # components + 'LazyLLMDataprocBase', # + 'LazyLLMFinetuneBase', # finetune + 'LazyLLMDeployBase', # deploy + 'LazyLLMValidateBase', # + 'component_register', + 'Prompter', + 'AlpacaPrompter', + 'ChatPrompter', + 'FastapiApp', + 'JsonFormatter', + 'FileFormatter', + + # launcher + 'LazyLLMLaunchersBase', # empty, slurm, sco + + # configs + 'Mode', + + # module + 'ModuleBase', + 'Module', + 'UrlModule', + 'TrainableModule', + 'ActionModule', + 'ServerModule', + 'WebModule', + 'TrialModule', + 'module_register', + 'OnlineChatModule', + 'OnlineEmbeddingModule', + 'OnlineMultiModalModule', + 'AutoModel', + + # hook + 'LazyLLMHook', + 'LazyLLMFuncHook', + + # tools + 'Document', + 'Retriever', + 'Reranker', + 'ToolManager', + 'FunctionCall', + 'FunctionCallAgent', + 'fc_register', + 'LLMParser', + 'ReactAgent', + 'PlanAndSolveAgent', + 'ReWOOAgent', + 'SentenceSplitter', + + # docs + 'add_doc', +] + +__all__ += common.__all__ # noqa F405 +__all__ += flow.__all__ # noqa F405 diff --git "a/\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/cli/README.md" "b/\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/cli/README.md" new file mode 100644 index 0000000..0b4b640 --- /dev/null +++ "b/\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/cli/README.md" @@ -0,0 +1,56 @@ +# LazyLLM Deploy + +LazyLLM Deploy is a command-line tool for deploying large language models. + +## Installation + +```bash +pip install lazyllm +``` + +## Usage + + +```bash +lazyllm deploy {model_name} [options] +``` + +## Examples + +```bash +# Start a basic service +lazyllm deploy llama2 --port=8000 + +# Use tensor parallelism +lazyllm deploy llama2 --tp=2 +``` + +## VLLM Parameter Restriction Policy + +For VLLM deployments, we implement a parameter restriction strategy that limits the use of parameters to only those that are explicitly supported. To bypass parameter restrictions and utilize all VLLM-supported parameters, set the following environment variable: + +```bash +export LAZYLLM_VLLM_SKIP_CHECK_KW=True +``` + +### Parameter Restriction Overview + +- **Default Behavior**: Only validated and safe parameters are permitted, ensuring deployment stability and compatibility +- **Bypass Restrictions**: After setting the environment variable, all VLLM-supported parameters become available +- **Important Considerations**: When restrictions are bypassed, users are responsible for ensuring parameter correctness + +### Usage Examples + +```bash +# Using default parameter restrictions +lazyllm deploy llama2 --framework=vllm --tp=2 --max_model_len=4096 + +# Bypassing parameter restrictions to use all VLLM parameters +export LAZYLLM_VLLM_SKIP_CHECK_KW=True +lazyllm deploy llama2 --framework=vllm --tp=2 --custom_vllm_param=value +``` + +## Notes + +- Ensure all required dependencies are installed before deployment +- Adjust parameter configurations based on available hardware resources diff --git "a/\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/cli/__init__.py" "b/\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/cli/__init__.py" new file mode 100644 index 0000000..e69de29 diff --git "a/\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/cli/deploy.py" "b/\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/cli/deploy.py" new file mode 100644 index 0000000..c0c648c --- /dev/null +++ "b/\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/cli/deploy.py" @@ -0,0 +1,125 @@ +import os +import time +import argparse +import asyncio + +import lazyllm + + +def deploy(commands): + if commands and commands[0] == 'mcp_server': + commands = commands[1:] + parser = argparse.ArgumentParser( + description='lazyllm deploy command for deploying an MCP server.', + epilog=( + 'Examples:\n' + ' lazyllm deploy mcp_server uvx mcp-server-fetch\n' + ' lazyllm deploy mcp_server -e GITHUB_PERSONAL_ACCESS_TOKEN your_token ' + '--sse-port 8080 npx -- -y @modelcontextprotocol/server-github' + ), + formatter_class=argparse.RawTextHelpFormatter, + ) + parser.add_argument('command', help='Command to spawn the server. Do not provide an HTTP URL.') + parser.add_argument('args', nargs='*', help='Extra arguments for the command to spawn the server') + parser.add_argument('-e', '--env', nargs=2, action='append', metavar=('KEY', 'VALUE'), + help='Environment variables for spawning the server. Can be used multiple times.', + default=[]) + parser.add_argument('--pass-environment', action=argparse.BooleanOptionalAction, + help='Pass through all environment variables when spawning the server.', + default=False) + parser.add_argument('--sse-port', type=int, default=0, + help='Port to expose an SSE server on. Default is a random port') + parser.add_argument('--sse-host', default='127.0.0.1', + help='Host to expose an SSE server on. Default is 127.0.0.1') + parser.add_argument( + '--allow-origin', + nargs='+', + default=[], + help='Allowed origins for the SSE server. Can be used multiple times. Default is no CORS allowed.' + ) + args = parser.parse_args(commands) + + env = {} + if args.pass_environment: + env.update(os.environ) + env.update(dict(args.env)) + + lazyllm.LOG.debug('Starting stdio client and SSE server') + + from lazyllm.tools.mcp.deploy import SseServerSettings + client = lazyllm.tools.MCPClient(command_or_url=args.command, args=args.args, env=env) + asyncio.run( + client.deploy( + sse_settings=SseServerSettings( + bind_host=args.sse_host, + port=args.sse_port, + allow_origins=args.allow_origin, + ) + ) + ) + elif commands and commands[0] == 'mineru': + commands = commands[1:] + parser = argparse.ArgumentParser(description='lazyllm deploy command for deploying a mineru server.') + parser.add_argument('--port', help='Port for the mineru server.', default=None) + parser.add_argument('--cache_dir', help='Cache directory for the mineru server.', default=None) + parser.add_argument('--image_save_dir', help='Image save directory for the mineru server.', default=None) + parser.add_argument('--default_backend', help='Default backend for the mineru server.\ + (pipeline|vlm-vllm-async-engine|vlm-transformers)', default='pipeline') + parser.add_argument('--model_source', help='Model source for the mineru server.(huggingface|modelscope)', + default='huggingface') + args = parser.parse_args(commands) + os.environ['MINERU_MODEL_SOURCE'] = args.model_source + + lazyllm.LOG.info('Starting mineru server') + lazyllm.LOG.info(f'Current model source: {args.model_source}') + from lazyllm.tools.servers.mineru import MineruServer + server = MineruServer( + cache_dir=args.cache_dir, + image_save_dir=args.image_save_dir, + default_backend=args.default_backend, + port=args.port, + ) + server.start() + server.wait() + elif commands and commands[0] == 'graphrag': + commands = commands[1:] + parser = argparse.ArgumentParser(description='lazyllm deploy command for deploying a graphrag server.') + parser.add_argument('--kg_dir', help='graphrag knowledge graph directory', required=True, default=None) + args = parser.parse_args(commands) + + lazyllm.LOG.info('Starting graphrag server') + from lazyllm.tools.servers.graphrag_server_module import GraphRagServerModule + server = GraphRagServerModule(kg_dir=args.kg_dir) + server.start() + server.wait() + else: + parser = argparse.ArgumentParser(description='lazyllm deploy command for deploying a model.') + parser.add_argument('model', help='model name') + parser.add_argument('--framework', help='deploy framework', default='auto', + choices=['auto', 'vllm', 'lightllm', 'lmdeploy', 'infinity', 'embedding', 'mindie']) + parser.add_argument('--chat', help='chat ', default='false', + choices=['ON', 'on', '1', 'true', 'True', 'OFF', 'off', '0', 'False', 'false']) + + args, unknown = parser.parse_known_args(commands) + kwargs = {'options_keys': []} + for arg in unknown: + assert arg.startswith('--'), f'Argument {arg} must start with --' + key = arg[2:] + if '=' in key: + key, value = key.split('=', 1) + kwargs[key] = value + else: + kwargs['options_keys'].append(key) + + lazyllm.LOG.debug(f'Use arguments: {kwargs}') + t = lazyllm.TrainableModule(args.model).deploy_method(getattr(lazyllm.deploy, args.framework), **kwargs) + if args.chat in ['ON', 'on', '1', 'true', 'True']: + t = lazyllm.WebModule(t) + t.start() + if args.chat in ['ON', 'on', '1', 'true', 'True']: + t.wait() + else: + lazyllm.LOG.success(f'LazyLLM TrainableModule launched successfully:\n URL: {t._url}\n ' + f'Framework: {t._deploy_type.__name__}') + while True: + time.sleep(10) diff --git "a/\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/cli/install.py" "b/\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/cli/install.py" new file mode 100644 index 0000000..f859046 --- /dev/null +++ "b/\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/cli/install.py" @@ -0,0 +1,214 @@ +import sys +import subprocess +import toml +import requests +import platform +import os +import argparse +import importlib.metadata +import logging + +from collections import OrderedDict + +_PYPROJECT_CACHE = None +PYPROJECT_TOML_URL = 'https://raw.githubusercontent.com/LazyAGI/LazyLLM/main/pyproject.toml' +UNSUPPORTED_ON_DARWIN_WIN = [ + 'full', 'standard', 'fintune-all', 'alpaca-lora', 'colie', 'llama-factory', 'deploy-all', 'vllm', + 'lmdeploy', 'lightllm', 'infinity' +] + +def load_pyproject_from_lazyllm_path(): + try: + import lazyllm + lazyllm_path = lazyllm.__path__[0] # Get the path of the lazyllm package + pyproject_path = os.path.join(lazyllm_path, 'pyproject.toml') + if os.path.exists(pyproject_path): + with open(pyproject_path, 'r') as f: + return toml.load(f) + else: + return None + except (FileNotFoundError, toml.TomlDecodeError): + logging.error('Could not find or parse pyproject.toml in lazyllm path.') + return None + +def load_local_pyproject(): + try: + with open('pyproject.toml', 'r') as f: + return toml.load(f) + except (FileNotFoundError, toml.TomlDecodeError): + logging.error('Could not find or parse the local pyproject.toml file.') + sys.exit(1) + +def load_remote_pyproject(): + try: + response = requests.get(PYPROJECT_TOML_URL) + response.raise_for_status() + return toml.loads(response.text) + except (requests.RequestException, toml.TomlDecodeError) as e: + logging.error(f'Failed to download or parse remote pyproject.toml file: {e}') + sys.exit(1) + +def load_pyproject(): + global _PYPROJECT_CACHE + if _PYPROJECT_CACHE is not None: + return _PYPROJECT_CACHE + for loader in (load_pyproject_from_lazyllm_path, load_local_pyproject, load_remote_pyproject): + cfg = loader() + if cfg: + _PYPROJECT_CACHE = cfg + return cfg + sys.exit(1) + +def load_extras(): + config = load_pyproject() + try: + return config['tool']['poetry']['extras'] + except KeyError: + logging.error('No "extras" information found in the pyproject.toml file.') + sys.exit(1) + +def load_dependencies(): + config = load_pyproject() + try: + return config['tool']['poetry']['dependencies'] + except KeyError: + logging.error('No "dependencies" information found in the pyproject.toml file.') + sys.exit(1) + +def load_extras_descriptions(): + config = load_pyproject() + try: + return config['tool']['lazyllm']['extras_descriptions'] + except KeyError: + logging.error('No "extras_descriptions" information found in the pyproject.toml file.') + sys.exit(1) + +def install_packages(packages): + if isinstance(packages, str): + packages = [packages] + try: + subprocess.check_call([sys.executable, '-m', 'pip', 'install'] + packages) + except subprocess.CalledProcessError as e: + logging.error(f'安装失败: {e}') + sys.exit(1) + +def parse_caret_to_tilde_version(version): + if version.startswith('^'): + version_parts = version[1:].split('.') + if len(version_parts) > 1: + return f'~={version_parts[0]}.{version_parts[1]}' + else: + return f'~={version_parts[0]}' + return version + +def process_package(package_name_with_version, dependencies): + if '==' in package_name_with_version: + package_name, _ = package_name_with_version.split('==', 1) + package_name = package_name.strip() + else: + package_name = package_name_with_version + if package_name in dependencies: + version_spec = dependencies[package_name] + if isinstance(version_spec, dict): + version_spec = version_spec.get('version', '') + elif isinstance(version_spec, str): + version_spec = version_spec.strip() + if version_spec == '*' or version_spec == '': + return package_name + elif version_spec.startswith('^'): + version_spec = parse_caret_to_tilde_version(version_spec) + return f'{package_name}{version_spec}' + else: + logging.error(f'Error: Package "{package_name}" is not listed in the "dependencies" section of pyproject.toml.') + sys.exit(1) + +def install_multiple_packages(package_names_with_versions): + dependencies = load_dependencies() + packages_to_install = [] + for package in package_names_with_versions: + package_with_version = process_package(package, dependencies) + packages_to_install.append(package_with_version) + install_packages(packages_to_install) + +def install_mineru(): + try: + subprocess.check_call([sys.executable, '-m', 'pip', 'install', '--upgrade', 'pip', '-i', + 'https://mirrors.aliyun.com/pypi/simple/']) + subprocess.check_call([sys.executable, '-m', 'pip', 'install', 'uv', '-i', + 'https://mirrors.aliyun.com/pypi/simple/']) + subprocess.check_call([sys.executable, '-m', 'uv', 'pip', 'install', + 'mineru[all]==2.5.4', '-i', 'https://mirrors.aliyun.com/pypi/simple/']) + except subprocess.CalledProcessError as e: + logging.error(f'Mineru installation failed: {e}') + sys.exit(1) + +def install(commands): # noqa C901 + extras_desc = load_extras_descriptions() + epilog_lines = ['Supported extras groups:'] + for name, desc in extras_desc.items(): + epilog_lines.append(f' {name:<15} {desc}') + epilog = '\n'.join(epilog_lines) + + parser = argparse.ArgumentParser( + prog='lazyllm install', + description='Install one or more extras groups or individual packages', + formatter_class=argparse.RawDescriptionHelpFormatter, + epilog=epilog + ) + parser.add_argument( + 'items', + nargs='+', + metavar='ITEM', + help='Extras group(s) or package name(s) to install' + ) + args = parser.parse_args(commands) + items = args.items + + if platform.system() in ['Darwin', 'Windows'] and \ + any(i in UNSUPPORTED_ON_DARWIN_WIN for i in items): + logging.error('Extras for finetune/local inference are not supported on macOS/Windows.') + sys.exit(1) + + extras = load_extras() # dict of extras + deps = load_dependencies() # dict of dependencies + to_install = OrderedDict() + + if 'mineru' in items: + install_mineru() + items.remove('mineru') + + for cmd in items: + if cmd in extras: + for pkg in extras[cmd]: + spec = process_package(pkg, deps) + to_install[spec] = None + else: + spec = process_package(cmd, deps) + to_install[spec] = None + + if not to_install: + logging.error('No packages to install, please check your command.') + sys.exit(1) + + pkgs = list(to_install.keys()) + filtered_pkgs = [p for p in pkgs if not p.startswith('flash-attn')] + + if filtered_pkgs: + install_packages(filtered_pkgs) + + extra_pkgs = set() + + for p in pkgs: + if p.startswith('flash-attn'): + try: + tc_ver = importlib.metadata.version('torch') + except importlib.metadata.PackageNotFoundError: + pass + else: + if tc_ver == '2.7.1': + extra_pkgs.add('flash-attn==2.8.0.post2') + else: + extra_pkgs.add(p) + + if extra_pkgs: + install_packages(list(extra_pkgs)) diff --git "a/\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/cli/main.py" "b/\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/cli/main.py" new file mode 100644 index 0000000..67a6ea3 --- /dev/null +++ "b/\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/cli/main.py" @@ -0,0 +1,32 @@ +import sys +try: + from install import install + from deploy import deploy + from run import run +except ImportError: + from .install import install + from .deploy import deploy + from .run import run +import logging + +def main(): + def exit(): + logging.error('Usage:\n lazyllm install ...\n' + ' lazyllm deploy modelname\n lazyllm deploy mcp_server [args ...] [options]\n' + ' lazyllm run graph.json\n lazyllm run chatbot\n lazyllm run rag\n') + sys.exit(1) + + if len(sys.argv) <= 1: exit() + + commands = sys.argv[2:] + if sys.argv[1] == 'install': + install(commands) + elif sys.argv[1] == 'deploy': + deploy(commands) + elif sys.argv[1] == 'run': + run(commands) + else: + exit() + +if __name__ == '__main__': + main() diff --git "a/\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/cli/run.py" "b/\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/cli/run.py" new file mode 100644 index 0000000..1bd510d --- /dev/null +++ "b/\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/cli/run.py" @@ -0,0 +1,102 @@ +import sys +import argparse +import json + +import lazyllm +import logging + +from lazyllm import pipeline, parallel, bind, SentenceSplitter, Document, Retriever, Reranker +from lazyllm.engine.lightengine import LightEngine +from lazyllm.tools.train_service.serve import TrainServer +from lazyllm.tools.infer_service.serve import InferServer + +# lazyllm run xx.json / xx.dsl / xx.lazyml +# lazyllm run chatbot --model=xx --framework=xx --source=xx +# lazyllm run rag --model=xx --framework=xx --source=xx --documents='' + +def chatbot(llm): + lazyllm.WebModule(llm, port=range(20000, 25000)).start().wait() + +def rag(llm, docpath): + prompt = ('You will play the role of an AI Q&A assistant and complete a dialogue task. In this ' + 'task, you need to provide your answer based on the given context and question.') + + documents = Document(dataset_path=docpath, embed=lazyllm.OnlineEmbeddingModule(), manager=False) + documents.create_node_group(name='sentences', transform=SentenceSplitter, chunk_size=1024, chunk_overlap=100) + + with pipeline() as ppl: + with parallel().sum as ppl.prl: + ppl.prl.retriever1 = Retriever(documents, group_name='sentences', similarity='cosine', topk=3) + ppl.prl.retriever2 = Retriever(documents, 'CoarseChunk', 'bm25_chinese', 0.003, topk=3) + + ppl.reranker = Reranker('ModuleReranker', model='bge-reranker-large', topk=1) | bind(query=ppl.input) + ppl.formatter = (lambda nodes, query: dict(context_str=''.join([node.get_content() for node in nodes]), + query=query)) | bind(query=ppl.input) + ppl.llm = llm.prompt(lazyllm.ChatPrompter(prompt, extra_keys=['context_str'])) + + lazyllm.WebModule(ppl, port=range(20000, 25000)).start().wait() + +def graph(json_file): + with open(json_file) as fp: + engine_conf = json.load(fp) + + engine = LightEngine() + eid = engine.start(engine_conf.get('nodes', []), engine_conf.get('edges', []), + engine_conf.get('resources', [])) + while True: + query = input('query(enter "quit" to exit): ') + if query == 'quit': + break + res = engine.run(eid, query) + print(f'answer: {res}') # noqa print + +def training_service(): + train_server = TrainServer() + local_server = lazyllm.ServerModule(train_server, launcher=lazyllm.launcher.EmptyLauncher(sync=False)) + local_server.start() + local_server() + local_server.wait() + +def infer_service(): + infer_server = InferServer() + local_server = lazyllm.ServerModule(infer_server, launcher=lazyllm.launcher.EmptyLauncher(sync=False)) + local_server.start() + local_server() + local_server.wait() + +def run(commands): + if not commands: + logging.error('Usage:\n lazyllm run graph.json\n lazyllm run chatbot\n ' + 'lazyllm run rag\n lazyllm run training_service\n ' + 'lazyllm run infer_service\n') + + parser = argparse.ArgumentParser(description='lazyllm deploy command') + parser.add_argument('command', type=str, help='command') + + args, _ = parser.parse_known_args(commands) + + if args.command in ('chatbot', 'rag'): + parser.add_argument('--model', type=str, default=None, help='model name') + parser.add_argument('--source', type=str, default=None, help='Online model source, conflict with framework', + choices=['openai', 'sensenova', 'glm', 'kimi', 'qwen', 'doubao']) + parser.add_argument('--framework', type=str, default=None, help='Online model source, conflict with source', + choices=['lightllm', 'vllm', 'lmdeploy']) + if args.command == 'rag': + parser.add_argument('--documents', required=True, type=str, help='document absolute path') + + args = parser.parse_args(commands) + llm = lazyllm.AutoModel(args.model, args.source, args.framework) + + if args.command == 'chatbot': + chatbot(llm) + elif args.command == 'rag': + rag(llm, args.documents) + elif args.command.endswith('.json'): + graph(args.command) + elif args.command == 'training_service': + training_service() + elif args.command == 'infer_service': + infer_service() + else: + logging.error('lazyllm run is not ready yet.') + sys.exit(0) diff --git "a/\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/common/__init__.py" "b/\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/common/__init__.py" new file mode 100644 index 0000000..516a13b --- /dev/null +++ "b/\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/common/__init__.py" @@ -0,0 +1,105 @@ +from .logger import LOG +from .common import package, kwargs, arguments, LazyLLMCMD, timeout, final, ReadOnlyWrapper, DynamicDescriptor, override +from .common import FlatList, Identity, ResultCollector, ArgsDict, CaseInsensitiveDict +from .common import ReprRule, make_repr, modify_repr, is_valid_url, is_valid_path, SingletonMeta, SingletonABCMeta +from .common import once_flag, call_once, once_wrapper, singleton, reset_on_pickle, Finalizer +from .text import Color, colored_text +from .option import Option, OptionIter +from .threading import Thread, ThreadPoolExecutor +from .multiprocessing import SpawnProcess, ForkProcess, ProcessPoolExecutor +from .registry import LazyLLMRegisterMetaClass, LazyLLMRegisterMetaABCClass, _get_base_cls_from_registry, Register +from .redis_client import redis_client +from .deprecated import deprecated +from .globals import globals, locals, LazyLlmResponse, LazyLlmRequest, encode_request, decode_request +from .bind import root, Bind as bind, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, Placeholder +from .queue import FileSystemQueue +from .utils import compile_func, obj2str, str2obj, str2bool, dump_obj, load_obj + +__all__ = [ + # registry + 'LazyLLMRegisterMetaClass', + 'LazyLLMRegisterMetaABCClass', + '_get_base_cls_from_registry', + 'Register', + + # utils + 'FlatList', + 'ReadOnlyWrapper', + 'Identity', + 'ResultCollector', + 'ArgsDict', + 'CaseInsensitiveDict', + 'timeout', + 'final', + 'deprecated', + 'compile_func', + 'DynamicDescriptor', + 'singleton', + 'reset_on_pickle', + 'Color', + 'colored_text', + 'obj2str', + 'str2obj', + 'str2bool', + 'dump_obj', + 'load_obj', + 'is_valid_url', + 'is_valid_path', + 'SingletonMeta', + 'SingletonABCMeta', + 'Finalizer', + 'redis_client', + + # arg praser + 'LazyLLMCMD', + 'package', + 'kwargs', + 'arguments', + 'override', + + # option + 'Option', + 'OptionIter', + + # globals + 'globals', + 'locals', + 'LazyLlmResponse', + 'LazyLlmRequest', + 'encode_request', + 'decode_request', + + # multiprocessing + 'ForkProcess', + 'SpawnProcess', + 'ProcessPoolExecutor', + + # threading + 'Thread', + 'ThreadPoolExecutor', + + # bind + 'bind', 'root', + '_0', '_1', '_2', '_3', '_4', + '_5', '_6', '_7', '_8', '_9', + 'Placeholder', + + # call_once + 'once_flag', + 'call_once', + 'once_wrapper', + + # subprocess + 'SpawnProcess', 'ForkProcess', + + # representation + 'ReprRule', + 'make_repr', + 'modify_repr', + + # log + 'LOG', + + # file-system queue + 'FileSystemQueue' +] diff --git "a/\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/common/bind.py" "b/\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/common/bind.py" new file mode 100644 index 0000000..20d8b18 --- /dev/null +++ "b/\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/common/bind.py" @@ -0,0 +1,155 @@ +import copy +import builtins +import itertools +from typing import Callable, Any, Optional, List +from .globals import locals +from .common import package + + +class AttrTree(object): + def __init__(self, name: Optional[str] = None, pres: Optional[List[str]] = None): + self._path = copy.deepcopy(pres or []) + if name is not None: + self._path.append(name) + + def __str__(self): + return '.'.join(self._path) + + def __getattr__(self, name): + v = __class__(name, pres=self._path) + setattr(self, name, v) + return v + + def get_from(self, obj): + v = obj + for name in self._path: + v = getattr(v, name) + return v + + def __deepcopy__(self, memo): + return self + +root = AttrTree() + + +class Placeholder(object): + _pool = dict() + + def __new__(cls, idx): + if idx not in Placeholder._pool: + Placeholder._pool[idx] = super().__new__(cls) + return Placeholder._pool[idx] + + def __init__(self, idx): + assert isinstance(idx, int) + self.idx = idx + + def __deepcopy__(self, memo=None): + return self + + def __repr__(self): + return f'placeholder._{self.idx}' + + def __reduce__(self) -> tuple[Any, ...]: + return Placeholder.__new__, (Placeholder, self.idx) + +for i in range(10): + vars()[f'_{i}'] = Placeholder(i) + +def _setattr(self, key, v): + raise RuntimeError(f'Cannot set attr for Placeholder, you want to set {key}={v}') +Placeholder.__setattr__ = _setattr + + +class _MetaBind(type): + def __instancecheck__(self, __instance): + if isinstance(__instance, Bind) and isinstance(__instance._f, self): + return True + return super(__class__, self).__instancecheck__(__instance) + + +class Bind(object): + class _None: pass + + class Args(object): + class _None: pass + class Unpack(package): pass + + def __init__(self, source_id: str, target_id: str = 'input', *, unpack: bool = False): + self._item_key, self._attr_key = Bind.Args._None, Bind.Args._None + self._source_id, self._target_id = source_id, target_id + self._unpack = unpack + + def __getitem__(self, key: str): + self._item_key = key + return self + + def __getattr__(self, key: str): + if key.startswith('__') and key.endswith('__'): + raise AttributeError(f'Args has no attribute {key}') + self._attr_key = key + return self + + def __getstate__(self): + return self._item_key, self._attr_key, self._source_id, self._target_id + + def __setstate__(self, state): + self._item_key, self._attr_key, self._source_id, self._target_id = state + + def get_arg(self, source): + if (not source or self._source_id != source['source']) and self._source_id in locals['bind_args']: + source = locals['bind_args'][self._source_id] + if not source or source['source'] != self._source_id: + raise RuntimeError('Unable to find the bound parameter, possibly due to pipeline.input/output can only ' + 'be bind in direct member of pipeline! You may solve this by defining the pipeline ' + 'in a `with lazyllm.save_pipeline_result():` block.') + input = result = source[self._target_id] + source = source['source'] + if self._item_key is not Bind.Args._None: result = input[self._item_key] + elif self._attr_key is not Bind.Args._None: result = getattr(input, self._attr_key) + if self._unpack and isinstance(result, package): result = Bind.Args.Unpack(result) + return result + + def __init__(self, __bind_func=_None, *args, **kw): + self._f = __bind_func() if isinstance(__bind_func, type) and __bind_func is not Bind._None else __bind_func + self._args = args + self._kw = kw + self._has_root = (any([isinstance(a, AttrTree) for a in args]) + or any([isinstance(v, AttrTree) for v in kw.values()])) + + def __ror__(self, __value: Callable): + if self._f is not Bind._None: self._args = (self._f,) + self._args + self._f = __value + return self + + # _bind_args_source: dict(input=input, args=dict(key=value)) + def __call__(self, *args, _bind_args_source=None, **kw): + if self._f is None: return None + keys = set(kw.keys()).intersection(set(self._kw.keys())) + assert len(keys) == 0, f'Keys `{keys}` are already bind!' + bind_args = args if len(self._args) == 0 else ( + [args[a.idx] if isinstance(a, Placeholder) else a for a in self._args]) + kwargs = {k: args[v.idx] if isinstance(v, Placeholder) else v for k, v in self._kw.items()} + bind_args = [a.get_arg(_bind_args_source) if isinstance(a, Bind.Args) else a for a in bind_args] + bind_args = list(itertools.chain.from_iterable(x if isinstance(x, Bind.Args.Unpack) else [x] for x in bind_args)) + kwargs = {k: v.get_arg(_bind_args_source) if isinstance(v, Bind.Args) else v for k, v in kwargs.items()} + return self._f(*bind_args, **kwargs, **kw) + + # TODO: modify it + def __repr__(self) -> str: + return self._f.__repr__() + '(bind args:{})'.format( + ', '.join([repr(a) if a is not self else 'self' for a in self._args])) + + def __getattr__(self, name): + # name will be '_f' in copy.deepcopy + if name != '_f': + return getattr(self._f, name) + return super(__class__, self).__getattr__(name) + + def __setattr__(self, __name: str, __value: Any) -> None: + if __name not in ('_f', '_args', '_kw', '_has_root'): + return setattr(self._f, __name, __value) + return super(__class__, self).__setattr__(__name, __value) + + +builtins.bind = Bind diff --git "a/\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/common/common.py" "b/\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/common/common.py" new file mode 100644 index 0000000..9af1575 --- /dev/null +++ "b/\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/common/common.py" @@ -0,0 +1,500 @@ +from abc import ABCMeta +import re +import os +import builtins +import typing +from typing import Any, Callable, Optional, List, Dict +from contextlib import contextmanager +import copy +import threading +import types +import json +from ..configs import config +from urllib.parse import urlparse + +try: + from typing import final +except ImportError: + _F = typing.TypeVar('_F', bound=Callable[..., Any]) + def final(f: _F) -> _F: return f + +try: + from typing import override +except ImportError: + def override(func: Callable): + return func + + +class FlatList(list): + def absorb(self, item): + if isinstance(item, list): + self.extend(item) + elif item is not None: + self.append(item) + + +class ArgsDict(dict): + def __init__(self, *args, with_line=True, **kwargs): + super(ArgsDict, self).__init__(*args, **kwargs) + self._with_line = with_line + + def check_and_update(self, kw): + if not kw.pop('skip_check', config['deploy_skip_check_kw']): + assert set(kw.keys()).issubset(set(self)), f'unexpected keys: {set(kw.keys()) - set(self)}' + self.update(kw) + + def parse_kwargs(self): + string = [] + for k, v in self.items(): + if type(v) is dict: + v = json.dumps(v).replace('\"', '\\\"') + if self._with_line: + string.append(f'--{k}={v}' if type(v) is not str else f'--{k}=\"{v}\"') + else: + string.append(f'{k}={v}' if type(v) is not str else f'{k}=\"{v}\"') + string = ' '.join(string) + return string + +class CaseInsensitiveDict(dict): + def __init__(self, *args, **kwargs): + super().__init__() + for key, value in dict(*args, **kwargs).items(): + assert isinstance(key, str) + self[key] = value + + def __getitem__(self, key): + assert isinstance(key, str) + return super().__getitem__(key.lower()) + + def __setitem__(self, key, value): + assert isinstance(key, str) + super().__setitem__(key.lower(), value) + + def __contains__(self, key): + assert isinstance(key, str) + return super().__contains__(key.lower()) + +# pack return value of modules used in pipeline / parallel. +# will unpack when passing it to the next item. +class package(tuple): + def __new__(cls, *args): + if len(args) == 1 and isinstance(args[0], (tuple, list, types.GeneratorType)): + return super(__class__, cls).__new__(cls, args[0]) + else: + return super(__class__, cls).__new__(cls, args) + + def __getitem__(self, key): + if isinstance(key, slice): + return package(super(__class__, self).__getitem__(key)) + return super(__class__, self).__getitem__(key) + + def __add__(self, __other): + return package(super().__add__(__other)) + + +class kwargs(dict): + pass + + +class arguments(object): + class _None: pass + + def __init__(self, args=_None, kw=_None) -> None: + self.args = package() if args is arguments._None else args + if not isinstance(self.args, package): self.args = package((self.args,)) + self.kw = kwargs() if kw is arguments._None else copy.copy(kw) + + def append(self, x): + args, kw = package(), kwargs() + if isinstance(x, package): + args = x + elif isinstance(x, kwargs): + kw = x + elif isinstance(x, arguments): + args, kw = x.args, x.kw + else: + args = package((x,)) + if args: self.args += args + if kw: + dup_keys = set(self.kw.keys()).intersection(set(kw.keys())) + assert len(dup_keys) == 0, f'Duplicated keys: {dup_keys}' + self.kw.update(kw) + return self + + +builtins.package = package + + +class LazyLLMCMD(object): + def __init__(self, cmd, *, return_value=None, checkf=(lambda *a: True), no_displays=None): + if isinstance(cmd, (tuple, list)): + cmd = ' && '.join(cmd) + assert isinstance(cmd, str) or callable(cmd), 'cmd must be func or (list of) bash command str.' + self.cmd = cmd + self.return_value = return_value + self.checkf = checkf + self.no_displays = no_displays + + def __hash__(self): + return hash(self.cmd) + + def __str__(self): + assert not callable(self.cmd), f'Cannot convert cmd function {self.cmd} to str' + cmd = re.sub(r'\b(LAZYLLM_[A-Z0-9_]*?_(?:API|SECRET)_KEY)=\S+', r'\1=xxxxxx', self.cmd) + if self.no_displays: + for item in self.no_displays: + pattern = r'(-{1,2}' + re.escape(item) + r')(\s|=|)(\S+|)' + cmd = re.sub(pattern, '', cmd) + return cmd + else: + return cmd + + def with_cmd(self, cmd): + # Attention: Cannot use copy.deepcopy because of class method. + new_instance = LazyLLMCMD(cmd, return_value=self.return_value, + checkf=self.checkf, no_displays=self.no_displays) + return new_instance + + def get_args(self, key): + assert not callable(self.cmd), f'Cannot get args from function {self.cmd}' + pattern = r'*(-{1,2}' + re.escape(key) + r')(\s|=|)(\S+|)*' + return re.match(pattern, self.cmd)[3] + +class TimeoutException(Exception): + pass + +@contextmanager +def timeout(duration, *, msg=''): + def raise_timeout_exception(): + event.set() + + event = threading.Event() + timer = threading.Timer(duration, raise_timeout_exception) + timer.start() + + try: + yield + finally: + if not event.is_set(): + timer.cancel() + else: + raise TimeoutException(f'{msg}, block timed out after {duration} s') + + +class ReadOnlyWrapper(object): + def __init__(self, obj=None): + self.obj = obj + + def set(self, obj): + self.obj = obj + + def __getattr__(self, key): + # key will be 'obj' in copy.deepcopy + if key != 'obj' and self.obj is not None: + return getattr(self.obj, key) + return super(__class__, self).__getattr__(key) + + # TODO: modify it + def __repr__(self): + r = self.obj.__repr__() + return (f'{r[:-1]}' if r.endswith('>') else f'<{r}') + '(Readonly)>' + + def __deepcopy__(self, memo): + # drop obj + return ReadOnlyWrapper() + + def isNone(self): + return self.obj is None + + +class Identity(): + def __init__(self, *args, **kw): + pass + + def __call__(self, *inputs): + if len(inputs) == 1: + return inputs[0] + return package(*inputs) + + def __repr__(self): + return make_repr('Module', 'Identity') + + +class ResultCollector(object): + class Impl(object): + def __init__(self, name, value): self._name, self._value = name, value + + def __call__(self, *args, **kw): + assert (len(args) == 0) ^ (len(kw) == 0), f'args({len(args)}), kwargs({len(kw)})' + assert self._name is not None + if len(args) > 0: + self._value[self._name] = args[0] if len(args) == 1 else package(*args) + return self._value[self._name] + else: + self._value[self._name] = kw + return kwargs(kw) + + def __init__(self): self._value = dict() + def __call__(self, name): return ResultCollector.Impl(name, self._value) + def __getitem__(self, name): return self._value[name] + def __repr__(self): return repr(self._value) + def keys(self): return self._value.keys() + def items(self): return self._value.items() + + +class ReprRule(object): + rules = {} + + @classmethod + def add_rule(cls, cate, type, subcate, subtype=None): + if subtype: + cls.rules[f'{cate}:{type}'] = f'<{subcate} type={subtype}' + else: + cls.rules[f'{cate}:{type}'] = f'<{subcate}' + + @classmethod + def check_combine(cls, cate, type, subs): + return f'{cate}:{type}' in cls.rules and subs.startswith(cls.rules[f'{cate}:{type}']) + + +def rreplace(s, old, new, count): + return (s[::-1].replace(old[::-1], new[::-1], count))[::-1] + +def make_repr(category: str, type: str, *, name: Optional[str] = None, + subs: Optional[List[str]] = None, attrs: Optional[Dict[str, Any]] = None, **kw): + subs, attrs = subs or [], attrs or {} + if len(kw) > 0: + assert len(attrs) == 0, 'Cannot provide attrs and kwargs at the same time' + attrs = kw + + if not config['repr_show_child']: subs = [] + + if isinstance(type, builtins.type): type = type.__name__ + name = f' name={name}' if name else '' + attrs = ' ' + ' '.join([f'{k}={v}' for k, v in attrs.items()]) if attrs else '' + repr = f'<{category} type={type}{name}{attrs}>' + + if len(subs) == 1 and ReprRule.check_combine(category, type, subs[0]): + if config['repr_ml']: + sub_cate = re.split('>| ', subs[0][1:])[0] + subs = rreplace(subs[0], f'', f'', 1) + else: + subs = subs[0] + return repr[:-1] + f' sub-category={subs[1:]}' + + # ident + sub_repr = [] + for idx, value in enumerate(subs): + for i, v in enumerate(value.strip().split('\n')): + if not config['repr_ml']: + if idx != len(subs) - 1: + sub_repr.append(f' |- {v}' if i == 0 else f' | {v}') + else: + sub_repr.append(f' └- {v}' if i == 0 else f' {v}') + else: + sub_repr.append(f' {v}') + if len(sub_repr) > 0: repr += ('\n' + '\n'.join(sub_repr) + '\n') + if config['repr_ml']: repr += f'' + return repr + + +# if key is already in repr, then modify its value. +# if ket is not in repr, add key to repr with value. +# if value is None, remove key from repr. +def modify_repr(repr, key, value): + # TODO: impl this function + return repr + + +class once_flag(object): + def __init__(self, reset_on_pickle=False): + self._flag = False + self._exc = None + self._reset_on_pickle = reset_on_pickle + self._lock = threading.RLock() + self._ignore_reset = False + + def set(self, flag=True, ignore_reset=False): + with self._lock: + self._flag = flag + self._ignore_reset = ignore_reset + + def set_exception(self, exc): + self._exc = exc + + def reset(self): + if not self._ignore_reset: + self.set(False) + + def __bool__(self): + return self._flag + + @classmethod + def rebuild(cls, flag, reset_on_pickle): + r = cls(reset_on_pickle) + if not reset_on_pickle: r._flag = flag + return r + + def __reduce__(self): + return once_flag.rebuild, (self._flag, self._reset_on_pickle) + +def call_once(flag: once_flag, func: Callable, *args, **kw): + with flag._lock: + if not flag: + try: + return func(*args, **kw) + except Exception as e: + flag.set_exception(e) + finally: + flag.set() + if flag._exc: + raise flag._exc + return None + +def once_wrapper(reset_on_pickle): + flag = reset_on_pickle if isinstance(reset_on_pickle, bool) else False + + class Wrapper: + class Impl: + def __init__(self, func, instance): + self._func, self._instance = func, instance + flag_name = f'_lazyllm_{func.__name__}_once_flag' + if instance and not hasattr(instance, flag_name): setattr(instance, flag_name, once_flag(flag)) + + def __call__(self, *args, **kw): + assert self._instance is not None, f'{self._func} can only be used as instance method' + return call_once(self.flag, self._func, self._instance, *args, **kw) + + __doc__ = property(lambda self: self._func.__doc__) + def __repr__(self): return repr(self._func) + + @__doc__.setter + def __doc__(self, value): self._func.__doc__ = value + + @property + def flag(self) -> once_flag: + return getattr(self._instance, f'_lazyllm_{self._func.__name__}_once_flag') + + def __init__(self, func): + self.__func__ = func + + def __get__(self, instance, _): + return Wrapper.Impl(self.__func__, instance) + + return Wrapper if isinstance(reset_on_pickle, bool) else Wrapper(reset_on_pickle) + + +class DynamicDescriptor: + class Impl: + def __init__(self, func, instance, owner): + self._func, self._instance, self._owner = func, instance, owner + + def __call__(self, *args, **kw): + return self._func(self._instance, *args, **kw) if self._instance else self._func(self._owner, *args, **kw) + + def __repr__(self): return repr(self._func) + __doc__ = property(lambda self: self._func.__doc__) + + @__doc__.setter + def __doc__(self, value): self._func.__doc__ = value + + def __init__(self, func): + self.__func__ = func + + def __get__(self, instance, owner): + return DynamicDescriptor.Impl(self.__func__, instance, owner) + + +def singleton(cls): + instances = {} + + def get_instance(*args, **kwargs): + if cls not in instances: instances[cls] = cls(*args, **kwargs) + return instances[cls] + return get_instance + +def reset_on_pickle(*fields): + def decorator(cls): + original_getstate = cls.__getstate__ if hasattr(cls, '__getstate__') else lambda self: self.__dict__ + original_setstate = (cls.__setstate__ if hasattr(cls, '__setstate__') else + lambda self, state: self.__dict__.update(state)) + + def __getstate__(self): + state = original_getstate(self).copy() + for field, *_ in fields: + state[field] = None + return state + + def __setstate__(self, state): + original_setstate(self, state) + for field in fields: + field, field_type = field if isinstance(field, (tuple, list)) else (field, None) + if field in state and state[field] is None and field_type is not None: + setattr(self, field, field_type() if field_type else None) + + cls.__getstate__ = __getstate__ + cls.__setstate__ = __setstate__ + return cls + return decorator + +class EnvVarContextManager: + def __init__(self, env_vars_dict): + self.env_vars_dict = {var: value for var, value in env_vars_dict.items() if value is not None} + self.original_values = {} + + def __enter__(self): + for var, value in self.env_vars_dict.items(): + if var in os.environ: + self.original_values[var] = os.environ[var] + os.environ[var] = value + return self + + def __exit__(self, exc_type, exc_value, traceback): + for var in self.env_vars_dict: + if var in self.original_values: + os.environ[var] = self.original_values[var] + else: + del os.environ[var] + +def is_valid_url(url): + try: + result = urlparse(url) + return all([result.scheme, result.netloc]) + except ValueError: + return False + +def is_valid_path(path): + return os.path.isfile(path) + +class Finalizer(object): + def __init__(self, func1: Callable, func2: Optional[Callable] = None, *, condition: Callable = lambda: True): + if func2: + func1() + func1 = func2 + self._func = func1 + self._condition = condition + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, traceback): + self.__del__() + + def __del__(self): + if self._func: + if self._condition(): self._func() + self._func = None + +class SingletonMeta(type): + _instances = {} + _lock = threading.RLock() + + def __call__(cls, *args, **kwargs): + if cls not in cls._instances: + with cls._lock: + if cls not in cls._instances: + cls._instances[cls] = super().__call__(*args, **kwargs) + return cls._instances[cls] + + +class SingletonABCMeta(SingletonMeta, ABCMeta): pass diff --git "a/\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/common/deprecated.py" "b/\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/common/deprecated.py" new file mode 100644 index 0000000..130a627 --- /dev/null +++ "b/\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/common/deprecated.py" @@ -0,0 +1,43 @@ +from .logger import LOG +import functools +from typing import overload, Callable, Any + +@overload +def deprecated(msg: str) -> Callable[[Callable], Callable]: + ... + +@overload +def deprecated(func: Callable) -> Callable[[Any], Any]: + ... + +@overload +def deprecated(flag: bool, msg: str) -> Callable[[Any], Any]: + ... + +def deprecated(func_or_msg=None, item_name=''): + def impl(func): + msg = f'{func.__name__} is deprecated and will be removed in a future version.' + if isinstance(func_or_msg, str): msg += f' Use `{func_or_msg}` instead' + if isinstance(func, type): + orig_init = func.__init__ + + @functools.wraps(orig_init) + def new_init(self, *args, **kwargs): + LOG.warning(f'Class {msg}') + orig_init(self, *args, **kwargs) + + func.__init__ = new_init + return func + else: + @functools.wraps(func) + def new_func(*args, **kwargs): + LOG.warning(f'Function {msg}') + return func(*args, **kwargs) + return new_func + + if isinstance(func_or_msg, str): + return impl + elif isinstance(func_or_msg, bool): + if func_or_msg: LOG.warning(f'{item_name} is deprecated') + else: + return impl(func_or_msg) diff --git "a/\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/common/globals.py" "b/\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/common/globals.py" new file mode 100644 index 0000000..572bd0c --- /dev/null +++ "b/\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/common/globals.py" @@ -0,0 +1,301 @@ +import threading +import contextvars +import copy +from typing import Any, Tuple, Optional, List, Dict +import uuid +from pydantic import BaseModel as struct +from .common import package, kwargs, SingletonABCMeta +from .redis_client import redis_client +from .deprecated import deprecated +import asyncio +from .utils import obj2str, str2obj +from abc import abstractmethod + + +class ReadWriteLock(object): + def __init__(self): + self._read_ready = threading.Condition(threading.Lock()) + self._readers = 0 + + class ReadLock: + def __init__(self, rw_lock): + self.rw_lock = rw_lock + + def __enter__(self): + with self.rw_lock._read_ready: + self.rw_lock._readers += 1 + + def __exit__(self, exc_type, exc_value, traceback): + with self.rw_lock._read_ready: + self.rw_lock._readers -= 1 + if self.rw_lock._readers == 0: + self.rw_lock._read_ready.notify_all() + + class WriteLock: + def __init__(self, rw_lock): + self.rw_lock = rw_lock + + def __enter__(self): + self.rw_lock._read_ready.acquire() + while self.rw_lock._readers > 0: + self.rw_lock._read_ready.wait() + + def __exit__(self, exc_type, exc_value, traceback): + self.rw_lock._read_ready.release() + + def read_lock(self): + return self.ReadLock(self) + + def write_lock(self): + return self.WriteLock(self) + + def __deepcopy__(self, *args, **kw): + return ReadWriteLock() + + def __reduce__(self): + return ReadWriteLock, () + + +class ThreadSafeDict(dict): + def __init__(self, *args, **kw): + super(__class__, self).__init__(*args, **kw) + self._lock = ReadWriteLock() + + def __getitem__(self, key): + with self._lock.read_lock(): + return super(__class__, self).__getitem__(key) + + def __setitem__(self, key, value): + with self._lock.write_lock(): + return super(__class__, self).__setitem__(key, value) + + def __delitem__(self, key): + with self._lock.read_lock(): + return super(__class__, self).__delitem__(key) + + def __contains__(self, key): + with self._lock.read_lock(): + return super(__class__, self).__contains__(key) + + def get(self, key, __default=None): + with self._lock.read_lock(): + return super(__class__, self).get(key, __default) + + def keys(self): + with self._lock.read_lock(): + return super(__class__, self).keys() + + def values(self): + with self._lock.read_lock(): + return super(__class__, self).values() + + def items(self): + with self._lock.read_lock(): + return super(__class__, self).items() + + def update(self, *args, **kwargs): + with self._lock.write_lock(): + return super(__class__, self).update(*args, **kwargs) + + def clear(self): + with self._lock.write_lock(): + return super(__class__, self).clear() + + def pop(self, key, __default=None): + with self._lock.write_lock(): + return super(__class__, self).pop(key, __default) + + def __len__(self): + with self._lock.read_lock(): + return super(__class__, self).__len__() + + def __str__(self): + with self._lock.read_lock(): + return super(__class__, self).__str__() + + def __repr__(self): + with self._lock.read_lock(): + return super(__class__, self).__repr__() + + def __reduce__(self): + with self._lock.read_lock(): + return (self.__class__, (dict(self),)) + + +class Globals(metaclass=SingletonABCMeta): + __global_attrs__ = ThreadSafeDict(user_id=None, chat_history={}, global_parameters={}, bind_args={}, + tool_delimiter='<|tool_calls|>', lazyllm_files={}, usage={}, _lazyllm_agent={}) + + def __new__(cls, *args, **kw): + if cls is not Globals: return super().__new__(cls) + return RedisGlobals() if redis_client else MemoryGlobals() + + def __init__(self): + self.__sid = contextvars.ContextVar('local_var') + self._init_sid() + + def _init_sid(self, sid: Optional[str] = None): + if sid is None: + try: + sid = f'aid-{hex(id(asyncio.current_task()))}' + except Exception: + sid = f'tid-{hex(threading.get_ident())}' + self.__sid.set(sid) + return sid + + @property + def _sid(self) -> str: + try: + sid = self.__sid.get() + except Exception: + sid = self._init_sid() + return sid + + @property + def _data(self): return self._get_data() + + def get(self, __key: str, default: Any = None): + try: + return self[__key] + except KeyError: + return default + + def __setattr__(self, __name: str, __value: Any): + if __name in type(self).__global_attrs__: + self[__name] = __value + else: + super(__class__, self).__setattr__(__name, __value) + + def __getattr__(self, __name: str) -> Any: + if __name in type(self).__global_attrs__: + return self[__name] + raise AttributeError(f'Attr {__name} not found in globals') + + @abstractmethod + def _get_data(self, rois: Optional[List[str]] = None) -> dict: ... + @abstractmethod + def _update(self, d: Optional[Dict]) -> None: ... + @abstractmethod + def __setitem__(self, __key: str, __value: Any): ... + @abstractmethod + def __getitem__(self, __key: str): ... + @abstractmethod + def clear(self): ... + @abstractmethod + def _clear_all(self): ... + @abstractmethod + def __contains__(self, item): ... + @abstractmethod + def pop(self, *args, **kw): ... + + @property + def pickled_data(self): + return obj2str(self._data) + + def unpickle_and_update_data(self, data: Optional[str]) -> dict: + if data: self._data.update(str2obj(data)) + + def __reduce__(self): + return __class__, () + +class MemoryGlobals(Globals): + def __init__(self): + self.__data = ThreadSafeDict() + super(__class__, self).__init__() + + @property + def _sid(self) -> str: + if (sid := super(__class__, self)._sid) not in self.__data: + self.__data[sid] = copy.deepcopy(type(self).__global_attrs__) + return sid + + def _get_data(self, rois: Optional[List[str]] = None) -> dict: + if rois: + assert isinstance(rois, (tuple, list)) + return {k: v for k, v in self.__data[self._sid].items() if k in rois} + return self.__data[self._sid] + + def _update(self, d: Optional[Dict]) -> None: + if d: + self._data.update(d) + + def __setitem__(self, __key: str, __value: Any): + self._data[__key] = __value + + def __getitem__(self, __key: str): + try: + return self._data[__key] + except KeyError: + raise KeyError(f'Cannot find key {__key}, current session-id is {self._sid}') from None + + def clear(self): + self.__data.pop(self._sid, None) + + def _clear_all(self): + self.__data.clear() + + def __contains__(self, item): + return item in self.__data[self._sid] + + def pop(self, *args, **kw): + return self._data.pop(*args, **kw) + + +class RedisGlobals(MemoryGlobals): + def __init__(self): + super().__init__() + self._redis_client = redis_client['globals'] + + def _get_redis_key(self, key: str): + return f'globals:{self._sid}@{key}' + + def pickled_data(self): + key = str(uuid.uuid4().hex) + self._redis_client.set(self._get_redis_key(key), obj2str(self._data)) + return key + + def unpickle_and_update_data(self, data: str) -> dict: + self._data.update(str2obj(self._redis_client.get(self._get_redis_key(data)))) + self._redis_client.delete(self._get_redis_key(data)) + +globals = Globals() + + +class Locals(MemoryGlobals): + __global_attrs__ = ThreadSafeDict(_lazyllm_agent={}) + + def __getitem__(self, __key: str): + try: + return super().__getitem__(__key) + except KeyError: pass # avoid `During handling of the above exception` for better bug-reporting experience + return globals[__key] + +locals = Locals() + + +@deprecated +class LazyLlmRequest(object): + input: Any = package() + kwargs: Any = kwargs() + global_parameters: dict = dict() + + +@deprecated +class LazyLlmResponse(struct): + messages: Any = None + trace: str = '' + err: Tuple[int, str] = (0, '') + + def __repr__(self): return repr(self.messages) + def __str__(self): return str(self.messages) + + +@deprecated('obj2str') +def encode_request(input): + return obj2str(input) + + +@deprecated('obj2str') +def decode_request(input, default=None): + if input is None: return default + return str2obj(input) diff --git "a/\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/common/logger.py" "b/\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/common/logger.py" new file mode 100644 index 0000000..964541b --- /dev/null +++ "b/\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/common/logger.py" @@ -0,0 +1,159 @@ +import inspect +import logging +from json import JSONDecodeError, loads +from os import getenv, getpid, listdir +import os +from os.path import join +from sys import stderr +from typing import Dict +from zipfile import ZipFile +import lazyllm +import platform +from .utils import check_path +from .common import call_once, once_flag + +from loguru import logger + +lazyllm.config.add('debug', bool, False, 'DEBUG', description='Whether to enable debug mode.') +lazyllm.config.add('log_name', str, 'lazyllm', 'LOG_NAME', description='The name of the log file.') +lazyllm.config.add('log_level', str, 'INFO', 'LOG_LEVEL', description='The level of the log.') +lazyllm.config.add( + 'log_format', + str, + '{process}: {time:YYYY-MM-DD HH:mm:ss} {extra[name]} ' + '{level}: ({name}:{line}) {message}', + 'LOG_FORMAT', + description='The format of the log.') +lazyllm.config.add('log_dir', str, os.path.join(os.path.expanduser(lazyllm.config['home']), 'logs'), 'LOG_DIR', + description='The directory of the log file.') +lazyllm.config.add('log_file_level', str, 'ERROR', 'LOG_FILE_LEVEL', description='The level of the log file.') +lazyllm.config.add('log_file_size', str, '4 MB', 'LOG_FILE_SIZE', description='The size of the log file.') +lazyllm.config.add('log_file_retention', str, '7 days', 'LOG_FILE_RETENTION', + description='The retention of the log file.') +lazyllm.config.add('log_file_mode', str, 'merge', 'LOG_FILE_MODE', description='The mode of the log file.') + + +class _Log: + _stderr_initialized = False + _once_flags: Dict = {} + __dynamic_attrs__ = ['debug', 'info', 'warning', 'error', 'success', 'critical'] + + def __init__(self): + self._name = lazyllm.config['log_name'] + self._pid = getpid() + self._log_dir_path = check_path(lazyllm.config['log_dir'], exist=False, file=False) + + if getenv('LOGURU_AUTOINIT', 'true').lower() in ('1', 'true') and stderr: + try: + logger.remove(0) + except ValueError: + pass + + if not _Log._stderr_initialized: + # A sink that will accumulate the log and output to stderr. + self.stderr: bool = bool(stderr) + self._stderr_i = logger.add( + stderr, + level=lazyllm.config['log_level'] if not lazyllm.config['debug'] else 'DEBUG', + format=lazyllm.config['log_format'], colorize=True, + filter=lambda record: (record['extra'].get('name') == self._name and self.stderr)) + _Log._stderr_initialized = True + + self._logger = logger.bind(name=self._name, process=self._pid) + + def log_once(self, message: str, level: str = 'warning') -> None: + frame = inspect.currentframe().f_back + context = (frame.f_code.co_filename, frame.f_code.co_name, frame.f_lineno) + if context not in self._once_flags: + self._once_flags[context] = once_flag() + # opt depth for printing correct stack depth information + call_once(self._once_flags[context], + getattr(self.opt(depth=2, record=True).bind(name=self._name), level), message) + + def read(self, limit: int = 10, level: str = 'error'): + names = listdir(self._log_dir_path) + lines = [] + for name in names: + if name.endswith('.json.log'): + with open(join(self._log_dir_path, name)) as file: + lines = file.readlines() + elif name.endswith('.json.log.zip'): + with ZipFile(name) as zip_file: + for n in zip_file.namelist(): + with zip_file.open(n, 'r') as file: + lines = file.readlines() + records = [] + if isinstance(level, str): + level = getattr(logging, level.upper()) + for line in lines: + try: + record = loads(line) + if record: + record = record['record'] + no = record['level']['no'] + if no >= level: + records.append(record) + except JSONDecodeError: + pass + records = sorted(records, key=lambda r: r['time']['timestamp']) + if limit > 0: + records = records[-limit:] + return records + + def __getattr__(self, attr): + def impl(*args, join: str = '\n', depth: int = 0, **kw): + s = str(args[0]) if len(args) == 1 else join.join([str(a) for a in args]) + getattr(self._logger.opt(depth=depth + 1, **kw), attr)(s) + + return impl if attr in self.__dynamic_attrs__ else getattr(self._logger, attr) + + def close(self): + logger.remove() + + def __reduce__(self): + return (self.__class__, ()) + + def __dir__(self): + return super().__dir__() + self.__dynamic_attrs__ + +LOG = _Log() + + +def add_file_sink(): + name = lazyllm.config['log_name'] + pid = getpid() + log_dir_path = LOG._log_dir_path + if log_dir_path: + log_file_mode = lazyllm.config['log_file_mode'] + if log_file_mode == 'merge': + log_file_name = f'{name}.json.log' + enqueue = True + elif log_file_mode == 'split': + log_file_name = f'{name}.{pid}.json.log' + enqueue = False + else: + raise ValueError(f'Unexpected log_file_mode: {log_file_mode}') + + log_file_path = join(log_dir_path, log_file_name) + LOG.add( + log_file_path, + level=lazyllm.config['log_file_level'], + format='{message}', + encoding='utf-8', + rotation=lazyllm.config['log_file_size'], + retention=lazyllm.config['log_file_retention'], + compression='zip', + delay=True, + enqueue=enqueue, # multiprocessing-safe + colorize=True, + serialize=True, + filter=lambda record: (record['extra'].get('name') == name), + ) + + +add_file_sink() + +if platform.system() != 'Windows': + os.register_at_fork( + after_in_child=add_file_sink, + ) diff --git "a/\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/common/multiprocessing.py" "b/\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/common/multiprocessing.py" new file mode 100644 index 0000000..960886f --- /dev/null +++ "b/\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/common/multiprocessing.py" @@ -0,0 +1,52 @@ +import multiprocessing +from contextlib import contextmanager +from concurrent.futures import ProcessPoolExecutor as PPE +import functools +import time +import atexit +from .utils import load_obj, dump_obj + +@contextmanager +def _ctx(method='spawn'): + m = multiprocessing.get_start_method() + if m != method: + multiprocessing.set_start_method(method, force=True) + yield + if m != method: + multiprocessing.set_start_method(m, force=True) + + +class SpawnProcess(multiprocessing.Process): + def start(self): + with _ctx('spawn'): + return super().start() + + +class ForkProcess(multiprocessing.Process): + def __init__(self, group=None, target=None, name=None, args=(), + kwargs=None, *, daemon=None, sync=True): + super().__init__(group, ForkProcess.work(target, sync), name, args, kwargs or {}, daemon=daemon) + + @staticmethod + def work(f, sync): + def impl(*args, **kw): + try: + f(*args, **kw) + if not sync: + while True: time.sleep(1) + finally: + atexit._run_exitfuncs() + return impl + + def start(self): + with _ctx('fork'): + return super().start() + + +def _worker(f): + return load_obj(f)() + +class ProcessPoolExecutor(PPE): + def submit(self, fn, /, *args, **kwargs): + f = dump_obj(functools.partial(fn, *args, **kwargs)) + return super(__class__, self).submit(_worker, f) diff --git "a/\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/common/option.py" "b/\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/common/option.py" new file mode 100644 index 0000000..b7a8ec8 --- /dev/null +++ "b/\344\275\234\345\223\201\346\217\220\344\272\244/used_car_export_agent/lazyllm/common/option.py" @@ -0,0 +1,70 @@ +from typing import Any +import copy +import multiprocessing +from .logger import LOG + + +class _OptionIterator(object): + def __init__(self, m): + self.m = m + self.reset() + + def reset(self): self.m._idx = -1 + def __len__(self): return len(self.m._objs) + def __deepcopy__(self, *args, **kw): return self + + def __iter__(self): + self.reset() + return self + + def __next__(self): + self.m._next() + return self.m._obj + + +class Option(object): + def __init__(self, *obj): + if len(obj) == 1 and isinstance(obj[0], (tuple, list)): obj = obj[0] + assert isinstance(obj, (tuple, list)) and len(obj) > 1, 'More than one option shoule be given' + self._objs = obj + self._idx = 0 + self._obj = self._objs[self._idx] + + def _next(self): + self._idx += 1 + if self._idx == len(self._objs): + self._idx = 0 + raise StopIteration + + def __setattr__(self, __name: str, __value: Any) -> None: + object.__setattr__(self, __name, __value) + if __name == '_idx' and 0 <= self._idx < len(self._objs): + self._obj = self._objs[self._idx] + + def __deepcopy__(self, *args, **kw): + return copy.deepcopy(self._obj) + + def __iter__(self): + return _OptionIterator(self) + + def __repr__(self): + return f'