model-compose 0.2.6__tar.gz → 0.2.7__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.6/src/model_compose.egg-info → model_compose-0.2.7}/PKG-INFO +1 -1
- {model_compose-0.2.6 → model_compose-0.2.7}/pyproject.toml +1 -1
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/cli/compose.py +10 -4
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/core/component/base.py +3 -3
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/core/component/component.py +4 -4
- {model_compose-0.2.6/src/mindor/core/component/engine → model_compose-0.2.7/src/mindor/core/component/services}/http_client.py +2 -2
- {model_compose-0.2.6/src/mindor/core/component/engine → model_compose-0.2.7/src/mindor/core/component/services}/http_server.py +2 -2
- {model_compose-0.2.6/src/mindor/core/component/engine → model_compose-0.2.7/src/mindor/core/component/services}/mcp_client.py +2 -2
- {model_compose-0.2.6/src/mindor/core/component/engine → model_compose-0.2.7/src/mindor/core/component/services}/mcp_server.py +2 -2
- {model_compose-0.2.6/src/mindor/core/component/engine → model_compose-0.2.7/src/mindor/core/component/services}/shell.py +2 -2
- {model_compose-0.2.6/src/mindor/core/component/engine → model_compose-0.2.7/src/mindor/core/component/services}/workflow.py +2 -2
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/core/compose/compose.py +6 -6
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/core/compose/manager.py +10 -9
- model_compose-0.2.7/src/mindor/core/controller/__init__.py +2 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/core/controller/base.py +39 -24
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/core/controller/controller.py +8 -6
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/core/controller/runner/client.py +5 -1
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/core/controller/runner/http_client.py +1 -1
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/core/controller/runner/mcp_client.py +1 -1
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/core/controller/runner/runner.py +0 -12
- {model_compose-0.2.6/src/mindor/core/controller/engine → model_compose-0.2.7/src/mindor/core/controller/services}/http_server.py +5 -3
- {model_compose-0.2.6/src/mindor/core/controller/engine → model_compose-0.2.7/src/mindor/core/controller/services}/mcp_server.py +6 -4
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/core/gateway/base.py +3 -3
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/core/gateway/gateway.py +5 -5
- {model_compose-0.2.6/src/mindor/core/gateway/engine → model_compose-0.2.7/src/mindor/core/gateway/services}/http_tunnel.py +2 -2
- {model_compose-0.2.6/src/mindor/core/gateway/engine → model_compose-0.2.7/src/mindor/core/gateway/services}/ssh_tunnel.py +2 -2
- model_compose-0.2.7/src/mindor/core/listener/__init__.py +2 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/core/listener/base.py +3 -3
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/core/listener/listener.py +5 -5
- {model_compose-0.2.6/src/mindor/core/listener/engine → model_compose-0.2.7/src/mindor/core/listener/services}/http_callback.py +2 -2
- model_compose-0.2.7/src/mindor/core/logger/__init__.py +1 -0
- model_compose-0.2.7/src/mindor/core/logger/base.py +23 -0
- model_compose-0.2.7/src/mindor/core/logger/logger.py +19 -0
- model_compose-0.2.7/src/mindor/core/logger/logging.py +22 -0
- model_compose-0.2.7/src/mindor/core/logger/services/__init__.py +2 -0
- model_compose-0.2.7/src/mindor/core/logger/services/console.py +39 -0
- model_compose-0.2.7/src/mindor/core/logger/services/file.py +41 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/core/workflow/job/impl/action.py +3 -3
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/core/workflow/schema.py +36 -21
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/core/workflow/workflow.py +11 -2
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/compose.py +10 -0
- model_compose-0.2.7/src/mindor/dsl/schema/gateway/__init__.py +1 -0
- model_compose-0.2.7/src/mindor/dsl/schema/logger/__init__.py +1 -0
- model_compose-0.2.7/src/mindor/dsl/schema/logger/impl/__init__.py +3 -0
- model_compose-0.2.7/src/mindor/dsl/schema/logger/impl/common.py +15 -0
- model_compose-0.2.7/src/mindor/dsl/schema/logger/impl/console.py +7 -0
- model_compose-0.2.7/src/mindor/dsl/schema/logger/impl/file.py +8 -0
- model_compose-0.2.7/src/mindor/dsl/schema/logger/impl/types.py +5 -0
- model_compose-0.2.7/src/mindor/dsl/schema/logger/logger.py +11 -0
- {model_compose-0.2.6 → model_compose-0.2.7/src/model_compose.egg-info}/PKG-INFO +1 -1
- {model_compose-0.2.6 → model_compose-0.2.7}/src/model_compose.egg-info/SOURCES.txt +29 -15
- model_compose-0.2.6/src/mindor/core/controller/__init__.py +0 -2
- model_compose-0.2.6/src/mindor/core/gateway/__init__.py +0 -2
- model_compose-0.2.6/src/mindor/core/listener/__init__.py +0 -2
- {model_compose-0.2.6 → model_compose-0.2.7}/LICENSE +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/README.md +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/setup.cfg +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/__init__.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/cli/__init__.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/core/__init__.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/core/component/__init__.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/core/component/context.py +0 -0
- {model_compose-0.2.6/src/mindor/core/component/engine → model_compose-0.2.7/src/mindor/core/component/services}/__init__.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/core/compose/__init__.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/core/controller/runner/__init__.py +0 -0
- {model_compose-0.2.6/src/mindor/core/controller/engine → model_compose-0.2.7/src/mindor/core/controller/services}/__init__.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/core/controller/webui/__init__.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/core/controller/webui/gradio.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/core/controller/webui/webui.py +0 -0
- {model_compose-0.2.6/src/mindor/dsl/schema → model_compose-0.2.7/src/mindor/core}/gateway/__init__.py +0 -0
- {model_compose-0.2.6/src/mindor/core/gateway/engine → model_compose-0.2.7/src/mindor/core/gateway/services}/__init__.py +0 -0
- {model_compose-0.2.6/src/mindor/core/listener/engine → model_compose-0.2.7/src/mindor/core/listener/services}/__init__.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/core/runtime/__init__.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/core/runtime/env.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/core/services/__init__.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/core/services/async_service.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/core/utils/__init__.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/core/utils/expiring.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/core/utils/http_client.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/core/utils/http_request.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/core/utils/http_status.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/core/utils/image.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/core/utils/mcp_client.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/core/utils/renderer.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/core/utils/ssh_client.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/core/utils/streaming.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/core/utils/time.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/core/utils/workqueue.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/core/workflow/__init__.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/core/workflow/context.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/core/workflow/job/__init__.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/core/workflow/job/base.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/core/workflow/job/impl/__init__.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/core/workflow/job/impl/delay.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/core/workflow/job/job.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/__init__.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/loader.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/__init__.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/action/__init__.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/action/action.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/action/impl/__init__.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/action/impl/common.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/action/impl/http_client.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/action/impl/http_server.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/action/impl/mcp_client.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/action/impl/mcp_server.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/action/impl/shell.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/action/impl/workflow.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/component/__init__.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/component/component.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/component/impl/__init__.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/component/impl/common.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/component/impl/http_client.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/component/impl/http_server.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/component/impl/mcp_client.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/component/impl/mcp_server.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/component/impl/shell.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/component/impl/types.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/component/impl/workflow.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/controller/__init__.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/controller/controller.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/controller/impl/__init__.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/controller/impl/common.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/controller/impl/http_server.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/controller/impl/mcp_server.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/controller/impl/types.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/controller/impl/webui.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/gateway/gateway.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/gateway/impl/__init__.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/gateway/impl/common.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/gateway/impl/http_tunnel.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/gateway/impl/ssh_tunnel.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/gateway/impl/types.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/job/__init__.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/job/impl/__init__.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/job/impl/action.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/job/impl/common.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/job/impl/delay.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/job/impl/types.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/job/job.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/listener/__init__.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/listener/impl/__init__.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/listener/impl/common.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/listener/impl/http_callback.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/listener/impl/types.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/listener/listener.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/runtime/__init__.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/runtime/impl/__init__.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/runtime/impl/common.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/runtime/impl/docker.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/runtime/impl/types.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/runtime/runtime.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/utils/__init__.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/utils/annotation.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/dsl/schema/workflow.py +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/model_compose.egg-info/dependency_links.txt +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/model_compose.egg-info/entry_points.txt +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/model_compose.egg-info/requires.txt +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/src/model_compose.egg-info/top_level.txt +0 -0
- {model_compose-0.2.6 → model_compose-0.2.7}/tests/test_cli.py +0 -0
|
@@ -31,19 +31,21 @@ def compose_command(ctx: click.Context, config_files: List[Path]) -> None:
|
|
|
31
31
|
"--env", "-e", "env_data", multiple=True,
|
|
32
32
|
help="Environment variable in the form KEY=VALUE. Repeatable.",
|
|
33
33
|
)
|
|
34
|
+
@click.option("--verbose", "-v", is_flag=True, help="Enable verbose output.")
|
|
34
35
|
@click.pass_context
|
|
35
36
|
def up_command(
|
|
36
37
|
ctx: click.Context,
|
|
37
38
|
detach: bool,
|
|
38
39
|
env_files: List[Path],
|
|
39
|
-
env_data: List[str]
|
|
40
|
+
env_data: List[str],
|
|
41
|
+
verbose: bool
|
|
40
42
|
) -> None:
|
|
41
43
|
config_files = ctx.obj.get("config_files", [])
|
|
42
44
|
async def _async_command():
|
|
43
45
|
try:
|
|
44
46
|
env = load_env_files(".", env_files or [])
|
|
45
47
|
config = load_compose_config(".", config_files, env)
|
|
46
|
-
await launch_services(config, detach)
|
|
48
|
+
await launch_services(config, detach, verbose)
|
|
47
49
|
except Exception as e:
|
|
48
50
|
click.echo(f"❌ {e}", err=True)
|
|
49
51
|
asyncio.run(_async_command())
|
|
@@ -86,18 +88,20 @@ def down_command(
|
|
|
86
88
|
"--env", "-e", "env_data", multiple=True,
|
|
87
89
|
help="Environment variable in the form KEY=VALUE. Repeatable.",
|
|
88
90
|
)
|
|
91
|
+
@click.option("--verbose", "-v", is_flag=True, help="Enable verbose output.")
|
|
89
92
|
@click.pass_context
|
|
90
93
|
def start_command(
|
|
91
94
|
ctx: click.Context,
|
|
92
95
|
env_files: List[Path],
|
|
93
96
|
env_data: List[str],
|
|
97
|
+
verbose: bool
|
|
94
98
|
) -> None:
|
|
95
99
|
config_files = ctx.obj.get("config_files", [])
|
|
96
100
|
async def _async_command():
|
|
97
101
|
try:
|
|
98
102
|
env = load_env_files(".", env_files or [])
|
|
99
103
|
config = load_compose_config(".", config_files, env)
|
|
100
|
-
await start_services(config)
|
|
104
|
+
await start_services(config, verbose)
|
|
101
105
|
except Exception as e:
|
|
102
106
|
click.echo(f"❌ {e}", err=True)
|
|
103
107
|
asyncio.run(_async_command())
|
|
@@ -147,6 +151,7 @@ def stop_command(
|
|
|
147
151
|
"--env", "-e", "env_data", multiple=True,
|
|
148
152
|
help="Environment variable in the form KEY=VALUE. Repeatable.",
|
|
149
153
|
)
|
|
154
|
+
@click.option("--verbose", "-v", is_flag=True, help="Enable verbose output.")
|
|
150
155
|
@click.pass_context
|
|
151
156
|
def run_command(
|
|
152
157
|
ctx: click.Context,
|
|
@@ -154,6 +159,7 @@ def run_command(
|
|
|
154
159
|
input_json: Optional[str],
|
|
155
160
|
env_files: List[Path],
|
|
156
161
|
env_data: List[str],
|
|
162
|
+
verbose: bool
|
|
157
163
|
) -> None:
|
|
158
164
|
config_files = ctx.obj.get("config_files", [])
|
|
159
165
|
async def _async_command():
|
|
@@ -161,7 +167,7 @@ def run_command(
|
|
|
161
167
|
env = load_env_files(".", env_files or [])
|
|
162
168
|
config = load_compose_config(".", config_files, env)
|
|
163
169
|
input = json.loads(input_json) if input_json else {}
|
|
164
|
-
state = await run_workflow(config, workflow, input)
|
|
170
|
+
state = await run_workflow(config, workflow, input, verbose)
|
|
165
171
|
click.echo(json.dumps(
|
|
166
172
|
state.error if state.error else state.output,
|
|
167
173
|
indent=2,
|
|
@@ -45,7 +45,7 @@ class ComponentGlobalConfigs:
|
|
|
45
45
|
self.gateways: List[GatewayConfig] = gateways
|
|
46
46
|
self.workflows: Dict[str, WorkflowConfig] = workflows
|
|
47
47
|
|
|
48
|
-
class
|
|
48
|
+
class ComponentService(AsyncService):
|
|
49
49
|
def __init__(self, id: str, config: ComponentConfig, global_configs: ComponentGlobalConfigs, daemon: bool):
|
|
50
50
|
super().__init__(daemon)
|
|
51
51
|
|
|
@@ -83,9 +83,9 @@ class ComponentEngine(AsyncService):
|
|
|
83
83
|
pass
|
|
84
84
|
|
|
85
85
|
def register_component(type: ComponentType):
|
|
86
|
-
def decorator(cls: Type[
|
|
86
|
+
def decorator(cls: Type[ComponentService]) -> Type[ComponentService]:
|
|
87
87
|
ComponentRegistry[type] = cls
|
|
88
88
|
return cls
|
|
89
89
|
return decorator
|
|
90
90
|
|
|
91
|
-
ComponentRegistry: Dict[ComponentType, Type[
|
|
91
|
+
ComponentRegistry: Dict[ComponentType, Type[ComponentService]] = {}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Any
|
|
2
2
|
from mindor.dsl.schema.component import ComponentConfig
|
|
3
|
-
from .base import
|
|
3
|
+
from .base import ComponentService, ComponentGlobalConfigs, ComponentRegistry
|
|
4
4
|
|
|
5
|
-
ComponentInstances: Dict[str,
|
|
5
|
+
ComponentInstances: Dict[str, ComponentService] = {}
|
|
6
6
|
|
|
7
7
|
class ComponentResolver:
|
|
8
8
|
def __init__(self, components: Dict[str, ComponentConfig]):
|
|
@@ -27,13 +27,13 @@ class ComponentResolver:
|
|
|
27
27
|
|
|
28
28
|
return default_ids[0] if default_ids else "__default__"
|
|
29
29
|
|
|
30
|
-
def create_component(id: str, config: ComponentConfig, global_configs: ComponentGlobalConfigs, daemon: bool) ->
|
|
30
|
+
def create_component(id: str, config: ComponentConfig, global_configs: ComponentGlobalConfigs, daemon: bool) -> ComponentService:
|
|
31
31
|
try:
|
|
32
32
|
component = ComponentInstances[id] if id in ComponentInstances else None
|
|
33
33
|
|
|
34
34
|
if not component:
|
|
35
35
|
if not ComponentRegistry:
|
|
36
|
-
from . import
|
|
36
|
+
from . import services
|
|
37
37
|
component = ComponentRegistry[config.type](id, config, global_configs, daemon)
|
|
38
38
|
ComponentInstances[id] = component
|
|
39
39
|
|
|
@@ -6,7 +6,7 @@ from mindor.core.listener import HttpCallbackListener
|
|
|
6
6
|
from mindor.core.utils.http_client import HttpClient
|
|
7
7
|
from mindor.core.utils.http_status import is_status_code_matched
|
|
8
8
|
from mindor.core.utils.time import parse_duration
|
|
9
|
-
from ..base import
|
|
9
|
+
from ..base import ComponentService, ComponentType, ComponentGlobalConfigs, register_component
|
|
10
10
|
from ..context import ComponentActionContext
|
|
11
11
|
from datetime import datetime, timezone
|
|
12
12
|
import asyncio
|
|
@@ -109,7 +109,7 @@ class HttpClientAction:
|
|
|
109
109
|
return await context.render_variable(self.config.endpoint)
|
|
110
110
|
|
|
111
111
|
@register_component(ComponentType.HTTP_CLIENT)
|
|
112
|
-
class HttpClientComponent(
|
|
112
|
+
class HttpClientComponent(ComponentService):
|
|
113
113
|
def __init__(self, id: str, config: HttpClientComponentConfig, global_configs: ComponentGlobalConfigs, daemon: bool):
|
|
114
114
|
super().__init__(id, config, global_configs, daemon)
|
|
115
115
|
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Any
|
|
2
2
|
from mindor.dsl.schema.component import HttpServerComponentConfig
|
|
3
3
|
from mindor.dsl.schema.action import ActionConfig, HttpServerActionConfig
|
|
4
|
-
from ..base import
|
|
4
|
+
from ..base import ComponentService, ComponentType, ComponentGlobalConfigs, register_component
|
|
5
5
|
from ..context import ComponentActionContext
|
|
6
6
|
|
|
7
7
|
@register_component(ComponentType.HTTP_SERVER)
|
|
8
|
-
class HttpServerComponent(
|
|
8
|
+
class HttpServerComponent(ComponentService):
|
|
9
9
|
def __init__(self, id: str, config: HttpServerComponentConfig, global_configs: ComponentGlobalConfigs, daemon: bool):
|
|
10
10
|
super().__init__(id, config, global_configs, daemon)
|
|
11
11
|
|
|
@@ -2,7 +2,7 @@ from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annot
|
|
|
2
2
|
from mindor.dsl.schema.component import McpClientComponentConfig
|
|
3
3
|
from mindor.dsl.schema.action import ActionConfig, McpClientActionConfig
|
|
4
4
|
from mindor.core.utils.mcp_client import McpClient, ContentBlock, TextContent, ImageContent, AudioContent
|
|
5
|
-
from ..base import
|
|
5
|
+
from ..base import ComponentService, ComponentType, ComponentGlobalConfigs, register_component
|
|
6
6
|
from ..context import ComponentActionContext
|
|
7
7
|
|
|
8
8
|
class McpClientAction():
|
|
@@ -28,7 +28,7 @@ class McpClientAction():
|
|
|
28
28
|
return None
|
|
29
29
|
|
|
30
30
|
@register_component(ComponentType.MCP_CLIENT)
|
|
31
|
-
class McpClientComponent(
|
|
31
|
+
class McpClientComponent(ComponentService):
|
|
32
32
|
def __init__(self, id: str, config: McpClientComponentConfig, global_configs: ComponentGlobalConfigs, daemon: bool):
|
|
33
33
|
super().__init__(id, config, global_configs, daemon)
|
|
34
34
|
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Any
|
|
2
2
|
from mindor.dsl.schema.component import McpServerComponentConfig
|
|
3
3
|
from mindor.dsl.schema.action import ActionConfig, McpServerActionConfig
|
|
4
|
-
from ..base import
|
|
4
|
+
from ..base import ComponentService, ComponentType, ComponentGlobalConfigs, register_component
|
|
5
5
|
from ..context import ComponentActionContext
|
|
6
6
|
|
|
7
7
|
@register_component(ComponentType.MCP_SERVER)
|
|
8
|
-
class McpServerComponent(
|
|
8
|
+
class McpServerComponent(ComponentService):
|
|
9
9
|
def __init__(self, id: str, config: McpServerComponentConfig, global_configs: ComponentGlobalConfigs, daemon: bool):
|
|
10
10
|
super().__init__(id, config, global_configs, daemon)
|
|
11
11
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Any
|
|
2
2
|
from mindor.dsl.schema.component import ShellComponentConfig
|
|
3
3
|
from mindor.dsl.schema.action import ActionConfig, ShellActionConfig
|
|
4
|
-
from ..base import
|
|
4
|
+
from ..base import ComponentService, ComponentType, ComponentGlobalConfigs, register_component
|
|
5
5
|
from ..context import ComponentActionContext
|
|
6
6
|
from asyncio.subprocess import Process
|
|
7
7
|
import asyncio, os
|
|
@@ -65,7 +65,7 @@ class ShellAction:
|
|
|
65
65
|
return working_dir
|
|
66
66
|
|
|
67
67
|
@register_component(ComponentType.SHELL)
|
|
68
|
-
class ShellComponent(
|
|
68
|
+
class ShellComponent(ComponentService):
|
|
69
69
|
def __init__(self, id: str, config: ShellComponentConfig, global_configs: ComponentGlobalConfigs, daemon: bool):
|
|
70
70
|
super().__init__(id, config, global_configs, daemon)
|
|
71
71
|
|
|
@@ -3,7 +3,7 @@ from mindor.dsl.schema.component import ComponentConfig, WorkflowComponentConfig
|
|
|
3
3
|
from mindor.dsl.schema.action import ActionConfig, WorkflowActionConfig
|
|
4
4
|
from mindor.dsl.schema.workflow import WorkflowConfig
|
|
5
5
|
from mindor.core.workflow import Workflow, WorkflowResolver, create_workflow
|
|
6
|
-
from ..base import
|
|
6
|
+
from ..base import ComponentService, ComponentType, ComponentGlobalConfigs, register_component
|
|
7
7
|
from ..context import ComponentActionContext
|
|
8
8
|
import asyncio, os
|
|
9
9
|
|
|
@@ -26,7 +26,7 @@ class WorkflowAction:
|
|
|
26
26
|
return create_workflow(*WorkflowResolver(self.global_configs.workflows).resolve(workflow_id), self.global_configs)
|
|
27
27
|
|
|
28
28
|
@register_component(ComponentType.WORKFLOW)
|
|
29
|
-
class WorkflowComponent(
|
|
29
|
+
class WorkflowComponent(ComponentService):
|
|
30
30
|
def __init__(self, id: str, config: WorkflowComponentConfig, global_configs: ComponentGlobalConfigs, daemon: bool):
|
|
31
31
|
super().__init__(id, config, global_configs, daemon)
|
|
32
32
|
|
|
@@ -2,17 +2,17 @@ from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annot
|
|
|
2
2
|
from mindor.dsl.schema.compose import ComposeConfig
|
|
3
3
|
from .manager import ComposeManager, TaskState
|
|
4
4
|
|
|
5
|
-
async def launch_services(config: ComposeConfig, detach: bool):
|
|
6
|
-
await ComposeManager(config, daemon=True).launch_services(detach
|
|
5
|
+
async def launch_services(config: ComposeConfig, detach: bool, verbose: bool):
|
|
6
|
+
await ComposeManager(config, daemon=True).launch_services(detach, verbose)
|
|
7
7
|
|
|
8
8
|
async def shutdown_services(config: ComposeConfig):
|
|
9
9
|
await ComposeManager(config, daemon=False).shutdown_services()
|
|
10
10
|
|
|
11
|
-
async def start_services(config: ComposeConfig,
|
|
12
|
-
await ComposeManager(config, daemon=False).start_services()
|
|
11
|
+
async def start_services(config: ComposeConfig, verbose: bool):
|
|
12
|
+
await ComposeManager(config, daemon=False).start_services(verbose)
|
|
13
13
|
|
|
14
14
|
async def stop_services(config: ComposeConfig):
|
|
15
15
|
await ComposeManager(config, daemon=False).stop_services()
|
|
16
16
|
|
|
17
|
-
async def run_workflow(config: ComposeConfig, workflow_id: Optional[str], input: Dict[str, Any]) -> TaskState:
|
|
18
|
-
return await ComposeManager(config, daemon=False).run_workflow(workflow_id, input)
|
|
17
|
+
async def run_workflow(config: ComposeConfig, workflow_id: Optional[str], input: Dict[str, Any], verbose: bool) -> TaskState:
|
|
18
|
+
return await ComposeManager(config, daemon=False).run_workflow(workflow_id, input, verbose)
|
|
@@ -1,34 +1,35 @@
|
|
|
1
1
|
from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Any
|
|
2
2
|
from mindor.dsl.schema.compose import ComposeConfig
|
|
3
|
-
from mindor.core.controller import
|
|
3
|
+
from mindor.core.controller import ControllerService, TaskState, create_controller
|
|
4
4
|
|
|
5
5
|
class ComposeManager:
|
|
6
|
-
def __init__(self, config: ComposeConfig, daemon: bool
|
|
6
|
+
def __init__(self, config: ComposeConfig, daemon: bool):
|
|
7
7
|
self.config: ComposeConfig = config
|
|
8
|
-
self.controller:
|
|
8
|
+
self.controller: ControllerService = create_controller(
|
|
9
9
|
self.config.controller,
|
|
10
|
+
self.config.workflows,
|
|
10
11
|
self.config.components,
|
|
11
12
|
self.config.listeners,
|
|
12
13
|
self.config.gateways,
|
|
13
|
-
self.config.
|
|
14
|
+
self.config.loggers,
|
|
14
15
|
daemon
|
|
15
16
|
)
|
|
16
17
|
|
|
17
|
-
async def launch_services(self, detach: bool,
|
|
18
|
-
await self.controller.start(
|
|
18
|
+
async def launch_services(self, detach: bool, verbose: bool):
|
|
19
|
+
await self.controller.start()
|
|
19
20
|
await self.controller.wait_until_stopped()
|
|
20
21
|
|
|
21
22
|
async def shutdown_services(self):
|
|
22
23
|
await self.controller.stop()
|
|
23
24
|
|
|
24
|
-
async def start_services(self,
|
|
25
|
-
await self.controller.start(
|
|
25
|
+
async def start_services(self, verbose: bool):
|
|
26
|
+
await self.controller.start()
|
|
26
27
|
await self.controller.wait_until_stopped()
|
|
27
28
|
|
|
28
29
|
async def stop_services(self):
|
|
29
30
|
await self.controller.stop()
|
|
30
31
|
|
|
31
|
-
async def run_workflow(self, workflow_id: Optional[str], input: Dict[str, Any]) -> TaskState:
|
|
32
|
+
async def run_workflow(self, workflow_id: Optional[str], input: Dict[str, Any], verbose: bool) -> TaskState:
|
|
32
33
|
if not self.controller.started:
|
|
33
34
|
await self.controller.start()
|
|
34
35
|
|
|
@@ -5,12 +5,14 @@ from mindor.dsl.schema.controller import ControllerConfig, ControllerType
|
|
|
5
5
|
from mindor.dsl.schema.component import ComponentConfig
|
|
6
6
|
from mindor.dsl.schema.listener import ListenerConfig
|
|
7
7
|
from mindor.dsl.schema.gateway import GatewayConfig
|
|
8
|
+
from mindor.dsl.schema.logger import LoggerConfig
|
|
8
9
|
from mindor.dsl.schema.workflow import WorkflowConfig
|
|
9
10
|
from mindor.core.services import AsyncService
|
|
10
|
-
from mindor.core.component import
|
|
11
|
-
from mindor.core.listener import
|
|
12
|
-
from mindor.core.gateway import
|
|
11
|
+
from mindor.core.component import ComponentService, ComponentGlobalConfigs, create_component
|
|
12
|
+
from mindor.core.listener import ListenerService, create_listener
|
|
13
|
+
from mindor.core.gateway import GatewayService, create_gateway
|
|
13
14
|
from mindor.core.workflow import Workflow, WorkflowResolver, create_workflow
|
|
15
|
+
from mindor.core.logger import LoggerService, create_logger
|
|
14
16
|
from mindor.core.controller.webui import ControllerWebUI
|
|
15
17
|
from mindor.core.utils.workqueue import WorkQueue
|
|
16
18
|
from mindor.core.utils.expiring import ExpiringDict
|
|
@@ -30,23 +32,25 @@ class TaskState:
|
|
|
30
32
|
output: Optional[Any] = None
|
|
31
33
|
error: Optional[Any] = None
|
|
32
34
|
|
|
33
|
-
class
|
|
35
|
+
class ControllerService(AsyncService):
|
|
34
36
|
def __init__(
|
|
35
37
|
self,
|
|
36
38
|
config: ControllerConfig,
|
|
39
|
+
workflows: Dict[str, WorkflowConfig],
|
|
37
40
|
components: Dict[str, ComponentConfig],
|
|
38
41
|
listeners: List[ListenerConfig],
|
|
39
42
|
gateways: List[GatewayConfig],
|
|
40
|
-
|
|
43
|
+
loggers: List[LoggerConfig],
|
|
41
44
|
daemon: bool
|
|
42
45
|
):
|
|
43
46
|
super().__init__(daemon)
|
|
44
47
|
|
|
45
48
|
self.config: ControllerConfig = config
|
|
49
|
+
self.workflows: Dict[str, WorkflowConfig] = workflows
|
|
46
50
|
self.components: Dict[str, ComponentConfig] = components
|
|
47
51
|
self.listeners: List[ListenerConfig] = listeners
|
|
48
52
|
self.gateways: List[GatewayConfig] = gateways
|
|
49
|
-
self.
|
|
53
|
+
self.loggers: List[LoggerConfig] = loggers
|
|
50
54
|
self.queue: Optional[WorkQueue] = None
|
|
51
55
|
self.task_states: ExpiringDict[TaskState] = ExpiringDict()
|
|
52
56
|
self.task_states_lock: Lock = Lock()
|
|
@@ -79,9 +83,10 @@ class ControllerEngine(AsyncService):
|
|
|
79
83
|
await self.queue.start()
|
|
80
84
|
|
|
81
85
|
if self.daemon:
|
|
82
|
-
await self.
|
|
83
|
-
await self._start_listeners()
|
|
86
|
+
await self._start_loggers()
|
|
84
87
|
await self._start_gateways()
|
|
88
|
+
await self._start_listeners()
|
|
89
|
+
await self._start_components()
|
|
85
90
|
|
|
86
91
|
if self.config.webui:
|
|
87
92
|
await self._start_webui()
|
|
@@ -93,21 +98,16 @@ class ControllerEngine(AsyncService):
|
|
|
93
98
|
await self.queue.stop()
|
|
94
99
|
|
|
95
100
|
if self.daemon:
|
|
96
|
-
await self._stop_gateways()
|
|
97
|
-
await self._stop_listeners()
|
|
98
101
|
await self._stop_components()
|
|
102
|
+
await self._stop_listeners()
|
|
103
|
+
await self._stop_gateways()
|
|
104
|
+
await self._stop_loggers()
|
|
99
105
|
|
|
100
106
|
if self.config.webui:
|
|
101
107
|
await self._stop_webui()
|
|
102
108
|
|
|
103
109
|
await super()._stop()
|
|
104
110
|
|
|
105
|
-
async def _start_components(self) -> None:
|
|
106
|
-
await asyncio.gather(*[ component.start() for component in self._create_components() ])
|
|
107
|
-
|
|
108
|
-
async def _stop_components(self) -> None:
|
|
109
|
-
await asyncio.gather(*[ component.stop() for component in self._create_components() ])
|
|
110
|
-
|
|
111
111
|
async def _start_listeners(self) -> None:
|
|
112
112
|
await asyncio.gather(*[ listener.start() for listener in self._create_listeners() ])
|
|
113
113
|
|
|
@@ -120,6 +120,18 @@ class ControllerEngine(AsyncService):
|
|
|
120
120
|
async def _stop_gateways(self) -> None:
|
|
121
121
|
await asyncio.gather(*[ gateway.stop() for gateway in self._create_gateways() ])
|
|
122
122
|
|
|
123
|
+
async def _start_components(self) -> None:
|
|
124
|
+
await asyncio.gather(*[ component.start() for component in self._create_components() ])
|
|
125
|
+
|
|
126
|
+
async def _stop_components(self) -> None:
|
|
127
|
+
await asyncio.gather(*[ component.stop() for component in self._create_components() ])
|
|
128
|
+
|
|
129
|
+
async def _start_loggers(self) -> None:
|
|
130
|
+
await asyncio.gather(*[ logger.start() for logger in self._create_loggers() ])
|
|
131
|
+
|
|
132
|
+
async def _stop_loggers(self) -> None:
|
|
133
|
+
await asyncio.gather(*[ logger.stop() for logger in self._create_loggers() ])
|
|
134
|
+
|
|
123
135
|
async def _start_webui(self) -> None:
|
|
124
136
|
await asyncio.gather(*[ self._create_webui().start() ])
|
|
125
137
|
|
|
@@ -143,16 +155,19 @@ class ControllerEngine(AsyncService):
|
|
|
143
155
|
|
|
144
156
|
return state
|
|
145
157
|
|
|
146
|
-
def
|
|
147
|
-
global_configs = self._get_component_global_configs()
|
|
148
|
-
return [ create_component(component_id, config, global_configs, self.daemon) for component_id, config in self.components.items() ]
|
|
149
|
-
|
|
150
|
-
def _create_listeners(self) -> List[ListenerEngine]:
|
|
158
|
+
def _create_listeners(self) -> List[ListenerService]:
|
|
151
159
|
return [ create_listener(f"listener-{index}", config, self.daemon) for index, config in enumerate(self.listeners) ]
|
|
152
160
|
|
|
153
|
-
def _create_gateways(self) -> List[
|
|
161
|
+
def _create_gateways(self) -> List[GatewayService]:
|
|
154
162
|
return [ create_gateway(f"gateway-{index}", config, self.daemon) for index, config in enumerate(self.gateways) ]
|
|
163
|
+
|
|
164
|
+
def _create_components(self) -> List[ComponentService]:
|
|
165
|
+
global_configs = self._get_component_global_configs()
|
|
166
|
+
return [ create_component(component_id, config, global_configs, self.daemon) for component_id, config in self.components.items() ]
|
|
155
167
|
|
|
168
|
+
def _create_loggers(self) -> List[LoggerService]:
|
|
169
|
+
return [ create_logger(f"logger-{index}", config, self.daemon) for index, config in enumerate(self.loggers) ]
|
|
170
|
+
|
|
156
171
|
def _create_webui(self) -> ControllerWebUI:
|
|
157
172
|
return ControllerWebUI(self.config.webui, self.config, self.components, self.workflows, self.daemon)
|
|
158
173
|
|
|
@@ -164,9 +179,9 @@ class ControllerEngine(AsyncService):
|
|
|
164
179
|
return ComponentGlobalConfigs(self.components, self.listeners, self.gateways, self.workflows)
|
|
165
180
|
|
|
166
181
|
def register_controller(type: ControllerType):
|
|
167
|
-
def decorator(cls: Type[
|
|
182
|
+
def decorator(cls: Type[ControllerService]) -> Type[ControllerService]:
|
|
168
183
|
ControllerRegistry[type] = cls
|
|
169
184
|
return cls
|
|
170
185
|
return decorator
|
|
171
186
|
|
|
172
|
-
ControllerRegistry: Dict[ControllerType, Type[
|
|
187
|
+
ControllerRegistry: Dict[ControllerType, Type[ControllerService]] = {}
|
|
@@ -4,19 +4,21 @@ from mindor.dsl.schema.component import ComponentConfig
|
|
|
4
4
|
from mindor.dsl.schema.listener import ListenerConfig
|
|
5
5
|
from mindor.dsl.schema.gateway import GatewayConfig
|
|
6
6
|
from mindor.dsl.schema.workflow import WorkflowConfig
|
|
7
|
-
from .
|
|
7
|
+
from mindor.dsl.schema.logger import LoggerConfig
|
|
8
|
+
from .base import ControllerService, ControllerRegistry
|
|
8
9
|
|
|
9
10
|
def create_controller(
|
|
10
|
-
config: ControllerConfig,
|
|
11
|
+
config: ControllerConfig,
|
|
12
|
+
workflows: Dict[str, WorkflowConfig],
|
|
11
13
|
components: Dict[str, ComponentConfig],
|
|
12
14
|
listeners: List[ListenerConfig],
|
|
13
15
|
gateways: List[GatewayConfig],
|
|
14
|
-
|
|
16
|
+
loggers: List[LoggerConfig],
|
|
15
17
|
daemon: bool
|
|
16
|
-
) ->
|
|
18
|
+
) -> ControllerService:
|
|
17
19
|
try:
|
|
18
20
|
if not ControllerRegistry:
|
|
19
|
-
from . import
|
|
20
|
-
return ControllerRegistry[config.type](config, components, listeners, gateways,
|
|
21
|
+
from . import services
|
|
22
|
+
return ControllerRegistry[config.type](config, workflows, components, listeners, gateways, loggers, daemon)
|
|
21
23
|
except KeyError:
|
|
22
24
|
raise ValueError(f"Unsupported controller type: {config.type}")
|
|
@@ -8,5 +8,9 @@ class ControllerClient(ABC):
|
|
|
8
8
|
self.config: ControllerConfig = config
|
|
9
9
|
|
|
10
10
|
@abstractmethod
|
|
11
|
-
async def run_workflow(self, workflow_id: Optional[str], input: Any
|
|
11
|
+
async def run_workflow(self, workflow_id: Optional[str], input: Any) -> Any:
|
|
12
|
+
pass
|
|
13
|
+
|
|
14
|
+
@abstractmethod
|
|
15
|
+
async def close(self) -> None:
|
|
12
16
|
pass
|
{model_compose-0.2.6 → model_compose-0.2.7}/src/mindor/core/controller/runner/http_client.py
RENAMED
|
@@ -2,7 +2,7 @@ from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annot
|
|
|
2
2
|
from mindor.dsl.schema.controller import ControllerConfig
|
|
3
3
|
from mindor.core.workflow.schema import WorkflowSchema
|
|
4
4
|
from mindor.core.utils.http_client import HttpClient
|
|
5
|
-
from .
|
|
5
|
+
from .client import ControllerClient
|
|
6
6
|
from starlette.datastructures import UploadFile
|
|
7
7
|
|
|
8
8
|
class HttpControllerClient(ControllerClient):
|
|
@@ -7,7 +7,7 @@ from mindor.core.utils.streaming import StreamResource, FileStreamResource, Base
|
|
|
7
7
|
from mindor.core.utils.streaming import encode_stream_to_base64
|
|
8
8
|
from mindor.core.utils.http_client import create_stream_with_url
|
|
9
9
|
from mindor.core.utils.image import load_image_from_stream
|
|
10
|
-
from .
|
|
10
|
+
from .client import ControllerClient
|
|
11
11
|
import json, os
|
|
12
12
|
|
|
13
13
|
class McpControllerClient(ControllerClient):
|
|
@@ -6,18 +6,6 @@ from .client import ControllerClient
|
|
|
6
6
|
from .http_client import HttpControllerClient
|
|
7
7
|
from .mcp_client import McpControllerClient
|
|
8
8
|
|
|
9
|
-
class ControllerClient(ABC):
|
|
10
|
-
def __init__(self, config: ControllerConfig):
|
|
11
|
-
self.config: ControllerConfig = config
|
|
12
|
-
|
|
13
|
-
@abstractmethod
|
|
14
|
-
async def run_workflow(self, workflow_id: Optional[str], input: Any) -> Any:
|
|
15
|
-
pass
|
|
16
|
-
|
|
17
|
-
@abstractmethod
|
|
18
|
-
async def close(self) -> None:
|
|
19
|
-
pass
|
|
20
|
-
|
|
21
9
|
class ControllerRunner:
|
|
22
10
|
def __init__(self, config: ControllerConfig):
|
|
23
11
|
self.config: ControllerConfig = config
|
|
@@ -5,10 +5,11 @@ from mindor.dsl.schema.controller import HttpServerControllerConfig
|
|
|
5
5
|
from mindor.dsl.schema.component import ComponentConfig
|
|
6
6
|
from mindor.dsl.schema.listener import ListenerConfig
|
|
7
7
|
from mindor.dsl.schema.gateway import GatewayConfig
|
|
8
|
+
from mindor.dsl.schema.logger import LoggerConfig
|
|
8
9
|
from mindor.dsl.schema.workflow import WorkflowConfig
|
|
9
10
|
from mindor.core.utils.http_request import parse_request_body, parse_options_header
|
|
10
11
|
from mindor.core.utils.streaming import StreamResource
|
|
11
|
-
from ..base import
|
|
12
|
+
from ..base import ControllerService, ControllerType, TaskState, TaskStatus, register_controller
|
|
12
13
|
from fastapi import FastAPI, APIRouter, Request, Body, HTTPException
|
|
13
14
|
from fastapi.middleware.cors import CORSMiddleware
|
|
14
15
|
from fastapi.responses import Response, JSONResponse, StreamingResponse
|
|
@@ -37,7 +38,7 @@ class TaskResult(BaseModel):
|
|
|
37
38
|
)
|
|
38
39
|
|
|
39
40
|
@register_controller(ControllerType.HTTP_SERVER)
|
|
40
|
-
class HttpServerController(
|
|
41
|
+
class HttpServerController(ControllerService):
|
|
41
42
|
def __init__(
|
|
42
43
|
self,
|
|
43
44
|
config: HttpServerControllerConfig,
|
|
@@ -45,9 +46,10 @@ class HttpServerController(ControllerEngine):
|
|
|
45
46
|
listeners: List[ListenerConfig],
|
|
46
47
|
gateways: List[GatewayConfig],
|
|
47
48
|
workflows: Dict[str, WorkflowConfig],
|
|
49
|
+
loggers: List[LoggerConfig],
|
|
48
50
|
daemon: bool
|
|
49
51
|
):
|
|
50
|
-
super().__init__(config, components, listeners, gateways, workflows, daemon)
|
|
52
|
+
super().__init__(config, components, listeners, gateways, workflows, loggers, daemon)
|
|
51
53
|
|
|
52
54
|
self.server: Optional[uvicorn.Server] = None
|
|
53
55
|
self.app: FastAPI = FastAPI(openapi_url=None, docs_url=None, redoc_url=None)
|
|
@@ -3,12 +3,13 @@ from mindor.dsl.schema.controller import McpServerControllerConfig
|
|
|
3
3
|
from mindor.dsl.schema.component import ComponentConfig
|
|
4
4
|
from mindor.dsl.schema.listener import ListenerConfig
|
|
5
5
|
from mindor.dsl.schema.gateway import GatewayConfig
|
|
6
|
+
from mindor.dsl.schema.logger import LoggerConfig
|
|
6
7
|
from mindor.dsl.schema.workflow import WorkflowConfig, WorkflowVariableConfig, WorkflowVariableType, WorkflowVariableFormat
|
|
7
8
|
from mindor.core.workflow.schema import WorkflowSchema, create_workflow_schema
|
|
8
9
|
from mindor.core.utils.streaming import StreamResource, Base64StreamResource
|
|
9
10
|
from mindor.core.utils.streaming import save_stream_to_temporary_file
|
|
10
11
|
from mindor.core.utils.http_client import create_stream_with_url
|
|
11
|
-
from ..base import
|
|
12
|
+
from ..base import ControllerService, ControllerType, TaskState, register_controller
|
|
12
13
|
from mcp.server.fastmcp.server import FastMCP
|
|
13
14
|
from mcp.types import TextContent, ImageContent, AudioContent
|
|
14
15
|
import uvicorn, re, json
|
|
@@ -128,17 +129,18 @@ class WorkflowToolGenerator():
|
|
|
128
129
|
return "str"
|
|
129
130
|
|
|
130
131
|
@register_controller(ControllerType.MCP_SERVER)
|
|
131
|
-
class McpServerController(
|
|
132
|
+
class McpServerController(ControllerService):
|
|
132
133
|
def __init__(
|
|
133
134
|
self,
|
|
134
135
|
config: McpServerControllerConfig,
|
|
136
|
+
workflows: Dict[str, WorkflowConfig],
|
|
135
137
|
components: Dict[str, ComponentConfig],
|
|
136
138
|
listeners: List[ListenerConfig],
|
|
137
139
|
gateways: List[GatewayConfig],
|
|
138
|
-
|
|
140
|
+
loggers: List[LoggerConfig],
|
|
139
141
|
daemon: bool
|
|
140
142
|
):
|
|
141
|
-
super().__init__(config, components, listeners, gateways,
|
|
143
|
+
super().__init__(config, workflows, components, listeners, gateways, loggers, daemon)
|
|
142
144
|
|
|
143
145
|
self.server: Optional[uvicorn.Server] = None
|
|
144
146
|
self.app: FastMCP = FastMCP(self.config.name, **{
|
|
@@ -3,7 +3,7 @@ from abc import abstractmethod
|
|
|
3
3
|
from mindor.dsl.schema.gateway import GatewayConfig, GatewayType
|
|
4
4
|
from mindor.core.services import AsyncService
|
|
5
5
|
|
|
6
|
-
class
|
|
6
|
+
class GatewayService(AsyncService):
|
|
7
7
|
def __init__(self, id: str, config: GatewayConfig, daemon: bool):
|
|
8
8
|
super().__init__(daemon)
|
|
9
9
|
|
|
@@ -15,9 +15,9 @@ class GatewayEngine(AsyncService):
|
|
|
15
15
|
pass
|
|
16
16
|
|
|
17
17
|
def register_gateway(type: GatewayType):
|
|
18
|
-
def decorator(cls: Type[
|
|
18
|
+
def decorator(cls: Type[GatewayService]) -> Type[GatewayService]:
|
|
19
19
|
GatewayRegistry[type] = cls
|
|
20
20
|
return cls
|
|
21
21
|
return decorator
|
|
22
22
|
|
|
23
|
-
GatewayRegistry: Dict[GatewayType, Type[
|
|
23
|
+
GatewayRegistry: Dict[GatewayType, Type[GatewayService]] = {}
|