model-compose 0.1.4__tar.gz → 0.1.6__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {model_compose-0.1.4/src/model_compose.egg-info → model_compose-0.1.6}/PKG-INFO +1 -1
- {model_compose-0.1.4 → model_compose-0.1.6}/pyproject.toml +1 -1
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/component/engine/context.py +2 -2
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/component/engine/http_client.py +1 -1
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/controller/webui/gradio.py +49 -41
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/controller/webui/schema.py +27 -17
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/listener/engine/http_callback.py +3 -3
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/utils/http_request.py +21 -2
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/utils/streaming.py +8 -2
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/utils/template.py +34 -11
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/workflow/context.py +2 -2
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/workflow/job.py +1 -1
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/workflow.py +3 -2
- {model_compose-0.1.4 → model_compose-0.1.6/src/model_compose.egg-info}/PKG-INFO +1 -1
- {model_compose-0.1.4 → model_compose-0.1.6}/LICENSE +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/README.md +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/setup.cfg +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/__init__.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/cli/__init__.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/cli/compose.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/__init__.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/component/__init__.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/component/component.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/component/engine/__init__.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/component/engine/base.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/component/engine/http_server.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/compose/__init__.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/compose/compose.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/compose/manager.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/controller/__init__.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/controller/controller.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/controller/engine/__init__.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/controller/engine/base.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/controller/engine/http_server.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/controller/engine/mcp_server.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/controller/runner/__init__.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/controller/runner/client.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/controller/runner/http_client.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/controller/runner/mcp_client.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/controller/runner/runner.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/controller/webui/__init__.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/controller/webui/webui.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/gateway/__init__.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/gateway/engine/__init__.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/gateway/engine/base.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/gateway/engine/http_tunnel.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/gateway/gateway.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/listener/__init__.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/listener/engine/__init__.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/listener/engine/base.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/listener/listener.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/runtime/__init__.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/runtime/env.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/services/__init__.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/services/async_service.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/utils/__init__.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/utils/expiring.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/utils/http_client.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/utils/image.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/utils/time.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/utils/workqueue.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/workflow/__init__.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/workflow/workflow.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/__init__.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/loader.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/__init__.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/action/__init__.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/action/action.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/action/impl/__init__.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/action/impl/common.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/action/impl/http_client.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/action/impl/http_server.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/action/impl/mcp_client.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/action/impl/mcp_server.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/component/__init__.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/component/component.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/component/impl/__init__.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/component/impl/common.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/component/impl/http_client.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/component/impl/http_server.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/component/impl/mcp_client.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/component/impl/mcp_server.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/component/impl/types.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/compose.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/controller/__init__.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/controller/controller.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/controller/impl/__init__.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/controller/impl/common.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/controller/impl/http_server.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/controller/impl/mcp_server.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/controller/impl/types.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/controller/impl/webui.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/gateway/__init__.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/gateway/gateway.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/gateway/impl/__init__.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/gateway/impl/common.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/gateway/impl/http_tunnel.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/gateway/impl/types.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/listener/__init__.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/listener/impl/__init__.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/listener/impl/common.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/listener/impl/http_callback.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/listener/impl/types.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/listener/listener.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/runtime/__init__.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/runtime/impl/__init__.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/runtime/impl/common.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/runtime/impl/docker.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/runtime/impl/types.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/runtime/runtime.py +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/model_compose.egg-info/SOURCES.txt +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/model_compose.egg-info/dependency_links.txt +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/model_compose.egg-info/entry_points.txt +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/model_compose.egg-info/requires.txt +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/src/model_compose.egg-info/top_level.txt +0 -0
- {model_compose-0.1.4 → model_compose-0.1.6}/tests/test_cli.py +0 -0
|
@@ -14,8 +14,8 @@ class ComponentContext:
|
|
|
14
14
|
def register_source(self, key: str, source: Any) -> None:
|
|
15
15
|
self.sources[key] = source
|
|
16
16
|
|
|
17
|
-
async def render_template(self, data: Dict[str, Any]) -> Any:
|
|
18
|
-
return await self.renderer.render(data)
|
|
17
|
+
async def render_template(self, data: Dict[str, Any], ignore_files: bool = False) -> Any:
|
|
18
|
+
return await self.renderer.render(data, ignore_files)
|
|
19
19
|
|
|
20
20
|
async def _resolve_source(self, key: str) -> Any:
|
|
21
21
|
if key in self.sources:
|
|
@@ -88,7 +88,7 @@ class HttpClientAction:
|
|
|
88
88
|
result = await self._handle_completion(self.config.completion, context)
|
|
89
89
|
context.register_source("result", result)
|
|
90
90
|
|
|
91
|
-
return (await context.render_template(self.config.output)) if self.config.output else (result or response)
|
|
91
|
+
return (await context.render_template(self.config.output, ignore_files=True)) if self.config.output else (result or response)
|
|
92
92
|
|
|
93
93
|
async def _resolve_request_url(self, context: ComponentContext) -> str:
|
|
94
94
|
if self.base_url and self.config.path:
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
from typing import Type, Union, Literal, Optional, Dict, List, Tuple, Set, Annotated, Callable, Awaitable, Any
|
|
2
2
|
from mindor.dsl.schema.workflow import WorkflowVariableConfig, WorkflowVariableGroupConfig
|
|
3
|
-
from mindor.core.utils.
|
|
3
|
+
from mindor.core.utils.streaming import StreamResource, Base64StreamResource
|
|
4
|
+
from mindor.core.utils.streaming import save_stream_to_temporary_file
|
|
5
|
+
from mindor.core.utils.http_request import create_upload_file
|
|
6
|
+
from mindor.core.utils.http_client import HttpClient
|
|
4
7
|
from mindor.core.utils.image import load_image_from_stream
|
|
5
|
-
from mindor.core.utils.streaming import Base64StreamResource, save_stream_to_temporary_file
|
|
6
8
|
from .schema import WorkflowSchema
|
|
7
9
|
from starlette.datastructures import UploadFile
|
|
8
10
|
import gradio as gr
|
|
@@ -46,7 +48,7 @@ class GradioWebUIBuilder:
|
|
|
46
48
|
output_components = gr.Textbox(label="", lines=8, interactive=False, show_copy_button=True)
|
|
47
49
|
|
|
48
50
|
async def _run_workflow(*args):
|
|
49
|
-
input = self._build_input_values(args, workflow.input)
|
|
51
|
+
input = await self._build_input_values(args, workflow.input)
|
|
50
52
|
output = await runner(input)
|
|
51
53
|
output = await self._flatten_output_values(output, workflow.output)
|
|
52
54
|
return output[0] if len(output) == 1 else output
|
|
@@ -60,11 +62,11 @@ class GradioWebUIBuilder:
|
|
|
60
62
|
return section
|
|
61
63
|
|
|
62
64
|
def _build_input_component(self, variable: WorkflowVariableConfig) -> gr.Component:
|
|
63
|
-
label = variable.name + (" *" if variable.required else "") + (f" (default: {variable.default})" if variable.default else "")
|
|
65
|
+
label = (variable.name or "") + (" *" if variable.required else "") + (f" (default: {variable.default})" if variable.default else "")
|
|
64
66
|
info = variable.description or ""
|
|
65
67
|
default = variable.default
|
|
66
68
|
|
|
67
|
-
if variable.type == "string":
|
|
69
|
+
if variable.type == "string" or variable.format in [ "base64", "url" ]:
|
|
68
70
|
return gr.Textbox(label=label, value="", info=info)
|
|
69
71
|
|
|
70
72
|
if variable.type == "number":
|
|
@@ -93,30 +95,25 @@ class GradioWebUIBuilder:
|
|
|
93
95
|
|
|
94
96
|
return gr.Textbox(label=label, value=default, info=f"Unsupported type: {variable.type}")
|
|
95
97
|
|
|
96
|
-
def _build_input_values(self, arguments: List[Any], variables: List[WorkflowVariableConfig]) -> Any:
|
|
98
|
+
async def _build_input_values(self, arguments: List[Any], variables: List[WorkflowVariableConfig]) -> Any:
|
|
97
99
|
if len(variables) == 1 and not variables[0].name:
|
|
98
100
|
return arguments[0]
|
|
99
101
|
|
|
100
102
|
input: Dict[str, Any] = {}
|
|
101
103
|
|
|
102
104
|
for value, variable in zip(arguments, variables):
|
|
103
|
-
|
|
105
|
+
type, subtype, format = variable.type.value, variable.subtype, variable.format.value if variable.format else None
|
|
106
|
+
input[variable.name] = await self._convert_input_value(value, type, subtype, format, variable.internal)
|
|
104
107
|
|
|
105
108
|
return input
|
|
106
|
-
|
|
107
|
-
def _convert_input_value(self, value: Any,
|
|
108
|
-
if
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
"Content-Disposition": f'form-data; filename="{filename}"'
|
|
113
|
-
}
|
|
114
|
-
return UploadFile(file=file, filename=filename, headers=headers)
|
|
109
|
+
|
|
110
|
+
async def _convert_input_value(self, value: Any, type: str, subtype: Optional[str], format: Optional[str], internal: bool) -> Any:
|
|
111
|
+
if type in [ "image", "audio", "video", "file" ] and (not internal or not format):
|
|
112
|
+
if internal and format and format != "path":
|
|
113
|
+
value = await self._save_value_to_temporary_file(value, subtype, format)
|
|
114
|
+
return create_upload_file(value, type, subtype)
|
|
115
115
|
|
|
116
116
|
return value if value != "" else None
|
|
117
|
-
|
|
118
|
-
def _guess_file_content_type(self, filename: str, variable: WorkflowVariableConfig) -> str:
|
|
119
|
-
return "application/octet-stream"
|
|
120
117
|
|
|
121
118
|
def _build_output_component(self, variable: Union[WorkflowVariableConfig, WorkflowVariableGroupConfig]) -> Union[gr.Component, List[ComponentGroup]]:
|
|
122
119
|
if isinstance(variable, WorkflowVariableGroupConfig):
|
|
@@ -131,15 +128,15 @@ class GradioWebUIBuilder:
|
|
|
131
128
|
label = variable.name or ""
|
|
132
129
|
info = variable.description or ""
|
|
133
130
|
|
|
134
|
-
if variable.type
|
|
131
|
+
if variable.type in [ "string", "base64" ]:
|
|
135
132
|
return gr.Textbox(label=label, interactive=False, show_copy_button=True, info=info)
|
|
136
133
|
|
|
137
134
|
if variable.type == "image":
|
|
138
135
|
return gr.Image(label=label, interactive=False)
|
|
139
|
-
|
|
136
|
+
|
|
140
137
|
if variable.type == "audio":
|
|
141
138
|
return gr.Audio(label=label)
|
|
142
|
-
|
|
139
|
+
|
|
143
140
|
if variable.type == "video":
|
|
144
141
|
return gr.Video(label=label)
|
|
145
142
|
|
|
@@ -164,31 +161,42 @@ class GradioWebUIBuilder:
|
|
|
164
161
|
flattened.extend(await self._flatten_output_values(value, variable.variables))
|
|
165
162
|
else:
|
|
166
163
|
value = output[variable.name] if variable.name else output
|
|
167
|
-
|
|
164
|
+
type, subtype, format = variable.type.value, variable.subtype, variable.format.value if variable.format else None
|
|
165
|
+
flattened.append(await self._convert_output_value(value, type, subtype, format, variable.internal))
|
|
168
166
|
return flattened
|
|
169
167
|
|
|
170
|
-
async def
|
|
168
|
+
async def _convert_output_value(self, value: Any, type: str, subtype: Optional[str], format: Optional[str], internal: bool) -> Any:
|
|
171
169
|
if type == "string":
|
|
172
|
-
if isinstance(value, (dict, list))
|
|
173
|
-
return json.dumps(value)
|
|
174
|
-
return str(value)
|
|
170
|
+
return json.dumps(value) if isinstance(value, (dict, list)) else str(value)
|
|
175
171
|
|
|
176
172
|
if type == "image":
|
|
177
|
-
|
|
178
|
-
return await load_image_from_stream(await HttpClient().request(value), subtype)
|
|
179
|
-
if format == "base64" and isinstance(value, str):
|
|
180
|
-
return await load_image_from_stream(Base64StreamResource(value), subtype)
|
|
181
|
-
if isinstance(value, HttpStreamResource):
|
|
182
|
-
return await load_image_from_stream(value, subtype)
|
|
183
|
-
return None
|
|
173
|
+
return await self._load_image_from_value(value, subtype, format)
|
|
184
174
|
|
|
185
175
|
if type in [ "audio", "video" ]:
|
|
186
|
-
|
|
187
|
-
return await save_stream_to_temporary_file(await HttpClient().request(value), subtype)
|
|
188
|
-
if format == "base64" and isinstance(value, str):
|
|
189
|
-
return await save_stream_to_temporary_file(Base64StreamResource(value), subtype)
|
|
190
|
-
if isinstance(value, HttpStreamResource):
|
|
191
|
-
return await save_stream_to_temporary_file(value, subtype)
|
|
192
|
-
return None
|
|
176
|
+
return await self._save_value_to_temporary_file(value, subtype, format)
|
|
193
177
|
|
|
194
178
|
return value
|
|
179
|
+
|
|
180
|
+
async def _load_image_from_value(self, value: Any, subtype: Optional[str], format: Optional[str]) -> Optional[str]:
|
|
181
|
+
if format == "base64" and isinstance(value, str):
|
|
182
|
+
return await load_image_from_stream(Base64StreamResource(value), subtype)
|
|
183
|
+
|
|
184
|
+
if format == "url" and isinstance(value, str):
|
|
185
|
+
return await load_image_from_stream(await HttpClient().request(value), subtype)
|
|
186
|
+
|
|
187
|
+
if isinstance(value, StreamResource):
|
|
188
|
+
return await load_image_from_stream(value, subtype)
|
|
189
|
+
|
|
190
|
+
return None
|
|
191
|
+
|
|
192
|
+
async def _save_value_to_temporary_file(self, value: Any, subtype: Optional[str], format: Optional[str]) -> Optional[str]:
|
|
193
|
+
if format == "base64" and isinstance(value, str):
|
|
194
|
+
return await save_stream_to_temporary_file(Base64StreamResource(value), subtype)
|
|
195
|
+
|
|
196
|
+
if format == "url" and isinstance(value, str):
|
|
197
|
+
return await save_stream_to_temporary_file(await HttpClient().request(value), subtype)
|
|
198
|
+
|
|
199
|
+
if isinstance(value, StreamResource):
|
|
200
|
+
return await save_stream_to_temporary_file(value, subtype)
|
|
201
|
+
|
|
202
|
+
return None
|
|
@@ -5,12 +5,13 @@ from mindor.dsl.schema.component import ComponentConfig
|
|
|
5
5
|
import re, json
|
|
6
6
|
|
|
7
7
|
class WorkflowVariable:
|
|
8
|
-
def __init__(self, name: Optional[str], type: str, subtype: Optional[str], format: Optional[str], default: Optional[Any]):
|
|
8
|
+
def __init__(self, name: Optional[str], type: str, subtype: Optional[str], format: Optional[str], default: Optional[Any], internal: bool = False):
|
|
9
9
|
self.name: Optional[str] = name
|
|
10
10
|
self.type: str = type
|
|
11
11
|
self.subtype: Optional[str] = subtype
|
|
12
12
|
self.format: Optional[str] = format
|
|
13
13
|
self.default: Optional[Any] = default
|
|
14
|
+
self.internal: bool = internal
|
|
14
15
|
|
|
15
16
|
def to_dict(self) -> Dict[str, Any]:
|
|
16
17
|
return {
|
|
@@ -18,7 +19,8 @@ class WorkflowVariable:
|
|
|
18
19
|
"type": self.type,
|
|
19
20
|
"subtype": self.subtype,
|
|
20
21
|
"format": self.format,
|
|
21
|
-
"default": self.default
|
|
22
|
+
"default": self.default,
|
|
23
|
+
"internal": self.internal
|
|
22
24
|
}
|
|
23
25
|
|
|
24
26
|
def __eq__(self, other):
|
|
@@ -52,7 +54,7 @@ class WorkflowVariableResolver:
|
|
|
52
54
|
"keypath": re.compile(r"[-_\w]+|\[\d+\]"),
|
|
53
55
|
}
|
|
54
56
|
|
|
55
|
-
def _enumerate_input_variables(self, value: Any, wanted_key: str) -> List[WorkflowVariable]:
|
|
57
|
+
def _enumerate_input_variables(self, value: Any, wanted_key: str, internal: bool = False) -> List[WorkflowVariable]:
|
|
56
58
|
if isinstance(value, str):
|
|
57
59
|
variables: List[WorkflowVariable] = []
|
|
58
60
|
|
|
@@ -63,22 +65,22 @@ class WorkflowVariableResolver:
|
|
|
63
65
|
default = self._parse_as_type(default, type)
|
|
64
66
|
|
|
65
67
|
if key == wanted_key:
|
|
66
|
-
variables.append(WorkflowVariable(path, type or "string", subtype, format, default))
|
|
68
|
+
variables.append(WorkflowVariable(path, type or "string", subtype, format, default, internal))
|
|
67
69
|
|
|
68
70
|
return variables
|
|
69
71
|
|
|
70
72
|
if isinstance(value, BaseModel):
|
|
71
|
-
return self._enumerate_input_variables(value.model_dump(exclude_none=True), wanted_key)
|
|
73
|
+
return self._enumerate_input_variables(value.model_dump(exclude_none=True), wanted_key, internal)
|
|
72
74
|
|
|
73
75
|
if isinstance(value, dict):
|
|
74
|
-
return sum([ self._enumerate_input_variables(v, wanted_key) for v in value.values() ], [])
|
|
76
|
+
return sum([ self._enumerate_input_variables(v, wanted_key, internal) for v in value.values() ], [])
|
|
75
77
|
|
|
76
78
|
if isinstance(value, list):
|
|
77
|
-
return sum([ self._enumerate_input_variables(v, wanted_key) for v in value ], [])
|
|
79
|
+
return sum([ self._enumerate_input_variables(v, wanted_key, internal) for v in value ], [])
|
|
78
80
|
|
|
79
81
|
return []
|
|
80
82
|
|
|
81
|
-
def _enumerate_output_variables(self, name: Optional[str], value: Any) -> List[WorkflowVariable]:
|
|
83
|
+
def _enumerate_output_variables(self, name: Optional[str], value: Any, internal: bool = False) -> List[WorkflowVariable]:
|
|
82
84
|
variables: List[WorkflowVariable] = []
|
|
83
85
|
|
|
84
86
|
if isinstance(value, str):
|
|
@@ -88,18 +90,18 @@ class WorkflowVariableResolver:
|
|
|
88
90
|
if type and default:
|
|
89
91
|
default = self._parse_as_type(default, type)
|
|
90
92
|
|
|
91
|
-
variables.append(WorkflowVariable(name, type or "string", subtype, format, default))
|
|
93
|
+
variables.append(WorkflowVariable(name, type or "string", subtype, format, default, internal))
|
|
92
94
|
|
|
93
95
|
return variables
|
|
94
96
|
|
|
95
97
|
if isinstance(value, BaseModel):
|
|
96
|
-
return self._enumerate_output_variables(name, value.model_dump(exclude_none=True))
|
|
98
|
+
return self._enumerate_output_variables(name, value.model_dump(exclude_none=True), internal)
|
|
97
99
|
|
|
98
100
|
if isinstance(value, dict):
|
|
99
|
-
return sum([ self._enumerate_output_variables(f"{name}.{k}" if name else f"{k}", v) for k, v in value.items() ], [])
|
|
101
|
+
return sum([ self._enumerate_output_variables(f"{name}.{k}" if name else f"{k}", v, internal) for k, v in value.items() ], [])
|
|
100
102
|
|
|
101
103
|
if isinstance(value, list):
|
|
102
|
-
return sum([ self._enumerate_output_variables(f"{name}[{i}]" if name else f"[{i}]", v) for i, v in enumerate(value) ], [])
|
|
104
|
+
return sum([ self._enumerate_output_variables(f"{name}[{i}]" if name else f"[{i}]", v, internal) for i, v in enumerate(value) ], [])
|
|
103
105
|
|
|
104
106
|
return []
|
|
105
107
|
|
|
@@ -126,7 +128,7 @@ class WorkflowVariableResolver:
|
|
|
126
128
|
def _to_variable_config(self, variable: WorkflowVariable) -> WorkflowVariableConfig:
|
|
127
129
|
config_dict = variable.to_dict()
|
|
128
130
|
|
|
129
|
-
if variable.type
|
|
131
|
+
if variable.type in [ "image", "audio", "video", "file", "select" ] and variable.subtype:
|
|
130
132
|
config_dict["options"] = variable.subtype.split(",")
|
|
131
133
|
|
|
132
134
|
return WorkflowVariableConfig(**config_dict)
|
|
@@ -156,9 +158,13 @@ class WorkflowInputVariableResolver(WorkflowVariableResolver):
|
|
|
156
158
|
if isinstance(job.component, str):
|
|
157
159
|
component: Optional[ComponentConfig] = components[job.component] if job.component in components else None
|
|
158
160
|
if component:
|
|
159
|
-
|
|
161
|
+
action = component.actions[action_id] if action_id in component.actions else None
|
|
162
|
+
if action:
|
|
163
|
+
variables.extend(self._enumerate_input_variables(action, "input", internal=True))
|
|
160
164
|
else:
|
|
161
|
-
|
|
165
|
+
action = job.component.actions[action_id] if action_id in job.component.actions else None
|
|
166
|
+
if action:
|
|
167
|
+
variables.extend(self._enumerate_input_variables(action, "input", internal=True))
|
|
162
168
|
else:
|
|
163
169
|
variables.extend(self._enumerate_input_variables(job.input, "input"))
|
|
164
170
|
|
|
@@ -186,9 +192,13 @@ class WorkflowOutputVariableResolver(WorkflowVariableResolver):
|
|
|
186
192
|
if isinstance(job.component, str):
|
|
187
193
|
component: Optional[ComponentConfig] = components[job.component] if job.component in components else None
|
|
188
194
|
if component:
|
|
189
|
-
|
|
195
|
+
action = component.actions[action_id] if action_id in component.actions else None
|
|
196
|
+
if action:
|
|
197
|
+
job_variables.extend(self._enumerate_output_variables(None, action.output, internal=True))
|
|
190
198
|
else:
|
|
191
|
-
|
|
199
|
+
action = job.component.actions[action_id] if action_id in job.component.actions else None
|
|
200
|
+
if action:
|
|
201
|
+
job_variables.extend(self._enumerate_output_variables(None, action.output, internal=True))
|
|
192
202
|
else:
|
|
193
203
|
job_variables.extend(self._enumerate_output_variables(None, job.output))
|
|
194
204
|
|
{model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/listener/engine/http_callback.py
RENAMED
|
@@ -25,8 +25,8 @@ class HttpCallbackContext:
|
|
|
25
25
|
async for item in self._items():
|
|
26
26
|
yield HttpCallbackContext(item, self.query, False, None)
|
|
27
27
|
|
|
28
|
-
async def render_template(self, template: str) -> Any:
|
|
29
|
-
return await self.renderer.render(template)
|
|
28
|
+
async def render_template(self, template: str, ignore_files: bool = True) -> Any:
|
|
29
|
+
return await self.renderer.render(template, ignore_files)
|
|
30
30
|
|
|
31
31
|
async def _items(self) -> List[Any]:
|
|
32
32
|
item = await self.renderer.render(self.item) if self.item else self.body
|
|
@@ -78,7 +78,7 @@ class HttpCallbackListener(ListenerEngine):
|
|
|
78
78
|
|
|
79
79
|
if future:
|
|
80
80
|
if succeeded:
|
|
81
|
-
future.set_result((await item.render_template(callback.result)) if callback.result else item.body)
|
|
81
|
+
future.set_result((await item.render_template(callback.result, ignore_files=True)) if callback.result else item.body)
|
|
82
82
|
else:
|
|
83
83
|
future.set_exception(RuntimeError(f"Task failed for '{callback_id}'"))
|
|
84
84
|
self._remove_pending_future(callback_id)
|
|
@@ -3,7 +3,7 @@ from requests.structures import CaseInsensitiveDict
|
|
|
3
3
|
from starlette.datastructures import FormData, UploadFile
|
|
4
4
|
from urllib.parse import urlencode
|
|
5
5
|
from fastapi import Request
|
|
6
|
-
import aiohttp, re, json
|
|
6
|
+
import aiohttp, re, json, os
|
|
7
7
|
|
|
8
8
|
_token_pattern = r"([\w!#$%&'*+\-.^_`|~]+)"
|
|
9
9
|
_quoted_pattern = r'"([^"]*)"'
|
|
@@ -57,11 +57,12 @@ def build_request_form(body: Any) -> aiohttp.FormData:
|
|
|
57
57
|
|
|
58
58
|
for key, value in body.items() if isinstance(body, dict) else {}:
|
|
59
59
|
if isinstance(value, UploadFile):
|
|
60
|
+
content_type, _ = parse_options_header(value.headers, "Content-Type")
|
|
60
61
|
form.add_field(
|
|
61
62
|
name=key,
|
|
62
63
|
value=value.file,
|
|
63
64
|
filename=value.filename,
|
|
64
|
-
content_type=
|
|
65
|
+
content_type=content_type or "application/octet-stream"
|
|
65
66
|
)
|
|
66
67
|
else:
|
|
67
68
|
form.add_field(name=key, value=str(value))
|
|
@@ -101,3 +102,21 @@ def parse_options_header(headers: Dict[str, str], header_name: str) -> Tuple[str
|
|
|
101
102
|
options = {}
|
|
102
103
|
|
|
103
104
|
return value.strip().lower(), options
|
|
105
|
+
|
|
106
|
+
def create_upload_file(path: str, type: Optional[str], subtype: Optional[str]) -> UploadFile:
|
|
107
|
+
file, filename = open(path, "rb"), os.path.basename(path)
|
|
108
|
+
content_type = guess_file_content_type(filename, type, subtype)
|
|
109
|
+
headers = {
|
|
110
|
+
"Content-Type": content_type,
|
|
111
|
+
"Content-Disposition": f'form-data; filename="{filename}"'
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
return UploadFile(file=file, filename=filename, headers=headers)
|
|
115
|
+
|
|
116
|
+
def guess_file_content_type(filename: str, type: Optional[str], subtype: Optional[str]) -> str:
|
|
117
|
+
subtype = filename.split(".")[-1] if not subtype else subtype
|
|
118
|
+
|
|
119
|
+
if type in [ "image", "audio", "video" ] and subtype:
|
|
120
|
+
return f"{type}/{subtype}"
|
|
121
|
+
|
|
122
|
+
return "application/octet-stream"
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
from typing import Optional, AsyncIterator
|
|
2
2
|
from abc import ABC, abstractmethod
|
|
3
3
|
from tempfile import NamedTemporaryFile
|
|
4
|
-
import
|
|
4
|
+
from aiofiles.threadpool.binary import AsyncBufferedReader
|
|
5
|
+
import aiofiles, io, base64
|
|
5
6
|
|
|
6
7
|
class StreamResource(ABC):
|
|
7
8
|
def __init__(self, content_type: Optional[str], filename: Optional[str]):
|
|
@@ -29,7 +30,12 @@ class Base64StreamResource(StreamResource):
|
|
|
29
30
|
def __init__(self, encoded: str, content_type: Optional[str] = None, filename: Optional[str] = None):
|
|
30
31
|
super().__init__(content_type, filename)
|
|
31
32
|
|
|
32
|
-
self.
|
|
33
|
+
self.encoded: str = encoded
|
|
34
|
+
self.stream: Optional[io.BytesIO] = None
|
|
35
|
+
|
|
36
|
+
async def __aenter__(self):
|
|
37
|
+
self.stream = io.BytesIO(base64.b64decode(self.encoded))
|
|
38
|
+
return self
|
|
33
39
|
|
|
34
40
|
async def close(self):
|
|
35
41
|
self.stream.close()
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
from typing import Callable, Dict, List, Optional, Awaitable, Any
|
|
2
|
-
from .streaming import StreamResource,
|
|
3
|
-
import
|
|
2
|
+
from .streaming import StreamResource, Base64StreamResource
|
|
3
|
+
from .streaming import encode_stream_to_base64, save_stream_to_temporary_file
|
|
4
|
+
from .http_request import create_upload_file
|
|
5
|
+
from .http_client import HttpClient
|
|
6
|
+
from starlette.datastructures import UploadFile
|
|
7
|
+
import re, json, base64, os
|
|
4
8
|
|
|
5
9
|
class TemplateRenderer:
|
|
6
10
|
def __init__(self, source_resolver: Callable[[str], Awaitable[Any]]):
|
|
@@ -18,22 +22,22 @@ class TemplateRenderer:
|
|
|
18
22
|
"keypath": re.compile(r"[-_\w]+|\[\d+\]"),
|
|
19
23
|
}
|
|
20
24
|
|
|
21
|
-
async def render(self, data: Any) -> Any:
|
|
22
|
-
return await self._render_element(data)
|
|
25
|
+
async def render(self, data: Any, ignore_files: bool = True) -> Any:
|
|
26
|
+
return await self._render_element(data, ignore_files)
|
|
23
27
|
|
|
24
|
-
async def _render_element(self, element: Any) -> Any:
|
|
28
|
+
async def _render_element(self, element: Any, ignore_files: bool) -> Any:
|
|
25
29
|
if isinstance(element, str):
|
|
26
|
-
return await self._render_text(element)
|
|
30
|
+
return await self._render_text(element, ignore_files)
|
|
27
31
|
|
|
28
32
|
if isinstance(element, dict):
|
|
29
|
-
return { key: await self._render_element(value) for key, value in element.items() }
|
|
33
|
+
return { key: await self._render_element(value, ignore_files) for key, value in element.items() }
|
|
30
34
|
|
|
31
35
|
if isinstance(element, list):
|
|
32
|
-
return [ await self._render_element(item) for item in element ]
|
|
36
|
+
return [ await self._render_element(item, ignore_files) for item in element ]
|
|
33
37
|
|
|
34
38
|
return element
|
|
35
39
|
|
|
36
|
-
async def _render_text(self, text: str) -> Any:
|
|
40
|
+
async def _render_text(self, text: str, ignore_files: bool) -> Any:
|
|
37
41
|
while True:
|
|
38
42
|
match = self.patterns["variable"].search(text)
|
|
39
43
|
|
|
@@ -49,7 +53,7 @@ class TemplateRenderer:
|
|
|
49
53
|
value = default if value is None else value
|
|
50
54
|
|
|
51
55
|
if type and value is not None:
|
|
52
|
-
value = await self.
|
|
56
|
+
value = await self._convert_value_to_type(value, type, subtype, format, ignore_files)
|
|
53
57
|
|
|
54
58
|
if variable == text:
|
|
55
59
|
return value
|
|
@@ -79,7 +83,7 @@ class TemplateRenderer:
|
|
|
79
83
|
|
|
80
84
|
return current
|
|
81
85
|
|
|
82
|
-
async def
|
|
86
|
+
async def _convert_value_to_type(self, value: Any, type: str, subtype: str, format: Optional[str], ignore_files: bool) -> Any:
|
|
83
87
|
if type == "number":
|
|
84
88
|
return float(value)
|
|
85
89
|
|
|
@@ -97,4 +101,23 @@ class TemplateRenderer:
|
|
|
97
101
|
return await encode_stream_to_base64(value)
|
|
98
102
|
return base64.b64encode(value)
|
|
99
103
|
|
|
104
|
+
if type in [ "image", "audio", "video", "file" ]:
|
|
105
|
+
if not ignore_files and not isinstance(value, UploadFile):
|
|
106
|
+
if format != "path":
|
|
107
|
+
value = await self._save_value_to_temporary_file(value, subtype, format)
|
|
108
|
+
return create_upload_file(value, type, subtype)
|
|
109
|
+
return value
|
|
110
|
+
|
|
100
111
|
return value
|
|
112
|
+
|
|
113
|
+
async def _save_value_to_temporary_file(self, value: Any, subtype: Optional[str], format: Optional[str]) -> Optional[str]:
|
|
114
|
+
if format == "base64" and isinstance(value, str):
|
|
115
|
+
return await save_stream_to_temporary_file(Base64StreamResource(value), subtype)
|
|
116
|
+
|
|
117
|
+
if format == "url" and isinstance(value, str):
|
|
118
|
+
return await save_stream_to_temporary_file(await HttpClient().request(value), subtype)
|
|
119
|
+
|
|
120
|
+
if isinstance(value, StreamResource):
|
|
121
|
+
return await save_stream_to_temporary_file(value, subtype)
|
|
122
|
+
|
|
123
|
+
return None
|
|
@@ -16,8 +16,8 @@ class WorkflowContext:
|
|
|
16
16
|
def register_source(self, key: str, source: Any) -> None:
|
|
17
17
|
self.sources[key] = source
|
|
18
18
|
|
|
19
|
-
async def render_template(self, data: Dict[str, Any]) -> Any:
|
|
20
|
-
return await self.renderer.render(data)
|
|
19
|
+
async def render_template(self, data: Dict[str, Any], ignore_files: bool = True) -> Any:
|
|
20
|
+
return await self.renderer.render(data, ignore_files)
|
|
21
21
|
|
|
22
22
|
async def _resolve_source(self, key: str) -> Any:
|
|
23
23
|
if key in self.sources:
|
|
@@ -25,7 +25,7 @@ class Job:
|
|
|
25
25
|
output = await component.run(await context.render_template(self.config.action), call_id, input)
|
|
26
26
|
context.register_source("output", output)
|
|
27
27
|
|
|
28
|
-
output = (await context.render_template(self.config.output)) if self.config.output else output
|
|
28
|
+
output = (await context.render_template(self.config.output, ignore_files=True)) if self.config.output else output
|
|
29
29
|
outputs.append(output)
|
|
30
30
|
|
|
31
31
|
repeat_count = (await context.render_template(self.config.repeat_count)) if self.config.repeat_count else None
|
|
@@ -5,7 +5,7 @@ from pydantic import model_validator, field_validator
|
|
|
5
5
|
from .component import ComponentConfig
|
|
6
6
|
|
|
7
7
|
class JobConfig(BaseModel):
|
|
8
|
-
component: Optional[Union[str,
|
|
8
|
+
component: Optional[Union[str, ComponentConfig]] = Field(default="__default__", description="The component to execute. Can be a string identifier or a ComponentConfig object.")
|
|
9
9
|
action: Optional[str] = Field(default="__default__", description="The action to invoke within the component. Defaults to '__default__'.")
|
|
10
10
|
input: Optional[Any] = Field(default=None, description="The input data passed to the component. Can be of any type.")
|
|
11
11
|
output: Optional[Any] = Field(default=None, description="The expected output data from the component. Can be of any type.")
|
|
@@ -47,10 +47,11 @@ class WorkflowVariableConfig(BaseModel):
|
|
|
47
47
|
type: WorkflowVariableType = Field(..., description="Type of the variable")
|
|
48
48
|
subtype: Optional[str] = Field(default=None, description="Subtype of the variable")
|
|
49
49
|
format: Optional[WorkflowVariableFormat] = Field(default=None, description="Format of the variable")
|
|
50
|
-
options: Optional[List[str]] = Field(default=None, description="List of valid options for select type")
|
|
50
|
+
options: Optional[List[str]] = Field(default=None, description="List of valid options for file or select type")
|
|
51
51
|
required: bool = Field(default=False, description="Whether this variable is required")
|
|
52
52
|
default: Optional[Any] = Field(default=None, description="Default value if not provided")
|
|
53
53
|
description: Optional[str] = Field(default=None, description="Description of the variable")
|
|
54
|
+
internal: bool = Field(default=False, description="Whether this variable is for internal use")
|
|
54
55
|
|
|
55
56
|
class WorkflowVariableGroupConfig(BaseModel):
|
|
56
57
|
name: Optional[str] = Field(default=None, description="The name of the group of variables")
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/controller/engine/http_server.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/core/controller/runner/http_client.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/action/impl/http_client.py
RENAMED
|
File without changes
|
{model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/action/impl/http_server.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/component/impl/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/component/impl/http_client.py
RENAMED
|
File without changes
|
{model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/component/impl/http_server.py
RENAMED
|
File without changes
|
{model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/component/impl/mcp_client.py
RENAMED
|
File without changes
|
{model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/component/impl/mcp_server.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/controller/impl/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/controller/impl/http_server.py
RENAMED
|
File without changes
|
{model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/controller/impl/mcp_server.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/gateway/impl/http_tunnel.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{model_compose-0.1.4 → model_compose-0.1.6}/src/mindor/dsl/schema/listener/impl/http_callback.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|