model-compose 0.2.12__tar.gz → 0.3.0__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 (195) hide show
  1. {model_compose-0.2.12/src/model_compose.egg-info → model_compose-0.3.0}/PKG-INFO +2 -1
  2. {model_compose-0.2.12 → model_compose-0.3.0}/pyproject.toml +7 -2
  3. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/cli/compose.py +9 -2
  4. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/compose/compose.py +4 -4
  5. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/compose/manager.py +4 -6
  6. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/controller/base.py +48 -18
  7. model_compose-0.3.0/src/mindor/core/controller/runtime/docker/__init__.py +1 -0
  8. model_compose-0.3.0/src/mindor/core/controller/runtime/docker/context/Dockerfile +42 -0
  9. model_compose-0.3.0/src/mindor/core/controller/runtime/docker/docker.py +102 -0
  10. model_compose-0.3.0/src/mindor/core/controller/runtime/specs.py +40 -0
  11. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/logger/services/console.py +1 -1
  12. model_compose-0.3.0/src/mindor/core/runtime/docker/__init__.py +1 -0
  13. model_compose-0.3.0/src/mindor/core/runtime/docker/docker.py +263 -0
  14. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/runtime/env.py +0 -2
  15. model_compose-0.3.0/src/mindor/dsl/schema/controller/impl/common.py +21 -0
  16. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/controller/impl/http_server.py +4 -4
  17. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/controller/impl/mcp_server.py +3 -3
  18. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/controller/impl/webui.py +2 -2
  19. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/runtime/impl/__init__.py +1 -0
  20. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/runtime/impl/common.py +1 -1
  21. model_compose-0.3.0/src/mindor/dsl/schema/runtime/impl/docker.py +72 -0
  22. model_compose-0.2.12/src/mindor/dsl/schema/runtime/impl/docker.py → model_compose-0.3.0/src/mindor/dsl/schema/runtime/impl/native.py +3 -3
  23. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/runtime/impl/types.py +1 -0
  24. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/runtime/runtime.py +2 -5
  25. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/workflow.py +2 -2
  26. model_compose-0.3.0/src/mindor/dsl/utils/__init__.py +0 -0
  27. model_compose-0.3.0/src/mindor/dsl/utils/enum.py +27 -0
  28. {model_compose-0.2.12 → model_compose-0.3.0/src/model_compose.egg-info}/PKG-INFO +2 -1
  29. {model_compose-0.2.12 → model_compose-0.3.0}/src/model_compose.egg-info/SOURCES.txt +9 -0
  30. {model_compose-0.2.12 → model_compose-0.3.0}/src/model_compose.egg-info/requires.txt +1 -0
  31. model_compose-0.2.12/src/mindor/dsl/schema/controller/impl/common.py +0 -13
  32. {model_compose-0.2.12 → model_compose-0.3.0}/LICENSE +0 -0
  33. {model_compose-0.2.12 → model_compose-0.3.0}/README.md +0 -0
  34. {model_compose-0.2.12 → model_compose-0.3.0}/setup.cfg +0 -0
  35. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/__init__.py +0 -0
  36. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/cli/__init__.py +0 -0
  37. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/__init__.py +0 -0
  38. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/component/__init__.py +0 -0
  39. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/component/base.py +0 -0
  40. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/component/component.py +0 -0
  41. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/component/context.py +0 -0
  42. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/component/services/__init__.py +0 -0
  43. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/component/services/http_client.py +0 -0
  44. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/component/services/http_server.py +0 -0
  45. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/component/services/mcp_client.py +0 -0
  46. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/component/services/mcp_server.py +0 -0
  47. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/component/services/model/__init__.py +0 -0
  48. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/component/services/model/base.py +0 -0
  49. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/component/services/model/model.py +0 -0
  50. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/component/services/model/tasks/__init__.py +0 -0
  51. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/component/services/model/tasks/summarization.py +0 -0
  52. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/component/services/model/tasks/text_classification.py +0 -0
  53. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/component/services/model/tasks/text_embedding.py +0 -0
  54. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/component/services/model/tasks/text_generation.py +0 -0
  55. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/component/services/model/tasks/translation.py +0 -0
  56. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/component/services/shell.py +0 -0
  57. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/component/services/workflow.py +0 -0
  58. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/compose/__init__.py +0 -0
  59. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/controller/__init__.py +0 -0
  60. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/controller/controller.py +0 -0
  61. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/controller/runner/__init__.py +0 -0
  62. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/controller/runner/client.py +0 -0
  63. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/controller/runner/http_client.py +0 -0
  64. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/controller/runner/mcp_client.py +0 -0
  65. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/controller/runner/runner.py +0 -0
  66. {model_compose-0.2.12/src/mindor/core → model_compose-0.3.0/src/mindor/core/controller}/runtime/__init__.py +0 -0
  67. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/controller/services/__init__.py +0 -0
  68. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/controller/services/http_server.py +0 -0
  69. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/controller/services/mcp_server.py +0 -0
  70. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/controller/webui/__init__.py +0 -0
  71. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/controller/webui/gradio.py +0 -0
  72. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/controller/webui/webui.py +0 -0
  73. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/gateway/__init__.py +0 -0
  74. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/gateway/base.py +0 -0
  75. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/gateway/gateway.py +0 -0
  76. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/gateway/services/__init__.py +0 -0
  77. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/gateway/services/http_tunnel.py +0 -0
  78. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/gateway/services/ssh_tunnel.py +0 -0
  79. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/listener/__init__.py +0 -0
  80. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/listener/base.py +0 -0
  81. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/listener/listener.py +0 -0
  82. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/listener/services/__init__.py +0 -0
  83. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/listener/services/http_callback.py +0 -0
  84. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/logger/__init__.py +0 -0
  85. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/logger/base.py +0 -0
  86. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/logger/logger.py +0 -0
  87. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/logger/logging.py +0 -0
  88. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/logger/services/__init__.py +0 -0
  89. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/logger/services/file.py +0 -0
  90. {model_compose-0.2.12/src/mindor/core/utils → model_compose-0.3.0/src/mindor/core/runtime}/__init__.py +0 -0
  91. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/services/__init__.py +0 -0
  92. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/services/async_service.py +0 -0
  93. {model_compose-0.2.12/src/mindor/dsl → model_compose-0.3.0/src/mindor/core/utils}/__init__.py +0 -0
  94. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/utils/expiring.py +0 -0
  95. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/utils/http_client.py +0 -0
  96. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/utils/http_request.py +0 -0
  97. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/utils/http_status.py +0 -0
  98. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/utils/image.py +0 -0
  99. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/utils/mcp_client.py +0 -0
  100. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/utils/renderer.py +0 -0
  101. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/utils/ssh_client.py +0 -0
  102. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/utils/streaming.py +0 -0
  103. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/utils/time.py +0 -0
  104. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/utils/workqueue.py +0 -0
  105. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/workflow/__init__.py +0 -0
  106. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/workflow/context.py +0 -0
  107. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/workflow/job/__init__.py +0 -0
  108. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/workflow/job/base.py +0 -0
  109. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/workflow/job/impl/__init__.py +0 -0
  110. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/workflow/job/impl/action.py +0 -0
  111. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/workflow/job/impl/delay.py +0 -0
  112. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/workflow/job/job.py +0 -0
  113. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/workflow/schema.py +0 -0
  114. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/core/workflow/workflow.py +0 -0
  115. {model_compose-0.2.12/src/mindor/dsl/schema → model_compose-0.3.0/src/mindor/dsl}/__init__.py +0 -0
  116. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/loader.py +0 -0
  117. {model_compose-0.2.12/src/mindor/dsl/utils → model_compose-0.3.0/src/mindor/dsl/schema}/__init__.py +0 -0
  118. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/action/__init__.py +0 -0
  119. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/action/action.py +0 -0
  120. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/action/impl/__init__.py +0 -0
  121. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/action/impl/common.py +0 -0
  122. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/action/impl/http_client.py +0 -0
  123. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/action/impl/http_server.py +0 -0
  124. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/action/impl/mcp_client.py +0 -0
  125. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/action/impl/mcp_server.py +0 -0
  126. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/action/impl/model/__init__.py +0 -0
  127. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/action/impl/model/impl/__init__.py +0 -0
  128. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/action/impl/model/impl/common.py +0 -0
  129. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/action/impl/model/impl/summarization.py +0 -0
  130. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/action/impl/model/impl/text_classification.py +0 -0
  131. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/action/impl/model/impl/text_embedding.py +0 -0
  132. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/action/impl/model/impl/text_generation.py +0 -0
  133. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/action/impl/model/impl/translation.py +0 -0
  134. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/action/impl/model/model.py +0 -0
  135. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/action/impl/shell.py +0 -0
  136. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/action/impl/workflow.py +0 -0
  137. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/component/__init__.py +0 -0
  138. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/component/component.py +0 -0
  139. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/component/impl/__init__.py +0 -0
  140. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/component/impl/common.py +0 -0
  141. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/component/impl/http_client.py +0 -0
  142. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/component/impl/http_server.py +0 -0
  143. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/component/impl/mcp_client.py +0 -0
  144. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/component/impl/mcp_server.py +0 -0
  145. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/component/impl/model/__init__.py +0 -0
  146. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/component/impl/model/impl/__init__.py +0 -0
  147. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/component/impl/model/impl/common.py +0 -0
  148. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/component/impl/model/impl/summarization.py +0 -0
  149. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/component/impl/model/impl/text_classification.py +0 -0
  150. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/component/impl/model/impl/text_embedding.py +0 -0
  151. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/component/impl/model/impl/text_generation.py +0 -0
  152. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/component/impl/model/impl/translation.py +0 -0
  153. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/component/impl/model/impl/types.py +0 -0
  154. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/component/impl/model/model.py +0 -0
  155. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/component/impl/shell.py +0 -0
  156. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/component/impl/types.py +0 -0
  157. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/component/impl/workflow.py +0 -0
  158. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/compose.py +0 -0
  159. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/controller/__init__.py +0 -0
  160. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/controller/controller.py +0 -0
  161. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/controller/impl/__init__.py +0 -0
  162. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/controller/impl/types.py +0 -0
  163. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/gateway/__init__.py +0 -0
  164. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/gateway/gateway.py +0 -0
  165. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/gateway/impl/__init__.py +0 -0
  166. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/gateway/impl/common.py +0 -0
  167. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/gateway/impl/http_tunnel.py +0 -0
  168. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/gateway/impl/ssh_tunnel.py +0 -0
  169. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/gateway/impl/types.py +0 -0
  170. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/job/__init__.py +0 -0
  171. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/job/impl/__init__.py +0 -0
  172. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/job/impl/action.py +0 -0
  173. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/job/impl/common.py +0 -0
  174. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/job/impl/delay.py +0 -0
  175. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/job/impl/types.py +0 -0
  176. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/job/job.py +0 -0
  177. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/listener/__init__.py +0 -0
  178. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/listener/impl/__init__.py +0 -0
  179. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/listener/impl/common.py +0 -0
  180. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/listener/impl/http_callback.py +0 -0
  181. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/listener/impl/types.py +0 -0
  182. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/listener/listener.py +0 -0
  183. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/logger/__init__.py +0 -0
  184. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/logger/impl/__init__.py +0 -0
  185. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/logger/impl/common.py +0 -0
  186. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/logger/impl/console.py +0 -0
  187. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/logger/impl/file.py +0 -0
  188. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/logger/impl/types.py +0 -0
  189. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/logger/logger.py +0 -0
  190. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/schema/runtime/__init__.py +0 -0
  191. {model_compose-0.2.12 → model_compose-0.3.0}/src/mindor/dsl/utils/annotation.py +0 -0
  192. {model_compose-0.2.12 → model_compose-0.3.0}/src/model_compose.egg-info/dependency_links.txt +0 -0
  193. {model_compose-0.2.12 → model_compose-0.3.0}/src/model_compose.egg-info/entry_points.txt +0 -0
  194. {model_compose-0.2.12 → model_compose-0.3.0}/src/model_compose.egg-info/top_level.txt +0 -0
  195. {model_compose-0.2.12 → model_compose-0.3.0}/tests/test_cli.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: model-compose
