model-compose 0.4.25__tar.gz → 0.4.27__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (394) hide show
  1. {model_compose-0.4.25/src/model_compose.egg-info → model_compose-0.4.27}/PKG-INFO +14 -8
  2. {model_compose-0.4.25 → model_compose-0.4.27}/README.md +13 -7
  3. {model_compose-0.4.25 → model_compose-0.4.27}/pyproject.toml +1 -1
  4. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/cli/interrupt.py +3 -2
  5. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/web_scraper.py +7 -3
  6. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/compose/manager.py +2 -2
  7. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/compose/validator.py +3 -3
  8. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/controller/base.py +2 -2
  9. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/controller/runner/client.py +13 -1
  10. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/controller/runner/http_client.py +15 -0
  11. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/controller/runner/mcp_client.py +9 -0
  12. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/controller/runner/runner.py +9 -0
  13. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/controller/services/http_server.py +4 -6
  14. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/controller/services/mcp_server.py +5 -5
  15. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/controller/webui/gradio.py +116 -16
  16. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/controller/webui/webui.py +4 -9
  17. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/workflow/interrupt.py +2 -2
  18. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/workflow/job/impl/__init__.py +1 -1
  19. model_compose-0.4.25/src/mindor/core/workflow/job/impl/action.py → model_compose-0.4.27/src/mindor/core/workflow/job/impl/component.py +8 -8
  20. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/workflow/schema.py +4 -4
  21. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/workflow/workflow.py +0 -3
  22. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/job/impl/__init__.py +1 -1
  23. model_compose-0.4.25/src/mindor/dsl/schema/job/impl/action.py → model_compose-0.4.27/src/mindor/dsl/schema/job/impl/component.py +10 -10
  24. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/job/impl/types.py +1 -1
  25. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/job/job.py +1 -1
  26. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/workflow.py +4 -5
  27. {model_compose-0.4.25 → model_compose-0.4.27/src/model_compose.egg-info}/PKG-INFO +14 -8
  28. {model_compose-0.4.25 → model_compose-0.4.27}/src/model_compose.egg-info/SOURCES.txt +2 -3
  29. model_compose-0.4.25/src/mindor/dsl/utils/annotation.py +0 -19
  30. {model_compose-0.4.25 → model_compose-0.4.27}/LICENSE +0 -0
  31. {model_compose-0.4.25 → model_compose-0.4.27}/setup.cfg +0 -0
  32. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/__init__.py +0 -0
  33. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/cli/__init__.py +0 -0
  34. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/cli/compose.py +0 -0
  35. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/__init__.py +0 -0
  36. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/__init__.py +0 -0
  37. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/base.py +0 -0
  38. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/component.py +0 -0
  39. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/context.py +0 -0
  40. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/runtime/__init__.py +0 -0
  41. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/runtime/process_manager.py +0 -0
  42. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/runtime/process_worker.py +0 -0
  43. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/__init__.py +0 -0
  44. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/agent.py +0 -0
  45. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/datasets/__init__.py +0 -0
  46. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/datasets/datasets.py +0 -0
  47. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/datasets/providers/__init__.py +0 -0
  48. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/datasets/providers/common.py +0 -0
  49. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/datasets/providers/huggingface.py +0 -0
  50. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/datasets/providers/local.py +0 -0
  51. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/datasets/utils.py +0 -0
  52. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/http_client.py +0 -0
  53. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/http_server.py +0 -0
  54. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/image_processor.py +0 -0
  55. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/mcp_client.py +0 -0
  56. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/mcp_server.py +0 -0
  57. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/__init__.py +0 -0
  58. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/base/__init__.py +0 -0
  59. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/base/common.py +0 -0
  60. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/base/huggingface.py +0 -0
  61. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/base/huggingface_hub.py +0 -0
  62. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/base/unsloth.py +0 -0
  63. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/model.py +0 -0
  64. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/__init__.py +0 -0
  65. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/chat_completion/__init__.py +0 -0
  66. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/chat_completion/huggingface.py +0 -0
  67. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/face_embedding/__init__.py +0 -0
  68. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/face_embedding/common.py +0 -0
  69. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/face_embedding/custom.py +0 -0
  70. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/face_embedding/insightface.py +0 -0
  71. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/image_generation/__init__.py +0 -0
  72. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/image_generation/common.py +0 -0
  73. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/image_generation/custom.py +0 -0
  74. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/image_generation/flux.py +0 -0
  75. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/image_generation/hunyuan_image.py +0 -0
  76. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/image_generation/sdxl.py +0 -0
  77. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/image_to_text/__init__.py +0 -0
  78. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/image_to_text/huggingface.py +0 -0
  79. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/image_upscale/__init__.py +0 -0
  80. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/image_upscale/common.py +0 -0
  81. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/image_upscale/custom.py +0 -0
  82. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/image_upscale/esrgan.py +0 -0
  83. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/image_upscale/ldsr.py +0 -0
  84. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/image_upscale/real_esrgan.py +0 -0
  85. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/image_upscale/swinir.py +0 -0
  86. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/text_classification/__init__.py +0 -0
  87. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/text_classification/huggingface.py +0 -0
  88. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/text_embedding/__init__.py +0 -0
  89. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/text_embedding/huggingface.py +0 -0
  90. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/text_generation/__init__.py +0 -0
  91. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/text_generation/huggingface.py +0 -0
  92. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/text_to_speech/__init__.py +0 -0
  93. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/text_to_speech/common.py +0 -0
  94. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/text_to_speech/custom.py +0 -0
  95. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/model/tasks/text_to_speech/qwen.py +0 -0
  96. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/shell.py +0 -0
  97. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/text_splitter.py +0 -0
  98. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/vector_store/__init__.py +0 -0
  99. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/vector_store/base.py +0 -0
  100. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/vector_store/drivers/__init__.py +0 -0
  101. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/vector_store/drivers/chroma.py +0 -0
  102. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/vector_store/drivers/milvus.py +0 -0
  103. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/vector_store/vector_store.py +0 -0
  104. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/component/services/workflow.py +0 -0
  105. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/compose/__init__.py +0 -0
  106. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/compose/compose.py +0 -0
  107. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/controller/__init__.py +0 -0
  108. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/controller/controller.py +0 -0
  109. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/controller/runner/__init__.py +0 -0
  110. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/controller/runtime/__init__.py +0 -0
  111. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/controller/runtime/docker/__init__.py +0 -0
  112. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/controller/runtime/docker/context/Dockerfile +0 -0
  113. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/controller/runtime/docker/docker.py +0 -0
  114. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/controller/runtime/native/__init__.py +0 -0
  115. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/controller/runtime/native/native.py +0 -0
  116. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/controller/runtime/specs.py +0 -0
  117. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/controller/services/__init__.py +0 -0
  118. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/controller/webui/__init__.py +0 -0
  119. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/evaluator/__init__.py +0 -0
  120. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/evaluator/condition.py +0 -0
  121. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/foundation/__init__.py +0 -0
  122. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/foundation/async_service.py +0 -0
  123. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/foundation/ipc_messages.py +0 -0
  124. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/foundation/process_manager.py +0 -0
  125. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/foundation/process_worker.py +0 -0
  126. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/gateway/__init__.py +0 -0
  127. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/gateway/base.py +0 -0
  128. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/gateway/gateway.py +0 -0
  129. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/gateway/services/__init__.py +0 -0
  130. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/gateway/services/http_tunnel/__init__.py +0 -0
  131. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/gateway/services/http_tunnel/base.py +0 -0
  132. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/gateway/services/http_tunnel/drivers/__init__.py +0 -0
  133. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/gateway/services/http_tunnel/drivers/cloudflare.py +0 -0
  134. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/gateway/services/http_tunnel/drivers/ngrok.py +0 -0
  135. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/gateway/services/http_tunnel/http_tunnel.py +0 -0
  136. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/gateway/services/ssh_tunnel.py +0 -0
  137. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/listener/__init__.py +0 -0
  138. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/listener/base.py +0 -0
  139. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/listener/listener.py +0 -0
  140. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/listener/services/__init__.py +0 -0
  141. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/listener/services/http_callback.py +0 -0
  142. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/listener/services/http_trigger.py +0 -0
  143. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/logger/__init__.py +0 -0
  144. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/logger/base.py +0 -0
  145. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/logger/logger.py +0 -0
  146. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/logger/logging.py +0 -0
  147. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/logger/services/__init__.py +0 -0
  148. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/logger/services/console.py +0 -0
  149. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/logger/services/file.py +0 -0
  150. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/runtime/__init__.py +0 -0
  151. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/runtime/docker/__init__.py +0 -0
  152. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/runtime/docker/docker.py +0 -0
  153. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/runtime/env.py +0 -0
  154. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/utils/__init__.py +0 -0
  155. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/utils/caching.py +0 -0
  156. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/utils/http_client.py +0 -0
  157. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/utils/http_request.py +0 -0
  158. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/utils/http_response.py +0 -0
  159. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/utils/http_status.py +0 -0
  160. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/utils/image.py +0 -0
  161. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/utils/mcp_client.py +0 -0
  162. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/utils/package.py +0 -0
  163. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/utils/renderers.py +0 -0
  164. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/utils/resolvers.py +0 -0
  165. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/utils/shell.py +0 -0
  166. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/utils/ssh_client.py +0 -0
  167. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/utils/streamer.py +0 -0
  168. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/utils/streaming.py +0 -0
  169. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/utils/time.py +0 -0
  170. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/utils/url.py +0 -0
  171. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/utils/websocket_client.py +0 -0
  172. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/utils/work_queue.py +0 -0
  173. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/workflow/__init__.py +0 -0
  174. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/workflow/context.py +0 -0
  175. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/workflow/job/__init__.py +0 -0
  176. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/workflow/job/base.py +0 -0
  177. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/workflow/job/impl/delay.py +0 -0
  178. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/workflow/job/impl/filter.py +0 -0
  179. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/workflow/job/impl/if_.py +0 -0
  180. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/workflow/job/impl/random_router.py +0 -0
  181. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/workflow/job/impl/switch.py +0 -0
  182. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/workflow/job/job.py +0 -0
  183. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/core/workflow/tool.py +0 -0
  184. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/__init__.py +0 -0
  185. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/loader.py +0 -0
  186. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/__init__.py +0 -0
  187. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/__init__.py +0 -0
  188. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/action.py +0 -0
  189. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/__init__.py +0 -0
  190. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/agent.py +0 -0
  191. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/common.py +0 -0
  192. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/datasets/__init__.py +0 -0
  193. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/datasets/common.py +0 -0
  194. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/datasets/datasets.py +0 -0
  195. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/datasets/providers/__init__.py +0 -0
  196. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/datasets/providers/common.py +0 -0
  197. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/datasets/providers/huggingface.py +0 -0
  198. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/datasets/providers/local.py +0 -0
  199. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/http_client.py +0 -0
  200. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/http_server.py +0 -0
  201. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/image_processor.py +0 -0
  202. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/mcp_client.py +0 -0
  203. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/mcp_server.py +0 -0
  204. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/__init__.py +0 -0
  205. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/__init__.py +0 -0
  206. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/chat_completion.py +0 -0
  207. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/common.py +0 -0
  208. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/face_embedding/__init__.py +0 -0
  209. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/face_embedding/face_embedding.py +0 -0
  210. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/face_embedding/impl/__init__.py +0 -0
  211. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/face_embedding/impl/common.py +0 -0
  212. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/face_embedding/impl/dlib.py +0 -0
  213. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/face_embedding/impl/facenet.py +0 -0
  214. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/face_embedding/impl/insightface.py +0 -0
  215. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/image_generation/__init__.py +0 -0
  216. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/image_generation/image_generation.py +0 -0
  217. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/image_generation/impl/__init__.py +0 -0
  218. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/image_generation/impl/common.py +0 -0
  219. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/image_generation/impl/flux.py +0 -0
  220. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/image_generation/impl/hunyuan_image.py +0 -0
  221. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/image_generation/impl/sdxl.py +0 -0
  222. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/image_to_text.py +0 -0
  223. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/__init__.py +0 -0
  224. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/image_upscale.py +0 -0
  225. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/impl/__init__.py +0 -0
  226. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/impl/common.py +0 -0
  227. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/impl/esrgan.py +0 -0
  228. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/impl/ldsr.py +0 -0
  229. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/impl/real_esrgan.py +0 -0
  230. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/image_upscale/impl/swinir.py +0 -0
  231. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/text_classification.py +0 -0
  232. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/text_embedding.py +0 -0
  233. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/text_generation.py +0 -0
  234. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/text_to_speech/__init__.py +0 -0
  235. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/text_to_speech/impl/__init__.py +0 -0
  236. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/text_to_speech/impl/common.py +0 -0
  237. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/text_to_speech/impl/qwen.py +0 -0
  238. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/impl/text_to_speech/text_to_speech.py +0 -0
  239. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model/model.py +0 -0
  240. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model_trainer/__init__.py +0 -0
  241. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model_trainer/impl/__init__.py +0 -0
  242. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model_trainer/impl/classification.py +0 -0
  243. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model_trainer/impl/common.py +0 -0
  244. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model_trainer/impl/sft.py +0 -0
  245. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/model_trainer/model_trainer.py +0 -0
  246. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/shell.py +0 -0
  247. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/text_splitter.py +0 -0
  248. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/vector_store/__init__.py +0 -0
  249. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/vector_store/impl/__init__.py +0 -0
  250. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/vector_store/impl/chroma.py +0 -0
  251. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/vector_store/impl/common.py +0 -0
  252. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/vector_store/impl/faiss.py +0 -0
  253. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/vector_store/impl/milvus.py +0 -0
  254. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/vector_store/impl/qdrant.py +0 -0
  255. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/vector_store/vector_store.py +0 -0
  256. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/web_scraper.py +0 -0
  257. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/action/impl/workflow.py +0 -0
  258. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/__init__.py +0 -0
  259. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/component.py +0 -0
  260. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/__init__.py +0 -0
  261. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/agent.py +0 -0
  262. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/common.py +0 -0
  263. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/datasets/__init__.py +0 -0
  264. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/datasets/datasets.py +0 -0
  265. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/http_client.py +0 -0
  266. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/http_server.py +0 -0
  267. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/image_processor.py +0 -0
  268. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/mcp_client.py +0 -0
  269. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/mcp_server.py +0 -0
  270. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/__init__.py +0 -0
  271. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/__init__.py +0 -0
  272. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/chat_completion.py +0 -0
  273. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/common.py +0 -0
  274. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/face_embedding/__init__.py +0 -0
  275. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/face_embedding/face_embedding.py +0 -0
  276. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/face_embedding/impl/__init__.py +0 -0
  277. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/face_embedding/impl/common.py +0 -0
  278. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/face_embedding/impl/dlib.py +0 -0
  279. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/face_embedding/impl/facenet.py +0 -0
  280. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/face_embedding/impl/insightface.py +0 -0
  281. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/image_generation/__init__.py +0 -0
  282. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/image_generation/image_generation.py +0 -0
  283. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/image_generation/impl/__init__.py +0 -0
  284. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/image_generation/impl/common.py +0 -0
  285. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/image_generation/impl/flux.py +0 -0
  286. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/image_generation/impl/hunyuan_image.py +0 -0
  287. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/image_generation/impl/sdxl.py +0 -0
  288. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/image_to_text.py +0 -0
  289. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/__init__.py +0 -0
  290. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/image_upscale.py +0 -0
  291. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/impl/__init__.py +0 -0
  292. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/impl/common.py +0 -0
  293. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/impl/esrgan.py +0 -0
  294. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/impl/ldsr.py +0 -0
  295. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/impl/real_esrgan.py +0 -0
  296. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/image_upscale/impl/swinir.py +0 -0
  297. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/text_classification.py +0 -0
  298. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/text_embedding.py +0 -0
  299. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/text_generation.py +0 -0
  300. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/text_to_speech/__init__.py +0 -0
  301. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/text_to_speech/impl/__init__.py +0 -0
  302. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/text_to_speech/impl/common.py +0 -0
  303. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/text_to_speech/impl/qwen.py +0 -0
  304. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/impl/text_to_speech/text_to_speech.py +0 -0
  305. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model/model.py +0 -0
  306. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model_trainer/__init__.py +0 -0
  307. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model_trainer/impl/__init__.py +0 -0
  308. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model_trainer/impl/classification.py +0 -0
  309. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model_trainer/impl/common.py +0 -0
  310. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model_trainer/impl/sft.py +0 -0
  311. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/model_trainer/model_trainer.py +0 -0
  312. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/shell.py +0 -0
  313. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/text_splitter.py +0 -0
  314. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/types.py +0 -0
  315. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/vector_store/__init__.py +0 -0
  316. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/vector_store/impl/__init__.py +0 -0
  317. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/vector_store/impl/chroma.py +0 -0
  318. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/vector_store/impl/common.py +0 -0
  319. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/vector_store/impl/faiss.py +0 -0
  320. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/vector_store/impl/milvus.py +0 -0
  321. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/vector_store/impl/qdrant.py +0 -0
  322. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/vector_store/vector_store.py +0 -0
  323. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/web_scraper.py +0 -0
  324. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/component/impl/workflow.py +0 -0
  325. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/compose.py +0 -0
  326. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/controller/__init__.py +0 -0
  327. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/controller/controller.py +0 -0
  328. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/controller/impl/__init__.py +0 -0
  329. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/controller/impl/common.py +0 -0
  330. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/controller/impl/http_server.py +0 -0
  331. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/controller/impl/mcp_server.py +0 -0
  332. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/controller/impl/types.py +0 -0
  333. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/controller/webui/__init__.py +0 -0
  334. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/controller/webui/impl/__init__.py +0 -0
  335. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/controller/webui/impl/common.py +0 -0
  336. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/controller/webui/impl/dynamic.py +0 -0
  337. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/controller/webui/impl/gradio.py +0 -0
  338. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/controller/webui/impl/static.py +0 -0
  339. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/controller/webui/webui.py +0 -0
  340. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/gateway/__init__.py +0 -0
  341. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/gateway/gateway.py +0 -0
  342. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/gateway/impl/__init__.py +0 -0
  343. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/gateway/impl/common.py +0 -0
  344. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/gateway/impl/http_tunnel/__init__.py +0 -0
  345. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/gateway/impl/http_tunnel/http_tunnel.py +0 -0
  346. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/__init__.py +0 -0
  347. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/cloudflare.py +0 -0
  348. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/common.py +0 -0
  349. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/ngrok.py +0 -0
  350. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/gateway/impl/ssh_tunnel.py +0 -0
  351. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/gateway/impl/types.py +0 -0
  352. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/job/__init__.py +0 -0
  353. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/job/impl/common.py +0 -0
  354. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/job/impl/delay.py +0 -0
  355. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/job/impl/filter.py +0 -0
  356. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/job/impl/if_.py +0 -0
  357. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/job/impl/random_router.py +0 -0
  358. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/job/impl/switch.py +0 -0
  359. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/listener/__init__.py +0 -0
  360. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/listener/impl/__init__.py +0 -0
  361. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/listener/impl/common.py +0 -0
  362. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/listener/impl/http_callback.py +0 -0
  363. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/listener/impl/http_trigger.py +0 -0
  364. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/listener/impl/types.py +0 -0
  365. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/listener/listener.py +0 -0
  366. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/logger/__init__.py +0 -0
  367. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/logger/impl/__init__.py +0 -0
  368. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/logger/impl/common.py +0 -0
  369. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/logger/impl/console.py +0 -0
  370. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/logger/impl/file.py +0 -0
  371. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/logger/impl/types.py +0 -0
  372. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/logger/logger.py +0 -0
  373. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/operator/__init__.py +0 -0
  374. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/operator/condition.py +0 -0
  375. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/runtime/__init__.py +0 -0
  376. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/runtime/impl/__init__.py +0 -0
  377. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/runtime/impl/common.py +0 -0
  378. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/runtime/impl/docker.py +0 -0
  379. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/runtime/impl/embedded.py +0 -0
  380. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/runtime/impl/native.py +0 -0
  381. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/runtime/impl/process.py +0 -0
  382. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/runtime/impl/types.py +0 -0
  383. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/runtime/runtime.py +0 -0
  384. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/transport/__init__.py +0 -0
  385. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/transport/http.py +0 -0
  386. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/schema/transport/ssh.py +0 -0
  387. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/utils/__init__.py +0 -0
  388. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/utils/enum.py +0 -0
  389. {model_compose-0.4.25 → model_compose-0.4.27}/src/mindor/dsl/utils/path.py +0 -0
  390. {model_compose-0.4.25 → model_compose-0.4.27}/src/model_compose.egg-info/dependency_links.txt +0 -0
  391. {model_compose-0.4.25 → model_compose-0.4.27}/src/model_compose.egg-info/entry_points.txt +0 -0
  392. {model_compose-0.4.25 → model_compose-0.4.27}/src/model_compose.egg-info/requires.txt +0 -0
  393. {model_compose-0.4.25 → model_compose-0.4.27}/src/model_compose.egg-info/top_level.txt +0 -0
  394. {model_compose-0.4.25 → model_compose-0.4.27}/tests/test_cli.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: model-compose
