model-compose 0.2.12__tar.gz → 0.3.0__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.2.12/src/model_compose.egg-info → model_compose-0.3.0}/PKG-INFO +2 -1
- {model_compose-0.2.12 → model_compose-0.3.0}/pyproject.toml +7 -2
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/cli/compose.py +9 -2
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/compose/compose.py +4 -4
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/compose/manager.py +4 -6
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/controller/base.py +48 -18
- model_compose-0.3.0/src/mindor/core/controller/runtime/docker/__init__.py +1 -0
- model_compose-0.3.0/src/mindor/core/controller/runtime/docker/context/Dockerfile +42 -0
- model_compose-0.3.0/src/mindor/core/controller/runtime/docker/docker.py +102 -0
- model_compose-0.3.0/src/mindor/core/controller/runtime/specs.py +40 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/logger/services/console.py +1 -1
- model_compose-0.3.0/src/mindor/core/runtime/docker/__init__.py +1 -0
- model_compose-0.3.0/src/mindor/core/runtime/docker/docker.py +263 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/runtime/env.py +0 -2
- model_compose-0.3.0/src/mindor/dsl/schema/controller/impl/common.py +21 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/controller/impl/http_server.py +4 -4
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/controller/impl/mcp_server.py +3 -3
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/controller/impl/webui.py +2 -2
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/runtime/impl/__init__.py +1 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/runtime/impl/common.py +1 -1
- model_compose-0.3.0/src/mindor/dsl/schema/runtime/impl/docker.py +72 -0
- model_compose-0.2.12/src/mindor/dsl/schema/runtime/impl/docker.py → model_compose-0.3.0/src/mindor/dsl/schema/runtime/impl/native.py +3 -3
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/runtime/impl/types.py +1 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/runtime/runtime.py +2 -5
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/workflow.py +2 -2
- model_compose-0.3.0/src/mindor/dsl/utils/__init__.py +0 -0
- model_compose-0.3.0/src/mindor/dsl/utils/enum.py +27 -0
- {model_compose-0.2.12 → model_compose-0.3.0/src/model_compose.egg-info}/PKG-INFO +2 -1
- {model_compose-0.2.12 → model_compose-0.3.0}/src/model_compose.egg-info/SOURCES.txt +9 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/model_compose.egg-info/requires.txt +1 -0
- model_compose-0.2.12/src/mindor/dsl/schema/controller/impl/common.py +0 -13
- {model_compose-0.2.12 → model_compose-0.3.0}/LICENSE +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/README.md +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/setup.cfg +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/__init__.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/cli/__init__.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/__init__.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/component/__init__.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/component/base.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/component/component.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/component/context.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/component/services/__init__.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/component/services/http_client.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/component/services/http_server.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/component/services/mcp_client.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/component/services/mcp_server.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/component/services/model/__init__.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/component/services/model/base.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/component/services/model/model.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/component/services/model/tasks/__init__.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/component/services/model/tasks/summarization.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/component/services/model/tasks/text_classification.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/component/services/model/tasks/text_embedding.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/component/services/model/tasks/text_generation.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/component/services/model/tasks/translation.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/component/services/shell.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/component/services/workflow.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/compose/__init__.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/controller/__init__.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/controller/controller.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/controller/runner/__init__.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/controller/runner/client.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/controller/runner/http_client.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/controller/runner/mcp_client.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/controller/runner/runner.py +0 -0
- {model_compose-0.2.12/src/mindor/core → model_compose-0.3.0/src/mindor/core/controller}/runtime/__init__.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/controller/services/__init__.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/controller/services/http_server.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/controller/services/mcp_server.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/controller/webui/__init__.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/controller/webui/gradio.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/controller/webui/webui.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/gateway/__init__.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/gateway/base.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/gateway/gateway.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/gateway/services/__init__.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/gateway/services/http_tunnel.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/gateway/services/ssh_tunnel.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/listener/__init__.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/listener/base.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/listener/listener.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/listener/services/__init__.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/listener/services/http_callback.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/logger/__init__.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/logger/base.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/logger/logger.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/logger/logging.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/logger/services/__init__.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/logger/services/file.py +0 -0
- {model_compose-0.2.12/src/mindor/core/utils → model_compose-0.3.0/src/mindor/core/runtime}/__init__.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/services/__init__.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/services/async_service.py +0 -0
- {model_compose-0.2.12/src/mindor/dsl → model_compose-0.3.0/src/mindor/core/utils}/__init__.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/utils/expiring.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/utils/http_client.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/utils/http_request.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/utils/http_status.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/utils/image.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/utils/mcp_client.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/utils/renderer.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/utils/ssh_client.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/utils/streaming.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/utils/time.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/utils/workqueue.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/workflow/__init__.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/workflow/context.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/workflow/job/__init__.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/workflow/job/base.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/workflow/job/impl/__init__.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/workflow/job/impl/action.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/workflow/job/impl/delay.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/workflow/job/job.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/workflow/schema.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/workflow/workflow.py +0 -0
- {model_compose-0.2.12/src/mindor/dsl/schema → model_compose-0.3.0/src/mindor/dsl}/__init__.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/loader.py +0 -0
- {model_compose-0.2.12/src/mindor/dsl/utils → model_compose-0.3.0/src/mindor/dsl/schema}/__init__.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/action/__init__.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/action/action.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/action/impl/__init__.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/action/impl/common.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/action/impl/http_client.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/action/impl/http_server.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/action/impl/mcp_client.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/action/impl/mcp_server.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/action/impl/model/__init__.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/action/impl/model/impl/__init__.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/action/impl/model/impl/common.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/action/impl/model/impl/summarization.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/action/impl/model/impl/text_classification.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/action/impl/model/impl/text_embedding.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/action/impl/model/impl/text_generation.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/action/impl/model/impl/translation.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/action/impl/model/model.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/action/impl/shell.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/action/impl/workflow.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/component/__init__.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/component/component.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/component/impl/__init__.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/component/impl/common.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/component/impl/http_client.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/component/impl/http_server.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/component/impl/mcp_client.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/component/impl/mcp_server.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/component/impl/model/__init__.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/component/impl/model/impl/__init__.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/component/impl/model/impl/common.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/component/impl/model/impl/summarization.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/component/impl/model/impl/text_classification.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/component/impl/model/impl/text_embedding.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/component/impl/model/impl/text_generation.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/component/impl/model/impl/translation.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/component/impl/model/impl/types.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/component/impl/model/model.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/component/impl/shell.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/component/impl/types.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/component/impl/workflow.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/compose.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/controller/__init__.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/controller/controller.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/controller/impl/__init__.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/controller/impl/types.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/gateway/__init__.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/gateway/gateway.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/gateway/impl/__init__.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/gateway/impl/common.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/gateway/impl/http_tunnel.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/gateway/impl/ssh_tunnel.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/gateway/impl/types.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/job/__init__.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/job/impl/__init__.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/job/impl/action.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/job/impl/common.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/job/impl/delay.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/job/impl/types.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/job/job.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/listener/__init__.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/listener/impl/__init__.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/listener/impl/common.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/listener/impl/http_callback.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/listener/impl/types.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/listener/listener.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/logger/__init__.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/logger/impl/__init__.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/logger/impl/common.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/logger/impl/console.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/logger/impl/file.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/logger/impl/types.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/logger/logger.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/runtime/__init__.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/utils/annotation.py +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/model_compose.egg-info/dependency_links.txt +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/model_compose.egg-info/entry_points.txt +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/src/model_compose.egg-info/top_level.txt +0 -0
- {model_compose-0.2.12 → model_compose-0.3.0}/tests/test_cli.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: model-compose
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.3.0
|
|
4
4
|
Summary: model-compose: Declarative AI Model and Workflow Orchestrator
|
|
5
5
|
Author-email: Hanyeol Cho <hanyeol.cho@gmail.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -24,6 +24,7 @@ Requires-Dist: transformers>=4.21.0
|
|
|
24
24
|
Requires-Dist: torch
|
|
25
25
|
Requires-Dist: sentencepiece
|
|
26
26
|
Requires-Dist: accelerate
|
|
27
|
+
Requires-Dist: docker
|
|
27
28
|
Dynamic: license-file
|
|
28
29
|
|
|
29
30
|
# model-compose: Declarative AI Model and Workflow Orchestrator
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "model-compose"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.3.0"
|
|
4
4
|
description = "model-compose: Declarative AI Model and Workflow Orchestrator"
|
|
5
5
|
authors = [
|
|
6
6
|
{ name = "Hanyeol Cho", email = "hanyeol.cho@gmail.com" }
|
|
@@ -24,7 +24,8 @@ dependencies = [
|
|
|
24
24
|
"transformers>=4.21.0",
|
|
25
25
|
"torch",
|
|
26
26
|
"sentencepiece",
|
|
27
|
-
"accelerate"
|
|
27
|
+
"accelerate",
|
|
28
|
+
"docker"
|
|
28
29
|
]
|
|
29
30
|
|
|
30
31
|
[project.scripts]
|
|
@@ -39,6 +40,10 @@ build-backend = "setuptools.build_meta"
|
|
|
39
40
|
|
|
40
41
|
[tool.setuptools]
|
|
41
42
|
package-dir = { "" = "src" }
|
|
43
|
+
include-package-data = true
|
|
42
44
|
|
|
43
45
|
[tool.setuptools.packages.find]
|
|
44
46
|
where = ["src"]
|
|
47
|
+
|
|
48
|
+
[tool.setuptools.package-data]
|
|
49
|
+
"mindor.core.controller.runtime.docker" = ["context/*"]
|
|
@@ -61,18 +61,20 @@ def up_command(
|
|
|
61
61
|
"--env", "-e", "env_data", multiple=True,
|
|
62
62
|
help="Environment variable in the form KEY=VALUE. Repeatable.",
|
|
63
63
|
)
|
|
64
|
+
@click.option("--verbose", "-v", is_flag=True, help="Enable verbose output.")
|
|
64
65
|
@click.pass_context
|
|
65
66
|
def down_command(
|
|
66
67
|
ctx: click.Context,
|
|
67
68
|
env_files: List[Path],
|
|
68
69
|
env_data: List[str],
|
|
70
|
+
verbose: bool
|
|
69
71
|
) -> None:
|
|
70
72
|
config_files = ctx.obj.get("config_files", [])
|
|
71
73
|
async def _async_command():
|
|
72
74
|
try:
|
|
73
75
|
env = load_env_files(".", env_files or [])
|
|
74
76
|
config = load_compose_config(".", config_files, env)
|
|
75
|
-
await
|
|
77
|
+
await terminate_services(config, verbose)
|
|
76
78
|
except Exception as e:
|
|
77
79
|
click.echo(f"❌ {e}", err=True)
|
|
78
80
|
asyncio.run(_async_command())
|
|
@@ -117,18 +119,20 @@ def start_command(
|
|
|
117
119
|
"--env", "-e", "env_data", multiple=True,
|
|
118
120
|
help="Environment variable in the form KEY=VALUE. Repeatable.",
|
|
119
121
|
)
|
|
122
|
+
@click.option("--verbose", "-v", is_flag=True, help="Enable verbose output.")
|
|
120
123
|
@click.pass_context
|
|
121
124
|
def stop_command(
|
|
122
125
|
ctx: click.Context,
|
|
123
126
|
env_files: List[Path],
|
|
124
127
|
env_data: List[str],
|
|
128
|
+
verbose: bool
|
|
125
129
|
) -> None:
|
|
126
130
|
config_files = ctx.obj.get("config_files", [])
|
|
127
131
|
async def _async_command():
|
|
128
132
|
try:
|
|
129
133
|
env = load_env_files(".", env_files or [])
|
|
130
134
|
config = load_compose_config(".", config_files, env)
|
|
131
|
-
await stop_services(config)
|
|
135
|
+
await stop_services(config, verbose)
|
|
132
136
|
except Exception as e:
|
|
133
137
|
click.echo(f"❌ {e}", err=True)
|
|
134
138
|
asyncio.run(_async_command())
|
|
@@ -184,3 +188,6 @@ compose_command.add_command(down_command)
|
|
|
184
188
|
compose_command.add_command(start_command)
|
|
185
189
|
compose_command.add_command(stop_command)
|
|
186
190
|
compose_command.add_command(run_command)
|
|
191
|
+
|
|
192
|
+
if __name__ == "__main__":
|
|
193
|
+
compose_command()
|
|
@@ -5,14 +5,14 @@ from .manager import ComposeManager, TaskState
|
|
|
5
5
|
async def launch_services(config: ComposeConfig, detach: bool, verbose: bool):
|
|
6
6
|
await ComposeManager(config, daemon=True).launch_services(detach, verbose)
|
|
7
7
|
|
|
8
|
-
async def
|
|
9
|
-
await ComposeManager(config, daemon=False).
|
|
8
|
+
async def terminate_services(config: ComposeConfig, verbose: bool):
|
|
9
|
+
await ComposeManager(config, daemon=False).terminate_services(verbose)
|
|
10
10
|
|
|
11
11
|
async def start_services(config: ComposeConfig, verbose: bool):
|
|
12
12
|
await ComposeManager(config, daemon=False).start_services(verbose)
|
|
13
13
|
|
|
14
|
-
async def stop_services(config: ComposeConfig):
|
|
15
|
-
await ComposeManager(config, daemon=False).stop_services()
|
|
14
|
+
async def stop_services(config: ComposeConfig, verbose: bool):
|
|
15
|
+
await ComposeManager(config, daemon=False).stop_services(verbose)
|
|
16
16
|
|
|
17
17
|
async def run_workflow(config: ComposeConfig, workflow_id: Optional[str], input: Dict[str, Any], verbose: bool) -> TaskState:
|
|
18
18
|
return await ComposeManager(config, daemon=False).run_workflow(workflow_id, input, verbose)
|
|
@@ -16,17 +16,15 @@ class ComposeManager:
|
|
|
16
16
|
)
|
|
17
17
|
|
|
18
18
|
async def launch_services(self, detach: bool, verbose: bool):
|
|
19
|
-
await self.controller.
|
|
20
|
-
await self.controller.wait_until_stopped()
|
|
19
|
+
await self.controller.launch(detach, verbose)
|
|
21
20
|
|
|
22
|
-
async def
|
|
23
|
-
await self.controller.
|
|
21
|
+
async def terminate_services(self, verbose: bool):
|
|
22
|
+
await self.controller.terminate(verbose)
|
|
24
23
|
|
|
25
24
|
async def start_services(self, verbose: bool):
|
|
26
25
|
await self.controller.start()
|
|
27
|
-
await self.controller.wait_until_stopped()
|
|
28
26
|
|
|
29
|
-
async def stop_services(self):
|
|
27
|
+
async def stop_services(self, verbose: bool):
|
|
30
28
|
await self.controller.stop()
|
|
31
29
|
|
|
32
30
|
async def run_workflow(self, workflow_id: Optional[str], input: Dict[str, Any], verbose: bool) -> TaskState:
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Any
|
|
2
2
|
from enum import Enum
|
|
3
3
|
from dataclasses import dataclass
|
|
4
|
+
from pydantic import BaseModel
|
|
4
5
|
from mindor.dsl.schema.controller import ControllerConfig, ControllerType
|
|
5
6
|
from mindor.dsl.schema.component import ComponentConfig
|
|
6
7
|
from mindor.dsl.schema.listener import ListenerConfig
|
|
7
8
|
from mindor.dsl.schema.gateway import GatewayConfig
|
|
8
|
-
from mindor.dsl.schema.logger import LoggerConfig, LoggerType, ConsoleLoggerConfig
|
|
9
9
|
from mindor.dsl.schema.workflow import WorkflowConfig
|
|
10
|
+
from mindor.dsl.schema.runtime import RuntimeType, DockerBuildConfig
|
|
11
|
+
from mindor.dsl.schema.logger import LoggerConfig, LoggerType, ConsoleLoggerConfig
|
|
10
12
|
from mindor.core.services import AsyncService
|
|
11
13
|
from mindor.core.component import ComponentService, ComponentGlobalConfigs, create_component
|
|
12
14
|
from mindor.core.listener import ListenerService, create_listener
|
|
@@ -16,6 +18,8 @@ from mindor.core.logger import LoggerService, create_logger
|
|
|
16
18
|
from mindor.core.controller.webui import ControllerWebUI
|
|
17
19
|
from mindor.core.utils.workqueue import WorkQueue
|
|
18
20
|
from mindor.core.utils.expiring import ExpiringDict
|
|
21
|
+
from .runtime.specs import ControllerRuntimeSpecs
|
|
22
|
+
from .runtime.docker import DockerRuntimeLauncher
|
|
19
23
|
from threading import Lock
|
|
20
24
|
import asyncio, ulid
|
|
21
25
|
|
|
@@ -58,6 +62,29 @@ class ControllerService(AsyncService):
|
|
|
58
62
|
if self.config.max_concurrent_count > 0:
|
|
59
63
|
self.queue = WorkQueue(self.config.max_concurrent_count, self._run_workflow)
|
|
60
64
|
|
|
65
|
+
async def launch(self, detach: bool, verbose: bool) -> None:
|
|
66
|
+
if self.config.runtime.type == RuntimeType.NATIVE:
|
|
67
|
+
if detach:
|
|
68
|
+
pass
|
|
69
|
+
await self.start()
|
|
70
|
+
await self.wait_until_stopped()
|
|
71
|
+
return
|
|
72
|
+
|
|
73
|
+
if self.config.runtime.type == RuntimeType.DOCKER:
|
|
74
|
+
await self._start_loggers()
|
|
75
|
+
await DockerRuntimeLauncher(self.config, verbose).launch(self._get_runtime_specs(), detach)
|
|
76
|
+
return
|
|
77
|
+
|
|
78
|
+
async def terminate(self, verbose: bool) -> None:
|
|
79
|
+
if self.config.runtime.type == RuntimeType.NATIVE:
|
|
80
|
+
await self.stop()
|
|
81
|
+
return
|
|
82
|
+
|
|
83
|
+
if self.config.runtime.type == RuntimeType.DOCKER:
|
|
84
|
+
await self._start_loggers()
|
|
85
|
+
await DockerRuntimeLauncher(self.config, verbose).terminate()
|
|
86
|
+
return
|
|
87
|
+
|
|
61
88
|
async def run_workflow(self, workflow_id: Optional[str], input: Dict[str, Any], wait_for_completion: bool = True) -> TaskState:
|
|
62
89
|
task_id = ulid.ulid()
|
|
63
90
|
state = TaskState(task_id=task_id, status=TaskStatus.PENDING)
|
|
@@ -138,23 +165,6 @@ class ControllerService(AsyncService):
|
|
|
138
165
|
async def _stop_webui(self) -> None:
|
|
139
166
|
await asyncio.gather(*[ self._create_webui().stop() ])
|
|
140
167
|
|
|
141
|
-
async def _run_workflow(self, task_id: str, workflow_id: Optional[str], input: Dict[str, Any]) -> TaskState:
|
|
142
|
-
state = TaskState(task_id=task_id, status=TaskStatus.PROCESSING)
|
|
143
|
-
with self.task_states_lock:
|
|
144
|
-
self.task_states.set(task_id, state)
|
|
145
|
-
|
|
146
|
-
try:
|
|
147
|
-
workflow = self._create_workflow(workflow_id)
|
|
148
|
-
output = await workflow.run(task_id, input)
|
|
149
|
-
state = TaskState(task_id=task_id, status=TaskStatus.COMPLETED, output=output)
|
|
150
|
-
except Exception as e:
|
|
151
|
-
state = TaskState(task_id=task_id, status=TaskStatus.FAILED, error=str(e))
|
|
152
|
-
|
|
153
|
-
with self.task_states_lock:
|
|
154
|
-
self.task_states.set(task_id, state, 1 * 3600)
|
|
155
|
-
|
|
156
|
-
return state
|
|
157
|
-
|
|
158
168
|
def _create_listeners(self) -> List[ListenerService]:
|
|
159
169
|
return [ create_listener(f"listener-{index}", config, self.daemon) for index, config in enumerate(self.listeners) ]
|
|
160
170
|
|
|
@@ -175,12 +185,32 @@ class ControllerService(AsyncService):
|
|
|
175
185
|
global_configs = self._get_component_global_configs()
|
|
176
186
|
return create_workflow(*WorkflowResolver(self.workflows).resolve(workflow_id), global_configs)
|
|
177
187
|
|
|
188
|
+
def _get_runtime_specs(self) -> ControllerRuntimeSpecs:
|
|
189
|
+
return ControllerRuntimeSpecs(self.config, self.components, self.listeners, self.gateways, self.workflows)
|
|
190
|
+
|
|
178
191
|
def _get_component_global_configs(self) -> ComponentGlobalConfigs:
|
|
179
192
|
return ComponentGlobalConfigs(self.components, self.listeners, self.gateways, self.workflows)
|
|
180
193
|
|
|
181
194
|
def _get_default_logger_config(self) -> LoggerConfig:
|
|
182
195
|
return ConsoleLoggerConfig(type=LoggerType.CONSOLE)
|
|
183
196
|
|
|
197
|
+
async def _run_workflow(self, task_id: str, workflow_id: Optional[str], input: Dict[str, Any]) -> TaskState:
|
|
198
|
+
state = TaskState(task_id=task_id, status=TaskStatus.PROCESSING)
|
|
199
|
+
with self.task_states_lock:
|
|
200
|
+
self.task_states.set(task_id, state)
|
|
201
|
+
|
|
202
|
+
try:
|
|
203
|
+
workflow = self._create_workflow(workflow_id)
|
|
204
|
+
output = await workflow.run(task_id, input)
|
|
205
|
+
state = TaskState(task_id=task_id, status=TaskStatus.COMPLETED, output=output)
|
|
206
|
+
except Exception as e:
|
|
207
|
+
state = TaskState(task_id=task_id, status=TaskStatus.FAILED, error=str(e))
|
|
208
|
+
|
|
209
|
+
with self.task_states_lock:
|
|
210
|
+
self.task_states.set(task_id, state, 1 * 3600)
|
|
211
|
+
|
|
212
|
+
return state
|
|
213
|
+
|
|
184
214
|
def register_controller(type: ControllerType):
|
|
185
215
|
def decorator(cls: Type[ControllerService]) -> Type[ControllerService]:
|
|
186
216
|
ControllerRegistry[type] = cls
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from .docker import *
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
FROM ubuntu:22.04
|
|
2
|
+
|
|
3
|
+
WORKDIR /app
|
|
4
|
+
|
|
5
|
+
RUN apt update && apt install -y \
|
|
6
|
+
python3.11 \
|
|
7
|
+
python3.11-venv \
|
|
8
|
+
python3-pip \
|
|
9
|
+
gcc \
|
|
10
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
11
|
+
|
|
12
|
+
RUN ln -sf /usr/bin/python3.11 /usr/bin/python && \
|
|
13
|
+
ln -sf /usr/bin/python3.11 /usr/bin/python3
|
|
14
|
+
|
|
15
|
+
RUN python -m pip install --upgrade pip
|
|
16
|
+
RUN pip install --no-cache-dir \
|
|
17
|
+
click \
|
|
18
|
+
pyyaml \
|
|
19
|
+
pydantic \
|
|
20
|
+
python-dotenv \
|
|
21
|
+
aiohttp \
|
|
22
|
+
requests \
|
|
23
|
+
fastapi \
|
|
24
|
+
uvicorn \
|
|
25
|
+
'mcp>=1.10.1' \
|
|
26
|
+
pyngrok \
|
|
27
|
+
ulid \
|
|
28
|
+
gradio \
|
|
29
|
+
Pillow \
|
|
30
|
+
'transformers>=4.21.0' \
|
|
31
|
+
torch \
|
|
32
|
+
sentencepiece \
|
|
33
|
+
accelerate \
|
|
34
|
+
docker
|
|
35
|
+
|
|
36
|
+
COPY requirements.txt .
|
|
37
|
+
RUN pip install --no-cache-dir -r requirements.txt
|
|
38
|
+
|
|
39
|
+
COPY src .
|
|
40
|
+
COPY model-compose.yml .
|
|
41
|
+
|
|
42
|
+
CMD [ "python", "-m", "mindor.cli.compose", "up" ]
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Any
|
|
2
|
+
from mindor.dsl.schema.controller import ControllerConfig
|
|
3
|
+
from mindor.dsl.schema.runtime import DockerRuntimeConfig, DockerBuildConfig, DockerPortConfig, DockerVolumeConfig, DockerHealthCheck
|
|
4
|
+
from mindor.core.runtime.docker import DockerRuntimeManager
|
|
5
|
+
from mindor.core.logger import logging
|
|
6
|
+
from ..specs import ControllerRuntimeSpecs
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
import mindor, shutil, yaml
|
|
9
|
+
|
|
10
|
+
class DockerRuntimeLauncher:
|
|
11
|
+
def __init__(self, config: ControllerConfig, verbose: bool):
|
|
12
|
+
self.config: ControllerConfig = config
|
|
13
|
+
self.verbose: bool = verbose
|
|
14
|
+
|
|
15
|
+
self._configure_runtime_config()
|
|
16
|
+
|
|
17
|
+
def _configure_runtime_config(self):
|
|
18
|
+
if not self.config.runtime.image:
|
|
19
|
+
if not self.config.runtime.build:
|
|
20
|
+
self.config.runtime.build = DockerBuildConfig(context=".docker", dockerfile="Dockerfile")
|
|
21
|
+
self.config.runtime.image = f"mindor/controller-{self.config.port}:latest"
|
|
22
|
+
|
|
23
|
+
if not self.config.runtime.container_name:
|
|
24
|
+
self.config.runtime.container_name = self.config.name or f"mindor-controller-{self.config.port}"
|
|
25
|
+
|
|
26
|
+
if not self.config.runtime.ports:
|
|
27
|
+
self.config.runtime.ports = [ port for port in [ self.config.port, getattr(self.config.webui, "port", None) ] if port ]
|
|
28
|
+
|
|
29
|
+
async def launch(self, specs: ControllerRuntimeSpecs, detach: bool):
|
|
30
|
+
docker = DockerRuntimeManager(self.config.runtime, self.verbose)
|
|
31
|
+
|
|
32
|
+
await self._prepare_docker_context(specs)
|
|
33
|
+
|
|
34
|
+
if not await docker.exists_image():
|
|
35
|
+
logging.debug("Checking if Docker image can be pulled...")
|
|
36
|
+
try:
|
|
37
|
+
await docker.pull_image()
|
|
38
|
+
except Exception as e:
|
|
39
|
+
logging.debug("Docker image pull failed: %s — will try building instead.", e)
|
|
40
|
+
else:
|
|
41
|
+
if not await docker.exists_image():
|
|
42
|
+
raise RuntimeError("Docker image pull completed, but image is still missing.")
|
|
43
|
+
logging.info("Docker image pulled successfully.")
|
|
44
|
+
|
|
45
|
+
if not await docker.exists_image():
|
|
46
|
+
logging.debug("Building Docker image locally. This may take a few minutes...")
|
|
47
|
+
try:
|
|
48
|
+
await docker.build_image()
|
|
49
|
+
logging.info("Docker image build completed successfully.")
|
|
50
|
+
except Exception as e:
|
|
51
|
+
logging.error("Docker image build failed: %s", e)
|
|
52
|
+
raise
|
|
53
|
+
|
|
54
|
+
if await docker.is_container_running():
|
|
55
|
+
logging.info("Stopping running Docker container before restarting...")
|
|
56
|
+
await docker.stop_container()
|
|
57
|
+
|
|
58
|
+
logging.info("Starting Docker container (%s mode)...", "detached" if detach else "foreground")
|
|
59
|
+
await docker.start_container(detach)
|
|
60
|
+
|
|
61
|
+
async def terminate(self):
|
|
62
|
+
docker = DockerRuntimeManager(self.config.runtime, self.verbose)
|
|
63
|
+
|
|
64
|
+
if await docker.exists_container():
|
|
65
|
+
await docker.remove_container(force=True)
|
|
66
|
+
|
|
67
|
+
if await docker.exists_image():
|
|
68
|
+
await docker.remove_image()
|
|
69
|
+
|
|
70
|
+
async def _prepare_docker_context(self, specs: ControllerRuntimeSpecs) -> None:
|
|
71
|
+
# Prepare context directory
|
|
72
|
+
context_dir = Path.cwd() / ".docker"
|
|
73
|
+
if context_dir.exists():
|
|
74
|
+
shutil.rmtree(context_dir)
|
|
75
|
+
|
|
76
|
+
# Copy context files
|
|
77
|
+
context_files_root = Path(__file__).resolve().parent / "context"
|
|
78
|
+
shutil.copytree(
|
|
79
|
+
src=str(context_files_root),
|
|
80
|
+
dst=context_dir
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
# Copy source files
|
|
84
|
+
source_files_root = Path(mindor.__file__).resolve().parent
|
|
85
|
+
target_dir = context_dir / "src" / source_files_root.name
|
|
86
|
+
shutil.copytree(
|
|
87
|
+
src=str(source_files_root),
|
|
88
|
+
dst=target_dir,
|
|
89
|
+
ignore=shutil.ignore_patterns("__pycache__", "*.pyc")
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
# Generate model-compose.yml
|
|
93
|
+
with open(context_dir / "model-compose.yml", "w") as f:
|
|
94
|
+
yaml.dump(specs.generate_native_runtime_specs(), f, sort_keys=False)
|
|
95
|
+
|
|
96
|
+
# Copy or generate requirements.txt
|
|
97
|
+
file_path = Path.cwd() / "requirements.txt"
|
|
98
|
+
target_path = Path(context_dir) / file_path.name
|
|
99
|
+
if file_path.exists():
|
|
100
|
+
shutil.copy(file_path, target_path)
|
|
101
|
+
else:
|
|
102
|
+
target_path.touch()
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Callable, Any
|
|
2
|
+
from abc import ABC, abstractmethod
|
|
3
|
+
from mindor.dsl.schema.controller import ControllerConfig
|
|
4
|
+
from mindor.dsl.schema.component import ComponentConfig
|
|
5
|
+
from mindor.dsl.schema.listener import ListenerConfig
|
|
6
|
+
from mindor.dsl.schema.gateway import GatewayConfig
|
|
7
|
+
from mindor.dsl.schema.workflow import WorkflowConfig
|
|
8
|
+
from mindor.dsl.utils.enum import enum_union_to_str
|
|
9
|
+
|
|
10
|
+
class ControllerRuntimeSpecs:
|
|
11
|
+
def __init__(
|
|
12
|
+
self,
|
|
13
|
+
controller: ControllerConfig,
|
|
14
|
+
components: Dict[str, ComponentConfig],
|
|
15
|
+
listeners: List[ListenerConfig],
|
|
16
|
+
gateways: List[GatewayConfig],
|
|
17
|
+
workflows: Dict[str, WorkflowConfig]
|
|
18
|
+
):
|
|
19
|
+
self.controller: ControllerConfig = controller
|
|
20
|
+
self.components: Dict[str, ComponentConfig] = components
|
|
21
|
+
self.listeners: List[ListenerConfig] = listeners
|
|
22
|
+
self.gateways: List[GatewayConfig] = gateways
|
|
23
|
+
self.workflows: Dict[str, WorkflowConfig] = workflows
|
|
24
|
+
|
|
25
|
+
def generate_native_runtime_specs(self) -> Dict[str, Any]:
|
|
26
|
+
specs: Dict[str, Any] = {}
|
|
27
|
+
|
|
28
|
+
specs["controller"] = self.controller.model_dump()
|
|
29
|
+
specs["controller"]["runtime"] = "native"
|
|
30
|
+
|
|
31
|
+
specs["components"] = {}
|
|
32
|
+
for id, component in self.components.items():
|
|
33
|
+
specs["components"][id] = component.model_dump()
|
|
34
|
+
specs["components"][id]["runtime"] = "native"
|
|
35
|
+
|
|
36
|
+
specs["listeners"] = [ listener.model_dump() for listener in self.listeners ]
|
|
37
|
+
specs["gateways" ] = [ gateway.model_dump() for gateway in self.gateways ]
|
|
38
|
+
specs["workflows"] = { id: workflow.model_dump() for id, workflow in self.workflows.items() }
|
|
39
|
+
|
|
40
|
+
return enum_union_to_str(specs)
|
|
@@ -2,7 +2,7 @@ from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annot
|
|
|
2
2
|
from mindor.dsl.schema.logger import ConsoleLoggerConfig
|
|
3
3
|
from ..base import LoggerService, LoggerType, LoggingLevel, register_logger
|
|
4
4
|
from uvicorn.logging import ColourizedFormatter
|
|
5
|
-
import logging
|
|
5
|
+
import logging, sys
|
|
6
6
|
|
|
7
7
|
_level_map = {
|
|
8
8
|
LoggingLevel.DEBUG: logging.DEBUG,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from .docker import *
|