model-compose 0.4.24__tar.gz → 0.4.26__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.24 → model_compose-0.4.26}/PKG-INFO +1 -1
- {model_compose-0.4.24 → model_compose-0.4.26}/pyproject.toml +1 -1
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/cli/interrupt.py +6 -6
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/base.py +2 -2
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/context.py +8 -1
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/agent.py +8 -6
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/workflow.py +2 -1
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/compose/manager.py +2 -2
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/controller/base.py +8 -12
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/controller/runner/client.py +13 -1
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/controller/runner/http_client.py +15 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/controller/runner/mcp_client.py +9 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/controller/runner/runner.py +9 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/controller/services/http_server.py +4 -6
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/controller/services/mcp_server.py +5 -5
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/controller/webui/gradio.py +116 -16
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/controller/webui/webui.py +4 -9
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/workflow/context.py +1 -2
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/workflow/interrupt.py +2 -2
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/workflow/job/impl/action.py +8 -8
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/workflow/tool.py +4 -4
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/workflow/workflow.py +0 -3
- {model_compose-0.4.24 → model_compose-0.4.26}/src/model_compose.egg-info/PKG-INFO +1 -1
- {model_compose-0.4.24 → model_compose-0.4.26}/LICENSE +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/README.md +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/setup.cfg +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/cli/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/cli/compose.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/component.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/runtime/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/runtime/process_manager.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/runtime/process_worker.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/datasets/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/datasets/datasets.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/datasets/providers/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/datasets/providers/common.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/datasets/providers/huggingface.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/datasets/providers/local.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/datasets/utils.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/http_client.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/http_server.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/image_processor.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/mcp_client.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/mcp_server.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/base/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/base/common.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/base/huggingface.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/base/huggingface_hub.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/base/unsloth.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/model.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/chat_completion/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/chat_completion/huggingface.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/face_embedding/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/face_embedding/common.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/face_embedding/custom.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/face_embedding/insightface.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/image_generation/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/image_generation/common.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/image_generation/custom.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/image_generation/flux.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/image_generation/hunyuan_image.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/image_generation/sdxl.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/image_to_text/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/image_to_text/huggingface.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/image_upscale/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/image_upscale/common.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/image_upscale/custom.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/image_upscale/esrgan.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/image_upscale/ldsr.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/image_upscale/real_esrgan.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/image_upscale/swinir.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/text_classification/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/text_classification/huggingface.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/text_embedding/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/text_embedding/huggingface.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/text_generation/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/text_generation/huggingface.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/text_to_speech/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/text_to_speech/common.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/text_to_speech/custom.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/text_to_speech/qwen.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/shell.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/text_splitter.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/vector_store/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/vector_store/base.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/vector_store/drivers/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/vector_store/drivers/chroma.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/vector_store/drivers/milvus.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/vector_store/vector_store.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/web_scraper.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/compose/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/compose/compose.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/compose/validator.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/controller/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/controller/controller.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/controller/runner/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/controller/runtime/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/controller/runtime/docker/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/controller/runtime/docker/context/Dockerfile +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/controller/runtime/docker/docker.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/controller/runtime/native/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/controller/runtime/native/native.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/controller/runtime/specs.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/controller/services/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/controller/webui/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/evaluator/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/evaluator/condition.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/foundation/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/foundation/async_service.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/foundation/ipc_messages.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/foundation/process_manager.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/foundation/process_worker.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/gateway/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/gateway/base.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/gateway/gateway.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/gateway/services/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/gateway/services/http_tunnel/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/gateway/services/http_tunnel/base.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/gateway/services/http_tunnel/drivers/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/gateway/services/http_tunnel/drivers/cloudflare.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/gateway/services/http_tunnel/drivers/ngrok.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/gateway/services/http_tunnel/http_tunnel.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/gateway/services/ssh_tunnel.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/listener/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/listener/base.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/listener/listener.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/listener/services/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/listener/services/http_callback.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/listener/services/http_trigger.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/logger/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/logger/base.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/logger/logger.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/logger/logging.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/logger/services/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/logger/services/console.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/logger/services/file.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/runtime/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/runtime/docker/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/runtime/docker/docker.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/runtime/env.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/utils/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/utils/caching.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/utils/http_client.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/utils/http_request.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/utils/http_response.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/utils/http_status.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/utils/image.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/utils/mcp_client.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/utils/package.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/utils/renderers.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/utils/resolvers.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/utils/shell.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/utils/ssh_client.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/utils/streamer.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/utils/streaming.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/utils/time.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/utils/url.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/utils/websocket_client.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/utils/work_queue.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/workflow/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/workflow/job/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/workflow/job/base.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/workflow/job/impl/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/workflow/job/impl/delay.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/workflow/job/impl/filter.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/workflow/job/impl/if_.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/workflow/job/impl/random_router.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/workflow/job/impl/switch.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/workflow/job/job.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/workflow/schema.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/loader.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/action.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/agent.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/common.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/datasets/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/datasets/common.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/datasets/datasets.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/datasets/providers/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/datasets/providers/common.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/datasets/providers/huggingface.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/datasets/providers/local.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/http_client.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/http_server.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/image_processor.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/mcp_client.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/mcp_server.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model/impl/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model/impl/chat_completion.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model/impl/common.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model/impl/face_embedding/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model/impl/face_embedding/face_embedding.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model/impl/face_embedding/impl/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model/impl/face_embedding/impl/common.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model/impl/face_embedding/impl/dlib.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model/impl/face_embedding/impl/facenet.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model/impl/face_embedding/impl/insightface.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model/impl/image_generation/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model/impl/image_generation/image_generation.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model/impl/image_generation/impl/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model/impl/image_generation/impl/common.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model/impl/image_generation/impl/flux.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model/impl/image_generation/impl/hunyuan_image.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model/impl/image_generation/impl/sdxl.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model/impl/image_to_text.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/image_upscale.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/impl/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/impl/common.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/impl/esrgan.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/impl/ldsr.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/impl/real_esrgan.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/impl/swinir.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model/impl/text_classification.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model/impl/text_embedding.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model/impl/text_generation.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model/impl/text_to_speech/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model/impl/text_to_speech/impl/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model/impl/text_to_speech/impl/common.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model/impl/text_to_speech/impl/qwen.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model/impl/text_to_speech/text_to_speech.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model/model.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model_trainer/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model_trainer/impl/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model_trainer/impl/classification.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model_trainer/impl/common.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model_trainer/impl/sft.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model_trainer/model_trainer.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/shell.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/text_splitter.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/vector_store/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/vector_store/impl/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/vector_store/impl/chroma.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/vector_store/impl/common.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/vector_store/impl/faiss.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/vector_store/impl/milvus.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/vector_store/impl/qdrant.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/vector_store/vector_store.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/web_scraper.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/workflow.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/component.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/agent.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/common.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/datasets/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/datasets/datasets.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/http_client.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/http_server.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/image_processor.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/mcp_client.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/mcp_server.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model/impl/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model/impl/chat_completion.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model/impl/common.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model/impl/face_embedding/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model/impl/face_embedding/face_embedding.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model/impl/face_embedding/impl/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model/impl/face_embedding/impl/common.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model/impl/face_embedding/impl/dlib.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model/impl/face_embedding/impl/facenet.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model/impl/face_embedding/impl/insightface.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model/impl/image_generation/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model/impl/image_generation/image_generation.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model/impl/image_generation/impl/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model/impl/image_generation/impl/common.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model/impl/image_generation/impl/flux.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model/impl/image_generation/impl/hunyuan_image.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model/impl/image_generation/impl/sdxl.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model/impl/image_to_text.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/image_upscale.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/impl/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/impl/common.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/impl/esrgan.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/impl/ldsr.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/impl/real_esrgan.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/impl/swinir.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model/impl/text_classification.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model/impl/text_embedding.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model/impl/text_generation.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model/impl/text_to_speech/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model/impl/text_to_speech/impl/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model/impl/text_to_speech/impl/common.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model/impl/text_to_speech/impl/qwen.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model/impl/text_to_speech/text_to_speech.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model/model.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model_trainer/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model_trainer/impl/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model_trainer/impl/classification.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model_trainer/impl/common.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model_trainer/impl/sft.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model_trainer/model_trainer.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/shell.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/text_splitter.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/types.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/vector_store/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/vector_store/impl/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/vector_store/impl/chroma.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/vector_store/impl/common.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/vector_store/impl/faiss.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/vector_store/impl/milvus.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/vector_store/impl/qdrant.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/vector_store/vector_store.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/web_scraper.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/workflow.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/compose.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/controller/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/controller/controller.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/controller/impl/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/controller/impl/common.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/controller/impl/http_server.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/controller/impl/mcp_server.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/controller/impl/types.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/controller/webui/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/controller/webui/impl/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/controller/webui/impl/common.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/controller/webui/impl/dynamic.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/controller/webui/impl/gradio.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/controller/webui/impl/static.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/controller/webui/webui.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/gateway/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/gateway/gateway.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/gateway/impl/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/gateway/impl/common.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/gateway/impl/http_tunnel/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/gateway/impl/http_tunnel/http_tunnel.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/cloudflare.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/common.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/ngrok.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/gateway/impl/ssh_tunnel.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/gateway/impl/types.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/job/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/job/impl/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/job/impl/action.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/job/impl/common.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/job/impl/delay.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/job/impl/filter.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/job/impl/if_.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/job/impl/random_router.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/job/impl/switch.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/job/impl/types.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/job/job.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/listener/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/listener/impl/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/listener/impl/common.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/listener/impl/http_callback.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/listener/impl/http_trigger.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/listener/impl/types.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/listener/listener.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/logger/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/logger/impl/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/logger/impl/common.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/logger/impl/console.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/logger/impl/file.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/logger/impl/types.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/logger/logger.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/operator/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/operator/condition.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/runtime/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/runtime/impl/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/runtime/impl/common.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/runtime/impl/docker.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/runtime/impl/embedded.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/runtime/impl/native.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/runtime/impl/process.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/runtime/impl/types.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/runtime/runtime.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/transport/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/transport/http.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/transport/ssh.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/workflow.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/utils/__init__.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/utils/annotation.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/utils/enum.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/utils/path.py +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/model_compose.egg-info/SOURCES.txt +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/model_compose.egg-info/dependency_links.txt +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/model_compose.egg-info/entry_points.txt +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/model_compose.egg-info/requires.txt +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/src/model_compose.egg-info/top_level.txt +0 -0
- {model_compose-0.4.24 → model_compose-0.4.26}/tests/test_cli.py +0 -0
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
|
-
from typing import TYPE_CHECKING
|
|
2
|
+
from typing import TYPE_CHECKING
|
|
3
|
+
|
|
4
|
+
from typing import Any
|
|
3
5
|
import click
|
|
4
6
|
import json
|
|
5
7
|
|
|
@@ -9,17 +11,15 @@ if TYPE_CHECKING:
|
|
|
9
11
|
def prompt_for_interrupt(state: TaskState) -> Any:
|
|
10
12
|
interrupt = state.interrupt
|
|
11
13
|
|
|
12
|
-
click.echo("", err=True)
|
|
13
|
-
click.echo(f"--- Interrupted (job: {interrupt.job_id}, phase: {interrupt.phase}) ---", err=True)
|
|
14
|
-
|
|
15
14
|
if interrupt.message:
|
|
16
|
-
click.echo(
|
|
15
|
+
click.echo(interrupt.message, err=True)
|
|
17
16
|
|
|
18
17
|
if interrupt.metadata:
|
|
19
18
|
click.echo(json.dumps(interrupt.metadata, indent=2, ensure_ascii=False), err=True)
|
|
20
19
|
|
|
21
20
|
click.echo("", err=True)
|
|
22
|
-
|
|
21
|
+
click.echo("✋ Action required — press Enter to continue, or type an answer (JSON or text):", err=True)
|
|
22
|
+
raw = input()
|
|
23
23
|
|
|
24
24
|
if not raw:
|
|
25
25
|
return None
|
|
@@ -72,12 +72,12 @@ class ComponentService(AsyncService):
|
|
|
72
72
|
await super().start(background)
|
|
73
73
|
await self.wait_until_ready()
|
|
74
74
|
|
|
75
|
-
async def run(self, action_id: str, run_id: str, input: Dict[str, Any]) -> Dict[str, Any]:
|
|
75
|
+
async def run(self, action_id: str, run_id: str, input: Dict[str, Any], workflow=None) -> Dict[str, Any]:
|
|
76
76
|
if self._process_manager:
|
|
77
77
|
return await self._process_manager.run(action_id, run_id, input)
|
|
78
78
|
|
|
79
79
|
_, action = ActionResolver(self.config.actions).resolve(action_id)
|
|
80
|
-
context = ComponentActionContext(run_id, input)
|
|
80
|
+
context = ComponentActionContext(run_id, input, workflow=workflow)
|
|
81
81
|
|
|
82
82
|
if self.work_queue:
|
|
83
83
|
return await (await self.work_queue.schedule(action, context))
|
|
@@ -1,12 +1,19 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
from typing import TYPE_CHECKING
|
|
3
|
+
|
|
1
4
|
from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Any
|
|
2
5
|
from mindor.core.utils.renderers import VariableRenderer, ImageValueRenderer, FileValueRenderer
|
|
3
6
|
from mindor.core.gateway import find_gateway_by_port
|
|
4
7
|
from PIL import Image as PILImage
|
|
5
8
|
|
|
9
|
+
if TYPE_CHECKING:
|
|
10
|
+
from mindor.core.workflow.context import WorkflowContext
|
|
11
|
+
|
|
6
12
|
class ComponentActionContext:
|
|
7
|
-
def __init__(self, run_id: str, input: Dict[str, Any]):
|
|
13
|
+
def __init__(self, run_id: str, input: Dict[str, Any], workflow: Optional[WorkflowContext] = None):
|
|
8
14
|
self.run_id: str = run_id
|
|
9
15
|
self.input: Dict[str, Any] = input
|
|
16
|
+
self.workflow: Optional[WorkflowContext] = workflow
|
|
10
17
|
self.context: Dict[str, Any] = { "run_id": run_id }
|
|
11
18
|
self.sources: Dict[str, Any] = {}
|
|
12
19
|
self.renderer: VariableRenderer = VariableRenderer(self._resolve_source)
|
|
@@ -48,7 +48,7 @@ class AgentAction:
|
|
|
48
48
|
if not tool_calls:
|
|
49
49
|
break
|
|
50
50
|
|
|
51
|
-
tool_messages = await asyncio.gather(*[self._execute_tool_call(tc) for tc in tool_calls])
|
|
51
|
+
tool_messages = await asyncio.gather(*[self._execute_tool_call(tc, context) for tc in tool_calls])
|
|
52
52
|
for tool_message in tool_messages:
|
|
53
53
|
messages.append(tool_message)
|
|
54
54
|
yield tool_message
|
|
@@ -66,20 +66,20 @@ class AgentAction:
|
|
|
66
66
|
if not tool_calls:
|
|
67
67
|
break
|
|
68
68
|
|
|
69
|
-
tool_messages = await asyncio.gather(*[self._execute_tool_call(tc) for tc in tool_calls])
|
|
69
|
+
tool_messages = await asyncio.gather(*[self._execute_tool_call(tc, context) for tc in tool_calls])
|
|
70
70
|
for tool_message in tool_messages:
|
|
71
71
|
messages.append(tool_message)
|
|
72
72
|
|
|
73
73
|
return messages
|
|
74
74
|
|
|
75
|
-
async def _execute_tool_call(self, tool_call: Dict[str, Any]) -> Dict[str, Any]:
|
|
75
|
+
async def _execute_tool_call(self, tool_call: Dict[str, Any], context: ComponentActionContext) -> Dict[str, Any]:
|
|
76
76
|
tool_name = tool_call["function"]["name"]
|
|
77
77
|
tool_arguments = tool_call["function"].get("arguments", {})
|
|
78
78
|
if isinstance(tool_arguments, str):
|
|
79
79
|
tool_arguments = json.loads(tool_arguments)
|
|
80
80
|
|
|
81
81
|
if tool_name in self.tools:
|
|
82
|
-
result = await self.tools[tool_name].fn(**tool_arguments)
|
|
82
|
+
result = await self.tools[tool_name].fn(**tool_arguments, context=context.workflow)
|
|
83
83
|
content = json.dumps(result) if isinstance(result, (dict, list)) else str(result)
|
|
84
84
|
else:
|
|
85
85
|
content = f"Error: Unknown tool '{tool_name}'"
|
|
@@ -189,6 +189,8 @@ class AgentComponent(ComponentService):
|
|
|
189
189
|
|
|
190
190
|
return tools
|
|
191
191
|
|
|
192
|
-
async def _run_workflow(self, workflow_id: str, input: Any) -> Any:
|
|
192
|
+
async def _run_workflow(self, workflow_id: str, input: Any, context=None) -> Any:
|
|
193
193
|
workflow = create_workflow(*WorkflowResolver(self.global_configs.workflows).resolve(workflow_id), self.global_configs)
|
|
194
|
-
|
|
194
|
+
task_id = context.task_id if context else ulid.ulid()
|
|
195
|
+
interrupt_handler = context.interrupt_handler if context else None
|
|
196
|
+
return await workflow.run(task_id, input, interrupt_handler)
|
{model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/workflow.py
RENAMED
|
@@ -15,7 +15,8 @@ class WorkflowAction:
|
|
|
15
15
|
workflow = self._create_workflow(self.config.workflow)
|
|
16
16
|
input = await context.render_variable(self.config.input)
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
interrupt_handler = context.workflow.interrupt_handler if context.workflow else None
|
|
19
|
+
output = await workflow.run(context.run_id, input, interrupt_handler)
|
|
19
20
|
context.register_source("output", output)
|
|
20
21
|
|
|
21
22
|
return (await context.render_variable(self.config.output, ignore_files=True)) if self.config.output else output
|
|
@@ -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:
|
|
@@ -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
|
|
|
@@ -363,7 +363,7 @@ class ControllerService(AsyncService):
|
|
|
363
363
|
|
|
364
364
|
try:
|
|
365
365
|
workflow = self._create_workflow(workflow_id)
|
|
366
|
-
interrupt_handler = self._attach_interrupt_handler(task_id, workflow_id
|
|
366
|
+
interrupt_handler = self._attach_interrupt_handler(task_id, workflow_id)
|
|
367
367
|
|
|
368
368
|
output = await workflow.run(task_id, input, interrupt_handler)
|
|
369
369
|
state = TaskState(task_id=task_id, status=TaskStatus.COMPLETED, workflow_id=workflow_id, output=output)
|
|
@@ -397,17 +397,13 @@ class ControllerService(AsyncService):
|
|
|
397
397
|
return state
|
|
398
398
|
await event.wait()
|
|
399
399
|
|
|
400
|
-
def _attach_interrupt_handler(self, task_id: str, workflow_id: str
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
return handler
|
|
405
|
-
|
|
406
|
-
return None
|
|
400
|
+
def _attach_interrupt_handler(self, task_id: str, workflow_id: str) -> InterruptHandler:
|
|
401
|
+
handler = self._create_interrupt_handler(task_id, workflow_id)
|
|
402
|
+
self.interrupt_handlers[task_id] = handler
|
|
403
|
+
return handler
|
|
407
404
|
|
|
408
405
|
def _detach_interrupt_handler(self, task_id: str) -> None:
|
|
409
|
-
|
|
410
|
-
del self.interrupt_handlers[task_id]
|
|
406
|
+
del self.interrupt_handlers[task_id]
|
|
411
407
|
|
|
412
408
|
def _create_interrupt_handler(self, task_id: str, workflow_id: str) -> InterruptHandler:
|
|
413
409
|
async def on_interrupt(point: InterruptPoint):
|
|
@@ -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.24 → model_compose-0.4.26}/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.24 → model_compose-0.4.26}/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.24 → model_compose-0.4.26}/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.24 → model_compose-0.4.26}/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
|
|
@@ -3,8 +3,7 @@ from mindor.core.utils.renderers import VariableRenderer, ImageValueRenderer
|
|
|
3
3
|
from mindor.core.workflow.interrupt import InterruptHandler
|
|
4
4
|
|
|
5
5
|
class WorkflowContext:
|
|
6
|
-
def __init__(self, task_id: str, input: Dict[str, Any],
|
|
7
|
-
interrupt_handler: Optional[InterruptHandler] = None):
|
|
6
|
+
def __init__(self, task_id: str, input: Dict[str, Any], interrupt_handler: Optional[InterruptHandler] = None):
|
|
8
7
|
self.task_id: str = task_id
|
|
9
8
|
self.input: Dict[str, Any] = input
|
|
10
9
|
self.context: Dict[str, Any] = { "task_id": task_id }
|
|
@@ -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
|
|