model-compose 0.4.11__tar.gz → 0.4.13__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.11/src/model_compose.egg-info → model_compose-0.4.13}/PKG-INFO +15 -9
- {model_compose-0.4.11 → model_compose-0.4.13}/README.md +13 -7
- {model_compose-0.4.11 → model_compose-0.4.13}/pyproject.toml +2 -2
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/context.py +1 -1
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/gateway/base.py +5 -1
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/gateway/gateway.py +2 -1
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/gateway/services/http_tunnel/base.py +17 -6
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/gateway/services/http_tunnel/drivers/ngrok.py +16 -11
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/gateway/services/http_tunnel/http_tunnel.py +14 -6
- model_compose-0.4.13/src/mindor/core/gateway/services/ssh_tunnel.py +79 -0
- model_compose-0.4.13/src/mindor/core/utils/ssh_client.py +206 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/common.py +1 -1
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/controller/impl/http_server.py +1 -1
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/controller/impl/mcp_server.py +1 -1
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/controller/webui/impl/common.py +1 -1
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/gateway/impl/common.py +0 -1
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/common.py +9 -0
- model_compose-0.4.13/src/mindor/dsl/schema/gateway/impl/ssh_tunnel.py +26 -0
- {model_compose-0.4.11 → model_compose-0.4.13/src/model_compose.egg-info}/PKG-INFO +15 -9
- model_compose-0.4.11/src/mindor/core/gateway/services/ssh_tunnel.py +0 -23
- model_compose-0.4.11/src/mindor/core/utils/ssh_client.py +0 -4
- model_compose-0.4.11/src/mindor/dsl/schema/gateway/impl/ssh_tunnel.py +0 -9
- {model_compose-0.4.11 → model_compose-0.4.13}/LICENSE +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/setup.cfg +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/cli/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/cli/compose.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/base.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/component.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/datasets/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/datasets/datasets.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/datasets/providers/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/datasets/providers/common.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/datasets/providers/huggingface.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/datasets/providers/local.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/datasets/utils.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/http_client.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/http_server.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/image_processor.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/mcp_client.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/mcp_server.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/model/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/model/base/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/model/base/common.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/model/base/huggingface.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/model/base/huggingface_hub.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/model/base/unsloth.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/model/model.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/model/tasks/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/model/tasks/chat_completion/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/model/tasks/chat_completion/huggingface.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/model/tasks/face_embedding/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/model/tasks/face_embedding/common.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/model/tasks/face_embedding/custom.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/model/tasks/face_embedding/insightface.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/model/tasks/image_generation/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/model/tasks/image_generation/common.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/model/tasks/image_generation/custom.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/model/tasks/image_generation/flux.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/model/tasks/image_generation/hunyuan_image.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/model/tasks/image_generation/sdxl.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/model/tasks/image_to_text/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/model/tasks/image_to_text/huggingface.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/model/tasks/image_upscale/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/model/tasks/image_upscale/common.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/model/tasks/image_upscale/custom.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/model/tasks/image_upscale/esrgan.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/model/tasks/image_upscale/ldsr.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/model/tasks/image_upscale/real_esrgan.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/model/tasks/image_upscale/swinir.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/model/tasks/text_classification/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/model/tasks/text_classification/huggingface.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/model/tasks/text_embedding/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/model/tasks/text_embedding/huggingface.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/model/tasks/text_generation/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/model/tasks/text_generation/huggingface.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/shell.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/text_splitter.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/vector_store/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/vector_store/base.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/vector_store/drivers/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/vector_store/drivers/chroma.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/vector_store/drivers/milvus.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/vector_store/vector_store.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/component/services/workflow.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/compose/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/compose/compose.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/compose/manager.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/controller/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/controller/base.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/controller/controller.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/controller/runner/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/controller/runner/client.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/controller/runner/http_client.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/controller/runner/mcp_client.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/controller/runner/runner.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/controller/runtime/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/controller/runtime/docker/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/controller/runtime/docker/context/Dockerfile +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/controller/runtime/docker/docker.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/controller/runtime/native/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/controller/runtime/native/native.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/controller/runtime/specs.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/controller/services/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/controller/services/http_server.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/controller/services/mcp_server.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/controller/webui/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/controller/webui/gradio.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/controller/webui/webui.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/foundation/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/foundation/async_service.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/gateway/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/gateway/services/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/gateway/services/http_tunnel/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/gateway/services/http_tunnel/drivers/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/gateway/services/http_tunnel/drivers/cloudflare.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/listener/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/listener/base.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/listener/listener.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/listener/services/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/listener/services/http_callback.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/listener/services/http_trigger.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/logger/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/logger/base.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/logger/logger.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/logger/logging.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/logger/services/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/logger/services/console.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/logger/services/file.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/runtime/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/runtime/docker/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/runtime/docker/docker.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/runtime/env.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/utils/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/utils/caching.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/utils/http_client.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/utils/http_request.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/utils/http_response.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/utils/http_status.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/utils/image.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/utils/mcp_client.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/utils/package.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/utils/renderers.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/utils/resolvers.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/utils/shell.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/utils/streamer.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/utils/streaming.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/utils/time.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/utils/url.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/utils/websocket_client.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/utils/work_queue.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/workflow/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/workflow/context.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/workflow/job/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/workflow/job/base.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/workflow/job/impl/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/workflow/job/impl/action.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/workflow/job/impl/delay.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/workflow/job/impl/filter.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/workflow/job/impl/if_.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/workflow/job/impl/random_router.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/workflow/job/impl/switch.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/workflow/job/job.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/workflow/schema.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/workflow/workflow.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/loader.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/action.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/common.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/datasets/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/datasets/common.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/datasets/datasets.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/datasets/providers/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/datasets/providers/common.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/datasets/providers/huggingface.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/datasets/providers/local.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/http_client.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/http_server.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/image_processor.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/mcp_client.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/mcp_server.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/model/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/model/impl/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/model/impl/chat_completion.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/model/impl/common.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/model/impl/face_embedding/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/model/impl/face_embedding/face_embedding.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/model/impl/face_embedding/impl/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/model/impl/face_embedding/impl/common.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/model/impl/face_embedding/impl/dlib.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/model/impl/face_embedding/impl/facenet.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/model/impl/face_embedding/impl/insightface.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/model/impl/image_generation/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/model/impl/image_generation/image_generation.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/model/impl/image_generation/impl/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/model/impl/image_generation/impl/common.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/model/impl/image_generation/impl/flux.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/model/impl/image_generation/impl/hunyuan_image.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/model/impl/image_generation/impl/sdxl.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/model/impl/image_to_text.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/image_upscale.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/impl/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/impl/common.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/impl/esrgan.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/impl/ldsr.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/impl/real_esrgan.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/impl/swinir.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/model/impl/text_classification.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/model/impl/text_embedding.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/model/impl/text_generation.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/model/model.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/model_trainer/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/model_trainer/impl/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/model_trainer/impl/classification.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/model_trainer/impl/common.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/model_trainer/impl/sft.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/model_trainer/model_trainer.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/shell.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/text_splitter.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/vector_store/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/vector_store/impl/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/vector_store/impl/chroma.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/vector_store/impl/common.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/vector_store/impl/faiss.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/vector_store/impl/milvus.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/vector_store/impl/qdrant.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/vector_store/vector_store.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/action/impl/workflow.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/component.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/datasets/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/datasets/datasets.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/http_client.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/http_server.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/image_processor.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/mcp_client.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/mcp_server.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/model/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/model/impl/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/model/impl/chat_completion.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/model/impl/common.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/model/impl/face_embedding/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/model/impl/face_embedding/face_embedding.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/model/impl/face_embedding/impl/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/model/impl/face_embedding/impl/common.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/model/impl/face_embedding/impl/dlib.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/model/impl/face_embedding/impl/facenet.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/model/impl/face_embedding/impl/insightface.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/model/impl/image_generation/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/model/impl/image_generation/image_generation.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/model/impl/image_generation/impl/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/model/impl/image_generation/impl/common.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/model/impl/image_generation/impl/flux.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/model/impl/image_generation/impl/hunyuan_image.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/model/impl/image_generation/impl/sdxl.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/model/impl/image_to_text.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/image_upscale.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/impl/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/impl/common.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/impl/esrgan.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/impl/ldsr.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/impl/real_esrgan.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/impl/swinir.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/model/impl/text_classification.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/model/impl/text_embedding.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/model/impl/text_generation.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/model/model.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/model_trainer/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/model_trainer/impl/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/model_trainer/impl/classification.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/model_trainer/impl/common.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/model_trainer/impl/sft.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/model_trainer/model_trainer.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/shell.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/text_splitter.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/types.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/vector_store/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/vector_store/impl/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/vector_store/impl/chroma.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/vector_store/impl/common.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/vector_store/impl/faiss.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/vector_store/impl/milvus.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/vector_store/impl/qdrant.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/vector_store/vector_store.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/workflow.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/compose.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/controller/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/controller/controller.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/controller/impl/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/controller/impl/common.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/controller/impl/types.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/controller/webui/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/controller/webui/impl/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/controller/webui/impl/dynamic.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/controller/webui/impl/gradio.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/controller/webui/impl/static.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/controller/webui/webui.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/gateway/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/gateway/gateway.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/gateway/impl/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/gateway/impl/http_tunnel/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/gateway/impl/http_tunnel/http_tunnel.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/cloudflare.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/ngrok.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/gateway/impl/types.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/job/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/job/impl/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/job/impl/action.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/job/impl/common.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/job/impl/delay.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/job/impl/filter.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/job/impl/if_.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/job/impl/random_router.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/job/impl/switch.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/job/impl/types.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/job/job.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/listener/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/listener/impl/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/listener/impl/common.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/listener/impl/http_callback.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/listener/impl/http_trigger.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/listener/impl/types.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/listener/listener.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/logger/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/logger/impl/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/logger/impl/common.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/logger/impl/console.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/logger/impl/file.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/logger/impl/types.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/logger/logger.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/runtime/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/runtime/impl/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/runtime/impl/common.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/runtime/impl/docker.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/runtime/impl/native.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/runtime/impl/types.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/runtime/runtime.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/transport/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/transport/http.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/transport/ssh.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/workflow.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/utils/__init__.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/utils/annotation.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/utils/enum.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/utils/path.py +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/model_compose.egg-info/SOURCES.txt +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/model_compose.egg-info/dependency_links.txt +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/model_compose.egg-info/entry_points.txt +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/model_compose.egg-info/requires.txt +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/src/model_compose.egg-info/top_level.txt +0 -0
- {model_compose-0.4.11 → model_compose-0.4.13}/tests/test_cli.py +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: model-compose
|
|
3
|
-
Version: 0.4.
|
|
4
|
-
Summary: model-compose: Declarative AI
|
|
3
|
+
Version: 0.4.13
|
|
4
|
+
Summary: model-compose: Declarative AI Workflow Orchestrator
|
|
5
5
|
Author-email: Hanyeol Cho <hanyeol.cho@gmail.com>
|
|
6
6
|
License-Expression: MIT
|
|
7
7
|
Project-URL: Homepage, https://github.com/hanyeol/model-compose
|
|
@@ -38,7 +38,7 @@ Dynamic: license-file
|
|
|
38
38
|
|
|
39
39
|
---
|
|
40
40
|
|
|
41
|
-
# 🤖
|
|
41
|
+
# 🤖 Model-Compose
|
|
42
42
|
|
|
43
43
|
**model-compose** is a declarative AI workflow orchestrator inspired by `docker-compose`. It lets you define and run AI model pipelines using simple YAML files — no custom code required. Effortlessly connect external AI services (OpenAI, Anthropic, Google, etc.), run local AI models, integrate vector stores, and more — all within powerful, composable workflows.
|
|
44
44
|
|
|
@@ -54,12 +54,13 @@ Dynamic: license-file
|
|
|
54
54
|
|
|
55
55
|
## ✨ Features
|
|
56
56
|
|
|
57
|
-
- 🎨 **
|
|
57
|
+
- 🎨 **No-Code**: Pure YAML configuration—no scripting required
|
|
58
58
|
- 🔄 **Composable**: Reusable components and multi-step workflows
|
|
59
59
|
- 🚀 **Production Ready**: HTTP/MCP servers + Web UI + Docker deployment
|
|
60
60
|
- 🔌 **Connect Anything**: External AI services, local models, vector stores, and more
|
|
61
61
|
- ⚡ **Stream & Scale**: Real-time streaming and event-driven automation
|
|
62
|
-
-
|
|
62
|
+
- ⚙️ **Configuration**: Environment variables, flexible settings
|
|
63
|
+
- 🔗 **Integration**: Webhooks, tunneling, HTTP servers
|
|
63
64
|
|
|
64
65
|
---
|
|
65
66
|
|
|
@@ -114,10 +115,15 @@ workflows:
|
|
|
114
115
|
- component: chatgpt
|
|
115
116
|
```
|
|
116
117
|
|
|
118
|
+
Create a `.env` file:
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
OPENAI_API_KEY=your-key
|
|
122
|
+
```
|
|
123
|
+
|
|
117
124
|
Run it:
|
|
118
125
|
|
|
119
126
|
```bash
|
|
120
|
-
export OPENAI_API_KEY=your-key
|
|
121
127
|
model-compose up
|
|
122
128
|
```
|
|
123
129
|
|
|
@@ -129,7 +135,7 @@ Your API is now live at `http://localhost:8080` and Web UI at `http://localhost:
|
|
|
129
135
|
## 💡 Key Capabilities
|
|
130
136
|
|
|
131
137
|
### 🖥️ Built-in Web UI
|
|
132
|
-
Add a
|
|
138
|
+
Add a web interface by adding just 2 lines to your YAML:
|
|
133
139
|
```yaml
|
|
134
140
|
controller:
|
|
135
141
|
webui:
|
|
@@ -141,9 +147,9 @@ Instantly get a user-friendly interface to test and monitor your workflows. Supp
|
|
|
141
147
|
Transform your workflows into MCP tools by changing one line:
|
|
142
148
|
```yaml
|
|
143
149
|
controller:
|
|
144
|
-
type: mcp-server
|
|
150
|
+
type: mcp-server
|
|
145
151
|
```
|
|
146
|
-
|
|
152
|
+
Just set the type to `mcp-server`. Your workflows become instantly accessible via the Model Context Protocol.
|
|
147
153
|
|
|
148
154
|
### 🐳 Docker Deployment
|
|
149
155
|
Deploy anywhere with built-in Docker support:
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
|
|
15
15
|
---
|
|
16
16
|
|
|
17
|
-
# 🤖
|
|
17
|
+
# 🤖 Model-Compose
|
|
18
18
|
|
|
19
19
|
**model-compose** is a declarative AI workflow orchestrator inspired by `docker-compose`. It lets you define and run AI model pipelines using simple YAML files — no custom code required. Effortlessly connect external AI services (OpenAI, Anthropic, Google, etc.), run local AI models, integrate vector stores, and more — all within powerful, composable workflows.
|
|
20
20
|
|
|
@@ -30,12 +30,13 @@
|
|
|
30
30
|
|
|
31
31
|
## ✨ Features
|
|
32
32
|
|
|
33
|
-
- 🎨 **
|
|
33
|
+
- 🎨 **No-Code**: Pure YAML configuration—no scripting required
|
|
34
34
|
- 🔄 **Composable**: Reusable components and multi-step workflows
|
|
35
35
|
- 🚀 **Production Ready**: HTTP/MCP servers + Web UI + Docker deployment
|
|
36
36
|
- 🔌 **Connect Anything**: External AI services, local models, vector stores, and more
|
|
37
37
|
- ⚡ **Stream & Scale**: Real-time streaming and event-driven automation
|
|
38
|
-
-
|
|
38
|
+
- ⚙️ **Configuration**: Environment variables, flexible settings
|
|
39
|
+
- 🔗 **Integration**: Webhooks, tunneling, HTTP servers
|
|
39
40
|
|
|
40
41
|
---
|
|
41
42
|
|
|
@@ -90,10 +91,15 @@ workflows:
|
|
|
90
91
|
- component: chatgpt
|
|
91
92
|
```
|
|
92
93
|
|
|
94
|
+
Create a `.env` file:
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
OPENAI_API_KEY=your-key
|
|
98
|
+
```
|
|
99
|
+
|
|
93
100
|
Run it:
|
|
94
101
|
|
|
95
102
|
```bash
|
|
96
|
-
export OPENAI_API_KEY=your-key
|
|
97
103
|
model-compose up
|
|
98
104
|
```
|
|
99
105
|
|
|
@@ -105,7 +111,7 @@ Your API is now live at `http://localhost:8080` and Web UI at `http://localhost:
|
|
|
105
111
|
## 💡 Key Capabilities
|
|
106
112
|
|
|
107
113
|
### 🖥️ Built-in Web UI
|
|
108
|
-
Add a
|
|
114
|
+
Add a web interface by adding just 2 lines to your YAML:
|
|
109
115
|
```yaml
|
|
110
116
|
controller:
|
|
111
117
|
webui:
|
|
@@ -117,9 +123,9 @@ Instantly get a user-friendly interface to test and monitor your workflows. Supp
|
|
|
117
123
|
Transform your workflows into MCP tools by changing one line:
|
|
118
124
|
```yaml
|
|
119
125
|
controller:
|
|
120
|
-
type: mcp-server
|
|
126
|
+
type: mcp-server
|
|
121
127
|
```
|
|
122
|
-
|
|
128
|
+
Just set the type to `mcp-server`. Your workflows become instantly accessible via the Model Context Protocol.
|
|
123
129
|
|
|
124
130
|
### 🐳 Docker Deployment
|
|
125
131
|
Deploy anywhere with built-in Docker support:
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "model-compose"
|
|
3
|
-
version = "0.4.
|
|
4
|
-
description = "model-compose: Declarative AI
|
|
3
|
+
version = "0.4.13"
|
|
4
|
+
description = "model-compose: Declarative AI Workflow Orchestrator"
|
|
5
5
|
authors = [
|
|
6
6
|
{ name = "Hanyeol Cho", email = "hanyeol.cho@gmail.com" }
|
|
7
7
|
]
|
|
@@ -12,7 +12,11 @@ class GatewayService(AsyncService):
|
|
|
12
12
|
self.config: GatewayConfig = config
|
|
13
13
|
|
|
14
14
|
@abstractmethod
|
|
15
|
-
def get_context(self) -> Dict[str, Any]:
|
|
15
|
+
def get_context(self, port: int) -> Optional[Dict[str, Any]]:
|
|
16
|
+
pass
|
|
17
|
+
|
|
18
|
+
@abstractmethod
|
|
19
|
+
def serves_port(self, port: int) -> bool:
|
|
16
20
|
pass
|
|
17
21
|
|
|
18
22
|
async def _install_package(self, package_spec: str, repository: Optional[str]) -> None:
|
|
@@ -20,6 +20,7 @@ def create_gateway(id: str, config: GatewayConfig, daemon: bool) -> GatewayServi
|
|
|
20
20
|
|
|
21
21
|
def find_gateway_by_port(port: int) -> Optional[GatewayService]:
|
|
22
22
|
for gateway in GatewayInstances.values():
|
|
23
|
-
if gateway.
|
|
23
|
+
if gateway.serves_port(port):
|
|
24
24
|
return gateway
|
|
25
|
+
|
|
25
26
|
return None
|
{model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/core/gateway/services/http_tunnel/base.py
RENAMED
|
@@ -6,22 +6,33 @@ from mindor.core.logger import logging
|
|
|
6
6
|
class CommonHttpTunnelGateway:
|
|
7
7
|
def __init__(self, config: HttpTunnelGatewayConfig):
|
|
8
8
|
self.config: HttpTunnelGatewayConfig = config
|
|
9
|
-
self.
|
|
9
|
+
self.public_urls = Optional[Dict[int, str]]
|
|
10
10
|
|
|
11
11
|
def get_setup_requirements(self) -> Optional[List[str]]:
|
|
12
12
|
return None
|
|
13
13
|
|
|
14
14
|
async def serve(self) -> None:
|
|
15
|
-
self.
|
|
16
|
-
|
|
15
|
+
self.public_urls = await self._serve()
|
|
16
|
+
|
|
17
|
+
for port, public_url in (self.public_urls or {}).items():
|
|
18
|
+
logging.info("HTTP tunnel started on port %d: %s", port, public_url)
|
|
17
19
|
|
|
18
20
|
async def shutdown(self) -> None:
|
|
19
21
|
await self._shutdown()
|
|
20
|
-
|
|
21
|
-
self.
|
|
22
|
+
|
|
23
|
+
for port, public_url in (self.public_urls or {}).items():
|
|
24
|
+
logging.info("HTTP tunnel stopped on port %d: %s", port, public_url)
|
|
25
|
+
|
|
26
|
+
self.public_urls = None
|
|
27
|
+
|
|
28
|
+
def get_public_url(self, port: int) -> Optional[str]:
|
|
29
|
+
if self.public_urls:
|
|
30
|
+
return self.public_urls.get(port)
|
|
31
|
+
|
|
32
|
+
return None
|
|
22
33
|
|
|
23
34
|
@abstractmethod
|
|
24
|
-
async def _serve(self) -> str:
|
|
35
|
+
async def _serve(self) -> Optional[Dict[int, str]]:
|
|
25
36
|
pass
|
|
26
37
|
|
|
27
38
|
@abstractmethod
|
|
@@ -13,24 +13,29 @@ class NgrokHttpTunnelGateway(CommonHttpTunnelGateway):
|
|
|
13
13
|
def __init__(self, config: HttpTunnelGatewayConfig):
|
|
14
14
|
super().__init__(config)
|
|
15
15
|
|
|
16
|
-
self.
|
|
16
|
+
self.tunnels: Optional[Dict[int, ngrok.NgrokTunnel]] = None
|
|
17
17
|
|
|
18
18
|
def get_setup_requirements(self) -> Optional[List[str]]:
|
|
19
19
|
return [ "pyngrok" ]
|
|
20
20
|
|
|
21
|
-
async def _serve(self) -> str:
|
|
21
|
+
async def _serve(self) -> Optional[Dict[int, str]]:
|
|
22
22
|
from pyngrok import ngrok
|
|
23
23
|
|
|
24
|
-
self.
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
24
|
+
self.tunnels = {}
|
|
25
|
+
|
|
26
|
+
for port in self.config.port:
|
|
27
|
+
self.tunnels[port] = await asyncio.to_thread(
|
|
28
|
+
ngrok.connect,
|
|
29
|
+
addr=port,
|
|
30
|
+
bind_tls=True
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
return { port: tunnel.public_url for port, tunnel in self.tunnels.items() }
|
|
30
34
|
|
|
31
35
|
async def _shutdown(self) -> None:
|
|
32
36
|
from pyngrok import ngrok
|
|
33
37
|
|
|
34
|
-
|
|
35
|
-
await asyncio.to_thread(ngrok.disconnect,
|
|
36
|
-
|
|
38
|
+
for tunnel in self.tunnels.values():
|
|
39
|
+
await asyncio.to_thread(ngrok.disconnect, tunnel.public_url)
|
|
40
|
+
|
|
41
|
+
self.tunnels = None
|
|
@@ -2,7 +2,7 @@ from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annot
|
|
|
2
2
|
from abc import ABC, abstractmethod
|
|
3
3
|
from mindor.dsl.schema.gateway import HttpTunnelGatewayConfig, HttpTunnelGatewayDriver
|
|
4
4
|
from ...base import GatewayService, GatewayType, register_gateway
|
|
5
|
-
from .base import
|
|
5
|
+
from .base import CommonHttpTunnelGateway
|
|
6
6
|
from .drivers import NgrokHttpTunnelGateway, CloudflareHttpTunnelGateway
|
|
7
7
|
|
|
8
8
|
@register_gateway(GatewayType.HTTP_TUNNEL)
|
|
@@ -28,11 +28,19 @@ class HttpTunnelGateway(GatewayService):
|
|
|
28
28
|
def _get_setup_requirements(self) -> Optional[List[str]]:
|
|
29
29
|
return self.driver.get_setup_requirements()
|
|
30
30
|
|
|
31
|
-
def get_context(self) -> Dict[str, Any]:
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
31
|
+
def get_context(self, port: int) -> Optional[Dict[str, Any]]:
|
|
32
|
+
public_url = self.driver.get_public_url(port)
|
|
33
|
+
|
|
34
|
+
if public_url:
|
|
35
|
+
return {
|
|
36
|
+
"driver": self.config.driver.value,
|
|
37
|
+
"public_url": public_url
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return None
|
|
41
|
+
|
|
42
|
+
def serves_port(self, port: int) -> bool:
|
|
43
|
+
return bool(self.driver.get_public_url(port))
|
|
36
44
|
|
|
37
45
|
async def _serve(self) -> None:
|
|
38
46
|
await self.driver.serve()
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
from typing import TYPE_CHECKING
|
|
3
|
+
|
|
4
|
+
from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Callable, Iterator, Any
|
|
5
|
+
from mindor.dsl.schema.gateway import SshTunnelGatewayConfig
|
|
6
|
+
from ..base import GatewayService, GatewayType, register_gateway
|
|
7
|
+
from mindor.core.utils.ssh_client import SshClient
|
|
8
|
+
from mindor.core.logger import logging
|
|
9
|
+
import asyncio
|
|
10
|
+
|
|
11
|
+
if TYPE_CHECKING:
|
|
12
|
+
pass
|
|
13
|
+
|
|
14
|
+
@register_gateway(GatewayType.SSH_TUNNEL)
|
|
15
|
+
class SshTunnelGateway(GatewayService):
|
|
16
|
+
def __init__(self, id: str, config: SshTunnelGatewayConfig, daemon: bool):
|
|
17
|
+
super().__init__(id, config, daemon)
|
|
18
|
+
|
|
19
|
+
self.client: Optional[SshClient] = None
|
|
20
|
+
self.ports: Dict[int, int] = {} # {local_port: remote_port}
|
|
21
|
+
self._shutdown_event: Optional[asyncio.Event] = None
|
|
22
|
+
|
|
23
|
+
def _get_setup_requirements(self) -> Optional[List[str]]:
|
|
24
|
+
return [ "paramiko" ]
|
|
25
|
+
|
|
26
|
+
def get_context(self, port: int) -> Optional[Dict[str, Any]]:
|
|
27
|
+
remote_port = self.ports.get(port)
|
|
28
|
+
if remote_port is not None:
|
|
29
|
+
return {
|
|
30
|
+
"public_address": f"{self.config.connection.host}:{remote_port}"
|
|
31
|
+
}
|
|
32
|
+
return None
|
|
33
|
+
|
|
34
|
+
def serves_port(self, port: int) -> bool:
|
|
35
|
+
return port in self.ports
|
|
36
|
+
|
|
37
|
+
async def _serve(self) -> None:
|
|
38
|
+
"""Establish SSH tunnel and start remote port forwarding"""
|
|
39
|
+
logging.info(
|
|
40
|
+
f"Establishing SSH tunnel to {self.config.connection.host}:{self.config.connection.port}"
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
self._shutdown_event = asyncio.Event()
|
|
44
|
+
|
|
45
|
+
self.client = SshClient(self.config.connection)
|
|
46
|
+
await self.client.connect()
|
|
47
|
+
|
|
48
|
+
# Start remote port forwarding for each port mapping
|
|
49
|
+
for remote_port, local_port in self.config.port:
|
|
50
|
+
actual_remote_port = await self.client.start_remote_port_forwarding(
|
|
51
|
+
remote_port=remote_port,
|
|
52
|
+
local_port=local_port,
|
|
53
|
+
local_host="localhost"
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
self.ports[local_port] = actual_remote_port
|
|
57
|
+
|
|
58
|
+
logging.info(
|
|
59
|
+
f"Remote port forwarding started: {self.config.connection.host}:{remote_port} -> localhost:{local_port}"
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
# Keep the SSH connection alive until shutdown event is set
|
|
63
|
+
await self._shutdown_event.wait()
|
|
64
|
+
|
|
65
|
+
async def _shutdown(self) -> None:
|
|
66
|
+
"""Stop SSH tunnel and cleanup"""
|
|
67
|
+
# Signal the _serve task to stop
|
|
68
|
+
if self._shutdown_event:
|
|
69
|
+
self._shutdown_event.set()
|
|
70
|
+
|
|
71
|
+
if self.client:
|
|
72
|
+
logging.info(
|
|
73
|
+
f"Stopping SSH tunnel to {self.config.connection.host}:{self.config.connection.port}"
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
await self.client.close()
|
|
77
|
+
self.client = None
|
|
78
|
+
self.ports = {}
|
|
79
|
+
self._shutdown_event = None
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
from typing import TYPE_CHECKING, Optional, Dict, List, Tuple, Any
|
|
3
|
+
from mindor.dsl.schema.transport.ssh import SshConnectionConfig, SshKeyfileAuthConfig, SshPasswordAuthConfig
|
|
4
|
+
from mindor.core.logger import logging
|
|
5
|
+
import asyncio
|
|
6
|
+
import os
|
|
7
|
+
import threading
|
|
8
|
+
|
|
9
|
+
if TYPE_CHECKING:
|
|
10
|
+
import paramiko
|
|
11
|
+
|
|
12
|
+
class SshClient:
|
|
13
|
+
"""SSH client with remote port forwarding support"""
|
|
14
|
+
shared_instance: Optional["SshClient"] = None
|
|
15
|
+
|
|
16
|
+
def __init__(self, connection_config: SshConnectionConfig):
|
|
17
|
+
self.config: SshConnectionConfig = connection_config
|
|
18
|
+
self.client: Optional[paramiko.SSHClient] = None
|
|
19
|
+
self.transport: Optional[paramiko.Transport] = None
|
|
20
|
+
self.port_forwards: List[Tuple[int, int]] = []
|
|
21
|
+
self._shutdown_event: Optional[threading.Event] = None
|
|
22
|
+
self._forward_threads: List[threading.Thread] = []
|
|
23
|
+
|
|
24
|
+
async def __aenter__(self):
|
|
25
|
+
await self.connect()
|
|
26
|
+
return self
|
|
27
|
+
|
|
28
|
+
async def __aexit__(self, exc_type, exc_val, exc_tb):
|
|
29
|
+
await self.close()
|
|
30
|
+
|
|
31
|
+
async def connect(self) -> None:
|
|
32
|
+
"""Establish SSH connection"""
|
|
33
|
+
import paramiko
|
|
34
|
+
|
|
35
|
+
def _connect():
|
|
36
|
+
client = paramiko.SSHClient()
|
|
37
|
+
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
|
38
|
+
|
|
39
|
+
connect_params = {
|
|
40
|
+
"hostname": self.config.host,
|
|
41
|
+
"port": self.config.port,
|
|
42
|
+
"username": self.config.auth.username,
|
|
43
|
+
}
|
|
44
|
+
self._configure_auth(connect_params)
|
|
45
|
+
|
|
46
|
+
logging.debug(f"Connecting to {self.config.host}:{self.config.port}...")
|
|
47
|
+
client.connect(**connect_params)
|
|
48
|
+
logging.debug(f"SSH connection established to {self.config.host}:{self.config.port}")
|
|
49
|
+
|
|
50
|
+
return client
|
|
51
|
+
|
|
52
|
+
self.client = await asyncio.to_thread(_connect)
|
|
53
|
+
self.transport = self.client.get_transport()
|
|
54
|
+
self._shutdown_event = threading.Event()
|
|
55
|
+
|
|
56
|
+
def _configure_auth(self, connect_params: Dict[str, Any]) -> None:
|
|
57
|
+
if isinstance(self.config.auth, SshKeyfileAuthConfig):
|
|
58
|
+
keyfile_path = os.path.expanduser(self.config.auth.keyfile)
|
|
59
|
+
connect_params["key_filename"] = keyfile_path
|
|
60
|
+
return
|
|
61
|
+
|
|
62
|
+
if isinstance(self.config.auth, SshPasswordAuthConfig):
|
|
63
|
+
connect_params["password"] = self.config.auth.password
|
|
64
|
+
return
|
|
65
|
+
|
|
66
|
+
async def start_remote_port_forwarding(
|
|
67
|
+
self,
|
|
68
|
+
remote_port: int,
|
|
69
|
+
local_port: int,
|
|
70
|
+
local_host: str = "localhost"
|
|
71
|
+
) -> int:
|
|
72
|
+
"""
|
|
73
|
+
Start remote port forwarding
|
|
74
|
+
|
|
75
|
+
Args:
|
|
76
|
+
remote_port: Port on the remote SSH server
|
|
77
|
+
local_port: Port on the local machine to forward to
|
|
78
|
+
local_host: Local host address (default: localhost)
|
|
79
|
+
|
|
80
|
+
Returns:
|
|
81
|
+
The actual remote port bound (may differ if remote_port was 0)
|
|
82
|
+
"""
|
|
83
|
+
import paramiko
|
|
84
|
+
|
|
85
|
+
def _start_forwarding():
|
|
86
|
+
actual_remote_port = self.transport.request_port_forward(
|
|
87
|
+
address="0.0.0.0", # Bind to all interfaces on remote
|
|
88
|
+
port=remote_port
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
logging.debug(
|
|
92
|
+
f"Remote port forwarding: {self.config.host}:{actual_remote_port} -> "
|
|
93
|
+
f"{local_host}:{local_port}"
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
def handler():
|
|
97
|
+
while self._shutdown_event and not self._shutdown_event.is_set():
|
|
98
|
+
try:
|
|
99
|
+
channel = self.transport.accept(timeout=1.0)
|
|
100
|
+
if channel is None:
|
|
101
|
+
continue
|
|
102
|
+
|
|
103
|
+
forward_thread = threading.Thread(
|
|
104
|
+
target=self._handle_forward,
|
|
105
|
+
args=(channel, local_host, local_port),
|
|
106
|
+
daemon=True
|
|
107
|
+
)
|
|
108
|
+
forward_thread.start()
|
|
109
|
+
except Exception as e:
|
|
110
|
+
if self._shutdown_event and not self._shutdown_event.is_set():
|
|
111
|
+
logging.error(f"Error accepting connection: {e}")
|
|
112
|
+
break
|
|
113
|
+
|
|
114
|
+
handler_thread = threading.Thread(target=handler, daemon=True)
|
|
115
|
+
handler_thread.start()
|
|
116
|
+
self._forward_threads.append(handler_thread)
|
|
117
|
+
|
|
118
|
+
return actual_remote_port
|
|
119
|
+
|
|
120
|
+
actual_remote_port = await asyncio.to_thread(_start_forwarding)
|
|
121
|
+
self.port_forwards.append((actual_remote_port, local_port))
|
|
122
|
+
|
|
123
|
+
return actual_remote_port
|
|
124
|
+
|
|
125
|
+
def _handle_forward(
|
|
126
|
+
self,
|
|
127
|
+
remote_channel: paramiko.Channel,
|
|
128
|
+
local_host: str,
|
|
129
|
+
local_port: int
|
|
130
|
+
) -> None:
|
|
131
|
+
"""Handle a single forwarded connection"""
|
|
132
|
+
import socket
|
|
133
|
+
|
|
134
|
+
try:
|
|
135
|
+
local_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
136
|
+
local_socket.connect((local_host, local_port))
|
|
137
|
+
|
|
138
|
+
def forward_data(source, destination):
|
|
139
|
+
try:
|
|
140
|
+
while True:
|
|
141
|
+
data = source.recv(1024)
|
|
142
|
+
if len(data) == 0:
|
|
143
|
+
break
|
|
144
|
+
destination.sendall(data)
|
|
145
|
+
except Exception:
|
|
146
|
+
pass
|
|
147
|
+
finally:
|
|
148
|
+
source.close()
|
|
149
|
+
destination.close()
|
|
150
|
+
|
|
151
|
+
threads = [
|
|
152
|
+
threading.Thread(target=forward_data, args=(remote_channel, local_socket), daemon=True),
|
|
153
|
+
threading.Thread(target=forward_data, args=(local_socket, remote_channel), daemon=True),
|
|
154
|
+
]
|
|
155
|
+
|
|
156
|
+
for thread in threads:
|
|
157
|
+
thread.start()
|
|
158
|
+
|
|
159
|
+
for thread in threads:
|
|
160
|
+
thread.join()
|
|
161
|
+
|
|
162
|
+
except Exception as e:
|
|
163
|
+
logging.error(f"Error handling forward connection: {e}")
|
|
164
|
+
finally:
|
|
165
|
+
try:
|
|
166
|
+
remote_channel.close()
|
|
167
|
+
except Exception:
|
|
168
|
+
pass
|
|
169
|
+
|
|
170
|
+
async def close(self) -> None:
|
|
171
|
+
"""Close SSH connection and stop all port forwarding"""
|
|
172
|
+
if self._shutdown_event:
|
|
173
|
+
self._shutdown_event.set()
|
|
174
|
+
|
|
175
|
+
def _close():
|
|
176
|
+
# Cancel all remote port forwards
|
|
177
|
+
for remote_port, _ in self.port_forwards:
|
|
178
|
+
try:
|
|
179
|
+
self.transport.cancel_port_forward("0.0.0.0", remote_port)
|
|
180
|
+
logging.debug(f"Cancelled remote port forward on port {remote_port}")
|
|
181
|
+
except Exception as e:
|
|
182
|
+
logging.warning(f"Error cancelling port forward {remote_port}: {e}")
|
|
183
|
+
|
|
184
|
+
if self.client:
|
|
185
|
+
self.client.close()
|
|
186
|
+
logging.debug(f"SSH connection closed to {self.config.host}:{self.config.port}")
|
|
187
|
+
|
|
188
|
+
if self.client:
|
|
189
|
+
await asyncio.to_thread(_close)
|
|
190
|
+
|
|
191
|
+
self.client = None
|
|
192
|
+
self.transport = None
|
|
193
|
+
self.port_forwards = []
|
|
194
|
+
self._forward_threads = []
|
|
195
|
+
self._shutdown_event = None
|
|
196
|
+
|
|
197
|
+
def is_connected(self) -> bool:
|
|
198
|
+
"""Check if SSH connection is active"""
|
|
199
|
+
return self.client is not None and self.transport is not None and self.transport.is_active()
|
|
200
|
+
|
|
201
|
+
@classmethod
|
|
202
|
+
def get_shared_instance(cls, connection_config: SshConnectionConfig) -> "SshClient":
|
|
203
|
+
"""Get or create shared SSH client instance"""
|
|
204
|
+
if not cls.shared_instance:
|
|
205
|
+
cls.shared_instance = SshClient(connection_config)
|
|
206
|
+
return cls.shared_instance
|
{model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/component/impl/common.py
RENAMED
|
@@ -10,7 +10,7 @@ class CommonComponentConfig(BaseModel):
|
|
|
10
10
|
id: str = Field(default="__component__", description="ID of component.")
|
|
11
11
|
type: ComponentType = Field(..., description="Type of component.")
|
|
12
12
|
runtime: RuntimeConfig = Field(..., description="Runtime environment settings.")
|
|
13
|
-
max_concurrent_count: int = Field(default=
|
|
13
|
+
max_concurrent_count: int = Field(default=0, description="Maximum number of concurrent actions this component can handle.")
|
|
14
14
|
default: bool = Field(default=False, description="Whether to use this component when no component is explicitly specified.")
|
|
15
15
|
actions: List[CommonActionConfig] = Field(default_factory=list, description="Actions available within this component.")
|
|
16
16
|
|
{model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/controller/impl/http_server.py
RENAMED
|
@@ -5,7 +5,7 @@ from .common import ControllerType, CommonControllerConfig
|
|
|
5
5
|
|
|
6
6
|
class HttpServerControllerConfig(CommonControllerConfig):
|
|
7
7
|
type: Literal[ControllerType.HTTP_SERVER]
|
|
8
|
-
host: str = Field(default="
|
|
8
|
+
host: str = Field(default="127.0.0.1", description="Host address to bind the HTTP server to.")
|
|
9
9
|
port: int = Field(default=8080, ge=1, le=65535, description="Port number on which the HTTP server will listen.")
|
|
10
10
|
base_path: Optional[str] = Field(default=None, description="Base path to prefix all API routes")
|
|
11
11
|
origins: Optional[str] = Field(default="*", description="CORS allowed origins, specified as a comma-separated string")
|
{model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/controller/impl/mcp_server.py
RENAMED
|
@@ -5,6 +5,6 @@ from .common import ControllerType, CommonControllerConfig
|
|
|
5
5
|
|
|
6
6
|
class McpServerControllerConfig(CommonControllerConfig):
|
|
7
7
|
type: Literal[ControllerType.MCP_SERVER]
|
|
8
|
-
host: str = Field(default="
|
|
8
|
+
host: str = Field(default="127.0.0.1", description="Host address to bind the MCP server to.")
|
|
9
9
|
port: int = Field(default=8080, ge=1, le=65535, description="Port number on which the MCP server will listen.")
|
|
10
10
|
base_path: Optional[str] = Field(default=None, description="Base path to prefix all MCP endpoints")
|
{model_compose-0.4.11 → model_compose-0.4.13}/src/mindor/dsl/schema/controller/webui/impl/common.py
RENAMED
|
@@ -9,5 +9,5 @@ class ControllerWebUIDriver(str, Enum):
|
|
|
9
9
|
|
|
10
10
|
class CommonWebUIConfig(BaseModel):
|
|
11
11
|
driver: ControllerWebUIDriver = Field(..., description="Web UI rendering mode.")
|
|
12
|
-
host: str = Field(default="
|
|
12
|
+
host: str = Field(default="127.0.0.1", description="Host address to bind the Web UI server to.")
|
|
13
13
|
port: int = Field(default=8081, ge=1, le=65535, description="Port number to serve the Web UI on.")
|
|
@@ -6,4 +6,3 @@ from .types import GatewayType
|
|
|
6
6
|
class CommonGatewayConfig(BaseModel):
|
|
7
7
|
type: GatewayType = Field(..., description="Type of gateway service.")
|
|
8
8
|
runtime: RuntimeType = Field(default=RuntimeType.NATIVE, description="Runtime environment for executing the gateway service.")
|
|
9
|
-
port: int = Field(default=8090, ge=1, le=65535, description="Local port to tunnel through the gateway to the public.")
|
|
@@ -11,3 +11,12 @@ class HttpTunnelGatewayDriver(str, Enum):
|
|
|
11
11
|
class CommonHttpTunnelGatewayConfig(CommonGatewayConfig):
|
|
12
12
|
type: Literal[GatewayType.HTTP_TUNNEL]
|
|
13
13
|
driver: HttpTunnelGatewayDriver = Field(..., description="HTTP tunneling service provider.")
|
|
14
|
+
port: List[int] = Field(..., min_length=1, description="One or more local ports to tunnel through the gateway to the public.")
|
|
15
|
+
|
|
16
|
+
@model_validator(mode="before")
|
|
17
|
+
def normalize_port(cls, values):
|
|
18
|
+
port = values.get("port", 8090) # Default to 8090 if not specified
|
|
19
|
+
if not isinstance(port, list):
|
|
20
|
+
port = [ port ]
|
|
21
|
+
values["port"] = port
|
|
22
|
+
return values
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Any
|
|
2
|
+
from pydantic import BaseModel, Field
|
|
3
|
+
from pydantic import model_validator
|
|
4
|
+
from mindor.dsl.schema.transport.ssh import SshConnectionConfig
|
|
5
|
+
from .common import GatewayType, CommonGatewayConfig
|
|
6
|
+
|
|
7
|
+
class SshTunnelGatewayConfig(CommonGatewayConfig):
|
|
8
|
+
type: Literal[GatewayType.SSH_TUNNEL]
|
|
9
|
+
connection: SshConnectionConfig = Field(..., description="SSH connection configuration.")
|
|
10
|
+
port: List[Tuple[int, int]] = Field(..., min_length=1, description="One or more port forwarding configuration.")
|
|
11
|
+
|
|
12
|
+
@model_validator(mode="before")
|
|
13
|
+
def normalize_port(cls, values):
|
|
14
|
+
port = values.get("port", 8090) # Default to 8090 if not specified
|
|
15
|
+
if not isinstance(port, list):
|
|
16
|
+
port = [ port ]
|
|
17
|
+
values["port"] = [ cls.normalize_single_port(value) for value in port ]
|
|
18
|
+
return values
|
|
19
|
+
|
|
20
|
+
@classmethod
|
|
21
|
+
def normalize_single_port(cls, value) -> Optional[Tuple[int, int]]:
|
|
22
|
+
if isinstance(value, str):
|
|
23
|
+
return tuple(int(port) for port in value.split(":"))
|
|
24
|
+
if isinstance(value, int):
|
|
25
|
+
return ( value, value )
|
|
26
|
+
return None
|