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.
- {model_compose-0.3.13 → model_compose-0.3.15}/PKG-INFO +2 -1
- {model_compose-0.3.13 → model_compose-0.3.15}/README.md +1 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/pyproject.toml +1 -1
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/component/base.py +7 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/component/services/__init__.py +1 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/component/services/http_server.py +10 -1
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/component/services/model/base.py +14 -11
- model_compose-0.3.15/src/mindor/core/component/services/model/loader.py +25 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/component/services/model/tasks/image_to_text.py +34 -8
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/component/services/model/tasks/summarization.py +16 -11
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/component/services/model/tasks/text_classification.py +3 -3
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/component/services/model/tasks/text_embedding.py +3 -3
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/component/services/model/tasks/text_generation.py +19 -5
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/component/services/model/tasks/translation.py +16 -11
- model_compose-0.3.15/src/mindor/core/component/services/vector_store/__init__.py +1 -0
- model_compose-0.3.15/src/mindor/core/component/services/vector_store/base.py +28 -0
- model_compose-0.3.15/src/mindor/core/component/services/vector_store/drivers/__init__.py +2 -0
- model_compose-0.3.15/src/mindor/core/component/services/vector_store/drivers/chroma.py +278 -0
- model_compose-0.3.15/src/mindor/core/component/services/vector_store/drivers/milvus.py +333 -0
- model_compose-0.3.15/src/mindor/core/component/services/vector_store/vector_store.py +37 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/controller/services/http_server.py +1 -1
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/controller/webui/gradio.py +10 -1
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/services/async_service.py +14 -1
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/utils/shell.py +6 -14
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/workflow/schema.py +4 -2
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/__init__.py +1 -0
- model_compose-0.3.15/src/mindor/dsl/schema/action/impl/common.py +7 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/http_client.py +19 -19
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/http_server.py +17 -17
- {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
- model_compose-0.3.15/src/mindor/dsl/schema/action/impl/model/impl/chat_completion.py +41 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/model/impl/common.py +1 -1
- model_compose-0.3.15/src/mindor/dsl/schema/action/impl/model/impl/image_to_text.py +24 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/model/impl/summarization.py +8 -5
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/model/impl/text_classification.py +1 -1
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/model/impl/text_embedding.py +1 -1
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/model/impl/text_generation.py +10 -4
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/model/impl/translation.py +9 -6
- model_compose-0.3.15/src/mindor/dsl/schema/action/impl/vector_store/__init__.py +1 -0
- model_compose-0.3.15/src/mindor/dsl/schema/action/impl/vector_store/impl/__init__.py +4 -0
- model_compose-0.3.15/src/mindor/dsl/schema/action/impl/vector_store/impl/chroma.py +28 -0
- model_compose-0.3.15/src/mindor/dsl/schema/action/impl/vector_store/impl/common.py +85 -0
- model_compose-0.3.15/src/mindor/dsl/schema/action/impl/vector_store/impl/faiss.py +26 -0
- model_compose-0.3.15/src/mindor/dsl/schema/action/impl/vector_store/impl/milvus.py +30 -0
- model_compose-0.3.15/src/mindor/dsl/schema/action/impl/vector_store/impl/qdrant.py +26 -0
- model_compose-0.3.15/src/mindor/dsl/schema/action/impl/vector_store/vector_store.py +9 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/component/component.py +1 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/__init__.py +1 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/http_client.py +2 -2
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/mcp_client.py +1 -1
- {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
- model_compose-0.3.15/src/mindor/dsl/schema/component/impl/model/impl/chat_completion.py +17 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/model/impl/common.py +9 -6
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/types.py +1 -0
- model_compose-0.3.15/src/mindor/dsl/schema/component/impl/vector_store/__init__.py +1 -0
- model_compose-0.3.15/src/mindor/dsl/schema/component/impl/vector_store/impl/__init__.py +4 -0
- model_compose-0.3.15/src/mindor/dsl/schema/component/impl/vector_store/impl/chroma.py +27 -0
- model_compose-0.3.15/src/mindor/dsl/schema/component/impl/vector_store/impl/common.py +10 -0
- model_compose-0.3.15/src/mindor/dsl/schema/component/impl/vector_store/impl/faiss.py +18 -0
- model_compose-0.3.15/src/mindor/dsl/schema/component/impl/vector_store/impl/milvus.py +32 -0
- model_compose-0.3.15/src/mindor/dsl/schema/component/impl/vector_store/impl/qdrant.py +41 -0
- model_compose-0.3.15/src/mindor/dsl/schema/component/impl/vector_store/impl/types.py +7 -0
- model_compose-0.3.15/src/mindor/dsl/schema/component/impl/vector_store/vector_store.py +12 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/compose.py +5 -5
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/controller/webui/impl/common.py +1 -1
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/gateway/impl/common.py +3 -3
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/common.py +1 -1
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/job/impl/delay.py +1 -1
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/job/impl/random_router.py +3 -3
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/listener/impl/common.py +3 -3
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/listener/impl/http_callback.py +10 -10
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/logger/impl/common.py +2 -2
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/logger/impl/file.py +1 -1
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/runtime/impl/common.py +1 -1
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/workflow.py +2 -2
- {model_compose-0.3.13 → model_compose-0.3.15}/src/model_compose.egg-info/PKG-INFO +2 -1
- {model_compose-0.3.13 → model_compose-0.3.15}/src/model_compose.egg-info/SOURCES.txt +26 -0
- model_compose-0.3.13/src/mindor/dsl/schema/action/impl/common.py +0 -7
- model_compose-0.3.13/src/mindor/dsl/schema/action/impl/model/impl/image_to_text.py +0 -12
- {model_compose-0.3.13 → model_compose-0.3.15}/LICENSE +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/setup.cfg +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/__init__.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/cli/__init__.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/cli/compose.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/__init__.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/component/__init__.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/component/component.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/component/context.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/component/services/http_client.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/component/services/mcp_client.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/component/services/mcp_server.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/component/services/model/__init__.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/component/services/model/model.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/component/services/model/tasks/__init__.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/component/services/shell.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/component/services/text_splitter.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/component/services/workflow.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/compose/__init__.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/compose/compose.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/compose/manager.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/controller/__init__.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/controller/base.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/controller/controller.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/controller/runner/__init__.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/controller/runner/client.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/controller/runner/http_client.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/controller/runner/mcp_client.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/controller/runner/runner.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/controller/runtime/__init__.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/controller/runtime/docker/__init__.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/controller/runtime/docker/context/Dockerfile +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/controller/runtime/docker/docker.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/controller/runtime/native/__init__.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/controller/runtime/native/native.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/controller/runtime/specs.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/controller/services/__init__.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/controller/services/mcp_server.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/controller/webui/__init__.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/controller/webui/webui.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/gateway/__init__.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/gateway/base.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/gateway/gateway.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/gateway/services/__init__.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/gateway/services/http_tunnel.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/gateway/services/ssh_tunnel.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/listener/__init__.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/listener/base.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/listener/listener.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/listener/services/__init__.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/listener/services/http_callback.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/logger/__init__.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/logger/base.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/logger/logger.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/logger/logging.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/logger/services/__init__.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/logger/services/console.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/logger/services/file.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/runtime/__init__.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/runtime/docker/__init__.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/runtime/docker/docker.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/runtime/env.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/services/__init__.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/utils/__init__.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/utils/caching.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/utils/http_client.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/utils/http_request.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/utils/http_response.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/utils/http_status.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/utils/image.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/utils/mcp_client.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/utils/renderers.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/utils/resolvers.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/utils/ssh_client.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/utils/streamer.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/utils/streaming.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/utils/time.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/utils/workqueue.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/workflow/__init__.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/workflow/context.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/workflow/job/__init__.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/workflow/job/base.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/workflow/job/impl/__init__.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/workflow/job/impl/action.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/workflow/job/impl/delay.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/workflow/job/impl/filter.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/workflow/job/impl/if_.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/workflow/job/impl/random_router.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/workflow/job/impl/switch.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/workflow/job/job.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/workflow/workflow.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/__init__.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/loader.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/__init__.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/action/__init__.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/action/action.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/mcp_client.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/mcp_server.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/model/__init__.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/model/model.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/shell.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/text_splitter.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/action/impl/workflow.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/component/__init__.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/common.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/http_server.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/mcp_server.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/model/__init__.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/model/impl/image_to_text.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/model/impl/summarization.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/model/impl/text_classification.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/model/impl/text_embedding.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/model/impl/text_generation.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/model/impl/translation.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/model/impl/types.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/model/model.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/shell.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/text_splitter.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/component/impl/workflow.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/controller/__init__.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/controller/controller.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/controller/impl/__init__.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/controller/impl/common.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/controller/impl/http_server.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/controller/impl/mcp_server.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/controller/impl/types.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/controller/webui/__init__.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/controller/webui/impl/__init__.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/controller/webui/impl/dynamic.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/controller/webui/impl/gradio.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/controller/webui/impl/static.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/controller/webui/webui.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/gateway/__init__.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/gateway/gateway.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/gateway/impl/__init__.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/gateway/impl/http_tunnel/__init__.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/gateway/impl/http_tunnel/http_tunnel.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/__init__.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/cloudflare.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/gateway/impl/http_tunnel/impl/ngrok.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/gateway/impl/ssh_tunnel.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/gateway/impl/types.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/job/__init__.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/job/impl/__init__.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/job/impl/action.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/job/impl/common.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/job/impl/filter.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/job/impl/if_.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/job/impl/switch.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/job/impl/types.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/job/job.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/listener/__init__.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/listener/impl/__init__.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/listener/impl/types.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/listener/listener.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/logger/__init__.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/logger/impl/__init__.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/logger/impl/console.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/logger/impl/types.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/logger/logger.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/runtime/__init__.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/runtime/impl/__init__.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/runtime/impl/docker.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/runtime/impl/native.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/runtime/impl/types.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/runtime/runtime.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/transport/__init__.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/transport/http.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/schema/transport/ssh.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/utils/__init__.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/utils/annotation.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/dsl/utils/enum.py +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/model_compose.egg-info/dependency_links.txt +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/model_compose.egg-info/entry_points.txt +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/model_compose.egg-info/requires.txt +0 -0
- {model_compose-0.3.13 → model_compose-0.3.15}/src/model_compose.egg-info/top_level.txt +0 -0
- {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.
|
|
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.
|
|
@@ -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
|
{model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/component/services/http_server.py
RENAMED
|
@@ -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
|
|
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)
|
{model_compose-0.3.13 → model_compose-0.3.15}/src/mindor/core/component/services/model/base.py
RENAMED
|
@@ -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.
|
|
108
|
-
|
|
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
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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
|
|
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
|
|
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 =
|
|
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
|
-
|
|
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
|
|
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
|
|
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 =
|
|
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
|
|
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
|
|
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 =
|
|
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
|
|
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
|
|
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 =
|
|
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
|
|
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
|
|
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 =
|
|
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
|
-
|
|
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
|
|
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
|
|
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]] = {}
|