3
- Version: 0.2.12
3
+ Version: 0.3.0
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
@@ -24,6 +24,7 @@ Requires-Dist: transformers>=4.21.0
24
24
  Requires-Dist: torch
25
25
  Requires-Dist: sentencepiece
26
26
  Requires-Dist: accelerate
27
+ Requires-Dist: docker
27
28
  Dynamic: license-file
28
29
 
29
30
  # model-compose: Declarative AI Model and Workflow Orchestrator
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "model-compose"
3
- version = "0.2.12"
3
+ version = "0.3.0"
4
4
  description = "model-compose: Declarative AI Model and Workflow Orchestrator"
5
5
  authors = [
6
6
  { name = "Hanyeol Cho", email = "hanyeol.cho@gmail.com" }
@@ -24,7 +24,8 @@ dependencies = [
24
24
  "transformers>=4.21.0",
25
25
  "torch",
26
26
  "sentencepiece",
27
- "accelerate"
27
+ "accelerate",
28
+ "docker"
28
29
  ]
29
30
 
30
31
  [project.scripts]
@@ -39,6 +40,10 @@ build-backend = "setuptools.build_meta"
39
40
 
40
41
  [tool.setuptools]
41
42
  package-dir = { "" = "src" }
43
+ include-package-data = true
42
44
 
43
45
  [tool.setuptools.packages.find]
44
46
  where = ["src"]
47
+
48
+ [tool.setuptools.package-data]
49
+ "mindor.core.controller.runtime.docker" = ["context/*"]
@@ -61,18 +61,20 @@ def up_command(
61
61
  "--env", "-e", "env_data", multiple=True,
62
62
  help="Environment variable in the form KEY=VALUE. Repeatable.",
63
63
  )
64
+ @click.option("--verbose", "-v", is_flag=True, help="Enable verbose output.")
64
65
  @click.pass_context
65
66
  def down_command(
66
67
  ctx: click.Context,
67
68
  env_files: List[Path],
68
69
  env_data: List[str],
70
+ verbose: bool
69
71
  ) -> None:
70
72
  config_files = ctx.obj.get("config_files", [])
71
73
  async def _async_command():
72
74
  try:
73
75
  env = load_env_files(".", env_files or [])
74
76
  config = load_compose_config(".", config_files, env)
75
- await shutdown_services(config)
77
+ await terminate_services(config, verbose)
76
78
  except Exception as e:
77
79
  click.echo(f"❌ {e}", err=True)
78
80
  asyncio.run(_async_command())
@@ -117,18 +119,20 @@ def start_command(
117
119
  "--env", "-e", "env_data", multiple=True,
118
120
  help="Environment variable in the form KEY=VALUE. Repeatable.",
119
121
  )
122
+ @click.option("--verbose", "-v", is_flag=True, help="Enable verbose output.")
120
123
  @click.pass_context
121
124
  def stop_command(
122
125
  ctx: click.Context,
123
126
  env_files: List[Path],
124
127
  env_data: List[str],
128
+ verbose: bool
125
129
  ) -> None:
126
130
  config_files = ctx.obj.get("config_files", [])
127
131
  async def _async_command():
128
132
  try:
129
133
  env = load_env_files(".", env_files or [])
130
134
  config = load_compose_config(".", config_files, env)
131
- await stop_services(config)
135
+ await stop_services(config, verbose)
132
136
  except Exception as e:
133
137
  click.echo(f"❌ {e}", err=True)
134
138
  asyncio.run(_async_command())
@@ -184,3 +188,6 @@ compose_command.add_command(down_command)
184
188
  compose_command.add_command(start_command)
185
189
  compose_command.add_command(stop_command)
186
190
  compose_command.add_command(run_command)
191
+
192
+ if __name__ == "__main__":
193
+ compose_command()
@@ -5,14 +5,14 @@ from .manager import ComposeManager, TaskState
5
5
  async def launch_services(config: ComposeConfig, detach: bool, verbose: bool):
6
6
  await ComposeManager(config, daemon=True).launch_services(detach, verbose)
7
7
 
8
- async def shutdown_services(config: ComposeConfig):
9
- await ComposeManager(config, daemon=False).shutdown_services()
8
+ async def terminate_services(config: ComposeConfig, verbose: bool):
9
+ await ComposeManager(config, daemon=False).terminate_services(verbose)
10
10
 
11
11
  async def start_services(config: ComposeConfig, verbose: bool):
12
12
  await ComposeManager(config, daemon=False).start_services(verbose)
13
13
 
14
- async def stop_services(config: ComposeConfig):
15
- await ComposeManager(config, daemon=False).stop_services()
14
+ async def stop_services(config: ComposeConfig, verbose: bool):
15
+ await ComposeManager(config, daemon=False).stop_services(verbose)
16
16
 
17
17
  async def run_workflow(config: ComposeConfig, workflow_id: Optional[str], input: Dict[str, Any], verbose: bool) -> TaskState:
18
18
  return await ComposeManager(config, daemon=False).run_workflow(workflow_id, input, verbose)
@@ -16,17 +16,15 @@ class ComposeManager:
16
16
  )
