model-compose 0.3.1__tar.gz → 0.3.2__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 (210) hide show
  1. {model_compose-0.3.1/src/model_compose.egg-info → model_compose-0.3.2}/PKG-INFO +1 -1
  2. {model_compose-0.3.1 → model_compose-0.3.2}/pyproject.toml +1 -1
  3. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/controller/runtime/docker/context/Dockerfile +1 -0
  4. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/controller/runtime/docker/docker.py +27 -8
  5. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/controller/runtime/specs.py +6 -0
  6. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/controller/webui/webui.py +13 -2
  7. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/utils/mcp_client.py +6 -6
  8. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/workflow/job/impl/__init__.py +1 -0
  9. model_compose-0.3.2/src/mindor/core/workflow/job/impl/random_router.py +37 -0
  10. model_compose-0.3.2/src/mindor/dsl/schema/component/impl/common.py +13 -0
  11. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/component/impl/http_client.py +3 -3
  12. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/component/impl/http_server.py +3 -3
  13. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/component/impl/mcp_client.py +2 -2
  14. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/component/impl/mcp_server.py +1 -1
  15. model_compose-0.3.2/src/mindor/dsl/schema/controller/impl/common.py +28 -0
  16. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/controller/impl/http_server.py +4 -4
  17. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/controller/impl/mcp_server.py +3 -3
  18. model_compose-0.3.2/src/mindor/dsl/schema/controller/webui/__init__.py +1 -0
  19. model_compose-0.3.2/src/mindor/dsl/schema/controller/webui/impl/__init__.py +4 -0
  20. model_compose-0.3.2/src/mindor/dsl/schema/controller/webui/impl/common.py +13 -0
  21. model_compose-0.3.2/src/mindor/dsl/schema/controller/webui/impl/dynamic.py +9 -0
  22. model_compose-0.3.2/src/mindor/dsl/schema/controller/webui/impl/gradio.py +6 -0
  23. model_compose-0.3.2/src/mindor/dsl/schema/controller/webui/impl/static.py +7 -0
  24. model_compose-0.3.2/src/mindor/dsl/schema/controller/webui/webui.py +13 -0
  25. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/gateway/impl/common.py +2 -2
  26. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/gateway/impl/http_tunnel.py +1 -1
  27. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/job/impl/__init__.py +1 -0
  28. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/job/impl/delay.py +1 -1
  29. model_compose-0.3.2/src/mindor/dsl/schema/job/impl/random_router.py +21 -0
  30. model_compose-0.3.2/src/mindor/dsl/schema/job/impl/types.py +8 -0
  31. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/job/job.py +2 -1
  32. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/listener/impl/common.py +2 -2
  33. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/listener/impl/http_callback.py +7 -7
  34. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/workflow.py +10 -3
  35. {model_compose-0.3.1 → model_compose-0.3.2/src/model_compose.egg-info}/PKG-INFO +1 -1
  36. {model_compose-0.3.1 → model_compose-0.3.2}/src/model_compose.egg-info/SOURCES.txt +9 -1
  37. model_compose-0.3.1/src/mindor/dsl/schema/component/impl/common.py +0 -13
  38. model_compose-0.3.1/src/mindor/dsl/schema/controller/impl/common.py +0 -21
  39. model_compose-0.3.1/src/mindor/dsl/schema/controller/impl/webui.py +0 -11
  40. model_compose-0.3.1/src/mindor/dsl/schema/job/impl/types.py +0 -7
  41. {model_compose-0.3.1 → model_compose-0.3.2}/LICENSE +0 -0
  42. {model_compose-0.3.1 → model_compose-0.3.2}/README.md +0 -0
  43. {model_compose-0.3.1 → model_compose-0.3.2}/setup.cfg +0 -0
  44. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/__init__.py +0 -0
  45. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/cli/__init__.py +0 -0
  46. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/cli/compose.py +0 -0
  47. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/__init__.py +0 -0
  48. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/component/__init__.py +0 -0
  49. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/component/base.py +0 -0
  50. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/component/component.py +0 -0
  51. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/component/context.py +0 -0
  52. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/component/services/__init__.py +0 -0
  53. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/component/services/http_client.py +0 -0
  54. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/component/services/http_server.py +0 -0
  55. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/component/services/mcp_client.py +0 -0
  56. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/component/services/mcp_server.py +0 -0
  57. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/component/services/model/__init__.py +0 -0
  58. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/component/services/model/base.py +0 -0
  59. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/component/services/model/model.py +0 -0
  60. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/component/services/model/tasks/__init__.py +0 -0
  61. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/component/services/model/tasks/summarization.py +0 -0
  62. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/component/services/model/tasks/text_classification.py +0 -0
  63. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/component/services/model/tasks/text_embedding.py +0 -0
  64. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/component/services/model/tasks/text_generation.py +0 -0
  65. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/component/services/model/tasks/translation.py +0 -0
  66. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/component/services/shell.py +0 -0
  67. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/component/services/workflow.py +0 -0
  68. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/compose/__init__.py +0 -0
  69. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/compose/compose.py +0 -0
  70. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/compose/manager.py +0 -0
  71. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/controller/__init__.py +0 -0
  72. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/controller/base.py +0 -0
  73. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/controller/controller.py +0 -0
  74. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/controller/runner/__init__.py +0 -0
  75. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/controller/runner/client.py +0 -0
  76. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/controller/runner/http_client.py +0 -0
  77. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/controller/runner/mcp_client.py +0 -0
  78. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/controller/runner/runner.py +0 -0
  79. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/controller/runtime/__init__.py +0 -0
  80. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/controller/runtime/docker/__init__.py +0 -0
  81. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/controller/services/__init__.py +0 -0
  82. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/controller/services/http_server.py +0 -0
  83. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/controller/services/mcp_server.py +0 -0
  84. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/controller/webui/__init__.py +0 -0
  85. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/controller/webui/gradio.py +0 -0
  86. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/gateway/__init__.py +0 -0
  87. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/gateway/base.py +0 -0
  88. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/gateway/gateway.py +0 -0
  89. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/gateway/services/__init__.py +0 -0
  90. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/gateway/services/http_tunnel.py +0 -0
  91. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/gateway/services/ssh_tunnel.py +0 -0
  92. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/listener/__init__.py +0 -0
  93. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/listener/base.py +0 -0
  94. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/listener/listener.py +0 -0
  95. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/listener/services/__init__.py +0 -0
  96. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/listener/services/http_callback.py +0 -0
  97. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/logger/__init__.py +0 -0
  98. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/logger/base.py +0 -0
  99. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/logger/logger.py +0 -0
  100. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/logger/logging.py +0 -0
  101. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/logger/services/__init__.py +0 -0
  102. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/logger/services/console.py +0 -0
  103. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/logger/services/file.py +0 -0
  104. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/runtime/__init__.py +0 -0
  105. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/runtime/docker/__init__.py +0 -0
  106. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/runtime/docker/docker.py +0 -0
  107. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/runtime/env.py +0 -0
  108. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/services/__init__.py +0 -0
  109. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/services/async_service.py +0 -0
  110. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/utils/__init__.py +0 -0
  111. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/utils/expiring.py +0 -0
  112. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/utils/http_client.py +0 -0
  113. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/utils/http_request.py +0 -0
  114. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/utils/http_status.py +0 -0
  115. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/utils/image.py +0 -0
  116. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/utils/renderer.py +0 -0
  117. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/utils/ssh_client.py +0 -0
  118. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/utils/streaming.py +0 -0
  119. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/utils/time.py +0 -0
  120. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/utils/workqueue.py +0 -0
  121. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/workflow/__init__.py +0 -0
  122. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/workflow/context.py +0 -0
  123. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/workflow/job/__init__.py +0 -0
  124. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/workflow/job/base.py +0 -0
  125. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/workflow/job/impl/action.py +0 -0
  126. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/workflow/job/impl/delay.py +0 -0
  127. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/workflow/job/impl/if_.py +0 -0
  128. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/workflow/job/impl/switch.py +0 -0
  129. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/workflow/job/job.py +0 -0
  130. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/workflow/schema.py +0 -0
  131. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/core/workflow/workflow.py +0 -0
  132. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/__init__.py +0 -0
  133. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/loader.py +0 -0
  134. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/__init__.py +0 -0
  135. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/action/__init__.py +0 -0
  136. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/action/action.py +0 -0
  137. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/action/impl/__init__.py +0 -0
  138. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/action/impl/common.py +0 -0
  139. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/action/impl/http_client.py +0 -0
  140. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/action/impl/http_server.py +0 -0
  141. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/action/impl/mcp_client.py +0 -0
  142. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/action/impl/mcp_server.py +0 -0
  143. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/action/impl/model/__init__.py +0 -0
  144. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/action/impl/model/impl/__init__.py +0 -0
  145. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/action/impl/model/impl/common.py +0 -0
  146. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/action/impl/model/impl/summarization.py +0 -0
  147. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/action/impl/model/impl/text_classification.py +0 -0
  148. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/action/impl/model/impl/text_embedding.py +0 -0
  149. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/action/impl/model/impl/text_generation.py +0 -0
  150. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/action/impl/model/impl/translation.py +0 -0
  151. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/action/impl/model/model.py +0 -0
  152. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/action/impl/shell.py +0 -0
  153. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/action/impl/workflow.py +0 -0
  154. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/component/__init__.py +0 -0
  155. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/component/component.py +0 -0
  156. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/component/impl/__init__.py +0 -0
  157. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/component/impl/model/__init__.py +0 -0
  158. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/component/impl/model/impl/__init__.py +0 -0
  159. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/component/impl/model/impl/common.py +0 -0
  160. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/component/impl/model/impl/summarization.py +0 -0
  161. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/component/impl/model/impl/text_classification.py +0 -0
  162. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/component/impl/model/impl/text_embedding.py +0 -0
  163. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/component/impl/model/impl/text_generation.py +0 -0
  164. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/component/impl/model/impl/translation.py +0 -0
  165. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/component/impl/model/impl/types.py +0 -0
  166. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/component/impl/model/model.py +0 -0
  167. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/component/impl/shell.py +0 -0
  168. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/component/impl/types.py +0 -0
  169. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/component/impl/workflow.py +0 -0
  170. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/compose.py +0 -0
  171. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/controller/__init__.py +0 -0
  172. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/controller/controller.py +0 -0
  173. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/controller/impl/__init__.py +0 -0
  174. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/controller/impl/types.py +0 -0
  175. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/gateway/__init__.py +0 -0
  176. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/gateway/gateway.py +0 -0
  177. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/gateway/impl/__init__.py +0 -0
  178. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/gateway/impl/ssh_tunnel.py +0 -0
  179. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/gateway/impl/types.py +0 -0
  180. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/job/__init__.py +0 -0
  181. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/job/impl/action.py +0 -0
  182. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/job/impl/common.py +0 -0
  183. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/job/impl/if_.py +0 -0
  184. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/job/impl/switch.py +0 -0
  185. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/listener/__init__.py +0 -0
  186. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/listener/impl/__init__.py +0 -0
  187. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/listener/impl/types.py +0 -0
  188. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/listener/listener.py +0 -0
  189. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/logger/__init__.py +0 -0
  190. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/logger/impl/__init__.py +0 -0
  191. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/logger/impl/common.py +0 -0
  192. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/logger/impl/console.py +0 -0
  193. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/logger/impl/file.py +0 -0
  194. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/logger/impl/types.py +0 -0
  195. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/logger/logger.py +0 -0
  196. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/runtime/__init__.py +0 -0
  197. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/runtime/impl/__init__.py +0 -0
  198. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/runtime/impl/common.py +0 -0
  199. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/runtime/impl/docker.py +0 -0
  200. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/runtime/impl/native.py +0 -0
  201. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/runtime/impl/types.py +0 -0
  202. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/schema/runtime/runtime.py +0 -0
  203. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/utils/__init__.py +0 -0
  204. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/utils/annotation.py +0 -0
  205. {model_compose-0.3.1 → model_compose-0.3.2}/src/mindor/dsl/utils/enum.py +0 -0
  206. {model_compose-0.3.1 → model_compose-0.3.2}/src/model_compose.egg-info/dependency_links.txt +0 -0
  207. {model_compose-0.3.1 → model_compose-0.3.2}/src/model_compose.egg-info/entry_points.txt +0 -0
  208. {model_compose-0.3.1 → model_compose-0.3.2}/src/model_compose.egg-info/requires.txt +0 -0
  209. {model_compose-0.3.1 → model_compose-0.3.2}/src/model_compose.egg-info/top_level.txt +0 -0
  210. {model_compose-0.3.1 → model_compose-0.3.2}/tests/test_cli.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: model-compose
