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.
Files changed (394) hide show
  1. {model_compose-0.4.24 → model_compose-0.4.26}/PKG-INFO +1 -1
  2. {model_compose-0.4.24 → model_compose-0.4.26}/pyproject.toml +1 -1
  3. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/cli/interrupt.py +6 -6
  4. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/base.py +2 -2
  5. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/context.py +8 -1
  6. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/agent.py +8 -6
  7. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/workflow.py +2 -1
  8. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/compose/manager.py +2 -2
  9. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/controller/base.py +8 -12
  10. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/controller/runner/client.py +13 -1
  11. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/controller/runner/http_client.py +15 -0
  12. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/controller/runner/mcp_client.py +9 -0
  13. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/controller/runner/runner.py +9 -0
  14. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/controller/services/http_server.py +4 -6
  15. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/controller/services/mcp_server.py +5 -5
  16. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/controller/webui/gradio.py +116 -16
  17. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/controller/webui/webui.py +4 -9
  18. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/workflow/context.py +1 -2
  19. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/workflow/interrupt.py +2 -2
  20. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/workflow/job/impl/action.py +8 -8
  21. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/workflow/tool.py +4 -4
  22. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/workflow/workflow.py +0 -3
  23. {model_compose-0.4.24 → model_compose-0.4.26}/src/model_compose.egg-info/PKG-INFO +1 -1
  24. {model_compose-0.4.24 → model_compose-0.4.26}/LICENSE +0 -0
  25. {model_compose-0.4.24 → model_compose-0.4.26}/README.md +0 -0
  26. {model_compose-0.4.24 → model_compose-0.4.26}/setup.cfg +0 -0
  27. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/__init__.py +0 -0
  28. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/cli/__init__.py +0 -0
  29. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/cli/compose.py +0 -0
  30. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/__init__.py +0 -0
  31. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/__init__.py +0 -0
  32. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/component.py +0 -0
  33. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/runtime/__init__.py +0 -0
  34. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/runtime/process_manager.py +0 -0
  35. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/runtime/process_worker.py +0 -0
  36. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/__init__.py +0 -0
  37. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/datasets/__init__.py +0 -0
  38. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/datasets/datasets.py +0 -0
  39. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/datasets/providers/__init__.py +0 -0
  40. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/datasets/providers/common.py +0 -0
  41. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/datasets/providers/huggingface.py +0 -0
  42. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/datasets/providers/local.py +0 -0
  43. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/datasets/utils.py +0 -0
  44. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/http_client.py +0 -0
  45. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/http_server.py +0 -0
  46. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/image_processor.py +0 -0
  47. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/mcp_client.py +0 -0
  48. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/mcp_server.py +0 -0
  49. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/__init__.py +0 -0
  50. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/base/__init__.py +0 -0
  51. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/base/common.py +0 -0
  52. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/base/huggingface.py +0 -0
  53. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/base/huggingface_hub.py +0 -0
  54. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/base/unsloth.py +0 -0
  55. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/model.py +0 -0
  56. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/__init__.py +0 -0
  57. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/chat_completion/__init__.py +0 -0
  58. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/chat_completion/huggingface.py +0 -0
  59. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/face_embedding/__init__.py +0 -0
  60. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/face_embedding/common.py +0 -0
  61. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/face_embedding/custom.py +0 -0
  62. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/face_embedding/insightface.py +0 -0
  63. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/image_generation/__init__.py +0 -0
  64. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/image_generation/common.py +0 -0
  65. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/image_generation/custom.py +0 -0
  66. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/image_generation/flux.py +0 -0
  67. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/image_generation/hunyuan_image.py +0 -0
  68. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/image_generation/sdxl.py +0 -0
  69. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/image_to_text/__init__.py +0 -0
  70. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/image_to_text/huggingface.py +0 -0
  71. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/image_upscale/__init__.py +0 -0
  72. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/image_upscale/common.py +0 -0
  73. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/image_upscale/custom.py +0 -0
  74. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/image_upscale/esrgan.py +0 -0
  75. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/image_upscale/ldsr.py +0 -0
  76. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/image_upscale/real_esrgan.py +0 -0
  77. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/image_upscale/swinir.py +0 -0
  78. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/text_classification/__init__.py +0 -0
  79. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/text_classification/huggingface.py +0 -0
  80. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/text_embedding/__init__.py +0 -0
  81. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/text_embedding/huggingface.py +0 -0
  82. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/text_generation/__init__.py +0 -0
  83. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/text_generation/huggingface.py +0 -0
  84. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/text_to_speech/__init__.py +0 -0
  85. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/text_to_speech/common.py +0 -0
  86. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/text_to_speech/custom.py +0 -0
  87. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/model/tasks/text_to_speech/qwen.py +0 -0
  88. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/shell.py +0 -0
  89. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/text_splitter.py +0 -0
  90. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/vector_store/__init__.py +0 -0
  91. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/vector_store/base.py +0 -0
  92. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/vector_store/drivers/__init__.py +0 -0
  93. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/vector_store/drivers/chroma.py +0 -0
  94. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/vector_store/drivers/milvus.py +0 -0
  95. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/vector_store/vector_store.py +0 -0
  96. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/component/services/web_scraper.py +0 -0
  97. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/compose/__init__.py +0 -0
  98. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/compose/compose.py +0 -0
  99. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/compose/validator.py +0 -0
  100. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/controller/__init__.py +0 -0
  101. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/controller/controller.py +0 -0
  102. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/controller/runner/__init__.py +0 -0
  103. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/controller/runtime/__init__.py +0 -0
  104. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/controller/runtime/docker/__init__.py +0 -0
  105. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/controller/runtime/docker/context/Dockerfile +0 -0
  106. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/controller/runtime/docker/docker.py +0 -0
  107. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/controller/runtime/native/__init__.py +0 -0
  108. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/controller/runtime/native/native.py +0 -0
  109. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/controller/runtime/specs.py +0 -0
  110. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/controller/services/__init__.py +0 -0
  111. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/controller/webui/__init__.py +0 -0
  112. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/evaluator/__init__.py +0 -0
  113. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/evaluator/condition.py +0 -0
  114. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/foundation/__init__.py +0 -0
  115. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/foundation/async_service.py +0 -0
  116. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/foundation/ipc_messages.py +0 -0
  117. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/foundation/process_manager.py +0 -0
  118. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/foundation/process_worker.py +0 -0
  119. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/gateway/__init__.py +0 -0
  120. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/gateway/base.py +0 -0
  121. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/gateway/gateway.py +0 -0
  122. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/gateway/services/__init__.py +0 -0
  123. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/gateway/services/http_tunnel/__init__.py +0 -0
  124. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/gateway/services/http_tunnel/base.py +0 -0
  125. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/gateway/services/http_tunnel/drivers/__init__.py +0 -0
  126. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/gateway/services/http_tunnel/drivers/cloudflare.py +0 -0
  127. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/gateway/services/http_tunnel/drivers/ngrok.py +0 -0
  128. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/gateway/services/http_tunnel/http_tunnel.py +0 -0
  129. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/gateway/services/ssh_tunnel.py +0 -0
  130. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/listener/__init__.py +0 -0
  131. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/listener/base.py +0 -0
  132. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/listener/listener.py +0 -0
  133. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/listener/services/__init__.py +0 -0
  134. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/listener/services/http_callback.py +0 -0
  135. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/listener/services/http_trigger.py +0 -0
  136. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/logger/__init__.py +0 -0
  137. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/logger/base.py +0 -0
  138. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/logger/logger.py +0 -0
  139. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/logger/logging.py +0 -0
  140. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/logger/services/__init__.py +0 -0
  141. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/logger/services/console.py +0 -0
  142. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/logger/services/file.py +0 -0
  143. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/runtime/__init__.py +0 -0
  144. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/runtime/docker/__init__.py +0 -0
  145. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/runtime/docker/docker.py +0 -0
  146. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/runtime/env.py +0 -0
  147. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/utils/__init__.py +0 -0
  148. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/utils/caching.py +0 -0
  149. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/utils/http_client.py +0 -0
  150. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/utils/http_request.py +0 -0
  151. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/utils/http_response.py +0 -0
  152. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/utils/http_status.py +0 -0
  153. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/utils/image.py +0 -0
  154. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/utils/mcp_client.py +0 -0
  155. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/utils/package.py +0 -0
  156. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/utils/renderers.py +0 -0
  157. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/utils/resolvers.py +0 -0
  158. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/utils/shell.py +0 -0
  159. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/utils/ssh_client.py +0 -0
  160. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/utils/streamer.py +0 -0
  161. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/utils/streaming.py +0 -0
  162. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/utils/time.py +0 -0
  163. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/utils/url.py +0 -0
  164. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/utils/websocket_client.py +0 -0
  165. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/utils/work_queue.py +0 -0
  166. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/workflow/__init__.py +0 -0
  167. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/workflow/job/__init__.py +0 -0
  168. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/workflow/job/base.py +0 -0
  169. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/workflow/job/impl/__init__.py +0 -0
  170. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/workflow/job/impl/delay.py +0 -0
  171. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/workflow/job/impl/filter.py +0 -0
  172. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/workflow/job/impl/if_.py +0 -0
  173. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/workflow/job/impl/random_router.py +0 -0
  174. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/workflow/job/impl/switch.py +0 -0
  175. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/workflow/job/job.py +0 -0
  176. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/core/workflow/schema.py +0 -0
  177. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/__init__.py +0 -0
  178. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/loader.py +0 -0
  179. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/__init__.py +0 -0
  180. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/__init__.py +0 -0
  181. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/action.py +0 -0
  182. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/__init__.py +0 -0
  183. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/agent.py +0 -0
  184. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/common.py +0 -0
  185. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/datasets/__init__.py +0 -0
  186. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/datasets/common.py +0 -0
  187. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/datasets/datasets.py +0 -0
  188. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/datasets/providers/__init__.py +0 -0
  189. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/datasets/providers/common.py +0 -0
  190. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/datasets/providers/huggingface.py +0 -0
  191. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/datasets/providers/local.py +0 -0
  192. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/http_client.py +0 -0
  193. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/http_server.py +0 -0
  194. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/image_processor.py +0 -0
  195. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/mcp_client.py +0 -0
  196. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/mcp_server.py +0 -0
  197. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model/__init__.py +0 -0
  198. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model/impl/__init__.py +0 -0
  199. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model/impl/chat_completion.py +0 -0
  200. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model/impl/common.py +0 -0
  201. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model/impl/face_embedding/__init__.py +0 -0
  202. {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
  203. {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
  204. {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
  205. {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
  206. {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
  207. {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
  208. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model/impl/image_generation/__init__.py +0 -0
  209. {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
  210. {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
  211. {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
  212. {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
  213. {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
  214. {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
  215. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model/impl/image_to_text.py +0 -0
  216. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/__init__.py +0 -0
  217. {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
  218. {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
  219. {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
  220. {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
  221. {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
  222. {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
  223. {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
  224. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model/impl/text_classification.py +0 -0
  225. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model/impl/text_embedding.py +0 -0
  226. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model/impl/text_generation.py +0 -0
  227. {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
  228. {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
  229. {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
  230. {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
  231. {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
  232. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model/model.py +0 -0
  233. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model_trainer/__init__.py +0 -0
  234. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model_trainer/impl/__init__.py +0 -0
  235. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model_trainer/impl/classification.py +0 -0
  236. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model_trainer/impl/common.py +0 -0
  237. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model_trainer/impl/sft.py +0 -0
  238. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/model_trainer/model_trainer.py +0 -0
  239. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/shell.py +0 -0
  240. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/text_splitter.py +0 -0
  241. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/vector_store/__init__.py +0 -0
  242. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/vector_store/impl/__init__.py +0 -0
  243. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/vector_store/impl/chroma.py +0 -0
  244. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/vector_store/impl/common.py +0 -0
  245. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/vector_store/impl/faiss.py +0 -0
  246. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/vector_store/impl/milvus.py +0 -0
  247. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/vector_store/impl/qdrant.py +0 -0
  248. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/vector_store/vector_store.py +0 -0
  249. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/web_scraper.py +0 -0
  250. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/action/impl/workflow.py +0 -0
  251. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/__init__.py +0 -0
  252. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/component.py +0 -0
  253. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/__init__.py +0 -0
  254. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/agent.py +0 -0
  255. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/common.py +0 -0
  256. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/datasets/__init__.py +0 -0
  257. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/datasets/datasets.py +0 -0
  258. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/http_client.py +0 -0
  259. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/http_server.py +0 -0
  260. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/image_processor.py +0 -0
  261. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/mcp_client.py +0 -0
  262. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/mcp_server.py +0 -0
  263. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model/__init__.py +0 -0
  264. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model/impl/__init__.py +0 -0
  265. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model/impl/chat_completion.py +0 -0
  266. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model/impl/common.py +0 -0
  267. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model/impl/face_embedding/__init__.py +0 -0
  268. {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
  269. {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
  270. {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
  271. {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
  272. {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
  273. {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
  274. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model/impl/image_generation/__init__.py +0 -0
  275. {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
  276. {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
  277. {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
  278. {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
  279. {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
  280. {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
  281. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model/impl/image_to_text.py +0 -0
  282. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/__init__.py +0 -0
  283. {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
  284. {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
  285. {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
  286. {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
  287. {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
  288. {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
  289. {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
  290. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model/impl/text_classification.py +0 -0
  291. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model/impl/text_embedding.py +0 -0
  292. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model/impl/text_generation.py +0 -0
  293. {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
  294. {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
  295. {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
  296. {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
  297. {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
  298. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model/model.py +0 -0
  299. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model_trainer/__init__.py +0 -0
  300. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model_trainer/impl/__init__.py +0 -0
  301. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model_trainer/impl/classification.py +0 -0
  302. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model_trainer/impl/common.py +0 -0
  303. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model_trainer/impl/sft.py +0 -0
  304. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/model_trainer/model_trainer.py +0 -0
  305. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/shell.py +0 -0
  306. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/text_splitter.py +0 -0
  307. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/types.py +0 -0
  308. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/vector_store/__init__.py +0 -0
  309. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/vector_store/impl/__init__.py +0 -0
  310. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/vector_store/impl/chroma.py +0 -0
  311. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/vector_store/impl/common.py +0 -0
  312. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/vector_store/impl/faiss.py +0 -0
  313. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/vector_store/impl/milvus.py +0 -0
  314. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/vector_store/impl/qdrant.py +0 -0
  315. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/vector_store/vector_store.py +0 -0
  316. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/web_scraper.py +0 -0
  317. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/component/impl/workflow.py +0 -0
  318. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/compose.py +0 -0
  319. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/controller/__init__.py +0 -0
  320. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/controller/controller.py +0 -0
  321. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/controller/impl/__init__.py +0 -0
  322. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/controller/impl/common.py +0 -0
  323. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/controller/impl/http_server.py +0 -0
  324. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/controller/impl/mcp_server.py +0 -0
  325. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/controller/impl/types.py +0 -0
  326. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/controller/webui/__init__.py +0 -0
  327. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/controller/webui/impl/__init__.py +0 -0
  328. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/controller/webui/impl/common.py +0 -0
  329. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/controller/webui/impl/dynamic.py +0 -0
  330. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/controller/webui/impl/gradio.py +0 -0
  331. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/controller/webui/impl/static.py +0 -0
  332. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/controller/webui/webui.py +0 -0
  333. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/gateway/__init__.py +0 -0
  334. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/gateway/gateway.py +0 -0
  335. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/gateway/impl/__init__.py +0 -0
  336. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/gateway/impl/common.py +0 -0
  337. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/gateway/impl/http_tunnel/__init__.py +0 -0
  338. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/gateway/impl/http_tunnel/http_tunnel.py +0 -0
  339. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/__init__.py +0 -0
  340. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/cloudflare.py +0 -0
  341. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/common.py +0 -0
  342. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/ngrok.py +0 -0
  343. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/gateway/impl/ssh_tunnel.py +0 -0
  344. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/gateway/impl/types.py +0 -0
  345. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/job/__init__.py +0 -0
  346. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/job/impl/__init__.py +0 -0
  347. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/job/impl/action.py +0 -0
  348. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/job/impl/common.py +0 -0
  349. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/job/impl/delay.py +0 -0
  350. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/job/impl/filter.py +0 -0
  351. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/job/impl/if_.py +0 -0
  352. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/job/impl/random_router.py +0 -0
  353. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/job/impl/switch.py +0 -0
  354. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/job/impl/types.py +0 -0
  355. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/job/job.py +0 -0
  356. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/listener/__init__.py +0 -0
  357. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/listener/impl/__init__.py +0 -0
  358. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/listener/impl/common.py +0 -0
  359. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/listener/impl/http_callback.py +0 -0
  360. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/listener/impl/http_trigger.py +0 -0
  361. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/listener/impl/types.py +0 -0
  362. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/listener/listener.py +0 -0
  363. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/logger/__init__.py +0 -0
  364. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/logger/impl/__init__.py +0 -0
  365. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/logger/impl/common.py +0 -0
  366. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/logger/impl/console.py +0 -0
  367. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/logger/impl/file.py +0 -0
  368. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/logger/impl/types.py +0 -0
  369. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/logger/logger.py +0 -0
  370. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/operator/__init__.py +0 -0
  371. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/operator/condition.py +0 -0
  372. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/runtime/__init__.py +0 -0
  373. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/runtime/impl/__init__.py +0 -0
  374. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/runtime/impl/common.py +0 -0
  375. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/runtime/impl/docker.py +0 -0
  376. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/runtime/impl/embedded.py +0 -0
  377. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/runtime/impl/native.py +0 -0
  378. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/runtime/impl/process.py +0 -0
  379. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/runtime/impl/types.py +0 -0
  380. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/runtime/runtime.py +0 -0
  381. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/transport/__init__.py +0 -0
  382. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/transport/http.py +0 -0
  383. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/transport/ssh.py +0 -0
  384. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/schema/workflow.py +0 -0
  385. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/utils/__init__.py +0 -0
  386. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/utils/annotation.py +0 -0
  387. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/utils/enum.py +0 -0
  388. {model_compose-0.4.24 → model_compose-0.4.26}/src/mindor/dsl/utils/path.py +0 -0
  389. {model_compose-0.4.24 → model_compose-0.4.26}/src/model_compose.egg-info/SOURCES.txt +0 -0
  390. {model_compose-0.4.24 → model_compose-0.4.26}/src/model_compose.egg-info/dependency_links.txt +0 -0
  391. {model_compose-0.4.24 → model_compose-0.4.26}/src/model_compose.egg-info/entry_points.txt +0 -0
  392. {model_compose-0.4.24 → model_compose-0.4.26}/src/model_compose.egg-info/requires.txt +0 -0
  393. {model_compose-0.4.24 → model_compose-0.4.26}/src/model_compose.egg-info/top_level.txt +0 -0
  394. {model_compose-0.4.24 → model_compose-0.4.26}/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.24
3
+ Version: 0.4.26
4
4
  Summary: model-compose: Declarative AI Workflow Orchestrator
5
5
  Author-email: Hanyeol Cho <hanyeol.cho@gmail.com>
6
6
  License-Expression: MIT
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "model-compose"
3
- version = "0.4.24"
3
+ version = "0.4.26"
4
4
  description = "model-compose: Declarative AI Workflow Orchestrator"
5
5
  authors = [
6
6
  { name = "Hanyeol Cho", email = "hanyeol.cho@gmail.com" }
@@ -1,5 +1,7 @@
1
1
  from __future__ import annotations
2
- from typing import TYPE_CHECKING, Any
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(f"\n{interrupt.message}", err=True)
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
- raw = click.prompt("Enter response (JSON or text, empty to continue)", default="", show_default=False)
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
- return await workflow.run(ulid.ulid(), input)
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)
@@ -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
- output = await workflow.run(context.run_id, input)
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, data: Any = None) -> TaskState:
43
- await self.controller.resume_workflow(task_id, job_id, data)
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, data: Any = None) -> TaskState:
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, data)
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, workflow)
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, workflow: Workflow) -> Optional[InterruptHandler]:
401
- if workflow.uses_interrupts():
402
- handler = self._create_interrupt_handler(task_id, workflow_id)
403
- self.interrupt_handlers[task_id] = handler
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
- if task_id in self.interrupt_handlers:
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
@@ -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
 
@@ -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()
@@ -29,7 +29,7 @@ class WorkflowRunRequestBody(BaseModel):
29
29
 
30
30
  class WorkflowResumeRequestBody(BaseModel):
31
31
  job_id: str
32
- data: Optional[Any] = None
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.data)
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
- raise HTTPException(status_code=202, detail="Task is still in progress.")
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))
@@ -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, data: str = "") -> List[ContentBlock]:
54
- parsed_data = json.loads(data) if data else None
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, parsed_data)
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 data (str): Optional JSON string with modified data to resume with",
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 typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Callable, Awaitable, Any
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], workflow_runner: Callable[[Optional[str], Any], Awaitable[Any]]) -> gr.Blocks:
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, _run_workflow)
37
+ self._build_workflow_section(workflow_id, workflow, runner)
34
38
  else:
35
- self._build_workflow_section(workflow, _run_workflow)
39
+ self._build_workflow_section(workflow_id, workflow, runner)
36
40
 
37
41
  return blocks
38
42
 
39
- def _build_workflow_section(self, workflow: WorkflowSchema, runner: Callable[[Any], Awaitable[Any]]) -> gr.Column:
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("#### 📥 Input Parameters")
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
- gr.Markdown("#### 📤 Output Values")
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 = await self._build_input_value(args, workflow.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
- yield output[0] if len(output) == 1 else output
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=self._flatten_output_components(output_components)
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, Any
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
- workflow_runner=self._run_workflow
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, data: Any) -> bool:
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, data)
39
+ loop.call_soon_threadsafe(point.future.set_result, answer)
40
40
 
41
41
  return True
42
42