17
17
 
18
18
  async def launch_services(self, detach: bool, verbose: bool):
19
- await self.controller.start()
20
- await self.controller.wait_until_stopped()
19
+ await self.controller.launch(detach, verbose)
21
20
 
22
- async def shutdown_services(self):
23
- await self.controller.stop()
21
+ async def terminate_services(self, verbose: bool):
22
+ await self.controller.terminate(verbose)
24
23
 
25
24
  async def start_services(self, verbose: bool):
26
25
  await self.controller.start()
27
- await self.controller.wait_until_stopped()
28
26
 
29
- async def stop_services(self):
27
+ async def stop_services(self, verbose: bool):
30
28
  await self.controller.stop()
31
29
 
32
30
  async def run_workflow(self, workflow_id: Optional[str], input: Dict[str, Any], verbose: bool) -> TaskState:
@@ -1,12 +1,14 @@
1
1
  from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Any
2
2
  from enum import Enum
3
3
  from dataclasses import dataclass
4
+ from pydantic import BaseModel
4
5
  from mindor.dsl.schema.controller import ControllerConfig, ControllerType
5
6
  from mindor.dsl.schema.component import ComponentConfig
6
7
  from mindor.dsl.schema.listener import ListenerConfig
7
8
  from mindor.dsl.schema.gateway import GatewayConfig
