model-compose 0.4.9__tar.gz → 0.4.10__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.9/src/model_compose.egg-info → model_compose-0.4.10}/PKG-INFO +22 -30
- {model_compose-0.4.9 → model_compose-0.4.10}/README.md +21 -29
- {model_compose-0.4.9 → model_compose-0.4.10}/pyproject.toml +1 -1
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/cli/compose.py +27 -21
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/controller/base.py +14 -1
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/controller/services/http_server.py +20 -4
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/listener/services/__init__.py +1 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/listener/services/http_callback.py +10 -12
- model_compose-0.4.10/src/mindor/core/listener/services/http_trigger.py +129 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/datasets/providers/common.py +2 -2
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/model/impl/common.py +1 -1
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/controller/impl/common.py +1 -1
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/listener/impl/__init__.py +1 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/listener/impl/http_callback.py +1 -1
- model_compose-0.4.10/src/mindor/dsl/schema/listener/impl/http_trigger.py +27 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/listener/impl/types.py +1 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/listener/listener.py +2 -1
- {model_compose-0.4.9 → model_compose-0.4.10/src/model_compose.egg-info}/PKG-INFO +22 -30
- {model_compose-0.4.9 → model_compose-0.4.10}/src/model_compose.egg-info/SOURCES.txt +2 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/LICENSE +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/setup.cfg +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/cli/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/base.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/component.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/context.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/datasets/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/datasets/datasets.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/datasets/providers/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/datasets/providers/common.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/datasets/providers/huggingface.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/datasets/providers/local.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/datasets/utils.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/http_client.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/http_server.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/image_processor.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/mcp_client.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/mcp_server.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/model/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/model/base/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/model/base/common.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/model/base/huggingface.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/model/base/huggingface_hub.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/model/base/unsloth.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/model/model.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/model/tasks/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/model/tasks/chat_completion/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/model/tasks/chat_completion/huggingface.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/model/tasks/face_embedding/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/model/tasks/face_embedding/common.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/model/tasks/face_embedding/custom.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/model/tasks/face_embedding/insightface.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/model/tasks/image_generation/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/model/tasks/image_generation/common.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/model/tasks/image_generation/custom.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/model/tasks/image_generation/flux.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/model/tasks/image_generation/hunyuan_image.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/model/tasks/image_generation/sdxl.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/model/tasks/image_to_text/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/model/tasks/image_to_text/huggingface.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/model/tasks/image_upscale/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/model/tasks/image_upscale/common.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/model/tasks/image_upscale/custom.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/model/tasks/image_upscale/esrgan.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/model/tasks/image_upscale/ldsr.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/model/tasks/image_upscale/real_esrgan.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/model/tasks/image_upscale/swinir.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/model/tasks/text_classification/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/model/tasks/text_classification/huggingface.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/model/tasks/text_embedding/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/model/tasks/text_embedding/huggingface.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/model/tasks/text_generation/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/model/tasks/text_generation/huggingface.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/shell.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/text_splitter.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/vector_store/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/vector_store/base.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/vector_store/drivers/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/vector_store/drivers/chroma.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/vector_store/drivers/milvus.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/vector_store/vector_store.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/component/services/workflow.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/compose/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/compose/compose.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/compose/manager.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/controller/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/controller/controller.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/controller/runner/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/controller/runner/client.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/controller/runner/http_client.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/controller/runner/mcp_client.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/controller/runner/runner.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/controller/runtime/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/controller/runtime/docker/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/controller/runtime/docker/context/Dockerfile +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/controller/runtime/docker/docker.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/controller/runtime/native/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/controller/runtime/native/native.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/controller/runtime/specs.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/controller/services/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/controller/services/mcp_server.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/controller/webui/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/controller/webui/gradio.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/controller/webui/webui.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/foundation/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/foundation/async_service.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/gateway/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/gateway/base.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/gateway/gateway.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/gateway/services/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/gateway/services/http_tunnel/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/gateway/services/http_tunnel/base.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/gateway/services/http_tunnel/drivers/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/gateway/services/http_tunnel/drivers/cloudflare.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/gateway/services/http_tunnel/drivers/ngrok.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/gateway/services/http_tunnel/http_tunnel.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/gateway/services/ssh_tunnel.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/listener/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/listener/base.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/listener/listener.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/logger/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/logger/base.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/logger/logger.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/logger/logging.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/logger/services/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/logger/services/console.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/logger/services/file.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/runtime/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/runtime/docker/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/runtime/docker/docker.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/runtime/env.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/utils/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/utils/caching.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/utils/http_client.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/utils/http_request.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/utils/http_response.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/utils/http_status.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/utils/image.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/utils/mcp_client.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/utils/package.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/utils/renderers.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/utils/resolvers.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/utils/shell.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/utils/ssh_client.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/utils/streamer.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/utils/streaming.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/utils/time.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/utils/websocket_client.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/utils/work_queue.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/workflow/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/workflow/context.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/workflow/job/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/workflow/job/base.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/workflow/job/impl/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/workflow/job/impl/action.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/workflow/job/impl/delay.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/workflow/job/impl/filter.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/workflow/job/impl/if_.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/workflow/job/impl/random_router.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/workflow/job/impl/switch.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/workflow/job/job.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/workflow/schema.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/workflow/workflow.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/loader.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/action.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/common.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/datasets/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/datasets/common.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/datasets/datasets.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/datasets/providers/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/datasets/providers/huggingface.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/datasets/providers/local.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/http_client.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/http_server.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/image_processor.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/mcp_client.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/mcp_server.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/model/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/model/impl/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/model/impl/chat_completion.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/model/impl/face_embedding/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/model/impl/face_embedding/face_embedding.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/model/impl/face_embedding/impl/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/model/impl/face_embedding/impl/common.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/model/impl/face_embedding/impl/dlib.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/model/impl/face_embedding/impl/facenet.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/model/impl/face_embedding/impl/insightface.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/model/impl/image_generation/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/model/impl/image_generation/image_generation.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/model/impl/image_generation/impl/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/model/impl/image_generation/impl/common.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/model/impl/image_generation/impl/flux.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/model/impl/image_generation/impl/hunyuan_image.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/model/impl/image_generation/impl/sdxl.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/model/impl/image_to_text.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/image_upscale.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/impl/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/impl/common.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/impl/esrgan.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/impl/ldsr.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/impl/real_esrgan.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/impl/swinir.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/model/impl/text_classification.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/model/impl/text_embedding.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/model/impl/text_generation.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/model/model.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/model_trainer/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/model_trainer/impl/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/model_trainer/impl/classification.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/model_trainer/impl/common.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/model_trainer/impl/sft.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/model_trainer/model_trainer.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/shell.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/text_splitter.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/vector_store/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/vector_store/impl/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/vector_store/impl/chroma.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/vector_store/impl/common.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/vector_store/impl/faiss.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/vector_store/impl/milvus.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/vector_store/impl/qdrant.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/vector_store/vector_store.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/workflow.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/component.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/common.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/datasets/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/datasets/datasets.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/http_client.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/http_server.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/image_processor.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/mcp_client.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/mcp_server.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/model/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/model/impl/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/model/impl/chat_completion.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/model/impl/common.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/model/impl/face_embedding/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/model/impl/face_embedding/face_embedding.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/model/impl/face_embedding/impl/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/model/impl/face_embedding/impl/common.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/model/impl/face_embedding/impl/dlib.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/model/impl/face_embedding/impl/facenet.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/model/impl/face_embedding/impl/insightface.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/model/impl/image_generation/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/model/impl/image_generation/image_generation.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/model/impl/image_generation/impl/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/model/impl/image_generation/impl/common.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/model/impl/image_generation/impl/flux.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/model/impl/image_generation/impl/hunyuan_image.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/model/impl/image_generation/impl/sdxl.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/model/impl/image_to_text.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/image_upscale.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/impl/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/impl/common.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/impl/esrgan.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/impl/ldsr.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/impl/real_esrgan.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/impl/swinir.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/model/impl/text_classification.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/model/impl/text_embedding.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/model/impl/text_generation.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/model/model.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/model_trainer/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/model_trainer/impl/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/model_trainer/impl/classification.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/model_trainer/impl/common.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/model_trainer/impl/sft.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/model_trainer/model_trainer.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/shell.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/text_splitter.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/types.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/vector_store/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/vector_store/impl/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/vector_store/impl/chroma.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/vector_store/impl/common.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/vector_store/impl/faiss.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/vector_store/impl/milvus.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/vector_store/impl/qdrant.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/vector_store/vector_store.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/component/impl/workflow.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/compose.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/controller/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/controller/controller.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/controller/impl/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/controller/impl/http_server.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/controller/impl/mcp_server.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/controller/impl/types.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/controller/webui/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/controller/webui/impl/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/controller/webui/impl/common.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/controller/webui/impl/dynamic.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/controller/webui/impl/gradio.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/controller/webui/impl/static.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/controller/webui/webui.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/gateway/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/gateway/gateway.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/gateway/impl/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/gateway/impl/common.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/gateway/impl/http_tunnel/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/gateway/impl/http_tunnel/http_tunnel.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/cloudflare.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/common.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/ngrok.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/gateway/impl/ssh_tunnel.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/gateway/impl/types.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/job/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/job/impl/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/job/impl/action.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/job/impl/common.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/job/impl/delay.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/job/impl/filter.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/job/impl/if_.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/job/impl/random_router.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/job/impl/switch.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/job/impl/types.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/job/job.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/listener/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/listener/impl/common.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/logger/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/logger/impl/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/logger/impl/common.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/logger/impl/console.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/logger/impl/file.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/logger/impl/types.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/logger/logger.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/runtime/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/runtime/impl/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/runtime/impl/common.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/runtime/impl/docker.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/runtime/impl/native.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/runtime/impl/types.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/runtime/runtime.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/transport/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/transport/http.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/transport/ssh.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/workflow.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/utils/__init__.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/utils/annotation.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/utils/enum.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/utils/path.py +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/model_compose.egg-info/dependency_links.txt +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/model_compose.egg-info/entry_points.txt +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/model_compose.egg-info/requires.txt +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/src/model_compose.egg-info/top_level.txt +0 -0
- {model_compose-0.4.9 → model_compose-0.4.10}/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.10
|
|
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
|
|
@@ -65,6 +65,26 @@ pip install -e .
|
|
|
65
65
|
|
|
66
66
|
---
|
|
67
67
|
|
|
68
|
+
## 📚 Documentation
|
|
69
|
+
|
|
70
|
+
**📖 [Complete User Guide](docs/user-guide/00-table-of-contents.md)**
|
|
71
|
+
|
|
72
|
+
Need help getting started or want to explore advanced features? Check out our comprehensive user guide:
|
|
73
|
+
|
|
74
|
+
- **🌍 English**: [User Guide](docs/user-guide/00-table-of-contents.md)
|
|
75
|
+
- **🇰🇷 한국어**: [사용자 가이드](docs/user-guide/ko/00-table-of-contents.md)
|
|
76
|
+
|
|
77
|
+
The guide covers everything from basic concepts to advanced workflows, including:
|
|
78
|
+
- Getting started with model-compose
|
|
79
|
+
- Component and workflow configuration
|
|
80
|
+
- Local AI models and training
|
|
81
|
+
- Streaming mode and variable binding
|
|
82
|
+
- System integration with listeners and gateways
|
|
83
|
+
- Deployment strategies
|
|
84
|
+
- Practical examples and troubleshooting
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
68
88
|
## 🚀 How to Run
|
|
69
89
|
|
|
70
90
|
**model-compose** provides a CLI interface to launch and manage your AI workflows — inspired by `docker-compose`.
|
|
@@ -194,35 +214,7 @@ This minimal example defines a simple workflow that calls the OpenAI ChatGPT API
|
|
|
194
214
|
|
|
195
215
|
You can easily expand this example by adding more components (e.g., text-to-speech, image generation) and connecting them through additional jobs.
|
|
196
216
|
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
```
|
|
200
|
-
listener:
|
|
201
|
-
type: http-callback
|
|
202
|
-
port: 8090
|
|
203
|
-
base_path: /callbacks
|
|
204
|
-
callbacks:
|
|
205
|
-
- path: /chat-ai
|
|
206
|
-
method: POST
|
|
207
|
-
item: ${body.data}
|
|
208
|
-
identify_by: ${item.task_id}
|
|
209
|
-
result: ${item.choices[0].message.content}
|
|
210
|
-
```
|
|
211
|
-
|
|
212
|
-
This listener sets up an HTTP callback endpoint at `http://localhost:8090/callbacks/chat-ai` to handle asynchronous responses from an external service that behaves like ChatGPT but supports delayed or push-based results. This is useful when integrating with services that notify results via webhook-style callbacks.
|
|
213
|
-
|
|
214
|
-
#### 🌐 Gateway Example
|
|
215
|
-
|
|
216
|
-
```
|
|
217
|
-
gateway:
|
|
218
|
-
type: http-tunnel
|
|
219
|
-
driver: ngrok
|
|
220
|
-
port: 8090
|
|
221
|
-
```
|
|
222
|
-
|
|
223
|
-
This gateway configuration exposes the local listener defined above to the public internet using an HTTP tunnel powered by ngrok. It forwards incoming traffic from a secure, public URL (e.g., `https://abc123.ngrok.io`) directly to your local callback endpoint at `http://localhost:8090`. This is essential when integrating with third-party services that need to push data back to your workflow via webhooks or asynchronous callbacks.
|
|
224
|
-
|
|
225
|
-
> 📁 For more example model-compose.yml configurations, check the [examples directory](examples) in the source code.
|
|
217
|
+
> 📁 For more example configurations including listeners, gateways, and advanced workflows, check the [examples directory](examples) or refer to the [User Guide](docs/user-guide/00-table-of-contents.md).
|
|
226
218
|
|
|
227
219
|
---
|
|
228
220
|
## 🖥 Web UI
|
|
@@ -41,6 +41,26 @@ pip install -e .
|
|
|
41
41
|
|
|
42
42
|
---
|
|
43
43
|
|
|
44
|
+
## 📚 Documentation
|
|
45
|
+
|
|
46
|
+
**📖 [Complete User Guide](docs/user-guide/00-table-of-contents.md)**
|
|
47
|
+
|
|
48
|
+
Need help getting started or want to explore advanced features? Check out our comprehensive user guide:
|
|
49
|
+
|
|
50
|
+
- **🌍 English**: [User Guide](docs/user-guide/00-table-of-contents.md)
|
|
51
|
+
- **🇰🇷 한국어**: [사용자 가이드](docs/user-guide/ko/00-table-of-contents.md)
|
|
52
|
+
|
|
53
|
+
The guide covers everything from basic concepts to advanced workflows, including:
|
|
54
|
+
- Getting started with model-compose
|
|
55
|
+
- Component and workflow configuration
|
|
56
|
+
- Local AI models and training
|
|
57
|
+
- Streaming mode and variable binding
|
|
58
|
+
- System integration with listeners and gateways
|
|
59
|
+
- Deployment strategies
|
|
60
|
+
- Practical examples and troubleshooting
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
44
64
|
## 🚀 How to Run
|
|
45
65
|
|
|
46
66
|
**model-compose** provides a CLI interface to launch and manage your AI workflows — inspired by `docker-compose`.
|
|
@@ -170,35 +190,7 @@ This minimal example defines a simple workflow that calls the OpenAI ChatGPT API
|
|
|
170
190
|
|
|
171
191
|
You can easily expand this example by adding more components (e.g., text-to-speech, image generation) and connecting them through additional jobs.
|
|
172
192
|
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
```
|
|
176
|
-
listener:
|
|
177
|
-
type: http-callback
|
|
178
|
-
port: 8090
|
|
179
|
-
base_path: /callbacks
|
|
180
|
-
callbacks:
|
|
181
|
-
- path: /chat-ai
|
|
182
|
-
method: POST
|
|
183
|
-
item: ${body.data}
|
|
184
|
-
identify_by: ${item.task_id}
|
|
185
|
-
result: ${item.choices[0].message.content}
|
|
186
|
-
```
|
|
187
|
-
|
|
188
|
-
This listener sets up an HTTP callback endpoint at `http://localhost:8090/callbacks/chat-ai` to handle asynchronous responses from an external service that behaves like ChatGPT but supports delayed or push-based results. This is useful when integrating with services that notify results via webhook-style callbacks.
|
|
189
|
-
|
|
190
|
-
#### 🌐 Gateway Example
|
|
191
|
-
|
|
192
|
-
```
|
|
193
|
-
gateway:
|
|
194
|
-
type: http-tunnel
|
|
195
|
-
driver: ngrok
|
|
196
|
-
port: 8090
|
|
197
|
-
```
|
|
198
|
-
|
|
199
|
-
This gateway configuration exposes the local listener defined above to the public internet using an HTTP tunnel powered by ngrok. It forwards incoming traffic from a secure, public URL (e.g., `https://abc123.ngrok.io`) directly to your local callback endpoint at `http://localhost:8090`. This is essential when integrating with third-party services that need to push data back to your workflow via webhooks or asynchronous callbacks.
|
|
200
|
-
|
|
201
|
-
> 📁 For more example model-compose.yml configurations, check the [examples directory](examples) in the source code.
|
|
193
|
+
> 📁 For more example configurations including listeners, gateways, and advanced workflows, check the [examples directory](examples) or refer to the [User Guide](docs/user-guide/00-table-of-contents.md).
|
|
202
194
|
|
|
203
195
|
---
|
|
204
196
|
## 🖥 Web UI
|
|
@@ -1,11 +1,18 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
1
|
+
from typing import Optional, List
|
|
2
|
+
import importlib.metadata
|
|
3
3
|
from pathlib import Path
|
|
4
|
+
import click
|
|
4
5
|
import asyncio
|
|
6
|
+
import json
|
|
5
7
|
|
|
6
|
-
|
|
7
|
-
from mindor.
|
|
8
|
-
from mindor.core.
|
|
8
|
+
def _load_compose_config(config_files: List[Path], env_files: List[Path], env_data: List[str]):
|
|
9
|
+
from mindor.dsl.loader import load_compose_config
|
|
10
|
+
from mindor.core.runtime.env import load_env_files, merge_env_data
|
|
11
|
+
|
|
12
|
+
env = load_env_files(".", env_files or [])
|
|
13
|
+
env = merge_env_data(env, env_data)
|
|
14
|
+
|
|
15
|
+
return load_compose_config(".", config_files, env)
|
|
9
16
|
|
|
10
17
|
@click.group()
|
|
11
18
|
@click.option(
|
|
@@ -13,6 +20,10 @@ from mindor.core.compose import *
|
|
|
13
20
|
type=click.Path(exists=True, dir_okay=False, path_type=Path),
|
|
14
21
|
help="Compose configuration files."
|
|
15
22
|
)
|
|
23
|
+
@click.version_option(
|
|
24
|
+
version=importlib.metadata.version("model-compose"),
|
|
25
|
+
message="%(prog)s %(version)s"
|
|
26
|
+
)
|
|
16
27
|
@click.pass_context
|
|
17
28
|
def compose_command(ctx: click.Context, config_files: List[Path]) -> None:
|
|
18
29
|
"""model-compose"""
|
|
@@ -34,18 +45,17 @@ def compose_command(ctx: click.Context, config_files: List[Path]) -> None:
|
|
|
34
45
|
@click.option("--verbose", "-v", is_flag=True, help="Enable verbose output.")
|
|
35
46
|
@click.pass_context
|
|
36
47
|
def up_command(
|
|
37
|
-
ctx: click.Context,
|
|
48
|
+
ctx: click.Context,
|
|
38
49
|
detach: bool,
|
|
39
50
|
env_files: List[Path],
|
|
40
51
|
env_data: List[str],
|
|
41
52
|
verbose: bool
|
|
42
53
|
) -> None:
|
|
54
|
+
from mindor.core.compose import launch_services
|
|
43
55
|
config_files = ctx.obj.get("config_files", [])
|
|
44
56
|
async def _async_command():
|
|
45
57
|
try:
|
|
46
|
-
|
|
47
|
-
env = merge_env_data(env, env_data)
|
|
48
|
-
config = load_compose_config(".", config_files, env)
|
|
58
|
+
config = _load_compose_config(config_files, env_files, env_data)
|
|
49
59
|
await launch_services(config, detach, verbose)
|
|
50
60
|
except Exception as e:
|
|
51
61
|
click.echo(f"❌ {e}", err=True)
|
|
@@ -70,12 +80,11 @@ def down_command(
|
|
|
70
80
|
env_data: List[str],
|
|
71
81
|
verbose: bool
|
|
72
82
|
) -> None:
|
|
83
|
+
from mindor.core.compose import terminate_services
|
|
73
84
|
config_files = ctx.obj.get("config_files", [])
|
|
74
85
|
async def _async_command():
|
|
75
86
|
try:
|
|
76
|
-
|
|
77
|
-
env = merge_env_data(env, env_data)
|
|
78
|
-
config = load_compose_config(".", config_files, env)
|
|
87
|
+
config = _load_compose_config(config_files, env_files, env_data)
|
|
79
88
|
await terminate_services(config, verbose)
|
|
80
89
|
except Exception as e:
|
|
81
90
|
click.echo(f"❌ {e}", err=True)
|
|
@@ -100,12 +109,11 @@ def start_command(
|
|
|
100
109
|
env_data: List[str],
|
|
101
110
|
verbose: bool
|
|
102
111
|
) -> None:
|
|
112
|
+
from mindor.core.compose import start_services
|
|
103
113
|
config_files = ctx.obj.get("config_files", [])
|
|
104
114
|
async def _async_command():
|
|
105
115
|
try:
|
|
106
|
-
|
|
107
|
-
env = merge_env_data(env, env_data)
|
|
108
|
-
config = load_compose_config(".", config_files, env)
|
|
116
|
+
config = _load_compose_config(config_files, env_files, env_data)
|
|
109
117
|
await start_services(config, verbose)
|
|
110
118
|
except Exception as e:
|
|
111
119
|
click.echo(f"❌ {e}", err=True)
|
|
@@ -130,12 +138,11 @@ def stop_command(
|
|
|
130
138
|
env_data: List[str],
|
|
131
139
|
verbose: bool
|
|
132
140
|
) -> None:
|
|
141
|
+
from mindor.core.compose import stop_services
|
|
133
142
|
config_files = ctx.obj.get("config_files", [])
|
|
134
143
|
async def _async_command():
|
|
135
144
|
try:
|
|
136
|
-
|
|
137
|
-
env = merge_env_data(env, env_data)
|
|
138
|
-
config = load_compose_config(".", config_files, env)
|
|
145
|
+
config = _load_compose_config(config_files, env_files, env_data)
|
|
139
146
|
await stop_services(config, verbose)
|
|
140
147
|
except Exception as e:
|
|
141
148
|
click.echo(f"❌ {e}", err=True)
|
|
@@ -176,12 +183,11 @@ def run_command(
|
|
|
176
183
|
output_path: Optional[Path],
|
|
177
184
|
verbose: bool
|
|
178
185
|
) -> None:
|
|
186
|
+
from mindor.core.compose import run_workflow
|
|
179
187
|
config_files = ctx.obj.get("config_files", [])
|
|
180
188
|
async def _async_command():
|
|
181
189
|
try:
|
|
182
|
-
|
|
183
|
-
env = merge_env_data(env, env_data)
|
|
184
|
-
config = load_compose_config(".", config_files, env)
|
|
190
|
+
config = _load_compose_config(config_files, env_files, env_data)
|
|
185
191
|
input = json.loads(input_json) if input_json else {}
|
|
186
192
|
state = await run_workflow(config, workflow_id or "__default__", input, output_path, verbose)
|
|
187
193
|
if isinstance(state.output, (dict, list)) or state.error:
|
|
@@ -23,7 +23,7 @@ from .runtime.native import NativeRuntimeLauncher
|
|
|
23
23
|
from .runtime.docker import DockerRuntimeLauncher
|
|
24
24
|
from threading import Lock
|
|
25
25
|
from pathlib import Path
|
|
26
|
-
import asyncio, ulid, os
|
|
26
|
+
import asyncio, ulid, os, threading
|
|
27
27
|
|
|
28
28
|
class TaskStatus(str, Enum):
|
|
29
29
|
PENDING = "pending"
|
|
@@ -39,6 +39,19 @@ class TaskState:
|
|
|
39
39
|
error: Optional[Any] = None
|
|
40
40
|
|
|
41
41
|
class ControllerService(AsyncService):
|
|
42
|
+
_shared_instance: Optional["ControllerService"] = None
|
|
43
|
+
_shared_instance_lock = threading.Lock()
|
|
44
|
+
|
|
45
|
+
def __new__(cls, *args, **kwargs):
|
|
46
|
+
with cls._shared_instance_lock:
|
|
47
|
+
if cls._shared_instance is None:
|
|
48
|
+
cls._shared_instance = super().__new__(cls, args, kwargs)
|
|
49
|
+
return cls._shared_instance
|
|
50
|
+
|
|
51
|
+
@classmethod
|
|
52
|
+
def get_shared_instance(cls) -> Optional["ControllerService"]:
|
|
53
|
+
return cls._shared_instance
|
|
54
|
+
|
|
42
55
|
def __init__(
|
|
43
56
|
self,
|
|
44
57
|
config: ControllerConfig,
|
{model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/controller/services/http_server.py
RENAMED
|
@@ -42,6 +42,10 @@ class TaskResult(BaseModel):
|
|
|
42
42
|
error=instance.error
|
|
43
43
|
)
|
|
44
44
|
|
|
45
|
+
@classmethod
|
|
46
|
+
def to_dict(cls, instance: TaskState) -> Dict[str, Any]:
|
|
47
|
+
return cls.from_instance(instance).model_dump(exclude_none=True)
|
|
48
|
+
|
|
45
49
|
class WorkflowVariableResult(BaseModel):
|
|
46
50
|
name: Optional[str]
|
|
47
51
|
type: str
|
|
@@ -83,6 +87,10 @@ class WorkflowSimpleResult(BaseModel):
|
|
|
83
87
|
default=instance.default or None
|
|
84
88
|
)
|
|
85
89
|
|
|
90
|
+
@classmethod
|
|
91
|
+
def to_dict(cls, instance: WorkflowSchema) -> Dict[str, Any]:
|
|
92
|
+
return cls.from_instance(instance).model_dump(exclude_none=True)
|
|
93
|
+
|
|
86
94
|
class WorkflowSchemaResult(BaseModel):
|
|
87
95
|
workflow_id: str
|
|
88
96
|
title: Optional[str] = None
|
|
@@ -102,6 +110,10 @@ class WorkflowSchemaResult(BaseModel):
|
|
|
102
110
|
default=instance.default or None
|
|
103
111
|
)
|
|
104
112
|
|
|
113
|
+
@classmethod
|
|
114
|
+
def to_dict(cls, instance: WorkflowSchema) -> Dict[str, Any]:
|
|
115
|
+
return cls.from_instance(instance).model_dump(exclude_none=True)
|
|
116
|
+
|
|
105
117
|
@classmethod
|
|
106
118
|
def _to_variable_result(cls, variable: Union[WorkflowVariableConfig, WorkflowVariableGroupConfig]) -> Union[WorkflowVariableResult, WorkflowVariableGroupResult]:
|
|
107
119
|
if isinstance(variable, WorkflowVariableGroupConfig):
|
|
@@ -176,6 +188,10 @@ class HttpServerController(ControllerService):
|
|
|
176
188
|
|
|
177
189
|
return self._render_task_response(state, output_only)
|
|
178
190
|
|
|
191
|
+
@self.router.get("/health")
|
|
192
|
+
async def health_check():
|
|
193
|
+
return JSONResponse(content={ "status": "ok" })
|
|
194
|
+
|
|
179
195
|
async def _serve(self) -> None:
|
|
180
196
|
self.server = uvicorn.Server(uvicorn.Config(
|
|
181
197
|
self.app,
|
|
@@ -231,7 +247,7 @@ class HttpServerController(ControllerService):
|
|
|
231
247
|
return self._render_task_state(state)
|
|
232
248
|
|
|
233
249
|
def _render_task_state(self, state: TaskState) -> Response:
|
|
234
|
-
return JSONResponse(content=TaskResult.
|
|
250
|
+
return JSONResponse(content=TaskResult.to_dict(state))
|
|
235
251
|
|
|
236
252
|
def _render_task_output(self, state: TaskState) -> Response:
|
|
237
253
|
if state.status in [ TaskStatus.PENDING, TaskStatus.PROCESSING ]:
|
|
@@ -279,13 +295,13 @@ class HttpServerController(ControllerService):
|
|
|
279
295
|
|
|
280
296
|
def _render_workflow_list(self, workflows: Dict[str, WorkflowSchema]) -> Response:
|
|
281
297
|
return JSONResponse(content=[
|
|
282
|
-
WorkflowSimpleResult.
|
|
298
|
+
WorkflowSimpleResult.to_dict(workflow) for workflow in workflows.values()
|
|
283
299
|
])
|
|
284
300
|
|
|
285
301
|
def _render_workflow_schemas(self, workflows: Dict[str, WorkflowSchema]) -> Response:
|
|
286
302
|
return JSONResponse(content=[
|
|
287
|
-
WorkflowSchemaResult.
|
|
303
|
+
WorkflowSchemaResult.to_dict(workflow) for workflow in workflows.values()
|
|
288
304
|
])
|
|
289
305
|
|
|
290
306
|
def _render_workflow_schema(self, workflow: WorkflowSchema) -> Response:
|
|
291
|
-
return JSONResponse(content=WorkflowSchemaResult.
|
|
307
|
+
return JSONResponse(content=WorkflowSchemaResult.to_dict(workflow))
|
{model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/core/listener/services/http_callback.py
RENAMED
|
@@ -1,18 +1,13 @@
|
|
|
1
1
|
from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Callable, AsyncIterator, Any
|
|
2
|
-
|
|
3
2
|
from mindor.dsl.schema.listener import HttpCallbackListenerConfig, HttpCallbackConfig
|
|
4
3
|
from mindor.core.utils.http_request import parse_request_body, parse_options_header
|
|
5
4
|
from mindor.core.utils.renderers import VariableRenderer
|
|
6
5
|
from ..base import ListenerService, ListenerType, register_listener
|
|
7
|
-
|
|
8
6
|
from fastapi import FastAPI, APIRouter, Body, HTTPException, Request
|
|
9
7
|
from fastapi.responses import Response, JSONResponse
|
|
10
8
|
from threading import Lock
|
|
11
9
|
import asyncio, uvicorn
|
|
12
10
|
|
|
13
|
-
_pending_futures: Dict[str, asyncio.Future] = {}
|
|
14
|
-
_pending_futures_lock: Lock = Lock()
|
|
15
|
-
|
|
16
11
|
class HttpCallbackContext:
|
|
17
12
|
def __init__(self, body: Optional[Any], query: Optional[Dict[str, str]], bulk: bool, item: Optional[str]):
|
|
18
13
|
self.body: Optional[Any] = body
|
|
@@ -49,6 +44,9 @@ class HttpCallbackContext:
|
|
|
49
44
|
|
|
50
45
|
@register_listener(ListenerType.HTTP_CALLBACK)
|
|
51
46
|
class HttpCallbackListener(ListenerService):
|
|
47
|
+
_pending_futures: Dict[str, asyncio.Future] = {}
|
|
48
|
+
_pending_futures_lock: Lock = Lock()
|
|
49
|
+
|
|
52
50
|
def __init__(self, id: str, config: HttpCallbackListenerConfig, daemon: bool):
|
|
53
51
|
super().__init__(id, config, daemon)
|
|
54
52
|
|
|
@@ -86,7 +84,7 @@ class HttpCallbackListener(ListenerService):
|
|
|
86
84
|
future.set_exception(RuntimeError(f"Task failed for '{callback_id}'"))
|
|
87
85
|
self._remove_pending_future(callback_id)
|
|
88
86
|
|
|
89
|
-
return Response()
|
|
87
|
+
return Response(status_code=200)
|
|
90
88
|
|
|
91
89
|
return _handler
|
|
92
90
|
|
|
@@ -118,14 +116,14 @@ class HttpCallbackListener(ListenerService):
|
|
|
118
116
|
self.server.should_exit = True
|
|
119
117
|
|
|
120
118
|
def _get_pending_future(self, id: str) -> Optional[asyncio.Future]:
|
|
121
|
-
with _pending_futures_lock:
|
|
122
|
-
return _pending_futures.get(id)
|
|
119
|
+
with self._pending_futures_lock:
|
|
120
|
+
return self._pending_futures.get(id)
|
|
123
121
|
|
|
124
122
|
def _remove_pending_future(self, id: str) -> None:
|
|
125
|
-
with _pending_futures_lock:
|
|
126
|
-
_pending_futures.pop(id, None)
|
|
123
|
+
with self._pending_futures_lock:
|
|
124
|
+
self._pending_futures.pop(id, None)
|
|
127
125
|
|
|
128
126
|
@classmethod
|
|
129
127
|
def register_pending_future(cls, id: str, future: asyncio.Future) -> None:
|
|
130
|
-
with _pending_futures_lock:
|
|
131
|
-
_pending_futures[id] = future
|
|
128
|
+
with cls._pending_futures_lock:
|
|
129
|
+
cls._pending_futures[id] = future
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Callable, AsyncIterator, Self, Any
|
|
2
|
+
from pydantic import BaseModel
|
|
3
|
+
from mindor.dsl.schema.listener import HttpTriggerListenerConfig, HttpTriggerConfig
|
|
4
|
+
from mindor.core.controller import ControllerService, TaskState
|
|
5
|
+
from mindor.core.utils.http_request import parse_request_body, parse_options_header
|
|
6
|
+
from mindor.core.utils.renderers import VariableRenderer
|
|
7
|
+
from ..base import ListenerService, ListenerType, register_listener
|
|
8
|
+
from fastapi import FastAPI, APIRouter, Body, HTTPException, Request
|
|
9
|
+
from fastapi.responses import Response, JSONResponse
|
|
10
|
+
import asyncio, uvicorn
|
|
11
|
+
|
|
12
|
+
class TaskResult(BaseModel):
|
|
13
|
+
task_id: str
|
|
14
|
+
status: Literal[ "pending", "processing", "completed", "failed" ]
|
|
15
|
+
output: Optional[Any] = None
|
|
16
|
+
error: Optional[Any] = None
|
|
17
|
+
|
|
18
|
+
@classmethod
|
|
19
|
+
def from_instance(cls, instance: TaskState) -> Self:
|
|
20
|
+
return cls(
|
|
21
|
+
task_id=instance.task_id,
|
|
22
|
+
status=instance.status,
|
|
23
|
+
output=instance.output,
|
|
24
|
+
error=instance.error
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
@classmethod
|
|
28
|
+
def to_dict(cls, instance: TaskState) -> Dict[str, Any]:
|
|
29
|
+
return cls.from_instance(instance).model_dump(exclude_none=True)
|
|
30
|
+
|
|
31
|
+
class HttpTriggerContext:
|
|
32
|
+
def __init__(self, body: Optional[Any], query: Optional[Dict[str, str]], bulk: bool, item: Optional[str]):
|
|
33
|
+
self.body: Optional[Any] = body
|
|
34
|
+
self.query: Optional[Dict[str, str]] = query
|
|
35
|
+
self.bulk: bool = bulk
|
|
36
|
+
self.item: Optional[str] = item
|
|
37
|
+
self.renderer: VariableRenderer = VariableRenderer(self._resolve_source)
|
|
38
|
+
|
|
39
|
+
async def items(self) -> AsyncIterator["HttpTriggerContext"]:
|
|
40
|
+
for item in await self._items():
|
|
41
|
+
yield HttpTriggerContext(item, self.query, False, None)
|
|
42
|
+
|
|
43
|
+
async def render_variable(self, template: str, ignore_files: bool = True) -> Any:
|
|
44
|
+
return await self.renderer.render(template, ignore_files)
|
|
45
|
+
|
|
46
|
+
async def _items(self) -> List[Any]:
|
|
47
|
+
item = await self.renderer.render(self.item) if self.item else self.body
|
|
48
|
+
|
|
49
|
+
if self.bulk:
|
|
50
|
+
if not isinstance(item, list):
|
|
51
|
+
raise ValueError("Expected a list because 'bulk' is true, but got a non-list")
|
|
52
|
+
return item
|
|
53
|
+
|
|
54
|
+
return [ item ]
|
|
55
|
+
|
|
56
|
+
async def _resolve_source(self, key: str, index: Optional[int]) -> Any:
|
|
57
|
+
if key == "body" or key == "item":
|
|
58
|
+
return self.body
|
|
59
|
+
|
|
60
|
+
if key == "query":
|
|
61
|
+
return self.query
|
|
62
|
+
|
|
63
|
+
raise KeyError(f"Unknown source: {key}")
|
|
64
|
+
|
|
65
|
+
@register_listener(ListenerType.HTTP_TRIGGER)
|
|
66
|
+
class HttpTriggerListener(ListenerService):
|
|
67
|
+
def __init__(self, id: str, config: HttpTriggerListenerConfig, daemon: bool):
|
|
68
|
+
super().__init__(id, config, daemon)
|
|
69
|
+
|
|
70
|
+
self.server: Optional[uvicorn.Server] = None
|
|
71
|
+
self.app: FastAPI = FastAPI(openapi_url=None, docs_url=None, redoc_url=None)
|
|
72
|
+
self.router: APIRouter = APIRouter()
|
|
73
|
+
|
|
74
|
+
self._configure_routes()
|
|
75
|
+
self.app.include_router(self.router, prefix=self.config.base_path or "")
|
|
76
|
+
|
|
77
|
+
def _configure_routes(self) -> None:
|
|
78
|
+
for trigger in self.config.triggers:
|
|
79
|
+
self.router.add_api_route(
|
|
80
|
+
path=trigger.path,
|
|
81
|
+
endpoint=self._make_trigger_handler(trigger),
|
|
82
|
+
methods=[trigger.method],
|
|
83
|
+
name=f"trigger_{trigger.path.strip('/').replace('/', '_')}",
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
def _make_trigger_handler(self, trigger: HttpTriggerConfig) -> Callable:
|
|
87
|
+
async def _handler(request: Request) -> Response:
|
|
88
|
+
controller = ControllerService.get_shared_instance()
|
|
89
|
+
content_type, _ = parse_options_header(request.headers, "Content-Type")
|
|
90
|
+
body, query = await parse_request_body(request, content_type), request.query_params
|
|
91
|
+
context = HttpTriggerContext(body, query, trigger.bulk, trigger.item)
|
|
92
|
+
states: List[TaskState] = []
|
|
93
|
+
|
|
94
|
+
async for item in context.items():
|
|
95
|
+
workflow_id = await item.render_variable(trigger.workflow)
|
|
96
|
+
input = await item.render_variable(trigger.input)
|
|
97
|
+
|
|
98
|
+
try:
|
|
99
|
+
state = await controller.run_workflow(workflow_id, input, wait_for_completion=False)
|
|
100
|
+
except Exception as e:
|
|
101
|
+
raise HTTPException(status_code=500, detail=f"Failed to trigger workflow: {str(e)}")
|
|
102
|
+
|
|
103
|
+
states.append(state)
|
|
104
|
+
|
|
105
|
+
return self._render_task_states(states, trigger.bulk)
|
|
106
|
+
|
|
107
|
+
return _handler
|
|
108
|
+
|
|
109
|
+
def _render_task_states(self, states: List[TaskState], bulk: bool) -> Response:
|
|
110
|
+
if bulk:
|
|
111
|
+
return JSONResponse(content=[ TaskResult.to_dict(state) for state in states ])
|
|
112
|
+
else:
|
|
113
|
+
return JSONResponse(content=TaskResult.to_dict(states[0]))
|
|
114
|
+
|
|
115
|
+
async def _serve(self) -> None:
|
|
116
|
+
self.server = uvicorn.Server(uvicorn.Config(
|
|
117
|
+
self.app,
|
|
118
|
+
host=self.config.host,
|
|
119
|
+
port=self.config.port,
|
|
120
|
+
log_level="info"
|
|
121
|
+
))
|
|
122
|
+
try:
|
|
123
|
+
await self.server.serve()
|
|
124
|
+
finally:
|
|
125
|
+
self.server = None
|
|
126
|
+
|
|
127
|
+
async def _shutdown(self) -> None:
|
|
128
|
+
if self.server:
|
|
129
|
+
self.server.should_exit = True
|
|
@@ -11,8 +11,8 @@ class CommonDatasetsLoadActionConfig(CommonDatasetsActionConfig):
|
|
|
11
11
|
method: Literal[DatasetsActionMethod.LOAD]
|
|
12
12
|
provider: DatasetsProvider = Field(..., description="Datasets provider configuration.")
|
|
13
13
|
split: Optional[str] = Field(default=None, description="Dataset split to load (e.g., 'train', 'test', 'validation').")
|
|
14
|
-
streaming: bool = Field(default=False, description="Enable streaming mode for large datasets.")
|
|
15
|
-
keep_in_memory: bool = Field(default=False, description="Keep dataset in memory.")
|
|
14
|
+
streaming: Union[bool, str] = Field(default=False, description="Enable streaming mode for large datasets.")
|
|
15
|
+
keep_in_memory: Union[bool, str] = Field(default=False, description="Keep dataset in memory.")
|
|
16
16
|
cache_dir: Optional[str] = Field(default=None, description="Directory to cache downloaded files.")
|
|
17
17
|
save_infos: Union[bool, str] = Field(default=False, description="Save dataset info to cache.")
|
|
18
18
|
fraction: Optional[Union[float, str]] = Field(default=None, description="Fraction of dataset to load.")
|
{model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/action/impl/model/impl/common.py
RENAMED
|
@@ -4,4 +4,4 @@ from pydantic import BaseModel, Field
|
|
|
4
4
|
from ...common import CommonActionConfig
|
|
5
5
|
|
|
6
6
|
class CommonModelActionConfig(CommonActionConfig):
|
|
7
|
-
streaming:
|
|
7
|
+
streaming: Union[bool, str] = Field(default=None, description="Whether to enable streaming responses for inference.")
|
{model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/controller/impl/common.py
RENAMED
|
@@ -9,7 +9,7 @@ class CommonControllerConfig(BaseModel):
|
|
|
9
9
|
name: Optional[str] = Field(default=None, description="Name used to identify this controller.")
|
|
10
10
|
type: ControllerType = Field(..., description="Type of controller to run.")
|
|
11
11
|
runtime: RuntimeConfig = Field(..., description="Runtime environment settings.")
|
|
12
|
-
max_concurrent_count: int = Field(default=
|
|
12
|
+
max_concurrent_count: int = Field(default=0, description="Maximum number of tasks that can be executed concurrently.")
|
|
13
13
|
threaded: bool = Field(default=False, description="Whether to run tasks in separate threads.")
|
|
14
14
|
webui: Optional[ControllerWebUIConfig] = Field(default=None, description="Configuration for the controller's Web UI interface.")
|
|
15
15
|
|
{model_compose-0.4.9 → model_compose-0.4.10}/src/mindor/dsl/schema/listener/impl/http_callback.py
RENAMED
|
@@ -4,7 +4,7 @@ from pydantic import model_validator
|
|
|
4
4
|
from .common import ListenerType, CommonListenerConfig
|
|
5
5
|
|
|
6
6
|
class HttpCallbackConfig(BaseModel):
|
|
7
|
-
path: str
|
|
7
|
+
path: str = Field(..., description="URL path for this callback endpoint.")
|
|
8
8
|
method: Literal[ "GET", "POST", "PUT", "DELETE", "PATCH" ] = Field(default="POST", description="HTTP method this callback endpoint will accept.")
|
|
9
9
|
bulk: Union[bool, str] = Field(default=False, description="Whether this callback handles multiple items in a single request.")
|
|
10
10
|
item: Optional[str] = Field(default=None, description="Field path to extract individual items from the callback payload.")
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Any
|
|
2
|
+
from pydantic import BaseModel, Field
|
|
3
|
+
from pydantic import model_validator
|
|
4
|
+
from .common import ListenerType, CommonListenerConfig
|
|
5
|
+
|
|
6
|
+
class HttpTriggerConfig(BaseModel):
|
|
7
|
+
path: str = Field(..., description="URL path for this trigger endpoint.")
|
|
8
|
+
method: Literal["GET", "POST", "PUT", "DELETE", "PATCH"] = Field(default="POST", description="HTTP method this trigger endpoint will accept.")
|
|
9
|
+
bulk: Union[bool, str] = Field(default=False, description="Whether this trigger handles multiple items in a single request.")
|
|
10
|
+
item: Optional[str] = Field(default=None, description="Field path to extract individual items from the trigger payload.")
|
|
11
|
+
workflow: str = Field(..., description="Workflow ID to execute when this endpoint is triggered.")
|
|
12
|
+
input: Optional[Dict[str, str]] = Field(default=None, description="Workflow input parameters.")
|
|
13
|
+
|
|
14
|
+
class HttpTriggerListenerConfig(CommonListenerConfig):
|
|
15
|
+
type: Literal[ListenerType.HTTP_TRIGGER]
|
|
16
|
+
host: str = Field(default="0.0.0.0", description="Host address to bind the HTTP server to.")
|
|
17
|
+
port: int = Field(default=8091, ge=1, le=65535, description="Port number on which the HTTP server will listen.")
|
|
18
|
+
base_path: Optional[str] = Field(default=None, description="Base path prefix for all trigger endpoints.")
|
|
19
|
+
triggers: List[HttpTriggerConfig] = Field(default_factory=list, description="List of trigger endpoint configurations.")
|
|
20
|
+
|
|
21
|
+
@model_validator(mode="before")
|
|
22
|
+
def inflate_single_trigger(cls, values: Dict[str, Any]):
|
|
23
|
+
if "triggers" not in values:
|
|
24
|
+
trigger_keys = set(HttpTriggerConfig.model_fields.keys()) - set(CommonListenerConfig.model_fields.keys())
|
|
25
|
+
if any(k in values for k in trigger_keys):
|
|
26
|
+
values["triggers"] = [ { k: values.pop(k) for k in trigger_keys if k in values } ]
|
|
27
|
+
return values
|