model-compose 0.3.14__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.14 → model_compose-0.3.15}/PKG-INFO +1 -1
  2. {model_compose-0.3.14 → model_compose-0.3.15}/pyproject.toml +1 -1
  3. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/component/base.py +7 -0
  4. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/component/services/http_server.py +10 -1
  5. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/component/services/model/base.py +14 -11
  6. model_compose-0.3.15/src/mindor/core/component/services/model/loader.py +25 -0
  7. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/component/services/model/tasks/image_to_text.py +30 -4
  8. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/component/services/model/tasks/summarization.py +13 -8
  9. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/component/services/model/tasks/text_generation.py +16 -2
  10. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/component/services/model/tasks/translation.py +13 -8
  11. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/services/async_service.py +14 -1
  12. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/utils/shell.py +6 -14
  13. model_compose-0.3.15/src/mindor/dsl/schema/action/impl/common.py +7 -0
  14. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/http_client.py +19 -19
  15. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/http_server.py +17 -17
  16. {model_compose-0.3.14/src/mindor/dsl/schema/component → model_compose-0.3.15/src/mindor/dsl/schema/action}/impl/model/impl/__init__.py +1 -0
  17. model_compose-0.3.15/src/mindor/dsl/schema/action/impl/model/impl/chat_completion.py +41 -0
  18. model_compose-0.3.15/src/mindor/dsl/schema/action/impl/model/impl/image_to_text.py +24 -0
  19. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/model/impl/summarization.py +7 -4
  20. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/model/impl/text_generation.py +9 -3
  21. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/model/impl/translation.py +8 -5
  22. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/vector_store/impl/common.py +10 -10
  23. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/http_client.py +2 -2
  24. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/mcp_client.py +1 -1
  25. {model_compose-0.3.14/src/mindor/dsl/schema/action → model_compose-0.3.15/src/mindor/dsl/schema/component}/impl/model/impl/__init__.py +1 -0
  26. model_compose-0.3.15/src/mindor/dsl/schema/component/impl/model/impl/chat_completion.py +17 -0
  27. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/model/impl/common.py +9 -4
  28. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/vector_store/impl/common.py +1 -1
  29. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/compose.py +5 -5
  30. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/controller/webui/impl/common.py +1 -1
  31. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/gateway/impl/common.py +3 -3
  32. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/common.py +1 -1
  33. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/job/impl/random_router.py +3 -3
  34. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/listener/impl/common.py +3 -3
  35. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/listener/impl/http_callback.py +10 -10
  36. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/logger/impl/common.py +2 -2
  37. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/logger/impl/file.py +1 -1
  38. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/runtime/impl/common.py +1 -1
  39. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/workflow.py +2 -2
  40. {model_compose-0.3.14 → model_compose-0.3.15}/src/model_compose.egg-info/PKG-INFO +1 -1
  41. {model_compose-0.3.14 → model_compose-0.3.15}/src/model_compose.egg-info/SOURCES.txt +3 -0
  42. model_compose-0.3.14/src/mindor/dsl/schema/action/impl/common.py +0 -7
  43. model_compose-0.3.14/src/mindor/dsl/schema/action/impl/model/impl/image_to_text.py +0 -12
  44. {model_compose-0.3.14 → model_compose-0.3.15}/LICENSE +0 -0
  45. {model_compose-0.3.14 → model_compose-0.3.15}/README.md +0 -0
  46. {model_compose-0.3.14 → model_compose-0.3.15}/setup.cfg +0 -0
  47. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/__init__.py +0 -0
  48. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/cli/__init__.py +0 -0
  49. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/cli/compose.py +0 -0
  50. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/__init__.py +0 -0
  51. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/component/__init__.py +0 -0
  52. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/component/component.py +0 -0
  53. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/component/context.py +0 -0
  54. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/component/services/__init__.py +0 -0
  55. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/component/services/http_client.py +0 -0
  56. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/component/services/mcp_client.py +0 -0
  57. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/component/services/mcp_server.py +0 -0
  58. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/component/services/model/__init__.py +0 -0
  59. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/component/services/model/model.py +0 -0
  60. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/component/services/model/tasks/__init__.py +0 -0
  61. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/component/services/model/tasks/text_classification.py +0 -0
  62. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/component/services/model/tasks/text_embedding.py +0 -0
  63. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/component/services/shell.py +0 -0
  64. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/component/services/text_splitter.py +0 -0
  65. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/component/services/vector_store/__init__.py +0 -0
  66. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/component/services/vector_store/base.py +0 -0
  67. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/component/services/vector_store/drivers/__init__.py +0 -0
  68. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/component/services/vector_store/drivers/chroma.py +0 -0
  69. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/component/services/vector_store/drivers/milvus.py +0 -0
  70. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/component/services/vector_store/vector_store.py +0 -0
  71. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/component/services/workflow.py +0 -0
  72. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/compose/__init__.py +0 -0
  73. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/compose/compose.py +0 -0
  74. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/compose/manager.py +0 -0
  75. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/controller/__init__.py +0 -0
  76. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/controller/base.py +0 -0
  77. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/controller/controller.py +0 -0
  78. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/controller/runner/__init__.py +0 -0
  79. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/controller/runner/client.py +0 -0
  80. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/controller/runner/http_client.py +0 -0
  81. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/controller/runner/mcp_client.py +0 -0
  82. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/controller/runner/runner.py +0 -0
  83. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/controller/runtime/__init__.py +0 -0
  84. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/controller/runtime/docker/__init__.py +0 -0
  85. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/controller/runtime/docker/context/Dockerfile +0 -0
  86. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/controller/runtime/docker/docker.py +0 -0
  87. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/controller/runtime/native/__init__.py +0 -0
  88. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/controller/runtime/native/native.py +0 -0
  89. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/controller/runtime/specs.py +0 -0
  90. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/controller/services/__init__.py +0 -0
  91. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/controller/services/http_server.py +0 -0
  92. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/controller/services/mcp_server.py +0 -0
  93. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/controller/webui/__init__.py +0 -0
  94. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/controller/webui/gradio.py +0 -0
  95. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/controller/webui/webui.py +0 -0
  96. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/gateway/__init__.py +0 -0
  97. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/gateway/base.py +0 -0
  98. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/gateway/gateway.py +0 -0
  99. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/gateway/services/__init__.py +0 -0
  100. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/gateway/services/http_tunnel.py +0 -0
  101. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/gateway/services/ssh_tunnel.py +0 -0
  102. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/listener/__init__.py +0 -0
  103. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/listener/base.py +0 -0
  104. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/listener/listener.py +0 -0
  105. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/listener/services/__init__.py +0 -0
  106. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/listener/services/http_callback.py +0 -0
  107. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/logger/__init__.py +0 -0
  108. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/logger/base.py +0 -0
  109. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/logger/logger.py +0 -0
  110. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/logger/logging.py +0 -0
  111. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/logger/services/__init__.py +0 -0
  112. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/logger/services/console.py +0 -0
  113. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/logger/services/file.py +0 -0
  114. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/runtime/__init__.py +0 -0
  115. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/runtime/docker/__init__.py +0 -0
  116. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/runtime/docker/docker.py +0 -0
  117. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/runtime/env.py +0 -0
  118. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/services/__init__.py +0 -0
  119. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/utils/__init__.py +0 -0
  120. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/utils/caching.py +0 -0
  121. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/utils/http_client.py +0 -0
  122. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/utils/http_request.py +0 -0
  123. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/utils/http_response.py +0 -0
  124. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/utils/http_status.py +0 -0
  125. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/utils/image.py +0 -0
  126. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/utils/mcp_client.py +0 -0
  127. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/utils/renderers.py +0 -0
  128. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/utils/resolvers.py +0 -0
  129. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/utils/ssh_client.py +0 -0
  130. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/utils/streamer.py +0 -0
  131. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/utils/streaming.py +0 -0
  132. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/utils/time.py +0 -0
  133. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/utils/workqueue.py +0 -0
  134. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/workflow/__init__.py +0 -0
  135. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/workflow/context.py +0 -0
  136. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/workflow/job/__init__.py +0 -0
  137. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/workflow/job/base.py +0 -0
  138. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/workflow/job/impl/__init__.py +0 -0
  139. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/workflow/job/impl/action.py +0 -0
  140. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/workflow/job/impl/delay.py +0 -0
  141. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/workflow/job/impl/filter.py +0 -0
  142. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/workflow/job/impl/if_.py +0 -0
  143. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/workflow/job/impl/random_router.py +0 -0
  144. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/workflow/job/impl/switch.py +0 -0
  145. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/workflow/job/job.py +0 -0
  146. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/workflow/schema.py +0 -0
  147. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/core/workflow/workflow.py +0 -0
  148. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/__init__.py +0 -0
  149. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/loader.py +0 -0
  150. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/__init__.py +0 -0
  151. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/action/__init__.py +0 -0
  152. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/action/action.py +0 -0
  153. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/__init__.py +0 -0
  154. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/mcp_client.py +0 -0
  155. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/mcp_server.py +0 -0
  156. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/model/__init__.py +0 -0
  157. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/model/impl/common.py +0 -0
  158. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/model/impl/text_classification.py +0 -0
  159. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/model/impl/text_embedding.py +0 -0
  160. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/model/model.py +0 -0
  161. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/shell.py +0 -0
  162. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/text_splitter.py +0 -0
  163. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/vector_store/__init__.py +0 -0
  164. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/vector_store/impl/__init__.py +0 -0
  165. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/vector_store/impl/chroma.py +0 -0
  166. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/vector_store/impl/faiss.py +0 -0
  167. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/vector_store/impl/milvus.py +0 -0
  168. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/vector_store/impl/qdrant.py +0 -0
  169. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/vector_store/vector_store.py +0 -0
  170. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/workflow.py +0 -0
  171. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/component/__init__.py +0 -0
  172. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/component/component.py +0 -0
  173. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/__init__.py +0 -0
  174. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/common.py +0 -0
  175. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/http_server.py +0 -0
  176. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/mcp_server.py +0 -0
  177. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/model/__init__.py +0 -0
  178. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/model/impl/image_to_text.py +0 -0
  179. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/model/impl/summarization.py +0 -0
  180. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/model/impl/text_classification.py +0 -0
  181. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/model/impl/text_embedding.py +0 -0
  182. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/model/impl/text_generation.py +0 -0
  183. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/model/impl/translation.py +0 -0
  184. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/model/impl/types.py +0 -0
  185. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/model/model.py +0 -0
  186. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/shell.py +0 -0
  187. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/text_splitter.py +0 -0
  188. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/types.py +0 -0
  189. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/vector_store/__init__.py +0 -0
  190. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/vector_store/impl/__init__.py +0 -0
  191. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/vector_store/impl/chroma.py +0 -0
  192. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/vector_store/impl/faiss.py +0 -0
  193. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/vector_store/impl/milvus.py +0 -0
  194. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/vector_store/impl/qdrant.py +0 -0
  195. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/vector_store/impl/types.py +0 -0
  196. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/vector_store/vector_store.py +0 -0
  197. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/workflow.py +0 -0
  198. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/controller/__init__.py +0 -0
  199. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/controller/controller.py +0 -0
  200. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/controller/impl/__init__.py +0 -0
  201. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/controller/impl/common.py +0 -0
  202. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/controller/impl/http_server.py +0 -0
  203. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/controller/impl/mcp_server.py +0 -0
  204. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/controller/impl/types.py +0 -0
  205. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/controller/webui/__init__.py +0 -0
  206. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/controller/webui/impl/__init__.py +0 -0
  207. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/controller/webui/impl/dynamic.py +0 -0
  208. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/controller/webui/impl/gradio.py +0 -0
  209. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/controller/webui/impl/static.py +0 -0
  210. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/controller/webui/webui.py +0 -0
  211. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/gateway/__init__.py +0 -0
  212. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/gateway/gateway.py +0 -0
  213. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/gateway/impl/__init__.py +0 -0
  214. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/gateway/impl/http_tunnel/__init__.py +0 -0
  215. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/gateway/impl/http_tunnel/http_tunnel.py +0 -0
  216. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/__init__.py +0 -0
  217. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/cloudflare.py +0 -0
  218. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/ngrok.py +0 -0
  219. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/gateway/impl/ssh_tunnel.py +0 -0
  220. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/gateway/impl/types.py +0 -0
  221. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/job/__init__.py +0 -0
  222. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/job/impl/__init__.py +0 -0
  223. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/job/impl/action.py +0 -0
  224. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/job/impl/common.py +0 -0
  225. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/job/impl/delay.py +0 -0
  226. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/job/impl/filter.py +0 -0
  227. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/job/impl/if_.py +0 -0
  228. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/job/impl/switch.py +0 -0
  229. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/job/impl/types.py +0 -0
  230. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/job/job.py +0 -0
  231. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/listener/__init__.py +0 -0
  232. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/listener/impl/__init__.py +0 -0
  233. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/listener/impl/types.py +0 -0
  234. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/listener/listener.py +0 -0
  235. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/logger/__init__.py +0 -0
  236. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/logger/impl/__init__.py +0 -0
  237. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/logger/impl/console.py +0 -0
  238. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/logger/impl/types.py +0 -0
  239. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/logger/logger.py +0 -0
  240. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/runtime/__init__.py +0 -0
  241. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/runtime/impl/__init__.py +0 -0
  242. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/runtime/impl/docker.py +0 -0
  243. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/runtime/impl/native.py +0 -0
  244. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/runtime/impl/types.py +0 -0
  245. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/runtime/runtime.py +0 -0
  246. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/transport/__init__.py +0 -0
  247. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/transport/http.py +0 -0
  248. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/schema/transport/ssh.py +0 -0
  249. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/utils/__init__.py +0 -0
  250. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/utils/annotation.py +0 -0
  251. {model_compose-0.3.14 → model_compose-0.3.15}/src/mindor/dsl/utils/enum.py +0 -0
  252. {model_compose-0.3.14 → model_compose-0.3.15}/src/model_compose.egg-info/dependency_links.txt +0 -0
  253. {model_compose-0.3.14 → model_compose-0.3.15}/src/model_compose.egg-info/entry_points.txt +0 -0
  254. {model_compose-0.3.14 → model_compose-0.3.15}/src/model_compose.egg-info/requires.txt +0 -0
  255. {model_compose-0.3.14 → model_compose-0.3.15}/src/model_compose.egg-info/top_level.txt +0 -0
  256. {model_compose-0.3.14 → 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.14
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
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "model-compose"
3
- version = "0.3.14"
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
@@ -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,8 +25,20 @@ 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)
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)
30
42
 