8
- from mindor.dsl.schema.logger import LoggerConfig, LoggerType, ConsoleLoggerConfig
9
9
  from mindor.dsl.schema.workflow import WorkflowConfig
10
+ from mindor.dsl.schema.runtime import RuntimeType, DockerBuildConfig
11
+ from mindor.dsl.schema.logger import LoggerConfig, LoggerType, ConsoleLoggerConfig
10
12
  from mindor.core.services import AsyncService
11
13
  from mindor.core.component import ComponentService, ComponentGlobalConfigs, create_component
12
14
  from mindor.core.listener import ListenerService, create_listener
@@ -16,6 +18,8 @@ from mindor.core.logger import LoggerService, create_logger
16
18
  from mindor.core.controller.webui import ControllerWebUI
17
19
  from mindor.core.utils.workqueue import WorkQueue
18
20
  from mindor.core.utils.expiring import ExpiringDict
21
+ from .runtime.specs import ControllerRuntimeSpecs
22
+ from .runtime.docker import DockerRuntimeLauncher
19
23
  from threading import Lock
20
24
  import asyncio, ulid
21
25
 
@@ -58,6 +62,29 @@ class ControllerService(AsyncService):
58
62
  if self.config.max_concurrent_count > 0:
59
63
  self.queue = WorkQueue(self.config.max_concurrent_count, self._run_workflow)