3
- Version: 0.4.25
3
+ Version: 0.4.27
4
4
  Summary: model-compose: Declarative AI Workflow Orchestrator
5
5
  Author-email: Hanyeol Cho <hanyeol.cho@gmail.com>
6
6
  License-Expression: MIT
@@ -62,6 +62,12 @@ Define complex AI workflows entirely in YAML—no Python, no JavaScript, no codi
62
62
  ### 🔗 **Universal AI Service Integration**
63
63
  Connect to any AI provider out of the box—OpenAI, Anthropic Claude, Google Gemini, ElevenLabs, Stability AI, Replicate, or any custom HTTP API. Mix and match services in a single workflow.
64
64
 
65
+ ### 🤖 **Agent Components**
66
+ Build autonomous AI agents that use workflows as tools. Agents can reason, plan, and execute multi-step tasks by dynamically invoking other workflows—all defined declaratively in YAML.
67
+
68
+ ### ✋ **Human-in-the-Loop**
69
+ Add approval gates and user input steps to any workflow with interrupt configuration. Workflows pause, prompt for human input via CLI, Web UI, or API, and resume seamlessly—perfect for review, moderation, and supervised AI pipelines.
70
+
65
71
  ### 🖥️ **Local Model Execution**
66
72
  Run models from HuggingFace and other sources locally with native support for transformers, PyTorch, and model serving frameworks. Fine-tune models with LoRA/PEFT, train with custom datasets, all through YAML configuration.