31
43
  is_single_input: bool = bool(not isinstance(images, list))
32
44
  images: List[PILImage.Image] = [ image ] if is_single_input else image
@@ -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
 
@@ -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,12 +23,14 @@ 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
 
@@ -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
 
@@ -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,10 +21,16 @@ 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
 
@@ -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
 
@@ -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,12 +23,14 @@ 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
 
@@ -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
 
@@ -1,7 +1,7 @@
1
1
  from typing import Optional, Callable, Awaitable, Any
2
2
  from abc import ABC, abstractmethod
3
3
  from threading import Thread
4
- import asyncio
4
+ import asyncio, time
5
5
 
6
6
  class AsyncService(ABC):
7
7
  def __init__(self, daemon: bool):
@@ -35,6 +35,16 @@ class AsyncService(ABC):
35
35
  else:
36
36
  await self._stop()
37
37
 
38
+ async def wait_until_ready(self, timeout: int = 0) -> None:
39
+ start_time = time.monotonic()
40
+
41
+ while timeout <= 0 or time.monotonic() - start_time < timeout:
42
+ if await self._is_ready():
43
+ return
44
+ await asyncio.sleep(0.5)
45
+
46
+ raise TimeoutError(f"Service did not become ready within {timeout} seconds.")
47
+
38
48
  async def wait_until_stopped(self) -> None:
39
49
  if self.thread:
40
50
  self.thread.join()
@@ -81,6 +91,9 @@ class AsyncService(ABC):
81
91
 
82
92
  self.started = False
83
93
 
94
+ async def _is_ready(self) -> bool:
95
+ return True
96
+
84
97
  async def _on_stop(self) -> None:
85
98
  pass
86
99
 
@@ -5,8 +5,7 @@ import asyncio, os
5
5
  async def run_command_streaming(
6
6
  command: List[str],
7
7
  working_dir: Optional[str] = None,
8
- env: Dict[str, str] = None,
9
- block: bool = True
8
+ env: Dict[str, str] = None
10
9
  ) -> None:
11
10
  process = await asyncio.create_subprocess_exec(
12
11
  *command,
@@ -23,18 +22,11 @@ async def run_command_streaming(
23
22
  break
24
23
  print(line.decode().rstrip())
25
24
 
26
- if block:
27
- stdout_task = asyncio.create_task(_stream_output(process.stdout))
28
- stderr_task = asyncio.create_task(_stream_output(process.stderr))
29
- await process.wait()
30
- await stdout_task
31
- await stderr_task
32
- else:
33
- await asyncio.gather(
34
- _stream_output(process.stdout),
35
- _stream_output(process.stderr),
36
- process.wait()
37
- )
25
+ await asyncio.gather(
26
+ _stream_output(process.stdout),
27
+ _stream_output(process.stderr),
28
+ process.wait()
29
+ )
38
30
 
39
31
  async def run_command(
40
32
  command: List[str],
@@ -0,0 +1,7 @@
1
+ from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Any
2
+ from pydantic import BaseModel, Field
3
+
4
+ class CommonActionConfig(BaseModel):
5
+ id: str = Field(default="__default__", description="ID of action.")
6
+ output: Optional[Any] = Field(default=None, description="Output mapping to transform and extract specific values from the action result.")
7
+ default: bool = Field(default=False, description="Whether this action should be used as the default.")
@@ -15,17 +15,17 @@ class HttpClientCommonCompletionConfig(BaseModel):
15
15
 
16
16
  class HttpClientPollingCompletionConfig(HttpClientCommonCompletionConfig):
17
17
  type: Literal[HttpClientCompletionType.POLLING]
18
- endpoint: Optional[str] = Field(default=None, description="")
19
- path: Optional[str] = Field(default=None, description="")
20
- method: Literal[ "GET", "POST", "PUT", "DELETE", "PATCH" ] = Field(default="GET", description="")
21
- headers: Dict[str, str] = Field(default_factory=dict, description="")
22
- body: Dict[str, Any] = Field(default_factory=dict, description="")
23
- params: Dict[str, str] = Field(default_factory=dict, description="")
24
- status: Optional[str] = Field(default=None, description="")
25
- success_when: Optional[List[Union[int, str]]] = Field(default=None, description="")
26
- fail_when: Optional[List[Union[int, str]]] = Field(default=None, description="")
27
- interval: Optional[str] = Field(default=None, description="")
28
- timeout: Optional[str] = Field(default=None, description="")
18
+ endpoint: Optional[str] = Field(default=None, description="URL endpoint for polling requests.")
19
+ path: Optional[str] = Field(default=None, description="URL path to append to base_url for polling.")
20
+ method: Literal[ "GET", "POST", "PUT", "DELETE", "PATCH" ] = Field(default="GET", description="HTTP method for polling requests.")
21
+ headers: Dict[str, str] = Field(default_factory=dict, description="HTTP headers to include in polling requests.")
22
+ body: Dict[str, Any] = Field(default_factory=dict, description="Request body data for polling requests.")
23
+ params: Dict[str, str] = Field(default_factory=dict, description="URL query parameters for polling requests.")
24
+ status: Optional[str] = Field(default=None, description="Field path to check for completion status in polling response.")
25
+ success_when: Optional[List[Union[int, str]]] = Field(default=None, description="Status codes or values that indicate successful completion.")
26
+ fail_when: Optional[List[Union[int, str]]] = Field(default=None, description="Status codes or values that indicate failed completion.")
27
+ interval: Optional[str] = Field(default=None, description="Time interval between polling attempts.")
28
+ timeout: Optional[str] = Field(default=None, description="Maximum time to wait for completion before giving up.")
29
29
 
30
30
  @model_validator(mode="before")
31
31
  def validate_endpoint_or_path(cls, values: Dict[str, Any]):
@@ -42,7 +42,7 @@ class HttpClientPollingCompletionConfig(HttpClientCommonCompletionConfig):
42
42
 
43
43
  class HttpClientCallbackCompletionConfig(HttpClientCommonCompletionConfig):
44
44
  type: Literal[HttpClientCompletionType.CALLBACK]
45
- wait_for: Optional[str] = Field(default=None, description="")
45
+ wait_for: Optional[str] = Field(default=None, description="Callback identifier to wait for in asynchronous completion mode")
46
46
 
47
47
  HttpClientCompletionConfig = Annotated[
48
48
  Union[
@@ -53,14 +53,14 @@ HttpClientCompletionConfig = Annotated[
53
53
  ]
54
54
 
55
55
  class HttpClientActionConfig(CommonActionConfig):
56
- endpoint: Optional[str] = Field(default=None, description="")
57
- path: Optional[str] = Field(default=None, description="")
58
- method: Literal[ "GET", "POST", "PUT", "DELETE", "PATCH" ] = Field(default="POST", description="")
59
- headers: Dict[str, str] = Field(default_factory=dict, description="")
60
- body: Dict[str, Any] = Field(default_factory=dict, description="")
61
- params: Dict[str, str] = Field(default_factory=dict, description="")
56
+ endpoint: Optional[str] = Field(default=None, description="Full URL endpoint for the HTTP request (mutually exclusive with path)")
57
+ path: Optional[str] = Field(default=None, description="URL path to append to base_url (mutually exclusive with endpoint)")
58
+ method: Literal[ "GET", "POST", "PUT", "DELETE", "PATCH" ] = Field(default="POST", description="HTTP method to use for the request")
59
+ headers: Dict[str, str] = Field(default_factory=dict, description="HTTP headers to include in the request")
60
+ body: Dict[str, Any] = Field(default_factory=dict, description="Request body data to send with the HTTP request")
61
+ params: Dict[str, str] = Field(default_factory=dict, description="URL query parameters to append to the request")
62
62
  stream_format: Optional[HttpStreamFormat] = Field(default=None, description="Format of stream payload.")
63
- completion: Optional[HttpClientCompletionConfig] = Field(default=None, description="")
63
+ completion: Optional[HttpClientCompletionConfig] = Field(default=None, description="Configuration for handling asynchronous request completion via polling or callbacks")
64
64
 
65
65
  @model_validator(mode="before")
66
66
  def validate_endpoint_or_path(cls, values: Dict[str, Any]):
@@ -15,16 +15,16 @@ class HttpServerCommonCompletionConfig(BaseModel):
15
15
 
16
16
  class HttpServerPollingCompletionConfig(HttpServerCommonCompletionConfig):
17
17
  type: Literal[HttpServerCompletionType.POLLING]
18
- path: Optional[str] = Field(default=None, description="")
19
- method: Literal[ "GET", "POST", "PUT", "DELETE", "PATCH" ] = Field(default="GET", description="")
20
- headers: Dict[str, str] = Field(default_factory=dict, description="")
21
- body: Dict[str, Any] = Field(default_factory=dict, description="")
22
- params: Dict[str, str] = Field(default_factory=dict, description="")
23
- status: Optional[str] = Field(default=None, description="")
24
- success_when: Optional[List[Union[int, str]]] = Field(default=None, description="")
25
- fail_when: Optional[List[Union[int, str]]] = Field(default=None, description="")
26
- interval: Optional[str] = Field(default=None, description="")
27
- timeout: Optional[str] = Field(default=None, description="")
18
+ path: Optional[str] = Field(default=None, description="URL path for the polling endpoint to check completion status.")
19
+ method: Literal[ "GET", "POST", "PUT", "DELETE", "PATCH" ] = Field(default="GET", description="HTTP method for polling completion status.")
20
+ headers: Dict[str, str] = Field(default_factory=dict, description="HTTP headers to include in polling requests.")
21
+ body: Dict[str, Any] = Field(default_factory=dict, description="Request body data for polling requests.")
22
+ params: Dict[str, str] = Field(default_factory=dict, description="URL query parameters for polling requests.")
23
+ status: Optional[str] = Field(default=None, description="Field path to check for completion status in polling response.")
24
+ success_when: Optional[List[Union[int, str]]] = Field(default=None, description="Status codes or values that indicate successful completion.")
25
+ fail_when: Optional[List[Union[int, str]]] = Field(default=None, description="Status codes or values that indicate failed completion.")
26
+ interval: Optional[str] = Field(default=None, description="Time interval between polling attempts.")
27
+ timeout: Optional[str] = Field(default=None, description="Maximum time to wait for completion before giving up.")
28
28
 
29
29
  @model_validator(mode="before")
30
30
  def normalize_status_fields(cls, values: Dict[str, Any]):
@@ -35,7 +35,7 @@ class HttpServerPollingCompletionConfig(HttpServerCommonCompletionConfig):
35
35
 
36
36
  class HttpServerCallbackCompletionConfig(HttpServerCommonCompletionConfig):
37
37
  type: Literal[HttpServerCompletionType.CALLBACK]
38
- wait_for: Optional[str] = Field(default=None, description="")
38
+ wait_for: Optional[str] = Field(default=None, description="Callback identifier to wait for in asynchronous completion mode.")
39
39
 
40
40
  HttpServerCompletionConfig = Annotated[
41
41
  Union[
@@ -46,10 +46,10 @@ HttpServerCompletionConfig = Annotated[
46
46
  ]
47
47
 
48
48
  class HttpServerActionConfig(CommonActionConfig):
49
- path: Optional[str] = Field(default=None)
50
- method: Literal[ "GET", "POST", "PUT", "DELETE", "PATCH" ] = Field(default="POST", description="")
51
- headers: Dict[str, str] = Field(default_factory=dict, description="")
52
- body: Dict[str, Any] = Field(default_factory=dict, description="")
53
- params: Dict[str, str] = Field(default_factory=dict, description="")
49
+ path: Optional[str] = Field(default=None, description="URL path for this HTTP server endpoint.")
50
+ method: Literal[ "GET", "POST", "PUT", "DELETE", "PATCH" ] = Field(default="POST", description="HTTP method this endpoint will accept.")
51
+ headers: Dict[str, str] = Field(default_factory=dict, description="HTTP headers to include in responses from this endpoint.")
52
+ body: Dict[str, Any] = Field(default_factory=dict, description="Default response body template for this endpoint.")
53
+ params: Dict[str, str] = Field(default_factory=dict, description="Expected URL query parameters for this endpoint.")
54
54
  stream_format: Optional[HttpStreamFormat] = Field(default=None, description="Format of stream payload.")
55
- completion: Optional[HttpServerCompletionConfig] = Field(default=None, description="")
55
+ completion: Optional[HttpServerCompletionConfig] = Field(default=None, description="Configuration for handling asynchronous request completion via polling or callbacks.")
@@ -1,5 +1,6 @@
1
1
  from .common import *
2
2
  from .text_generation import *
3
+ from .chat_completion import *
3
4
  from .summarization import *
4
5
  from .translation import *
5
6
  from .text_classification import *
@@ -0,0 +1,41 @@
1
+ from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, TypeAlias, Any
2
+ from pydantic import BaseModel, Field
3
+ from pydantic import model_validator
4
+ from .common import CommonModelInferenceActionConfig
5
+
6
+ class ChatMessage(BaseModel):
7
+ role: str = Field(..., description="Role of the message sender.")
8
+ content: str = Field(..., description="Text content of the chat message.")
9
+
10
+ class ToolCall(BaseModel):
11
+ role: str = Field(default="assistant", description="Role for tool calls.")
12
+ name: str = Field(..., description="Tool name.")
13
+ call_id: str = Field(..., description="Tool call identifier.")
14
+ arguments: Dict[str, Any] = Field(default_factory=dict, description="Arguments passed to the tool function.")
15
+
16
+ class ToolResult(BaseModel):
17
+ role: str = Field(default="tool", description="Role for tool responses.")
18
+ call_id: str = Field(..., description="Tool call identifier.")
19
+ name: Optional[str] = Field(default=None, description="Tool name.")
20
+ content: Optional[Any] = Field(default=None, description="Tool execution result.")
21
+ error: Optional[str] = Field(default=None, description="Error message if tool execution failed.")
22
+
23
+ InputMessage: TypeAlias = Union[ToolResult, ToolCall, ChatMessage]
24
+
25
+ class ChatCompletionParamsConfig(BaseModel):
26
+ max_output_length: Union[int, str] = Field(default=1024, description="Maximum number of tokens to generate.")
27
+ min_output_length: Union[int, str] = Field(default=1, description="Minimum number of tokens to generate.")
28
+ num_return_sequences: Union[int, str] = Field(default=1, description="Number of generated sequences to return.")
29
+ do_sample: bool = Field(default=True, description="Whether to use sampling to generate diverse texts.")
30
+ temperature: Union[float, str] = Field(default=1.0, description="Sampling temperature; higher values produce more random results.")
31
+ top_k: Union[int, str] = Field(default=50, description="Top-K sampling; restricts sampling to the top K tokens.")
32
+ top_p: Union[float, str] = Field(default=0.9, description="Top-p (nucleus) sampling; restricts sampling to tokens with cumulative probability >= top_p.")
33
+ num_beams: Union[int, str] = Field(default=1, description="Number of beams to use for beam search.")
34
+ length_penalty: Union[float, str] = Field(default=1.0, description="Length penalty applied during beam search.")
35
+ early_stopping: bool = Field(default=True, description="Whether to stop the beam search when all beams finish generating.")
36
+ stop_sequences: Union[List[str], str] = Field(default=None, description="List of stop sequences.")
37
+ batch_size: Union[int, str] = Field(default=1, description="Number of input texts to process in a single batch.")
38
+
39
+ class ChatCompletionModelActionConfig(CommonModelInferenceActionConfig):
40
+ messages: Union[InputMessage, List[InputMessage]] = Field(..., description="Input messages to generate text from.")
41
+ params: ChatCompletionParamsConfig = Field(default_factory=ChatCompletionParamsConfig, description="Chat completion configuration parameters.")