60
64
 
65
+ async def launch(self, detach: bool, verbose: bool) -> None:
66
+ if self.config.runtime.type == RuntimeType.NATIVE:
67
+ if detach:
68
+ pass
69
+ await self.start()
70
+ await self.wait_until_stopped()
71
+ return
72
+
73
+ if self.config.runtime.type == RuntimeType.DOCKER:
74
+ await self._start_loggers()
75
+ await DockerRuntimeLauncher(self.config, verbose).launch(self._get_runtime_specs(), detach)
76
+ return
77
+
78
+ async def terminate(self, verbose: bool) -> None:
79
+ if self.config.runtime.type == RuntimeType.NATIVE:
80
+ await self.stop()
81
+ return
82
+
83
+ if self.config.runtime.type == RuntimeType.DOCKER:
84
+ await self._start_loggers()
85
+ await DockerRuntimeLauncher(self.config, verbose).terminate()
86
+ return
87
+
61
88
  async def run_workflow(self, workflow_id: Optional[str], input: Dict[str, Any], wait_for_completion: bool = True) -> TaskState:
62
89
  task_id = ulid.ulid()
63
90
  state = TaskState(task_id=task_id, status=TaskStatus.PENDING)
@@ -138,23 +165,6 @@ class ControllerService(AsyncService):
138
165
  async def _stop_webui(self) -> None:
139
166
  await asyncio.gather(*[ self._create_webui().stop() ])
140
167
 
141
- async def _run_workflow(self, task_id: str, workflow_id: Optional[str], input: Dict[str, Any]) -> TaskState:
142
- state = TaskState(task_id=task_id, status=TaskStatus.PROCESSING)
143
- with self.task_states_lock:
144
- self.task_states.set(task_id, state)
145
-
146
- try:
147
- workflow = self._create_workflow(workflow_id)
148
- output = await workflow.run(task_id, input)
149
- state = TaskState(task_id=task_id, status=TaskStatus.COMPLETED, output=output)
150
- except Exception as e:
151
- state = TaskState(task_id=task_id, status=TaskStatus.FAILED, error=str(e))
152
-
153
- with self.task_states_lock:
154
- self.task_states.set(task_id, state, 1 * 3600)
155
-
156
- return state
157
-
158
168
  def _create_listeners(self) -> List[ListenerService]:
159
169
  return [ create_listener(f"listener-{index}", config, self.daemon) for index, config in enumerate(self.listeners) ]
160
170
 
@@ -175,12 +185,32 @@ class ControllerService(AsyncService):
175
185
  global_configs = self._get_component_global_configs()
176
186
  return create_workflow(*WorkflowResolver(self.workflows).resolve(workflow_id), global_configs)
177
187
 
188
+ def _get_runtime_specs(self) -> ControllerRuntimeSpecs:
189
+ return ControllerRuntimeSpecs(self.config, self.components, self.listeners, self.gateways, self.workflows)
190
+
178
191
  def _get_component_global_configs(self) -> ComponentGlobalConfigs:
179
192
  return ComponentGlobalConfigs(self.components, self.listeners, self.gateways, self.workflows)
180
193
 
181
194
  def _get_default_logger_config(self) -> LoggerConfig:
182
195
  return ConsoleLoggerConfig(type=LoggerType.CONSOLE)
183
196
 
197
+ async def _run_workflow(self, task_id: str, workflow_id: Optional[str], input: Dict[str, Any]) -> TaskState:
198
+ state = TaskState(task_id=task_id, status=TaskStatus.PROCESSING)
199
+ with self.task_states_lock:
200
+ self.task_states.set(task_id, state)
201
+
202
+ try:
203
+ workflow = self._create_workflow(workflow_id)
204
+ output = await workflow.run(task_id, input)
205
+ state = TaskState(task_id=task_id, status=TaskStatus.COMPLETED, output=output)
206
+ except Exception as e:
207
+ state = TaskState(task_id=task_id, status=TaskStatus.FAILED, error=str(e))
208
+
209
+ with self.task_states_lock:
210
+ self.task_states.set(task_id, state, 1 * 3600)
211
+
212
+ return state
213
+
184
214
  def register_controller(type: ControllerType):
185
215
  def decorator(cls: Type[ControllerService]) -> Type[ControllerService]:
186
216
  ControllerRegistry[type] = cls