67
73
 
@@ -124,6 +130,12 @@ controller:
124
130
  webui:
125
131
  port: 8081
126
132
 
133
+ workflows:
134
+ - id: chat
135
+ default: true
136
+ jobs:
137
+ - component: chatgpt
138
+
127
139
  components:
128
140
  - id: chatgpt
129
141
  type: http-client
@@ -137,12 +149,6 @@ components:
137
149
  messages:
138
150
  - role: user
139
151
  content: ${input.prompt}
140
-
141
- workflows:
142
- - id: chat
143
- default: true
144
- jobs:
145
- - component: chatgpt
146
152
  ```
147
153
 
148
154
  Create a `.env` file:
@@ -211,7 +217,7 @@ pip install -e .[dev]
211
217
  ---
212
218
 
213
219
  ## 📄 License
214
- MIT License © 2025 Hanyeol Cho.
220
+ MIT License © 2025-2026 Hanyeol Cho.
215
221
 
216
222
  ---
217
223
 
@@ -36,6 +36,12 @@ Define complex AI workflows entirely in YAML—no Python, no JavaScript, no codi
36
36
  ### 🔗 **Universal AI Service Integration**
37
37
  Connect to any AI provider out of the box—OpenAI, Anthropic Claude, Google Gemini, ElevenLabs, Stability AI, Replicate, or any custom HTTP API. Mix and match services in a single workflow.
38
38
 
39
+ ### 🤖 **Agent Components**
40
+ Build autonomous AI agents that use workflows as tools. Agents can reason, plan, and execute multi-step tasks by dynamically invoking other workflows—all defined declaratively in YAML.
41
+
42
+ ### ✋ **Human-in-the-Loop**
43
+ Add approval gates and user input steps to any workflow with interrupt configuration. Workflows pause, prompt for human input via CLI, Web UI, or API, and resume seamlessly—perfect for review, moderation, and supervised AI pipelines.
44
+
39
45
  ### 🖥️ **Local Model Execution**
40
46
  Run models from HuggingFace and other sources locally with native support for transformers, PyTorch, and model serving frameworks. Fine-tune models with LoRA/PEFT, train with custom datasets, all through YAML configuration.
41
47
 
@@ -98,6 +104,12 @@ controller:
98
104
  webui:
99
105
  port: 8081
100
106
 
107
+ workflows:
108
+ - id: chat
109
+ default: true
110
+ jobs:
111
+ - component: chatgpt
112
+
101
113
  components:
102
114
  - id: chatgpt
103
115
  type: http-client
@@ -111,12 +123,6 @@ components:
111
123
  messages:
112
124
  - role: user
113
125
  content: ${input.prompt}
114
-
115
- workflows:
116
- - id: chat
117
- default: true
118
- jobs:
119
- - component: chatgpt
120
126
  ```