3
- Version: 0.3.1
3
+ Version: 0.3.2
4
4
  Summary: model-compose: Declarative AI Model and Workflow Orchestrator
5
5
  Author-email: Hanyeol Cho <hanyeol.cho@gmail.com>
6
6
  License-Expression: MIT
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "model-compose"
3
- version = "0.3.1"
3
+ version = "0.3.2"
4
4
  description = "model-compose: Declarative AI Model and Workflow Orchestrator"
5
5
  authors = [
6
6
  { name = "Hanyeol Cho", email = "hanyeol.cho@gmail.com" }
@@ -37,6 +37,7 @@ COPY requirements.txt .
37
37
  RUN pip install --no-cache-dir -r requirements.txt
38
38
 
39
39
  COPY src .
40
+ COPY webui ./webui
40
41
  COPY model-compose.yml .
41
42
 
42
43
  CMD [ "python", "-m", "mindor.cli.compose", "up" ]
@@ -1,11 +1,11 @@
1
1
  from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Any
2
- from mindor.dsl.schema.controller import ControllerConfig
2
+ from mindor.dsl.schema.controller import ControllerConfig, ControllerWebUIDriver
3
3
  from mindor.dsl.schema.runtime import DockerRuntimeConfig, DockerBuildConfig, DockerPortConfig, DockerVolumeConfig, DockerHealthCheck
4
4
  from mindor.core.runtime.docker import DockerRuntimeManager
5
5
  from mindor.core.logger import logging
6
6
  from ..specs import ControllerRuntimeSpecs
7
7
  from pathlib import Path
8
- import mindor, shutil, yaml
8
+ import mindor, shutil, yaml, os
9
9
 
10
10
  class DockerRuntimeLauncher:
11
11
  def __init__(self, config: ControllerConfig, verbose: bool):
@@ -76,7 +76,7 @@ class DockerRuntimeLauncher:
76
76
  # Copy context files
77
77
  context_files_root = Path(__file__).resolve().parent / "context"
78
78
  shutil.copytree(
79
- src=str(context_files_root),
79
+ src=context_files_root,
80
80
  dst=context_dir
81
81
  )
82
82
 
@@ -84,15 +84,11 @@ class DockerRuntimeLauncher:
84
84
  source_files_root = Path(mindor.__file__).resolve().parent
85
85
  target_dir = context_dir / "src" / source_files_root.name
86
86
  shutil.copytree(
87
- src=str(source_files_root),
87
+ src=source_files_root,
88
88
  dst=target_dir,
89
89
  ignore=shutil.ignore_patterns("__pycache__", "*.pyc")
90
90
  )
91
91
 
92
- # Generate model-compose.yml
93
- with open(context_dir / "model-compose.yml", "w") as f:
94
- yaml.dump(specs.generate_native_runtime_specs(), f, sort_keys=False)
95
-
96
92
  # Copy or generate requirements.txt
97
93
  file_path = Path.cwd() / "requirements.txt"
98
94
  target_path = Path(context_dir) / file_path.name
@@ -100,3 +96,26 @@ class DockerRuntimeLauncher:
100
96
  shutil.copy(file_path, target_path)
101
97
  else:
102
98
  target_path.touch()
99
+
100
+ # Copy or generate webui directory
101
+ Path(context_dir / "webui").mkdir(parents=True, exist_ok=True)
102
+
103
+ if getattr(self.config.webui, "server_dir", None):
104
+ server_dir = Path.cwd() / self.config.webui.server_dir
105
+ target_dir = context_dir / "webui" / "server"
106
+ shutil.copytree(
107
+ src=server_dir,
108
+ dst=target_dir
109
+ )
110
+
111
+ if getattr(self.config.webui, "static_dir", None):
112
+ static_dir = Path.cwd() / self.config.webui.static_dir
113
+ target_dir = context_dir / "webui" / "static"
114
+ shutil.copytree(
115
+ src=static_dir,
116
+ dst=target_dir
117
+ )
118
+
119
+ # Generate model-compose.yml
120
+ with open(context_dir / "model-compose.yml", "w") as f:
121
+ yaml.dump(specs.generate_native_runtime_specs(), f, sort_keys=False)
@@ -28,6 +28,12 @@ class ControllerRuntimeSpecs:
28
28
  specs["controller"] = self.controller.model_dump()
29
29
  specs["controller"]["runtime"] = "native"
30
30
 
31
+ if getattr(self.controller.webui, "server_dir", None):
32
+ specs["controller"]["webui"]["server_dir"] = "webui/server"
33
+
34
+ if getattr(self.controller.webui, "static_dir", None):
35
+ specs["controller"]["webui"]["static_dir"] = "webui/static"
36
+
31
37
  specs["components"] = {}
32
38
  for id, component in self.components.items():
33
39
  specs["components"][id] = component.model_dump()
@@ -1,5 +1,6 @@
1
1
  from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Any
2
- from mindor.dsl.schema.controller import ControllerWebUIConfig, ControllerConfig
2
+ from mindor.dsl.schema.controller import ControllerConfig
3
+ from mindor.dsl.schema.controller.webui import ControllerWebUIConfig, ControllerWebUIDriver
3
4
  from mindor.dsl.schema.component import ComponentConfig
4
5
  from mindor.dsl.schema.workflow import WorkflowConfig
5
6
  from mindor.core.controller.runner import ControllerRunner
@@ -8,6 +9,8 @@ from mindor.core.services import AsyncService
8
9
  from .gradio import GradioWebUIBuilder
9
10
  from gradio import mount_gradio_app
10
11
  from fastapi import FastAPI
12
+ from fastapi.staticfiles import StaticFiles
13
+ from pathlib import Path
11
14
  import uvicorn, gradio
12
15
 
13
16
  class ControllerWebUI(AsyncService):
@@ -32,13 +35,21 @@ class ControllerWebUI(AsyncService):
32
35
  self._configure_driver()
33
36
 
34
37
  def _configure_driver(self) -> None:
35
- if self.config.driver == "gradio":
38
+ if self.config.driver == ControllerWebUIDriver.GRADIO:
36
39
  blocks: gradio.Blocks = GradioWebUIBuilder().build(
37
40
  schema=self.schema,
38
41
  runner=self._run_workflow
39
42
  )
40
43
  self.app = mount_gradio_app(self.app, blocks, path="")
41
44
  return
45
+
46
+ if self.config.driver == ControllerWebUIDriver.STATIC:
47
+ static_files = StaticFiles(
48
+ directory=Path(self.config.static_dir).resolve(),
49
+ html=True
50
+ )
51
+ self.app.mount("/", static_files, name="static")
52
+ return
42
53
 
43
54
  async def _serve(self) -> None:
44
55
  self.runner = ControllerRunner(self.controller)
@@ -23,12 +23,12 @@ class McpClient:
23
23
  Call a specific tool on the MCP server
24
24
 
25
25
  Args:
26
- name: The name of the tool to call
26
+ name: Name of the tool to call
27
27
  arguments: Arguments to pass to the tool
28
28
  raise_on_error: Whether to raise exceptions on error responses
29
29
 
30
30
  Returns:
31
- The tool execution result
31
+ Tool execution result
32
32
  """
33
33
  await self._ensure_initialized()
34
34
  result = await self.session.call_tool(name, arguments)
@@ -50,10 +50,10 @@ class McpClient:
50
50
  Read a specific resource from the MCP server
51
51
 
52
52
  Args:
53
- uri: The URI of the resource to read
53
+ uri: URI of the resource to read
54
54
 
55
55
  Returns:
56
- The resource content
56
+ Resource content
57
57
  """
58
58
  await self._ensure_initialized()
59
59
  result = await self.session.read_resource(uri)
@@ -70,11 +70,11 @@ class McpClient:
70
70
  Get a specific prompt from the MCP server
71
71
 
72
72
  Args:
73
- name: The name of the prompt to get
73
+ name: Name of the prompt to get
74
74
  arguments: Arguments to pass to the prompt
75
75
 
76
76
  Returns:
77
- The prompt content
77
+ Prompt content
78
78
  """
79
79
  await self._ensure_initialized()
80
80
  result = await self.session.get_prompt(name, arguments)
@@ -2,3 +2,4 @@ from .action import *
2
2
  from .delay import *
3
3
  from .if_ import *
4
4
  from .switch import *
5
+ from .random_router import *
@@ -0,0 +1,37 @@
1
+ from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Callable, Any
2
+ from mindor.dsl.schema.job import RandomRouterJobConfig, RandomRoutingMode
3
+ from mindor.dsl.schema.component import ComponentConfig
4
+ from mindor.core.logger import logging
5
+ from ..base import Job, JobType, WorkflowContext, RoutingTarget, register_job
6
+ import random
7
+
8
+ @register_job(JobType.RANDOM_ROUTER)
9
+ class RandomRouterJob(Job):
10
+ def __init__(self, id: str, config: RandomRouterJobConfig, components: Dict[str, ComponentConfig]):
11
+ super().__init__(id, config, components)
12
+
13
+ async def run(self, context: WorkflowContext) -> Union[Any, RoutingTarget]:
14
+ if self.config.mode == RandomRoutingMode.WEIGHTED:
15
+ weights, targets = [], []
16
+ for routing in self.config.routings:
17
+ weight = await context.render_variable(routing.weight)
18
+ if weight is not None and weight > 0.0:
19
+ weights.append(weight)
20
+ targets.append(routing.target)
21
+
22
+ if not weights:
23
+ raise ValueError(f"No valid weights found in random-router job '{self.id}'.")
24
+
25
+ target = random.choices(targets, weights=weights, k=1)[0]
26
+ return RoutingTarget(target)
27
+
28
+ if self.config.mode == RandomRoutingMode.UNIFORM:
29
+ targets = [ routing.target for routing in self.config.routings ]
30
+
31
+ if not targets:
32
+ raise ValueError(f"No valid routing found in random-router job '{self.id}'.")
33
+
34
+ target = random.choice(targets)
35
+ return RoutingTarget(target)
36
+
37
+ raise ValueError(f"Unsupported routing mode: {self.config.mode}")
@@ -0,0 +1,13 @@
1
+ from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Any
2
+ from enum import Enum
3
+ from pydantic import BaseModel, Field
4
+ from mindor.dsl.schema.action import CommonActionConfig
5
+ from mindor.dsl.schema.runtime import RuntimeType
6
+ from .types import ComponentType
7
+
8
+ class CommonComponentConfig(BaseModel):
9
+ type: ComponentType = Field(..., description="Type of component.")
10
+ runtime: RuntimeType = Field(default=RuntimeType.NATIVE, description="Runtime environment used to execute this component.")
11
+ max_concurrent_count: int = Field(default=1, description="Maximum number of concurrent actions this component can handle.")
12
+ default: bool = Field(default=False, description="Whether to use this component when no component is explicitly specified.")
13
+ actions: Dict[str, CommonActionConfig] = Field(default_factory=dict, description="Actions available within this component.")
@@ -6,9 +6,9 @@ from .common import ComponentType, CommonComponentConfig
6
6
 
7
7
  class HttpClientComponentConfig(CommonComponentConfig):
8
8
  type: Literal[ComponentType.HTTP_CLIENT]
9
- base_url: Optional[str] = Field(default=None)
10
- headers: Dict[str, Any] = Field(default_factory=dict)
11
- actions: Dict[str, HttpClientActionConfig] = Field(default_factory=dict)
9
+ base_url: Optional[str] = Field(default=None, description="")
10
+ headers: Dict[str, Any] = Field(default_factory=dict, description="")
11
+ actions: Dict[str, HttpClientActionConfig] = Field(default_factory=dict, description="")
12
12
 
13
13
  @model_validator(mode="before")
14
14
  def inflate_single_action(cls, values: Dict[str, Any]):
@@ -6,6 +6,6 @@ from .common import ComponentType, CommonComponentConfig
6
6
 
7
7
  class HttpServerComponentConfig(CommonComponentConfig):
8
8
  type: Literal[ComponentType.HTTP_SERVER]
9
- port: Optional[int] = Field(default=None, ge=1, le=65535)
10
- base_path: Optional[str] = Field(default=None)
11
- actions: Dict[str, HttpServerActionConfig] = Field(default_factory=dict)
9
+ port: Optional[int] = Field(default=None, ge=1, le=65535, description="")
10
+ base_path: Optional[str] = Field(default=None, description="")
11
+ actions: Dict[str, HttpServerActionConfig] = Field(default_factory=dict, description="")
@@ -7,8 +7,8 @@ from .common import ComponentType, CommonComponentConfig
7
7
  class McpClientComponentConfig(CommonComponentConfig):
8
8
  type: Literal[ComponentType.MCP_CLIENT]
9
9
  url: str = Field(..., description="URL of the MCP server to invoke tools.")
10
- headers: Dict[str, Any] = Field(default_factory=dict)
11
- actions: Dict[str, McpClientActionConfig] = Field(default_factory=dict)
10
+ headers: Dict[str, Any] = Field(default_factory=dict, description="")
11
+ actions: Dict[str, McpClientActionConfig] = Field(default_factory=dict, description="")
12
12
 
13
13
  @model_validator(mode="before")
14
14
  def inflate_single_action(cls, values: Dict[str, Any]):
@@ -6,4 +6,4 @@ from .common import ComponentType, CommonComponentConfig
6
6
 
7
7
  class McpServerComponentConfig(CommonComponentConfig):
8
8
  type: Literal[ComponentType.MCP_SERVER]
9
- actions: Dict[str, McpServerActionConfig] = Field(default_factory=dict)
9
+ actions: Dict[str, McpServerActionConfig] = Field(default_factory=dict, description="")
@@ -0,0 +1,28 @@
1
+ from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Any
2
+ from pydantic import BaseModel, Field
3
+ from pydantic import model_validator, field_validator
4
+ from mindor.dsl.schema.runtime import RuntimeConfig, RuntimeType
5
+ from .types import ControllerType
6
+ from ..webui import ControllerWebUIConfig, ControllerWebUIDriver
7
+
8
+ class CommonControllerConfig(BaseModel):
9
+ name: Optional[str] = Field(default=None, description="Name used to identify this controller instance.")
10
+ type: ControllerType = Field(..., description="Type of controller to run.")
11
+ runtime: RuntimeConfig = Field(..., description="Runtime environment settings.")
12
+ max_concurrent_count: int = Field(default=1, description="Maximum number of jobs that can be executed concurrently.")
13
+ threaded: bool = Field(default=False, description="Whether to run jobs in separate threads.")
14
+ webui: Optional[ControllerWebUIConfig] = Field(default=None, description="Configuration for the controller's Web UI interface.")
15
+
16
+ @model_validator(mode="before")
17
+ def inflate_runtime(cls, values: Dict[str, Any]):
18
+ runtime = values.get("runtime")
19
+ if runtime is None or isinstance(runtime, str):
20
+ values["runtime"] = { "type": runtime or RuntimeType.NATIVE }
21
+ return values
22
+
23
+ @model_validator(mode="before")
24
+ def fill_missing_webui_driver(cls, values: Dict[str, Any]):
25
+ webui = values.get("webui")
26
+ if isinstance(webui, dict) and "driver" not in webui:
27
+ webui["driver"] = ControllerWebUIDriver.GRADIO
28
+ return values
@@ -5,7 +5,7 @@ from .common import ControllerType, CommonControllerConfig
5
5
 
6
6
  class HttpServerControllerConfig(CommonControllerConfig):
7
7
  type: Literal[ControllerType.HTTP_SERVER]
8
- host: Optional[str] = Field(default="0.0.0.0", description="")
9
- port: Optional[int] = Field(default=8080, description="")
10
- base_path: Optional[str] = Field(default=None, description="")
11
- origins: Optional[str] = Field(default="*", description="")
8
+ host: Optional[str] = Field(default="0.0.0.0", description="Host address to bind the HTTP server to.")
9
+ port: Optional[int] = Field(default=8080, description="Port number on which the HTTP server will listen.")
10
+ base_path: Optional[str] = Field(default=None, description="Base path to prefix all API routes")
11
+ origins: Optional[str] = Field(default="*", description="CORS allowed origins, specified as a comma-separated string")
@@ -5,6 +5,6 @@ from .common import ControllerType, CommonControllerConfig
5
5
 
6
6
  class McpServerControllerConfig(CommonControllerConfig):
7
7
  type: Literal[ControllerType.MCP_SERVER]
8
- host: Optional[str] = Field(default="0.0.0.0", description="")
9
- port: Optional[int] = Field(default=8080, description="")
10
- base_path: Optional[str] = Field(default=None, description="")
8
+ host: Optional[str] = Field(default="0.0.0.0", description="Host address to bind the MCP server to.")
9
+ port: Optional[int] = Field(default=8080, description="Port number on which the MCP server will listen.")
10
+ base_path: Optional[str] = Field(default=None, description="Base path to prefix all MCP endpoints")
@@ -0,0 +1 @@
1
+ from .webui import *
@@ -0,0 +1,4 @@
1
+ from .common import *
2
+ from .gradio import *
3
+ from .static import *
4
+ from .dynamic import *
@@ -0,0 +1,13 @@
1
+ from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Any
2
+ from enum import Enum
3
+ from pydantic import BaseModel, Field
4
+
5
+ class ControllerWebUIDriver(str, Enum):
6
+ GRADIO = "gradio"
7
+ STATIC = "static"
8
+ DYNAMIC = "dynamic"
9
+
10
+ class CommonWebUIConfig(BaseModel):
11
+ driver: ControllerWebUIDriver = Field(..., description="")
12
+ host: Optional[str] = Field(default="0.0.0.0", description="Host address to bind the Web UI server to.")
13
+ port: Optional[int] = Field(default=8081, description="Port number to serve the Web UI on.")
@@ -0,0 +1,9 @@
1
+ from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Any
2
+ from pydantic import BaseModel, Field
3
+ from .common import CommonWebUIConfig, ControllerWebUIDriver
4
+
5
+ class DynamicWebUIConfig(CommonWebUIConfig):
6
+ driver: Literal[ControllerWebUIDriver.DYNAMIC]
7
+ command: str = Field(..., description="Command to start the web UI server.")
8
+ server_dir: str = Field(default="webui/server", description="Directory containing source code and entry point for the web UI server.")
9
+ static_dir: str = Field(default="webui/static", description="Directory containing static HTML/CSS/JS files for the web UI.")
@@ -0,0 +1,6 @@
1
+ from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Any
2
+ from pydantic import BaseModel, Field
3
+ from .common import CommonWebUIConfig, ControllerWebUIDriver
4
+
5
+ class GradioWebUIConfig(CommonWebUIConfig):
6
+ driver: Literal[ControllerWebUIDriver.GRADIO]
@@ -0,0 +1,7 @@
1
+ from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Any
2
+ from pydantic import BaseModel, Field
3
+ from .common import CommonWebUIConfig, ControllerWebUIDriver
4
+
5
+ class StaticWebUIConfig(CommonWebUIConfig):
6
+ driver: Literal[ControllerWebUIDriver.STATIC]
7
+ static_dir: str = Field(default="webui", description="Directory containing static HTML/CSS/JS files for the web UI.")
@@ -0,0 +1,13 @@
1
+ from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Any
2
+ from enum import Enum
3
+ from pydantic import BaseModel, Field
4
+ from .impl import *
5
+
6
+ ControllerWebUIConfig = Annotated[
7
+ Union[
8
+ GradioWebUIConfig,
9
+ StaticWebUIConfig,
10
+ DynamicWebUIConfig
11
+ ],
12
+ Field(discriminator="driver")
13
+ ]
@@ -5,5 +5,5 @@ from .types import GatewayType
5
5
 
6
6
  class CommonGatewayConfig(BaseModel):
7
7
  type: GatewayType = Field(..., description="")
8
- runtime: RuntimeType = Field(default=RuntimeType.NATIVE)
9
- port: Optional[int] = Field(default=8090)
8
+ runtime: RuntimeType = Field(default=RuntimeType.NATIVE, description="")
9
+ port: Optional[int] = Field(default=8090, description="")
@@ -9,4 +9,4 @@ class HttpTunnelGatewayDriver(str, Enum):
9
9
 
10
10
  class HttpTunnelGatewayConfig(CommonGatewayConfig):
11
11
  type: Literal[GatewayType.HTTP_TUNNEL]
12
- driver: HttpTunnelGatewayDriver = Field(default=HttpTunnelGatewayDriver.NGROK)
12
+ driver: HttpTunnelGatewayDriver = Field(default=HttpTunnelGatewayDriver.NGROK, description="")
@@ -3,3 +3,4 @@ from .action import *
3
3
  from .delay import *
4
4
  from .if_ import *
5
5
  from .switch import *
6
+ from .random_router import *
@@ -20,7 +20,7 @@ class TimeIntervalDelayJobConfig(CommonDelayJobConfig):
20
20
  class SpecificTimeDelayJobConfig(CommonDelayJobConfig):
21
21
  mode: Literal[DelayJobMode.SPECIFIC_TIME]
22
22
  time: Union[datetime, str] = Field(..., description="Specific date and time to wait until.")
23
- timezone: Optional[str] = Field(default=None, description="")
23
+ timezone: Optional[str] = Field(default=None, description="Timezone identifier used to interpret the 'time' field.")
24
24
 
25
25
  DelayJobConfig = Annotated[
26
26
  Union[
@@ -0,0 +1,21 @@
1
+ from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Any
2
+ from enum import Enum
3
+ from pydantic import BaseModel, Field
4
+ from pydantic import model_validator, field_validator
5
+ from .common import JobType, CommonJobConfig
6
+
7
+ class RandomRoutingMode(Enum, str):
8
+ UNIFORM = "uniform"
9
+ WEIGHTED = "weighted"
10
+
11
+ class RandomRoutingConfig(BaseModel):
12
+ weight: Optional[float] = Field(default=None, description="")
13
+ target: str = Field(..., description="Destination job ID for this route.")
14
+
15
+ class RandomRouterJobConfig(CommonJobConfig):
16
+ type: Literal[JobType.RANDOM_ROUTER]
17
+ mode: RandomRoutingMode = Field(default=RandomRoutingMode.UNIFORM, description="")
18
+ routings: List[RandomRoutingConfig] = Field(default_factory=list, description="")
19
+
20
+ def get_routing_jobs(self) -> Set[str]:
21
+ return { routing.target for routing in self.routings }
@@ -0,0 +1,8 @@
1
+ from enum import Enum
2
+
3
+ class JobType(str, Enum):
4
+ ACTION = "action"
5
+ DELAY = "delay"
6
+ IF = "if"
7
+ SWITCH = "switch"
8
+ RANDOM_ROUTER = "random-router"
@@ -7,7 +7,8 @@ JobConfig = Annotated[
7
7
  ActionJobConfig,
8
8
  DelayJobConfig,
9
9
  IfJobConfig,
10
- SwitchJobConfig
10
+ SwitchJobConfig,
11
+ RandomRouterJobConfig
11
12
  ],
12
13
  Field(discriminator="type")
13
14
  ]
@@ -5,5 +5,5 @@ from .types import ListenerType
5
5
 
6
6
  class CommonListenerConfig(BaseModel):
7
7
  type: ListenerType = Field(..., description="")
8
- runtime: RuntimeType = Field(default=RuntimeType.NATIVE)
9
- max_concurrent_count: int = Field(default=0)
8
+ runtime: RuntimeType = Field(default=RuntimeType.NATIVE, description="")
9
+ max_concurrent_count: int = Field(default=0, description="")
@@ -5,14 +5,14 @@ from .common import ListenerType, CommonListenerConfig
5
5
 
6
6
  class HttpCallbackConfig(BaseModel):
7
7
  path: str
8
- method: Literal[ "GET", "POST", "PUT", "DELETE", "PATCH" ] = Field(default="POST")
9
- bulk: bool = Field(default=False)
10
- item: Optional[str] = Field(default=None)
8
+ method: Literal[ "GET", "POST", "PUT", "DELETE", "PATCH" ] = Field(default="POST", description="")
9
+ bulk: bool = Field(default=False, description="")
10
+ item: Optional[str] = Field(default=None, description="")
11
11
  identify_by: str = Field(..., description="")
12
- status: Optional[str] = Field(default=None)
13
- success_when: Optional[List[str]] = Field(default=None)
14
- fail_when: Optional[List[str]] = Field(default=None)
15
- result: Optional[Any] = Field(default=None)
12
+ status: Optional[str] = Field(default=None, description="")
13
+ success_when: Optional[List[str]] = Field(default=None, description="")
14
+ fail_when: Optional[List[str]] = Field(default=None, description="")
15
+ result: Optional[Any] = Field(default=None, description="")
16
16
 
17
17
  @model_validator(mode="before")
18
18
  def normalize_status_fields(cls, values: Dict[str, Any]):
@@ -3,7 +3,7 @@ from enum import Enum
3
3
  from pydantic import BaseModel, Field
4
4
  from pydantic import model_validator, field_validator
5
5
  from mindor.dsl.utils.annotation import get_model_union_keys
6
- from .job import JobConfig, JobType
6
+ from .job import JobConfig, JobType, DelayJobMode
7
7
 
8
8
  class WorkflowVariableType(str, Enum):
9
9
  # Primitive data types
@@ -67,7 +67,8 @@ class WorkflowConfig(BaseModel):
67
67
  def normalize_jobs(cls, values: Dict[str, Any]):
68
68
  values = cls.inflate_single_job(values)
69
69
  if "jobs" in values:
70
- cls.set_default_job_type(values["jobs"])
70
+ cls.fill_missing_job_type(values["jobs"])
71
+ cls.fill_missing_delay_job_mode(values["jobs"])
71
72
  return values
72
73
 
73
74
  @classmethod
@@ -79,7 +80,13 @@ class WorkflowConfig(BaseModel):
79
80
  return values
80
81
 
81
82
  @classmethod
82
- def set_default_job_type(cls, jobs: Dict[str, Any]):
83
+ def fill_missing_job_type(cls, jobs: Dict[str, Any]):
83
84
  for job in jobs.values():
84
85
  if "type" not in job:
85
86
  job["type"] = JobType.ACTION
87
+
88
+ @classmethod
89
+ def fill_missing_delay_job_mode(cls, jobs: Dict[str, Any]):
90
+ for job in [ job for job in jobs.values() if job["type"] == "delay" ]:
91
+ if "mode" not in job:
92
+ job["mode"] = DelayJobMode.TIME_INTERVAL
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: model-compose
3
- Version: 0.3.1
3
+ Version: 0.3.2
4
4
  Summary: model-compose: Declarative AI Model and Workflow Orchestrator
5
5
  Author-email: Hanyeol Cho <hanyeol.cho@gmail.com>
6
6
  License-Expression: MIT
@@ -94,6 +94,7 @@ src/mindor/core/workflow/job/impl/__init__.py
94
94
  src/mindor/core/workflow/job/impl/action.py
95
95
  src/mindor/core/workflow/job/impl/delay.py
96
96
  src/mindor/core/workflow/job/impl/if_.py
97
+ src/mindor/core/workflow/job/impl/random_router.py
97
98
  src/mindor/core/workflow/job/impl/switch.py
98
99
  src/mindor/dsl/__init__.py
99
100
  src/mindor/dsl/loader.py
@@ -147,7 +148,13 @@ src/mindor/dsl/schema/controller/impl/common.py
147
148
  src/mindor/dsl/schema/controller/impl/http_server.py
148
149
  src/mindor/dsl/schema/controller/impl/mcp_server.py
149
150
  src/mindor/dsl/schema/controller/impl/types.py
150
- src/mindor/dsl/schema/controller/impl/webui.py
151
+ src/mindor/dsl/schema/controller/webui/__init__.py
152
+ src/mindor/dsl/schema/controller/webui/webui.py
153
+ src/mindor/dsl/schema/controller/webui/impl/__init__.py
154
+ src/mindor/dsl/schema/controller/webui/impl/common.py
155
+ src/mindor/dsl/schema/controller/webui/impl/dynamic.py
156
+ src/mindor/dsl/schema/controller/webui/impl/gradio.py
157
+ src/mindor/dsl/schema/controller/webui/impl/static.py
151
158
  src/mindor/dsl/schema/gateway/__init__.py
152
159
  src/mindor/dsl/schema/gateway/gateway.py
153
160
  src/mindor/dsl/schema/gateway/impl/__init__.py
@@ -162,6 +169,7 @@ src/mindor/dsl/schema/job/impl/action.py
162
169
  src/mindor/dsl/schema/job/impl/common.py
163
170
  src/mindor/dsl/schema/job/impl/delay.py
164
171
  src/mindor/dsl/schema/job/impl/if_.py
172
+ src/mindor/dsl/schema/job/impl/random_router.py
165
173
  src/mindor/dsl/schema/job/impl/switch.py
166
174
  src/mindor/dsl/schema/job/impl/types.py
167
175
  src/mindor/dsl/schema/listener/__init__.py
@@ -1,13 +0,0 @@
1
- from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Any
2
- from enum import Enum
3
- from pydantic import BaseModel, Field
4
- from mindor.dsl.schema.action import CommonActionConfig
5
- from mindor.dsl.schema.runtime import RuntimeType
6
- from .types import ComponentType
7
-
8
- class CommonComponentConfig(BaseModel):
9
- type: ComponentType = Field(..., description="")
10
- runtime: RuntimeType = Field(default=RuntimeType.NATIVE)
11
- max_concurrent_count: int = Field(default=1)
12
- default: bool = Field(default=False)
13
- actions: Dict[str, CommonActionConfig] = Field(default_factory=dict)
@@ -1,21 +0,0 @@
1
- from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Any
2
- from pydantic import BaseModel, Field
3
- from pydantic import model_validator, field_validator
4
- from mindor.dsl.schema.runtime import RuntimeConfig
5
- from .types import ControllerType
6
- from .webui import ControllerWebUIConfig
7
-
8
- class CommonControllerConfig(BaseModel):
9
- name: Optional[str] = Field(default=None)
10
- type: ControllerType = Field(..., description="")
11
- runtime: RuntimeConfig = Field(..., description="")
12
- max_concurrent_count: int = Field(default=1, description="")
13
- threaded: bool = Field(default=False, description="")
14
- webui: Optional[ControllerWebUIConfig] = Field(default=None, description="")
15
-
16
- @model_validator(mode="before")
17
- def inflate_runtime(cls, values: Dict[str, Any]):
18
- runtime = values.get("runtime")
19
- if runtime is None or isinstance(runtime, str):
20
- values["runtime"] = { "type": runtime or "native" }
21
- return values