model-compose 0.4.25__tar.gz → 0.4.27__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.25/src/model_compose.egg-info → model_compose-0.4.27}/PKG-INFO +14 -8
- {model_compose-0.4.25 → model_compose-0.4.27}/README.md +13 -7
- {model_compose-0.4.25 → model_compose-0.4.27}/pyproject.toml +1 -1
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/cli/interrupt.py +3 -2
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/web_scraper.py +7 -3
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/compose/manager.py +2 -2
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/compose/validator.py +3 -3
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/controller/base.py +2 -2
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/controller/runner/client.py +13 -1
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/controller/runner/http_client.py +15 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/controller/runner/mcp_client.py +9 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/controller/runner/runner.py +9 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/controller/services/http_server.py +4 -6
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/controller/services/mcp_server.py +5 -5
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/controller/webui/gradio.py +116 -16
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/controller/webui/webui.py +4 -9
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/workflow/interrupt.py +2 -2
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/workflow/job/impl/__init__.py +1 -1
- model_compose-0.4.25/src/mindor/core/workflow/job/impl/action.py → model_compose-0.4.27/src/mindor/core/workflow/job/impl/component.py +8 -8
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/workflow/schema.py +4 -4
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/workflow/workflow.py +0 -3
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/job/impl/__init__.py +1 -1
- model_compose-0.4.25/src/mindor/dsl/schema/job/impl/action.py → model_compose-0.4.27/src/mindor/dsl/schema/job/impl/component.py +10 -10
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/job/impl/types.py +1 -1
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/job/job.py +1 -1
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/workflow.py +4 -5
- {model_compose-0.4.25 → model_compose-0.4.27/src/model_compose.egg-info}/PKG-INFO +14 -8
- {model_compose-0.4.25 → model_compose-0.4.27}/src/model_compose.egg-info/SOURCES.txt +2 -3
- model_compose-0.4.25/src/mindor/dsl/utils/annotation.py +0 -19
- {model_compose-0.4.25 → model_compose-0.4.27}/LICENSE +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/setup.cfg +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/cli/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/cli/compose.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/base.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/component.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/context.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/runtime/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/runtime/process_manager.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/runtime/process_worker.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/agent.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/datasets/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/datasets/datasets.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/datasets/providers/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/datasets/providers/common.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/datasets/providers/huggingface.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/datasets/providers/local.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/datasets/utils.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/http_client.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/http_server.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/image_processor.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/mcp_client.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/mcp_server.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/base/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/base/common.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/base/huggingface.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/base/huggingface_hub.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/base/unsloth.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/model.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/chat_completion/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/chat_completion/huggingface.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/face_embedding/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/face_embedding/common.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/face_embedding/custom.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/face_embedding/insightface.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/image_generation/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/image_generation/common.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/image_generation/custom.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/image_generation/flux.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/image_generation/hunyuan_image.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/image_generation/sdxl.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/image_to_text/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/image_to_text/huggingface.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/image_upscale/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/image_upscale/common.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/image_upscale/custom.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/image_upscale/esrgan.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/image_upscale/ldsr.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/image_upscale/real_esrgan.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/image_upscale/swinir.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/text_classification/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/text_classification/huggingface.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/text_embedding/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/text_embedding/huggingface.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/text_generation/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/text_generation/huggingface.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/text_to_speech/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/text_to_speech/common.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/text_to_speech/custom.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/text_to_speech/qwen.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/shell.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/text_splitter.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/vector_store/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/vector_store/base.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/vector_store/drivers/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/vector_store/drivers/chroma.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/vector_store/drivers/milvus.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/vector_store/vector_store.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/workflow.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/compose/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/compose/compose.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/controller/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/controller/controller.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/controller/runner/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/controller/runtime/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/controller/runtime/docker/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/controller/runtime/docker/context/Dockerfile +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/controller/runtime/docker/docker.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/controller/runtime/native/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/controller/runtime/native/native.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/controller/runtime/specs.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/controller/services/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/controller/webui/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/evaluator/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/evaluator/condition.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/foundation/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/foundation/async_service.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/foundation/ipc_messages.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/foundation/process_manager.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/foundation/process_worker.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/gateway/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/gateway/base.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/gateway/gateway.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/gateway/services/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/gateway/services/http_tunnel/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/gateway/services/http_tunnel/base.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/gateway/services/http_tunnel/drivers/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/gateway/services/http_tunnel/drivers/cloudflare.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/gateway/services/http_tunnel/drivers/ngrok.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/gateway/services/http_tunnel/http_tunnel.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/gateway/services/ssh_tunnel.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/listener/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/listener/base.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/listener/listener.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/listener/services/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/listener/services/http_callback.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/listener/services/http_trigger.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/logger/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/logger/base.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/logger/logger.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/logger/logging.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/logger/services/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/logger/services/console.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/logger/services/file.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/runtime/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/runtime/docker/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/runtime/docker/docker.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/runtime/env.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/utils/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/utils/caching.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/utils/http_client.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/utils/http_request.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/utils/http_response.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/utils/http_status.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/utils/image.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/utils/mcp_client.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/utils/package.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/utils/renderers.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/utils/resolvers.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/utils/shell.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/utils/ssh_client.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/utils/streamer.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/utils/streaming.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/utils/time.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/utils/url.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/utils/websocket_client.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/utils/work_queue.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/workflow/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/workflow/context.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/workflow/job/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/workflow/job/base.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/workflow/job/impl/delay.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/workflow/job/impl/filter.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/workflow/job/impl/if_.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/workflow/job/impl/random_router.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/workflow/job/impl/switch.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/workflow/job/job.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/workflow/tool.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/loader.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/action.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/agent.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/common.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/datasets/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/datasets/common.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/datasets/datasets.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/datasets/providers/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/datasets/providers/common.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/datasets/providers/huggingface.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/datasets/providers/local.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/http_client.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/http_server.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/image_processor.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/mcp_client.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/mcp_server.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/chat_completion.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/common.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/face_embedding/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/face_embedding/face_embedding.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/face_embedding/impl/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/face_embedding/impl/common.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/face_embedding/impl/dlib.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/face_embedding/impl/facenet.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/face_embedding/impl/insightface.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/image_generation/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/image_generation/image_generation.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/image_generation/impl/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/image_generation/impl/common.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/image_generation/impl/flux.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/image_generation/impl/hunyuan_image.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/image_generation/impl/sdxl.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/image_to_text.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/image_upscale.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/impl/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/impl/common.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/impl/esrgan.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/impl/ldsr.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/impl/real_esrgan.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/impl/swinir.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/text_classification.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/text_embedding.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/text_generation.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/text_to_speech/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/text_to_speech/impl/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/text_to_speech/impl/common.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/text_to_speech/impl/qwen.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/text_to_speech/text_to_speech.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/model.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model_trainer/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model_trainer/impl/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model_trainer/impl/classification.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model_trainer/impl/common.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model_trainer/impl/sft.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model_trainer/model_trainer.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/shell.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/text_splitter.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/vector_store/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/vector_store/impl/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/vector_store/impl/chroma.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/vector_store/impl/common.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/vector_store/impl/faiss.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/vector_store/impl/milvus.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/vector_store/impl/qdrant.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/vector_store/vector_store.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/web_scraper.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/workflow.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/component.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/agent.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/common.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/datasets/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/datasets/datasets.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/http_client.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/http_server.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/image_processor.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/mcp_client.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/mcp_server.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/chat_completion.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/common.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/face_embedding/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/face_embedding/face_embedding.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/face_embedding/impl/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/face_embedding/impl/common.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/face_embedding/impl/dlib.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/face_embedding/impl/facenet.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/face_embedding/impl/insightface.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/image_generation/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/image_generation/image_generation.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/image_generation/impl/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/image_generation/impl/common.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/image_generation/impl/flux.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/image_generation/impl/hunyuan_image.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/image_generation/impl/sdxl.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/image_to_text.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/image_upscale.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/impl/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/impl/common.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/impl/esrgan.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/impl/ldsr.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/impl/real_esrgan.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/impl/swinir.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/text_classification.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/text_embedding.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/text_generation.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/text_to_speech/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/text_to_speech/impl/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/text_to_speech/impl/common.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/text_to_speech/impl/qwen.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/text_to_speech/text_to_speech.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/model.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model_trainer/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model_trainer/impl/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model_trainer/impl/classification.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model_trainer/impl/common.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model_trainer/impl/sft.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model_trainer/model_trainer.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/shell.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/text_splitter.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/types.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/vector_store/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/vector_store/impl/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/vector_store/impl/chroma.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/vector_store/impl/common.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/vector_store/impl/faiss.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/vector_store/impl/milvus.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/vector_store/impl/qdrant.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/vector_store/vector_store.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/web_scraper.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/workflow.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/compose.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/controller/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/controller/controller.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/controller/impl/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/controller/impl/common.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/controller/impl/http_server.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/controller/impl/mcp_server.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/controller/impl/types.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/controller/webui/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/controller/webui/impl/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/controller/webui/impl/common.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/controller/webui/impl/dynamic.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/controller/webui/impl/gradio.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/controller/webui/impl/static.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/controller/webui/webui.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/gateway/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/gateway/gateway.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/gateway/impl/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/gateway/impl/common.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/gateway/impl/http_tunnel/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/gateway/impl/http_tunnel/http_tunnel.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/cloudflare.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/common.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/ngrok.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/gateway/impl/ssh_tunnel.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/gateway/impl/types.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/job/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/job/impl/common.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/job/impl/delay.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/job/impl/filter.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/job/impl/if_.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/job/impl/random_router.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/job/impl/switch.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/listener/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/listener/impl/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/listener/impl/common.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/listener/impl/http_callback.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/listener/impl/http_trigger.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/listener/impl/types.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/listener/listener.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/logger/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/logger/impl/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/logger/impl/common.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/logger/impl/console.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/logger/impl/file.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/logger/impl/types.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/logger/logger.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/operator/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/operator/condition.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/runtime/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/runtime/impl/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/runtime/impl/common.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/runtime/impl/docker.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/runtime/impl/embedded.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/runtime/impl/native.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/runtime/impl/process.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/runtime/impl/types.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/runtime/runtime.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/transport/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/transport/http.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/transport/ssh.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/utils/__init__.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/utils/enum.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/utils/path.py +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/model_compose.egg-info/dependency_links.txt +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/model_compose.egg-info/entry_points.txt +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/model_compose.egg-info/requires.txt +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/src/model_compose.egg-info/top_level.txt +0 -0
- {model_compose-0.4.25 → model_compose-0.4.27}/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.27
|
|
4
4
|
Summary: model-compose: Declarative AI Workflow Orchestrator
|
|
5
5
|
Author-email: Hanyeol Cho <hanyeol.cho@gmail.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -62,6 +62,12 @@ Define complex AI workflows entirely in YAML—no Python, no JavaScript, no codi
|
|
|
62
62
|
### 🔗 **Universal AI Service Integration**
|
|
63
63
|
Connect to any AI provider out of the box—OpenAI, Anthropic Claude, Google Gemini, ElevenLabs, Stability AI, Replicate, or any custom HTTP API. Mix and match services in a single workflow.
|
|
64
64
|
|
|
65
|
+
### 🤖 **Agent Components**
|
|
66
|
+
Build autonomous AI agents that use workflows as tools. Agents can reason, plan, and execute multi-step tasks by dynamically invoking other workflows—all defined declaratively in YAML.
|
|
67
|
+
|
|
68
|
+
### ✋ **Human-in-the-Loop**
|
|
69
|
+
Add approval gates and user input steps to any workflow with interrupt configuration. Workflows pause, prompt for human input via CLI, Web UI, or API, and resume seamlessly—perfect for review, moderation, and supervised AI pipelines.
|
|
70
|
+
|
|
65
71
|
### 🖥️ **Local Model Execution**
|
|
66
72
|
Run models from HuggingFace and other sources locally with native support for transformers, PyTorch, and model serving frameworks. Fine-tune models with LoRA/PEFT, train with custom datasets, all through YAML configuration.
|
|
67
73
|
|
|
@@ -124,6 +130,12 @@ controller:
|
|
|
124
130
|
webui:
|
|
125
131
|
port: 8081
|
|
126
132
|
|
|
133
|
+
workflows:
|
|
134
|
+
- id: chat
|
|
135
|
+
default: true
|
|
136
|
+
jobs:
|
|
137
|
+
- component: chatgpt
|
|
138
|
+
|
|
127
139
|
components:
|
|
128
140
|
- id: chatgpt
|
|
129
141
|
type: http-client
|
|
@@ -137,12 +149,6 @@ components:
|
|
|
137
149
|
messages:
|
|
138
150
|
- role: user
|
|
139
151
|
content: ${input.prompt}
|
|
140
|
-
|
|
141
|
-
workflows:
|
|
142
|
-
- id: chat
|
|
143
|
-
default: true
|
|
144
|
-
jobs:
|
|
145
|
-
- component: chatgpt
|
|
146
152
|
```
|
|
147
153
|
|
|
148
154
|
Create a `.env` file:
|
|
@@ -211,7 +217,7 @@ pip install -e .[dev]
|
|
|
211
217
|
---
|
|
212
218
|
|
|
213
219
|
## 📄 License
|
|
214
|
-
MIT License © 2025 Hanyeol Cho.
|
|
220
|
+
MIT License © 2025-2026 Hanyeol Cho.
|
|
215
221
|
|
|
216
222
|
---
|
|
217
223
|
|
|
@@ -36,6 +36,12 @@ Define complex AI workflows entirely in YAML—no Python, no JavaScript, no codi
|
|
|
36
36
|
### 🔗 **Universal AI Service Integration**
|
|
37
37
|
Connect to any AI provider out of the box—OpenAI, Anthropic Claude, Google Gemini, ElevenLabs, Stability AI, Replicate, or any custom HTTP API. Mix and match services in a single workflow.
|
|
38
38
|
|
|
39
|
+
### 🤖 **Agent Components**
|
|
40
|
+
Build autonomous AI agents that use workflows as tools. Agents can reason, plan, and execute multi-step tasks by dynamically invoking other workflows—all defined declaratively in YAML.
|
|
41
|
+
|
|
42
|
+
### ✋ **Human-in-the-Loop**
|
|
43
|
+
Add approval gates and user input steps to any workflow with interrupt configuration. Workflows pause, prompt for human input via CLI, Web UI, or API, and resume seamlessly—perfect for review, moderation, and supervised AI pipelines.
|
|
44
|
+
|
|
39
45
|
### 🖥️ **Local Model Execution**
|
|
40
46
|
Run models from HuggingFace and other sources locally with native support for transformers, PyTorch, and model serving frameworks. Fine-tune models with LoRA/PEFT, train with custom datasets, all through YAML configuration.
|
|
41
47
|
|
|
@@ -98,6 +104,12 @@ controller:
|
|
|
98
104
|
webui:
|
|
99
105
|
port: 8081
|
|
100
106
|
|
|
107
|
+
workflows:
|
|
108
|
+
- id: chat
|
|
109
|
+
default: true
|
|
110
|
+
jobs:
|
|
111
|
+
- component: chatgpt
|
|
112
|
+
|
|
101
113
|
components:
|
|
102
114
|
- id: chatgpt
|
|
103
115
|
type: http-client
|
|
@@ -111,12 +123,6 @@ components:
|
|
|
111
123
|
messages:
|
|
112
124
|
- role: user
|
|
113
125
|
content: ${input.prompt}
|
|
114
|
-
|
|
115
|
-
workflows:
|
|
116
|
-
- id: chat
|
|
117
|
-
default: true
|
|
118
|
-
jobs:
|
|
119
|
-
- component: chatgpt
|
|
120
126
|
```
|
|
121
127
|
|
|
122
128
|
Create a `.env` file:
|
|
@@ -185,7 +191,7 @@ pip install -e .[dev]
|
|
|
185
191
|
---
|
|
186
192
|
|
|
187
193
|
## 📄 License
|
|
188
|
-
MIT License © 2025 Hanyeol Cho.
|
|
194
|
+
MIT License © 2025-2026 Hanyeol Cho.
|
|
189
195
|
|
|
190
196
|
---
|
|
191
197
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
|
-
from typing import TYPE_CHECKING
|
|
2
|
+
from typing import TYPE_CHECKING
|
|
3
3
|
|
|
4
|
+
from typing import Any
|
|
4
5
|
import click
|
|
5
6
|
import json
|
|
6
7
|
|
|
@@ -17,7 +18,7 @@ def prompt_for_interrupt(state: TaskState) -> Any:
|
|
|
17
18
|
click.echo(json.dumps(interrupt.metadata, indent=2, ensure_ascii=False), err=True)
|
|
18
19
|
|
|
19
20
|
click.echo("", err=True)
|
|
20
|
-
click.echo("✋ Action required — press Enter to continue, or type
|
|
21
|
+
click.echo("✋ Action required — press Enter to continue, or type an answer (JSON or text):", err=True)
|
|
21
22
|
raw = input()
|
|
22
23
|
|
|
23
24
|
if not raw:
|
{model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/web_scraper.py
RENAMED
|
@@ -73,7 +73,7 @@ class WebScraperAction:
|
|
|
73
73
|
{
|
|
74
74
|
"name": name,
|
|
75
75
|
"value": value,
|
|
76
|
-
"domain": parsed_url.
|
|
76
|
+
"domain": parsed_url.hostname,
|
|
77
77
|
"path": "/"
|
|
78
78
|
}
|
|
79
79
|
for name, value in cookies.items()
|
|
@@ -122,7 +122,11 @@ class WebScraperAction:
|
|
|
122
122
|
await element.click()
|
|
123
123
|
else:
|
|
124
124
|
# No selector/xpath: find and submit the first form
|
|
125
|
-
await page.
|
|
125
|
+
element = await page.query_selector("form")
|
|
126
|
+
if element:
|
|
127
|
+
await element.evaluate("form => form.submit()")
|
|
128
|
+
else:
|
|
129
|
+
raise ValueError("No <form> element found on the page to submit")
|
|
126
130
|
|
|
127
131
|
# Wait for navigation or specific element after submit
|
|
128
132
|
if wait_for:
|
|
@@ -232,7 +236,7 @@ class WebScraperComponent(ComponentService):
|
|
|
232
236
|
super().__init__(id, config, global_configs, daemon)
|
|
233
237
|
|
|
234
238
|
def _get_setup_requirements(self) -> Optional[List[str]]:
|
|
235
|
-
return [ "playwright", "
|
|
239
|
+
return [ "playwright", "beautifulsoup4", "lxml" ]
|
|
236
240
|
|
|
237
241
|
async def _setup(self) -> None:
|
|
238
242
|
"""Install playwright browsers after package installation."""
|
|
@@ -39,8 +39,8 @@ class ComposeManager:
|
|
|
39
39
|
|
|
40
40
|
return state
|
|
41
41
|
|
|
42
|
-
async def resume_workflow(self, task_id: str, job_id: str,
|
|
43
|
-
await self.controller.resume_workflow(task_id, job_id,
|
|
42
|
+
async def resume_workflow(self, task_id: str, job_id: str, answer: Any = None) -> TaskState:
|
|
43
|
+
await self.controller.resume_workflow(task_id, job_id, answer)
|
|
44
44
|
return await self.controller.wait_for_terminal_state(task_id)
|
|
45
45
|
|
|
46
46
|
async def _save_output(self, output: Any, path: str) -> None:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from typing import Dict, List, Set
|
|
2
2
|
from mindor.dsl.schema.compose import ComposeConfig
|
|
3
|
-
from mindor.dsl.schema.job.impl.
|
|
3
|
+
from mindor.dsl.schema.job.impl.component import ComponentJobConfig
|
|
4
4
|
from mindor.dsl.schema.action.impl.workflow import WorkflowActionConfig
|
|
5
5
|
from mindor.dsl.schema.listener.impl.http_trigger import HttpTriggerListenerConfig
|
|
6
6
|
from mindor.dsl.schema.component.impl.workflow import WorkflowComponentConfig
|
|
@@ -70,7 +70,7 @@ class ComposeValidator:
|
|
|
70
70
|
|
|
71
71
|
for wi, workflow in enumerate(self.config.workflows):
|
|
72
72
|
for ji, job in enumerate(workflow.jobs):
|
|
73
|
-
if not isinstance(job,
|
|
73
|
+
if not isinstance(job, ComponentJobConfig):
|
|
74
74
|
continue
|
|
75
75
|
if not isinstance(job.component, str):
|
|
76
76
|
continue
|
|
@@ -91,7 +91,7 @@ class ComposeValidator:
|
|
|
91
91
|
|
|
92
92
|
for wi, workflow in enumerate(self.config.workflows):
|
|
93
93
|
for ji, job in enumerate(workflow.jobs):
|
|
94
|
-
if not isinstance(job,
|
|
94
|
+
if not isinstance(job, ComponentJobConfig):
|
|
95
95
|
continue
|
|
96
96
|
|
|
97
97
|
action_ref = job.action
|
|
@@ -191,7 +191,7 @@ class ControllerService(AsyncService):
|
|
|
191
191
|
|
|
192
192
|
return state
|
|
193
193
|
|
|
194
|
-
async def resume_workflow(self, task_id: str, job_id: str,
|
|
194
|
+
async def resume_workflow(self, task_id: str, job_id: str, answer: Any = None) -> TaskState:
|
|
195
195
|
with self.task_states_lock:
|
|
196
196
|
state = self.task_states.get(task_id)
|
|
197
197
|
|
|
@@ -208,7 +208,7 @@ class ControllerService(AsyncService):
|
|
|
208
208
|
if not handler:
|
|
209
209
|
raise ValueError(f"No active interrupt handler for task '{task_id}'")
|
|
210
210
|
|
|
211
|
-
success = handler.resolve(task_id, job_id,
|
|
211
|
+
success = handler.resolve(task_id, job_id, answer)
|
|
212
212
|
if not success:
|
|
213
213
|
raise ValueError(f"No active interrupt found for task '{task_id}', job '{job_id}'")
|
|
214
214
|
|
|
@@ -8,7 +8,19 @@ class ControllerClient(ABC):
|
|
|
8
8
|
self.config: ControllerConfig = config
|
|
9
9
|
|
|
10
10
|
@abstractmethod
|
|
11
|
-
async def run_workflow(self, workflow_id: Optional[str], input: Any) -> Any:
|
|
11
|
+
async def run_workflow(self, workflow_id: Optional[str], input: Any, workflow: WorkflowSchema) -> Any:
|
|
12
|
+
pass
|
|
13
|
+
|
|
14
|
+
@abstractmethod
|
|
15
|
+
async def resume_workflow(self, task_id: str, job_id: str, answer: Any = None) -> dict:
|
|
16
|
+
pass
|
|
17
|
+
|
|
18
|
+
@abstractmethod
|
|
19
|
+
async def wait_for_completion(self, task_id: str) -> dict:
|
|
20
|
+
pass
|
|
21
|
+
|
|
22
|
+
@abstractmethod
|
|
23
|
+
async def get_task_output(self, task_id: str) -> Any:
|
|
12
24
|
pass
|
|
13
25
|
|
|
14
26
|
@abstractmethod
|
{model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/controller/runner/http_client.py
RENAMED
|
@@ -4,6 +4,7 @@ from mindor.core.workflow.schema import WorkflowSchema
|
|
|
4
4
|
from mindor.core.utils.http_client import HttpClient
|
|
5
5
|
from .client import ControllerClient
|
|
6
6
|
from starlette.datastructures import UploadFile
|
|
7
|
+
import asyncio
|
|
7
8
|
|
|
8
9
|
class HttpControllerClient(ControllerClient):
|
|
9
10
|
def __init__(self, config: ControllerConfig):
|
|
@@ -31,6 +32,20 @@ class HttpControllerClient(ControllerClient):
|
|
|
31
32
|
|
|
32
33
|
return await self.client.request("/workflows/runs", "POST", None, body, headers)
|
|
33
34
|
|
|
35
|
+
async def resume_workflow(self, task_id: str, job_id: str, answer: Any = None) -> dict:
|
|
36
|
+
body = { "job_id": job_id, "answer": answer }
|
|
37
|
+
return await self.client.request(f"/tasks/{task_id}/resume", "POST", None, body, { "Content-Type": "application/json" })
|
|
38
|
+
|
|
39
|
+
async def wait_for_completion(self, task_id: str) -> dict:
|
|
40
|
+
while True:
|
|
41
|
+
result = await self.client.request(f"/tasks/{task_id}", "GET")
|
|
42
|
+
if isinstance(result, dict) and result.get("status") in ("interrupted", "completed", "failed"):
|
|
43
|
+
return result
|
|
44
|
+
await asyncio.sleep(0.5)
|
|
45
|
+
|
|
46
|
+
async def get_task_output(self, task_id: str) -> Any:
|
|
47
|
+
return await self.client.request(f"/tasks/{task_id}", "GET", params={ "output_only": "true" })
|
|
48
|
+
|
|
34
49
|
async def close(self) -> None:
|
|
35
50
|
await self.client.close()
|
|
36
51
|
|
{model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/controller/runner/mcp_client.py
RENAMED
|
@@ -17,6 +17,15 @@ class McpControllerClient(ControllerClient):
|
|
|
17
17
|
async def run_workflow(self, workflow_id: Optional[str], input: Any, workflow: WorkflowSchema) -> Any:
|
|
18
18
|
return await self._call_tool(workflow_id or "__workflow__", input, workflow)
|
|
19
19
|
|
|
20
|
+
async def resume_workflow(self, task_id: str, job_id: str, answer: Any = None) -> dict:
|
|
21
|
+
raise NotImplementedError("MCP client does not support workflow interrupts")
|
|
22
|
+
|
|
23
|
+
async def wait_for_completion(self, task_id: str) -> dict:
|
|
24
|
+
raise NotImplementedError("MCP client does not support workflow interrupts")
|
|
25
|
+
|
|
26
|
+
async def get_task_output(self, task_id: str) -> Any:
|
|
27
|
+
raise NotImplementedError("MCP client does not support workflow interrupts")
|
|
28
|
+
|
|
20
29
|
async def close(self) -> None:
|
|
21
30
|
await self.client.close()
|
|
22
31
|
|
|
@@ -27,5 +27,14 @@ class ControllerRunner:
|
|
|
27
27
|
async def run_workflow(self, workflow_id: Optional[str], input: Any, schema: WorkflowSchema) -> Any:
|
|
28
28
|
return await self.client.run_workflow(workflow_id, input, schema)
|
|
29
29
|
|
|
30
|
+
async def resume_workflow(self, task_id: str, job_id: str, answer: Any = None) -> dict:
|
|
31
|
+
return await self.client.resume_workflow(task_id, job_id, answer)
|
|
32
|
+
|
|
33
|
+
async def wait_for_completion(self, task_id: str) -> dict:
|
|
34
|
+
return await self.client.wait_for_completion(task_id)
|
|
35
|
+
|
|
36
|
+
async def get_task_output(self, task_id: str) -> Any:
|
|
37
|
+
return await self.client.get_task_output(task_id)
|
|
38
|
+
|
|
30
39
|
async def close(self) -> None:
|
|
31
40
|
await self.client.close()
|
{model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/controller/services/http_server.py
RENAMED
|
@@ -29,7 +29,7 @@ class WorkflowRunRequestBody(BaseModel):
|
|
|
29
29
|
|
|
30
30
|
class WorkflowResumeRequestBody(BaseModel):
|
|
31
31
|
job_id: str
|
|
32
|
-
|
|
32
|
+
answer: Optional[Any] = None
|
|
33
33
|
|
|
34
34
|
class InterruptResult(BaseModel):
|
|
35
35
|
job_id: str
|
|
@@ -43,9 +43,7 @@ class InterruptResult(BaseModel):
|
|
|
43
43
|
job_id=instance.job_id,
|
|
44
44
|
phase=instance.phase,
|
|
45
45
|
message=instance.message,
|
|
46
|
-
metadata=instance.metadata
|
|
47
|
-
input=instance.input,
|
|
48
|
-
output=instance.output
|
|
46
|
+
metadata=instance.metadata
|
|
49
47
|
)
|
|
50
48
|
|
|
51
49
|
class TaskResult(BaseModel):
|
|
@@ -217,7 +215,7 @@ class HttpServerController(ControllerService):
|
|
|
217
215
|
body: WorkflowResumeRequestBody = Body(...)
|
|
218
216
|
):
|
|
219
217
|
try:
|
|
220
|
-
state = await self.resume_workflow(task_id, body.job_id, body.
|
|
218
|
+
state = await self.resume_workflow(task_id, body.job_id, body.answer)
|
|
221
219
|
return JSONResponse(content=TaskResult.to_dict(state))
|
|
222
220
|
except ValueError as e:
|
|
223
221
|
raise HTTPException(status_code=400, detail=str(e))
|
|
@@ -290,7 +288,7 @@ class HttpServerController(ControllerService):
|
|
|
290
288
|
|
|
291
289
|
def _render_task_output(self, state: TaskState) -> Response:
|
|
292
290
|
if state.status in [ TaskStatus.PENDING, TaskStatus.PROCESSING, TaskStatus.INTERRUPTED ]:
|
|
293
|
-
|
|
291
|
+
return JSONResponse(status_code=202, content=TaskResult.to_dict(state))
|
|
294
292
|
|
|
295
293
|
if state.status == TaskStatus.FAILED:
|
|
296
294
|
raise HTTPException(status_code=500, detail=str(state.error))
|
{model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/controller/services/mcp_server.py
RENAMED
|
@@ -50,12 +50,12 @@ class McpServerController(ControllerService):
|
|
|
50
50
|
self._configure_resume_tool()
|
|
51
51
|
|
|
52
52
|
def _configure_resume_tool(self) -> None:
|
|
53
|
-
async def resume_workflow(task_id: str, job_id: str,
|
|
54
|
-
|
|
53
|
+
async def resume_workflow(task_id: str, job_id: str, answer: str = "") -> List[ContentBlock]:
|
|
54
|
+
parsed_answer = json.loads(answer) if answer else None
|
|
55
55
|
try:
|
|
56
|
-
await self.resume_workflow(task_id, job_id,
|
|
56
|
+
await self.resume_workflow(task_id, job_id, parsed_answer)
|
|
57
57
|
except ValueError as e:
|
|
58
|
-
return [TextContent(type="text", text=json.dumps({"error": str(e)}))]
|
|
58
|
+
return [ TextContent(type="text", text=json.dumps({"error": str(e)})) ]
|
|
59
59
|
|
|
60
60
|
state = await self.wait_for_terminal_state(task_id)
|
|
61
61
|
return await self._build_state_response(state)
|
|
@@ -64,7 +64,7 @@ class McpServerController(ControllerService):
|
|
|
64
64
|
fn=resume_workflow,
|
|
65
65
|
name="resume_workflow",
|
|
66
66
|
title="Resume an interrupted workflow",
|
|
67
|
-
description="Resume a workflow that was paused at a Human-in-the-Loop interrupt point.\n\nArgs:\n task_id (str): The task ID of the interrupted workflow\n job_id (str): The job ID where the interrupt occurred\n
|
|
67
|
+
description="Resume a workflow that was paused at a Human-in-the-Loop interrupt point.\n\nArgs:\n task_id (str): The task ID of the interrupted workflow\n job_id (str): The job ID where the interrupt occurred\n answer (str): Optional JSON string with answer to resume with",
|
|
68
68
|
annotations=None
|
|
69
69
|
)
|
|
70
70
|
|
|
@@ -1,6 +1,10 @@
|
|
|
1
|
-
from
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
from typing import TYPE_CHECKING
|
|
3
|
+
|
|
4
|
+
from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Callable, Any
|
|
2
5
|
from mindor.dsl.schema.workflow import WorkflowVariableConfig, WorkflowVariableGroupConfig, WorkflowVariableType, WorkflowVariableFormat
|
|
3
6
|
from mindor.core.workflow.schema import WorkflowSchema
|
|
7
|
+
|
|
4
8
|
from mindor.core.utils.streaming import StreamResource, Base64StreamResource
|
|
5
9
|
from mindor.core.utils.streaming import save_stream_to_temporary_file, BytesStreamResource
|
|
6
10
|
from mindor.core.utils.http_request import create_upload_file
|
|
@@ -11,6 +15,9 @@ from PIL import Image as PILImage
|
|
|
11
15
|
import gradio as gr
|
|
12
16
|
import json, re
|
|
13
17
|
|
|
18
|
+
if TYPE_CHECKING:
|
|
19
|
+
from mindor.core.controller.runner import ControllerRunner
|
|
20
|
+
|
|
14
21
|
_variable_name_regex = re.compile(r"^([^[]+)(?:\[(\w+)\])?$")
|
|
15
22
|
|
|
16
23
|
class ComponentGroup:
|
|
@@ -22,40 +29,62 @@ class GradioWebUIBuilder:
|
|
|
22
29
|
def __init__(self):
|
|
23
30
|
self.field_resolver: FieldResolver = FieldResolver()
|
|
24
31
|
|
|
25
|
-
def build(self, workflow_schemas: Dict[str, WorkflowSchema],
|
|
32
|
+
def build(self, workflow_schemas: Dict[str, WorkflowSchema], runner: Callable[[], ControllerRunner]) -> gr.Blocks:
|
|
26
33
|
with gr.Blocks() as blocks:
|
|
27
34
|
for workflow_id, workflow in workflow_schemas.items():
|
|
28
|
-
async def _run_workflow(input: Any, workflow_id=workflow_id) -> Any:
|
|
29
|
-
return await workflow_runner(workflow_id, input)
|
|
30
|
-
|
|
31
35
|
if len(workflow_schemas) > 1:
|
|
32
36
|
with gr.Tab(label=workflow.name or workflow_id):
|
|
33
|
-
self._build_workflow_section(workflow,
|
|
37
|
+
self._build_workflow_section(workflow_id, workflow, runner)
|
|
34
38
|
else:
|
|
35
|
-
self._build_workflow_section(workflow,
|
|
39
|
+
self._build_workflow_section(workflow_id, workflow, runner)
|
|
36
40
|
|
|
37
41
|
return blocks
|
|
38
42
|
|
|
39
|
-
def _build_workflow_section(self,
|
|
43
|
+
def _build_workflow_section(self,
|
|
44
|
+
workflow_id: str,
|
|
45
|
+
workflow: WorkflowSchema,
|
|
46
|
+
runner: Callable[[], ControllerRunner]
|
|
47
|
+
) -> gr.Column:
|
|
40
48
|
with gr.Column() as section:
|
|
41
49
|
gr.Markdown(f"## **{workflow.title or 'Untitled Workflow'}**")
|
|
42
50
|
|
|
43
51
|
if workflow.description:
|
|
44
52
|
gr.Markdown(f"📝 {workflow.description}")
|
|
45
53
|
|
|
46
|
-
gr.Markdown("####
|
|
54
|
+
gr.Markdown("#### Input Parameters")
|
|
47
55
|
input_components = [ self._build_input_component(variable) for variable in workflow.input ]
|
|
56
|
+
|
|
48
57
|
run_button = gr.Button("🚀 Run Workflow", variant="primary")
|
|
49
58
|
|
|
50
|
-
|
|
59
|
+
# Interrupt panel (hidden by default)
|
|
60
|
+
interrupt_state = gr.State(value=None)
|
|
61
|
+
with gr.Column(visible=False) as interrupt_panel:
|
|
62
|
+
interrupt_message = gr.Markdown("")
|
|
63
|
+
interrupt_metadata = gr.JSON(label="Metadata", visible=False)
|
|
64
|
+
interrupt_answer = gr.Textbox(label="Answer", lines=2, placeholder="Press Resume to continue, or type an answer (JSON or text)")
|
|
65
|
+
resume_button = gr.Button("▶️ Resume", variant="primary")
|
|
66
|
+
|
|
67
|
+
interrupt_outputs = [ interrupt_state, interrupt_panel, interrupt_message, interrupt_metadata, interrupt_answer ]
|
|
68
|
+
|
|
69
|
+
gr.Markdown("#### Output Values")
|
|
51
70
|
output_components = [ self._build_output_component(variable) for variable in workflow.output ]
|
|
52
71
|
|
|
53
72
|
if not output_components:
|
|
54
73
|
output_components = [ gr.Textbox(label="", lines=10, interactive=False, buttons=["copy"]) ]
|
|
55
74
|
|
|
75
|
+
output_components = self._flatten_output_components(output_components)
|
|
76
|
+
|
|
56
77
|
async def _run_workflow(*args):
|
|
57
|
-
input
|
|
58
|
-
output = await runner(input)
|
|
78
|
+
input = await self._build_input_value(args, workflow.input)
|
|
79
|
+
output = await runner().run_workflow(workflow_id, input, workflow)
|
|
80
|
+
|
|
81
|
+
# Check if the result is an interrupted TaskResult
|
|
82
|
+
if isinstance(output, dict) and output.get("status") == "interrupted" and "task_id" in output:
|
|
83
|
+
yield self._build_interrupt_updates(output) + tuple(gr.update() for _ in output_components)
|
|
84
|
+
return
|
|
85
|
+
|
|
86
|
+
# Clear interrupt panel for normal results
|
|
87
|
+
clear_interrupt = self._clear_interrupt_updates()
|
|
59
88
|
|
|
60
89
|
if len(workflow.output) == 1 and self._is_streaming_variable(workflow.output[0]):
|
|
61
90
|
buffer = "" if workflow.output[0].type == WorkflowVariableType.TEXT else []
|
|
@@ -65,16 +94,64 @@ class GradioWebUIBuilder:
|
|
|
65
94
|
buffer += chunk[0] or ""
|
|
66
95
|
else:
|
|
67
96
|
buffer.append(chunk[0])
|
|
68
|
-
yield buffer
|
|
97
|
+
yield clear_interrupt + (buffer,)
|
|
69
98
|
else:
|
|
70
99
|
if workflow.output:
|
|
71
100
|
output = await self._flatten_output_value(output, workflow.output)
|
|
72
|
-
|
|
101
|
+
result = output[0] if len(output) == 1 else output
|
|
102
|
+
if isinstance(result, (list, tuple)):
|
|
103
|
+
yield clear_interrupt + tuple(result)
|
|
104
|
+
else:
|
|
105
|
+
yield clear_interrupt + (result,)
|
|
106
|
+
|
|
107
|
+
async def _resume_workflow(state: Optional[Dict[str, str]], answer_text: str):
|
|
108
|
+
task_id, job_id = state["task_id"], state["job_id"]
|
|
109
|
+
|
|
110
|
+
# Parse answer: try JSON first, fallback to string
|
|
111
|
+
answer = answer_text
|
|
112
|
+
if answer_text:
|
|
113
|
+
try:
|
|
114
|
+
answer = json.loads(answer_text)
|
|
115
|
+
except (json.JSONDecodeError, TypeError):
|
|
116
|
+
pass
|
|
117
|
+
|
|
118
|
+
await runner().resume_workflow(task_id, job_id, answer if answer_text else None)
|
|
119
|
+
result = await runner().wait_for_completion(task_id)
|
|
120
|
+
|
|
121
|
+
if result.get("status") == "interrupted":
|
|
122
|
+
yield self._build_interrupt_updates(result) + tuple(gr.update() for _ in output_components)
|
|
123
|
+
return
|
|
124
|
+
|
|
125
|
+
clear_interrupt = self._clear_interrupt_updates()
|
|
126
|
+
|
|
127
|
+
if result.get("status") == "failed":
|
|
128
|
+
raise gr.Error(str(result.get("error", "Workflow failed")))
|
|
129
|
+
|
|
130
|
+
# Completed — fetch output
|
|
131
|
+
output = await runner().get_task_output(task_id)
|
|
132
|
+
if workflow.output and output is not None:
|
|
133
|
+
output = await self._flatten_output_value(output, workflow.output)
|
|
134
|
+
result = output[0] if len(output) == 1 else output
|
|
135
|
+
else:
|
|
136
|
+
result = output
|
|
137
|
+
|
|
138
|
+
if result is None:
|
|
139
|
+
yield clear_interrupt + tuple(gr.update() for _ in output_components)
|
|
140
|
+
elif isinstance(result, (list, tuple)):
|
|
141
|
+
yield clear_interrupt + tuple(result)
|
|
142
|
+
else:
|
|
143
|
+
yield clear_interrupt + (result,)
|
|
73
144
|
|
|
74
145
|
run_button.click(
|
|
75
146
|
fn=_run_workflow,
|
|
76
147
|
inputs=input_components,
|
|
77
|
-
outputs=
|
|
148
|
+
outputs=interrupt_outputs + output_components
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
resume_button.click(
|
|
152
|
+
fn=_resume_workflow,
|
|
153
|
+
inputs=[interrupt_state, interrupt_answer],
|
|
154
|
+
outputs=interrupt_outputs + output_components
|
|
78
155
|
)
|
|
79
156
|
|
|
80
157
|
return section
|
|
@@ -148,6 +225,29 @@ class GradioWebUIBuilder:
|
|
|
148
225
|
|
|
149
226
|
return value if value != "" else None
|
|
150
227
|
|
|
228
|
+
def _build_interrupt_updates(self, result: dict) -> tuple:
|
|
229
|
+
interrupt = result.get("interrupt", {})
|
|
230
|
+
state = { "task_id": result["task_id"], "job_id": interrupt.get("job_id") }
|
|
231
|
+
message = interrupt.get("message") or "The workflow is waiting for your input."
|
|
232
|
+
metadata = interrupt.get("metadata")
|
|
233
|
+
|
|
234
|
+
return (
|
|
235
|
+
state,
|
|
236
|
+
gr.update(visible=True),
|
|
237
|
+
gr.update(value=message),
|
|
238
|
+
gr.update(value=metadata, visible=metadata is not None),
|
|
239
|
+
gr.update(value=""),
|
|
240
|
+
)
|
|
241
|
+
|
|
242
|
+
def _clear_interrupt_updates(self) -> tuple:
|
|
243
|
+
return (
|
|
244
|
+
None,
|
|
245
|
+
gr.update(visible=False),
|
|
246
|
+
gr.update(value=""),
|
|
247
|
+
gr.update(value=None, visible=False),
|
|
248
|
+
gr.update(value=""),
|
|
249
|
+
)
|
|
250
|
+
|
|
151
251
|
def _build_output_component(self, variable: Union[WorkflowVariableConfig, WorkflowVariableGroupConfig]) -> Union[gr.Component, List[ComponentGroup]]:
|
|
152
252
|
if isinstance(variable, WorkflowVariableGroupConfig):
|
|
153
253
|
groups: List[ComponentGroup] = []
|
|
@@ -196,7 +296,7 @@ class GradioWebUIBuilder:
|
|
|
196
296
|
else:
|
|
197
297
|
flattened.append(item)
|
|
198
298
|
return flattened
|
|
199
|
-
|
|
299
|
+
|
|
200
300
|
async def _flatten_output_value(self, output: Any, variables: List[Union[WorkflowVariableConfig, WorkflowVariableGroupConfig]]) -> Any:
|
|
201
301
|
flattened = []
|
|
202
302
|
for variable in variables:
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated
|
|
1
|
+
from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated
|
|
2
2
|
from mindor.dsl.schema.controller import ControllerConfig
|
|
3
3
|
from mindor.dsl.schema.controller.webui import ControllerWebUIConfig, ControllerWebUIDriver
|
|
4
4
|
from mindor.dsl.schema.component import ComponentConfig
|
|
@@ -38,14 +38,14 @@ class ControllerWebUI(AsyncService):
|
|
|
38
38
|
if self.config.driver == ControllerWebUIDriver.GRADIO:
|
|
39
39
|
blocks = GradioWebUIBuilder().build(
|
|
40
40
|
workflow_schemas=self.workflow_schemas,
|
|
41
|
-
|
|
41
|
+
runner=lambda: self.runner
|
|
42
42
|
)
|
|
43
43
|
self.app = mount_gradio_app(self.app, blocks, path="")
|
|
44
44
|
return
|
|
45
45
|
|
|
46
46
|
if self.config.driver == ControllerWebUIDriver.STATIC:
|
|
47
47
|
static_files = StaticFiles(
|
|
48
|
-
directory=Path(self.config.static_dir).resolve(),
|
|
48
|
+
directory=Path(self.config.static_dir).resolve(),
|
|
49
49
|
html=True
|
|
50
50
|
)
|
|
51
51
|
self.app.mount("/", static_files, name="static")
|
|
@@ -65,12 +65,7 @@ class ControllerWebUI(AsyncService):
|
|
|
65
65
|
await self.runner.close()
|
|
66
66
|
self.server = None
|
|
67
67
|
self.runner = None
|
|
68
|
-
|
|
68
|
+
|
|
69
69
|
async def _shutdown(self) -> None:
|
|
70
70
|
if self.server:
|
|
71
71
|
self.server.should_exit = True
|
|
72
|
-
|
|
73
|
-
async def _run_workflow(self, workflow_id: Optional[str], input: Any) -> Any:
|
|
74
|
-
if self.runner:
|
|
75
|
-
return await self.runner.run_workflow(workflow_id, input, self.workflow_schemas[workflow_id])
|
|
76
|
-
return None
|
|
@@ -28,7 +28,7 @@ class InterruptHandler:
|
|
|
28
28
|
|
|
29
29
|
return await point.future
|
|
30
30
|
|
|
31
|
-
def resolve(self, task_id: str, job_id: str,
|
|
31
|
+
def resolve(self, task_id: str, job_id: str, answer: Any) -> bool:
|
|
32
32
|
with self._lock:
|
|
33
33
|
point = self._pop_point(task_id, job_id)
|
|
34
34
|
|
|
@@ -36,7 +36,7 @@ class InterruptHandler:
|
|
|
36
36
|
return False
|
|
37
37
|
|
|
38
38
|
loop = point.future.get_loop()
|
|
39
|
-
loop.call_soon_threadsafe(point.future.set_result,
|
|
39
|
+
loop.call_soon_threadsafe(point.future.set_result, answer)
|
|
40
40
|
|
|
41
41
|
return True
|
|
42
42
|
|