model-compose 0.4.19__tar.gz → 0.4.20__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.19 → model_compose-0.4.20}/PKG-INFO +42 -21
- {model_compose-0.4.19 → model_compose-0.4.20}/README.md +41 -20
- {model_compose-0.4.19 → model_compose-0.4.20}/pyproject.toml +1 -1
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/base.py +24 -0
- model_compose-0.4.20/src/mindor/core/component/runtime/__init__.py +2 -0
- model_compose-0.4.20/src/mindor/core/component/runtime/process_manager.py +70 -0
- model_compose-0.4.20/src/mindor/core/component/runtime/process_worker.py +56 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/controller/runtime/docker/docker.py +6 -0
- model_compose-0.4.20/src/mindor/core/foundation/__init__.py +5 -0
- model_compose-0.4.20/src/mindor/core/foundation/ipc_protocol.py +22 -0
- model_compose-0.4.20/src/mindor/core/foundation/process_manager.py +187 -0
- model_compose-0.4.20/src/mindor/core/foundation/process_worker.py +132 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/runtime/docker/docker.py +2 -1
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/runtime/impl/__init__.py +1 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/runtime/impl/docker.py +1 -0
- model_compose-0.4.20/src/mindor/dsl/schema/runtime/impl/process.py +29 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/runtime/impl/types.py +1 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/runtime/runtime.py +1 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/model_compose.egg-info/PKG-INFO +42 -21
- {model_compose-0.4.19 → model_compose-0.4.20}/src/model_compose.egg-info/SOURCES.txt +7 -0
- model_compose-0.4.19/src/mindor/core/foundation/__init__.py +0 -2
- {model_compose-0.4.19 → model_compose-0.4.20}/LICENSE +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/setup.cfg +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/cli/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/cli/compose.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/component.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/context.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/datasets/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/datasets/datasets.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/datasets/providers/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/datasets/providers/common.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/datasets/providers/huggingface.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/datasets/providers/local.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/datasets/utils.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/http_client.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/http_server.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/image_processor.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/mcp_client.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/mcp_server.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/model/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/model/base/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/model/base/common.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/model/base/huggingface.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/model/base/huggingface_hub.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/model/base/unsloth.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/model/model.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/model/tasks/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/model/tasks/chat_completion/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/model/tasks/chat_completion/huggingface.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/model/tasks/face_embedding/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/model/tasks/face_embedding/common.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/model/tasks/face_embedding/custom.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/model/tasks/face_embedding/insightface.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/model/tasks/image_generation/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/model/tasks/image_generation/common.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/model/tasks/image_generation/custom.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/model/tasks/image_generation/flux.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/model/tasks/image_generation/hunyuan_image.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/model/tasks/image_generation/sdxl.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/model/tasks/image_to_text/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/model/tasks/image_to_text/huggingface.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/model/tasks/image_upscale/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/model/tasks/image_upscale/common.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/model/tasks/image_upscale/custom.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/model/tasks/image_upscale/esrgan.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/model/tasks/image_upscale/ldsr.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/model/tasks/image_upscale/real_esrgan.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/model/tasks/image_upscale/swinir.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/model/tasks/text_classification/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/model/tasks/text_classification/huggingface.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/model/tasks/text_embedding/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/model/tasks/text_embedding/huggingface.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/model/tasks/text_generation/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/model/tasks/text_generation/huggingface.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/shell.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/text_splitter.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/vector_store/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/vector_store/base.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/vector_store/drivers/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/vector_store/drivers/chroma.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/vector_store/drivers/milvus.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/vector_store/vector_store.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/component/services/workflow.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/compose/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/compose/compose.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/compose/manager.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/controller/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/controller/base.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/controller/controller.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/controller/runner/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/controller/runner/client.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/controller/runner/http_client.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/controller/runner/mcp_client.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/controller/runner/runner.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/controller/runtime/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/controller/runtime/docker/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/controller/runtime/docker/context/Dockerfile +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/controller/runtime/native/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/controller/runtime/native/native.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/controller/runtime/specs.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/controller/services/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/controller/services/http_server.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/controller/services/mcp_server.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/controller/webui/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/controller/webui/gradio.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/controller/webui/webui.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/foundation/async_service.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/gateway/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/gateway/base.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/gateway/gateway.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/gateway/services/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/gateway/services/http_tunnel/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/gateway/services/http_tunnel/base.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/gateway/services/http_tunnel/drivers/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/gateway/services/http_tunnel/drivers/cloudflare.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/gateway/services/http_tunnel/drivers/ngrok.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/gateway/services/http_tunnel/http_tunnel.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/gateway/services/ssh_tunnel.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/listener/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/listener/base.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/listener/listener.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/listener/services/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/listener/services/http_callback.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/listener/services/http_trigger.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/logger/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/logger/base.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/logger/logger.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/logger/logging.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/logger/services/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/logger/services/console.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/logger/services/file.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/runtime/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/runtime/docker/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/runtime/env.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/utils/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/utils/caching.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/utils/http_client.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/utils/http_request.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/utils/http_response.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/utils/http_status.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/utils/image.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/utils/mcp_client.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/utils/package.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/utils/renderers.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/utils/resolvers.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/utils/shell.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/utils/ssh_client.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/utils/streamer.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/utils/streaming.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/utils/time.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/utils/url.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/utils/websocket_client.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/utils/work_queue.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/workflow/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/workflow/context.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/workflow/job/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/workflow/job/base.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/workflow/job/impl/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/workflow/job/impl/action.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/workflow/job/impl/delay.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/workflow/job/impl/filter.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/workflow/job/impl/if_.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/workflow/job/impl/random_router.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/workflow/job/impl/switch.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/workflow/job/job.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/workflow/schema.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/workflow/workflow.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/loader.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/action.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/common.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/datasets/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/datasets/common.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/datasets/datasets.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/datasets/providers/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/datasets/providers/common.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/datasets/providers/huggingface.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/datasets/providers/local.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/http_client.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/http_server.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/image_processor.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/mcp_client.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/mcp_server.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/model/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/model/impl/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/model/impl/chat_completion.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/model/impl/common.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/model/impl/face_embedding/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/model/impl/face_embedding/face_embedding.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/model/impl/face_embedding/impl/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/model/impl/face_embedding/impl/common.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/model/impl/face_embedding/impl/dlib.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/model/impl/face_embedding/impl/facenet.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/model/impl/face_embedding/impl/insightface.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/model/impl/image_generation/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/model/impl/image_generation/image_generation.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/model/impl/image_generation/impl/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/model/impl/image_generation/impl/common.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/model/impl/image_generation/impl/flux.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/model/impl/image_generation/impl/hunyuan_image.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/model/impl/image_generation/impl/sdxl.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/model/impl/image_to_text.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/image_upscale.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/impl/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/impl/common.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/impl/esrgan.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/impl/ldsr.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/impl/real_esrgan.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/impl/swinir.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/model/impl/text_classification.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/model/impl/text_embedding.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/model/impl/text_generation.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/model/model.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/model_trainer/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/model_trainer/impl/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/model_trainer/impl/classification.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/model_trainer/impl/common.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/model_trainer/impl/sft.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/model_trainer/model_trainer.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/shell.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/text_splitter.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/vector_store/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/vector_store/impl/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/vector_store/impl/chroma.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/vector_store/impl/common.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/vector_store/impl/faiss.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/vector_store/impl/milvus.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/vector_store/impl/qdrant.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/vector_store/vector_store.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/action/impl/workflow.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/component.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/common.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/datasets/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/datasets/datasets.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/http_client.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/http_server.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/image_processor.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/mcp_client.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/mcp_server.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/model/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/model/impl/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/model/impl/chat_completion.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/model/impl/common.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/model/impl/face_embedding/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/model/impl/face_embedding/face_embedding.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/model/impl/face_embedding/impl/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/model/impl/face_embedding/impl/common.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/model/impl/face_embedding/impl/dlib.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/model/impl/face_embedding/impl/facenet.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/model/impl/face_embedding/impl/insightface.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/model/impl/image_generation/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/model/impl/image_generation/image_generation.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/model/impl/image_generation/impl/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/model/impl/image_generation/impl/common.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/model/impl/image_generation/impl/flux.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/model/impl/image_generation/impl/hunyuan_image.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/model/impl/image_generation/impl/sdxl.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/model/impl/image_to_text.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/image_upscale.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/impl/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/impl/common.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/impl/esrgan.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/impl/ldsr.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/impl/real_esrgan.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/impl/swinir.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/model/impl/text_classification.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/model/impl/text_embedding.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/model/impl/text_generation.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/model/model.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/model_trainer/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/model_trainer/impl/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/model_trainer/impl/classification.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/model_trainer/impl/common.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/model_trainer/impl/sft.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/model_trainer/model_trainer.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/shell.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/text_splitter.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/types.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/vector_store/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/vector_store/impl/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/vector_store/impl/chroma.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/vector_store/impl/common.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/vector_store/impl/faiss.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/vector_store/impl/milvus.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/vector_store/impl/qdrant.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/vector_store/vector_store.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/component/impl/workflow.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/compose.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/controller/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/controller/controller.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/controller/impl/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/controller/impl/common.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/controller/impl/http_server.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/controller/impl/mcp_server.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/controller/impl/types.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/controller/webui/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/controller/webui/impl/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/controller/webui/impl/common.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/controller/webui/impl/dynamic.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/controller/webui/impl/gradio.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/controller/webui/impl/static.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/controller/webui/webui.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/gateway/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/gateway/gateway.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/gateway/impl/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/gateway/impl/common.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/gateway/impl/http_tunnel/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/gateway/impl/http_tunnel/http_tunnel.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/cloudflare.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/common.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/ngrok.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/gateway/impl/ssh_tunnel.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/gateway/impl/types.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/job/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/job/impl/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/job/impl/action.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/job/impl/common.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/job/impl/delay.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/job/impl/filter.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/job/impl/if_.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/job/impl/random_router.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/job/impl/switch.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/job/impl/types.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/job/job.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/listener/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/listener/impl/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/listener/impl/common.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/listener/impl/http_callback.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/listener/impl/http_trigger.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/listener/impl/types.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/listener/listener.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/logger/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/logger/impl/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/logger/impl/common.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/logger/impl/console.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/logger/impl/file.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/logger/impl/types.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/logger/logger.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/runtime/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/runtime/impl/common.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/runtime/impl/embedded.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/runtime/impl/native.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/transport/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/transport/http.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/transport/ssh.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/schema/workflow.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/utils/__init__.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/utils/annotation.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/utils/enum.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/dsl/utils/path.py +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/model_compose.egg-info/dependency_links.txt +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/model_compose.egg-info/entry_points.txt +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/model_compose.egg-info/requires.txt +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/src/model_compose.egg-info/top_level.txt +0 -0
- {model_compose-0.4.19 → model_compose-0.4.20}/tests/test_cli.py +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.20
|
|
4
4
|
Summary: model-compose: Declarative AI Workflow Orchestrator
|
|
5
5
|
Author-email: Hanyeol Cho <hanyeol.cho@gmail.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -54,13 +54,41 @@ Dynamic: license-file
|
|
|
54
54
|
|
|
55
55
|
## ✨ Features
|
|
56
56
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
57
|
+
### 🎨 **No-Code AI Orchestration**
|
|
58
|
+
Define complex AI workflows entirely in YAML—no Python, no JavaScript, no coding required. Connect multiple AI services, models, and APIs through simple declarative configuration.
|
|
59
|
+
|
|
60
|
+
### 🔗 **Universal AI Service Integration**
|
|
61
|
+
Connect to any AI provider out of the box—OpenAI, Anthropic Claude, Google Gemini, ElevenLabs, Stability AI, Replicate, or any custom HTTP API. Mix and match services in a single workflow.
|
|
62
|
+
|
|
63
|
+
### 🖥️ **Local Model Execution**
|
|
64
|
+
Run models from HuggingFace and other sources locally with native support for transformers, PyTorch, and model serving frameworks. Fine-tune models with LoRA/PEFT, train with custom datasets, all through YAML configuration.
|
|
65
|
+
|
|
66
|
+
### ⚡ **Real-Time Streaming**
|
|
67
|
+
Built-in SSE (Server-Sent Events) streaming for real-time AI responses. Stream from OpenAI, Claude, local models, or any streaming API with automatic chunking and connection management.
|
|
68
|
+
|
|
69
|
+
### 🔄 **Advanced Workflow Composition**
|
|
70
|
+
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
|
+
|
|
72
|
+
### 🚀 **Production-Ready Controllers**
|
|
73
|
+
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
|
+
|
|
75
|
+
### 🎯 **Event-Driven Architecture**
|
|
76
|
+
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
|
+
|
|
78
|
+
### 🌐 **Smart Tunneling & Gateways**
|
|
79
|
+
Expose local services to the internet instantly with ngrok, Cloudflare, or SSH tunnels. Perfect for webhook integration, Slack bots, and public API deployment without complex networking.
|
|
80
|
+
|
|
81
|
+
### 🐳 **Container-Native Deployment**
|
|
82
|
+
First-class Docker support with runtime configuration, volume mounting, and environment management. Deploy to any cloud provider or Kubernetes cluster with minimal configuration.
|
|
83
|
+
|
|
84
|
+
### 🎨 **Instant Web UI**
|
|
85
|
+
Add a visual interface with just 2 lines—get Gradio-powered chat UI or serve custom static frontends. Test workflows, monitor executions, and debug pipelines visually.
|
|
86
|
+
|
|
87
|
+
### 🗄️ **RAG & Vector Database Ready**
|
|
88
|
+
Native integration with ChromaDB, Milvus, Pinecone, and Weaviate. Build retrieval-augmented generation (RAG) systems with embedding search, document indexing, and semantic retrieval.
|
|
89
|
+
|
|
90
|
+
### 🔧 **Flexible Component System**
|
|
91
|
+
Reusable components with multi-action support. Define once, use everywhere. Mix HTTP clients, local models, vector stores, shell commands, and custom workflows in any combination.
|
|
64
92
|
|
|
65
93
|
---
|
|
66
94
|
|
|
@@ -129,37 +157,30 @@ model-compose up
|
|
|
129
157
|
|
|
130
158
|
Your API is now live at `http://localhost:8080` and Web UI at `http://localhost:8081` 🎉
|
|
131
159
|
|
|
132
|
-
> 💡 Explore [examples](examples/README.md) for more workflows or read the [User Guide](docs/user-guide/README.md).
|
|
133
|
-
|
|
134
160
|
---
|
|
135
|
-
## 💡 Key Capabilities
|
|
136
161
|
|
|
137
|
-
|
|
138
|
-
|
|
162
|
+
## 🎯 Powerful Yet Simple
|
|
163
|
+
|
|
164
|
+
### 🖥️ Add Web UI with 2 Lines
|
|
139
165
|
```yaml
|
|
140
166
|
controller:
|
|
141
167
|
webui:
|
|
142
168
|
port: 8081
|
|
143
169
|
```
|
|
144
|
-
Instantly get a user-friendly interface to test and monitor your workflows. Supports both Gradio (default) and custom static frontends.
|
|
145
170
|
|
|
146
|
-
### 🛰️ MCP Server
|
|
147
|
-
Transform your workflows into MCP tools by changing one line:
|
|
171
|
+
### 🛰️ Switch to MCP Server with 1 Line
|
|
148
172
|
```yaml
|
|
149
173
|
controller:
|
|
150
174
|
type: mcp-server
|
|
151
175
|
```
|
|
152
|
-
Just set the type to `mcp-server`. Your workflows become instantly accessible via the Model Context Protocol.
|
|
153
176
|
|
|
154
|
-
### 🐳 Docker
|
|
155
|
-
Deploy anywhere with built-in Docker support:
|
|
177
|
+
### 🐳 Deploy in Docker with 1 Line
|
|
156
178
|
```yaml
|
|
157
179
|
controller:
|
|
158
180
|
runtime: docker
|
|
159
181
|
```
|
|
160
|
-
Run your workflows in isolated containers with full control over images, volumes, ports, and environment variables.
|
|
161
182
|
|
|
162
|
-
>
|
|
183
|
+
> 💡 Explore [examples](examples/README.md) for more workflows or read the [User Guide](docs/user-guide/README.md).
|
|
163
184
|
|
|
164
185
|
---
|
|
165
186
|
## 🏗 Architecture
|
|
@@ -30,13 +30,41 @@
|
|
|
30
30
|
|
|
31
31
|
## ✨ Features
|
|
32
32
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
33
|
+
### 🎨 **No-Code AI Orchestration**
|
|
34
|
+
Define complex AI workflows entirely in YAML—no Python, no JavaScript, no coding required. Connect multiple AI services, models, and APIs through simple declarative configuration.
|
|
35
|
+
|
|
36
|
+
### 🔗 **Universal AI Service Integration**
|
|
37
|
+
Connect to any AI provider out of the box—OpenAI, Anthropic Claude, Google Gemini, ElevenLabs, Stability AI, Replicate, or any custom HTTP API. Mix and match services in a single workflow.
|
|
38
|
+
|
|
39
|
+
### 🖥️ **Local Model Execution**
|
|
40
|
+
Run models from HuggingFace and other sources locally with native support for transformers, PyTorch, and model serving frameworks. Fine-tune models with LoRA/PEFT, train with custom datasets, all through YAML configuration.
|
|
41
|
+
|
|
42
|
+
### ⚡ **Real-Time Streaming**
|
|
43
|
+
Built-in SSE (Server-Sent Events) streaming for real-time AI responses. Stream from OpenAI, Claude, local models, or any streaming API with automatic chunking and connection management.
|
|
44
|
+
|
|
45
|
+
### 🔄 **Advanced Workflow Composition**
|
|
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
|
+
|
|
48
|
+
### 🚀 **Production-Ready Controllers**
|
|
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
|
+
|
|
51
|
+
### 🎯 **Event-Driven Architecture**
|
|
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
|
+
|
|
54
|
+
### 🌐 **Smart Tunneling & Gateways**
|
|
55
|
+
Expose local services to the internet instantly with ngrok, Cloudflare, or SSH tunnels. Perfect for webhook integration, Slack bots, and public API deployment without complex networking.
|
|
56
|
+
|
|
57
|
+
### 🐳 **Container-Native Deployment**
|
|
58
|
+
First-class Docker support with runtime configuration, volume mounting, and environment management. Deploy to any cloud provider or Kubernetes cluster with minimal configuration.
|
|
59
|
+
|
|
60
|
+
### 🎨 **Instant Web UI**
|
|
61
|
+
Add a visual interface with just 2 lines—get Gradio-powered chat UI or serve custom static frontends. Test workflows, monitor executions, and debug pipelines visually.
|
|
62
|
+
|
|
63
|
+
### 🗄️ **RAG & Vector Database Ready**
|
|
64
|
+
Native integration with ChromaDB, Milvus, Pinecone, and Weaviate. Build retrieval-augmented generation (RAG) systems with embedding search, document indexing, and semantic retrieval.
|
|
65
|
+
|
|
66
|
+
### 🔧 **Flexible Component System**
|
|
67
|
+
Reusable components with multi-action support. Define once, use everywhere. Mix HTTP clients, local models, vector stores, shell commands, and custom workflows in any combination.
|
|
40
68
|
|
|
41
69
|
---
|
|
42
70
|
|
|
@@ -105,37 +133,30 @@ model-compose up
|
|
|
105
133
|
|
|
106
134
|
Your API is now live at `http://localhost:8080` and Web UI at `http://localhost:8081` 🎉
|
|
107
135
|
|
|
108
|
-
> 💡 Explore [examples](examples/README.md) for more workflows or read the [User Guide](docs/user-guide/README.md).
|
|
109
|
-
|
|
110
136
|
---
|
|
111
|
-
## 💡 Key Capabilities
|
|
112
137
|
|
|
113
|
-
|
|
114
|
-
|
|
138
|
+
## 🎯 Powerful Yet Simple
|
|
139
|
+
|
|
140
|
+
### 🖥️ Add Web UI with 2 Lines
|
|
115
141
|
```yaml
|
|
116
142
|
controller:
|
|
117
143
|
webui:
|
|
118
144
|
port: 8081
|
|
119
145
|
```
|
|
120
|
-
Instantly get a user-friendly interface to test and monitor your workflows. Supports both Gradio (default) and custom static frontends.
|
|
121
146
|
|
|
122
|
-
### 🛰️ MCP Server
|
|
123
|
-
Transform your workflows into MCP tools by changing one line:
|
|
147
|
+
### 🛰️ Switch to MCP Server with 1 Line
|
|
124
148
|
```yaml
|
|
125
149
|
controller:
|
|
126
150
|
type: mcp-server
|
|
127
151
|
```
|
|
128
|
-
Just set the type to `mcp-server`. Your workflows become instantly accessible via the Model Context Protocol.
|
|
129
152
|
|
|
130
|
-
### 🐳 Docker
|
|
131
|
-
Deploy anywhere with built-in Docker support:
|
|
153
|
+
### 🐳 Deploy in Docker with 1 Line
|
|
132
154
|
```yaml
|
|
133
155
|
controller:
|
|
134
156
|
runtime: docker
|
|
135
157
|
```
|
|
136
|
-
Run your workflows in isolated containers with full control over images, volumes, ports, and environment variables.
|
|
137
158
|
|
|
138
|
-
>
|
|
159
|
+
> 💡 Explore [examples](examples/README.md) for more workflows or read the [User Guide](docs/user-guide/README.md).
|
|
139
160
|
|
|
140
161
|
---
|
|
141
162
|
## 🏗 Architecture
|
|
@@ -5,6 +5,7 @@ from mindor.dsl.schema.action import ActionConfig
|
|
|
5
5
|
from mindor.dsl.schema.listener import ListenerConfig
|
|
6
6
|
from mindor.dsl.schema.gateway import GatewayConfig
|
|
7
7
|
from mindor.dsl.schema.workflow import WorkflowConfig
|
|
8
|
+
from mindor.dsl.schema.runtime import ProcessRuntimeConfig
|
|
8
9
|
from mindor.core.foundation import AsyncService
|
|
9
10
|
from mindor.core.utils.work_queue import WorkQueue
|
|
10
11
|
from mindor.core.logger import logging
|
|
@@ -50,15 +51,31 @@ class ComponentService(AsyncService):
|
|
|
50
51
|
self.config: ComponentConfig = config
|
|
51
52
|
self.global_configs: ComponentGlobalConfigs = global_configs
|
|
52
53
|
self.work_queue: Optional[WorkQueue] = None
|
|
54
|
+
self._process_manager = None
|
|
53
55
|
|
|
54
56
|
if self.config.max_concurrent_count > 0:
|
|
55
57
|
self.work_queue = WorkQueue(self.config.max_concurrent_count, self._run)
|
|
56
58
|
|
|
57
59
|
async def start(self, background: bool = False) -> None:
|
|
60
|
+
if isinstance(self.config.runtime, ProcessRuntimeConfig):
|
|
61
|
+
from mindor.core.component.runtime import ComponentProcessRuntimeManager
|
|
62
|
+
|
|
63
|
+
self._process_manager = ComponentProcessRuntimeManager(
|
|
64
|
+
self.id,
|
|
65
|
+
self.config,
|
|
66
|
+
self.global_configs
|
|
67
|
+
)
|
|
68
|
+
await self._process_manager.start()
|
|
69
|
+
logging.info(f"Component {self.id} started in separate process")
|
|
70
|
+
return
|
|
71
|
+
|
|
58
72
|
await super().start(background)
|
|
59
73
|
await self.wait_until_ready()
|
|
60
74
|
|
|
61
75
|
async def run(self, action_id: str, run_id: str, input: Dict[str, Any]) -> Dict[str, Any]:
|
|
76
|
+
if self._process_manager:
|
|
77
|
+
return await self._process_manager.run(action_id, run_id, input)
|
|
78
|
+
|
|
62
79
|
_, action = ActionResolver(self.config.actions).resolve(action_id)
|
|
63
80
|
context = ComponentActionContext(run_id, input)
|
|
64
81
|
|
|
@@ -67,6 +84,13 @@ class ComponentService(AsyncService):
|
|
|
67
84
|
|
|
68
85
|
return await self._run(action, context)
|
|
69
86
|
|
|
87
|
+
async def stop(self) -> None:
|
|
88
|
+
if self._process_manager:
|
|
89
|
+
await self._process_manager.stop()
|
|
90
|
+
return
|
|
91
|
+
|
|
92
|
+
await super().stop()
|
|
93
|
+
|
|
70
94
|
async def _start(self) -> None:
|
|
71
95
|
if self.work_queue:
|
|
72
96
|
await self.work_queue.start()
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
from typing import Any, Dict
|
|
2
|
+
from mindor.core.foundation import ProcessRuntimeManager
|
|
3
|
+
from mindor.core.component.base import ComponentGlobalConfigs
|
|
4
|
+
from mindor.core.component.runtime.process_worker import ComponentProcessWorker
|
|
5
|
+
from mindor.dsl.schema.component import ComponentConfig
|
|
6
|
+
from mindor.dsl.schema.runtime import ProcessRuntimeConfig
|
|
7
|
+
from multiprocessing import Queue
|
|
8
|
+
from functools import partial
|
|
9
|
+
|
|
10
|
+
class ComponentProcessRuntimeManager(ProcessRuntimeManager):
|
|
11
|
+
"""Process runtime manager for components"""
|
|
12
|
+
|
|
13
|
+
def __init__(
|
|
14
|
+
self,
|
|
15
|
+
component_id: str,
|
|
16
|
+
config: ComponentConfig,
|
|
17
|
+
global_configs: ComponentGlobalConfigs
|
|
18
|
+
):
|
|
19
|
+
if not isinstance(config.runtime, ProcessRuntimeConfig):
|
|
20
|
+
raise ValueError("ComponentProcessRuntimeManager requires ProcessRuntimeConfig")
|
|
21
|
+
|
|
22
|
+
self.config = config
|
|
23
|
+
self.global_configs = global_configs
|
|
24
|
+
|
|
25
|
+
# Create a partial function that's picklable
|
|
26
|
+
# Pass config and global_configs directly to the factory
|
|
27
|
+
worker_factory = partial(
|
|
28
|
+
self._component_worker_factory,
|
|
29
|
+
config=config,
|
|
30
|
+
global_configs=global_configs
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
super().__init__(
|
|
34
|
+
worker_id=component_id,
|
|
35
|
+
runtime_config=config.runtime,
|
|
36
|
+
worker_factory=worker_factory
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
def _component_worker_factory(
|
|
40
|
+
self,
|
|
41
|
+
worker_id: str,
|
|
42
|
+
request_queue: Queue,
|
|
43
|
+
response_queue: Queue,
|
|
44
|
+
config: ComponentConfig,
|
|
45
|
+
global_configs: ComponentGlobalConfigs
|
|
46
|
+
) -> ComponentProcessWorker:
|
|
47
|
+
"""Instance factory method for ComponentProcessWorker
|
|
48
|
+
|
|
49
|
+
This function is picklable and receives config directly as parameters.
|
|
50
|
+
"""
|
|
51
|
+
return ComponentProcessWorker(
|
|
52
|
+
worker_id,
|
|
53
|
+
config,
|
|
54
|
+
global_configs,
|
|
55
|
+
request_queue,
|
|
56
|
+
response_queue
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
async def run(
|
|
60
|
+
self,
|
|
61
|
+
action_id: str,
|
|
62
|
+
run_id: str,
|
|
63
|
+
input_data: Dict[str, Any]
|
|
64
|
+
) -> Any:
|
|
65
|
+
"""Execute component action"""
|
|
66
|
+
return await self.execute({
|
|
67
|
+
"action_id": action_id,
|
|
68
|
+
"run_id": run_id,
|
|
69
|
+
"input": input_data
|
|
70
|
+
})
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
from typing import Any, Dict
|
|
2
|
+
from mindor.core.foundation import ProcessWorker
|
|
3
|
+
from mindor.core.component.base import ComponentGlobalConfigs
|
|
4
|
+
from mindor.core.component.component import create_component
|
|
5
|
+
from mindor.dsl.schema.component import ComponentConfig
|
|
6
|
+
from mindor.dsl.schema.runtime import EmbeddedRuntimeConfig
|
|
7
|
+
from mindor.core.logger import logging
|
|
8
|
+
from multiprocessing import Queue
|
|
9
|
+
|
|
10
|
+
class ComponentProcessWorker(ProcessWorker):
|
|
11
|
+
"""Worker for running components in separate processes"""
|
|
12
|
+
|
|
13
|
+
def __init__(
|
|
14
|
+
self,
|
|
15
|
+
component_id: str,
|
|
16
|
+
config: ComponentConfig,
|
|
17
|
+
global_configs: ComponentGlobalConfigs,
|
|
18
|
+
request_queue: Queue,
|
|
19
|
+
response_queue: Queue
|
|
20
|
+
):
|
|
21
|
+
super().__init__(component_id, request_queue, response_queue)
|
|
22
|
+
self.config = config
|
|
23
|
+
self.global_configs = global_configs
|
|
24
|
+
self.component = None
|
|
25
|
+
|
|
26
|
+
async def _initialize(self) -> None:
|
|
27
|
+
"""Initialize and start the component"""
|
|
28
|
+
embedded_config = self.config.model_copy(deep=True)
|
|
29
|
+
embedded_config.runtime = EmbeddedRuntimeConfig(type="embedded")
|
|
30
|
+
|
|
31
|
+
self.component = create_component(
|
|
32
|
+
self.worker_id,
|
|
33
|
+
embedded_config,
|
|
34
|
+
self.global_configs,
|
|
35
|
+
daemon=True
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
await self.component.setup()
|
|
39
|
+
await self.component.start()
|
|
40
|
+
|
|
41
|
+
logging.info(f"Component {self.worker_id} started in subprocess")
|
|
42
|
+
|
|
43
|
+
async def _execute_task(self, payload: Dict[str, Any]) -> Any:
|
|
44
|
+
"""Execute component action"""
|
|
45
|
+
action_id = payload["action_id"]
|
|
46
|
+
run_id = payload["run_id"]
|
|
47
|
+
input_data = payload["input"]
|
|
48
|
+
|
|
49
|
+
output = await self.component.run(action_id, run_id, input_data)
|
|
50
|
+
return output
|
|
51
|
+
|
|
52
|
+
async def _cleanup(self) -> None:
|
|
53
|
+
"""Clean up the component"""
|
|
54
|
+
if self.component:
|
|
55
|
+
await self.component.stop()
|
|
56
|
+
await self.component.teardown()
|
{model_compose-0.4.19 → model_compose-0.4.20}/src/mindor/core/controller/runtime/docker/docker.py
RENAMED
|
@@ -26,6 +26,12 @@ class DockerRuntimeLauncher:
|
|
|
26
26
|
if not self.config.runtime.ports:
|
|
27
27
|
self.config.runtime.ports = [ port for port in [ self.config.port, getattr(self.config.webui, "port", None) ] if port ]
|
|
28
28
|
|
|
29
|
+
# Automatically add host.docker.internal for host machine access
|
|
30
|
+
if not self.config.runtime.extra_hosts:
|
|
31
|
+
self.config.runtime.extra_hosts = {}
|
|
32
|
+
if "host.docker.internal" not in self.config.runtime.extra_hosts:
|
|
33
|
+
self.config.runtime.extra_hosts["host.docker.internal"] = "host-gateway"
|
|
34
|
+
|
|
29
35
|
async def launch(self, specs: ControllerRuntimeSpecs, detach: bool) -> None:
|
|
30
36
|
docker = DockerRuntimeManager(self.config.runtime, self.verbose)
|
|
31
37
|
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
from typing import Optional, Dict, Any
|
|
2
|
+
from enum import Enum
|
|
3
|
+
from pydantic import BaseModel, Field
|
|
4
|
+
import time
|
|
5
|
+
|
|
6
|
+
class IpcMessageType(str, Enum):
|
|
7
|
+
"""IPC message types for process communication"""
|
|
8
|
+
START = "start"
|
|
9
|
+
STOP = "stop"
|
|
10
|
+
RUN = "run"
|
|
11
|
+
RESULT = "result"
|
|
12
|
+
ERROR = "error"
|
|
13
|
+
HEARTBEAT = "heartbeat"
|
|
14
|
+
STATUS = "status"
|
|
15
|
+
LOG = "log"
|
|
16
|
+
|
|
17
|
+
class IpcMessage(BaseModel):
|
|
18
|
+
"""Message format for inter-process communication"""
|
|
19
|
+
type: IpcMessageType
|
|
20
|
+
request_id: str
|
|
21
|
+
payload: Optional[Dict[str, Any]] = None
|
|
22
|
+
timestamp: int = Field(default_factory=lambda: int(time.time() * 1000))
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
from typing import Any, Dict, Optional, Callable
|
|
2
|
+
from mindor.dsl.schema.runtime import ProcessRuntimeConfig
|
|
3
|
+
from mindor.core.logger import logging
|
|
4
|
+
from .ipc_protocol import IpcMessage, IpcMessageType
|
|
5
|
+
from multiprocessing import Process, Queue
|
|
6
|
+
import asyncio, os, uuid, time
|
|
7
|
+
|
|
8
|
+
class ProcessRuntimeManager:
|
|
9
|
+
"""
|
|
10
|
+
Generic process runtime manager for running workers in separate processes.
|
|
11
|
+
|
|
12
|
+
Can be used for use cases requiring process isolation.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
def __init__(
|
|
16
|
+
self,
|
|
17
|
+
worker_id: str,
|
|
18
|
+
runtime_config: ProcessRuntimeConfig,
|
|
19
|
+
worker_factory: Callable[[str, Queue, Queue], Any]
|
|
20
|
+
):
|
|
21
|
+
"""
|
|
22
|
+
Args:
|
|
23
|
+
worker_id: Worker identifier
|
|
24
|
+
runtime_config: Process runtime configuration
|
|
25
|
+
worker_factory: Factory function to create worker instance
|
|
26
|
+
(worker_id, request_queue, response_queue) -> Worker
|
|
27
|
+
"""
|
|
28
|
+
self.worker_id = worker_id
|
|
29
|
+
self.runtime_config = runtime_config
|
|
30
|
+
self.worker_factory = worker_factory
|
|
31
|
+
|
|
32
|
+
self.subprocess: Optional[Process] = None
|
|
33
|
+
self.request_queue: Optional[Queue] = None
|
|
34
|
+
self.response_queue: Optional[Queue] = None
|
|
35
|
+
self.pending_requests: Dict[str, asyncio.Future] = {}
|
|
36
|
+
self.response_handler_task: Optional[asyncio.Task] = None
|
|
37
|
+
|
|
38
|
+
async def start(self) -> None:
|
|
39
|
+
"""Start the subprocess"""
|
|
40
|
+
self.request_queue = Queue()
|
|
41
|
+
self.response_queue = Queue()
|
|
42
|
+
|
|
43
|
+
self.subprocess = Process(
|
|
44
|
+
target=self._run_worker,
|
|
45
|
+
args=(
|
|
46
|
+
self.worker_id,
|
|
47
|
+
self.request_queue,
|
|
48
|
+
self.response_queue
|
|
49
|
+
),
|
|
50
|
+
daemon=False
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
if self.runtime_config.env:
|
|
54
|
+
for key, value in self.runtime_config.env.items():
|
|
55
|
+
os.environ[key] = value
|
|
56
|
+
|
|
57
|
+
self.subprocess.start()
|
|
58
|
+
logging.info(f"Started subprocess for worker {self.worker_id} (PID: {self.subprocess.pid})")
|
|
59
|
+
|
|
60
|
+
await self._wait_for_ready()
|
|
61
|
+
|
|
62
|
+
self.response_handler_task = asyncio.create_task(
|
|
63
|
+
self._handle_responses()
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
async def stop(self) -> None:
|
|
67
|
+
"""Stop the subprocess"""
|
|
68
|
+
logging.info(f"Stopping subprocess for worker {self.worker_id}")
|
|
69
|
+
|
|
70
|
+
stop_message = IpcMessage(
|
|
71
|
+
type=IpcMessageType.STOP,
|
|
72
|
+
request_id=str(uuid.uuid4())
|
|
73
|
+
)
|
|
74
|
+
self.request_queue.put(stop_message.model_dump())
|
|
75
|
+
|
|
76
|
+
timeout_seconds = self._parse_timeout(self.runtime_config.stop_timeout)
|
|
77
|
+
|
|
78
|
+
try:
|
|
79
|
+
self.subprocess.join(timeout=timeout_seconds)
|
|
80
|
+
except TimeoutError:
|
|
81
|
+
logging.warning(f"Process {self.worker_id} did not stop gracefully, terminating")
|
|
82
|
+
self.subprocess.terminate()
|
|
83
|
+
self.subprocess.join(timeout=5)
|
|
84
|
+
if self.subprocess.is_alive():
|
|
85
|
+
logging.error(f"Process {self.worker_id} did not terminate, killing")
|
|
86
|
+
self.subprocess.kill()
|
|
87
|
+
|
|
88
|
+
if self.response_handler_task:
|
|
89
|
+
self.response_handler_task.cancel()
|
|
90
|
+
|
|
91
|
+
async def execute(self, payload: Dict[str, Any]) -> Any:
|
|
92
|
+
"""Execute a task in the subprocess"""
|
|
93
|
+
request_id = str(uuid.uuid4())
|
|
94
|
+
|
|
95
|
+
message = IpcMessage(
|
|
96
|
+
type=IpcMessageType.RUN,
|
|
97
|
+
request_id=request_id,
|
|
98
|
+
payload=payload
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
future = asyncio.get_event_loop().create_future()
|
|
102
|
+
self.pending_requests[request_id] = future
|
|
103
|
+
|
|
104
|
+
self.request_queue.put(message.model_dump())
|
|
105
|
+
|
|
106
|
+
try:
|
|
107
|
+
result = await future
|
|
108
|
+
return result
|
|
109
|
+
finally:
|
|
110
|
+
self.pending_requests.pop(request_id, None)
|
|
111
|
+
|
|
112
|
+
async def _handle_responses(self) -> None:
|
|
113
|
+
"""Handle responses from the subprocess"""
|
|
114
|
+
while True:
|
|
115
|
+
try:
|
|
116
|
+
if not self.response_queue.empty():
|
|
117
|
+
message_dict = self.response_queue.get_nowait()
|
|
118
|
+
message = IpcMessage(**message_dict)
|
|
119
|
+
|
|
120
|
+
if message.request_id in self.pending_requests:
|
|
121
|
+
future = self.pending_requests[message.request_id]
|
|
122
|
+
|
|
123
|
+
if message.type == IpcMessageType.RESULT:
|
|
124
|
+
future.set_result(message.payload.get("output"))
|
|
125
|
+
elif message.type == IpcMessageType.ERROR:
|
|
126
|
+
error = message.payload.get("error", "Unknown error")
|
|
127
|
+
future.set_exception(Exception(error))
|
|
128
|
+
|
|
129
|
+
await asyncio.sleep(0.01)
|
|
130
|
+
except asyncio.CancelledError:
|
|
131
|
+
break
|
|
132
|
+
except Exception as e:
|
|
133
|
+
logging.error(f"Error handling response: {e}")
|
|
134
|
+
|
|
135
|
+
async def _wait_for_ready(self) -> None:
|
|
136
|
+
"""Wait for subprocess to be ready"""
|
|
137
|
+
timeout = self._parse_timeout(self.runtime_config.start_timeout)
|
|
138
|
+
start_time = time.time()
|
|
139
|
+
|
|
140
|
+
while time.time() - start_time < timeout:
|
|
141
|
+
if not self.response_queue.empty():
|
|
142
|
+
message_dict = self.response_queue.get()
|
|
143
|
+
message = IpcMessage(**message_dict)
|
|
144
|
+
|
|
145
|
+
if message.type == IpcMessageType.RESULT and \
|
|
146
|
+
message.payload.get("status") == "ready":
|
|
147
|
+
logging.info(f"Subprocess {self.worker_id} is ready")
|
|
148
|
+
return
|
|
149
|
+
|
|
150
|
+
await asyncio.sleep(0.5)
|
|
151
|
+
|
|
152
|
+
raise TimeoutError(
|
|
153
|
+
f"Process {self.worker_id} did not start within {timeout}s"
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
def _run_worker(
|
|
157
|
+
self,
|
|
158
|
+
worker_id: str,
|
|
159
|
+
request_queue: Queue,
|
|
160
|
+
response_queue: Queue
|
|
161
|
+
) -> None:
|
|
162
|
+
"""Subprocess entry point"""
|
|
163
|
+
loop = asyncio.new_event_loop()
|
|
164
|
+
asyncio.set_event_loop(loop)
|
|
165
|
+
|
|
166
|
+
worker = self.worker_factory(worker_id, request_queue, response_queue)
|
|
167
|
+
|
|
168
|
+
try:
|
|
169
|
+
loop.run_until_complete(worker.run())
|
|
170
|
+
except KeyboardInterrupt:
|
|
171
|
+
pass
|
|
172
|
+
finally:
|
|
173
|
+
loop.close()
|
|
174
|
+
|
|
175
|
+
@staticmethod
|
|
176
|
+
def _parse_timeout(timeout_str: str) -> float:
|
|
177
|
+
"""Parse timeout string (e.g., '60s', '2m') to seconds"""
|
|
178
|
+
timeout_str = timeout_str.strip().lower()
|
|
179
|
+
|
|
180
|
+
if timeout_str.endswith('s'):
|
|
181
|
+
return float(timeout_str[:-1])
|
|
182
|
+
elif timeout_str.endswith('m'):
|
|
183
|
+
return float(timeout_str[:-1]) * 60
|
|
184
|
+
elif timeout_str.endswith('h'):
|
|
185
|
+
return float(timeout_str[:-1]) * 3600
|
|
186
|
+
else:
|
|
187
|
+
return float(timeout_str)
|