model-compose 0.3.4__tar.gz → 0.3.6__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.4/src/model_compose.egg-info → model_compose-0.3.6}/PKG-INFO +1 -1
- {model_compose-0.3.4 → model_compose-0.3.6}/pyproject.toml +1 -1
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/component/services/http_client.py +1 -1
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/component/services/model/base.py +8 -3
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/component/services/model/tasks/summarization.py +54 -27
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/component/services/model/tasks/text_classification.py +2 -2
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/component/services/model/tasks/text_embedding.py +2 -2
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/component/services/model/tasks/text_generation.py +46 -23
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/component/services/model/tasks/translation.py +55 -25
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/controller/services/http_server.py +41 -18
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/controller/webui/gradio.py +7 -4
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/runtime/docker/docker.py +1 -1
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/services/async_service.py +23 -1
- model_compose-0.3.6/src/mindor/core/utils/streamer.py +29 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/workflow/workflow.py +3 -1
- model_compose-0.3.6/src/mindor/dsl/schema/action/impl/model/impl/common.py +18 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/action/impl/model/impl/summarization.py +5 -3
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/action/impl/model/impl/text_classification.py +2 -2
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/action/impl/model/impl/text_embedding.py +2 -2
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/action/impl/model/impl/text_generation.py +3 -3
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/action/impl/model/impl/translation.py +6 -2
- {model_compose-0.3.4 → model_compose-0.3.6/src/model_compose.egg-info}/PKG-INFO +1 -1
- {model_compose-0.3.4 → model_compose-0.3.6}/src/model_compose.egg-info/SOURCES.txt +1 -0
- model_compose-0.3.4/src/mindor/dsl/schema/action/impl/model/impl/common.py +0 -11
- {model_compose-0.3.4 → model_compose-0.3.6}/LICENSE +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/README.md +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/setup.cfg +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/cli/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/cli/compose.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/component/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/component/base.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/component/component.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/component/context.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/component/services/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/component/services/http_server.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/component/services/mcp_client.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/component/services/mcp_server.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/component/services/model/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/component/services/model/model.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/component/services/model/tasks/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/component/services/shell.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/component/services/text_splitter.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/component/services/workflow.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/compose/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/compose/compose.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/compose/manager.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/controller/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/controller/base.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/controller/controller.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/controller/runner/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/controller/runner/client.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/controller/runner/http_client.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/controller/runner/mcp_client.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/controller/runner/runner.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/controller/runtime/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/controller/runtime/docker/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/controller/runtime/docker/context/Dockerfile +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/controller/runtime/docker/docker.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/controller/runtime/specs.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/controller/services/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/controller/services/mcp_server.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/controller/webui/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/controller/webui/webui.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/gateway/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/gateway/base.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/gateway/gateway.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/gateway/services/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/gateway/services/http_tunnel.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/gateway/services/ssh_tunnel.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/listener/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/listener/base.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/listener/listener.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/listener/services/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/listener/services/http_callback.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/logger/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/logger/base.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/logger/logger.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/logger/logging.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/logger/services/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/logger/services/console.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/logger/services/file.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/runtime/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/runtime/docker/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/runtime/env.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/services/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/utils/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/utils/caching.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/utils/http_client.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/utils/http_request.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/utils/http_status.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/utils/image.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/utils/mcp_client.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/utils/renderers.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/utils/resolvers.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/utils/ssh_client.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/utils/streaming.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/utils/time.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/utils/workqueue.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/workflow/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/workflow/context.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/workflow/job/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/workflow/job/base.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/workflow/job/impl/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/workflow/job/impl/action.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/workflow/job/impl/delay.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/workflow/job/impl/if_.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/workflow/job/impl/random_router.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/workflow/job/impl/switch.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/workflow/job/job.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/workflow/schema.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/loader.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/action/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/action/action.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/action/impl/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/action/impl/common.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/action/impl/http_client.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/action/impl/http_server.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/action/impl/mcp_client.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/action/impl/mcp_server.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/action/impl/model/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/action/impl/model/impl/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/action/impl/model/model.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/action/impl/shell.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/action/impl/text_splitter.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/action/impl/workflow.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/component/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/component/component.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/component/impl/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/component/impl/common.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/component/impl/http_client.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/component/impl/http_server.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/component/impl/mcp_client.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/component/impl/mcp_server.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/component/impl/model/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/component/impl/model/impl/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/component/impl/model/impl/common.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/component/impl/model/impl/summarization.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/component/impl/model/impl/text_classification.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/component/impl/model/impl/text_embedding.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/component/impl/model/impl/text_generation.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/component/impl/model/impl/translation.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/component/impl/model/impl/types.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/component/impl/model/model.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/component/impl/shell.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/component/impl/text_splitter.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/component/impl/types.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/component/impl/workflow.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/compose.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/controller/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/controller/controller.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/controller/impl/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/controller/impl/common.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/controller/impl/http_server.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/controller/impl/mcp_server.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/controller/impl/types.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/controller/webui/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/controller/webui/impl/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/controller/webui/impl/common.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/controller/webui/impl/dynamic.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/controller/webui/impl/gradio.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/controller/webui/impl/static.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/controller/webui/webui.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/gateway/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/gateway/gateway.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/gateway/impl/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/gateway/impl/common.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/gateway/impl/http_tunnel.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/gateway/impl/ssh_tunnel.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/gateway/impl/types.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/job/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/job/impl/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/job/impl/action.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/job/impl/common.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/job/impl/delay.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/job/impl/if_.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/job/impl/random_router.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/job/impl/switch.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/job/impl/types.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/job/job.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/listener/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/listener/impl/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/listener/impl/common.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/listener/impl/http_callback.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/listener/impl/types.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/listener/listener.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/logger/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/logger/impl/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/logger/impl/common.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/logger/impl/console.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/logger/impl/file.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/logger/impl/types.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/logger/logger.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/runtime/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/runtime/impl/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/runtime/impl/common.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/runtime/impl/docker.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/runtime/impl/native.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/runtime/impl/types.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/runtime/runtime.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/schema/workflow.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/utils/__init__.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/utils/annotation.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/dsl/utils/enum.py +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/model_compose.egg-info/dependency_links.txt +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/model_compose.egg-info/entry_points.txt +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/model_compose.egg-info/requires.txt +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/src/model_compose.egg-info/top_level.txt +0 -0
- {model_compose-0.3.4 → model_compose-0.3.6}/tests/test_cli.py +0 -0
{model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/component/services/http_client.py
RENAMED
|
@@ -62,7 +62,7 @@ class HttpClientPollingCompletion(HttpClientCompletion):
|
|
|
62
62
|
class HttpClientCallbackCompletion(HttpClientCompletion):
|
|
63
63
|
async def run(self, context: ComponentActionContext, client: HttpClient) -> Any:
|
|
64
64
|
callback_id = await context.render_variable(self.config.wait_for)
|
|
65
|
-
future: asyncio.Future = asyncio.
|
|
65
|
+
future: asyncio.Future = asyncio.get_running_loop().create_future()
|
|
66
66
|
HttpCallbackListener.register_pending_future(callback_id, future)
|
|
67
67
|
|
|
68
68
|
return await future
|
{model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/component/services/model/base.py
RENAMED
|
@@ -5,7 +5,7 @@ from mindor.dsl.schema.action import ModelActionConfig
|
|
|
5
5
|
from mindor.core.services import AsyncService
|
|
6
6
|
from ...context import ComponentActionContext
|
|
7
7
|
from transformers import PreTrainedModel, PreTrainedTokenizer
|
|
8
|
-
import torch
|
|
8
|
+
import torch, asyncio
|
|
9
9
|
|
|
10
10
|
class ModelTaskService(AsyncService):
|
|
11
11
|
def __init__(self, id: str, config: ModelComponentConfig, daemon: bool):
|
|
@@ -15,10 +15,15 @@ class ModelTaskService(AsyncService):
|
|
|
15
15
|
self.config: ModelComponentConfig = config
|
|
16
16
|
|
|
17
17
|
async def run(self, action: ModelActionConfig, context: ComponentActionContext) -> Any:
|
|
18
|
-
|
|
18
|
+
loop: asyncio.AbstractEventLoop = asyncio.get_running_loop()
|
|
19
|
+
|
|
20
|
+
async def _run():
|
|
21
|
+
return await self._run(action, context, loop)
|
|
22
|
+
|
|
23
|
+
return await self.run_in_thread(_run)
|
|
19
24
|
|
|
20
25
|
@abstractmethod
|
|
21
|
-
async def _run(self, action: ModelActionConfig, context: ComponentActionContext) -> Any:
|
|
26
|
+
async def _run(self, action: ModelActionConfig, context: ComponentActionContext, loop: asyncio.AbstractEventLoop) -> Any:
|
|
22
27
|
pass
|
|
23
28
|
|
|
24
29
|
def _load_pretrained_model(self, extra_params: Optional[Dict[str, Any]] = None) -> PreTrainedModel:
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Any
|
|
2
2
|
from mindor.dsl.schema.component import ModelComponentConfig
|
|
3
3
|
from mindor.dsl.schema.action import ModelActionConfig, SummarizationModelActionConfig
|
|
4
|
+
from mindor.core.utils.streamer import AsyncStreamer
|
|
4
5
|
from mindor.core.logger import logging
|
|
5
6
|
from ..base import ModelTaskService, ModelTaskType, register_model_task_service
|
|
6
7
|
from ..base import ComponentActionContext
|
|
7
|
-
from transformers import AutoModelForSeq2SeqLM, AutoTokenizer, PreTrainedModel, PreTrainedTokenizer, GenerationMixin
|
|
8
|
+
from transformers import AutoModelForSeq2SeqLM, AutoTokenizer, PreTrainedModel, PreTrainedTokenizer, GenerationMixin, TextIteratorStreamer
|
|
9
|
+
from threading import Thread
|
|
8
10
|
from torch import Tensor
|
|
9
|
-
import torch
|
|
11
|
+
import torch, asyncio
|
|
10
12
|
|
|
11
13
|
class SummarizationTaskAction:
|
|
12
14
|
def __init__(self, config: SummarizationModelActionConfig, model: Union[PreTrainedModel, GenerationMixin], tokenizer: PreTrainedTokenizer, device: torch.device):
|
|
@@ -15,46 +17,71 @@ class SummarizationTaskAction:
|
|
|
15
17
|
self.tokenizer: PreTrainedTokenizer = tokenizer
|
|
16
18
|
self.device: torch.device = device
|
|
17
19
|
|
|
18
|
-
async def run(self, context: ComponentActionContext) -> Any:
|
|
20
|
+
async def run(self, context: ComponentActionContext, loop: asyncio.AbstractEventLoop) -> Any:
|
|
19
21
|
text: Union[str, List[str]] = await context.render_variable(self.config.text)
|
|
20
22
|
|
|
21
23
|
max_input_length = await context.render_variable(self.config.params.max_input_length)
|
|
22
24
|
max_output_length = await context.render_variable(self.config.params.max_output_length)
|
|
23
25
|
min_output_length = await context.render_variable(self.config.params.min_output_length)
|
|
24
26
|
num_beams = await context.render_variable(self.config.params.num_beams)
|
|
25
|
-
length_penalty = await context.render_variable(self.config.params.length_penalty)
|
|
26
|
-
early_stopping = await context.render_variable(self.config.params.early_stopping)
|
|
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
|
|
27
29
|
do_sample = await context.render_variable(self.config.params.do_sample)
|
|
30
|
+
top_k = await context.render_variable(self.config.params.top_k) if do_sample else None
|
|
31
|
+
top_p = await context.render_variable(self.config.params.top_p) if do_sample else None
|
|
28
32
|
batch_size = await context.render_variable(self.config.params.batch_size)
|
|
33
|
+
stream = await context.render_variable(self.config.stream)
|
|
29
34
|
|
|
30
35
|
texts: List[str] = [ text ] if isinstance(text, str) else text
|
|
31
36
|
results = []
|
|
32
37
|
|
|
38
|
+
if stream and (batch_size != 1 or len(texts) != 1):
|
|
39
|
+
raise ValueError("Streaming mode only supports a single input text with batch size of 1.")
|
|
40
|
+
|
|
41
|
+
streamer = TextIteratorStreamer(self.tokenizer, skip_prompt=True, skip_special_tokens=True) if stream else None
|
|
33
42
|
for index in range(0, len(texts), batch_size):
|
|
34
43
|
batch_texts = texts[index:index + batch_size]
|
|
35
44
|
inputs: Dict[str, Tensor] = self.tokenizer(batch_texts, return_tensors="pt", max_length=max_input_length, padding=True, truncation=True)
|
|
36
45
|
inputs = { k: v.to(self.device) for k, v in inputs.items() }
|
|
37
46
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
47
|
+
def _generate():
|
|
48
|
+
with torch.no_grad():
|
|
49
|
+
outputs = self.model.generate(
|
|
50
|
+
**inputs,
|
|
51
|
+
max_length=max_output_length,
|
|
52
|
+
min_length=min_output_length,
|
|
53
|
+
num_beams=num_beams,
|
|
54
|
+
length_penalty=length_penalty,
|
|
55
|
+
early_stopping=early_stopping,
|
|
56
|
+
do_sample=do_sample,
|
|
57
|
+
top_k=top_k,
|
|
58
|
+
top_p=top_p,
|
|
59
|
+
pad_token_id=getattr(self.tokenizer, "pad_token_id", None),
|
|
60
|
+
eos_token_id=getattr(self.tokenizer, "eos_token_id", None),
|
|
61
|
+
streamer=streamer
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
outputs = self.tokenizer.batch_decode(outputs, skip_special_tokens=True)
|
|
65
|
+
results.extend(outputs)
|
|
66
|
+
|
|
67
|
+
if stream:
|
|
68
|
+
thread = Thread(target=_generate)
|
|
69
|
+
thread.start()
|
|
70
|
+
else:
|
|
71
|
+
_generate()
|
|
72
|
+
|
|
73
|
+
if stream:
|
|
74
|
+
async def _stream_generator():
|
|
75
|
+
async for result in AsyncStreamer(streamer, loop):
|
|
76
|
+
context.register_source("result", result)
|
|
77
|
+
yield (await context.render_variable(self.config.output, ignore_files=True)) if self.config.output else result
|
|
78
|
+
|
|
79
|
+
return _stream_generator()
|
|
80
|
+
else:
|
|
81
|
+
result = results if len(results) > 1 else results[0]
|
|
82
|
+
context.register_source("result", result)
|
|
83
|
+
|
|
84
|
+
return (await context.render_variable(self.config.output, ignore_files=True)) if self.config.output else result
|
|
58
85
|
|
|
59
86
|
@register_model_task_service(ModelTaskType.SUMMARIZATION)
|
|
60
87
|
class SummarizationTaskService(ModelTaskService):
|
|
@@ -80,8 +107,8 @@ class SummarizationTaskService(ModelTaskService):
|
|
|
80
107
|
self.tokenizer = None
|
|
81
108
|
self.device = None
|
|
82
109
|
|
|
83
|
-
async def _run(self, action: ModelActionConfig, context: ComponentActionContext) -> Any:
|
|
84
|
-
return await SummarizationTaskAction(action, self.model, self.tokenizer, self.device).run(context)
|
|
110
|
+
async def _run(self, action: ModelActionConfig, context: ComponentActionContext, loop: asyncio.AbstractEventLoop) -> Any:
|
|
111
|
+
return await SummarizationTaskAction(action, self.model, self.tokenizer, self.device).run(context, loop)
|
|
85
112
|
|
|
86
113
|
def _get_model_class(self) -> Type[PreTrainedModel]:
|
|
87
114
|
return AutoModelForSeq2SeqLM
|
|
@@ -8,7 +8,7 @@ from transformers import AutoModelForSequenceClassification, AutoTokenizer, PreT
|
|
|
8
8
|
from transformers.modeling_outputs import SequenceClassifierOutput
|
|
9
9
|
import torch.nn.functional as F
|
|
10
10
|
from torch import Tensor
|
|
11
|
-
import torch
|
|
11
|
+
import torch, asyncio
|
|
12
12
|
|
|
13
13
|
class TextClassificationTaskAction:
|
|
14
14
|
def __init__(self, config: TextClassificationModelActionConfig, model: PreTrainedModel, tokenizer: PreTrainedTokenizer, device: torch.device):
|
|
@@ -80,7 +80,7 @@ class TextClassificationTaskService(ModelTaskService):
|
|
|
80
80
|
self.tokenizer = None
|
|
81
81
|
self.device = None
|
|
82
82
|
|
|
83
|
-
async def _run(self, action: ModelActionConfig, context: ComponentActionContext) -> Any:
|
|
83
|
+
async def _run(self, action: ModelActionConfig, context: ComponentActionContext, loop: asyncio.AbstractEventLoop) -> Any:
|
|
84
84
|
return await TextClassificationTaskAction(action, self.model, self.tokenizer, self.device).run(context, self.config.labels)
|
|
85
85
|
|
|
86
86
|
def _get_model_class(self) -> Type[PreTrainedModel]:
|
|
@@ -7,7 +7,7 @@ from ..base import ComponentActionContext
|
|
|
7
7
|
from transformers import AutoModel, AutoTokenizer, PreTrainedModel, PreTrainedTokenizer
|
|
8
8
|
from transformers.modeling_outputs import BaseModelOutput
|
|
9
9
|
from torch import Tensor
|
|
10
|
-
import torch
|
|
10
|
+
import torch, asyncio
|
|
11
11
|
|
|
12
12
|
class TextEmbeddingTaskAction:
|
|
13
13
|
def __init__(self, config: TextEmbeddingModelActionConfig, model: PreTrainedModel, tokenizer: PreTrainedTokenizer, device: torch.device):
|
|
@@ -94,7 +94,7 @@ class TextEmbeddingTaskService(ModelTaskService):
|
|
|
94
94
|
self.tokenizer = None
|
|
95
95
|
self.device = None
|
|
96
96
|
|
|
97
|
-
async def _run(self, action: ModelActionConfig, context: ComponentActionContext) -> Any:
|
|
97
|
+
async def _run(self, action: ModelActionConfig, context: ComponentActionContext, loop: asyncio.AbstractEventLoop) -> Any:
|
|
98
98
|
return await TextEmbeddingTaskAction(action, self.model, self.tokenizer, self.device).run(context)
|
|
99
99
|
|
|
100
100
|
def _get_model_class(self) -> Type[PreTrainedModel]:
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Any
|
|
2
2
|
from mindor.dsl.schema.component import ModelComponentConfig
|
|
3
3
|
from mindor.dsl.schema.action import ModelActionConfig, TextGenerationModelActionConfig
|
|
4
|
+
from mindor.core.utils.streamer import AsyncStreamer
|
|
4
5
|
from mindor.core.logger import logging
|
|
5
6
|
from ..base import ModelTaskService, ModelTaskType, register_model_task_service
|
|
6
7
|
from ..base import ComponentActionContext
|
|
7
|
-
from transformers import AutoModelForCausalLM, AutoTokenizer, PreTrainedModel, PreTrainedTokenizer, GenerationMixin
|
|
8
|
+
from transformers import AutoModelForCausalLM, AutoTokenizer, PreTrainedModel, PreTrainedTokenizer, GenerationMixin, TextIteratorStreamer
|
|
9
|
+
from threading import Thread
|
|
8
10
|
from torch import Tensor
|
|
9
|
-
import torch
|
|
11
|
+
import torch, asyncio
|
|
10
12
|
|
|
11
13
|
class TextGenerationTaskAction:
|
|
12
14
|
def __init__(self, config: TextGenerationModelActionConfig, model: Union[PreTrainedModel, GenerationMixin], tokenizer: PreTrainedTokenizer, device: torch.device):
|
|
@@ -15,7 +17,7 @@ class TextGenerationTaskAction:
|
|
|
15
17
|
self.tokenizer: PreTrainedTokenizer = tokenizer
|
|
16
18
|
self.device: torch.device = device
|
|
17
19
|
|
|
18
|
-
async def run(self, context: ComponentActionContext) -> Any:
|
|
20
|
+
async def run(self, context: ComponentActionContext, loop: asyncio.AbstractEventLoop) -> Any:
|
|
19
21
|
prompt: Union[str, List[str]] = await context.render_variable(self.config.prompt)
|
|
20
22
|
|
|
21
23
|
max_output_length = await context.render_variable(self.config.params.max_output_length)
|
|
@@ -24,33 +26,54 @@ class TextGenerationTaskAction:
|
|
|
24
26
|
top_k = await context.render_variable(self.config.params.top_k)
|
|
25
27
|
top_p = await context.render_variable(self.config.params.top_p)
|
|
26
28
|
batch_size = await context.render_variable(self.config.params.batch_size)
|
|
29
|
+
stream = await context.render_variable(self.config.stream)
|
|
27
30
|
|
|
28
31
|
prompts: List[str] = [ prompt ] if isinstance(prompt, str) else prompt
|
|
29
32
|
results = []
|
|
30
33
|
|
|
34
|
+
if stream and (batch_size != 1 or len(prompts) != 1):
|
|
35
|
+
raise ValueError("Streaming mode only supports a single input prompt with batch size of 1.")
|
|
36
|
+
|
|
37
|
+
streamer = TextIteratorStreamer(self.tokenizer, skip_prompt=True, skip_special_tokens=True) if stream else None
|
|
31
38
|
for index in range(0, len(prompts), batch_size):
|
|
32
39
|
batch_prompts = prompts[index:index + batch_size]
|
|
33
40
|
inputs: Dict[str, Tensor] = self.tokenizer(batch_prompts, return_tensors="pt", padding=True, truncation=True)
|
|
34
41
|
inputs = { k: v.to(self.device) for k, v in inputs.items() }
|
|
35
42
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
43
|
+
def _generate():
|
|
44
|
+
with torch.no_grad():
|
|
45
|
+
outputs = self.model.generate(
|
|
46
|
+
**inputs,
|
|
47
|
+
max_new_tokens=max_output_length,
|
|
48
|
+
num_return_sequences=num_return_sequences,
|
|
49
|
+
temperature=temperature,
|
|
50
|
+
do_sample=True,
|
|
51
|
+
top_k=top_k,
|
|
52
|
+
top_p=top_p,
|
|
53
|
+
streamer=streamer
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
outputs = self.tokenizer.batch_decode(outputs, skip_special_tokens=True)
|
|
57
|
+
results.extend(outputs)
|
|
58
|
+
|
|
59
|
+
if stream:
|
|
60
|
+
thread = Thread(target=_generate)
|
|
61
|
+
thread.start()
|
|
62
|
+
else:
|
|
63
|
+
_generate()
|
|
64
|
+
|
|
65
|
+
if stream:
|
|
66
|
+
async def _stream_generator():
|
|
67
|
+
async for result in AsyncStreamer(streamer, loop):
|
|
68
|
+
context.register_source("result", result)
|
|
69
|
+
yield (await context.render_variable(self.config.output, ignore_files=True)) if self.config.output else result
|
|
70
|
+
|
|
71
|
+
return _stream_generator()
|
|
72
|
+
else:
|
|
73
|
+
result = results if len(results) > 1 else results[0]
|
|
74
|
+
context.register_source("result", result)
|
|
75
|
+
|
|
76
|
+
return (await context.render_variable(self.config.output, ignore_files=True)) if self.config.output else result
|
|
54
77
|
|
|
55
78
|
@register_model_task_service(ModelTaskType.TEXT_GENERATION)
|
|
56
79
|
class TextGenerationTaskService(ModelTaskService):
|
|
@@ -76,8 +99,8 @@ class TextGenerationTaskService(ModelTaskService):
|
|
|
76
99
|
self.tokenizer = None
|
|
77
100
|
self.device = None
|
|
78
101
|
|
|
79
|
-
async def _run(self, action: ModelActionConfig, context: ComponentActionContext) -> Any:
|
|
80
|
-
return await TextGenerationTaskAction(action, self.model, self.tokenizer, self.device).run(context)
|
|
102
|
+
async def _run(self, action: ModelActionConfig, context: ComponentActionContext, loop: asyncio.AbstractEventLoop) -> Any:
|
|
103
|
+
return await TextGenerationTaskAction(action, self.model, self.tokenizer, self.device).run(context, loop)
|
|
81
104
|
|
|
82
105
|
def _get_model_class(self) -> Type[PreTrainedModel]:
|
|
83
106
|
return AutoModelForCausalLM
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Any
|
|
2
2
|
from mindor.dsl.schema.component import ModelComponentConfig
|
|
3
3
|
from mindor.dsl.schema.action import ModelActionConfig, TranslationModelActionConfig
|
|
4
|
+
from mindor.core.utils.streamer import AsyncStreamer
|
|
4
5
|
from mindor.core.logger import logging
|
|
5
6
|
from ..base import ModelTaskService, ModelTaskType, register_model_task_service
|
|
6
7
|
from ..base import ComponentActionContext
|
|
7
|
-
from transformers import AutoModelForSeq2SeqLM, AutoTokenizer, PreTrainedModel, PreTrainedTokenizer, GenerationMixin
|
|
8
|
+
from transformers import AutoModelForSeq2SeqLM, AutoTokenizer, PreTrainedModel, PreTrainedTokenizer, GenerationMixin, TextIteratorStreamer
|
|
9
|
+
from threading import Thread
|
|
8
10
|
from torch import Tensor
|
|
9
|
-
import torch
|
|
11
|
+
import torch, asyncio
|
|
10
12
|
|
|
11
13
|
class TranslationTaskAction:
|
|
12
14
|
def __init__(self, config: TranslationModelActionConfig, model: Union[PreTrainedModel, GenerationMixin], tokenizer: PreTrainedTokenizer, device: torch.device):
|
|
@@ -15,43 +17,71 @@ class TranslationTaskAction:
|
|
|
15
17
|
self.tokenizer: PreTrainedTokenizer = tokenizer
|
|
16
18
|
self.device: torch.device = device
|
|
17
19
|
|
|
18
|
-
async def run(self, context: ComponentActionContext) -> Any:
|
|
20
|
+
async def run(self, context: ComponentActionContext, loop: asyncio.AbstractEventLoop) -> Any:
|
|
19
21
|
text: Union[str, List[str]] = await context.render_variable(self.config.text)
|
|
20
22
|
|
|
21
23
|
max_input_length = await context.render_variable(self.config.params.max_input_length)
|
|
22
24
|
max_output_length = await context.render_variable(self.config.params.max_output_length)
|
|
23
25
|
min_output_length = await context.render_variable(self.config.params.min_output_length)
|
|
24
26
|
num_beams = await context.render_variable(self.config.params.num_beams)
|
|
25
|
-
length_penalty = await context.render_variable(self.config.params.length_penalty)
|
|
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
|
+
do_sample = await context.render_variable(self.config.params.do_sample)
|
|
30
|
+
top_k = await context.render_variable(self.config.params.top_k) if do_sample else None
|
|
31
|
+
top_p = await context.render_variable(self.config.params.top_p) if do_sample else None
|
|
26
32
|
batch_size = await context.render_variable(self.config.params.batch_size)
|
|
33
|
+
stream = await context.render_variable(self.config.stream)
|
|
27
34
|
|
|
28
35
|
texts: List[str] = [ text ] if isinstance(text, str) else text
|
|
29
36
|
results = []
|
|
30
37
|
|
|
38
|
+
if stream and (batch_size != 1 or len(texts) != 1):
|
|
39
|
+
raise ValueError("Streaming mode only supports a single input text with batch size of 1.")
|
|
40
|
+
|
|
41
|
+
streamer = TextIteratorStreamer(self.tokenizer, skip_prompt=True, skip_special_tokens=True) if stream else None
|
|
31
42
|
for index in range(0, len(texts), batch_size):
|
|
32
43
|
batch_texts = texts[index:index + batch_size]
|
|
33
44
|
inputs: Dict[str, Tensor] = self.tokenizer(batch_texts, return_tensors="pt", max_length=max_input_length, padding=True, truncation=True)
|
|
34
45
|
inputs = { k: v.to(self.device) for k, v in inputs.items() }
|
|
35
46
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
47
|
+
def _generate():
|
|
48
|
+
with torch.no_grad():
|
|
49
|
+
outputs = self.model.generate(
|
|
50
|
+
**inputs,
|
|
51
|
+
max_length=max_output_length,
|
|
52
|
+
min_length=min_output_length,
|
|
53
|
+
num_beams=num_beams,
|
|
54
|
+
length_penalty=length_penalty,
|
|
55
|
+
early_stopping=early_stopping,
|
|
56
|
+
do_sample=do_sample,
|
|
57
|
+
top_k=top_k,
|
|
58
|
+
top_p=top_p,
|
|
59
|
+
pad_token_id=getattr(self.tokenizer, "pad_token_id", None),
|
|
60
|
+
eos_token_id=getattr(self.tokenizer, "eos_token_id", None),
|
|
61
|
+
streamer=streamer
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
outputs = self.tokenizer.batch_decode(outputs, skip_special_tokens=True)
|
|
65
|
+
results.extend(outputs)
|
|
66
|
+
|
|
67
|
+
if stream:
|
|
68
|
+
thread = Thread(target=_generate)
|
|
69
|
+
thread.start()
|
|
70
|
+
else:
|
|
71
|
+
_generate()
|
|
72
|
+
|
|
73
|
+
if stream:
|
|
74
|
+
async def _stream_generator():
|
|
75
|
+
async for result in AsyncStreamer(streamer, loop):
|
|
76
|
+
context.register_source("result", result)
|
|
77
|
+
yield (await context.render_variable(self.config.output, ignore_files=True)) if self.config.output else result
|
|
78
|
+
|
|
79
|
+
return _stream_generator()
|
|
80
|
+
else:
|
|
81
|
+
result = results if len(results) > 1 else results[0]
|
|
82
|
+
context.register_source("result", result)
|
|
83
|
+
|
|
84
|
+
return (await context.render_variable(self.config.output, ignore_files=True)) if self.config.output else result
|
|
55
85
|
|
|
56
86
|
@register_model_task_service(ModelTaskType.TRANSLATION)
|
|
57
87
|
class TranslationTaskService(ModelTaskService):
|
|
@@ -77,8 +107,8 @@ class TranslationTaskService(ModelTaskService):
|
|
|
77
107
|
self.tokenizer = None
|
|
78
108
|
self.device = None
|
|
79
109
|
|
|
80
|
-
async def _run(self, action: ModelActionConfig, context: ComponentActionContext) -> Any:
|
|
81
|
-
return await TranslationTaskAction(action, self.model, self.tokenizer, self.device).run(context)
|
|
110
|
+
async def _run(self, action: ModelActionConfig, context: ComponentActionContext, loop: asyncio.AbstractEventLoop) -> Any:
|
|
111
|
+
return await TranslationTaskAction(action, self.model, self.tokenizer, self.device).run(context, loop)
|
|
82
112
|
|
|
83
113
|
def _get_model_class(self) -> Type[PreTrainedModel]:
|
|
84
114
|
return AutoModelForSeq2SeqLM
|
{model_compose-0.3.4 → model_compose-0.3.6}/src/mindor/core/controller/services/http_server.py
RENAMED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, AsyncIterator, Any
|
|
2
|
+
from types import AsyncGeneratorType
|
|
2
3
|
from typing_extensions import Self
|
|
3
4
|
from pydantic import BaseModel
|
|
4
5
|
from mindor.dsl.schema.controller import HttpServerControllerConfig
|
|
@@ -15,7 +16,7 @@ from fastapi import FastAPI, APIRouter, Request, Body, HTTPException
|
|
|
15
16
|
from fastapi.middleware.cors import CORSMiddleware
|
|
16
17
|
from fastapi.responses import Response, JSONResponse, StreamingResponse
|
|
17
18
|
from starlette.background import BackgroundTask
|
|
18
|
-
import uvicorn
|
|
19
|
+
import uvicorn, json
|
|
19
20
|
|
|
20
21
|
class WorkflowTaskRequestBody(BaseModel):
|
|
21
22
|
workflow_id: Optional[str] = None
|
|
@@ -80,6 +81,9 @@ class HttpServerController(ControllerService):
|
|
|
80
81
|
if body.output_only and not body.wait_for_completion:
|
|
81
82
|
raise HTTPException(status_code=400, detail="output_only requires wait_for_completion=true.")
|
|
82
83
|
|
|
84
|
+
if not body.output_only and isinstance(state.output, (StreamResource, AsyncGeneratorType)):
|
|
85
|
+
raise HTTPException(status_code=400, detail="Streaming output is only allowed when output_only=true.")
|
|
86
|
+
|
|
83
87
|
if body.output_only:
|
|
84
88
|
return self._render_task_output(state)
|
|
85
89
|
|
|
@@ -95,6 +99,9 @@ class HttpServerController(ControllerService):
|
|
|
95
99
|
if not state:
|
|
96
100
|
raise HTTPException(status_code=404, detail="Task not found.")
|
|
97
101
|
|
|
102
|
+
if not output_only and isinstance(state.output, (StreamResource, AsyncGeneratorType)):
|
|
103
|
+
raise HTTPException(status_code=400, detail="Streaming output is only allowed when output_only=true.")
|
|
104
|
+
|
|
98
105
|
if output_only:
|
|
99
106
|
return self._render_task_output(state)
|
|
100
107
|
|
|
@@ -138,13 +145,44 @@ class HttpServerController(ControllerService):
|
|
|
138
145
|
if state.status == TaskStatus.FAILED:
|
|
139
146
|
raise HTTPException(status_code=500, detail=str(state.error))
|
|
140
147
|
|
|
148
|
+
if isinstance(state.output, AsyncGeneratorType):
|
|
149
|
+
return self._render_async_generator(state.output)
|
|
150
|
+
|
|
141
151
|
if isinstance(state.output, HttpEventStreamResource):
|
|
142
152
|
return self._render_event_stream_resource(state.output)
|
|
143
153
|
|
|
144
154
|
if isinstance(state.output, StreamResource):
|
|
145
155
|
return self._render_stream_resource(state.output)
|
|
146
|
-
|
|
156
|
+
|
|
147
157
|
return JSONResponse(content=state.output)
|
|
158
|
+
|
|
159
|
+
def _render_async_generator(self, generator: AsyncGeneratorType) -> Response:
|
|
160
|
+
async def _event_generator() -> AsyncIterator[bytes]:
|
|
161
|
+
async for chunk in generator:
|
|
162
|
+
if not isinstance(chunk, str):
|
|
163
|
+
chunk = json.dumps()
|
|
164
|
+
yield b"data: " + chunk.encode("utf-8") + b"\n\n"
|
|
165
|
+
|
|
166
|
+
return StreamingResponse(
|
|
167
|
+
_event_generator(),
|
|
168
|
+
media_type="text/event-stream",
|
|
169
|
+
headers={ "Cache-Control": "no-cache" }
|
|
170
|
+
)
|
|
171
|
+
|
|
172
|
+
def _render_event_stream_resource(self, resource: HttpEventStreamResource) -> Response:
|
|
173
|
+
async def _event_generator() -> AsyncIterator[bytes]:
|
|
174
|
+
async for chunk in resource:
|
|
175
|
+
yield b"data: " + chunk + b"\n\n"
|
|
176
|
+
|
|
177
|
+
async def _close_stream():
|
|
178
|
+
await resource.close()
|
|
179
|
+
|
|
180
|
+
return StreamingResponse(
|
|
181
|
+
_event_generator(),
|
|
182
|
+
media_type="text/event-stream",
|
|
183
|
+
headers={ "Cache-Control": "no-cache" },
|
|
184
|
+
background=BackgroundTask(_close_stream)
|
|
185
|
+
)
|
|
148
186
|
|
|
149
187
|
def _render_stream_resource(self, resource: StreamResource) -> Response:
|
|
150
188
|
async def _close_stream():
|
|
@@ -156,7 +194,7 @@ class HttpServerController(ControllerService):
|
|
|
156
194
|
headers=self._build_stream_resource_headers(resource),
|
|
157
195
|
background=BackgroundTask(_close_stream)
|
|
158
196
|
)
|
|
159
|
-
|
|
197
|
+
|
|
160
198
|
def _build_stream_resource_headers(self, resource: StreamResource) -> Dict[str, str]:
|
|
161
199
|
headers: Dict[str, str] = { "Cache-Control": "no-cache" }
|
|
162
200
|
|
|
@@ -165,18 +203,3 @@ class HttpServerController(ControllerService):
|
|
|
165
203
|
headers["Content-Disposition"] = f'attachment; filename="{filename}"'
|
|
166
204
|
|
|
167
205
|
return headers
|
|
168
|
-
|
|
169
|
-
def _render_event_stream_resource(self, resource: HttpEventStreamResource) -> Response:
|
|
170
|
-
async def _event_generator() -> AsyncIterator[bytes]:
|
|
171
|
-
async for chunk in resource:
|
|
172
|
-
yield b"data: " + chunk + b"\n\n"
|
|
173
|
-
|
|
174
|
-
async def _close_stream():
|
|
175
|
-
await resource.close()
|
|
176
|
-
|
|
177
|
-
return StreamingResponse(
|
|
178
|
-
_event_generator(),
|
|
179
|
-
media_type="text/event-stream",
|
|
180
|
-
headers={ "Cache-Control": "no-cache" },
|
|
181
|
-
background=BackgroundTask(_close_stream)
|
|
182
|
-
)
|
|
@@ -194,7 +194,7 @@ class GradioWebUIBuilder:
|
|
|
194
194
|
|
|
195
195
|
async def _convert_output_value(self, value: Any, type: WorkflowVariableType, subtype: Optional[str], format: Optional[WorkflowVariableFormat], internal: bool) -> Any:
|
|
196
196
|
if format == WorkflowVariableFormat.SSE_JSON:
|
|
197
|
-
return await self.
|
|
197
|
+
return await self._resolve_json_field_from_bytes(value, subtype, format)
|
|
198
198
|
|
|
199
199
|
if type in [ WorkflowVariableType.STRING, WorkflowVariableType.TEXT ]:
|
|
200
200
|
return await self._convert_value_to_string(value, subtype, format)
|
|
@@ -210,13 +210,16 @@ class GradioWebUIBuilder:
|
|
|
210
210
|
async def _convert_value_to_string(self, value: Any, subtype: Optional[str], format: Optional[WorkflowVariableFormat]) -> Optional[str]:
|
|
211
211
|
if isinstance(value, (dict, list)):
|
|
212
212
|
return json.dumps(value)
|
|
213
|
+
|
|
214
|
+
if isinstance(value, bytes):
|
|
215
|
+
return value.decode("utf-8", errors="replace")
|
|
213
216
|
|
|
214
217
|
if value is not None:
|
|
215
218
|
return str(value)
|
|
216
|
-
|
|
217
|
-
return None
|
|
218
219
|
|
|
219
|
-
|
|
220
|
+
return None
|
|
221
|
+
|
|
222
|
+
async def _resolve_json_field_from_bytes(self, value: Any, subtype: Optional[str], format: Optional[WorkflowVariableFormat]) -> Optional[Any]:
|
|
220
223
|
try:
|
|
221
224
|
return self.field_resolver.resolve(json.loads(value), subtype)
|
|
222
225
|
except Exception:
|
|
@@ -246,7 +246,7 @@ class DockerRuntimeManager:
|
|
|
246
246
|
for line in container.logs(stream=True, follow=True, since=int(time.time())):
|
|
247
247
|
sys.stdout.buffer.write(line)
|
|
248
248
|
sys.stdout.flush()
|
|
249
|
-
loop = asyncio.
|
|
249
|
+
loop = asyncio.get_running_loop()
|
|
250
250
|
await loop.run_in_executor(None, _stream_logs_sync, container)
|
|
251
251
|
except Exception as e:
|
|
252
252
|
logging.error("Error while streaming logs from container '%s': %s", container.name, e)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from typing import Optional
|
|
1
|
+
from typing import Optional, Callable, Awaitable, Any
|
|
2
2
|
from abc import ABC, abstractmethod
|
|
3
3
|
from threading import Thread
|
|
4
4
|
import asyncio
|
|
@@ -42,6 +42,28 @@ class AsyncService(ABC):
|
|
|
42
42
|
if self.daemon_task:
|
|
43
43
|
await self.daemon_task
|
|
44
44
|
|
|
45
|
+
def run_in_thread(self, runner: Callable[[], Awaitable[Any]]) -> asyncio.Future:
|
|
46
|
+
loop = asyncio.get_running_loop()
|
|
47
|
+
future: asyncio.Future = loop.create_future()
|
|
48
|
+
|
|
49
|
+
def _start_in_thread():
|
|
50
|
+
thread_loop = asyncio.new_event_loop()
|
|
51
|
+
asyncio.set_event_loop(thread_loop)
|
|
52
|
+
|
|
53
|
+
async def _run_and_set_result():
|
|
54
|
+
try:
|
|
55
|
+
result = await runner()
|
|
56
|
+
loop.call_soon_threadsafe(future.set_result, result)
|
|
57
|
+
except Exception as e:
|
|
58
|
+
loop.call_soon_threadsafe(future.set_exception, e)
|
|
59
|
+
|
|
60
|
+
thread_loop.run_until_complete(_run_and_set_result())
|
|
61
|
+
|
|
62
|
+
thread = Thread(target=_start_in_thread)
|
|
63
|
+
thread.start()
|
|
64
|
+
|
|
65
|
+
return future
|
|
66
|
+
|
|
45
67
|
async def _start(self) -> None:
|
|
46
68
|
self.started = True
|
|
47
69
|
|