model-compose 0.4.1__tar.gz → 0.4.2__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.1 → model_compose-0.4.2}/PKG-INFO +15 -15
- {model_compose-0.4.1 → model_compose-0.4.2}/README.md +14 -14
- {model_compose-0.4.1 → model_compose-0.4.2}/pyproject.toml +1 -1
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/cli/compose.py +1 -1
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/component/base.py +12 -17
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/component/component.py +12 -17
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/component/services/http_server.py +1 -1
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/component/services/workflow.py +2 -3
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/compose/compose.py +1 -1
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/compose/manager.py +1 -1
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/controller/base.py +3 -3
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/controller/runner/http_client.py +2 -1
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/controller/services/http_server.py +1 -1
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/listener/services/http_callback.py +1 -1
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/workflow/job/impl/action.py +2 -2
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/workflow/schema.py +12 -14
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/workflow/workflow.py +11 -16
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/common.py +8 -1
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/mcp_client.py +1 -1
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/mcp_server.py +1 -1
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/common.py +8 -1
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/job/impl/common.py +8 -2
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/workflow.py +7 -1
- {model_compose-0.4.1 → model_compose-0.4.2}/src/model_compose.egg-info/PKG-INFO +15 -15
- {model_compose-0.4.1 → model_compose-0.4.2}/LICENSE +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/setup.cfg +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/cli/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/component/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/component/context.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/component/services/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/component/services/http_client.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/component/services/mcp_client.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/component/services/mcp_server.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/component/services/model/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/component/services/model/base.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/component/services/model/loader.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/component/services/model/model.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/component/services/model/tasks/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/component/services/model/tasks/image_to_text.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/component/services/model/tasks/summarization.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/component/services/model/tasks/text_classification.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/component/services/model/tasks/text_embedding.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/component/services/model/tasks/text_generation.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/component/services/model/tasks/translation.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/component/services/shell.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/component/services/text_splitter.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/component/services/vector_store/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/component/services/vector_store/base.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/component/services/vector_store/drivers/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/component/services/vector_store/drivers/chroma.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/component/services/vector_store/drivers/milvus.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/component/services/vector_store/vector_store.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/compose/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/controller/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/controller/controller.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/controller/runner/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/controller/runner/client.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/controller/runner/mcp_client.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/controller/runner/runner.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/controller/runtime/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/controller/runtime/docker/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/controller/runtime/docker/context/Dockerfile +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/controller/runtime/docker/docker.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/controller/runtime/native/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/controller/runtime/native/native.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/controller/runtime/specs.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/controller/services/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/controller/services/mcp_server.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/controller/webui/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/controller/webui/gradio.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/controller/webui/webui.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/gateway/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/gateway/base.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/gateway/gateway.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/gateway/services/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/gateway/services/http_tunnel.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/gateway/services/ssh_tunnel.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/listener/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/listener/base.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/listener/listener.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/listener/services/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/logger/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/logger/base.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/logger/logger.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/logger/logging.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/logger/services/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/logger/services/console.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/logger/services/file.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/runtime/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/runtime/docker/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/runtime/docker/docker.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/runtime/env.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/services/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/services/async_service.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/utils/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/utils/caching.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/utils/http_client.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/utils/http_request.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/utils/http_response.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/utils/http_status.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/utils/image.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/utils/mcp_client.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/utils/package.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/utils/renderers.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/utils/resolvers.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/utils/shell.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/utils/ssh_client.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/utils/streamer.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/utils/streaming.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/utils/time.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/utils/workqueue.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/workflow/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/workflow/context.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/workflow/job/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/workflow/job/base.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/workflow/job/impl/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/workflow/job/impl/delay.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/workflow/job/impl/filter.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/workflow/job/impl/if_.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/workflow/job/impl/random_router.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/workflow/job/impl/switch.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/workflow/job/job.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/loader.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/action/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/action/action.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/http_client.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/http_server.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/model/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/model/impl/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/model/impl/chat_completion.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/model/impl/common.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/model/impl/image_to_text.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/model/impl/summarization.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/model/impl/text_classification.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/model/impl/text_embedding.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/model/impl/text_generation.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/model/impl/translation.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/model/model.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/shell.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/text_splitter.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/vector_store/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/vector_store/impl/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/vector_store/impl/chroma.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/vector_store/impl/common.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/vector_store/impl/faiss.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/vector_store/impl/milvus.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/vector_store/impl/qdrant.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/vector_store/vector_store.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/workflow.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/component/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/component/component.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/http_client.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/http_server.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/mcp_client.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/mcp_server.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/model/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/model/impl/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/model/impl/chat_completion.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/model/impl/common.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/model/impl/image_to_text.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/model/impl/summarization.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/model/impl/text_classification.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/model/impl/text_embedding.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/model/impl/text_generation.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/model/impl/translation.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/model/impl/types.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/model/model.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/shell.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/text_splitter.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/types.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/vector_store/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/vector_store/impl/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/vector_store/impl/chroma.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/vector_store/impl/common.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/vector_store/impl/faiss.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/vector_store/impl/milvus.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/vector_store/impl/qdrant.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/vector_store/impl/types.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/vector_store/vector_store.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/workflow.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/compose.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/controller/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/controller/controller.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/controller/impl/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/controller/impl/common.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/controller/impl/http_server.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/controller/impl/mcp_server.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/controller/impl/types.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/controller/webui/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/controller/webui/impl/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/controller/webui/impl/common.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/controller/webui/impl/dynamic.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/controller/webui/impl/gradio.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/controller/webui/impl/static.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/controller/webui/webui.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/gateway/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/gateway/gateway.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/gateway/impl/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/gateway/impl/common.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/gateway/impl/http_tunnel/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/gateway/impl/http_tunnel/http_tunnel.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/cloudflare.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/common.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/ngrok.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/gateway/impl/ssh_tunnel.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/gateway/impl/types.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/job/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/job/impl/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/job/impl/action.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/job/impl/delay.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/job/impl/filter.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/job/impl/if_.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/job/impl/random_router.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/job/impl/switch.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/job/impl/types.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/job/job.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/listener/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/listener/impl/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/listener/impl/common.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/listener/impl/http_callback.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/listener/impl/types.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/listener/listener.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/logger/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/logger/impl/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/logger/impl/common.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/logger/impl/console.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/logger/impl/file.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/logger/impl/types.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/logger/logger.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/runtime/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/runtime/impl/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/runtime/impl/common.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/runtime/impl/docker.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/runtime/impl/native.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/runtime/impl/types.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/runtime/runtime.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/transport/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/transport/http.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/schema/transport/ssh.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/utils/__init__.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/utils/annotation.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/dsl/utils/enum.py +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/model_compose.egg-info/SOURCES.txt +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/model_compose.egg-info/dependency_links.txt +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/model_compose.egg-info/entry_points.txt +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/model_compose.egg-info/requires.txt +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/src/model_compose.egg-info/top_level.txt +0 -0
- {model_compose-0.4.1 → model_compose-0.4.2}/tests/test_cli.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: model-compose
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.2
|
|
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
|
|
@@ -153,7 +153,7 @@ By default, `model-compose` automatically looks for a file named `model-compose.
|
|
|
153
153
|
|
|
154
154
|
#### 🧪 Minimal Example (with Components and Workflows)
|
|
155
155
|
|
|
156
|
-
```
|
|
156
|
+
```
|
|
157
157
|
controller:
|
|
158
158
|
type: http-server
|
|
159
159
|
port: 8080
|
|
@@ -174,7 +174,7 @@ components:
|
|
|
174
174
|
model: gpt-4o
|
|
175
175
|
messages:
|
|
176
176
|
- role: user
|
|
177
|
-
content: Write an inspiring quote.
|
|
177
|
+
content: "Write an inspiring quote."
|
|
178
178
|
output:
|
|
179
179
|
quote: ${response.choices[0].message.content}
|
|
180
180
|
|
|
@@ -197,7 +197,7 @@ You can easily expand this example by adding more components (e.g., text-to-spee
|
|
|
197
197
|
|
|
198
198
|
#### 📡 Listener Example
|
|
199
199
|
|
|
200
|
-
```
|
|
200
|
+
```
|
|
201
201
|
listener:
|
|
202
202
|
type: http-callback
|
|
203
203
|
port: 8090
|
|
@@ -214,7 +214,7 @@ This listener sets up an HTTP callback endpoint at `http://localhost:8090/callba
|
|
|
214
214
|
|
|
215
215
|
#### 🌐 Gateway Example
|
|
216
216
|
|
|
217
|
-
```
|
|
217
|
+
```
|
|
218
218
|
gateway:
|
|
219
219
|
type: http-tunnel
|
|
220
220
|
driver: ngrok
|
|
@@ -233,7 +233,7 @@ This gateway configuration exposes the local listener defined above to the publi
|
|
|
233
233
|
|
|
234
234
|
#### ✅ Enabling the Web UI
|
|
235
235
|
To enable the Web UI, simply add the `webui` section under your `controller` in the `model-compose.yml` file:
|
|
236
|
-
```
|
|
236
|
+
```
|
|
237
237
|
controller:
|
|
238
238
|
type: http-server
|
|
239
239
|
port: 8080
|
|
@@ -253,7 +253,7 @@ By default, `model-compose` uses [Gradio](https://www.gradio.app) as the interac
|
|
|
253
253
|
|
|
254
254
|
Here’s how you can do it:
|
|
255
255
|
|
|
256
|
-
```
|
|
256
|
+
```
|
|
257
257
|
controller:
|
|
258
258
|
type: http-server
|
|
259
259
|
port: 8080
|
|
@@ -292,7 +292,7 @@ You can also expose your workflows via the **Model Context Protocol (MCP)** serv
|
|
|
292
292
|
|
|
293
293
|
#### ✅ Minimal MCP Server Example
|
|
294
294
|
|
|
295
|
-
```
|
|
295
|
+
```
|
|
296
296
|
controller:
|
|
297
297
|
type: mcp-server
|
|
298
298
|
port: 8080
|
|
@@ -311,7 +311,7 @@ components:
|
|
|
311
311
|
model: gpt-4o
|
|
312
312
|
messages:
|
|
313
313
|
- role: user
|
|
314
|
-
content: Write an inspiring quote.
|
|
314
|
+
content: "Write an inspiring quote."
|
|
315
315
|
output:
|
|
316
316
|
quote: ${response.choices[0].message.content}
|
|
317
317
|
|
|
@@ -326,7 +326,7 @@ This configuration launches the controller as an **MCP server**, which listens o
|
|
|
326
326
|
|
|
327
327
|
Once running, you can invoke workflows remotely using a standard MCP request:
|
|
328
328
|
|
|
329
|
-
```
|
|
329
|
+
```
|
|
330
330
|
{
|
|
331
331
|
"jsonrpc": "2.0",
|
|
332
332
|
"id": 1,
|
|
@@ -349,7 +349,7 @@ You can run the workflow controller inside a Docker container by specifying the
|
|
|
349
349
|
|
|
350
350
|
#### ✅ Minimal Docker Runtime Example
|
|
351
351
|
|
|
352
|
-
```
|
|
352
|
+
```
|
|
353
353
|
controller:
|
|
354
354
|
type: http-server
|
|
355
355
|
port: 8080
|
|
@@ -361,7 +361,7 @@ This configuration will launch the controller inside a lightweight Docker contai
|
|
|
361
361
|
#### ⚙️ Advanced Docker Runtime Options
|
|
362
362
|
You can fully configure the Docker runtime by using an object under the `runtime` key:
|
|
363
363
|
|
|
364
|
-
```
|
|
364
|
+
```
|
|
365
365
|
controller:
|
|
366
366
|
type: http-server
|
|
367
367
|
port: 8080
|
|
@@ -373,11 +373,11 @@ controller:
|
|
|
373
373
|
- ./models:/models
|
|
374
374
|
- ./cache:/cache
|
|
375
375
|
ports:
|
|
376
|
-
- 5000:8080
|
|
377
|
-
- 5001:8081
|
|
376
|
+
- "5000:8080"
|
|
377
|
+
- "5001:8081"
|
|
378
378
|
env:
|
|
379
379
|
MODEL_STORAGE_PATH: /models
|
|
380
|
-
command: [python, -m, mindor.cli.compose, up]
|
|
380
|
+
command: [ "python", "-m", "mindor.cli.compose", "up" ]
|
|
381
381
|
...
|
|
382
382
|
```
|
|
383
383
|
|
|
@@ -128,7 +128,7 @@ By default, `model-compose` automatically looks for a file named `model-compose.
|
|
|
128
128
|
|
|
129
129
|
#### 🧪 Minimal Example (with Components and Workflows)
|
|
130
130
|
|
|
131
|
-
```
|
|
131
|
+
```
|
|
132
132
|
controller:
|
|
133
133
|
type: http-server
|
|
134
134
|
port: 8080
|
|
@@ -149,7 +149,7 @@ components:
|
|
|
149
149
|
model: gpt-4o
|
|
150
150
|
messages:
|
|
151
151
|
- role: user
|
|
152
|
-
content: Write an inspiring quote.
|
|
152
|
+
content: "Write an inspiring quote."
|
|
153
153
|
output:
|
|
154
154
|
quote: ${response.choices[0].message.content}
|
|
155
155
|
|
|
@@ -172,7 +172,7 @@ You can easily expand this example by adding more components (e.g., text-to-spee
|
|
|
172
172
|
|
|
173
173
|
#### 📡 Listener Example
|
|
174
174
|
|
|
175
|
-
```
|
|
175
|
+
```
|
|
176
176
|
listener:
|
|
177
177
|
type: http-callback
|
|
178
178
|
port: 8090
|
|
@@ -189,7 +189,7 @@ This listener sets up an HTTP callback endpoint at `http://localhost:8090/callba
|
|
|
189
189
|
|
|
190
190
|
#### 🌐 Gateway Example
|
|
191
191
|
|
|
192
|
-
```
|
|
192
|
+
```
|
|
193
193
|
gateway:
|
|
194
194
|
type: http-tunnel
|
|
195
195
|
driver: ngrok
|
|
@@ -208,7 +208,7 @@ This gateway configuration exposes the local listener defined above to the publi
|
|
|
208
208
|
|
|
209
209
|
#### ✅ Enabling the Web UI
|
|
210
210
|
To enable the Web UI, simply add the `webui` section under your `controller` in the `model-compose.yml` file:
|
|
211
|
-
```
|
|
211
|
+
```
|
|
212
212
|
controller:
|
|
213
213
|
type: http-server
|
|
214
214
|
port: 8080
|
|
@@ -228,7 +228,7 @@ By default, `model-compose` uses [Gradio](https://www.gradio.app) as the interac
|
|
|
228
228
|
|
|
229
229
|
Here’s how you can do it:
|
|
230
230
|
|
|
231
|
-
```
|
|
231
|
+
```
|
|
232
232
|
controller:
|
|
233
233
|
type: http-server
|
|
234
234
|
port: 8080
|
|
@@ -267,7 +267,7 @@ You can also expose your workflows via the **Model Context Protocol (MCP)** serv
|
|
|
267
267
|
|
|
268
268
|
#### ✅ Minimal MCP Server Example
|
|
269
269
|
|
|
270
|
-
```
|
|
270
|
+
```
|
|
271
271
|
controller:
|
|
272
272
|
type: mcp-server
|
|
273
273
|
port: 8080
|
|
@@ -286,7 +286,7 @@ components:
|
|
|
286
286
|
model: gpt-4o
|
|
287
287
|
messages:
|
|
288
288
|
- role: user
|
|
289
|
-
content: Write an inspiring quote.
|
|
289
|
+
content: "Write an inspiring quote."
|
|
290
290
|
output:
|
|
291
291
|
quote: ${response.choices[0].message.content}
|
|
292
292
|
|
|
@@ -301,7 +301,7 @@ This configuration launches the controller as an **MCP server**, which listens o
|
|
|
301
301
|
|
|
302
302
|
Once running, you can invoke workflows remotely using a standard MCP request:
|
|
303
303
|
|
|
304
|
-
```
|
|
304
|
+
```
|
|
305
305
|
{
|
|
306
306
|
"jsonrpc": "2.0",
|
|
307
307
|
"id": 1,
|
|
@@ -324,7 +324,7 @@ You can run the workflow controller inside a Docker container by specifying the
|
|
|
324
324
|
|
|
325
325
|
#### ✅ Minimal Docker Runtime Example
|
|
326
326
|
|
|
327
|
-
```
|
|
327
|
+
```
|
|
328
328
|
controller:
|
|
329
329
|
type: http-server
|
|
330
330
|
port: 8080
|
|
@@ -336,7 +336,7 @@ This configuration will launch the controller inside a lightweight Docker contai
|
|
|
336
336
|
#### ⚙️ Advanced Docker Runtime Options
|
|
337
337
|
You can fully configure the Docker runtime by using an object under the `runtime` key:
|
|
338
338
|
|
|
339
|
-
```
|
|
339
|
+
```
|
|
340
340
|
controller:
|
|
341
341
|
type: http-server
|
|
342
342
|
port: 8080
|
|
@@ -348,11 +348,11 @@ controller:
|
|
|
348
348
|
- ./models:/models
|
|
349
349
|
- ./cache:/cache
|
|
350
350
|
ports:
|
|
351
|
-
- 5000:8080
|
|
352
|
-
- 5001:8081
|
|
351
|
+
- "5000:8080"
|
|
352
|
+
- "5001:8081"
|
|
353
353
|
env:
|
|
354
354
|
MODEL_STORAGE_PATH: /models
|
|
355
|
-
command: [python, -m, mindor.cli.compose, up]
|
|
355
|
+
command: [ "python", "-m", "mindor.cli.compose", "up" ]
|
|
356
356
|
...
|
|
357
357
|
```
|
|
358
358
|
|
|
@@ -183,7 +183,7 @@ def run_command(
|
|
|
183
183
|
env = merge_env_data(env, env_data)
|
|
184
184
|
config = load_compose_config(".", config_files, env)
|
|
185
185
|
input = json.loads(input_json) if input_json else {}
|
|
186
|
-
state = await run_workflow(config, workflow_id, input, output_path, verbose)
|
|
186
|
+
state = await run_workflow(config, workflow_id or "__default__", input, output_path, verbose)
|
|
187
187
|
if isinstance(state.output, (dict, list)) or state.error:
|
|
188
188
|
click.echo(json.dumps(
|
|
189
189
|
state.output or state.error,
|
|
@@ -15,25 +15,20 @@ class ActionResolver:
|
|
|
15
15
|
def __init__(self, actions: List[ActionConfig]):
|
|
16
16
|
self.actions: List[ActionConfig] = actions
|
|
17
17
|
|
|
18
|
-
def resolve(self, action_id:
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
def resolve(self, action_id: str, raise_on_error: bool = True) -> Union[Tuple[str, ActionConfig], Tuple[None, None]]:
|
|
19
|
+
if action_id == "__default__":
|
|
20
|
+
action = self.actions[0] if len(self.actions) == 1 else None
|
|
21
|
+
action = action or next((action for action in self.actions if action.default), None)
|
|
22
|
+
else:
|
|
23
|
+
action = next((action for action in self.actions if action.id == action_id), None)
|
|
21
24
|
|
|
22
25
|
if action is None:
|
|
23
|
-
|
|
26
|
+
if raise_on_error:
|
|
27
|
+
raise ValueError(f"Action not found: {action_id}")
|
|
28
|
+
else:
|
|
29
|
+
return (None, None)
|
|
24
30
|
|
|
25
|
-
return
|
|
26
|
-
|
|
27
|
-
def _find_default_id(self, actions: List[ActionConfig]) -> str:
|
|
28
|
-
default_ids = [ action.id for action in actions if action.default or action.id == "__default__" ]
|
|
29
|
-
|
|
30
|
-
if len(default_ids) > 1:
|
|
31
|
-
raise ValueError("Multiple actions have default: true")
|
|
32
|
-
|
|
33
|
-
if not default_ids:
|
|
34
|
-
raise ValueError("No default action defined.")
|
|
35
|
-
|
|
36
|
-
return default_ids[0]
|
|
31
|
+
return action.id, action
|
|
37
32
|
|
|
38
33
|
class ComponentGlobalConfigs:
|
|
39
34
|
def __init__(
|
|
@@ -74,7 +69,7 @@ class ComponentService(AsyncService):
|
|
|
74
69
|
await super().start(background)
|
|
75
70
|
await self.wait_until_ready()
|
|
76
71
|
|
|
77
|
-
async def run(self, action_id:
|
|
72
|
+
async def run(self, action_id: str, run_id: str, input: Dict[str, Any]) -> Dict[str, Any]:
|
|
78
73
|
_, action = ActionResolver(self.config.actions).resolve(action_id)
|
|
79
74
|
context = ComponentActionContext(run_id, input)
|
|
80
75
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Any
|
|
2
2
|
from mindor.dsl.schema.component import ComponentConfig
|
|
3
|
-
from .base import ComponentService, ComponentGlobalConfigs, ComponentRegistry
|
|
3
|
+
from .base import ComponentService, ComponentGlobalConfigs, ComponentRegistry, ActionResolver
|
|
4
4
|
|
|
5
5
|
ComponentInstances: Dict[str, ComponentService] = {}
|
|
6
6
|
|
|
@@ -8,25 +8,20 @@ class ComponentResolver:
|
|
|
8
8
|
def __init__(self, components: List[ComponentConfig]):
|
|
9
9
|
self.components: List[ComponentConfig] = components
|
|
10
10
|
|
|
11
|
-
def resolve(self, component_id:
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
def resolve(self, component_id: str, raise_on_error: bool = True) -> Union[Tuple[str, ComponentConfig], Tuple[None, None]]:
|
|
12
|
+
if component_id == "__default__":
|
|
13
|
+
component = self.components[0] if len(self.components) == 1 else None
|
|
14
|
+
component = component or next((component for component in self.components if component.default), None)
|
|
15
|
+
else:
|
|
16
|
+
component = next((component for component in self.components if component.id == component_id), None)
|
|
14
17
|
|
|
15
18
|
if component is None:
|
|
16
|
-
|
|
19
|
+
if raise_on_error:
|
|
20
|
+
raise ValueError(f"Component not found: {component_id}")
|
|
21
|
+
else:
|
|
22
|
+
return None, None
|
|
17
23
|
|
|
18
|
-
return
|
|
19
|
-
|
|
20
|
-
def _find_default_id(self, components: List[ComponentConfig]) -> str:
|
|
21
|
-
default_ids = [ component.id for component in components if component.default or component.id == "__default__" ]
|
|
22
|
-
|
|
23
|
-
if len(default_ids) > 1:
|
|
24
|
-
raise ValueError("Multiple components have default: true")
|
|
25
|
-
|
|
26
|
-
if not default_ids:
|
|
27
|
-
raise ValueError("No default component defined.")
|
|
28
|
-
|
|
29
|
-
return default_ids[0]
|
|
24
|
+
return component.id, component
|
|
30
25
|
|
|
31
26
|
def create_component(id: str, config: ComponentConfig, global_configs: ComponentGlobalConfigs, daemon: bool) -> ComponentService:
|
|
32
27
|
try:
|
{model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/component/services/http_server.py
RENAMED
|
@@ -57,7 +57,7 @@ class HttpServerPollingCompletion(HttpServerCompletion):
|
|
|
57
57
|
|
|
58
58
|
class HttpServerCallbackCompletion(HttpServerCompletion):
|
|
59
59
|
async def run(self, context: ComponentActionContext, client: HttpClient) -> Any:
|
|
60
|
-
callback_id = await context.render_variable(self.config.wait_for) if self.config.wait_for else "
|
|
60
|
+
callback_id = await context.render_variable(self.config.wait_for) if self.config.wait_for else "__callback__"
|
|
61
61
|
future: asyncio.Future = asyncio.get_running_loop().create_future()
|
|
62
62
|
HttpCallbackListener.register_pending_future(callback_id, future)
|
|
63
63
|
|
|
@@ -12,16 +12,15 @@ class WorkflowAction:
|
|
|
12
12
|
self.global_configs: ComponentGlobalConfigs = global_configs
|
|
13
13
|
|
|
14
14
|
async def run(self, context: ComponentActionContext) -> Any:
|
|
15
|
-
|
|
15
|
+
workflow = self._create_workflow(self.config.workflow)
|
|
16
16
|
input = await context.render_variable(self.config.input)
|
|
17
17
|
|
|
18
|
-
workflow = self._create_workflow(workflow_id)
|
|
19
18
|
output = await workflow.run(context.run_id, input)
|
|
20
19
|
context.register_source("output", output)
|
|
21
20
|
|
|
22
21
|
return (await context.render_variable(self.config.output, ignore_files=True)) if self.config.output else output
|
|
23
22
|
|
|
24
|
-
def _create_workflow(self, workflow_id:
|
|
23
|
+
def _create_workflow(self, workflow_id: str) -> Workflow:
|
|
25
24
|
return create_workflow(*WorkflowResolver(self.global_configs.workflows).resolve(workflow_id), self.global_configs)
|
|
26
25
|
|
|
27
26
|
@register_component(ComponentType.WORKFLOW)
|
|
@@ -14,5 +14,5 @@ async def start_services(config: ComposeConfig, verbose: bool):
|
|
|
14
14
|
async def stop_services(config: ComposeConfig, verbose: bool):
|
|
15
15
|
await ComposeManager(config, daemon=False).stop_services(verbose)
|
|
16
16
|
|
|
17
|
-
async def run_workflow(config: ComposeConfig, workflow_id:
|
|
17
|
+
async def run_workflow(config: ComposeConfig, workflow_id: str, input: Dict[str, Any], output_path: Optional[str], verbose: bool) -> TaskState:
|
|
18
18
|
return await ComposeManager(config, daemon=False).run_workflow(workflow_id, input, output_path, verbose)
|
|
@@ -27,7 +27,7 @@ class ComposeManager:
|
|
|
27
27
|
async def stop_services(self, verbose: bool):
|
|
28
28
|
await self.controller.stop_services(verbose)
|
|
29
29
|
|
|
30
|
-
async def run_workflow(self, workflow_id:
|
|
30
|
+
async def run_workflow(self, workflow_id: str, input: Dict[str, Any], output_path: Optional[str], verbose: bool) -> TaskState:
|
|
31
31
|
if not self.controller.started:
|
|
32
32
|
await self.controller.start()
|
|
33
33
|
|
|
@@ -127,7 +127,7 @@ class ControllerService(AsyncService):
|
|
|
127
127
|
await self._stop_loggers()
|
|
128
128
|
return
|
|
129
129
|
|
|
130
|
-
async def run_workflow(self, workflow_id:
|
|
130
|
+
async def run_workflow(self, workflow_id: str, input: Dict[str, Any], wait_for_completion: bool = True) -> TaskState:
|
|
131
131
|
task_id = ulid.ulid()
|
|
132
132
|
state = TaskState(task_id=task_id, status=TaskStatus.PENDING)
|
|
133
133
|
with self.task_states_lock:
|
|
@@ -232,7 +232,7 @@ class ControllerService(AsyncService):
|
|
|
232
232
|
|
|
233
233
|
def _create_components(self) -> List[ComponentService]:
|
|
234
234
|
global_configs = self._get_component_global_configs()
|
|
235
|
-
return [ create_component(component.id, component, global_configs, self.daemon) for component in self.components ]
|
|
235
|
+
return [ create_component(component.id or "__default__", component, global_configs, self.daemon) for component in self.components ]
|
|
236
236
|
|
|
237
237
|
def _create_loggers(self) -> List[LoggerService]:
|
|
238
238
|
return [ create_logger(f"logger-{index}", config, self.daemon) for index, config in enumerate(self.loggers or [ self._get_default_logger_config() ]) ]
|
|
@@ -253,7 +253,7 @@ class ControllerService(AsyncService):
|
|
|
253
253
|
def _get_default_logger_config(self) -> LoggerConfig:
|
|
254
254
|
return ConsoleLoggerConfig(type=LoggerType.CONSOLE)
|
|
255
255
|
|
|
256
|
-
async def _run_workflow(self, task_id: str, workflow_id:
|
|
256
|
+
async def _run_workflow(self, task_id: str, workflow_id: str, input: Dict[str, Any]) -> TaskState:
|
|
257
257
|
state = TaskState(task_id=task_id, status=TaskStatus.PROCESSING)
|
|
258
258
|
with self.task_states_lock:
|
|
259
259
|
self.task_states.set(task_id, state)
|
{model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/controller/runner/http_client.py
RENAMED
|
@@ -12,6 +12,7 @@ class HttpControllerClient(ControllerClient):
|
|
|
12
12
|
self.client: HttpClient = HttpClient(self._resolve_controller_url())
|
|
13
13
|
|
|
14
14
|
async def run_workflow(self, workflow_id: Optional[str], input: Any, workflow: WorkflowSchema) -> Any:
|
|
15
|
+
url = f"/workflows/{workflow_id or '__default__'}/runs"
|
|
15
16
|
body = {
|
|
16
17
|
"input": input,
|
|
17
18
|
"wait_for_completion": True,
|
|
@@ -27,7 +28,7 @@ class HttpControllerClient(ControllerClient):
|
|
|
27
28
|
"Content-Type": "multipart/form-data"
|
|
28
29
|
}
|
|
29
30
|
|
|
30
|
-
return await self.client.request(
|
|
31
|
+
return await self.client.request(url, "POST", None, body, headers)
|
|
31
32
|
|
|
32
33
|
async def close(self) -> None:
|
|
33
34
|
await self.client.close()
|
{model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/controller/services/http_server.py
RENAMED
|
@@ -128,7 +128,7 @@ class HttpServerController(ControllerService):
|
|
|
128
128
|
async def run_default_workflow(
|
|
129
129
|
request: Request
|
|
130
130
|
):
|
|
131
|
-
return await self._handle_workflow_run_request(request,
|
|
131
|
+
return await self._handle_workflow_run_request(request, "__default__")
|
|
132
132
|
|
|
133
133
|
@self.router.post("/workflows/{workflow_id}/runs")
|
|
134
134
|
async def run_workflow(
|
{model_compose-0.4.1 → model_compose-0.4.2}/src/mindor/core/listener/services/http_callback.py
RENAMED
|
@@ -76,7 +76,7 @@ class HttpCallbackListener(ListenerService):
|
|
|
76
76
|
succeeded = await self._is_callback_succeeded(callback, context)
|
|
77
77
|
|
|
78
78
|
async for item in context.items():
|
|
79
|
-
callback_id = await item.render_variable(callback.identify_by) if callback.identify_by else "
|
|
79
|
+
callback_id = await item.render_variable(callback.identify_by) if callback.identify_by else "__callback__"
|
|
80
80
|
future: asyncio.Future = self._get_pending_future(callback_id)
|
|
81
81
|
|
|
82
82
|
if future:
|
|
@@ -14,7 +14,7 @@ class ActionJob(Job):
|
|
|
14
14
|
super().__init__(id, config, global_configs)
|
|
15
15
|
|
|
16
16
|
async def run(self, context: WorkflowContext) -> Union[Any, RoutingTarget]:
|
|
17
|
-
component: ComponentService = self._create_component(self.id,
|
|
17
|
+
component: ComponentService = self._create_component(self.id, self.config.component)
|
|
18
18
|
|
|
19
19
|
if not component.started:
|
|
20
20
|
await component.start()
|
|
@@ -28,7 +28,7 @@ class ActionJob(Job):
|
|
|
28
28
|
job_time_tracker = TimeTracker()
|
|
29
29
|
logging.debug("[task-%s] Action 'run-%s' started for job '%s'", context.task_id, run_id, self.id)
|
|
30
30
|
|
|
31
|
-
output = await component.run(
|
|
31
|
+
output = await component.run(self.config.action, run_id, input)
|
|
32
32
|
context.register_source("output", output)
|
|
33
33
|
|
|
34
34
|
logging.debug("[task-%s] Action 'run-%s' completed in %.2f seconds.", context.task_id, run_id, job_time_tracker.elapsed())
|
|
@@ -5,6 +5,8 @@ from mindor.dsl.schema.workflow import WorkflowConfig, WorkflowVariableConfig, W
|
|
|
5
5
|
from mindor.dsl.schema.job import ActionJobConfig, OutputJobConfig
|
|
6
6
|
from mindor.dsl.schema.component import ComponentConfig, ComponentType
|
|
7
7
|
from mindor.dsl.schema.action import ActionConfig
|
|
8
|
+
from mindor.core.component import ComponentResolver, ActionResolver
|
|
9
|
+
from mindor.core.workflow import WorkflowResolver
|
|
8
10
|
import re, json
|
|
9
11
|
|
|
10
12
|
@dataclass
|
|
@@ -203,15 +205,14 @@ class WorkflowInputVariableResolver(WorkflowVariableResolver):
|
|
|
203
205
|
|
|
204
206
|
for job in workflow.jobs:
|
|
205
207
|
if isinstance(job, ActionJobConfig) and (not job.input or job.input == "${input}"):
|
|
206
|
-
action_id = job.action or "__default__"
|
|
207
208
|
if isinstance(job.component, str):
|
|
208
|
-
component =
|
|
209
|
+
_, component = ComponentResolver(components).resolve(job.component, raise_on_error=False)
|
|
209
210
|
if component:
|
|
210
|
-
action =
|
|
211
|
+
_, action = ActionResolver(component.actions).resolve(job.action, raise_on_error=False)
|
|
211
212
|
if action:
|
|
212
213
|
variables.extend(self._resolve_component(component, action, workflows, components))
|
|
213
214
|
else:
|
|
214
|
-
action =
|
|
215
|
+
_, action = ActionResolver(job.component.actions).resolve(job.action, raise_on_error=False)
|
|
215
216
|
if action:
|
|
216
217
|
variables.extend(self._resolve_component(job.component, action, workflows, components))
|
|
217
218
|
else:
|
|
@@ -223,8 +224,7 @@ class WorkflowInputVariableResolver(WorkflowVariableResolver):
|
|
|
223
224
|
variables: List[WorkflowVariable] = []
|
|
224
225
|
|
|
225
226
|
if component.type == ComponentType.WORKFLOW:
|
|
226
|
-
|
|
227
|
-
workflow = next((workflow for workflow in workflows if workflow.id == workflow_id), None)
|
|
227
|
+
_, workflow = WorkflowResolver(workflows).resolve(action.workflow, raise_on_error=False)
|
|
228
228
|
if workflow:
|
|
229
229
|
variables.extend(self._resolve_workflow(workflow, workflows, components))
|
|
230
230
|
else:
|
|
@@ -251,17 +251,16 @@ class WorkflowOutputVariableResolver(WorkflowVariableResolver):
|
|
|
251
251
|
variables.append(WorkflowVariableGroup(variables=(job_variables := []), repeat_count=repeat_count))
|
|
252
252
|
|
|
253
253
|
if isinstance(job, ActionJobConfig) and (not job.output or job.output == "${output}"):
|
|
254
|
-
action_id = job.action or "__default__"
|
|
255
254
|
if isinstance(job.component, str):
|
|
256
|
-
component =
|
|
255
|
+
_, component = ComponentResolver(components).resolve(job.component, raise_on_error=False)
|
|
257
256
|
if component:
|
|
258
|
-
action =
|
|
257
|
+
_, action = ActionResolver(component.actions).resolve(job.action, raise_on_error=False)
|
|
259
258
|
if action:
|
|
260
|
-
job_variables.extend(self._resolve_component(component, action, workflows, components))
|
|
259
|
+
job_variables.extend(self._resolve_component(component, action, workflows, components))
|
|
261
260
|
else:
|
|
262
|
-
action =
|
|
261
|
+
_, action = ActionResolver(job.component.actions).resolve(job.action, raise_on_error=False)
|
|
263
262
|
if action:
|
|
264
|
-
job_variables.extend(self._resolve_component(component, action, workflows, components))
|
|
263
|
+
job_variables.extend(self._resolve_component(job.component, action, workflows, components))
|
|
265
264
|
else:
|
|
266
265
|
if isinstance(job, OutputJobConfig):
|
|
267
266
|
job_variables.extend(self._enumerate_output_variables(None, job.output, internal=internal))
|
|
@@ -272,8 +271,7 @@ class WorkflowOutputVariableResolver(WorkflowVariableResolver):
|
|
|
272
271
|
variables: List[Union[WorkflowVariable, WorkflowVariableGroup]] = []
|
|
273
272
|
|
|
274
273
|
if component.type == ComponentType.WORKFLOW:
|
|
275
|
-
|
|
276
|
-
workflow = next((workflow for workflow in workflows if workflow.id == workflow_id), None)
|
|
274
|
+
_, workflow = WorkflowResolver(workflows).resolve(action.workflow)
|
|
277
275
|
if workflow:
|
|
278
276
|
variables.extend(self._resolve_workflow(workflow, workflows, components, internal=True))
|
|
279
277
|
else:
|
|
@@ -57,25 +57,20 @@ class WorkflowResolver:
|
|
|
57
57
|
def __init__(self, workflows: List[WorkflowConfig]):
|
|
58
58
|
self.workflows: List[WorkflowConfig] = workflows
|
|
59
59
|
|
|
60
|
-
def resolve(self, workflow_id:
|
|
61
|
-
|
|
62
|
-
|
|
60
|
+
def resolve(self, workflow_id: str, raise_on_error: bool = True) -> Union[Tuple[str, WorkflowConfig], Tuple[None, None]]:
|
|
61
|
+
if workflow_id == "__default__":
|
|
62
|
+
workflow = self.workflows[0] if len(self.workflows) == 1 else None
|
|
63
|
+
workflow = workflow or next((workflow for workflow in self.workflows if workflow.default), None)
|
|
64
|
+
else:
|
|
65
|
+
workflow = next((workflow for workflow in self.workflows if workflow.id == workflow_id), None)
|
|
63
66
|
|
|
64
67
|
if workflow is None:
|
|
65
|
-
|
|
68
|
+
if raise_on_error:
|
|
69
|
+
raise ValueError(f"Workflow not found: {workflow_id}")
|
|
70
|
+
else:
|
|
71
|
+
return (None, None)
|
|
66
72
|
|
|
67
|
-
return
|
|
68
|
-
|
|
69
|
-
def _find_default_id(self, workflows: List[WorkflowConfig]) -> str:
|
|
70
|
-
default_ids = [ workflow.id for workflow in workflows if workflow.default or workflow.id == "__default__" ]
|
|
71
|
-
|
|
72
|
-
if len(default_ids) > 1:
|
|
73
|
-
raise ValueError("Multiple workflows have default: true")
|
|
74
|
-
|
|
75
|
-
if not default_ids:
|
|
76
|
-
raise ValueError("No default workflow defined.")
|
|
77
|
-
|
|
78
|
-
return default_ids[0]
|
|
73
|
+
return workflow.id, workflow
|
|
79
74
|
|
|
80
75
|
class WorkflowRunner:
|
|
81
76
|
def __init__(self, id: str, jobs: List[JobConfig], global_configs: ComponentGlobalConfigs):
|
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Any
|
|
2
2
|
from pydantic import BaseModel, Field
|
|
3
|
+
from pydantic import field_validator
|
|
3
4
|
|
|
4
5
|
class CommonActionConfig(BaseModel):
|
|
5
|
-
id: str = Field(default="
|
|
6
|
+
id: str = Field(default="__action__", description="ID of action.")
|
|
6
7
|
output: Optional[Any] = Field(default=None, description="Output mapping to transform and extract specific values from the action result.")
|
|
7
8
|
default: bool = Field(default=False, description="Whether this action should be used as the default.")
|
|
9
|
+
|
|
10
|
+
@field_validator("id")
|
|
11
|
+
def validate_id(cls, value):
|
|
12
|
+
if value == "__default__":
|
|
13
|
+
raise ValueError("Action id cannot be '__default__'")
|
|
14
|
+
return value
|
|
@@ -4,6 +4,6 @@ from pydantic import model_validator
|
|
|
4
4
|
from .common import CommonActionConfig
|
|
5
5
|
|
|
6
6
|
class McpClientActionConfig(CommonActionConfig):
|
|
7
|
-
tool: str = Field(default="
|
|
7
|
+
tool: str = Field(default="__tool__", description="Name of the tool to invoke.")
|
|
8
8
|
arguments: Dict[str, Any] = Field(default_factory=dict, description="Arguments to pass to the tool.")
|
|
9
9
|
headers: Dict[str, str] = Field(default_factory=dict, description="Optional HTTP headers to include in the tool call.")
|
|
@@ -4,6 +4,6 @@ from pydantic import model_validator
|
|
|
4
4
|
from .common import CommonActionConfig
|
|
5
5
|
|
|
6
6
|
class McpServerActionConfig(CommonActionConfig):
|
|
7
|
-
tool: str = Field(default="
|
|
7
|
+
tool: str = Field(default="__tool__", description="Name of the tool to invoke.")
|
|
8
8
|
arguments: Dict[str, Any] = Field(default_factory=dict, description="Arguments to pass to the tool.")
|
|
9
9
|
headers: Dict[str, str] = Field(default_factory=dict, description="Optional HTTP headers to include in the tool call.")
|
|
@@ -1,14 +1,21 @@
|
|
|
1
1
|
from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Any
|
|
2
2
|
from enum import Enum
|
|
3
3
|
from pydantic import BaseModel, Field
|
|
4
|
+
from pydantic import field_validator
|
|
4
5
|
from mindor.dsl.schema.action import CommonActionConfig
|
|
5
6
|
from mindor.dsl.schema.runtime import RuntimeType
|
|
6
7
|
from .types import ComponentType
|
|
7
8
|
|
|
8
9
|
class CommonComponentConfig(BaseModel):
|
|
9
|
-
id: str = Field(default="
|
|
10
|
+
id: str = Field(default="__component__", description="ID of component.")
|
|
10
11
|
type: ComponentType = Field(..., description="Type of component.")
|
|
11
12
|
runtime: RuntimeType = Field(default=RuntimeType.NATIVE, description="Runtime environment used to execute this component.")
|
|
12
13
|
max_concurrent_count: int = Field(default=1, description="Maximum number of concurrent actions this component can handle.")
|
|
13
14
|
default: bool = Field(default=False, description="Whether to use this component when no component is explicitly specified.")
|
|
14
15
|
actions: List[CommonActionConfig] = Field(default_factory=list, description="Actions available within this component.")
|
|
16
|
+
|
|
17
|
+
@field_validator("id")
|
|
18
|
+
def validate_id(cls, value):
|
|
19
|
+
if value == "__default__":
|
|
20
|
+
raise ValueError("Component id cannot be '__default__'")
|
|
21
|
+
return value
|