121
127
 
122
128
  Create a `.env` file:
@@ -185,7 +191,7 @@ pip install -e .[dev]
185
191
  ---
186
192
 
187
193
  ## 📄 License
188
- MIT License © 2025 Hanyeol Cho.
194
+ MIT License © 2025-2026 Hanyeol Cho.
189
195
 
190
196
  ---
191
197
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "model-compose"
3
- version = "0.4.25"
3
+ version = "0.4.27"
4
4
  description = "model-compose: Declarative AI Workflow Orchestrator"
5
5
  authors = [
6
6
  { name = "Hanyeol Cho", email = "hanyeol.cho@gmail.com" }
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
- from typing import TYPE_CHECKING, Any
2
+ from typing import TYPE_CHECKING
3
3
 
4
+ from typing import Any
4
5
  import click
5
6
  import json
6
7
 
@@ -17,7 +18,7 @@ def prompt_for_interrupt(state: TaskState) -> Any:
17
18
  click.echo(json.dumps(interrupt.metadata, indent=2, ensure_ascii=False), err=True)
18
19
 
19
20
  click.echo("", err=True)
20
- click.echo("✋ Action required — press Enter to continue, or type a response (JSON or text):", err=True)
21
+ click.echo("✋ Action required — press Enter to continue, or type an answer (JSON or text):", err=True)
21
22
  raw = input()
22
23
 
23
24
  if not raw:
@@ -73,7 +73,7 @@ class WebScraperAction:
73
73
  {
74
74
  "name": name,
75
75
  "value": value,
76
- "domain": parsed_url.netloc,
76
+ "domain": parsed_url.hostname,
77
77
  "path": "/"
78
78
  }
79
79
  for name, value in cookies.items()
@@ -122,7 +122,11 @@ class WebScraperAction:
122
122
  await element.click()
123
123
  else:
124
124
  # No selector/xpath: find and submit the first form
125
- await page.evaluate("document.querySelector('form').submit()")
125
+ element = await page.query_selector("form")
126
+ if element:
127
+ await element.evaluate("form => form.submit()")
128
+ else:
129
+ raise ValueError("No <form> element found on the page to submit")
126
130
 
127
131
  # Wait for navigation or specific element after submit
128
132
  if wait_for:
@@ -232,7 +236,7 @@ class WebScraperComponent(ComponentService):
232
236
  super().__init__(id, config, global_configs, daemon)
233
237
 
234
238
  def _get_setup_requirements(self) -> Optional[List[str]]:
235
- return [ "playwright", "bs4", "lxml" ]
239
+ return [ "playwright", "beautifulsoup4", "lxml" ]
236
240
 
237
241
  async def _setup(self) -> None:
238
242
  """Install playwright browsers after package installation."""
@@ -39,8 +39,8 @@ class ComposeManager:
39
39
 
40
40
  return state
41
41
 
42
- async def resume_workflow(self, task_id: str, job_id: str, 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:
@@ -1,6 +1,6 @@
1
1
  from typing import Dict, List, Set
2
2
  from mindor.dsl.schema.compose import ComposeConfig
3
- from mindor.dsl.schema.job.impl.action import ActionJobConfig
3
+ from mindor.dsl.schema.job.impl.component import ComponentJobConfig
4
4
  from mindor.dsl.schema.action.impl.workflow import WorkflowActionConfig
5
5
  from mindor.dsl.schema.listener.impl.http_trigger import HttpTriggerListenerConfig
6
6
  from mindor.dsl.schema.component.impl.workflow import WorkflowComponentConfig
@@ -70,7 +70,7 @@ class ComposeValidator:
70
70
 
71
71
  for wi, workflow in enumerate(self.config.workflows):
72
72
  for ji, job in enumerate(workflow.jobs):
73
- if not isinstance(job, ActionJobConfig):
73
+ if not isinstance(job, ComponentJobConfig):
74
74
  continue
75
75
  if not isinstance(job.component, str):
76
76
  continue
@@ -91,7 +91,7 @@ class ComposeValidator:
91
91
 
92
92
  for wi, workflow in enumerate(self.config.workflows):
93
93
  for ji, job in enumerate(workflow.jobs):
94
- if not isinstance(job, ActionJobConfig):
94
+ if not isinstance(job, ComponentJobConfig):
95
95
  continue
96
96
 
97
97
  action_ref = job.action
@@ -191,7 +191,7 @@ class ControllerService(AsyncService):
191
191
 
192
192
  return state
193
193
 
194
- async def resume_workflow(self, task_id: str, job_id: str, 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
 
@@ -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
@@ -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
 
@@ -1,4 +1,4 @@
1
- from .action import *
1
+ from .component import *
2
2
  from .delay import *
3
3
  from .if_ import *
4
4
  from .switch import *