model-compose 0.3.13__tar.gz → 0.3.15__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 (256) hide show
  1. {model_compose-0.3.13 → model_compose-0.3.15}/PKG-INFO +2 -1
  2. {model_compose-0.3.13 → model_compose-0.3.15}/README.md +1 -0
  3. {model_compose-0.3.13 → model_compose-0.3.15}/pyproject.toml +1 -1
  4. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/component/base.py +7 -0
  5. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/component/services/__init__.py +1 -0
  6. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/component/services/http_server.py +10 -1
  7. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/component/services/model/base.py +14 -11
  8. model_compose-0.3.15/src/mindor/core/component/services/model/loader.py +25 -0
  9. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/component/services/model/tasks/image_to_text.py +34 -8
  10. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/component/services/model/tasks/summarization.py +16 -11
  11. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/component/services/model/tasks/text_classification.py +3 -3
  12. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/component/services/model/tasks/text_embedding.py +3 -3
  13. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/component/services/model/tasks/text_generation.py +19 -5
  14. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/component/services/model/tasks/translation.py +16 -11
  15. model_compose-0.3.15/src/mindor/core/component/services/vector_store/__init__.py +1 -0
  16. model_compose-0.3.15/src/mindor/core/component/services/vector_store/base.py +28 -0
  17. model_compose-0.3.15/src/mindor/core/component/services/vector_store/drivers/__init__.py +2 -0
  18. model_compose-0.3.15/src/mindor/core/component/services/vector_store/drivers/chroma.py +278 -0
  19. model_compose-0.3.15/src/mindor/core/component/services/vector_store/drivers/milvus.py +333 -0
  20. model_compose-0.3.15/src/mindor/core/component/services/vector_store/vector_store.py +37 -0
  21. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/controller/services/http_server.py +1 -1
  22. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/controller/webui/gradio.py +10 -1
  23. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/services/async_service.py +14 -1
  24. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/utils/shell.py +6 -14
  25. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/workflow/schema.py +4 -2
  26. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/__init__.py +1 -0
  27. model_compose-0.3.15/src/mindor/dsl/schema/action/impl/common.py +7 -0
  28. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/http_client.py +19 -19
  29. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/http_server.py +17 -17
  30. {model_compose-0.3.13/src/mindor/dsl/schema/component → model_compose-0.3.15/src/mindor/dsl/schema/action}/impl/model/impl/__init__.py +1 -0
  31. model_compose-0.3.15/src/mindor/dsl/schema/action/impl/model/impl/chat_completion.py +41 -0
  32. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/model/impl/common.py +1 -1
  33. model_compose-0.3.15/src/mindor/dsl/schema/action/impl/model/impl/image_to_text.py +24 -0
  34. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/model/impl/summarization.py +8 -5
  35. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/model/impl/text_classification.py +1 -1
  36. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/model/impl/text_embedding.py +1 -1
  37. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/model/impl/text_generation.py +10 -4
  38. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/model/impl/translation.py +9 -6
  39. model_compose-0.3.15/src/mindor/dsl/schema/action/impl/vector_store/__init__.py +1 -0
  40. model_compose-0.3.15/src/mindor/dsl/schema/action/impl/vector_store/impl/__init__.py +4 -0
  41. model_compose-0.3.15/src/mindor/dsl/schema/action/impl/vector_store/impl/chroma.py +28 -0
  42. model_compose-0.3.15/src/mindor/dsl/schema/action/impl/vector_store/impl/common.py +85 -0
  43. model_compose-0.3.15/src/mindor/dsl/schema/action/impl/vector_store/impl/faiss.py +26 -0
  44. model_compose-0.3.15/src/mindor/dsl/schema/action/impl/vector_store/impl/milvus.py +30 -0
  45. model_compose-0.3.15/src/mindor/dsl/schema/action/impl/vector_store/impl/qdrant.py +26 -0
  46. model_compose-0.3.15/src/mindor/dsl/schema/action/impl/vector_store/vector_store.py +9 -0
  47. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/component/component.py +1 -0
  48. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/__init__.py +1 -0
  49. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/http_client.py +2 -2
  50. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/mcp_client.py +1 -1
  51. {model_compose-0.3.13/src/mindor/dsl/schema/action → model_compose-0.3.15/src/mindor/dsl/schema/component}/impl/model/impl/__init__.py +1 -0
  52. model_compose-0.3.15/src/mindor/dsl/schema/component/impl/model/impl/chat_completion.py +17 -0
  53. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/model/impl/common.py +9 -6
  54. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/types.py +1 -0
  55. model_compose-0.3.15/src/mindor/dsl/schema/component/impl/vector_store/__init__.py +1 -0
  56. model_compose-0.3.15/src/mindor/dsl/schema/component/impl/vector_store/impl/__init__.py +4 -0
  57. model_compose-0.3.15/src/mindor/dsl/schema/component/impl/vector_store/impl/chroma.py +27 -0
  58. model_compose-0.3.15/src/mindor/dsl/schema/component/impl/vector_store/impl/common.py +10 -0
  59. model_compose-0.3.15/src/mindor/dsl/schema/component/impl/vector_store/impl/faiss.py +18 -0
  60. model_compose-0.3.15/src/mindor/dsl/schema/component/impl/vector_store/impl/milvus.py +32 -0
  61. model_compose-0.3.15/src/mindor/dsl/schema/component/impl/vector_store/impl/qdrant.py +41 -0
  62. model_compose-0.3.15/src/mindor/dsl/schema/component/impl/vector_store/impl/types.py +7 -0
  63. model_compose-0.3.15/src/mindor/dsl/schema/component/impl/vector_store/vector_store.py +12 -0
  64. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/compose.py +5 -5
  65. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/controller/webui/impl/common.py +1 -1
  66. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/gateway/impl/common.py +3 -3
  67. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/common.py +1 -1
  68. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/job/impl/delay.py +1 -1
  69. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/job/impl/random_router.py +3 -3
  70. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/listener/impl/common.py +3 -3
  71. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/listener/impl/http_callback.py +10 -10
  72. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/logger/impl/common.py +2 -2
  73. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/logger/impl/file.py +1 -1
  74. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/runtime/impl/common.py +1 -1
  75. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/workflow.py +2 -2
  76. {model_compose-0.3.13 → model_compose-0.3.15}/src/model_compose.egg-info/PKG-INFO +2 -1
  77. {model_compose-0.3.13 → model_compose-0.3.15}/src/model_compose.egg-info/SOURCES.txt +26 -0
  78. model_compose-0.3.13/src/mindor/dsl/schema/action/impl/common.py +0 -7
  79. model_compose-0.3.13/src/mindor/dsl/schema/action/impl/model/impl/image_to_text.py +0 -12
  80. {model_compose-0.3.13 → model_compose-0.3.15}/LICENSE +0 -0
  81. {model_compose-0.3.13 → model_compose-0.3.15}/setup.cfg +0 -0
  82. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/__init__.py +0 -0
  83. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/cli/__init__.py +0 -0
  84. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/cli/compose.py +0 -0
  85. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/__init__.py +0 -0
  86. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/component/__init__.py +0 -0
  87. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/component/component.py +0 -0
  88. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/component/context.py +0 -0
  89. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/component/services/http_client.py +0 -0
  90. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/component/services/mcp_client.py +0 -0
  91. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/component/services/mcp_server.py +0 -0
  92. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/component/services/model/__init__.py +0 -0
  93. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/component/services/model/model.py +0 -0
  94. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/component/services/model/tasks/__init__.py +0 -0
  95. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/component/services/shell.py +0 -0
  96. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/component/services/text_splitter.py +0 -0
  97. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/component/services/workflow.py +0 -0
  98. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/compose/__init__.py +0 -0
  99. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/compose/compose.py +0 -0
  100. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/compose/manager.py +0 -0
  101. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/controller/__init__.py +0 -0
  102. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/controller/base.py +0 -0
  103. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/controller/controller.py +0 -0
  104. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/controller/runner/__init__.py +0 -0
  105. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/controller/runner/client.py +0 -0
  106. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/controller/runner/http_client.py +0 -0
  107. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/controller/runner/mcp_client.py +0 -0
  108. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/controller/runner/runner.py +0 -0
  109. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/controller/runtime/__init__.py +0 -0
  110. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/controller/runtime/docker/__init__.py +0 -0
  111. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/controller/runtime/docker/context/Dockerfile +0 -0
  112. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/controller/runtime/docker/docker.py +0 -0
  113. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/controller/runtime/native/__init__.py +0 -0
  114. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/controller/runtime/native/native.py +0 -0
  115. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/controller/runtime/specs.py +0 -0
  116. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/controller/services/__init__.py +0 -0
  117. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/controller/services/mcp_server.py +0 -0
  118. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/controller/webui/__init__.py +0 -0
  119. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/controller/webui/webui.py +0 -0
  120. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/gateway/__init__.py +0 -0
  121. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/gateway/base.py +0 -0
  122. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/gateway/gateway.py +0 -0
  123. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/gateway/services/__init__.py +0 -0
  124. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/gateway/services/http_tunnel.py +0 -0
  125. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/gateway/services/ssh_tunnel.py +0 -0
  126. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/listener/__init__.py +0 -0
  127. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/listener/base.py +0 -0
  128. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/listener/listener.py +0 -0
  129. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/listener/services/__init__.py +0 -0
  130. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/listener/services/http_callback.py +0 -0
  131. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/logger/__init__.py +0 -0
  132. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/logger/base.py +0 -0
  133. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/logger/logger.py +0 -0
  134. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/logger/logging.py +0 -0
  135. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/logger/services/__init__.py +0 -0
  136. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/logger/services/console.py +0 -0
  137. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/logger/services/file.py +0 -0
  138. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/runtime/__init__.py +0 -0
  139. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/runtime/docker/__init__.py +0 -0
  140. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/runtime/docker/docker.py +0 -0
  141. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/runtime/env.py +0 -0
  142. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/services/__init__.py +0 -0
  143. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/utils/__init__.py +0 -0
  144. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/utils/caching.py +0 -0
  145. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/utils/http_client.py +0 -0
  146. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/utils/http_request.py +0 -0
  147. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/utils/http_response.py +0 -0
  148. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/utils/http_status.py +0 -0
  149. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/utils/image.py +0 -0
  150. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/utils/mcp_client.py +0 -0
  151. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/utils/renderers.py +0 -0
  152. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/utils/resolvers.py +0 -0
  153. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/utils/ssh_client.py +0 -0
  154. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/utils/streamer.py +0 -0
  155. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/utils/streaming.py +0 -0
  156. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/utils/time.py +0 -0
  157. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/utils/workqueue.py +0 -0
  158. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/workflow/__init__.py +0 -0
  159. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/workflow/context.py +0 -0
  160. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/workflow/job/__init__.py +0 -0
  161. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/workflow/job/base.py +0 -0
  162. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/workflow/job/impl/__init__.py +0 -0
  163. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/workflow/job/impl/action.py +0 -0
  164. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/workflow/job/impl/delay.py +0 -0
  165. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/workflow/job/impl/filter.py +0 -0
  166. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/workflow/job/impl/if_.py +0 -0
  167. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/workflow/job/impl/random_router.py +0 -0
  168. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/workflow/job/impl/switch.py +0 -0
  169. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/workflow/job/job.py +0 -0
  170. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/workflow/workflow.py +0 -0
  171. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/__init__.py +0 -0
  172. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/loader.py +0 -0
  173. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/__init__.py +0 -0
  174. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/action/__init__.py +0 -0
  175. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/action/action.py +0 -0
  176. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/mcp_client.py +0 -0
  177. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/mcp_server.py +0 -0
  178. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/model/__init__.py +0 -0
  179. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/model/model.py +0 -0
  180. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/shell.py +0 -0
  181. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/text_splitter.py +0 -0
  182. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/workflow.py +0 -0
  183. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/component/__init__.py +0 -0
  184. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/common.py +0 -0
  185. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/http_server.py +0 -0
  186. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/mcp_server.py +0 -0
  187. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/model/__init__.py +0 -0
  188. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/model/impl/image_to_text.py +0 -0
  189. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/model/impl/summarization.py +0 -0
  190. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/model/impl/text_classification.py +0 -0
  191. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/model/impl/text_embedding.py +0 -0
  192. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/model/impl/text_generation.py +0 -0
  193. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/model/impl/translation.py +0 -0
  194. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/model/impl/types.py +0 -0
  195. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/model/model.py +0 -0
  196. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/shell.py +0 -0
  197. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/text_splitter.py +0 -0
  198. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/workflow.py +0 -0
  199. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/controller/__init__.py +0 -0
  200. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/controller/controller.py +0 -0
  201. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/controller/impl/__init__.py +0 -0
  202. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/controller/impl/common.py +0 -0
  203. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/controller/impl/http_server.py +0 -0
  204. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/controller/impl/mcp_server.py +0 -0
  205. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/controller/impl/types.py +0 -0
  206. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/controller/webui/__init__.py +0 -0
  207. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/controller/webui/impl/__init__.py +0 -0
  208. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/controller/webui/impl/dynamic.py +0 -0
  209. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/controller/webui/impl/gradio.py +0 -0
  210. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/controller/webui/impl/static.py +0 -0
  211. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/controller/webui/webui.py +0 -0
  212. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/gateway/__init__.py +0 -0
  213. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/gateway/gateway.py +0 -0
  214. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/gateway/impl/__init__.py +0 -0
  215. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/gateway/impl/http_tunnel/__init__.py +0 -0
  216. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/gateway/impl/http_tunnel/http_tunnel.py +0 -0
  217. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/__init__.py +0 -0
  218. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/cloudflare.py +0 -0
  219. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/ngrok.py +0 -0
  220. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/gateway/impl/ssh_tunnel.py +0 -0
  221. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/gateway/impl/types.py +0 -0
  222. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/job/__init__.py +0 -0
  223. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/job/impl/__init__.py +0 -0
  224. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/job/impl/action.py +0 -0
  225. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/job/impl/common.py +0 -0
  226. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/job/impl/filter.py +0 -0
  227. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/job/impl/if_.py +0 -0
  228. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/job/impl/switch.py +0 -0
  229. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/job/impl/types.py +0 -0
  230. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/job/job.py +0 -0
  231. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/listener/__init__.py +0 -0
  232. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/listener/impl/__init__.py +0 -0
  233. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/listener/impl/types.py +0 -0
  234. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/listener/listener.py +0 -0
  235. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/logger/__init__.py +0 -0
  236. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/logger/impl/__init__.py +0 -0
  237. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/logger/impl/console.py +0 -0
  238. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/logger/impl/types.py +0 -0
  239. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/logger/logger.py +0 -0
  240. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/runtime/__init__.py +0 -0
  241. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/runtime/impl/__init__.py +0 -0
  242. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/runtime/impl/docker.py +0 -0
  243. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/runtime/impl/native.py +0 -0
  244. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/runtime/impl/types.py +0 -0
  245. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/runtime/runtime.py +0 -0
  246. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/transport/__init__.py +0 -0
  247. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/transport/http.py +0 -0
  248. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/transport/ssh.py +0 -0
  249. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/utils/__init__.py +0 -0
  250. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/utils/annotation.py +0 -0
  251. {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/utils/enum.py +0 -0
  252. {model_compose-0.3.13 → model_compose-0.3.15}/src/model_compose.egg-info/dependency_links.txt +0 -0
  253. {model_compose-0.3.13 → model_compose-0.3.15}/src/model_compose.egg-info/entry_points.txt +0 -0
  254. {model_compose-0.3.13 → model_compose-0.3.15}/src/model_compose.egg-info/requires.txt +0 -0
  255. {model_compose-0.3.13 → model_compose-0.3.15}/src/model_compose.egg-info/top_level.txt +0 -0
  256. {model_compose-0.3.13 → model_compose-0.3.15}/tests/test_cli.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: model-compose
3
- Version: 0.3.13
3
+ Version: 0.3.15
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
@@ -45,6 +45,7 @@ Dynamic: license-file
45
45
  - **Multi-Workflow Support**: Define multiple named workflows in one project. Run them by name or set a default for quick execution.
46
46
  - **Modular Components**: Break down logic into reusable components and jobs. Easily plug, swap, and extend them across workflows.
47
47
  - **Flexible I/O Routing**: Connect inputs and outputs between jobs using clean, scoped variables—no glue code needed.
48
+ - **Streaming Mode Support**: Stream real-time outputs from models and APIs, enabling interactive applications and faster feedback loops.
48
49
  - **Run Locally, Serve Remotely**: Execute workflows from the CLI or expose them as HTTP or MCP endpoints with an optional Web UI.
49
50
  - **Docker Deployment**: Build and deploy your workflow controller as a Docker container for consistent and portable execution environments.
50
51
  - **Environment Variable Support**: Easily inject secrets and configuration via `.env` files or environment variables to keep your YAML clean and secure.
@@ -16,6 +16,7 @@
16
16
  - **Multi-Workflow Support**: Define multiple named workflows in one project. Run them by name or set a default for quick execution.
17
17
  - **Modular Components**: Break down logic into reusable components and jobs. Easily plug, swap, and extend them across workflows.
18
18
  - **Flexible I/O Routing**: Connect inputs and outputs between jobs using clean, scoped variables—no glue code needed.
19
+ - **Streaming Mode Support**: Stream real-time outputs from models and APIs, enabling interactive applications and faster feedback loops.
19
20
  - **Run Locally, Serve Remotely**: Execute workflows from the CLI or expose them as HTTP or MCP endpoints with an optional Web UI.
20
21
  - **Docker Deployment**: Build and deploy your workflow controller as a Docker container for consistent and portable execution environments.
21
22
  - **Environment Variable Support**: Easily inject secrets and configuration via `.env` files or environment variables to keep your YAML clean and secure.
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "model-compose"
3
- version = "0.3.13"
3
+ version = "0.3.15"
4
4
  description = "model-compose: Declarative AI Model and Workflow Orchestrator"
5
5
  authors = [
6
6
  { name = "Hanyeol Cho", email = "hanyeol.cho@gmail.com" }
@@ -64,6 +64,10 @@ class ComponentService(AsyncService):
64
64
  async def teardown(self) -> None:
65
65
  await self._teardown()
66
66
 
67
+ async def start(self, background: bool = False) -> None:
68
+ await super().start(background)
69
+ await self.wait_until_ready()
70
+
67
71
  async def run(self, action_id: Union[str, None], run_id: str, input: Dict[str, Any]) -> Dict[str, Any]:
68
72
  _, action = ActionResolver(self.config.actions).resolve(action_id)
69
73
  context = ComponentActionContext(run_id, input)
@@ -97,6 +101,9 @@ class ComponentService(AsyncService):
97
101
  async def _shutdown(self) -> None:
98
102
  pass
99
103
 
104
+ async def _is_ready(self) -> bool:
105
+ return True
106
+
100
107
  @abstractmethod
101
108
  async def _run(self, action: ActionConfig, context: ComponentActionContext) -> Any:
102
109
  pass
@@ -3,6 +3,7 @@ from .http_client import *
3
3
  from .mcp_server import *
4
4
  from .mcp_client import *
5
5
  from .model import *
6
+ from .vector_store import *
6
7
  from .workflow import *
7
8
  from .shell import *
8
9
  from .text_splitter import *
@@ -161,10 +161,19 @@ class HttpServerComponent(ComponentService):
161
161
 
162
162
  async def _serve(self) -> None:
163
163
  if self.config.manage.scripts.start:
164
- await run_command_streaming(self.config.manage.scripts.start, self.config.manage.working_dir, self.config.manage.env, block=False)
164
+ await run_command_streaming(self.config.manage.scripts.start, self.config.manage.working_dir, self.config.manage.env)
165
165
 
166
166
  async def _shutdown(self) -> None:
167
167
  pass
168
168
 
169
+ async def _is_ready(self) -> bool:
170
+ try:
171
+ _, writer = await asyncio.open_connection("localhost", self.config.port)
172
+ writer.close()
173
+ await writer.wait_closed()
174
+ return True
175
+ except (ConnectionRefusedError, OSError):
176
+ return False
177
+
169
178
  async def _run(self, action: ActionConfig, context: ComponentActionContext) -> Any:
170
179
  return await HttpServerAction(action).run(context, self.client)
@@ -1,6 +1,6 @@
1
1
  from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Callable, Any
2
2
  from abc import ABC, abstractmethod
3
- from mindor.dsl.schema.component import ModelComponentConfig, ModelTaskType, DeviceMode
3
+ from mindor.dsl.schema.component import ModelComponentConfig, ModelTaskType, ModelSourceConfig, DeviceMode
4
4
  from mindor.dsl.schema.action import ModelActionConfig
5
5
  from mindor.core.services import AsyncService
6
6
  from ...context import ComponentActionContext
@@ -26,7 +26,7 @@ class ModelTaskService(AsyncService):
26
26
  async def _run(self, action: ModelActionConfig, context: ComponentActionContext, loop: asyncio.AbstractEventLoop) -> Any:
27
27
  pass
28
28
 
29
- def _load_pretrained_model(self, extra_params: Optional[Dict[str, Any]] = None) -> PreTrainedModel:
29
+ def _load_pretrained_model(self, extra_params: Optional[Dict[str, Any]] = None) -> Union[PreTrainedModel, torch.nn.Module]:
30
30
  params = self._get_common_model_params()
31
31
 
32
32
  if extra_params:
@@ -42,6 +42,10 @@ class ModelTaskService(AsyncService):
42
42
  def _get_common_model_params(self) -> Dict[str, Any]:
43
43
  params: Dict[str, Any] = {}
44
44
 
45
+ if isinstance(self.config.model, ModelSourceConfig):
46
+ if self.config.model.revision:
47
+ params["revision"] = self.config.model.revision
48
+
45
49
  if self.config.device_mode != DeviceMode.SINGLE:
46
50
  params["device_map"] = self.config.device_mode.value
47
51
 
@@ -51,9 +55,6 @@ class ModelTaskService(AsyncService):
51
55
  if self.config.low_cpu_mem_usage:
52
56
  params["low_cpu_mem_usage"] = True
53
57
 
54
- if self.config.revision:
55
- params["revision"] = self.config.revision
56
-
57
58
  if self.config.cache_dir:
58
59
  params["cache_dir"] = self.config.cache_dir
59
60
 
@@ -75,12 +76,13 @@ class ModelTaskService(AsyncService):
75
76
 
76
77
  def _get_common_tokenizer_params(self) -> Dict[str, Any]:
77
78
  params: Dict[str, Any] = {}
79
+
80
+ if isinstance(self.config.model, ModelSourceConfig):
81
+ if self.config.model.revision:
82
+ params["revision"] = self.config.model.revision
78
83
 
79
84
  if not self.config.fast_tokenizer:
80
85
  params["use_fast"] = False
81
-
82
- if self.config.revision:
83
- params["revision"] = self.config.revision
84
86
 
85
87
  if self.config.cache_dir:
86
88
  params["cache_dir"] = self.config.cache_dir
@@ -104,9 +106,10 @@ class ModelTaskService(AsyncService):
104
106
  def _get_common_processor_params(self) -> Dict[str, Any]:
105
107
  params: Dict[str, Any] = {}
106
108
 
107
- if self.config.revision:
108
- params["revision"] = self.config.revision
109
-
109
+ if isinstance(self.config.model, ModelSourceConfig):
110
+ if self.config.model.revision:
111
+ params["revision"] = self.config.model.revision
112
+
110
113
  if self.config.cache_dir:
111
114
  params["cache_dir"] = self.config.cache_dir
112
115
 
@@ -0,0 +1,25 @@
1
+ from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, AsyncIterator, Any
2
+ from transformers import PreTrainedModel
3
+ import torch
4
+
5
+ async def load_model(
6
+ provider: str,
7
+ model_id: str,
8
+ revision: Optional[str],
9
+ filename: Optional[str],
10
+ model_class: Type[PreTrainedModel],
11
+ *,
12
+ cache_dir: Optional[str] = None,
13
+ local_files_only: bool = False
14
+ ) -> Union[PreTrainedModel, torch.nn.Module]:
15
+ if provider in [ "huggingface.co", "huggingface.com", "huggingface" ]:
16
+ pass
17
+
18
+ async def load_model_from_uri(
19
+ uri: str,
20
+ model_class: Type[PreTrainedModel],
21
+ *,
22
+ cache_dir: Optional[str] = None,
23
+ local_files_only: bool = False
24
+ ) -> Union[PreTrainedModel, torch.nn.Module]:
25
+ pass
@@ -5,7 +5,7 @@ from mindor.core.utils.streamer import AsyncStreamer
5
5
  from mindor.core.logger import logging
6
6
  from ..base import ModelTaskService, ModelTaskType, register_model_task_service
7
7
  from ..base import ComponentActionContext
8
- from transformers import PreTrainedModel, PreTrainedTokenizer, ProcessorMixin, GenerationMixin, TextIteratorStreamer
8
+ from transformers import PreTrainedModel, PreTrainedTokenizer, ProcessorMixin, GenerationMixin, TextIteratorStreamer, StopStringCriteria
9
9
  from PIL import Image as PILImage
10
10
  from threading import Thread
11
11
  from torch import Tensor
@@ -25,10 +25,22 @@ class ImageToTextTaskAction:
25
25
  image: Union[PILImage.Image, List[PILImage.Image]] = await context.render_image(self.config.image)
26
26
  prompt: Optional[Union[str, List[str]]] = await context.render_variable(self.config.prompt)
27
27
 
28
- batch_size = await context.render_variable(self.config.params.batch_size)
29
- stream = await context.render_variable(self.config.stream)
30
-
31
- is_single_input: bool = True if not isinstance(images, list) else False
28
+ max_input_length = await context.render_variable(self.config.params.max_input_length)
29
+ max_output_length = await context.render_variable(self.config.params.max_output_length)
30
+ min_output_length = await context.render_variable(self.config.params.min_output_length)
31
+ num_return_sequences = await context.render_variable(self.config.params.num_return_sequences)
32
+ do_sample = await context.render_variable(self.config.params.do_sample)
33
+ temperature = await context.render_variable(self.config.params.temperature) if do_sample else None
34
+ top_k = await context.render_variable(self.config.params.top_k) if do_sample else None
35
+ top_p = await context.render_variable(self.config.params.top_p) if do_sample else None
36
+ num_beams = await context.render_variable(self.config.params.num_beams)
37
+ length_penalty = await context.render_variable(self.config.params.length_penalty) if num_beams > 1 else None
38
+ early_stopping = await context.render_variable(self.config.params.early_stopping) if num_beams > 1 else False
39
+ stop_sequences = await context.render_variable(self.config.params.stop_sequences)
40
+ batch_size = await context.render_variable(self.config.params.batch_size)
41
+ stream = await context.render_variable(self.config.stream)
42
+
43
+ is_single_input: bool = bool(not isinstance(images, list))
32
44
  images: List[PILImage.Image] = [ image ] if is_single_input else image
33
45
  prompts: Optional[List[str]] = [ prompt ] if is_single_input else prompt
34
46
  results = []
@@ -37,17 +49,31 @@ class ImageToTextTaskAction:
37
49
  raise ValueError("Streaming mode only supports a single input image with batch size of 1.")
38
50
 
39
51
  streamer = TextIteratorStreamer(self.processor.tokenizer, skip_prompt=True, skip_special_tokens=True) if stream else None
52
+ stopping_criteria = [ StopStringCriteria(self.processor.tokenizer, stop_sequences) ] if stop_sequences else None
40
53
  for index in range(0, len(images), batch_size):
41
54
  batch_images = images[index:index + batch_size]
42
55
  batch_prompts = prompts[index:index + batch_size] if prompts else None
43
56
 
44
- inputs: Tensor = self.processor(images=batch_images, text=batch_prompts, return_tensors="pt")
57
+ inputs: Tensor = self.processor(images=batch_images, text=batch_prompts, max_length=max_input_length, return_tensors="pt")
45
58
  inputs = inputs.to(self.device)
46
59
 
47
60
  def _generate():
48
61
  with torch.inference_mode():
49
62
  outputs = self.model.generate(
50
63
  **inputs,
64
+ max_new_tokens=max_output_length,
65
+ min_length=min_output_length,
66
+ num_return_sequences=num_return_sequences,
67
+ do_sample=do_sample,
68
+ temperature=temperature,
69
+ top_k=top_k,
70
+ top_p=top_p,
71
+ num_beams=num_beams,
72
+ length_penalty=length_penalty,
73
+ early_stopping=early_stopping,
74
+ pad_token_id=getattr(self.processor.tokenizer, "pad_token_id", None),
75
+ eos_token_id=getattr(self.processor.tokenizer, "eos_token_id", None),
76
+ stopping_criteria=stopping_criteria,
51
77
  streamer=streamer
52
78
  )
53
79
 
@@ -61,13 +87,13 @@ class ImageToTextTaskAction:
61
87
  _generate()
62
88
 
63
89
  if stream:
64
- async def _stream_generator():
90
+ async def _stream_output_generator():
65
91
  async for chunk in AsyncStreamer(streamer, loop):
66
92
  if chunk:
67
93
  context.register_source("result[]", chunk)
68
94
  yield (await context.render_variable(self.config.output, ignore_files=True)) if self.config.output else chunk
69
95
 
70
- return _stream_generator()
96
+ return _stream_output_generator()
71
97
  else:
72
98
  result = results[0] if is_single_input else results
73
99
  context.register_source("result", result)
@@ -5,7 +5,7 @@ from mindor.core.utils.streamer import AsyncStreamer
5
5
  from mindor.core.logger import logging
6
6
  from ..base import ModelTaskService, ModelTaskType, register_model_task_service
7
7
  from ..base import ComponentActionContext
8
- from transformers import AutoModelForSeq2SeqLM, AutoTokenizer, PreTrainedModel, PreTrainedTokenizer, GenerationMixin, TextIteratorStreamer
8
+ from transformers import AutoModelForSeq2SeqLM, AutoTokenizer, PreTrainedModel, PreTrainedTokenizer, GenerationMixin, TextIteratorStreamer, StopStringCriteria
9
9
  from threading import Thread
10
10
  from torch import Tensor
11
11
  import torch, asyncio
@@ -23,16 +23,18 @@ class SummarizationTaskAction:
23
23
  max_input_length = await context.render_variable(self.config.params.max_input_length)
24
24
  max_output_length = await context.render_variable(self.config.params.max_output_length)
25
25
  min_output_length = await context.render_variable(self.config.params.min_output_length)
26
- num_beams = await context.render_variable(self.config.params.num_beams)
27
- length_penalty = await context.render_variable(self.config.params.length_penalty) if num_beams > 1 else None
28
- early_stopping = await context.render_variable(self.config.params.early_stopping) if num_beams > 1 else False
29
26
  do_sample = await context.render_variable(self.config.params.do_sample)
27
+ temperature = await context.render_variable(self.config.params.temperature) if do_sample else None
30
28
  top_k = await context.render_variable(self.config.params.top_k) if do_sample else None
31
29
  top_p = await context.render_variable(self.config.params.top_p) if do_sample else None
30
+ num_beams = await context.render_variable(self.config.params.num_beams)
31
+ length_penalty = await context.render_variable(self.config.params.length_penalty) if num_beams > 1 else None
32
+ early_stopping = await context.render_variable(self.config.params.early_stopping) if num_beams > 1 else False
33
+ stop_sequences = await context.render_variable(self.config.params.stop_sequences)
32
34
  batch_size = await context.render_variable(self.config.params.batch_size)
33
35
  stream = await context.render_variable(self.config.stream)
34
36
 
35
- is_single_input: bool = True if not isinstance(text, list) else False
37
+ is_single_input: bool = bool(not isinstance(text, list))
36
38
  texts: List[str] = [ text ] if is_single_input else text
37
39
  results = []
38
40
 
@@ -40,6 +42,7 @@ class SummarizationTaskAction:
40
42
  raise ValueError("Streaming mode only supports a single input text with batch size of 1.")
41
43
 
42
44
  streamer = TextIteratorStreamer(self.tokenizer, skip_prompt=True, skip_special_tokens=True) if stream else None
45
+ stopping_criteria = [ StopStringCriteria(self.tokenizer, stop_sequences) ] if stop_sequences else None
43
46
  for index in range(0, len(texts), batch_size):
44
47
  batch_texts = texts[index:index + batch_size]
45
48
  inputs: Dict[str, Tensor] = self.tokenizer(batch_texts, return_tensors="pt", max_length=max_input_length, padding=True, truncation=True)
@@ -49,16 +52,18 @@ class SummarizationTaskAction:
49
52
  with torch.inference_mode():
50
53
  outputs = self.model.generate(
51
54
  **inputs,
52
- max_length=max_output_length,
55
+ max_new_tokens=max_output_length,
53
56
  min_length=min_output_length,
54
- num_beams=num_beams,
55
- length_penalty=length_penalty,
56
- early_stopping=early_stopping,
57
57
  do_sample=do_sample,
58
+ temperature=temperature,
58
59
  top_k=top_k,
59
60
  top_p=top_p,
61
+ num_beams=num_beams,
62
+ length_penalty=length_penalty,
63
+ early_stopping=early_stopping,
60
64
  pad_token_id=getattr(self.tokenizer, "pad_token_id", None),
61
65
  eos_token_id=getattr(self.tokenizer, "eos_token_id", None),
66
+ stopping_criteria=stopping_criteria,
62
67
  streamer=streamer
63
68
  )
64
69
 
@@ -73,13 +78,13 @@ class SummarizationTaskAction:
73
78
  _generate()
74
79
 
75
80
  if stream:
76
- async def _stream_generator():
81
+ async def _stream_output_generator():
77
82
  async for chunk in AsyncStreamer(streamer, loop):
78
83
  if chunk:
79
84
  context.register_source("result[]", chunk)
80
85
  yield (await context.render_variable(self.config.output, ignore_files=True)) if self.config.output else chunk
81
86
 
82
- return _stream_generator()
87
+ return _stream_output_generator()
83
88
  else:
84
89
  result = results[0] if is_single_input else results
85
90
  context.register_source("result", result)
@@ -24,7 +24,7 @@ class TextClassificationTaskAction:
24
24
  batch_size = await context.render_variable(self.config.params.batch_size)
25
25
  stream = await context.render_variable(self.config.stream)
26
26
 
27
- is_single_input: bool = True if not isinstance(text, list) else False
27
+ is_single_input: bool = bool(not isinstance(text, list))
28
28
  is_output_array_mode: bool = context.contains_variable_reference("result[]", self.config.output)
29
29
  texts: List[str] = [ text ] if is_single_input else text
30
30
  results = []
@@ -64,7 +64,7 @@ class TextClassificationTaskAction:
64
64
  yield predictions
65
65
 
66
66
  if stream:
67
- async def _stream_generator():
67
+ async def _stream_output_generator():
68
68
  async for predictions in _predict():
69
69
  if not is_output_array_mode:
70
70
  for prediction in predictions:
@@ -74,7 +74,7 @@ class TextClassificationTaskAction:
74
74
  for prediction in predictions:
75
75
  yield prediction
76
76
 
77
- return _stream_generator()
77
+ return _stream_output_generator()
78
78
  else:
79
79
  async for predictions in _predict():
80
80
  results.extend(predictions)
@@ -25,7 +25,7 @@ class TextEmbeddingTaskAction:
25
25
  batch_size = await context.render_variable(self.config.params.batch_size)
26
26
  stream = await context.render_variable(self.config.stream)
27
27
 
28
- is_single_input: bool = True if not isinstance(text, list) else False
28
+ is_single_input: bool = bool(not isinstance(text, list))
29
29
  is_output_array_mode: bool = context.contains_variable_reference("result[]", self.config.output)
30
30
  texts: List[str] = [ text ] if is_single_input else text
31
31
  results = []
@@ -59,7 +59,7 @@ class TextEmbeddingTaskAction:
59
59
  yield embeddings
60
60
 
61
61
  if stream:
62
- async def _stream_generator():
62
+ async def _stream_output_generator():
63
63
  async for embeddings in _embed():
64
64
  if not is_output_array_mode:
65
65
  for embedding in embeddings:
@@ -69,7 +69,7 @@ class TextEmbeddingTaskAction:
69
69
  for embedding in embeddings:
70
70
  yield embedding
71
71
 
72
- return _stream_generator()
72
+ return _stream_output_generator()
73
73
  else:
74
74
  async for embeddings in _embed():
75
75
  results.extend(embeddings)
@@ -5,7 +5,7 @@ from mindor.core.utils.streamer import AsyncStreamer
5
5
  from mindor.core.logger import logging
6
6
  from ..base import ModelTaskService, ModelTaskType, register_model_task_service
7
7
  from ..base import ComponentActionContext
8
- from transformers import AutoModelForCausalLM, AutoTokenizer, PreTrainedModel, PreTrainedTokenizer, GenerationMixin, TextIteratorStreamer
8
+ from transformers import AutoModelForCausalLM, AutoTokenizer, PreTrainedModel, PreTrainedTokenizer, GenerationMixin, TextIteratorStreamer, StopStringCriteria
9
9
  from threading import Thread
10
10
  from torch import Tensor
11
11
  import torch, asyncio
@@ -21,14 +21,20 @@ class TextGenerationTaskAction:
21
21
  prompt: Union[str, List[str]] = await context.render_variable(self.config.prompt)
22
22
 
23
23
  max_output_length = await context.render_variable(self.config.params.max_output_length)
24
+ min_output_length = await context.render_variable(self.config.params.min_output_length)
24
25
  num_return_sequences = await context.render_variable(self.config.params.num_return_sequences)
26
+ do_sample = await context.render_variable(self.config.params.do_sample)
25
27
  temperature = await context.render_variable(self.config.params.temperature)
26
28
  top_k = await context.render_variable(self.config.params.top_k)
27
29
  top_p = await context.render_variable(self.config.params.top_p)
30
+ num_beams = await context.render_variable(self.config.params.num_beams)
31
+ length_penalty = await context.render_variable(self.config.params.length_penalty) if num_beams > 1 else None
32
+ early_stopping = await context.render_variable(self.config.params.early_stopping) if num_beams > 1 else False
33
+ stop_sequences = await context.render_variable(self.config.params.stop_sequences)
28
34
  batch_size = await context.render_variable(self.config.params.batch_size)
29
35
  stream = await context.render_variable(self.config.stream)
30
36
 
31
- is_single_input: bool = True if not isinstance(prompt, list) else False
37
+ is_single_input: bool = bool(not isinstance(prompt, list))
32
38
  prompts: List[str] = [ prompt ] if is_single_input else prompt
33
39
  results = []
34
40
 
@@ -36,6 +42,7 @@ class TextGenerationTaskAction:
36
42
  raise ValueError("Streaming mode only supports a single input prompt with batch size of 1.")
37
43
 
38
44
  streamer = TextIteratorStreamer(self.tokenizer, skip_prompt=True, skip_special_tokens=True) if stream else None
45
+ stopping_criteria = [ StopStringCriteria(self.tokenizer, stop_sequences) ] if stop_sequences else None
39
46
  for index in range(0, len(prompts), batch_size):
40
47
  batch_prompts = prompts[index:index + batch_size]
41
48
  inputs: Dict[str, Tensor] = self.tokenizer(batch_prompts, return_tensors="pt", padding=True, truncation=True)
@@ -46,11 +53,18 @@ class TextGenerationTaskAction:
46
53
  outputs = self.model.generate(
47
54
  **inputs,
48
55
  max_new_tokens=max_output_length,
56
+ min_length=min_output_length,
49
57
  num_return_sequences=num_return_sequences,
58
+ do_sample=do_sample,
50
59
  temperature=temperature,
51
- do_sample=True,
52
60
  top_k=top_k,
53
61
  top_p=top_p,
62
+ num_beams=num_beams,
63
+ length_penalty=length_penalty,
64
+ early_stopping=early_stopping,
65
+ pad_token_id=getattr(self.tokenizer, "pad_token_id", None),
66
+ eos_token_id=getattr(self.tokenizer, "eos_token_id", None),
67
+ stopping_criteria=stopping_criteria,
54
68
  streamer=streamer
55
69
  )
56
70
 
@@ -65,13 +79,13 @@ class TextGenerationTaskAction:
65
79
  _generate()
66
80
 
67
81
  if stream:
68
- async def _stream_generator():
82
+ async def _stream_output_generator():
69
83
  async for chunk in AsyncStreamer(streamer, loop):
70
84
  if chunk:
71
85
  context.register_source("result[]", chunk)
72
86
  yield (await context.render_variable(self.config.output, ignore_files=True)) if self.config.output else chunk
73
87
 
74
- return _stream_generator()
88
+ return _stream_output_generator()
75
89
  else:
76
90
  result = results[0] if is_single_input else results
77
91
  context.register_source("result", result)
@@ -5,7 +5,7 @@ from mindor.core.utils.streamer import AsyncStreamer
5
5
  from mindor.core.logger import logging
6
6
  from ..base import ModelTaskService, ModelTaskType, register_model_task_service
7
7
  from ..base import ComponentActionContext
8
- from transformers import AutoModelForSeq2SeqLM, AutoTokenizer, PreTrainedModel, PreTrainedTokenizer, GenerationMixin, TextIteratorStreamer
8
+ from transformers import AutoModelForSeq2SeqLM, AutoTokenizer, PreTrainedModel, PreTrainedTokenizer, GenerationMixin, TextIteratorStreamer, StopStringCriteria
9
9
  from threading import Thread
10
10
  from torch import Tensor
11
11
  import torch, asyncio
@@ -23,16 +23,18 @@ class TranslationTaskAction:
23
23
  max_input_length = await context.render_variable(self.config.params.max_input_length)
24
24
  max_output_length = await context.render_variable(self.config.params.max_output_length)
25
25
  min_output_length = await context.render_variable(self.config.params.min_output_length)
26
- num_beams = await context.render_variable(self.config.params.num_beams)
27
- length_penalty = await context.render_variable(self.config.params.length_penalty) if num_beams > 1 else None
28
- early_stopping = await context.render_variable(self.config.params.early_stopping) if num_beams > 1 else False
29
26
  do_sample = await context.render_variable(self.config.params.do_sample)
27
+ temperature = await context.render_variable(self.config.params.temperature) if do_sample else None
30
28
  top_k = await context.render_variable(self.config.params.top_k) if do_sample else None
31
29
  top_p = await context.render_variable(self.config.params.top_p) if do_sample else None
30
+ num_beams = await context.render_variable(self.config.params.num_beams)
31
+ length_penalty = await context.render_variable(self.config.params.length_penalty) if num_beams > 1 else None
32
+ early_stopping = await context.render_variable(self.config.params.early_stopping) if num_beams > 1 else False
33
+ stop_sequences = await context.render_variable(self.config.params.stop_sequences)
32
34
  batch_size = await context.render_variable(self.config.params.batch_size)
33
35
  stream = await context.render_variable(self.config.stream)
34
36
 
35
- is_single_input: bool = True if not isinstance(text, list) else False
37
+ is_single_input: bool = bool(not isinstance(text, list))
36
38
  texts: List[str] = [ text ] if is_single_input else text
37
39
  results = []
38
40
 
@@ -40,6 +42,7 @@ class TranslationTaskAction:
40
42
  raise ValueError("Streaming mode only supports a single input text with batch size of 1.")
41
43
 
42
44
  streamer = TextIteratorStreamer(self.tokenizer, skip_prompt=True, skip_special_tokens=True) if stream else None
45
+ stopping_criteria = [ StopStringCriteria(self.tokenizer, stop_sequences) ] if stop_sequences else None
43
46
  for index in range(0, len(texts), batch_size):
44
47
  batch_texts = texts[index:index + batch_size]
45
48
  inputs: Dict[str, Tensor] = self.tokenizer(batch_texts, return_tensors="pt", max_length=max_input_length, padding=True, truncation=True)
@@ -49,16 +52,18 @@ class TranslationTaskAction:
49
52
  with torch.inference_mode():
50
53
  outputs = self.model.generate(
51
54
  **inputs,
52
- max_length=max_output_length,
55
+ max_new_tokens=max_output_length,
53
56
  min_length=min_output_length,
54
- num_beams=num_beams,
55
- length_penalty=length_penalty,
56
- early_stopping=early_stopping,
57
57
  do_sample=do_sample,
58
+ temperature=temperature,
58
59
  top_k=top_k,
59
60
  top_p=top_p,
61
+ num_beams=num_beams,
62
+ length_penalty=length_penalty,
63
+ early_stopping=early_stopping,
60
64
  pad_token_id=getattr(self.tokenizer, "pad_token_id", None),
61
65
  eos_token_id=getattr(self.tokenizer, "eos_token_id", None),
66
+ stopping_criteria=stopping_criteria,
62
67
  streamer=streamer
63
68
  )
64
69
 
@@ -73,13 +78,13 @@ class TranslationTaskAction:
73
78
  _generate()
74
79
 
75
80
  if stream:
76
- async def _stream_generator():
81
+ async def _stream_output_generator():
77
82
  async for chunk in AsyncStreamer(streamer, loop):
78
83
  if chunk:
79
84
  context.register_source("result[]", chunk)
80
85
  yield (await context.render_variable(self.config.output, ignore_files=True)) if self.config.output else chunk
81
86
 
82
- return _stream_generator()
87
+ return _stream_output_generator()
83
88
  else:
84
89
  result = results[0] if is_single_input else results
85
90
  context.register_source("result", result)
@@ -0,0 +1 @@
1
+ from .vector_store import *
@@ -0,0 +1,28 @@
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.component import VectorStoreComponentConfig, VectorStoreDriver
4
+ from mindor.dsl.schema.action import VectorStoreActionConfig
5
+ from mindor.core.services import AsyncService
6
+ from ...context import ComponentActionContext
7
+
8
+ class VectorStoreService(AsyncService):
9
+ def __init__(self, id: str, config: VectorStoreComponentConfig, daemon: bool):
10
+ super().__init__(daemon)
11
+
12
+ self.id: str = id
13
+ self.config: VectorStoreComponentConfig = config
14
+
15
+ async def run(self, action: VectorStoreActionConfig, context: ComponentActionContext) -> Any:
16
+ return await self._run(action, context)
17
+
18
+ @abstractmethod
19
+ async def _run(self, action: VectorStoreActionConfig, context: ComponentActionContext) -> Any:
20
+ pass
21
+
22
+ def register_vector_store_service(driver: VectorStoreDriver):
23
+ def decorator(cls: Type[VectorStoreService]) -> Type[VectorStoreService]:
24
+ VectorStoreServiceRegistry[driver] = cls
25
+ return cls
26
+ return decorator
27
+
28
+ VectorStoreServiceRegistry: Dict[VectorStoreDriver, Type[VectorStoreService]] = {}
@@ -0,0 +1,2 @@
1
+ from .milvus import *
2
+ from .chroma import *