model-compose 0.4.0__tar.gz → 0.4.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 (255) hide show
  1. {model_compose-0.4.0 → model_compose-0.4.2}/PKG-INFO +15 -15
  2. {model_compose-0.4.0 → model_compose-0.4.2}/README.md +14 -14
  3. {model_compose-0.4.0 → model_compose-0.4.2}/pyproject.toml +1 -1
  4. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/cli/compose.py +1 -1
  5. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/component/base.py +12 -17
  6. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/component/component.py +12 -17
  7. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/component/services/http_server.py +1 -1
  8. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/component/services/workflow.py +2 -3
  9. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/compose/compose.py +1 -1
  10. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/compose/manager.py +1 -1
  11. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/controller/base.py +3 -3
  12. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/controller/runner/http_client.py +2 -1
  13. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/controller/services/http_server.py +2 -2
  14. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/listener/services/http_callback.py +1 -1
  15. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/workflow/job/impl/action.py +2 -2
  16. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/workflow/schema.py +12 -14
  17. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/workflow/workflow.py +11 -16
  18. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/common.py +8 -1
  19. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/mcp_client.py +1 -1
  20. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/mcp_server.py +1 -1
  21. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/common.py +8 -1
  22. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/compose.py +1 -1
  23. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/job/impl/common.py +8 -2
  24. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/workflow.py +7 -1
  25. {model_compose-0.4.0 → model_compose-0.4.2}/src/model_compose.egg-info/PKG-INFO +15 -15
  26. {model_compose-0.4.0 → model_compose-0.4.2}/LICENSE +0 -0
  27. {model_compose-0.4.0 → model_compose-0.4.2}/setup.cfg +0 -0
  28. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/__init__.py +0 -0
  29. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/cli/__init__.py +0 -0
  30. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/__init__.py +0 -0
  31. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/component/__init__.py +0 -0
  32. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/component/context.py +0 -0
  33. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/component/services/__init__.py +0 -0
  34. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/component/services/http_client.py +0 -0
  35. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/component/services/mcp_client.py +0 -0
  36. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/component/services/mcp_server.py +0 -0
  37. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/component/services/model/__init__.py +0 -0
  38. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/component/services/model/base.py +0 -0
  39. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/component/services/model/loader.py +0 -0
  40. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/component/services/model/model.py +0 -0
  41. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/component/services/model/tasks/__init__.py +0 -0
  42. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/component/services/model/tasks/image_to_text.py +0 -0
  43. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/component/services/model/tasks/summarization.py +0 -0
  44. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/component/services/model/tasks/text_classification.py +0 -0
  45. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/component/services/model/tasks/text_embedding.py +0 -0
  46. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/component/services/model/tasks/text_generation.py +0 -0
  47. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/component/services/model/tasks/translation.py +0 -0
  48. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/component/services/shell.py +0 -0
  49. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/component/services/text_splitter.py +0 -0
  50. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/component/services/vector_store/__init__.py +0 -0
  51. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/component/services/vector_store/base.py +0 -0
  52. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/component/services/vector_store/drivers/__init__.py +0 -0
  53. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/component/services/vector_store/drivers/chroma.py +0 -0
  54. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/component/services/vector_store/drivers/milvus.py +0 -0
  55. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/component/services/vector_store/vector_store.py +0 -0
  56. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/compose/__init__.py +0 -0
  57. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/controller/__init__.py +0 -0
  58. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/controller/controller.py +0 -0
  59. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/controller/runner/__init__.py +0 -0
  60. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/controller/runner/client.py +0 -0
  61. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/controller/runner/mcp_client.py +0 -0
  62. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/controller/runner/runner.py +0 -0
  63. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/controller/runtime/__init__.py +0 -0
  64. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/controller/runtime/docker/__init__.py +0 -0
  65. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/controller/runtime/docker/context/Dockerfile +0 -0
  66. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/controller/runtime/docker/docker.py +0 -0
  67. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/controller/runtime/native/__init__.py +0 -0
  68. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/controller/runtime/native/native.py +0 -0
  69. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/controller/runtime/specs.py +0 -0
  70. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/controller/services/__init__.py +0 -0
  71. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/controller/services/mcp_server.py +0 -0
  72. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/controller/webui/__init__.py +0 -0
  73. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/controller/webui/gradio.py +0 -0
  74. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/controller/webui/webui.py +0 -0
  75. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/gateway/__init__.py +0 -0
  76. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/gateway/base.py +0 -0
  77. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/gateway/gateway.py +0 -0
  78. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/gateway/services/__init__.py +0 -0
  79. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/gateway/services/http_tunnel.py +0 -0
  80. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/gateway/services/ssh_tunnel.py +0 -0
  81. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/listener/__init__.py +0 -0
  82. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/listener/base.py +0 -0
  83. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/listener/listener.py +0 -0
  84. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/listener/services/__init__.py +0 -0
  85. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/logger/__init__.py +0 -0
  86. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/logger/base.py +0 -0
  87. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/logger/logger.py +0 -0
  88. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/logger/logging.py +0 -0
  89. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/logger/services/__init__.py +0 -0
  90. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/logger/services/console.py +0 -0
  91. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/logger/services/file.py +0 -0
  92. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/runtime/__init__.py +0 -0
  93. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/runtime/docker/__init__.py +0 -0
  94. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/runtime/docker/docker.py +0 -0
  95. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/runtime/env.py +0 -0
  96. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/services/__init__.py +0 -0
  97. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/services/async_service.py +0 -0
  98. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/utils/__init__.py +0 -0
  99. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/utils/caching.py +0 -0
  100. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/utils/http_client.py +0 -0
  101. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/utils/http_request.py +0 -0
  102. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/utils/http_response.py +0 -0
  103. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/utils/http_status.py +0 -0
  104. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/utils/image.py +0 -0
  105. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/utils/mcp_client.py +0 -0
  106. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/utils/package.py +0 -0
  107. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/utils/renderers.py +0 -0
  108. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/utils/resolvers.py +0 -0
  109. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/utils/shell.py +0 -0
  110. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/utils/ssh_client.py +0 -0
  111. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/utils/streamer.py +0 -0
  112. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/utils/streaming.py +0 -0
  113. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/utils/time.py +0 -0
  114. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/utils/workqueue.py +0 -0
  115. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/workflow/__init__.py +0 -0
  116. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/workflow/context.py +0 -0
  117. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/workflow/job/__init__.py +0 -0
  118. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/workflow/job/base.py +0 -0
  119. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/workflow/job/impl/__init__.py +0 -0
  120. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/workflow/job/impl/delay.py +0 -0
  121. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/workflow/job/impl/filter.py +0 -0
  122. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/workflow/job/impl/if_.py +0 -0
  123. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/workflow/job/impl/random_router.py +0 -0
  124. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/workflow/job/impl/switch.py +0 -0
  125. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/core/workflow/job/job.py +0 -0
  126. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/__init__.py +0 -0
  127. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/loader.py +0 -0
  128. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/__init__.py +0 -0
  129. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/action/__init__.py +0 -0
  130. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/action/action.py +0 -0
  131. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/__init__.py +0 -0
  132. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/http_client.py +0 -0
  133. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/http_server.py +0 -0
  134. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/model/__init__.py +0 -0
  135. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/model/impl/__init__.py +0 -0
  136. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/model/impl/chat_completion.py +0 -0
  137. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/model/impl/common.py +0 -0
  138. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/model/impl/image_to_text.py +0 -0
  139. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/model/impl/summarization.py +0 -0
  140. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/model/impl/text_classification.py +0 -0
  141. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/model/impl/text_embedding.py +0 -0
  142. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/model/impl/text_generation.py +0 -0
  143. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/model/impl/translation.py +0 -0
  144. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/model/model.py +0 -0
  145. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/shell.py +0 -0
  146. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/text_splitter.py +0 -0
  147. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/vector_store/__init__.py +0 -0
  148. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/vector_store/impl/__init__.py +0 -0
  149. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/vector_store/impl/chroma.py +0 -0
  150. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/vector_store/impl/common.py +0 -0
  151. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/vector_store/impl/faiss.py +0 -0
  152. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/vector_store/impl/milvus.py +0 -0
  153. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/vector_store/impl/qdrant.py +0 -0
  154. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/vector_store/vector_store.py +0 -0
  155. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/action/impl/workflow.py +0 -0
  156. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/component/__init__.py +0 -0
  157. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/component/component.py +0 -0
  158. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/__init__.py +0 -0
  159. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/http_client.py +0 -0
  160. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/http_server.py +0 -0
  161. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/mcp_client.py +0 -0
  162. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/mcp_server.py +0 -0
  163. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/model/__init__.py +0 -0
  164. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/model/impl/__init__.py +0 -0
  165. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/model/impl/chat_completion.py +0 -0
  166. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/model/impl/common.py +0 -0
  167. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/model/impl/image_to_text.py +0 -0
  168. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/model/impl/summarization.py +0 -0
  169. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/model/impl/text_classification.py +0 -0
  170. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/model/impl/text_embedding.py +0 -0
  171. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/model/impl/text_generation.py +0 -0
  172. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/model/impl/translation.py +0 -0
  173. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/model/impl/types.py +0 -0
  174. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/model/model.py +0 -0
  175. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/shell.py +0 -0
  176. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/text_splitter.py +0 -0
  177. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/types.py +0 -0
  178. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/vector_store/__init__.py +0 -0
  179. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/vector_store/impl/__init__.py +0 -0
  180. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/vector_store/impl/chroma.py +0 -0
  181. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/vector_store/impl/common.py +0 -0
  182. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/vector_store/impl/faiss.py +0 -0
  183. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/vector_store/impl/milvus.py +0 -0
  184. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/vector_store/impl/qdrant.py +0 -0
  185. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/vector_store/impl/types.py +0 -0
  186. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/vector_store/vector_store.py +0 -0
  187. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/component/impl/workflow.py +0 -0
  188. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/controller/__init__.py +0 -0
  189. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/controller/controller.py +0 -0
  190. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/controller/impl/__init__.py +0 -0
  191. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/controller/impl/common.py +0 -0
  192. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/controller/impl/http_server.py +0 -0
  193. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/controller/impl/mcp_server.py +0 -0
  194. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/controller/impl/types.py +0 -0
  195. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/controller/webui/__init__.py +0 -0
  196. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/controller/webui/impl/__init__.py +0 -0
  197. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/controller/webui/impl/common.py +0 -0
  198. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/controller/webui/impl/dynamic.py +0 -0
  199. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/controller/webui/impl/gradio.py +0 -0
  200. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/controller/webui/impl/static.py +0 -0
  201. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/controller/webui/webui.py +0 -0
  202. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/gateway/__init__.py +0 -0
  203. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/gateway/gateway.py +0 -0
  204. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/gateway/impl/__init__.py +0 -0
  205. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/gateway/impl/common.py +0 -0
  206. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/gateway/impl/http_tunnel/__init__.py +0 -0
  207. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/gateway/impl/http_tunnel/http_tunnel.py +0 -0
  208. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/__init__.py +0 -0
  209. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/cloudflare.py +0 -0
  210. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/common.py +0 -0
  211. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/ngrok.py +0 -0
  212. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/gateway/impl/ssh_tunnel.py +0 -0
  213. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/gateway/impl/types.py +0 -0
  214. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/job/__init__.py +0 -0
  215. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/job/impl/__init__.py +0 -0
  216. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/job/impl/action.py +0 -0
  217. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/job/impl/delay.py +0 -0
  218. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/job/impl/filter.py +0 -0
  219. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/job/impl/if_.py +0 -0
  220. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/job/impl/random_router.py +0 -0
  221. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/job/impl/switch.py +0 -0
  222. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/job/impl/types.py +0 -0
  223. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/job/job.py +0 -0
  224. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/listener/__init__.py +0 -0
  225. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/listener/impl/__init__.py +0 -0
  226. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/listener/impl/common.py +0 -0
  227. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/listener/impl/http_callback.py +0 -0
  228. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/listener/impl/types.py +0 -0
  229. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/listener/listener.py +0 -0
  230. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/logger/__init__.py +0 -0
  231. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/logger/impl/__init__.py +0 -0
  232. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/logger/impl/common.py +0 -0
  233. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/logger/impl/console.py +0 -0
  234. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/logger/impl/file.py +0 -0
  235. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/logger/impl/types.py +0 -0
  236. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/logger/logger.py +0 -0
  237. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/runtime/__init__.py +0 -0
  238. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/runtime/impl/__init__.py +0 -0
  239. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/runtime/impl/common.py +0 -0
  240. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/runtime/impl/docker.py +0 -0
  241. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/runtime/impl/native.py +0 -0
  242. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/runtime/impl/types.py +0 -0
  243. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/runtime/runtime.py +0 -0
  244. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/transport/__init__.py +0 -0
  245. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/transport/http.py +0 -0
  246. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/schema/transport/ssh.py +0 -0
  247. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/utils/__init__.py +0 -0
  248. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/utils/annotation.py +0 -0
  249. {model_compose-0.4.0 → model_compose-0.4.2}/src/mindor/dsl/utils/enum.py +0 -0
  250. {model_compose-0.4.0 → model_compose-0.4.2}/src/model_compose.egg-info/SOURCES.txt +0 -0
  251. {model_compose-0.4.0 → model_compose-0.4.2}/src/model_compose.egg-info/dependency_links.txt +0 -0
  252. {model_compose-0.4.0 → model_compose-0.4.2}/src/model_compose.egg-info/entry_points.txt +0 -0
  253. {model_compose-0.4.0 → model_compose-0.4.2}/src/model_compose.egg-info/requires.txt +0 -0
  254. {model_compose-0.4.0 → model_compose-0.4.2}/src/model_compose.egg-info/top_level.txt +0 -0
  255. {model_compose-0.4.0 → model_compose-0.4.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.4.0
3
+ Version: 0.4.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
@@ -153,7 +153,7 @@ By default, `model-compose` automatically looks for a file named `model-compose.
153
153
 
154
154
  #### 🧪 Minimal Example (with Components and Workflows)
155
155
 
156
- ```yaml
156
+ ```
157
157
  controller:
158
158
  type: http-server
159
159
  port: 8080
@@ -174,7 +174,7 @@ components:
174
174
  model: gpt-4o
175
175
  messages:
176
176
  - role: user
177
- content: Write an inspiring quote.
177
+ content: "Write an inspiring quote."
178
178
  output:
179
179
  quote: ${response.choices[0].message.content}
180
180
 
@@ -197,7 +197,7 @@ You can easily expand this example by adding more components (e.g., text-to-spee
197
197
 
198
198
  #### 📡 Listener Example
199
199
 
200
- ```yaml
200
+ ```
201
201
  listener:
202
202
  type: http-callback
203
203
  port: 8090
@@ -214,7 +214,7 @@ This listener sets up an HTTP callback endpoint at `http://localhost:8090/callba
214
214
 
215
215
  #### 🌐 Gateway Example
216
216
 
217
- ```yaml
217
+ ```
218
218
  gateway:
219
219
  type: http-tunnel
220
220
  driver: ngrok
@@ -233,7 +233,7 @@ This gateway configuration exposes the local listener defined above to the publi
233
233
 
234
234
  #### ✅ Enabling the Web UI
235
235
  To enable the Web UI, simply add the `webui` section under your `controller` in the `model-compose.yml` file:
236
- ```yaml
236
+ ```
237
237
  controller:
238
238
  type: http-server
239
239
  port: 8080
@@ -253,7 +253,7 @@ By default, `model-compose` uses [Gradio](https://www.gradio.app) as the interac
253
253
 
254
254
  Here’s how you can do it:
255
255
 
256
- ```yaml
256
+ ```
257
257
  controller:
258
258
  type: http-server
259
259
  port: 8080
@@ -292,7 +292,7 @@ You can also expose your workflows via the **Model Context Protocol (MCP)** serv
292
292
 
293
293
  #### ✅ Minimal MCP Server Example
294
294
 
295
- ```yaml
295
+ ```
296
296
  controller:
297
297
  type: mcp-server
298
298
  port: 8080
@@ -311,7 +311,7 @@ components:
311
311
  model: gpt-4o
312
312
  messages:
313
313
  - role: user
314
- content: Write an inspiring quote.
314
+ content: "Write an inspiring quote."
315
315
  output:
316
316
  quote: ${response.choices[0].message.content}
317
317
 
@@ -326,7 +326,7 @@ This configuration launches the controller as an **MCP server**, which listens o
326
326
 
327
327
  Once running, you can invoke workflows remotely using a standard MCP request:
328
328
 
329
- ```json
329
+ ```
330
330
  {
331
331
  "jsonrpc": "2.0",
332
332
  "id": 1,
@@ -349,7 +349,7 @@ You can run the workflow controller inside a Docker container by specifying the
349
349
 
350
350
  #### ✅ Minimal Docker Runtime Example
351
351
 
352
- ```yaml
352
+ ```
353
353
  controller:
354
354
  type: http-server
355
355
  port: 8080
@@ -361,7 +361,7 @@ This configuration will launch the controller inside a lightweight Docker contai
361
361
  #### ⚙️ Advanced Docker Runtime Options
362
362
  You can fully configure the Docker runtime by using an object under the `runtime` key:
363
363
 
364
- ```yaml
364
+ ```
365
365
  controller:
366
366
  type: http-server
367
367
  port: 8080
@@ -373,11 +373,11 @@ controller:
373
373
  - ./models:/models
374
374
  - ./cache:/cache
375
375
  ports:
376
- - 5000:8080
377
- - 5001:8081
376
+ - "5000:8080"
377
+ - "5001:8081"
378
378
  env:
379
379
  MODEL_STORAGE_PATH: /models
380
- command: [python, -m, mindor.cli.compose, up]
380
+ command: [ "python", "-m", "mindor.cli.compose", "up" ]
381
381
  ...
382
382
  ```
383
383
 
@@ -128,7 +128,7 @@ By default, `model-compose` automatically looks for a file named `model-compose.
128
128
 
129
129
  #### 🧪 Minimal Example (with Components and Workflows)
130
130
 
131
- ```yaml
131
+ ```
132
132
  controller:
133
133
  type: http-server
134
134
  port: 8080
@@ -149,7 +149,7 @@ components:
149
149
  model: gpt-4o
150
150
  messages:
151
151
  - role: user
152
- content: Write an inspiring quote.
152
+ content: "Write an inspiring quote."
153
153
  output:
154
154
  quote: ${response.choices[0].message.content}
155
155
 
@@ -172,7 +172,7 @@ You can easily expand this example by adding more components (e.g., text-to-spee
172
172
 
173
173
  #### 📡 Listener Example
174
174
 
175
- ```yaml
175
+ ```
176
176
  listener:
177
177
  type: http-callback
178
178
  port: 8090
@@ -189,7 +189,7 @@ This listener sets up an HTTP callback endpoint at `http://localhost:8090/callba
189
189
 
190
190
  #### 🌐 Gateway Example
191
191
 
192
- ```yaml
192
+ ```
193
193
  gateway:
194
194
  type: http-tunnel
195
195
  driver: ngrok
@@ -208,7 +208,7 @@ This gateway configuration exposes the local listener defined above to the publi
208
208
 
209
209
  #### ✅ Enabling the Web UI
210
210
  To enable the Web UI, simply add the `webui` section under your `controller` in the `model-compose.yml` file:
211
- ```yaml
211
+ ```
212
212
  controller:
213
213
  type: http-server
214
214
  port: 8080
@@ -228,7 +228,7 @@ By default, `model-compose` uses [Gradio](https://www.gradio.app) as the interac
228
228
 
229
229
  Here’s how you can do it:
230
230
 
231
- ```yaml
231
+ ```
232
232
  controller:
233
233
  type: http-server
234
234
  port: 8080
@@ -267,7 +267,7 @@ You can also expose your workflows via the **Model Context Protocol (MCP)** serv
267
267
 
268
268
  #### ✅ Minimal MCP Server Example
269
269
 
270
- ```yaml
270
+ ```
271
271
  controller:
272
272
  type: mcp-server
273
273
  port: 8080
@@ -286,7 +286,7 @@ components:
286
286
  model: gpt-4o
287
287
  messages:
288
288
  - role: user
289
- content: Write an inspiring quote.
289
+ content: "Write an inspiring quote."
290
290
  output:
291
291
  quote: ${response.choices[0].message.content}
292
292
 
@@ -301,7 +301,7 @@ This configuration launches the controller as an **MCP server**, which listens o
301
301
 
302
302
  Once running, you can invoke workflows remotely using a standard MCP request:
303
303
 
304
- ```json
304
+ ```
305
305
  {
306
306
  "jsonrpc": "2.0",
307
307
  "id": 1,
@@ -324,7 +324,7 @@ You can run the workflow controller inside a Docker container by specifying the
324
324
 
325
325
  #### ✅ Minimal Docker Runtime Example
326
326
 
327
- ```yaml
327
+ ```
328
328
  controller:
329
329
  type: http-server
330
330
  port: 8080
@@ -336,7 +336,7 @@ This configuration will launch the controller inside a lightweight Docker contai
336
336
  #### ⚙️ Advanced Docker Runtime Options
337
337
  You can fully configure the Docker runtime by using an object under the `runtime` key:
338
338
 
339
- ```yaml
339
+ ```
340
340
  controller:
341
341
  type: http-server
342
342
  port: 8080
@@ -348,11 +348,11 @@ controller:
348
348
  - ./models:/models
349
349
  - ./cache:/cache
350
350
  ports:
351
- - 5000:8080
352
- - 5001:8081
351
+ - "5000:8080"
352
+ - "5001:8081"
353
353
  env:
354
354
  MODEL_STORAGE_PATH: /models
355
- command: [python, -m, mindor.cli.compose, up]
355
+ command: [ "python", "-m", "mindor.cli.compose", "up" ]
356
356
  ...
357
357
  ```
358
358
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "model-compose"
3
- version = "0.4.0"
3
+ version = "0.4.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" }
@@ -183,7 +183,7 @@ def run_command(
183
183
  env = merge_env_data(env, env_data)
184
184
  config = load_compose_config(".", config_files, env)
185
185
  input = json.loads(input_json) if input_json else {}
186
- state = await run_workflow(config, workflow_id, input, output_path, verbose)
186
+ state = await run_workflow(config, workflow_id or "__default__", input, output_path, verbose)
187
187
  if isinstance(state.output, (dict, list)) or state.error:
188
188
  click.echo(json.dumps(
189
189
  state.output or state.error,
@@ -15,25 +15,20 @@ class ActionResolver:
15
15
  def __init__(self, actions: List[ActionConfig]):
16
16
  self.actions: List[ActionConfig] = actions
17
17
 
18
- def resolve(self, action_id: Optional[str]) -> Tuple[str, ActionConfig]:
19
- action_id = action_id or self._find_default_id(self.actions)
20
- action = next((action for action in self.actions if action.id == action_id), None)
18
+ def resolve(self, action_id: str, raise_on_error: bool = True) -> Union[Tuple[str, ActionConfig], Tuple[None, None]]:
19
+ if action_id == "__default__":
20
+ action = self.actions[0] if len(self.actions) == 1 else None
21
+ action = action or next((action for action in self.actions if action.default), None)
22
+ else:
23
+ action = next((action for action in self.actions if action.id == action_id), None)
21
24
 
22
25
  if action is None:
23
- raise ValueError(f"Action not found: {action_id}")
26
+ if raise_on_error:
27
+ raise ValueError(f"Action not found: {action_id}")
28
+ else:
29
+ return (None, None)
24
30
 
25
- return action_id, action
26
-
27
- def _find_default_id(self, actions: List[ActionConfig]) -> str:
28
- default_ids = [ action.id for action in actions if action.default or action.id == "__default__" ]
29
-
30
- if len(default_ids) > 1:
31
- raise ValueError("Multiple actions have default: true")
32
-
33
- if not default_ids:
34
- raise ValueError("No default action defined.")
35
-
36
- return default_ids[0]
31
+ return action.id, action
37
32
 
38
33
  class ComponentGlobalConfigs:
39
34
  def __init__(
@@ -74,7 +69,7 @@ class ComponentService(AsyncService):
74
69
  await super().start(background)
75
70
  await self.wait_until_ready()
76
71
 
77
- async def run(self, action_id: Union[str, None], run_id: str, input: Dict[str, Any]) -> Dict[str, Any]:
72
+ async def run(self, action_id: str, run_id: str, input: Dict[str, Any]) -> Dict[str, Any]:
78
73
  _, action = ActionResolver(self.config.actions).resolve(action_id)
79
74
  context = ComponentActionContext(run_id, input)
80
75
 
@@ -1,6 +1,6 @@
1
1
  from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Any
2
2
  from mindor.dsl.schema.component import ComponentConfig
3
- from .base import ComponentService, ComponentGlobalConfigs, ComponentRegistry
3
+ from .base import ComponentService, ComponentGlobalConfigs, ComponentRegistry, ActionResolver
4
4
 
5
5
  ComponentInstances: Dict[str, ComponentService] = {}
6
6
 
@@ -8,25 +8,20 @@ class ComponentResolver:
8
8
  def __init__(self, components: List[ComponentConfig]):
9
9
  self.components: List[ComponentConfig] = components
10
10
 
11
- def resolve(self, component_id: Optional[str]) -> Tuple[str, ComponentConfig]:
12
- component_id = component_id or self._find_default_id(self.components)
13
- component = next((component for component in self.components if component.id == component_id), None)
11
+ def resolve(self, component_id: str, raise_on_error: bool = True) -> Union[Tuple[str, ComponentConfig], Tuple[None, None]]:
12
+ if component_id == "__default__":
13
+ component = self.components[0] if len(self.components) == 1 else None
14
+ component = component or next((component for component in self.components if component.default), None)
15
+ else:
16
+ component = next((component for component in self.components if component.id == component_id), None)
14
17
 
15
18
  if component is None:
16
- raise ValueError(f"Component not found: {component_id}")
19
+ if raise_on_error:
20
+ raise ValueError(f"Component not found: {component_id}")
21
+ else:
22
+ return None, None
17
23
 
18
- return component_id, component
19
-
20
- def _find_default_id(self, components: List[ComponentConfig]) -> str:
21
- default_ids = [ component.id for component in components if component.default or component.id == "__default__" ]
22
-
23
- if len(default_ids) > 1:
24
- raise ValueError("Multiple components have default: true")
25
-
26
- if not default_ids:
27
- raise ValueError("No default component defined.")
28
-
29
- return default_ids[0]
24
+ return component.id, component
30
25
 
31
26
  def create_component(id: str, config: ComponentConfig, global_configs: ComponentGlobalConfigs, daemon: bool) -> ComponentService:
32
27
  try:
@@ -57,7 +57,7 @@ class HttpServerPollingCompletion(HttpServerCompletion):
57
57
 
58
58
  class HttpServerCallbackCompletion(HttpServerCompletion):
59
59
  async def run(self, context: ComponentActionContext, client: HttpClient) -> Any:
60
- callback_id = await context.render_variable(self.config.wait_for) if self.config.wait_for else "__default__"
60
+ callback_id = await context.render_variable(self.config.wait_for) if self.config.wait_for else "__callback__"
61
61
  future: asyncio.Future = asyncio.get_running_loop().create_future()
62
62
  HttpCallbackListener.register_pending_future(callback_id, future)
63
63
 
@@ -12,16 +12,15 @@ class WorkflowAction:
12
12
  self.global_configs: ComponentGlobalConfigs = global_configs
13
13
 
14
14
  async def run(self, context: ComponentActionContext) -> Any:
15
- workflow_id = await context.render_variable(self.config.workflow)
15
+ workflow = self._create_workflow(self.config.workflow)
16
16
  input = await context.render_variable(self.config.input)
17
17
 
18
- workflow = self._create_workflow(workflow_id)
19
18
  output = await workflow.run(context.run_id, input)
20
19
  context.register_source("output", output)
21
20
 
22
21
  return (await context.render_variable(self.config.output, ignore_files=True)) if self.config.output else output
23
22
 
24
- def _create_workflow(self, workflow_id: Optional[str]) -> Workflow:
23
+ def _create_workflow(self, workflow_id: str) -> Workflow:
25
24
  return create_workflow(*WorkflowResolver(self.global_configs.workflows).resolve(workflow_id), self.global_configs)
26
25
 
27
26
  @register_component(ComponentType.WORKFLOW)
@@ -14,5 +14,5 @@ async def start_services(config: ComposeConfig, verbose: bool):
14
14
  async def stop_services(config: ComposeConfig, verbose: bool):
15
15
  await ComposeManager(config, daemon=False).stop_services(verbose)
16
16
 
17
- async def run_workflow(config: ComposeConfig, workflow_id: Optional[str], input: Dict[str, Any], output_path: Optional[str], verbose: bool) -> TaskState:
17
+ async def run_workflow(config: ComposeConfig, workflow_id: str, input: Dict[str, Any], output_path: Optional[str], verbose: bool) -> TaskState:
18
18
  return await ComposeManager(config, daemon=False).run_workflow(workflow_id, input, output_path, verbose)
@@ -27,7 +27,7 @@ class ComposeManager:
27
27
  async def stop_services(self, verbose: bool):
28
28
  await self.controller.stop_services(verbose)
29
29
 
30
- async def run_workflow(self, workflow_id: Optional[str], input: Dict[str, Any], output_path: Optional[str], verbose: bool) -> TaskState:
30
+ async def run_workflow(self, workflow_id: str, input: Dict[str, Any], output_path: Optional[str], verbose: bool) -> TaskState:
31
31
  if not self.controller.started:
32
32
  await self.controller.start()
33
33
 
@@ -127,7 +127,7 @@ class ControllerService(AsyncService):
127
127
  await self._stop_loggers()
128
128
  return
129
129
 
130
- async def run_workflow(self, workflow_id: Optional[str], input: Dict[str, Any], wait_for_completion: bool = True) -> TaskState:
130
+ async def run_workflow(self, workflow_id: str, input: Dict[str, Any], wait_for_completion: bool = True) -> TaskState:
131
131
  task_id = ulid.ulid()
132
132
  state = TaskState(task_id=task_id, status=TaskStatus.PENDING)
133
133
  with self.task_states_lock:
@@ -232,7 +232,7 @@ class ControllerService(AsyncService):
232
232
 
233
233
  def _create_components(self) -> List[ComponentService]:
234
234
  global_configs = self._get_component_global_configs()
235
- return [ create_component(component.id, component, global_configs, self.daemon) for component in self.components ]
235
+ return [ create_component(component.id or "__default__", component, global_configs, self.daemon) for component in self.components ]
236
236
 
237
237
  def _create_loggers(self) -> List[LoggerService]:
238
238
  return [ create_logger(f"logger-{index}", config, self.daemon) for index, config in enumerate(self.loggers or [ self._get_default_logger_config() ]) ]
@@ -253,7 +253,7 @@ class ControllerService(AsyncService):
253
253
  def _get_default_logger_config(self) -> LoggerConfig:
254
254
  return ConsoleLoggerConfig(type=LoggerType.CONSOLE)
255
255
 
256
- async def _run_workflow(self, task_id: str, workflow_id: Optional[str], input: Dict[str, Any]) -> TaskState:
256
+ async def _run_workflow(self, task_id: str, workflow_id: str, input: Dict[str, Any]) -> TaskState:
257
257
  state = TaskState(task_id=task_id, status=TaskStatus.PROCESSING)
258
258
  with self.task_states_lock:
259
259
  self.task_states.set(task_id, state)
@@ -12,6 +12,7 @@ class HttpControllerClient(ControllerClient):
12
12
  self.client: HttpClient = HttpClient(self._resolve_controller_url())
13
13
 
14
14
  async def run_workflow(self, workflow_id: Optional[str], input: Any, workflow: WorkflowSchema) -> Any:
15
+ url = f"/workflows/{workflow_id or '__default__'}/runs"
15
16
  body = {
16
17
  "input": input,
17
18
  "wait_for_completion": True,
@@ -27,7 +28,7 @@ class HttpControllerClient(ControllerClient):
27
28
  "Content-Type": "multipart/form-data"
28
29
  }
29
30
 
30
- return await self.client.request(f"/workflows/{workflow_id}/runs", "POST", None, body, headers)
31
+ return await self.client.request(url, "POST", None, body, headers)
31
32
 
32
33
  async def close(self) -> None:
33
34
  await self.client.close()
@@ -124,11 +124,11 @@ class HttpServerController(ControllerService):
124
124
  )
125
125
 
126
126
  def _configure_routes(self) -> None:
127
- @self.router.post("/workflows/runs")
127
+ @self.router.post("/workflows/__default__/runs")
128
128
  async def run_default_workflow(
129
129
  request: Request
130
130
  ):
131
- return await self._handle_workflow_run_request(request, None)
131
+ return await self._handle_workflow_run_request(request, "__default__")
132
132
 
133
133
  @self.router.post("/workflows/{workflow_id}/runs")
134
134
  async def run_workflow(
@@ -76,7 +76,7 @@ class HttpCallbackListener(ListenerService):
76
76
  succeeded = await self._is_callback_succeeded(callback, context)
77
77
 
78
78
  async for item in context.items():
79
- callback_id = await item.render_variable(callback.identify_by) if callback.identify_by else "__default__"
79
+ callback_id = await item.render_variable(callback.identify_by) if callback.identify_by else "__callback__"
80
80
  future: asyncio.Future = self._get_pending_future(callback_id)
81
81
 
82
82
  if future:
@@ -14,7 +14,7 @@ class ActionJob(Job):
14
14
  super().__init__(id, config, global_configs)
15
15
 
16
16
  async def run(self, context: WorkflowContext) -> Union[Any, RoutingTarget]:
17
- component: ComponentService = self._create_component(self.id, await context.render_variable(self.config.component))
17
+ component: ComponentService = self._create_component(self.id, self.config.component)
18
18
 
19
19
  if not component.started:
20
20
  await component.start()
@@ -28,7 +28,7 @@ class ActionJob(Job):
28
28
  job_time_tracker = TimeTracker()
29
29
  logging.debug("[task-%s] Action 'run-%s' started for job '%s'", context.task_id, run_id, self.id)
30
30
 
31
- output = await component.run(await context.render_variable(self.config.action), run_id, input)
31
+ output = await component.run(self.config.action, run_id, input)
32
32
  context.register_source("output", output)
33
33
 
34
34
  logging.debug("[task-%s] Action 'run-%s' completed in %.2f seconds.", context.task_id, run_id, job_time_tracker.elapsed())
@@ -5,6 +5,8 @@ from mindor.dsl.schema.workflow import WorkflowConfig, WorkflowVariableConfig, W
5
5
  from mindor.dsl.schema.job import ActionJobConfig, OutputJobConfig
6
6
  from mindor.dsl.schema.component import ComponentConfig, ComponentType
7
7
  from mindor.dsl.schema.action import ActionConfig
8
+ from mindor.core.component import ComponentResolver, ActionResolver
9
+ from mindor.core.workflow import WorkflowResolver
8
10
  import re, json
9
11
 
10
12
  @dataclass
@@ -203,15 +205,14 @@ class WorkflowInputVariableResolver(WorkflowVariableResolver):
203
205
 
204
206
  for job in workflow.jobs:
205
207
  if isinstance(job, ActionJobConfig) and (not job.input or job.input == "${input}"):
206
- action_id = job.action or "__default__"
207
208
  if isinstance(job.component, str):
208
- component = next((component for component in components if component.id == job.component), None)
209
+ _, component = ComponentResolver(components).resolve(job.component, raise_on_error=False)
209
210
  if component:
210
- action = next((action for action in component.actions if action.id == action_id), None)
211
+ _, action = ActionResolver(component.actions).resolve(job.action, raise_on_error=False)
211
212
  if action:
212
213
  variables.extend(self._resolve_component(component, action, workflows, components))
213
214
  else:
214
- action = next((action for action in job.component.actions if action.id == action_id), None)
215
+ _, action = ActionResolver(job.component.actions).resolve(job.action, raise_on_error=False)
215
216
  if action:
216
217
  variables.extend(self._resolve_component(job.component, action, workflows, components))
217
218
  else:
@@ -223,8 +224,7 @@ class WorkflowInputVariableResolver(WorkflowVariableResolver):
223
224
  variables: List[WorkflowVariable] = []
224
225
 
225
226
  if component.type == ComponentType.WORKFLOW:
226
- workflow_id = action.workflow or "__default__"
227
- workflow = next((workflow for workflow in workflows if workflow.id == workflow_id), None)
227
+ _, workflow = WorkflowResolver(workflows).resolve(action.workflow, raise_on_error=False)
228
228
  if workflow:
229
229
  variables.extend(self._resolve_workflow(workflow, workflows, components))
230
230
  else:
@@ -251,17 +251,16 @@ class WorkflowOutputVariableResolver(WorkflowVariableResolver):
251
251
  variables.append(WorkflowVariableGroup(variables=(job_variables := []), repeat_count=repeat_count))
252
252
 
253
253
  if isinstance(job, ActionJobConfig) and (not job.output or job.output == "${output}"):
254
- action_id = job.action or "__default__"
255
254
  if isinstance(job.component, str):
256
- component = next((component for component in components if component.id == job.component), None)
255
+ _, component = ComponentResolver(components).resolve(job.component, raise_on_error=False)
257
256
  if component:
258
- action = next((action for action in component.actions if action.id == action_id), None)
257
+ _, action = ActionResolver(component.actions).resolve(job.action, raise_on_error=False)
259
258
  if action:
260
- job_variables.extend(self._resolve_component(component, action, workflows, components))
259
+ job_variables.extend(self._resolve_component(component, action, workflows, components))
261
260
  else:
262
- action = next((action for action in job.component.actions if action.id == action_id), None)
261
+ _, action = ActionResolver(job.component.actions).resolve(job.action, raise_on_error=False)
263
262
  if action:
264
- job_variables.extend(self._resolve_component(component, action, workflows, components))
263
+ job_variables.extend(self._resolve_component(job.component, action, workflows, components))
265
264
  else:
266
265
  if isinstance(job, OutputJobConfig):
267
266
  job_variables.extend(self._enumerate_output_variables(None, job.output, internal=internal))
@@ -272,8 +271,7 @@ class WorkflowOutputVariableResolver(WorkflowVariableResolver):
272
271
  variables: List[Union[WorkflowVariable, WorkflowVariableGroup]] = []
273
272
 
274
273
  if component.type == ComponentType.WORKFLOW:
275
- workflow_id = action.workflow or "__default__"
276
- workflow = next((workflow for workflow in workflows if workflow.id == workflow_id), None)
274
+ _, workflow = WorkflowResolver(workflows).resolve(action.workflow)
277
275
  if workflow:
278
276
  variables.extend(self._resolve_workflow(workflow, workflows, components, internal=True))
279
277
  else:
@@ -57,25 +57,20 @@ class WorkflowResolver:
57
57
  def __init__(self, workflows: List[WorkflowConfig]):
58
58
  self.workflows: List[WorkflowConfig] = workflows
59
59
 
60
- def resolve(self, workflow_id: Optional[str]) -> Tuple[str, WorkflowConfig]:
61
- workflow_id = workflow_id or self._find_default_id(self.workflows)
62
- workflow = next((workflow for workflow in self.workflows if workflow.id == workflow_id), None)
60
+ def resolve(self, workflow_id: str, raise_on_error: bool = True) -> Union[Tuple[str, WorkflowConfig], Tuple[None, None]]:
61
+ if workflow_id == "__default__":
62
+ workflow = self.workflows[0] if len(self.workflows) == 1 else None
63
+ workflow = workflow or next((workflow for workflow in self.workflows if workflow.default), None)
64
+ else:
65
+ workflow = next((workflow for workflow in self.workflows if workflow.id == workflow_id), None)
63
66
 
64
67
  if workflow is None:
65
- raise ValueError(f"Workflow not found: {workflow_id}")
68
+ if raise_on_error:
69
+ raise ValueError(f"Workflow not found: {workflow_id}")
70
+ else:
71
+ return (None, None)
66
72
 
67
- return workflow_id, workflow
68
-
69
- def _find_default_id(self, workflows: List[WorkflowConfig]) -> str:
70
- default_ids = [ workflow.id for workflow in workflows if workflow.default or workflow.id == "__default__" ]
71
-
72
- if len(default_ids) > 1:
73
- raise ValueError("Multiple workflows have default: true")
74
-
75
- if not default_ids:
76
- raise ValueError("No default workflow defined.")
77
-
78
- return default_ids[0]
73
+ return workflow.id, workflow
79
74
 
80
75
  class WorkflowRunner:
81
76
  def __init__(self, id: str, jobs: List[JobConfig], global_configs: ComponentGlobalConfigs):
@@ -1,7 +1,14 @@
1
1
  from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Any
2
2
  from pydantic import BaseModel, Field
3
+ from pydantic import field_validator
3
4
 
4
5
  class CommonActionConfig(BaseModel):
5
- id: str = Field(default="__default__", description="ID of action.")
6
+ id: str = Field(default="__action__", description="ID of action.")
6
7
  output: Optional[Any] = Field(default=None, description="Output mapping to transform and extract specific values from the action result.")
7
8
  default: bool = Field(default=False, description="Whether this action should be used as the default.")
9
+
10
+ @field_validator("id")
11
+ def validate_id(cls, value):
12
+ if value == "__default__":
13
+ raise ValueError("Action id cannot be '__default__'")
14
+ return value
@@ -4,6 +4,6 @@ from pydantic import model_validator
4
4
  from .common import CommonActionConfig
5
5
 
6
6
  class McpClientActionConfig(CommonActionConfig):
7
- tool: str = Field(default="__default__", description="Name of the tool to invoke.")
7
+ tool: str = Field(default="__tool__", description="Name of the tool to invoke.")
8
8
  arguments: Dict[str, Any] = Field(default_factory=dict, description="Arguments to pass to the tool.")
9
9
  headers: Dict[str, str] = Field(default_factory=dict, description="Optional HTTP headers to include in the tool call.")
@@ -4,6 +4,6 @@ from pydantic import model_validator
4
4
  from .common import CommonActionConfig
5
5
 
6
6
  class McpServerActionConfig(CommonActionConfig):
7
- tool: str = Field(default="__default__", description="Name of the tool to invoke.")
7
+ tool: str = Field(default="__tool__", description="Name of the tool to invoke.")
8
8
  arguments: Dict[str, Any] = Field(default_factory=dict, description="Arguments to pass to the tool.")
9
9
  headers: Dict[str, str] = Field(default_factory=dict, description="Optional HTTP headers to include in the tool call.")
@@ -1,14 +1,21 @@
1
1
  from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Any
2
2
  from enum import Enum
3
3
  from pydantic import BaseModel, Field
4
+ from pydantic import field_validator
4
5
  from mindor.dsl.schema.action import CommonActionConfig
5
6
  from mindor.dsl.schema.runtime import RuntimeType
6
7
  from .types import ComponentType
7
8
 
8
9
  class CommonComponentConfig(BaseModel):
9
- id: str = Field(default="__default__", description="ID of component.")
10
+ id: str = Field(default="__component__", description="ID of component.")
10
11
  type: ComponentType = Field(..., description="Type of component.")
11
12
  runtime: RuntimeType = Field(default=RuntimeType.NATIVE, description="Runtime environment used to execute this component.")
12
13
  max_concurrent_count: int = Field(default=1, description="Maximum number of concurrent actions this component can handle.")
13
14
  default: bool = Field(default=False, description="Whether to use this component when no component is explicitly specified.")
14
15
  actions: List[CommonActionConfig] = Field(default_factory=list, description="Actions available within this component.")
16
+
17
+ @field_validator("id")
18
+ def validate_id(cls, value):
19
+ if value == "__default__":
20
+ raise ValueError("Component id cannot be '__default__'")
21
+ return value