@@ -0,0 +1 @@
1
+ from .docker import *
@@ -0,0 +1,42 @@
1
+ FROM ubuntu:22.04
2
+
3
+ WORKDIR /app
4
+
5
+ RUN apt update && apt install -y \
6
+ python3.11 \
7
+ python3.11-venv \
8
+ python3-pip \
9
+ gcc \
10
+ && rm -rf /var/lib/apt/lists/*
11
+
12
+ RUN ln -sf /usr/bin/python3.11 /usr/bin/python && \
13
+ ln -sf /usr/bin/python3.11 /usr/bin/python3
14
+
15
+ RUN python -m pip install --upgrade pip
16
+ RUN pip install --no-cache-dir \
17
+ click \
18
+ pyyaml \
19
+ pydantic \
20
+ python-dotenv \
21
+ aiohttp \
22
+ requests \
23
+ fastapi \
24
+ uvicorn \
25
+ 'mcp>=1.10.1' \
26
+ pyngrok \
27
+ ulid \
28
+ gradio \
29
+ Pillow \
30
+ 'transformers>=4.21.0' \
31
+ torch \
32
+ sentencepiece \
33
+ accelerate \
34
+ docker
35
+
36
+ COPY requirements.txt .
37
+ RUN pip install --no-cache-dir -r requirements.txt
38
+
39
+ COPY src .
40
+ COPY model-compose.yml .
41
+
42
+ CMD [ "python", "-m", "mindor.cli.compose", "up" ]
@@ -0,0 +1,102 @@
1
+ from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Any
2
+ from mindor.dsl.schema.controller import ControllerConfig
3
+ from mindor.dsl.schema.runtime import DockerRuntimeConfig, DockerBuildConfig, DockerPortConfig, DockerVolumeConfig, DockerHealthCheck
4
+ from mindor.core.runtime.docker import DockerRuntimeManager
5
+ from mindor.core.logger import logging
6
+ from ..specs import ControllerRuntimeSpecs
7
+ from pathlib import Path
8
+ import mindor, shutil, yaml
9
+
10
+ class DockerRuntimeLauncher:
11
+ def __init__(self, config: ControllerConfig, verbose: bool):
12
+ self.config: ControllerConfig = config
13
+ self.verbose: bool = verbose
14
+
15
+ self._configure_runtime_config()
16
+
17
+ def _configure_runtime_config(self):
18
+ if not self.config.runtime.image:
19
+ if not self.config.runtime.build:
20
+ self.config.runtime.build = DockerBuildConfig(context=".docker", dockerfile="Dockerfile")
21
+ self.config.runtime.image = f"mindor/controller-{self.config.port}:latest"
22
+
23
+ if not self.config.runtime.container_name:
24
+ self.config.runtime.container_name = self.config.name or f"mindor-controller-{self.config.port}"
25
+
26
+ if not self.config.runtime.ports:
27
+ self.config.runtime.ports = [ port for port in [ self.config.port, getattr(self.config.webui, "port", None) ] if port ]
28
+
29
+ async def launch(self, specs: ControllerRuntimeSpecs, detach: bool):
30
+ docker = DockerRuntimeManager(self.config.runtime, self.verbose)
31
+
32
+ await self._prepare_docker_context(specs)
33
+
34
+ if not await docker.exists_image():
35
+ logging.debug("Checking if Docker image can be pulled...")
36
+ try:
37
+ await docker.pull_image()
38
+ except Exception as e:
39
+ logging.debug("Docker image pull failed: %s — will try building instead.", e)
40
+ else:
41
+ if not await docker.exists_image():
42
+ raise RuntimeError("Docker image pull completed, but image is still missing.")
43
+ logging.info("Docker image pulled successfully.")
44
+
45
+ if not await docker.exists_image():
46
+ logging.debug("Building Docker image locally. This may take a few minutes...")
47
+ try:
48
+ await docker.build_image()
49
+ logging.info("Docker image build completed successfully.")
50
+ except Exception as e:
51
+ logging.error("Docker image build failed: %s", e)
52
+ raise
53
+
54
+ if await docker.is_container_running():
55
+ logging.info("Stopping running Docker container before restarting...")
56
+ await docker.stop_container()
57
+
58
+ logging.info("Starting Docker container (%s mode)...", "detached" if detach else "foreground")
59
+ await docker.start_container(detach)
60
+
61
+ async def terminate(self):
62
+ docker = DockerRuntimeManager(self.config.runtime, self.verbose)
63
+
64
+ if await docker.exists_container():
65
+ await docker.remove_container(force=True)
66
+
67
+ if await docker.exists_image():
68
+ await docker.remove_image()
69
+
70
+ async def _prepare_docker_context(self, specs: ControllerRuntimeSpecs) -> None:
71
+ # Prepare context directory
72
+ context_dir = Path.cwd() / ".docker"
73
+ if context_dir.exists():
74
+ shutil.rmtree(context_dir)
75
+
76
+ # Copy context files
77
+ context_files_root = Path(__file__).resolve().parent / "context"
78
+ shutil.copytree(
79
+ src=str(context_files_root),
80
+ dst=context_dir
81
+ )
82
+
83
+ # Copy source files
84
+ source_files_root = Path(mindor.__file__).resolve().parent
85
+ target_dir = context_dir / "src" / source_files_root.name
86
+ shutil.copytree(
87
+ src=str(source_files_root),
88
+ dst=target_dir,
89
+ ignore=shutil.ignore_patterns("__pycache__", "*.pyc")
90
+ )
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
+ # Copy or generate requirements.txt
97
+ file_path = Path.cwd() / "requirements.txt"
98
+ target_path = Path(context_dir) / file_path.name
99
+ if file_path.exists():
100
+ shutil.copy(file_path, target_path)
101
+ else:
102
+ target_path.touch()
@@ -0,0 +1,40 @@
1
+ from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Callable, Any
2
+ from abc import ABC, abstractmethod
3
+ from mindor.dsl.schema.controller import ControllerConfig
4
+ from mindor.dsl.schema.component import ComponentConfig
5
+ from mindor.dsl.schema.listener import ListenerConfig
6
+ from mindor.dsl.schema.gateway import GatewayConfig
7
+ from mindor.dsl.schema.workflow import WorkflowConfig
8
+ from mindor.dsl.utils.enum import enum_union_to_str
9
+
10
+ class ControllerRuntimeSpecs:
11
+ def __init__(
12
+ self,
13
+ controller: ControllerConfig,
14
+ components: Dict[str, ComponentConfig],
15
+ listeners: List[ListenerConfig],
16
+ gateways: List[GatewayConfig],
17
+ workflows: Dict[str, WorkflowConfig]
18
+ ):
19
+ self.controller: ControllerConfig = controller
20
+ self.components: Dict[str, ComponentConfig] = components
21
+ self.listeners: List[ListenerConfig] = listeners
22
+ self.gateways: List[GatewayConfig] = gateways
23
+ self.workflows: Dict[str, WorkflowConfig] = workflows
24
+
25
+ def generate_native_runtime_specs(self) -> Dict[str, Any]:
26
+ specs: Dict[str, Any] = {}
27
+
28
+ specs["controller"] = self.controller.model_dump()
29
+ specs["controller"]["runtime"] = "native"
30
+
31
+ specs["components"] = {}
32
+ for id, component in self.components.items():
33
+ specs["components"][id] = component.model_dump()
34
+ specs["components"][id]["runtime"] = "native"
35
+
36
+ specs["listeners"] = [ listener.model_dump() for listener in self.listeners ]
37
+ specs["gateways" ] = [ gateway.model_dump() for gateway in self.gateways ]
38
+ specs["workflows"] = { id: workflow.model_dump() for id, workflow in self.workflows.items() }
39
+
40
+ return enum_union_to_str(specs)
@@ -2,7 +2,7 @@ from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annot
2
2
  from mindor.dsl.schema.logger import ConsoleLoggerConfig
3
3
  from ..base import LoggerService, LoggerType, LoggingLevel, register_logger
4
4
  from uvicorn.logging import ColourizedFormatter
5
- import logging
5
+ import logging, sys
6
6
 
7
7
  _level_map = {
8
8
  LoggingLevel.DEBUG: logging.DEBUG,
@@ -0,0 +1 @@
1
+ from .docker import *