model-compose 0.4.20__tar.gz → 0.4.22__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {model_compose-0.4.20/src/model_compose.egg-info → model_compose-0.4.22}/PKG-INFO +12 -4
- {model_compose-0.4.20 → model_compose-0.4.22}/README.md +8 -2
- {model_compose-0.4.20 → model_compose-0.4.22}/pyproject.toml +6 -4
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/runtime/process_manager.py +16 -2
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/runtime/process_worker.py +1 -2
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/__init__.py +1 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/model/tasks/image_to_text/huggingface.py +10 -5
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/model/tasks/text_classification/huggingface.py +15 -12
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/model/tasks/text_embedding/huggingface.py +15 -12
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/model/tasks/text_generation/huggingface.py +10 -5
- model_compose-0.4.22/src/mindor/core/component/services/text_splitter.py +188 -0
- model_compose-0.4.22/src/mindor/core/component/services/web_scraper.py +250 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/controller/webui/gradio.py +4 -4
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/foundation/__init__.py +1 -1
- model_compose-0.4.20/src/mindor/core/foundation/ipc_protocol.py → model_compose-0.4.22/src/mindor/core/foundation/ipc_messages.py +13 -3
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/foundation/process_manager.py +17 -39
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/foundation/process_worker.py +18 -7
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/runtime/docker/docker.py +1 -1
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/utils/package.py +1 -1
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/utils/ssh_client.py +54 -57
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/__init__.py +1 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/text_splitter.py +1 -1
- model_compose-0.4.22/src/mindor/dsl/schema/action/impl/web_scraper.py +57 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/component.py +4 -3
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/__init__.py +1 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/http_client.py +1 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/mcp_client.py +1 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/types.py +1 -0
- model_compose-0.4.22/src/mindor/dsl/schema/component/impl/web_scraper.py +21 -0
- {model_compose-0.4.20 → model_compose-0.4.22/src/model_compose.egg-info}/PKG-INFO +12 -4
- {model_compose-0.4.20 → model_compose-0.4.22}/src/model_compose.egg-info/SOURCES.txt +4 -1
- {model_compose-0.4.20 → model_compose-0.4.22}/src/model_compose.egg-info/requires.txt +3 -1
- {model_compose-0.4.20 → model_compose-0.4.22}/tests/test_cli.py +0 -1
- model_compose-0.4.20/src/mindor/core/component/services/text_splitter.py +0 -81
- {model_compose-0.4.20 → model_compose-0.4.22}/LICENSE +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/setup.cfg +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/cli/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/cli/compose.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/base.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/component.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/context.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/runtime/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/datasets/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/datasets/datasets.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/datasets/providers/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/datasets/providers/common.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/datasets/providers/huggingface.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/datasets/providers/local.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/datasets/utils.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/http_client.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/http_server.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/image_processor.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/mcp_client.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/mcp_server.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/model/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/model/base/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/model/base/common.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/model/base/huggingface.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/model/base/huggingface_hub.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/model/base/unsloth.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/model/model.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/model/tasks/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/model/tasks/chat_completion/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/model/tasks/chat_completion/huggingface.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/model/tasks/face_embedding/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/model/tasks/face_embedding/common.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/model/tasks/face_embedding/custom.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/model/tasks/face_embedding/insightface.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/model/tasks/image_generation/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/model/tasks/image_generation/common.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/model/tasks/image_generation/custom.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/model/tasks/image_generation/flux.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/model/tasks/image_generation/hunyuan_image.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/model/tasks/image_generation/sdxl.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/model/tasks/image_to_text/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/model/tasks/image_upscale/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/model/tasks/image_upscale/common.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/model/tasks/image_upscale/custom.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/model/tasks/image_upscale/esrgan.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/model/tasks/image_upscale/ldsr.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/model/tasks/image_upscale/real_esrgan.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/model/tasks/image_upscale/swinir.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/model/tasks/text_classification/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/model/tasks/text_embedding/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/model/tasks/text_generation/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/shell.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/vector_store/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/vector_store/base.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/vector_store/drivers/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/vector_store/drivers/chroma.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/vector_store/drivers/milvus.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/vector_store/vector_store.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/services/workflow.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/compose/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/compose/compose.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/compose/manager.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/controller/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/controller/base.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/controller/controller.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/controller/runner/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/controller/runner/client.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/controller/runner/http_client.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/controller/runner/mcp_client.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/controller/runner/runner.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/controller/runtime/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/controller/runtime/docker/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/controller/runtime/docker/context/Dockerfile +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/controller/runtime/docker/docker.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/controller/runtime/native/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/controller/runtime/native/native.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/controller/runtime/specs.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/controller/services/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/controller/services/http_server.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/controller/services/mcp_server.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/controller/webui/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/controller/webui/webui.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/foundation/async_service.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/gateway/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/gateway/base.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/gateway/gateway.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/gateway/services/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/gateway/services/http_tunnel/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/gateway/services/http_tunnel/base.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/gateway/services/http_tunnel/drivers/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/gateway/services/http_tunnel/drivers/cloudflare.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/gateway/services/http_tunnel/drivers/ngrok.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/gateway/services/http_tunnel/http_tunnel.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/gateway/services/ssh_tunnel.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/listener/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/listener/base.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/listener/listener.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/listener/services/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/listener/services/http_callback.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/listener/services/http_trigger.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/logger/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/logger/base.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/logger/logger.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/logger/logging.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/logger/services/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/logger/services/console.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/logger/services/file.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/runtime/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/runtime/docker/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/runtime/env.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/utils/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/utils/caching.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/utils/http_client.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/utils/http_request.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/utils/http_response.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/utils/http_status.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/utils/image.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/utils/mcp_client.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/utils/renderers.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/utils/resolvers.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/utils/shell.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/utils/streamer.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/utils/streaming.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/utils/time.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/utils/url.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/utils/websocket_client.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/utils/work_queue.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/workflow/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/workflow/context.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/workflow/job/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/workflow/job/base.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/workflow/job/impl/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/workflow/job/impl/action.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/workflow/job/impl/delay.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/workflow/job/impl/filter.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/workflow/job/impl/if_.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/workflow/job/impl/random_router.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/workflow/job/impl/switch.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/workflow/job/job.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/workflow/schema.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/workflow/workflow.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/loader.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/action.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/common.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/datasets/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/datasets/common.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/datasets/datasets.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/datasets/providers/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/datasets/providers/common.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/datasets/providers/huggingface.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/datasets/providers/local.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/http_client.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/http_server.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/image_processor.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/mcp_client.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/mcp_server.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/model/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/model/impl/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/model/impl/chat_completion.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/model/impl/common.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/model/impl/face_embedding/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/model/impl/face_embedding/face_embedding.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/model/impl/face_embedding/impl/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/model/impl/face_embedding/impl/common.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/model/impl/face_embedding/impl/dlib.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/model/impl/face_embedding/impl/facenet.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/model/impl/face_embedding/impl/insightface.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/model/impl/image_generation/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/model/impl/image_generation/image_generation.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/model/impl/image_generation/impl/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/model/impl/image_generation/impl/common.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/model/impl/image_generation/impl/flux.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/model/impl/image_generation/impl/hunyuan_image.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/model/impl/image_generation/impl/sdxl.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/model/impl/image_to_text.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/image_upscale.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/impl/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/impl/common.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/impl/esrgan.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/impl/ldsr.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/impl/real_esrgan.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/impl/swinir.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/model/impl/text_classification.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/model/impl/text_embedding.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/model/impl/text_generation.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/model/model.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/model_trainer/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/model_trainer/impl/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/model_trainer/impl/classification.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/model_trainer/impl/common.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/model_trainer/impl/sft.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/model_trainer/model_trainer.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/shell.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/vector_store/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/vector_store/impl/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/vector_store/impl/chroma.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/vector_store/impl/common.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/vector_store/impl/faiss.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/vector_store/impl/milvus.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/vector_store/impl/qdrant.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/vector_store/vector_store.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/action/impl/workflow.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/common.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/datasets/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/datasets/datasets.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/http_server.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/image_processor.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/mcp_server.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/model/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/model/impl/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/model/impl/chat_completion.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/model/impl/common.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/model/impl/face_embedding/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/model/impl/face_embedding/face_embedding.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/model/impl/face_embedding/impl/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/model/impl/face_embedding/impl/common.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/model/impl/face_embedding/impl/dlib.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/model/impl/face_embedding/impl/facenet.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/model/impl/face_embedding/impl/insightface.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/model/impl/image_generation/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/model/impl/image_generation/image_generation.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/model/impl/image_generation/impl/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/model/impl/image_generation/impl/common.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/model/impl/image_generation/impl/flux.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/model/impl/image_generation/impl/hunyuan_image.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/model/impl/image_generation/impl/sdxl.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/model/impl/image_to_text.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/image_upscale.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/impl/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/impl/common.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/impl/esrgan.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/impl/ldsr.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/impl/real_esrgan.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/impl/swinir.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/model/impl/text_classification.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/model/impl/text_embedding.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/model/impl/text_generation.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/model/model.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/model_trainer/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/model_trainer/impl/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/model_trainer/impl/classification.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/model_trainer/impl/common.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/model_trainer/impl/sft.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/model_trainer/model_trainer.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/shell.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/text_splitter.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/vector_store/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/vector_store/impl/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/vector_store/impl/chroma.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/vector_store/impl/common.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/vector_store/impl/faiss.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/vector_store/impl/milvus.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/vector_store/impl/qdrant.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/vector_store/vector_store.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/component/impl/workflow.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/compose.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/controller/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/controller/controller.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/controller/impl/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/controller/impl/common.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/controller/impl/http_server.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/controller/impl/mcp_server.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/controller/impl/types.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/controller/webui/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/controller/webui/impl/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/controller/webui/impl/common.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/controller/webui/impl/dynamic.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/controller/webui/impl/gradio.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/controller/webui/impl/static.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/controller/webui/webui.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/gateway/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/gateway/gateway.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/gateway/impl/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/gateway/impl/common.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/gateway/impl/http_tunnel/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/gateway/impl/http_tunnel/http_tunnel.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/cloudflare.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/common.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/ngrok.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/gateway/impl/ssh_tunnel.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/gateway/impl/types.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/job/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/job/impl/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/job/impl/action.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/job/impl/common.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/job/impl/delay.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/job/impl/filter.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/job/impl/if_.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/job/impl/random_router.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/job/impl/switch.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/job/impl/types.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/job/job.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/listener/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/listener/impl/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/listener/impl/common.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/listener/impl/http_callback.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/listener/impl/http_trigger.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/listener/impl/types.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/listener/listener.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/logger/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/logger/impl/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/logger/impl/common.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/logger/impl/console.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/logger/impl/file.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/logger/impl/types.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/logger/logger.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/runtime/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/runtime/impl/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/runtime/impl/common.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/runtime/impl/docker.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/runtime/impl/embedded.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/runtime/impl/native.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/runtime/impl/process.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/runtime/impl/types.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/runtime/runtime.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/transport/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/transport/http.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/transport/ssh.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/schema/workflow.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/utils/__init__.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/utils/annotation.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/utils/enum.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/dsl/utils/path.py +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/model_compose.egg-info/dependency_links.txt +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/model_compose.egg-info/entry_points.txt +0 -0
- {model_compose-0.4.20 → model_compose-0.4.22}/src/model_compose.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: model-compose
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.22
|
|
4
4
|
Summary: model-compose: Declarative AI Workflow Orchestrator
|
|
5
5
|
Author-email: Hanyeol Cho <hanyeol.cho@gmail.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -18,8 +18,10 @@ Requires-Dist: fastapi
|
|
|
18
18
|
Requires-Dist: uvicorn
|
|
19
19
|
Requires-Dist: mcp>=1.10.1
|
|
20
20
|
Requires-Dist: ulid
|
|
21
|
-
Requires-Dist: gradio
|
|
21
|
+
Requires-Dist: gradio>=6.0.0
|
|
22
22
|
Requires-Dist: Pillow
|
|
23
|
+
Requires-Dist: beautifulsoup4
|
|
24
|
+
Requires-Dist: lxml
|
|
23
25
|
Dynamic: license-file
|
|
24
26
|
|
|
25
27
|
<div align="center">
|
|
@@ -69,14 +71,14 @@ Built-in SSE (Server-Sent Events) streaming for real-time AI responses. Stream f
|
|
|
69
71
|
### 🔄 **Advanced Workflow Composition**
|
|
70
72
|
Build multi-step pipelines with conditional logic, data transformation, and parallel execution. Pass data between jobs with powerful variable binding—`${input}`, `${response}`, `${env}`, with type conversion and defaults.
|
|
71
73
|
|
|
72
|
-
### 🚀 **Production-Ready
|
|
74
|
+
### 🚀 **Production-Ready Deployment**
|
|
73
75
|
Deploy as HTTP REST API or MCP (Model Context Protocol) server by changing one line. Includes concurrency control, health checks, and automatic API documentation.
|
|
74
76
|
|
|
75
77
|
### 🎯 **Event-Driven Architecture**
|
|
76
78
|
HTTP Callback listeners for async workflows (image generation, video processing). HTTP Trigger listeners for webhooks and external events. Build reactive AI systems that respond to real-world events.
|
|
77
79
|
|
|
78
80
|
### 🌐 **Smart Tunneling & Gateways**
|
|
79
|
-
Expose local services to the internet instantly with ngrok, Cloudflare, or SSH tunnels. Perfect for webhook integration
|
|
81
|
+
Expose local services to the internet instantly with ngrok, Cloudflare, or SSH tunnels. Perfect for webhook integration and public API deployment without complex networking.
|
|
80
82
|
|
|
81
83
|
### 🐳 **Container-Native Deployment**
|
|
82
84
|
First-class Docker support with runtime configuration, volume mounting, and environment management. Deploy to any cloud provider or Kubernetes cluster with minimal configuration.
|
|
@@ -174,6 +176,12 @@ controller:
|
|
|
174
176
|
type: mcp-server
|
|
175
177
|
```
|
|
176
178
|
|
|
179
|
+
### 🔄 Run Components in Separate Processes
|
|
180
|
+
```yaml
|
|
181
|
+
component:
|
|
182
|
+
runtime: process
|
|
183
|
+
```
|
|
184
|
+
|
|
177
185
|
### 🐳 Deploy in Docker with 1 Line
|
|
178
186
|
```yaml
|
|
179
187
|
controller:
|
|
@@ -45,14 +45,14 @@ Built-in SSE (Server-Sent Events) streaming for real-time AI responses. Stream f
|
|
|
45
45
|
### 🔄 **Advanced Workflow Composition**
|
|
46
46
|
Build multi-step pipelines with conditional logic, data transformation, and parallel execution. Pass data between jobs with powerful variable binding—`${input}`, `${response}`, `${env}`, with type conversion and defaults.
|
|
47
47
|
|
|
48
|
-
### 🚀 **Production-Ready
|
|
48
|
+
### 🚀 **Production-Ready Deployment**
|
|
49
49
|
Deploy as HTTP REST API or MCP (Model Context Protocol) server by changing one line. Includes concurrency control, health checks, and automatic API documentation.
|
|
50
50
|
|
|
51
51
|
### 🎯 **Event-Driven Architecture**
|
|
52
52
|
HTTP Callback listeners for async workflows (image generation, video processing). HTTP Trigger listeners for webhooks and external events. Build reactive AI systems that respond to real-world events.
|
|
53
53
|
|
|
54
54
|
### 🌐 **Smart Tunneling & Gateways**
|
|
55
|
-
Expose local services to the internet instantly with ngrok, Cloudflare, or SSH tunnels. Perfect for webhook integration
|
|
55
|
+
Expose local services to the internet instantly with ngrok, Cloudflare, or SSH tunnels. Perfect for webhook integration and public API deployment without complex networking.
|
|
56
56
|
|
|
57
57
|
### 🐳 **Container-Native Deployment**
|
|
58
58
|
First-class Docker support with runtime configuration, volume mounting, and environment management. Deploy to any cloud provider or Kubernetes cluster with minimal configuration.
|
|
@@ -150,6 +150,12 @@ controller:
|
|
|
150
150
|
type: mcp-server
|
|
151
151
|
```
|
|
152
152
|
|
|
153
|
+
### 🔄 Run Components in Separate Processes
|
|
154
|
+
```yaml
|
|
155
|
+
component:
|
|
156
|
+
runtime: process
|
|
157
|
+
```
|
|
158
|
+
|
|
153
159
|
### 🐳 Deploy in Docker with 1 Line
|
|
154
160
|
```yaml
|
|
155
161
|
controller:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "model-compose"
|
|
3
|
-
version = "0.4.
|
|
3
|
+
version = "0.4.22"
|
|
4
4
|
description = "model-compose: Declarative AI Workflow Orchestrator"
|
|
5
5
|
authors = [
|
|
6
6
|
{ name = "Hanyeol Cho", email = "hanyeol.cho@gmail.com" }
|
|
@@ -18,9 +18,11 @@ dependencies = [
|
|
|
18
18
|
"fastapi",
|
|
19
19
|
"uvicorn",
|
|
20
20
|
"mcp>=1.10.1",
|
|
21
|
-
"ulid",
|
|
22
|
-
"gradio",
|
|
23
|
-
"Pillow"
|
|
21
|
+
"ulid",
|
|
22
|
+
"gradio>=6.0.0",
|
|
23
|
+
"Pillow",
|
|
24
|
+
"beautifulsoup4",
|
|
25
|
+
"lxml"
|
|
24
26
|
]
|
|
25
27
|
|
|
26
28
|
[project.scripts]
|
{model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/runtime/process_manager.py
RENAMED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
from typing import Any, Dict
|
|
2
2
|
from mindor.core.foundation import ProcessRuntimeManager
|
|
3
|
+
from mindor.core.foundation.process_worker import ProcessWorkerParams
|
|
3
4
|
from mindor.core.component.base import ComponentGlobalConfigs
|
|
4
5
|
from mindor.core.component.runtime.process_worker import ComponentProcessWorker
|
|
6
|
+
from mindor.core.utils.time import parse_duration
|
|
5
7
|
from mindor.dsl.schema.component import ComponentConfig
|
|
6
8
|
from mindor.dsl.schema.runtime import ProcessRuntimeConfig
|
|
7
9
|
from multiprocessing import Queue
|
|
@@ -30,10 +32,22 @@ class ComponentProcessRuntimeManager(ProcessRuntimeManager):
|
|
|
30
32
|
global_configs=global_configs
|
|
31
33
|
)
|
|
32
34
|
|
|
35
|
+
# Convert ProcessRuntimeConfig to ProcessWorkerParams
|
|
36
|
+
worker_params = self._convert_runtime_config(config.runtime)
|
|
37
|
+
|
|
33
38
|
super().__init__(
|
|
34
39
|
worker_id=component_id,
|
|
35
|
-
|
|
36
|
-
|
|
40
|
+
worker_factory=worker_factory,
|
|
41
|
+
worker_params=worker_params
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
@staticmethod
|
|
45
|
+
def _convert_runtime_config(config: ProcessRuntimeConfig) -> ProcessWorkerParams:
|
|
46
|
+
"""Convert DSL ProcessRuntimeConfig to foundation ProcessWorkerParams"""
|
|
47
|
+
return ProcessWorkerParams(
|
|
48
|
+
env=config.env,
|
|
49
|
+
start_timeout=parse_duration(config.start_timeout).total_seconds(),
|
|
50
|
+
stop_timeout=parse_duration(config.stop_timeout).total_seconds()
|
|
37
51
|
)
|
|
38
52
|
|
|
39
53
|
def _component_worker_factory(
|
{model_compose-0.4.20 → model_compose-0.4.22}/src/mindor/core/component/runtime/process_worker.py
RENAMED
|
@@ -46,8 +46,7 @@ class ComponentProcessWorker(ProcessWorker):
|
|
|
46
46
|
run_id = payload["run_id"]
|
|
47
47
|
input_data = payload["input"]
|
|
48
48
|
|
|
49
|
-
|
|
50
|
-
return output
|
|
49
|
+
return await self.component.run(action_id, run_id, input_data)
|
|
51
50
|
|
|
52
51
|
async def _cleanup(self) -> None:
|
|
53
52
|
"""Clean up the component"""
|
|
@@ -78,15 +78,12 @@ class HuggingfaceImageToTextTaskAction:
|
|
|
78
78
|
async def _stream_output_generator():
|
|
79
79
|
async for chunk in AsyncStreamer(streamer, loop):
|
|
80
80
|
if chunk:
|
|
81
|
-
|
|
82
|
-
yield (await context.render_variable(self.config.output, ignore_files=True)) if self.config.output else chunk
|
|
81
|
+
yield await self._render_output_chunk(context, chunk)
|
|
83
82
|
|
|
84
83
|
return _stream_output_generator()
|
|
85
84
|
else:
|
|
86
85
|
result = results[0] if is_single_input else results
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
return (await context.render_variable(self.config.output, ignore_files=True)) if self.config.output else result
|
|
86
|
+
return await self._render_output(context, result)
|
|
90
87
|
|
|
91
88
|
async def _prepare_input(self, context: ComponentActionContext) -> Tuple[Union[PILImage.Image, List[PILImage.Image]], Optional[Union[str, List[str]]]]:
|
|
92
89
|
image = await context.render_image(self.config.image)
|
|
@@ -94,6 +91,14 @@ class HuggingfaceImageToTextTaskAction:
|
|
|
94
91
|
|
|
95
92
|
return image, text
|
|
96
93
|
|
|
94
|
+
async def _render_output_chunk(self, context: ComponentActionContext, chunk: str) -> Any:
|
|
95
|
+
context.register_source("result[]", chunk)
|
|
96
|
+
return (await context.render_variable(self.config.output, ignore_files=True)) if self.config.output else chunk
|
|
97
|
+
|
|
98
|
+
async def _render_output(self, context: ComponentActionContext, result: Union[str, List[str]]) -> Any:
|
|
99
|
+
context.register_source("result", result)
|
|
100
|
+
return (await context.render_variable(self.config.output, ignore_files=True)) if self.config.output else result
|
|
101
|
+
|
|
97
102
|
async def _resolve_processor_params(self, context: ComponentActionContext) -> Dict[str, Any]:
|
|
98
103
|
max_input_length = await context.render_variable(self.config.max_input_length)
|
|
99
104
|
|
|
@@ -26,7 +26,7 @@ class HuggingfaceTextClassificationTaskAction:
|
|
|
26
26
|
|
|
27
27
|
text = await self._prepare_input(context)
|
|
28
28
|
is_single_input: bool = bool(not isinstance(text, list))
|
|
29
|
-
|
|
29
|
+
uses_array_output: bool = context.contains_variable_reference("result[]", self.config.output)
|
|
30
30
|
texts: List[str] = [ text ] if is_single_input else text
|
|
31
31
|
results = []
|
|
32
32
|
|
|
@@ -59,12 +59,10 @@ class HuggingfaceTextClassificationTaskAction:
|
|
|
59
59
|
for predicted_index in predicted_indices:
|
|
60
60
|
predictions.append(labels[predicted_index] if labels else predicted_index)
|
|
61
61
|
|
|
62
|
-
if
|
|
62
|
+
if uses_array_output:
|
|
63
63
|
rendered_outputs = []
|
|
64
64
|
for prediction in predictions:
|
|
65
|
-
|
|
66
|
-
output = await context.render_variable(self.config.output, ignore_files=True)
|
|
67
|
-
rendered_outputs.append(output)
|
|
65
|
+
rendered_outputs.append(await self._render_output_item(context, prediction))
|
|
68
66
|
yield rendered_outputs
|
|
69
67
|
else:
|
|
70
68
|
yield predictions
|
|
@@ -72,10 +70,9 @@ class HuggingfaceTextClassificationTaskAction:
|
|
|
72
70
|
if streaming:
|
|
73
71
|
async def _stream_output_generator():
|
|
74
72
|
async for predictions in _predict():
|
|
75
|
-
if not
|
|
73
|
+
if not uses_array_output:
|
|
76
74
|
for prediction in predictions:
|
|
77
|
-
|
|
78
|
-
yield (await context.render_variable(self.config.output, ignore_files=True)) if self.config.output else result
|
|
75
|
+
yield await self._render_output(context, prediction)
|
|
79
76
|
else:
|
|
80
77
|
for prediction in predictions:
|
|
81
78
|
yield prediction
|
|
@@ -85,17 +82,23 @@ class HuggingfaceTextClassificationTaskAction:
|
|
|
85
82
|
async for predictions in _predict():
|
|
86
83
|
results.extend(predictions)
|
|
87
84
|
|
|
88
|
-
if not
|
|
85
|
+
if not uses_array_output:
|
|
89
86
|
result = results[0] if is_single_input else results
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
return (await context.render_variable(self.config.output, ignore_files=True)) if self.config.output else result
|
|
87
|
+
return await self._render_output(context, result)
|
|
93
88
|
else:
|
|
94
89
|
return results
|
|
95
90
|
|
|
96
91
|
async def _prepare_input(self, context: ComponentActionContext) -> Union[str, List[str]]:
|
|
97
92
|
return await context.render_variable(self.config.text)
|
|
98
93
|
|
|
94
|
+
async def _render_output_item(self, context: ComponentActionContext, prediction: Union[Dict[str, Any], str, int]) -> Any:
|
|
95
|
+
context.register_source("result[]", prediction)
|
|
96
|
+
return (await context.render_variable(self.config.output, ignore_files=True)) if self.config.output else prediction
|
|
97
|
+
|
|
98
|
+
async def _render_output(self, context: ComponentActionContext, result: Union[Dict[str, Any], str, int, List[Union[Dict[str, Any], str, int]]]) -> Any:
|
|
99
|
+
context.register_source("result", result)
|
|
100
|
+
return (await context.render_variable(self.config.output, ignore_files=True)) if self.config.output else result
|
|
101
|
+
|
|
99
102
|
async def _resolve_tokenizer_params(self, context: ComponentActionContext) -> Dict[str, Any]:
|
|
100
103
|
max_input_length = await context.render_variable(self.config.max_input_length)
|
|
101
104
|
|
|
@@ -26,7 +26,7 @@ class HuggingfaceTextEmbeddingTaskAction:
|
|
|
26
26
|
|
|
27
27
|
text = await self._prepare_input(context)
|
|
28
28
|
is_single_input: bool = bool(not isinstance(text, list))
|
|
29
|
-
|
|
29
|
+
uses_array_output: bool = context.contains_variable_reference("result[]", self.config.output)
|
|
30
30
|
texts: List[str] = [ text ] if is_single_input else text
|
|
31
31
|
results = []
|
|
32
32
|
|
|
@@ -54,12 +54,10 @@ class HuggingfaceTextEmbeddingTaskAction:
|
|
|
54
54
|
|
|
55
55
|
embeddings = embeddings.cpu().tolist()
|
|
56
56
|
|
|
57
|
-
if
|
|
57
|
+
if uses_array_output:
|
|
58
58
|
rendered_outputs = []
|
|
59
59
|
for embedding in embeddings:
|
|
60
|
-
|
|
61
|
-
output = await context.render_variable(self.config.output, ignore_files=True)
|
|
62
|
-
rendered_outputs.append(output)
|
|
60
|
+
rendered_outputs.append(await self._render_output_item(context, embedding))
|
|
63
61
|
yield rendered_outputs
|
|
64
62
|
else:
|
|
65
63
|
yield embeddings
|
|
@@ -67,10 +65,9 @@ class HuggingfaceTextEmbeddingTaskAction:
|
|
|
67
65
|
if streaming:
|
|
68
66
|
async def _stream_output_generator():
|
|
69
67
|
async for embeddings in _embed():
|
|
70
|
-
if not
|
|
68
|
+
if not uses_array_output:
|
|
71
69
|
for embedding in embeddings:
|
|
72
|
-
|
|
73
|
-
yield (await context.render_variable(self.config.output, ignore_files=True)) if self.config.output else result
|
|
70
|
+
yield await self._render_output(context, embedding)
|
|
74
71
|
else:
|
|
75
72
|
for embedding in embeddings:
|
|
76
73
|
yield embedding
|
|
@@ -80,17 +77,23 @@ class HuggingfaceTextEmbeddingTaskAction:
|
|
|
80
77
|
async for embeddings in _embed():
|
|
81
78
|
results.extend(embeddings)
|
|
82
79
|
|
|
83
|
-
if not
|
|
80
|
+
if not uses_array_output:
|
|
84
81
|
result = results[0] if is_single_input else results
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
return (await context.render_variable(self.config.output, ignore_files=True)) if self.config.output else result
|
|
82
|
+
return await self._render_output(context, result)
|
|
88
83
|
else:
|
|
89
84
|
return results
|
|
90
85
|
|
|
91
86
|
async def _prepare_input(self, context: ComponentActionContext) -> Union[str, List[str]]:
|
|
92
87
|
return await context.render_variable(self.config.text)
|
|
93
88
|
|
|
89
|
+
async def _render_output_item(self, context: ComponentActionContext, embedding: List[float]) -> Any:
|
|
90
|
+
context.register_source("result[]", embedding)
|
|
91
|
+
return (await context.render_variable(self.config.output, ignore_files=True)) if self.config.output else embedding
|
|
92
|
+
|
|
93
|
+
async def _render_output(self, context: ComponentActionContext, result: Union[List[float], List[List[float]]]) -> Any:
|
|
94
|
+
context.register_source("result", result)
|
|
95
|
+
return (await context.render_variable(self.config.output, ignore_files=True)) if self.config.output else result
|
|
96
|
+
|
|
94
97
|
async def _resolve_tokenizer_params(self, context: ComponentActionContext) -> Dict[str, Any]:
|
|
95
98
|
max_input_length = await context.render_variable(self.config.max_input_length)
|
|
96
99
|
|
|
@@ -72,19 +72,24 @@ class HuggingfaceTextGenerationTaskAction:
|
|
|
72
72
|
async def _stream_output_generator():
|
|
73
73
|
async for chunk in AsyncStreamer(streamer, loop):
|
|
74
74
|
if chunk:
|
|
75
|
-
|
|
76
|
-
yield (await context.render_variable(self.config.output, ignore_files=True)) if self.config.output else chunk
|
|
75
|
+
yield await self._render_output_chunk(context, chunk)
|
|
77
76
|
|
|
78
77
|
return _stream_output_generator()
|
|
79
78
|
else:
|
|
80
79
|
result = results[0] if is_single_input else results
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
return (await context.render_variable(self.config.output, ignore_files=True)) if self.config.output else result
|
|
80
|
+
return await self._render_output(context, result)
|
|
84
81
|
|
|
85
82
|
async def _prepare_input(self, context: ComponentActionContext) -> Union[str, List[str]]:
|
|
86
83
|
return await context.render_variable(self.config.text)
|
|
87
84
|
|
|
85
|
+
async def _render_output_chunk(self, context: ComponentActionContext, chunk: str) -> Any:
|
|
86
|
+
context.register_source("result[]", chunk)
|
|
87
|
+
return (await context.render_variable(self.config.output, ignore_files=True)) if self.config.output else chunk
|
|
88
|
+
|
|
89
|
+
async def _render_output(self, context: ComponentActionContext, result: Union[str, List[str]]) -> Any:
|
|
90
|
+
context.register_source("result", result)
|
|
91
|
+
return (await context.render_variable(self.config.output, ignore_files=True)) if self.config.output else result
|
|
92
|
+
|
|
88
93
|
async def _resolve_tokenizer_params(self, context: ComponentActionContext) -> Dict[str, Any]:
|
|
89
94
|
max_input_length = await context.render_variable(self.config.max_input_length)
|
|
90
95
|
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Any
|
|
2
|
+
import re
|
|
3
|
+
from mindor.dsl.schema.component import TextSplitterComponentConfig
|
|
4
|
+
from mindor.dsl.schema.action import ActionConfig, TextSplitterActionConfig
|
|
5
|
+
from ..base import ComponentService, ComponentType, ComponentGlobalConfigs, register_component
|
|
6
|
+
from ..context import ComponentActionContext
|
|
7
|
+
|
|
8
|
+
class TextSplitterAction:
|
|
9
|
+
def __init__(self, config: TextSplitterActionConfig):
|
|
10
|
+
self.config: TextSplitterActionConfig = config
|
|
11
|
+
|
|
12
|
+
async def run(self, context: ComponentActionContext) -> Any:
|
|
13
|
+
text = await context.render_variable(self.config.text)
|
|
14
|
+
separators = await context.render_variable(self.config.separators)
|
|
15
|
+
chunk_size = await context.render_variable(self.config.chunk_size)
|
|
16
|
+
chunk_overlap = await context.render_variable(self.config.chunk_overlap)
|
|
17
|
+
|
|
18
|
+
return self._split_text(text, separators or ["\n\n", "\n", " ", ""], chunk_size, chunk_overlap)
|
|
19
|
+
|
|
20
|
+
def _split_text(self, text: str, separators: List[str], chunk_size: int, chunk_overlap: int) -> List[str]:
|
|
21
|
+
"""Split text using recursive character text splitting."""
|
|
22
|
+
if not text:
|
|
23
|
+
return []
|
|
24
|
+
|
|
25
|
+
if chunk_overlap > chunk_size:
|
|
26
|
+
raise ValueError(f"Got a larger chunk overlap ({chunk_overlap}) than chunk size ({chunk_size}), should be smaller.")
|
|
27
|
+
|
|
28
|
+
return self._split_text_recursive(text, separators, chunk_size, chunk_overlap)
|
|
29
|
+
|
|
30
|
+
def _split_text_recursive(self, text: str, separators: List[str], chunk_size: int, chunk_overlap: int) -> List[str]:
|
|
31
|
+
"""Recursively split text by separators."""
|
|
32
|
+
final_chunks = []
|
|
33
|
+
|
|
34
|
+
# Find the first separator that exists in the text
|
|
35
|
+
separator = separators[-1] if separators else ""
|
|
36
|
+
remaining_separators = []
|
|
37
|
+
|
|
38
|
+
for i, sep in enumerate(separators):
|
|
39
|
+
if not sep:
|
|
40
|
+
separator = sep
|
|
41
|
+
break
|
|
42
|
+
if sep in text:
|
|
43
|
+
separator = sep
|
|
44
|
+
remaining_separators = separators[i + 1:]
|
|
45
|
+
break
|
|
46
|
+
|
|
47
|
+
# Split using the separator with keep_separator=True logic
|
|
48
|
+
splits = self._split_text_with_separator(text, separator, keep_separator=True)
|
|
49
|
+
|
|
50
|
+
# Now go merging things, recursively splitting longer texts.
|
|
51
|
+
good_splits = []
|
|
52
|
+
# Use empty separator when merging because separator is already in splits
|
|
53
|
+
merge_separator = ""
|
|
54
|
+
|
|
55
|
+
for s in splits:
|
|
56
|
+
if len(s) < chunk_size:
|
|
57
|
+
good_splits.append(s)
|
|
58
|
+
else:
|
|
59
|
+
if good_splits:
|
|
60
|
+
merged_text = self._merge_splits(good_splits, chunk_size, chunk_overlap, merge_separator)
|
|
61
|
+
final_chunks.extend(merged_text)
|
|
62
|
+
good_splits = []
|
|
63
|
+
if not remaining_separators:
|
|
64
|
+
final_chunks.append(s)
|
|
65
|
+
else:
|
|
66
|
+
other_info = self._split_text_recursive(s, remaining_separators, chunk_size, chunk_overlap)
|
|
67
|
+
final_chunks.extend(other_info)
|
|
68
|
+
|
|
69
|
+
if good_splits:
|
|
70
|
+
merged_text = self._merge_splits(good_splits, chunk_size, chunk_overlap, merge_separator)
|
|
71
|
+
final_chunks.extend(merged_text)
|
|
72
|
+
|
|
73
|
+
return final_chunks
|
|
74
|
+
|
|
75
|
+
def _split_text_with_separator(self, text: str, separator: str, keep_separator: bool) -> List[str]:
|
|
76
|
+
"""Split text with regex and optionally keep separator."""
|
|
77
|
+
if separator:
|
|
78
|
+
if keep_separator:
|
|
79
|
+
# The parentheses in the pattern keep the delimiters in the result.
|
|
80
|
+
# keep_separator=True means "start" mode: attach separator to the start of next chunk
|
|
81
|
+
separator_pattern = re.escape(separator)
|
|
82
|
+
splits_ = re.split(f"({separator_pattern})", text)
|
|
83
|
+
|
|
84
|
+
# Combine separator with following chunk (start mode)
|
|
85
|
+
# For splits_ = ['First', '. ', 'Second', '. ', 'Third.']
|
|
86
|
+
# We want: ['First', '. Second', '. Third.']
|
|
87
|
+
splits = [splits_[i] + splits_[i + 1] for i in range(1, len(splits_), 2)]
|
|
88
|
+
|
|
89
|
+
# Handle even number of elements (last chunk has separator)
|
|
90
|
+
if len(splits_) % 2 == 0:
|
|
91
|
+
splits += splits_[-1:]
|
|
92
|
+
|
|
93
|
+
# Add first element at the beginning
|
|
94
|
+
splits = [splits_[0], *splits]
|
|
95
|
+
else:
|
|
96
|
+
splits = re.split(re.escape(separator), text)
|
|
97
|
+
else:
|
|
98
|
+
# Empty separator means split into characters
|
|
99
|
+
splits = list(text)
|
|
100
|
+
|
|
101
|
+
# Filter out empty strings
|
|
102
|
+
return [s for s in splits if s]
|
|
103
|
+
|
|
104
|
+
def _merge_splits(self, splits: List[str], chunk_size: int, chunk_overlap: int, separator: str) -> List[str]:
|
|
105
|
+
"""Merge splits into chunks with overlap, matching langchain's algorithm exactly."""
|
|
106
|
+
separator_len = len(separator)
|
|
107
|
+
chunks = []
|
|
108
|
+
current_chunk_parts: List[str] = []
|
|
109
|
+
current_chunk_length = 0
|
|
110
|
+
|
|
111
|
+
def _calculate_separator_contribution(num_parts: int) -> int:
|
|
112
|
+
"""Calculate the total length added by separators between parts."""
|
|
113
|
+
return separator_len if num_parts > 0 else 0
|
|
114
|
+
|
|
115
|
+
def _would_exceed_chunk_size(new_part_length: int) -> bool:
|
|
116
|
+
"""Check if adding a new part would exceed the chunk size."""
|
|
117
|
+
separator_contribution = _calculate_separator_contribution(len(current_chunk_parts))
|
|
118
|
+
return current_chunk_length + new_part_length + separator_contribution > chunk_size
|
|
119
|
+
|
|
120
|
+
def _save_current_chunk() -> None:
|
|
121
|
+
"""Save the current chunk to the result list."""
|
|
122
|
+
if current_chunk_parts:
|
|
123
|
+
chunk_text = self._join_docs(current_chunk_parts, separator)
|
|
124
|
+
if chunk_text is not None:
|
|
125
|
+
chunks.append(chunk_text)
|
|
126
|
+
|
|
127
|
+
def _should_remove_oldest_part(new_part_length: int) -> bool:
|
|
128
|
+
"""Determine if we should remove the oldest part to make room for overlap."""
|
|
129
|
+
# Remove if current chunk exceeds the overlap limit
|
|
130
|
+
if current_chunk_length > chunk_overlap:
|
|
131
|
+
return True
|
|
132
|
+
|
|
133
|
+
# Or if adding the new part would still exceed chunk size and we have content
|
|
134
|
+
if current_chunk_length > 0:
|
|
135
|
+
separator_contribution = _calculate_separator_contribution(len(current_chunk_parts))
|
|
136
|
+
return current_chunk_length + new_part_length + separator_contribution > chunk_size
|
|
137
|
+
|
|
138
|
+
return False
|
|
139
|
+
|
|
140
|
+
def _remove_oldest_part() -> None:
|
|
141
|
+
"""Remove the oldest part from the current chunk and update the length."""
|
|
142
|
+
nonlocal current_chunk_length
|
|
143
|
+
oldest_part_length = len(current_chunk_parts[0])
|
|
144
|
+
separator_contribution = separator_len if len(current_chunk_parts) > 1 else 0
|
|
145
|
+
current_chunk_length -= oldest_part_length + separator_contribution
|
|
146
|
+
current_chunk_parts.pop(0)
|
|
147
|
+
|
|
148
|
+
def _add_part(part: str) -> None:
|
|
149
|
+
"""Add a new part to the current chunk and update the length."""
|
|
150
|
+
nonlocal current_chunk_length
|
|
151
|
+
part_length = len(part)
|
|
152
|
+
separator_contribution = separator_len if len(current_chunk_parts) > 1 else 0
|
|
153
|
+
current_chunk_parts.append(part)
|
|
154
|
+
current_chunk_length += part_length + separator_contribution
|
|
155
|
+
|
|
156
|
+
# Process each split
|
|
157
|
+
for split in splits:
|
|
158
|
+
split_length = len(split)
|
|
159
|
+
|
|
160
|
+
# If adding this split would exceed chunk size, finalize current chunk
|
|
161
|
+
if _would_exceed_chunk_size(split_length):
|
|
162
|
+
_save_current_chunk()
|
|
163
|
+
|
|
164
|
+
# Trim the current chunk to fit within overlap constraints
|
|
165
|
+
while _should_remove_oldest_part(split_length):
|
|
166
|
+
_remove_oldest_part()
|
|
167
|
+
|
|
168
|
+
# Add the split to the current chunk
|
|
169
|
+
_add_part(split)
|
|
170
|
+
|
|
171
|
+
# Save any remaining chunk
|
|
172
|
+
_save_current_chunk()
|
|
173
|
+
|
|
174
|
+
return chunks
|
|
175
|
+
|
|
176
|
+
def _join_docs(self, docs: List[str], separator: str) -> Optional[str]:
|
|
177
|
+
"""Join documents with separator and strip whitespace."""
|
|
178
|
+
text = separator.join(docs)
|
|
179
|
+
text = text.strip()
|
|
180
|
+
return text or None
|
|
181
|
+
|
|
182
|
+
@register_component(ComponentType.TEXT_SPLITTER)
|
|
183
|
+
class TextSplitterComponent(ComponentService):
|
|
184
|
+
def __init__(self, id: str, config: TextSplitterComponentConfig, global_configs: ComponentGlobalConfigs, daemon: bool):
|
|
185
|
+
super().__init__(id, config, global_configs, daemon)
|
|
186
|
+
|
|
187
|
+
async def _run(self, action: ActionConfig, context: ComponentActionContext) -> Any:
|
|
188
|
+
return await TextSplitterAction(action).run(context)
|