model-compose 0.2.9__tar.gz → 0.2.11__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.2.9/src/model_compose.egg-info → model_compose-0.2.11}/PKG-INFO +5 -1
- {model_compose-0.2.9 → model_compose-0.2.11}/pyproject.toml +6 -2
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/component/services/__init__.py +1 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/component/services/http_server.py +8 -1
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/component/services/mcp_client.py +1 -1
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/component/services/mcp_server.py +9 -1
- model_compose-0.2.11/src/mindor/core/component/services/model/__init__.py +1 -0
- model_compose-0.2.11/src/mindor/core/component/services/model/base.py +28 -0
- model_compose-0.2.11/src/mindor/core/component/services/model/model.py +37 -0
- model_compose-0.2.11/src/mindor/core/component/services/model/tasks/__init__.py +4 -0
- model_compose-0.2.11/src/mindor/core/component/services/model/tasks/summarization.py +75 -0
- model_compose-0.2.11/src/mindor/core/component/services/model/tasks/text_embedding.py +89 -0
- model_compose-0.2.11/src/mindor/core/component/services/model/tasks/text_generation.py +71 -0
- model_compose-0.2.11/src/mindor/core/component/services/model/tasks/translation.py +72 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/controller/webui/gradio.py +2 -1
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/workflow/workflow.py +0 -1
- model_compose-0.2.11/src/mindor/dsl/schema/action/action.py +13 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/action/impl/__init__.py +1 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/action/impl/mcp_server.py +1 -2
- model_compose-0.2.11/src/mindor/dsl/schema/action/impl/model/__init__.py +1 -0
- model_compose-0.2.11/src/mindor/dsl/schema/action/impl/model/impl/__init__.py +5 -0
- model_compose-0.2.11/src/mindor/dsl/schema/action/impl/model/impl/common.py +11 -0
- model_compose-0.2.11/src/mindor/dsl/schema/action/impl/model/impl/summarization.py +17 -0
- model_compose-0.2.11/src/mindor/dsl/schema/action/impl/model/impl/text_embedding.py +14 -0
- model_compose-0.2.11/src/mindor/dsl/schema/action/impl/model/impl/text_generation.py +15 -0
- model_compose-0.2.11/src/mindor/dsl/schema/action/impl/model/impl/translation.py +15 -0
- model_compose-0.2.11/src/mindor/dsl/schema/action/impl/model/model.py +10 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/component/component.py +1 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/component/impl/__init__.py +1 -0
- model_compose-0.2.11/src/mindor/dsl/schema/component/impl/model/__init__.py +1 -0
- model_compose-0.2.11/src/mindor/dsl/schema/component/impl/model/impl/__init__.py +5 -0
- model_compose-0.2.11/src/mindor/dsl/schema/component/impl/model/impl/common.py +23 -0
- model_compose-0.2.11/src/mindor/dsl/schema/component/impl/model/impl/summarization.py +9 -0
- model_compose-0.2.11/src/mindor/dsl/schema/component/impl/model/impl/text_embedding.py +9 -0
- model_compose-0.2.11/src/mindor/dsl/schema/component/impl/model/impl/text_generation.py +9 -0
- model_compose-0.2.11/src/mindor/dsl/schema/component/impl/model/impl/translation.py +9 -0
- model_compose-0.2.11/src/mindor/dsl/schema/component/impl/model/impl/types.py +7 -0
- model_compose-0.2.11/src/mindor/dsl/schema/component/impl/model/model.py +13 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/component/impl/types.py +1 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/workflow.py +1 -1
- {model_compose-0.2.9 → model_compose-0.2.11/src/model_compose.egg-info}/PKG-INFO +5 -1
- {model_compose-0.2.9 → model_compose-0.2.11}/src/model_compose.egg-info/SOURCES.txt +27 -2
- {model_compose-0.2.9 → model_compose-0.2.11}/src/model_compose.egg-info/requires.txt +4 -0
- model_compose-0.2.9/src/mindor/dsl/schema/action/action.py +0 -15
- {model_compose-0.2.9 → model_compose-0.2.11}/LICENSE +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/README.md +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/setup.cfg +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/__init__.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/cli/__init__.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/cli/compose.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/__init__.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/component/__init__.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/component/base.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/component/component.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/component/context.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/component/services/http_client.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/component/services/shell.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/component/services/workflow.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/compose/__init__.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/compose/compose.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/compose/manager.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/controller/__init__.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/controller/base.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/controller/controller.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/controller/runner/__init__.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/controller/runner/client.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/controller/runner/http_client.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/controller/runner/mcp_client.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/controller/runner/runner.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/controller/services/__init__.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/controller/services/http_server.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/controller/services/mcp_server.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/controller/webui/__init__.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/controller/webui/webui.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/gateway/__init__.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/gateway/base.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/gateway/gateway.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/gateway/services/__init__.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/gateway/services/http_tunnel.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/gateway/services/ssh_tunnel.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/listener/__init__.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/listener/base.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/listener/listener.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/listener/services/__init__.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/listener/services/http_callback.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/logger/__init__.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/logger/base.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/logger/logger.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/logger/logging.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/logger/services/__init__.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/logger/services/console.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/logger/services/file.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/runtime/__init__.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/runtime/env.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/services/__init__.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/services/async_service.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/utils/__init__.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/utils/expiring.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/utils/http_client.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/utils/http_request.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/utils/http_status.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/utils/image.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/utils/mcp_client.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/utils/renderer.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/utils/ssh_client.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/utils/streaming.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/utils/time.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/utils/workqueue.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/workflow/__init__.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/workflow/context.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/workflow/job/__init__.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/workflow/job/base.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/workflow/job/impl/__init__.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/workflow/job/impl/action.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/workflow/job/impl/delay.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/workflow/job/job.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/workflow/schema.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/__init__.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/loader.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/__init__.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/action/__init__.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/action/impl/common.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/action/impl/http_client.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/action/impl/http_server.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/action/impl/mcp_client.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/action/impl/shell.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/action/impl/workflow.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/component/__init__.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/component/impl/common.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/component/impl/http_client.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/component/impl/http_server.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/component/impl/mcp_client.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/component/impl/mcp_server.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/component/impl/shell.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/component/impl/workflow.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/compose.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/controller/__init__.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/controller/controller.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/controller/impl/__init__.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/controller/impl/common.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/controller/impl/http_server.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/controller/impl/mcp_server.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/controller/impl/types.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/controller/impl/webui.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/gateway/__init__.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/gateway/gateway.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/gateway/impl/__init__.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/gateway/impl/common.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/gateway/impl/http_tunnel.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/gateway/impl/ssh_tunnel.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/gateway/impl/types.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/job/__init__.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/job/impl/__init__.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/job/impl/action.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/job/impl/common.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/job/impl/delay.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/job/impl/types.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/job/job.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/listener/__init__.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/listener/impl/__init__.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/listener/impl/common.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/listener/impl/http_callback.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/listener/impl/types.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/listener/listener.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/logger/__init__.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/logger/impl/__init__.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/logger/impl/common.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/logger/impl/console.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/logger/impl/file.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/logger/impl/types.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/logger/logger.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/runtime/__init__.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/runtime/impl/__init__.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/runtime/impl/common.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/runtime/impl/docker.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/runtime/impl/types.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/dsl/schema/runtime/runtime.py +0 -0
- {model_compose-0.2.9/src/mindor/dsl/schema → model_compose-0.2.11/src/mindor/dsl}/utils/__init__.py +0 -0
- {model_compose-0.2.9/src/mindor/dsl/schema → model_compose-0.2.11/src/mindor/dsl}/utils/annotation.py +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/model_compose.egg-info/dependency_links.txt +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/model_compose.egg-info/entry_points.txt +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/src/model_compose.egg-info/top_level.txt +0 -0
- {model_compose-0.2.9 → model_compose-0.2.11}/tests/test_cli.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: model-compose
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.11
|
|
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
|
|
@@ -20,6 +20,10 @@ Requires-Dist: pyngrok
|
|
|
20
20
|
Requires-Dist: ulid
|
|
21
21
|
Requires-Dist: gradio
|
|
22
22
|
Requires-Dist: Pillow
|
|
23
|
+
Requires-Dist: transformers
|
|
24
|
+
Requires-Dist: torch
|
|
25
|
+
Requires-Dist: sentencepiece
|
|
26
|
+
Requires-Dist: accelerate
|
|
23
27
|
Dynamic: license-file
|
|
24
28
|
|
|
25
29
|
# model-compose: Declarative AI Model and Workflow Orchestrator
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "model-compose"
|
|
3
|
-
version = "0.2.
|
|
3
|
+
version = "0.2.11"
|
|
4
4
|
description = "model-compose: Declarative AI Model and Workflow Orchestrator"
|
|
5
5
|
authors = [
|
|
6
6
|
{ name = "Hanyeol Cho", email = "hanyeol.cho@gmail.com" }
|
|
@@ -20,7 +20,11 @@ dependencies = [
|
|
|
20
20
|
"pyngrok",
|
|
21
21
|
"ulid",
|
|
22
22
|
"gradio",
|
|
23
|
-
"Pillow"
|
|
23
|
+
"Pillow",
|
|
24
|
+
"transformers",
|
|
25
|
+
"torch",
|
|
26
|
+
"sentencepiece",
|
|
27
|
+
"accelerate"
|
|
24
28
|
]
|
|
25
29
|
|
|
26
30
|
[project.scripts]
|
{model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/component/services/http_server.py
RENAMED
|
@@ -4,6 +4,13 @@ from mindor.dsl.schema.action import ActionConfig, HttpServerActionConfig
|
|
|
4
4
|
from ..base import ComponentService, ComponentType, ComponentGlobalConfigs, register_component
|
|
5
5
|
from ..context import ComponentActionContext
|
|
6
6
|
|
|
7
|
+
class HttpServerAction:
|
|
8
|
+
def __init__(self, config: HttpServerActionConfig):
|
|
9
|
+
self.config: HttpServerActionConfig = config
|
|
10
|
+
|
|
11
|
+
async def run(self, context: ComponentActionContext) -> Any:
|
|
12
|
+
pass
|
|
13
|
+
|
|
7
14
|
@register_component(ComponentType.HTTP_SERVER)
|
|
8
15
|
class HttpServerComponent(ComponentService):
|
|
9
16
|
def __init__(self, id: str, config: HttpServerComponentConfig, global_configs: ComponentGlobalConfigs, daemon: bool):
|
|
@@ -16,4 +23,4 @@ class HttpServerComponent(ComponentService):
|
|
|
16
23
|
pass
|
|
17
24
|
|
|
18
25
|
async def _run(self, action: ActionConfig, context: ComponentActionContext) -> Any:
|
|
19
|
-
return
|
|
26
|
+
return await HttpServerAction(action).run(context)
|
{model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/component/services/mcp_client.py
RENAMED
|
@@ -5,7 +5,7 @@ from mindor.core.utils.mcp_client import McpClient, ContentBlock, TextContent, I
|
|
|
5
5
|
from ..base import ComponentService, ComponentType, ComponentGlobalConfigs, register_component
|
|
6
6
|
from ..context import ComponentActionContext
|
|
7
7
|
|
|
8
|
-
class McpClientAction
|
|
8
|
+
class McpClientAction:
|
|
9
9
|
def __init__(self, config: McpClientActionConfig):
|
|
10
10
|
self.config: McpClientActionConfig = config
|
|
11
11
|
|
{model_compose-0.2.9 → model_compose-0.2.11}/src/mindor/core/component/services/mcp_server.py
RENAMED
|
@@ -4,6 +4,13 @@ from mindor.dsl.schema.action import ActionConfig, McpServerActionConfig
|
|
|
4
4
|
from ..base import ComponentService, ComponentType, ComponentGlobalConfigs, register_component
|
|
5
5
|
from ..context import ComponentActionContext
|
|
6
6
|
|
|
7
|
+
class McpServerAction:
|
|
8
|
+
def __init__(self, config: McpServerActionConfig):
|
|
9
|
+
self.config: McpServerActionConfig = config
|
|
10
|
+
|
|
11
|
+
async def run(self, context: ComponentActionContext) -> Any:
|
|
12
|
+
pass
|
|
13
|
+
|
|
7
14
|
@register_component(ComponentType.MCP_SERVER)
|
|
8
15
|
class McpServerComponent(ComponentService):
|
|
9
16
|
def __init__(self, id: str, config: McpServerComponentConfig, global_configs: ComponentGlobalConfigs, daemon: bool):
|
|
@@ -16,4 +23,5 @@ class McpServerComponent(ComponentService):
|
|
|
16
23
|
pass
|
|
17
24
|
|
|
18
25
|
async def _run(self, action: ActionConfig, context: ComponentActionContext) -> Any:
|
|
19
|
-
return
|
|
26
|
+
return await McpServerAction(action).run(context)
|
|
27
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from .model 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 ModelComponentConfig, ModelTaskType
|
|
4
|
+
from mindor.dsl.schema.action import ModelActionConfig
|
|
5
|
+
from mindor.core.services import AsyncService
|
|
6
|
+
from ...context import ComponentActionContext
|
|
7
|
+
|
|
8
|
+
class ModelTaskService(AsyncService):
|
|
9
|
+
def __init__(self, id: str, config: ModelComponentConfig, daemon: bool):
|
|
10
|
+
super().__init__(daemon)
|
|
11
|
+
|
|
12
|
+
self.id: str = id
|
|
13
|
+
self.config: ModelComponentConfig = config
|
|
14
|
+
|
|
15
|
+
async def run(self, action: ModelActionConfig, context: ComponentActionContext) -> Any:
|
|
16
|
+
return await self._run(action, context)
|
|
17
|
+
|
|
18
|
+
@abstractmethod
|
|
19
|
+
async def _run(self, action: ModelActionConfig, context: ComponentActionContext) -> Any:
|
|
20
|
+
pass
|
|
21
|
+
|
|
22
|
+
def register_model_task_service(type: ModelTaskType):
|
|
23
|
+
def decorator(cls: Type[ModelTaskService]) -> Type[ModelTaskService]:
|
|
24
|
+
ModelTaskServiceRegistry[type] = cls
|
|
25
|
+
return cls
|
|
26
|
+
return decorator
|
|
27
|
+
|
|
28
|
+
ModelTaskServiceRegistry: Dict[ModelTaskType, Type[ModelTaskService]] = {}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, AsyncIterator, Any
|
|
2
|
+
from mindor.dsl.schema.component import ModelComponentConfig, ModelTaskType
|
|
3
|
+
from mindor.dsl.schema.action import ActionConfig, ModelActionConfig
|
|
4
|
+
from ...base import ComponentService, ComponentType, ComponentGlobalConfigs, register_component
|
|
5
|
+
from ...context import ComponentActionContext
|
|
6
|
+
from .base import ModelTaskService, ModelTaskServiceRegistry
|
|
7
|
+
|
|
8
|
+
class ModelAction:
|
|
9
|
+
def __init__(self, config: ModelActionConfig):
|
|
10
|
+
self.config: ModelActionConfig = config
|
|
11
|
+
|
|
12
|
+
async def run(self, context: ComponentActionContext, task_service: ModelTaskService) -> Any:
|
|
13
|
+
return await task_service.run(self.config, context)
|
|
14
|
+
|
|
15
|
+
@register_component(ComponentType.MODEL)
|
|
16
|
+
class ModelComponent(ComponentService):
|
|
17
|
+
def __init__(self, id: str, config: ModelComponentConfig, global_configs: ComponentGlobalConfigs, daemon: bool):
|
|
18
|
+
super().__init__(id, config, global_configs, daemon)
|
|
19
|
+
|
|
20
|
+
self.task_service = self._create_task_service(self.config.task)
|
|
21
|
+
|
|
22
|
+
def _create_task_service(self, type: ModelTaskType) -> ModelTaskService:
|
|
23
|
+
try:
|
|
24
|
+
if not ModelTaskServiceRegistry:
|
|
25
|
+
from . import tasks
|
|
26
|
+
return ModelTaskServiceRegistry[type](self.id, self.config, self.daemon)
|
|
27
|
+
except KeyError:
|
|
28
|
+
raise ValueError(f"Unsupported component type: {type}")
|
|
29
|
+
|
|
30
|
+
async def _serve(self) -> None:
|
|
31
|
+
await self.task_service.start()
|
|
32
|
+
|
|
33
|
+
async def _shutdown(self) -> None:
|
|
34
|
+
await self.task_service.stop()
|
|
35
|
+
|
|
36
|
+
async def _run(self, action: ActionConfig, context: ComponentActionContext) -> Any:
|
|
37
|
+
return await ModelAction(action).run(context, self.task_service)
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Any
|
|
2
|
+
from mindor.dsl.schema.component import ModelComponentConfig
|
|
3
|
+
from mindor.dsl.schema.action import ModelActionConfig, SummarizationModelActionConfig
|
|
4
|
+
from mindor.core.logger import logging
|
|
5
|
+
from ..base import ModelTaskService, ModelTaskType, register_model_task_service
|
|
6
|
+
from ..base import ComponentActionContext
|
|
7
|
+
from transformers import AutoModelForSeq2SeqLM, AutoTokenizer, PreTrainedModel, PreTrainedTokenizer, GenerationMixin
|
|
8
|
+
import torch
|
|
9
|
+
|
|
10
|
+
class SummarizationTaskAction:
|
|
11
|
+
def __init__(self, config: SummarizationModelActionConfig, model: Union[PreTrainedModel, GenerationMixin], tokenizer: PreTrainedTokenizer):
|
|
12
|
+
self.config: SummarizationModelActionConfig = config
|
|
13
|
+
self.model: Union[PreTrainedModel, GenerationMixin] = model
|
|
14
|
+
self.tokenizer: PreTrainedTokenizer = tokenizer
|
|
15
|
+
|
|
16
|
+
async def run(self, context: ComponentActionContext) -> Any:
|
|
17
|
+
text: Union[str, List[str]] = await context.render_variable(self.config.text)
|
|
18
|
+
|
|
19
|
+
# Model parameters
|
|
20
|
+
max_input_length = await context.render_variable(self.config.params.max_input_length)
|
|
21
|
+
max_output_length = await context.render_variable(self.config.params.max_output_length)
|
|
22
|
+
min_output_length = await context.render_variable(self.config.params.min_output_length)
|
|
23
|
+
num_beams = await context.render_variable(self.config.params.num_beams)
|
|
24
|
+
length_penalty = await context.render_variable(self.config.params.length_penalty)
|
|
25
|
+
early_stopping = await context.render_variable(self.config.params.early_stopping)
|
|
26
|
+
do_sample = await context.render_variable(self.config.params.do_sample)
|
|
27
|
+
|
|
28
|
+
# Tokenizing
|
|
29
|
+
inputs = self.tokenizer(text, return_tensors="pt", max_length=max_input_length, padding=True, truncation=True).to(self.model.device)
|
|
30
|
+
|
|
31
|
+
# Text Summarization
|
|
32
|
+
with torch.no_grad():
|
|
33
|
+
outputs = self.model.generate(
|
|
34
|
+
**inputs,
|
|
35
|
+
max_length=max_output_length,
|
|
36
|
+
min_length=min_output_length,
|
|
37
|
+
num_beams=num_beams,
|
|
38
|
+
length_penalty=length_penalty,
|
|
39
|
+
early_stopping=early_stopping,
|
|
40
|
+
do_sample=do_sample,
|
|
41
|
+
pad_token_id=getattr(self.tokenizer, "pad_token_id", None),
|
|
42
|
+
eos_token_id=getattr(self.tokenizer, "eos_token_id", None)
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
# Decoding output
|
|
46
|
+
outputs = self.tokenizer.batch_decode(outputs, skip_special_tokens=True)
|
|
47
|
+
|
|
48
|
+
result = outputs if isinstance(text, list) else outputs[0]
|
|
49
|
+
context.register_source("result", result)
|
|
50
|
+
|
|
51
|
+
return (await context.render_variable(self.config.output, ignore_files=True)) if self.config.output else result
|
|
52
|
+
|
|
53
|
+
@register_model_task_service(ModelTaskType.SUMMARIZATION)
|
|
54
|
+
class SummarizationTaskService(ModelTaskService):
|
|
55
|
+
def __init__(self, id: str, config: ModelComponentConfig, daemon: bool):
|
|
56
|
+
super().__init__(id, config, daemon)
|
|
57
|
+
|
|
58
|
+
self.model: Optional[Union[PreTrainedModel, GenerationMixin]] = None
|
|
59
|
+
self.tokenizer: Optional[PreTrainedTokenizer] = None
|
|
60
|
+
|
|
61
|
+
async def _serve(self) -> None:
|
|
62
|
+
try:
|
|
63
|
+
self.model = AutoModelForSeq2SeqLM.from_pretrained(self.config.model).to(torch.device(self.config.device))
|
|
64
|
+
self.tokenizer = AutoTokenizer.from_pretrained(self.config.model, use_fast=self.config.fast_tokenizer)
|
|
65
|
+
logging.info(f"Model and tokenizer loaded successfully on device '{self.config.device}': {self.config.model}")
|
|
66
|
+
except Exception as e:
|
|
67
|
+
logging.error(f"Failed to load model '{self.config.model}': {e}")
|
|
68
|
+
raise
|
|
69
|
+
|
|
70
|
+
async def _shutdown(self) -> None:
|
|
71
|
+
self.model = None
|
|
72
|
+
self.tokenizer = None
|
|
73
|
+
|
|
74
|
+
async def _run(self, action: ModelActionConfig, context: ComponentActionContext) -> Any:
|
|
75
|
+
return await SummarizationTaskAction(action, self.model, self.tokenizer).run(context)
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Any
|
|
2
|
+
from mindor.dsl.schema.component import ModelComponentConfig
|
|
3
|
+
from mindor.dsl.schema.action import ModelActionConfig, TextEmbeddingModelActionConfig
|
|
4
|
+
from mindor.core.logger import logging
|
|
5
|
+
from ..base import ModelTaskService, ModelTaskType, register_model_task_service
|
|
6
|
+
from ..base import ComponentActionContext
|
|
7
|
+
from transformers import AutoModel, AutoTokenizer, PreTrainedModel, PreTrainedTokenizer
|
|
8
|
+
from transformers.modeling_outputs import BaseModelOutput
|
|
9
|
+
from torch import Tensor
|
|
10
|
+
import torch
|
|
11
|
+
|
|
12
|
+
class TextEmbeddingTaskAction:
|
|
13
|
+
def __init__(self, config: TextEmbeddingModelActionConfig, model: PreTrainedModel, tokenizer: PreTrainedTokenizer):
|
|
14
|
+
self.config: TextEmbeddingModelActionConfig = config
|
|
15
|
+
self.model: PreTrainedModel = model
|
|
16
|
+
self.tokenizer: PreTrainedTokenizer = tokenizer
|
|
17
|
+
|
|
18
|
+
async def run(self, context: ComponentActionContext) -> Any:
|
|
19
|
+
text = await context.render_variable(self.config.text)
|
|
20
|
+
|
|
21
|
+
# Model parameters
|
|
22
|
+
max_input_length = await context.render_variable(self.config.params.max_input_length)
|
|
23
|
+
pooling = await context.render_variable(self.config.params.pooling)
|
|
24
|
+
normalize = await context.render_variable(self.config.params.normalize)
|
|
25
|
+
|
|
26
|
+
# Tokenizing
|
|
27
|
+
inputs = self.tokenizer(text, return_tensors="pt", max_length=max_input_length, padding=True, truncation=True).to(self.model.device)
|
|
28
|
+
attention_mask: Tensor = inputs.get("attention_mask", None)
|
|
29
|
+
|
|
30
|
+
# Forward pass through the model
|
|
31
|
+
with torch.no_grad():
|
|
32
|
+
outputs: BaseModelOutput = self.model(**inputs)
|
|
33
|
+
last_hidden_state = outputs.last_hidden_state # (batch_size, seq_len, hidden_size)
|
|
34
|
+
|
|
35
|
+
# Apply pooling strategy (mean, cls, max)
|
|
36
|
+
embedding = self._pool_hidden_state(last_hidden_state, attention_mask, pooling)
|
|
37
|
+
|
|
38
|
+
if normalize:
|
|
39
|
+
embedding = torch.nn.functional.normalize(embedding, p=2, dim=1)
|
|
40
|
+
|
|
41
|
+
result = embedding.squeeze().tolist()
|
|
42
|
+
context.register_source("result", result)
|
|
43
|
+
|
|
44
|
+
return (await context.render_variable(self.config.output, ignore_files=True)) if self.config.output else result
|
|
45
|
+
|
|
46
|
+
def _pool_hidden_state(self, last_hidden_state: Tensor, attention_mask: Optional[Tensor], pooling: str) -> Tensor:
|
|
47
|
+
if pooling == "mean":
|
|
48
|
+
if attention_mask is not None:
|
|
49
|
+
mask = attention_mask.unsqueeze(-1).expand(last_hidden_state.size())
|
|
50
|
+
summed = torch.sum(last_hidden_state * mask, dim=1)
|
|
51
|
+
count = torch.clamp(mask.sum(dim=1), min=1e-9)
|
|
52
|
+
return summed / count
|
|
53
|
+
else:
|
|
54
|
+
return torch.mean(last_hidden_state, dim=1)
|
|
55
|
+
|
|
56
|
+
if pooling == "cls":
|
|
57
|
+
return last_hidden_state[:, 0]
|
|
58
|
+
|
|
59
|
+
if pooling == "max":
|
|
60
|
+
if attention_mask is not None:
|
|
61
|
+
mask = attention_mask.unsqueeze(-1).expand(last_hidden_state.size())
|
|
62
|
+
last_hidden_state = last_hidden_state.masked_fill(mask == 0, -1e9)
|
|
63
|
+
return torch.max(last_hidden_state, dim=1).values
|
|
64
|
+
|
|
65
|
+
raise ValueError(f"Unsupported pooling type: {pooling}")
|
|
66
|
+
|
|
67
|
+
@register_model_task_service(ModelTaskType.TEXT_EMBEDDING)
|
|
68
|
+
class TextEmbeddingTaskService(ModelTaskService):
|
|
69
|
+
def __init__(self, id: str, config: ModelComponentConfig, daemon: bool):
|
|
70
|
+
super().__init__(id, config, daemon)
|
|
71
|
+
|
|
72
|
+
self.model: Optional[PreTrainedModel] = None
|
|
73
|
+
self.tokenizer: Optional[PreTrainedTokenizer] = None
|
|
74
|
+
|
|
75
|
+
async def _serve(self) -> None:
|
|
76
|
+
try:
|
|
77
|
+
self.model = AutoModel.from_pretrained(self.config.model).to(torch.device(self.config.device))
|
|
78
|
+
self.tokenizer = AutoTokenizer.from_pretrained(self.config.model, use_fast=self.config.fast_tokenizer)
|
|
79
|
+
logging.info(f"Model and tokenizer loaded successfully on device '{self.config.device}': {self.config.model}")
|
|
80
|
+
except Exception as e:
|
|
81
|
+
logging.error(f"Failed to load model '{self.config.model}': {e}")
|
|
82
|
+
raise
|
|
83
|
+
|
|
84
|
+
async def _shutdown(self) -> None:
|
|
85
|
+
self.model = None
|
|
86
|
+
self.tokenizer = None
|
|
87
|
+
|
|
88
|
+
async def _run(self, action: ModelActionConfig, context: ComponentActionContext) -> Any:
|
|
89
|
+
return await TextEmbeddingTaskAction(action, self.model, self.tokenizer).run(context)
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Any
|
|
2
|
+
from mindor.dsl.schema.component import ModelComponentConfig
|
|
3
|
+
from mindor.dsl.schema.action import ModelActionConfig, TextGenerationModelActionConfig
|
|
4
|
+
from mindor.core.logger import logging
|
|
5
|
+
from ..base import ModelTaskService, ModelTaskType, register_model_task_service
|
|
6
|
+
from ..base import ComponentActionContext
|
|
7
|
+
from transformers import AutoModelForCausalLM, AutoTokenizer, PreTrainedModel, PreTrainedTokenizer, GenerationMixin
|
|
8
|
+
import torch
|
|
9
|
+
|
|
10
|
+
class TextGenerationTaskAction:
|
|
11
|
+
def __init__(self, config: TextGenerationModelActionConfig, model: Union[PreTrainedModel, GenerationMixin], tokenizer: PreTrainedTokenizer):
|
|
12
|
+
self.config: TextGenerationModelActionConfig = config
|
|
13
|
+
self.model: Union[PreTrainedModel, GenerationMixin] = model
|
|
14
|
+
self.tokenizer: PreTrainedTokenizer = tokenizer
|
|
15
|
+
|
|
16
|
+
async def run(self, context: ComponentActionContext) -> Any:
|
|
17
|
+
prompt: Union[str, List[str]] = await context.render_variable(self.config.prompt)
|
|
18
|
+
|
|
19
|
+
# Model parameters
|
|
20
|
+
max_output_length = await context.render_variable(self.config.params.max_output_length)
|
|
21
|
+
num_return_sequences = await context.render_variable(self.config.params.num_return_sequences)
|
|
22
|
+
temperature = await context.render_variable(self.config.params.temperature)
|
|
23
|
+
top_k = await context.render_variable(self.config.params.top_k)
|
|
24
|
+
top_p = await context.render_variable(self.config.params.top_p)
|
|
25
|
+
|
|
26
|
+
# Tokenizing
|
|
27
|
+
inputs = self.tokenizer(prompt, return_tensors="pt").to(self.model.device)
|
|
28
|
+
|
|
29
|
+
# Text generation
|
|
30
|
+
with torch.no_grad():
|
|
31
|
+
outputs = self.model.generate(
|
|
32
|
+
**inputs,
|
|
33
|
+
max_length=max_output_length,
|
|
34
|
+
num_return_sequences=num_return_sequences,
|
|
35
|
+
temperature=temperature,
|
|
36
|
+
top_k=top_k,
|
|
37
|
+
top_p=top_p,
|
|
38
|
+
do_sample=True
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
# Decoding output
|
|
42
|
+
outputs = self.tokenizer.batch_decode(outputs, skip_special_tokens=True)
|
|
43
|
+
|
|
44
|
+
result = outputs if isinstance(prompt, list) else outputs[0]
|
|
45
|
+
context.register_source("result", result)
|
|
46
|
+
|
|
47
|
+
return (await context.render_variable(self.config.output, ignore_files=True)) if self.config.output else result
|
|
48
|
+
|
|
49
|
+
@register_model_task_service(ModelTaskType.TEXT_GENERATION)
|
|
50
|
+
class TextGenerationTaskService(ModelTaskService):
|
|
51
|
+
def __init__(self, id: str, config: ModelComponentConfig, daemon: bool):
|
|
52
|
+
super().__init__(id, config, daemon)
|
|
53
|
+
|
|
54
|
+
self.model: Optional[Union[PreTrainedModel, GenerationMixin]] = None
|
|
55
|
+
self.tokenizer: Optional[PreTrainedTokenizer] = None
|
|
56
|
+
|
|
57
|
+
async def _serve(self) -> None:
|
|
58
|
+
try:
|
|
59
|
+
self.model = AutoModelForCausalLM.from_pretrained(self.config.model).to(torch.device(self.config.device))
|
|
60
|
+
self.tokenizer = AutoTokenizer.from_pretrained(self.config.model, use_fast=self.config.fast_tokenizer)
|
|
61
|
+
logging.info(f"Model and tokenizer loaded successfully on device '{self.config.device}': {self.config.model}")
|
|
62
|
+
except Exception as e:
|
|
63
|
+
logging.error(f"Failed to load model '{self.config.model}': {e}")
|
|
64
|
+
raise
|
|
65
|
+
|
|
66
|
+
async def _shutdown(self) -> None:
|
|
67
|
+
self.model = None
|
|
68
|
+
self.tokenizer = None
|
|
69
|
+
|
|
70
|
+
async def _run(self, action: ModelActionConfig, context: ComponentActionContext) -> Any:
|
|
71
|
+
return await TextGenerationTaskAction(action, self.model, self.tokenizer).run(context)
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Any
|
|
2
|
+
from mindor.dsl.schema.component import ModelComponentConfig
|
|
3
|
+
from mindor.dsl.schema.action import ModelActionConfig, TranslationModelActionConfig
|
|
4
|
+
from mindor.core.logger import logging
|
|
5
|
+
from ..base import ModelTaskService, ModelTaskType, register_model_task_service
|
|
6
|
+
from ..base import ComponentActionContext
|
|
7
|
+
from transformers import AutoModelForSeq2SeqLM, AutoTokenizer, PreTrainedModel, PreTrainedTokenizer, GenerationMixin
|
|
8
|
+
import torch
|
|
9
|
+
|
|
10
|
+
class TranslationTaskAction:
|
|
11
|
+
def __init__(self, config: TranslationModelActionConfig, model: Union[PreTrainedModel, GenerationMixin], tokenizer: PreTrainedTokenizer):
|
|
12
|
+
self.config: TranslationModelActionConfig = config
|
|
13
|
+
self.model: Union[PreTrainedModel, GenerationMixin] = model
|
|
14
|
+
self.tokenizer: PreTrainedTokenizer = tokenizer
|
|
15
|
+
|
|
16
|
+
async def run(self, context: ComponentActionContext) -> Any:
|
|
17
|
+
text: Union[str, List[str]] = await context.render_variable(self.config.text)
|
|
18
|
+
|
|
19
|
+
# Model parameters
|
|
20
|
+
max_input_length = await context.render_variable(self.config.params.max_input_length)
|
|
21
|
+
max_output_length = await context.render_variable(self.config.params.max_output_length)
|
|
22
|
+
min_output_length = await context.render_variable(self.config.params.min_output_length)
|
|
23
|
+
num_beams = await context.render_variable(self.config.params.num_beams)
|
|
24
|
+
length_penalty = await context.render_variable(self.config.params.length_penalty)
|
|
25
|
+
|
|
26
|
+
# Tokenizing
|
|
27
|
+
inputs = self.tokenizer(text, return_tensors="pt", max_length=max_input_length, padding=True, truncation=True).to(self.model.device)
|
|
28
|
+
|
|
29
|
+
# Text Translation
|
|
30
|
+
with torch.no_grad():
|
|
31
|
+
outputs = self.model.generate(
|
|
32
|
+
**inputs,
|
|
33
|
+
max_length=max_output_length,
|
|
34
|
+
min_length=min_output_length,
|
|
35
|
+
num_beams=num_beams,
|
|
36
|
+
length_penalty=length_penalty,
|
|
37
|
+
do_sample=False,
|
|
38
|
+
pad_token_id=getattr(self.tokenizer, "pad_token_id", None),
|
|
39
|
+
eos_token_id=getattr(self.tokenizer, "eos_token_id", None)
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
# Decoding output
|
|
43
|
+
outputs = self.tokenizer.batch_decode(outputs, skip_special_tokens=True)
|
|
44
|
+
|
|
45
|
+
result = outputs if isinstance(text, list) else outputs[0]
|
|
46
|
+
context.register_source("result", result)
|
|
47
|
+
|
|
48
|
+
return (await context.render_variable(self.config.output, ignore_files=True)) if self.config.output else result
|
|
49
|
+
|
|
50
|
+
@register_model_task_service(ModelTaskType.TRANSLATION)
|
|
51
|
+
class TranslationTaskService(ModelTaskService):
|
|
52
|
+
def __init__(self, id: str, config: ModelComponentConfig, daemon: bool):
|
|
53
|
+
super().__init__(id, config, daemon)
|
|
54
|
+
|
|
55
|
+
self.model: Optional[Union[PreTrainedModel, GenerationMixin]] = None
|
|
56
|
+
self.tokenizer: Optional[PreTrainedTokenizer] = None
|
|
57
|
+
|
|
58
|
+
async def _serve(self) -> None:
|
|
59
|
+
try:
|
|
60
|
+
self.model = AutoModelForSeq2SeqLM.from_pretrained(self.config.model).to(torch.device(self.config.device))
|
|
61
|
+
self.tokenizer = AutoTokenizer.from_pretrained(self.config.model, use_fast=self.config.fast_tokenizer)
|
|
62
|
+
logging.info(f"Model and tokenizer loaded successfully on device '{self.config.device}': {self.config.model}")
|
|
63
|
+
except Exception as e:
|
|
64
|
+
logging.error(f"Failed to load model '{self.config.model}': {e}")
|
|
65
|
+
raise
|
|
66
|
+
|
|
67
|
+
async def _shutdown(self) -> None:
|
|
68
|
+
self.model = None
|
|
69
|
+
self.tokenizer = None
|
|
70
|
+
|
|
71
|
+
async def _run(self, action: ModelActionConfig, context: ComponentActionContext) -> Any:
|
|
72
|
+
return await TranslationTaskAction(action, self.model, self.tokenizer).run(context)
|
|
@@ -49,7 +49,8 @@ class GradioWebUIBuilder:
|
|
|
49
49
|
async def _run_workflow(*args):
|
|
50
50
|
input = await self._build_input_value(args, workflow.input)
|
|
51
51
|
output = await runner(input)
|
|
52
|
-
|
|
52
|
+
if workflow.output:
|
|
53
|
+
output = await self._flatten_output_value(output, workflow.output)
|
|
53
54
|
return output[0] if len(output) == 1 else output
|
|
54
55
|
|
|
55
56
|
run_button.click(
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Any
|
|
2
|
+
from pydantic import BaseModel, Field
|
|
3
|
+
from .impl import *
|
|
4
|
+
|
|
5
|
+
ActionConfig = Union[
|
|
6
|
+
HttpServerActionConfig,
|
|
7
|
+
HttpClientActionConfig,
|
|
8
|
+
McpServerActionConfig,
|
|
9
|
+
McpClientActionConfig,
|
|
10
|
+
ModelActionConfig,
|
|
11
|
+
WorkflowActionConfig,
|
|
12
|
+
ShellActionConfig
|
|
13
|
+
]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from .model import *
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Any
|
|
2
|
+
from enum import Enum
|
|
3
|
+
from pydantic import BaseModel, Field
|
|
4
|
+
from ...common import CommonActionConfig
|
|
5
|
+
|
|
6
|
+
class ModelTaskMode(str, Enum):
|
|
7
|
+
INFERENCE = "inference"
|
|
8
|
+
TRAINING = "training"
|
|
9
|
+
|
|
10
|
+
class CommonModelActionConfig(CommonActionConfig):
|
|
11
|
+
mode: ModelTaskMode = Field(default=ModelTaskMode.INFERENCE, description="")
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Any
|
|
2
|
+
from pydantic import BaseModel, Field
|
|
3
|
+
from pydantic import model_validator
|
|
4
|
+
from .common import CommonModelActionConfig
|
|
5
|
+
|
|
6
|
+
class SummarizationParamsConfig(BaseModel):
|
|
7
|
+
max_input_length: int = Field(default=1024, description="Maximum number of tokens per input text.")
|
|
8
|
+
max_output_length: int = Field(default=256, description="The maximum number of tokens to generate.")
|
|
9
|
+
min_output_length: int = Field(default=30, description="The minimum number of tokens to generate.")
|
|
10
|
+
num_beams: int = Field(default=4, description="")
|
|
11
|
+
length_penalty: float = Field(default=2.0, description="")
|
|
12
|
+
early_stopping: bool = Field(default=True, description="")
|
|
13
|
+
do_sample: bool = Field(default=True, description="Whether to use sampling.")
|
|
14
|
+
|
|
15
|
+
class SummarizationModelActionConfig(CommonModelActionConfig):
|
|
16
|
+
text: str = Field(..., description="")
|
|
17
|
+
params: SummarizationParamsConfig = Field(default_factory=SummarizationParamsConfig, description="Summarization configuration parameters.")
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Any
|
|
2
|
+
from pydantic import BaseModel, Field
|
|
3
|
+
from pydantic import model_validator
|
|
4
|
+
from .common import CommonModelActionConfig
|
|
5
|
+
|
|
6
|
+
class TextEmbeddingParamsConfig(BaseModel):
|
|
7
|
+
max_input_length: int = Field(default=512, description="Maximum number of tokens per input text.")
|
|
8
|
+
pooling: Literal[ "mean", "cls", "max" ] = Field(default="mean", description="Pooling strategy used to aggregate token embeddings.")
|
|
9
|
+
normalize: bool = Field(default=True, description="Whether to apply L2 normalization to the output embeddings.")
|
|
10
|
+
batch_size: int = Field(default=1, description="Number of input texts to process in a single batch.")
|
|
11
|
+
|
|
12
|
+
class TextEmbeddingModelActionConfig(CommonModelActionConfig):
|
|
13
|
+
text: str = Field(..., description="Input text to be embedded.")
|
|
14
|
+
params: TextEmbeddingParamsConfig = Field(default_factory=TextEmbeddingParamsConfig, description="Configuration parameters for embedding generation.")
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Any
|
|
2
|
+
from pydantic import BaseModel, Field
|
|
3
|
+
from pydantic import model_validator
|
|
4
|
+
from .common import CommonModelActionConfig
|
|
5
|
+
|
|
6
|
+
class TextGenerationParamsConfig(BaseModel):
|
|
7
|
+
max_output_length: int = Field(default=1024, description="The maximum number of tokens to generate.")
|
|
8
|
+
num_return_sequences: int = Field(default=1, description="The number of generated sequences to return.")
|
|
9
|
+
temperature: float = Field(default=1.0, description="Sampling temperature; higher values produce more random results.")
|
|
10
|
+
top_k: int = Field(default=50, description="Top-K sampling; restricts sampling to the top K tokens.")
|
|
11
|
+
top_p: float = Field(default=1.0, description="Top-p (nucleus) sampling; restricts sampling to tokens with cumulative probability >= top_p.")
|
|
12
|
+
|
|
13
|
+
class TextGenerationModelActionConfig(CommonModelActionConfig):
|
|
14
|
+
prompt: str = Field(..., description="")
|
|
15
|
+
params: TextGenerationParamsConfig = Field(default_factory=TextGenerationParamsConfig, description="Text generation configuration parameters.")
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Any
|
|
2
|
+
from pydantic import BaseModel, Field
|
|
3
|
+
from pydantic import model_validator
|
|
4
|
+
from .common import CommonModelActionConfig
|
|
5
|
+
|
|
6
|
+
class TranslationParamsConfig(BaseModel):
|
|
7
|
+
max_input_length: int = Field(default=1024, description="Maximum number of tokens per input text.")
|
|
8
|
+
max_output_length: int = Field(default=256, description="The maximum number of tokens to generate.")
|
|
9
|
+
min_output_length: int = Field(default=10, description="The minimum number of tokens to generate.")
|
|
10
|
+
num_beams: int = Field(default=4, description="")
|
|
11
|
+
length_penalty: float = Field(default=1.0, description="")
|
|
12
|
+
|
|
13
|
+
class TranslationModelActionConfig(CommonModelActionConfig):
|
|
14
|
+
text: str = Field(..., description="")
|
|
15
|
+
params: TranslationParamsConfig = Field(default_factory=TranslationParamsConfig, description="Translation configuration parameters.")
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Any
|
|
2
|
+
from pydantic import BaseModel, Field
|
|
3
|
+
from .impl import *
|
|
4
|
+
|
|
5
|
+
ModelActionConfig = Union[
|
|
6
|
+
TextGenerationModelActionConfig,
|
|
7
|
+
SummarizationModelActionConfig,
|
|
8
|
+
TranslationModelActionConfig,
|
|
9
|
+
TextEmbeddingModelActionConfig,
|
|
10
|
+
]
|