service-forge 0.1.28__py3-none-any.whl → 0.1.39__py3-none-any.whl
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.
Potentially problematic release.
This version of service-forge might be problematic. Click here for more details.
- service_forge/__init__.py +0 -0
- service_forge/api/deprecated_websocket_api.py +91 -33
- service_forge/api/deprecated_websocket_manager.py +70 -53
- service_forge/api/http_api.py +127 -53
- service_forge/api/kafka_api.py +113 -25
- service_forge/api/routers/meta_api/meta_api_router.py +57 -0
- service_forge/api/routers/service/service_router.py +42 -6
- service_forge/api/routers/trace/trace_router.py +326 -0
- service_forge/api/routers/websocket/websocket_router.py +56 -1
- service_forge/api/service_studio.py +9 -0
- service_forge/execution_context.py +106 -0
- service_forge/frontend/static/assets/CreateNewNodeDialog-DkrEMxSH.js +1 -0
- service_forge/frontend/static/assets/CreateNewNodeDialog-DwFcBiGp.css +1 -0
- service_forge/frontend/static/assets/EditorSidePanel-BNVms9Fq.css +1 -0
- service_forge/frontend/static/assets/EditorSidePanel-DZbB3ILL.js +1 -0
- service_forge/frontend/static/assets/FeedbackPanel-CC8HX7Yo.js +1 -0
- service_forge/frontend/static/assets/FeedbackPanel-ClgniIVk.css +1 -0
- service_forge/frontend/static/assets/FormattedCodeViewer.vue_vue_type_script_setup_true_lang-BNuI1NCs.js +1 -0
- service_forge/frontend/static/assets/NodeDetailWrapper-BqFFM7-r.js +1 -0
- service_forge/frontend/static/assets/NodeDetailWrapper-pZBxv3J0.css +1 -0
- service_forge/frontend/static/assets/TestRunningDialog-D0GrCoYs.js +1 -0
- service_forge/frontend/static/assets/TestRunningDialog-dhXOsPgH.css +1 -0
- service_forge/frontend/static/assets/TracePanelWrapper-B9zvDSc_.js +1 -0
- service_forge/frontend/static/assets/TracePanelWrapper-BiednCrq.css +1 -0
- service_forge/frontend/static/assets/WorkflowEditor-CcaGGbko.js +3 -0
- service_forge/frontend/static/assets/WorkflowEditor-CmasOOYK.css +1 -0
- service_forge/frontend/static/assets/WorkflowList-Copuwi-a.css +1 -0
- service_forge/frontend/static/assets/WorkflowList-LrRJ7B7h.js +1 -0
- service_forge/frontend/static/assets/WorkflowStudio-CthjgII2.css +1 -0
- service_forge/frontend/static/assets/WorkflowStudio-FCyhGD4y.js +2 -0
- service_forge/frontend/static/assets/api-BDer3rj7.css +1 -0
- service_forge/frontend/static/assets/api-DyiqpKJK.js +1 -0
- service_forge/frontend/static/assets/code-editor-DBSql_sc.js +12 -0
- service_forge/frontend/static/assets/el-collapse-item-D4LG0FJ0.css +1 -0
- service_forge/frontend/static/assets/el-empty-D4ZqTl4F.css +1 -0
- service_forge/frontend/static/assets/el-form-item-BWkJzdQ_.css +1 -0
- service_forge/frontend/static/assets/el-input-D6B3r8CH.css +1 -0
- service_forge/frontend/static/assets/el-select-B0XIb2QK.css +1 -0
- service_forge/frontend/static/assets/el-tag-DljBBxJR.css +1 -0
- service_forge/frontend/static/assets/element-ui-D3x2y3TA.js +12 -0
- service_forge/frontend/static/assets/elkjs-Dm5QV7uy.js +24 -0
- service_forge/frontend/static/assets/highlightjs-D4ATuRwX.js +3 -0
- service_forge/frontend/static/assets/index-BMvodlwc.js +2 -0
- service_forge/frontend/static/assets/index-CjSe8i2q.css +1 -0
- service_forge/frontend/static/assets/js-yaml-yTPt38rv.js +32 -0
- service_forge/frontend/static/assets/time-DKCKV6Ug.js +1 -0
- service_forge/frontend/static/assets/ui-components-DQ7-U3pr.js +1 -0
- service_forge/frontend/static/assets/vue-core-DL-LgTX0.js +1 -0
- service_forge/frontend/static/assets/vue-flow-Dn7R8GPr.js +39 -0
- service_forge/frontend/static/index.html +16 -0
- service_forge/frontend/static/vite.svg +1 -0
- service_forge/model/meta_api/__init__.py +0 -0
- service_forge/model/meta_api/schema.py +29 -0
- service_forge/model/trace.py +82 -0
- service_forge/service.py +32 -11
- service_forge/service_config.py +14 -0
- service_forge/sft/config/injector.py +32 -2
- service_forge/sft/config/injector_default_files.py +12 -0
- service_forge/sft/config/sf_metadata.py +5 -0
- service_forge/sft/config/sft_config.py +18 -0
- service_forge/telemetry.py +66 -0
- service_forge/workflow/node.py +266 -27
- service_forge/workflow/triggers/fast_api_trigger.py +61 -28
- service_forge/workflow/triggers/websocket_api_trigger.py +31 -10
- service_forge/workflow/workflow.py +87 -10
- service_forge/workflow/workflow_callback.py +24 -2
- service_forge/workflow/workflow_factory.py +13 -0
- {service_forge-0.1.28.dist-info → service_forge-0.1.39.dist-info}/METADATA +4 -1
- service_forge-0.1.39.dist-info/RECORD +134 -0
- service_forge-0.1.28.dist-info/RECORD +0 -85
- {service_forge-0.1.28.dist-info → service_forge-0.1.39.dist-info}/WHEEL +0 -0
- {service_forge-0.1.28.dist-info → service_forge-0.1.39.dist-info}/entry_points.txt +0 -0
|
@@ -6,6 +6,7 @@ from loguru import logger
|
|
|
6
6
|
from service_forge.workflow.trigger import Trigger
|
|
7
7
|
from typing import AsyncIterator, Any
|
|
8
8
|
from fastapi import FastAPI, WebSocket, WebSocketDisconnect
|
|
9
|
+
from starlette.websockets import WebSocketState
|
|
9
10
|
from service_forge.workflow.port import Port
|
|
10
11
|
from google.protobuf.message import Message
|
|
11
12
|
from google.protobuf.json_format import MessageToJson
|
|
@@ -20,6 +21,7 @@ class WebSocketAPITrigger(Trigger):
|
|
|
20
21
|
|
|
21
22
|
DEFAULT_OUTPUT_PORTS = [
|
|
22
23
|
Port("trigger", bool),
|
|
24
|
+
Port("client_id", uuid.UUID),
|
|
23
25
|
Port("user_id", int),
|
|
24
26
|
Port("token", str),
|
|
25
27
|
Port("data", Any),
|
|
@@ -46,12 +48,20 @@ class WebSocketAPITrigger(Trigger):
|
|
|
46
48
|
task_id: uuid.UUID,
|
|
47
49
|
data: Any,
|
|
48
50
|
):
|
|
51
|
+
# Check if WebSocket is closed before sending
|
|
52
|
+
if websocket.client_state != WebSocketState.CONNECTED:
|
|
53
|
+
logger.warning(f"WebSocket is closed, cannot send message for task {task_id}")
|
|
54
|
+
return
|
|
55
|
+
|
|
49
56
|
message = {
|
|
50
57
|
"type": type,
|
|
51
58
|
"task_id": str(task_id),
|
|
52
59
|
"data": data
|
|
53
60
|
}
|
|
54
|
-
|
|
61
|
+
try:
|
|
62
|
+
await websocket.send_text(json.dumps(message))
|
|
63
|
+
except Exception as e:
|
|
64
|
+
logger.error(f"Error sending message to WebSocket for task {task_id}: {e}")
|
|
55
65
|
|
|
56
66
|
async def handle_stream_output(
|
|
57
67
|
self,
|
|
@@ -104,10 +114,11 @@ class WebSocketAPITrigger(Trigger):
|
|
|
104
114
|
self,
|
|
105
115
|
websocket: WebSocket,
|
|
106
116
|
data_type: type,
|
|
117
|
+
client_id: str,
|
|
107
118
|
message_data: dict,
|
|
108
119
|
):
|
|
109
120
|
task_id = uuid.uuid4()
|
|
110
|
-
self.result_queues[task_id] = asyncio.Queue()
|
|
121
|
+
# self.result_queues[task_id] = asyncio.Queue()
|
|
111
122
|
self.stream_queues[task_id] = asyncio.Queue()
|
|
112
123
|
|
|
113
124
|
logger.info(f'user_id {getattr(websocket.state, "user_id", None)} token {getattr(websocket.state, "auth_token", None)}')
|
|
@@ -131,25 +142,31 @@ class WebSocketAPITrigger(Trigger):
|
|
|
131
142
|
"user_id": getattr(websocket.state, "user_id", None),
|
|
132
143
|
"token": getattr(websocket.state, "auth_token", None),
|
|
133
144
|
"data": converted_data,
|
|
145
|
+
"client_id": client_id,
|
|
134
146
|
})
|
|
135
147
|
|
|
136
148
|
# The stream handler will send all messages including stream_end when workflow completes
|
|
137
149
|
|
|
138
150
|
def _setup_websocket(self, app: FastAPI, path: str, data_type: type) -> None:
|
|
139
151
|
async def websocket_handler(websocket: WebSocket):
|
|
152
|
+
websocket.state.user_id = websocket.headers.get("X-User-ID") or "0"
|
|
153
|
+
websocket.state.auth_token = websocket.headers.get("X-User-Token") or ""
|
|
154
|
+
logger.info(f'user_id {websocket.state.user_id} token {websocket.state.auth_token}')
|
|
140
155
|
# Authenticate WebSocket connection before accepting
|
|
141
156
|
# Get trusted_domain from app.state if available
|
|
142
|
-
trusted_domain = getattr(app.state, "trusted_domain", "ring.shiweinan.com")
|
|
143
|
-
enable_auth = getattr(app.state, "enable_auth_middleware", True)
|
|
157
|
+
# trusted_domain = getattr(app.state, "trusted_domain", "ring.shiweinan.com")
|
|
158
|
+
# enable_auth = getattr(app.state, "enable_auth_middleware", True)
|
|
144
159
|
|
|
145
|
-
if enable_auth:
|
|
146
|
-
|
|
147
|
-
else:
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
160
|
+
# if enable_auth:
|
|
161
|
+
# await authenticate_websocket(websocket, trusted_domain)
|
|
162
|
+
# else:
|
|
163
|
+
# # If auth is disabled, set default values
|
|
164
|
+
# websocket.state.user_id = websocket.headers.get("X-User-ID", "0")
|
|
165
|
+
# websocket.state.auth_token = websocket.headers.get("X-User-Token")
|
|
151
166
|
|
|
152
167
|
await websocket.accept()
|
|
168
|
+
|
|
169
|
+
client_id = uuid.uuid4()
|
|
153
170
|
|
|
154
171
|
try:
|
|
155
172
|
while True:
|
|
@@ -160,6 +177,7 @@ class WebSocketAPITrigger(Trigger):
|
|
|
160
177
|
await self.handle_websocket_message(
|
|
161
178
|
websocket,
|
|
162
179
|
data_type,
|
|
180
|
+
client_id,
|
|
163
181
|
data
|
|
164
182
|
)
|
|
165
183
|
except json.JSONDecodeError:
|
|
@@ -174,6 +192,8 @@ class WebSocketAPITrigger(Trigger):
|
|
|
174
192
|
except Exception as e:
|
|
175
193
|
logger.error(f"WebSocket connection error: {e}")
|
|
176
194
|
|
|
195
|
+
print("DISCONNECTED")
|
|
196
|
+
|
|
177
197
|
app.websocket(path)(websocket_handler)
|
|
178
198
|
|
|
179
199
|
async def _run(self, app: FastAPI, path: str, data_type: type) -> AsyncIterator[bool]:
|
|
@@ -187,6 +207,7 @@ class WebSocketAPITrigger(Trigger):
|
|
|
187
207
|
self.prepare_output_edges(self.get_output_port_by_name('user_id'), trigger['user_id'])
|
|
188
208
|
self.prepare_output_edges(self.get_output_port_by_name('token'), trigger['token'])
|
|
189
209
|
self.prepare_output_edges(self.get_output_port_by_name('data'), trigger['data'])
|
|
210
|
+
self.prepare_output_edges(self.get_output_port_by_name('client_id'), trigger['client_id'])
|
|
190
211
|
yield self.trigger(trigger['id'])
|
|
191
212
|
except Exception as e:
|
|
192
213
|
logger.error(f"Error in WebSocketAPITrigger._run: {e}")
|
|
@@ -2,13 +2,25 @@ from __future__ import annotations
|
|
|
2
2
|
import traceback
|
|
3
3
|
import asyncio
|
|
4
4
|
import uuid
|
|
5
|
-
from typing import AsyncIterator, Awaitable, Callable, Any
|
|
6
|
-
from loguru import logger
|
|
7
5
|
from copy import deepcopy
|
|
6
|
+
from typing import Any, AsyncIterator, Awaitable, Callable
|
|
7
|
+
|
|
8
|
+
from loguru import logger
|
|
9
|
+
from opentelemetry import context as otel_context_api
|
|
10
|
+
from opentelemetry import trace
|
|
11
|
+
from opentelemetry.trace import SpanKind
|
|
12
|
+
|
|
13
|
+
from ..db.database import DatabaseManager
|
|
14
|
+
from ..execution_context import (
|
|
15
|
+
ExecutionContext,
|
|
16
|
+
get_current_context,
|
|
17
|
+
reset_current_context,
|
|
18
|
+
set_current_context,
|
|
19
|
+
)
|
|
20
|
+
from .edge import Edge
|
|
8
21
|
from .node import Node
|
|
9
22
|
from .port import Port
|
|
10
23
|
from .trigger import Trigger
|
|
11
|
-
from .edge import Edge
|
|
12
24
|
from ..db.database import DatabaseManager
|
|
13
25
|
from ..utils.workflow_clone import workflow_clone
|
|
14
26
|
from .workflow_callback import WorkflowCallback, BuiltinWorkflowCallback, CallbackEvent
|
|
@@ -28,6 +40,7 @@ class Workflow:
|
|
|
28
40
|
database_manager: DatabaseManager = None,
|
|
29
41
|
max_concurrent_runs: int = 10,
|
|
30
42
|
callbacks: list[WorkflowCallback] = [],
|
|
43
|
+
debug_version: bool = False, # 是否为debug过程中的临时版本
|
|
31
44
|
|
|
32
45
|
# for run
|
|
33
46
|
task_id: uuid.UUID = None,
|
|
@@ -50,10 +63,12 @@ class Workflow:
|
|
|
50
63
|
self.max_concurrent_runs = max_concurrent_runs
|
|
51
64
|
self.run_semaphore = asyncio.Semaphore(max_concurrent_runs)
|
|
52
65
|
self.callbacks = callbacks
|
|
66
|
+
self.debug_version = debug_version
|
|
53
67
|
self.task_id = task_id
|
|
54
68
|
self.real_trigger_node = real_trigger_node
|
|
55
69
|
self.global_context = global_context
|
|
56
70
|
self._validate()
|
|
71
|
+
self._tracer = trace.get_tracer("service_forge.workflow")
|
|
57
72
|
|
|
58
73
|
@property
|
|
59
74
|
def name(self) -> str:
|
|
@@ -97,8 +112,7 @@ class Workflow:
|
|
|
97
112
|
for node in nodes:
|
|
98
113
|
self.nodes.remove(node)
|
|
99
114
|
|
|
100
|
-
def load_config(self) -> None:
|
|
101
|
-
...
|
|
115
|
+
def load_config(self) -> None: ...
|
|
102
116
|
|
|
103
117
|
def _validate(self) -> None:
|
|
104
118
|
# DAG
|
|
@@ -201,12 +215,61 @@ class Workflow:
|
|
|
201
215
|
else:
|
|
202
216
|
await self.call_callbacks(CallbackEvent.ON_WORKFLOW_END, workflow=self, output=None)
|
|
203
217
|
|
|
218
|
+
|
|
204
219
|
async def _run(self, task_id: uuid.UUID, trigger_node: Trigger) -> None:
|
|
205
220
|
async with self.run_semaphore:
|
|
221
|
+
base_context = get_current_context()
|
|
222
|
+
|
|
223
|
+
# 尝试从 trigger_node 上取父 trace context(如果存在)
|
|
224
|
+
trigger_parent_context = None
|
|
225
|
+
if hasattr(trigger_node, "task_contexts"):
|
|
226
|
+
trigger_parent_context = trigger_node.task_contexts.pop(task_id, None)
|
|
227
|
+
|
|
228
|
+
parent_context = (
|
|
229
|
+
trigger_parent_context
|
|
230
|
+
or (
|
|
231
|
+
base_context.trace_context
|
|
232
|
+
if base_context and base_context.trace_context
|
|
233
|
+
else otel_context_api.get_current()
|
|
234
|
+
)
|
|
235
|
+
)
|
|
236
|
+
|
|
237
|
+
span_name = f"Workflow {self.name}"
|
|
238
|
+
token = None
|
|
239
|
+
|
|
206
240
|
try:
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
241
|
+
with self._tracer.start_as_current_span(
|
|
242
|
+
span_name,
|
|
243
|
+
context=parent_context,
|
|
244
|
+
kind=SpanKind.INTERNAL,
|
|
245
|
+
) as span:
|
|
246
|
+
span.set_attribute("workflow.name", self.name)
|
|
247
|
+
span.set_attribute("workflow.task_id", str(task_id))
|
|
248
|
+
span.set_attribute("service.name", "service_forge")
|
|
249
|
+
|
|
250
|
+
execution_context = ExecutionContext(
|
|
251
|
+
trace_context=otel_context_api.get_current(),
|
|
252
|
+
span=span,
|
|
253
|
+
metadata={
|
|
254
|
+
**(base_context.metadata if base_context else {}),
|
|
255
|
+
"workflow_name": self.name,
|
|
256
|
+
"task_id": str(task_id),
|
|
257
|
+
},
|
|
258
|
+
)
|
|
259
|
+
token = set_current_context(execution_context)
|
|
260
|
+
|
|
261
|
+
new_workflow = self._clone(task_id, trigger_node)
|
|
262
|
+
|
|
263
|
+
# run_after_trigger 当前实现没有 return,result 会是 None
|
|
264
|
+
result = await new_workflow.run_after_trigger()
|
|
265
|
+
|
|
266
|
+
# 将结果回传给等待方(如果有队列)
|
|
267
|
+
if hasattr(trigger_node, "result_queues") and task_id in trigger_node.result_queues:
|
|
268
|
+
trigger_node.result_queues[task_id].put_nowait(result)
|
|
269
|
+
|
|
270
|
+
# TODO: clear new_workflow
|
|
271
|
+
for node in new_workflow.nodes:
|
|
272
|
+
await node.clear()
|
|
210
273
|
|
|
211
274
|
except Exception as e:
|
|
212
275
|
await self.call_callbacks(CallbackEvent.ON_WORKFLOW_ERROR, workflow=self, node=None, error=e)
|
|
@@ -215,6 +278,20 @@ class Workflow:
|
|
|
215
278
|
# await self.call_callbacks(CallbackEvent.ON_WORKFLOW_END, workflow=self, node=None, error=e)
|
|
216
279
|
return
|
|
217
280
|
|
|
281
|
+
# 更新任务状态为失败 + WebSocket 通知
|
|
282
|
+
websocket_manager.task_manager.fail_task(task_id, error_msg)
|
|
283
|
+
await websocket_manager.send_execution_error(task_id, "workflow", error_msg)
|
|
284
|
+
|
|
285
|
+
# 异常也回传给等待方,避免对方一直 await
|
|
286
|
+
if hasattr(trigger_node, "result_queues") and task_id in trigger_node.result_queues:
|
|
287
|
+
trigger_node.result_queues[task_id].put_nowait(e)
|
|
288
|
+
|
|
289
|
+
# 将异常继续抛出,便于上层感知失败
|
|
290
|
+
raise
|
|
291
|
+
finally:
|
|
292
|
+
if token is not None:
|
|
293
|
+
reset_current_context(token)
|
|
294
|
+
|
|
218
295
|
async def run(self):
|
|
219
296
|
tasks = []
|
|
220
297
|
trigger = self.get_trigger_node()
|
|
@@ -229,9 +306,9 @@ class Workflow:
|
|
|
229
306
|
trigger = self.get_trigger_node()
|
|
230
307
|
await trigger._stop()
|
|
231
308
|
|
|
232
|
-
def trigger(self, trigger_name: str, **kwargs) -> uuid.UUID:
|
|
309
|
+
def trigger(self, trigger_name: str, assigned_task_id: uuid.UUID | None, **kwargs) -> uuid.UUID:
|
|
233
310
|
trigger = self.get_trigger_node()
|
|
234
|
-
task_id = uuid.uuid4()
|
|
311
|
+
task_id = assigned_task_id or uuid.uuid4()
|
|
235
312
|
for key, value in kwargs.items():
|
|
236
313
|
trigger.prepare_output_edges(key, value)
|
|
237
314
|
task = asyncio.create_task(self._run(task_id, trigger))
|
|
@@ -114,11 +114,33 @@ class BuiltinWorkflowCallback(WorkflowCallback):
|
|
|
114
114
|
|
|
115
115
|
@override
|
|
116
116
|
async def on_node_start(self, node: Node) -> None:
|
|
117
|
-
|
|
117
|
+
try:
|
|
118
|
+
manager = self._get_websocket_manager()
|
|
119
|
+
message = {
|
|
120
|
+
"type": "node_start",
|
|
121
|
+
"task_id": str(node.workflow.task_id),
|
|
122
|
+
"node": node.name,
|
|
123
|
+
"is_end": False,
|
|
124
|
+
"is_error": False
|
|
125
|
+
}
|
|
126
|
+
await manager.send_to_task(node.workflow.task_id, message)
|
|
127
|
+
except Exception as e:
|
|
128
|
+
logger.error(f"发送 node_start 消息到 websocket 失败: {e}")
|
|
118
129
|
|
|
119
130
|
@override
|
|
120
131
|
async def on_node_end(self, node: Node) -> None:
|
|
121
|
-
|
|
132
|
+
try:
|
|
133
|
+
manager = self._get_websocket_manager()
|
|
134
|
+
message = {
|
|
135
|
+
"type": "node_end",
|
|
136
|
+
"task_id": str(node.workflow.task_id),
|
|
137
|
+
"node": node.name,
|
|
138
|
+
"is_end": False,
|
|
139
|
+
"is_error": False
|
|
140
|
+
}
|
|
141
|
+
await manager.send_to_task(node.workflow.task_id, message)
|
|
142
|
+
except Exception as e:
|
|
143
|
+
logger.error(f"发送 node_end 消息到 websocket 失败: {e}")
|
|
122
144
|
|
|
123
145
|
@override
|
|
124
146
|
async def on_node_stream_output(self, node: Node, output: Any) -> None:
|
|
@@ -3,6 +3,8 @@ from omegaconf import OmegaConf
|
|
|
3
3
|
from typing import Callable, Awaitable, AsyncIterator, Any
|
|
4
4
|
from copy import deepcopy
|
|
5
5
|
|
|
6
|
+
from pydantic import ValidationError
|
|
7
|
+
|
|
6
8
|
from service_forge.workflow.workflow_callback import BuiltinWorkflowCallback
|
|
7
9
|
from .workflow import Workflow
|
|
8
10
|
from .workflow_group import WorkflowGroup, WORKFLOW_DEFAULT_VERSION
|
|
@@ -53,6 +55,7 @@ def create_workflow(
|
|
|
53
55
|
_handle_stream_output: Callable[[str, AsyncIterator[str]], Awaitable[None]] | None = None,
|
|
54
56
|
_handle_query_user: Callable[[str, str], Awaitable[str]] | None = None,
|
|
55
57
|
database_manager: DatabaseManager = None,
|
|
58
|
+
debug_version: bool = False,
|
|
56
59
|
) -> Workflow:
|
|
57
60
|
if config is None:
|
|
58
61
|
if config_path is not None:
|
|
@@ -71,6 +74,7 @@ def create_workflow(
|
|
|
71
74
|
database_manager = database_manager,
|
|
72
75
|
# TODO: max_concurrent_runs
|
|
73
76
|
callbacks = [BuiltinWorkflowCallback()],
|
|
77
|
+
debug_version = debug_version,
|
|
74
78
|
global_context = Context(variables={}),
|
|
75
79
|
)
|
|
76
80
|
|
|
@@ -208,6 +212,7 @@ def create_workflow_group(
|
|
|
208
212
|
_handle_stream_output: Callable[[str, AsyncIterator[str]], Awaitable[None]] = None,
|
|
209
213
|
_handle_query_user: Callable[[str, str], Awaitable[str]] = None,
|
|
210
214
|
database_manager: DatabaseManager = None,
|
|
215
|
+
debug_version: bool = False,
|
|
211
216
|
) -> WorkflowGroup:
|
|
212
217
|
|
|
213
218
|
if config is None:
|
|
@@ -219,6 +224,12 @@ def create_workflow_group(
|
|
|
219
224
|
else:
|
|
220
225
|
raise ValueError("Either config_path or config must be provided")
|
|
221
226
|
|
|
227
|
+
if isinstance(config, dict):
|
|
228
|
+
try:
|
|
229
|
+
config = WorkflowConfig.model_validate(config)
|
|
230
|
+
except ValidationError:
|
|
231
|
+
config = WorkflowGroupConfig.model_validate(config)
|
|
232
|
+
|
|
222
233
|
if type(config) == WorkflowConfig:
|
|
223
234
|
workflow = create_workflow(
|
|
224
235
|
config_path=config_path if config_path else None,
|
|
@@ -227,6 +238,7 @@ def create_workflow_group(
|
|
|
227
238
|
_handle_stream_output=_handle_stream_output,
|
|
228
239
|
_handle_query_user=_handle_query_user,
|
|
229
240
|
database_manager=database_manager,
|
|
241
|
+
debug_version=debug_version,
|
|
230
242
|
)
|
|
231
243
|
return WorkflowGroup(workflows=[workflow], main_workflow_name=workflow.name, main_workflow_version=workflow.version)
|
|
232
244
|
elif type(config) == WorkflowGroupConfig:
|
|
@@ -243,5 +255,6 @@ def create_workflow_group(
|
|
|
243
255
|
_handle_stream_output=_handle_stream_output,
|
|
244
256
|
_handle_query_user=_handle_query_user,
|
|
245
257
|
database_manager=database_manager,
|
|
258
|
+
debug_version=debug_version,
|
|
246
259
|
))
|
|
247
260
|
return workflows
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: service-forge
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.39
|
|
4
4
|
Summary: Add your description here
|
|
5
5
|
Author-email: euxcet <zcc.qwer@gmail.com>
|
|
6
6
|
Requires-Python: >=3.11
|
|
@@ -16,6 +16,9 @@ Requires-Dist: kubernetes>=28.0.0
|
|
|
16
16
|
Requires-Dist: loguru>=0.7.3
|
|
17
17
|
Requires-Dist: omegaconf>=2.3.0
|
|
18
18
|
Requires-Dist: openai>=2.3.0
|
|
19
|
+
Requires-Dist: opentelemetry-api>=1.38.0
|
|
20
|
+
Requires-Dist: opentelemetry-exporter-otlp>=1.38.0
|
|
21
|
+
Requires-Dist: opentelemetry-sdk>=1.38.0
|
|
19
22
|
Requires-Dist: protobuf>=6.33.1
|
|
20
23
|
Requires-Dist: psycopg2-binary>=2.9.11
|
|
21
24
|
Requires-Dist: pydantic>=2.12.0
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
service_forge/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
+
service_forge/current_service.py,sha256=0YKm7nQiXzUUAc1ToCcbG1QPJfOSNKcOHUpyJ4E3xrY,342
|
|
3
|
+
service_forge/execution_context.py,sha256=qlZBIF0KIVtTAYTF7jc5GcvBbcNNYdbJdFFrUKHxKHM,3267
|
|
4
|
+
service_forge/service.py,sha256=glaOh4bsRArhdQ4OjclMa2xe-o0TSFZUQVVolMz-Mxc,14154
|
|
5
|
+
service_forge/service_config.py,sha256=HYLLOiDUQsv_iiFLaB7Zn6kEEG7hjT5TepE_BbkcgTY,1592
|
|
6
|
+
service_forge/telemetry.py,sha256=ztXU9V_ocC4aYBhcC_lTgjohqEavGUO7PH5SjsRJN4w,2191
|
|
7
|
+
service_forge/api/deprecated_websocket_api.py,sha256=PE40HC0vTdpSQh08ht0DFyfOHUeoSmoeLxwMlgYOObs,5169
|
|
8
|
+
service_forge/api/deprecated_websocket_manager.py,sha256=ZN8qFY2Aeteo43MnGechiiO4ekQ4fabUOcSvxBFd4Pg,17122
|
|
9
|
+
service_forge/api/http_api.py,sha256=jkQnPWnc3hVXSwVrp_DzSzOW-Ol1hGzXdAy2GE3MJnE,10458
|
|
10
|
+
service_forge/api/http_api_doc.py,sha256=ASlxvsIiUzDcMhVoumRjt9CfEMbh0O1U4ZLC9eobLF8,20235
|
|
11
|
+
service_forge/api/kafka_api.py,sha256=zA0A5gx2PQGOOcCijrVTODVqmOqW7-KcMj7Hu3ETPNo,7397
|
|
12
|
+
service_forge/api/service_studio.py,sha256=Nmz7OfGJM5mwMXSCsrytxEJMOr5NYWo4svnlLhWmZK4,315
|
|
13
|
+
service_forge/api/task_manager.py,sha256=9Lk-NV4cBnuv9b8V6GVLWJJ4MCiAwCp5TVAwmYgqXbs,5269
|
|
14
|
+
service_forge/api/routers/feedback/feedback_router.py,sha256=JOJI6kaQYapg4__iA6Eo26_9su48p7R2Kpn422nbsxw,5640
|
|
15
|
+
service_forge/api/routers/meta_api/meta_api_router.py,sha256=Hk9VXxSvEuqvD5l7Vs4VrUadeqPKhcWRZTZHZnYu_B0,1807
|
|
16
|
+
service_forge/api/routers/service/service_router.py,sha256=FgQNqfr02JRmU_atOqw8QPA8nwd8YJHICmYuuzdVhlY,6785
|
|
17
|
+
service_forge/api/routers/trace/trace_router.py,sha256=cqBSQ03wVsHEoS75ApHBxNBtj-EILLOXhNo9S7Neuak,12725
|
|
18
|
+
service_forge/api/routers/websocket/websocket_manager.py,sha256=j1AFqzXQhZZyaLQwhvZefXAS-zCOPzLcRMDEuusv6V0,3605
|
|
19
|
+
service_forge/api/routers/websocket/websocket_router.py,sha256=blGwmh1XYf7eQT5iOR5N8oCGgg8jhqq_gc1cPXvCiRA,6865
|
|
20
|
+
service_forge/db/__init__.py,sha256=EWLhH8bYsMOvRF_YXF6FgL3irKA6GZeLxSGvWDRM6f8,85
|
|
21
|
+
service_forge/db/database.py,sha256=WKtZ0MoOnbMw54ohfs9zKsrOZ5_qenLvXkAV_Gr2WOs,10068
|
|
22
|
+
service_forge/db/migrations/feedback_migration.py,sha256=-zQ71TsOlWmQPQo1NKSIu3C1T47v3cfD6IAQ5HE_ffk,4845
|
|
23
|
+
service_forge/db/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
24
|
+
service_forge/db/models/feedback.py,sha256=gltX3y-nNhXSR9z1cd82Vg-zwjF0JhnGbOvUapkcWKQ,1253
|
|
25
|
+
service_forge/frontend/static/index.html,sha256=mjKIULvvEPD60MXN9Cs9r92DixM4p52zuoQTUMp6KrY,598
|
|
26
|
+
service_forge/frontend/static/vite.svg,sha256=SnSK_UQ5GLsWWRyDTEAdrjPoeGGrXbrQgRw6O0qSFPs,1497
|
|
27
|
+
service_forge/frontend/static/assets/CreateNewNodeDialog-DkrEMxSH.js,sha256=bdl2KCg1MgjiA8qHdA_-8MevDNi_76GvuqHhQvEocK0,2365
|
|
28
|
+
service_forge/frontend/static/assets/CreateNewNodeDialog-DwFcBiGp.css,sha256=pbYf6pH-qDlcgwSK1sn11LuxX3_4NHMVhj6VdayOSEk,28499
|
|
29
|
+
service_forge/frontend/static/assets/EditorSidePanel-BNVms9Fq.css,sha256=omuzRUC73gu9rXPiQjN_NfmbeF_Pe_iNnKsf3T9uW1U,511
|
|
30
|
+
service_forge/frontend/static/assets/EditorSidePanel-DZbB3ILL.js,sha256=GFUyrSEeNH1cyicXIiQISPylODInkKgnfPDGRVjLGzc,1730
|
|
31
|
+
service_forge/frontend/static/assets/FeedbackPanel-CC8HX7Yo.js,sha256=vYtKz3UpMZ9VtfBqb9KudZgRijphSumslf76F6McJxk,2778
|
|
32
|
+
service_forge/frontend/static/assets/FeedbackPanel-ClgniIVk.css,sha256=1aaS_JmLSCdvnhajcSzuXk1r5iLWuRGLzO6mhAUxPAc,2648
|
|
33
|
+
service_forge/frontend/static/assets/FormattedCodeViewer.vue_vue_type_script_setup_true_lang-BNuI1NCs.js,sha256=Tatk6ss70oGZZbVCHlHvhQwj0g0b09ZrfQ_vDAirxpI,2929
|
|
34
|
+
service_forge/frontend/static/assets/NodeDetailWrapper-BqFFM7-r.js,sha256=ZJ4248mB3kQL5cRg5cA0RFt0R3Nm_QkGziqp34mB5GY,11658
|
|
35
|
+
service_forge/frontend/static/assets/NodeDetailWrapper-pZBxv3J0.css,sha256=Lu1E4SaRsVgwgaaZ1kjNLmaNyuiM6jgTtBL9HAPm1PU,1851
|
|
36
|
+
service_forge/frontend/static/assets/TestRunningDialog-D0GrCoYs.js,sha256=4aQ8F7aVEd4BDr591FfqcowO37WW9YFsZ0fz9AtzisA,2801
|
|
37
|
+
service_forge/frontend/static/assets/TestRunningDialog-dhXOsPgH.css,sha256=pftBSMu7ocjga5fVBFfFxuygAWpjwKQOcSLtec1DroY,49
|
|
38
|
+
service_forge/frontend/static/assets/TracePanelWrapper-B9zvDSc_.js,sha256=G30V0vyHwGDTROAV7wOrTRyw5QkLHPbg1Va9dJXp7SU,7171
|
|
39
|
+
service_forge/frontend/static/assets/TracePanelWrapper-BiednCrq.css,sha256=MLXfgmw7N9Qu-oR12ptenepnnJDCwJ9BCjFVv9pAPiI,12040
|
|
40
|
+
service_forge/frontend/static/assets/WorkflowEditor-CcaGGbko.js,sha256=J9zNib954JZeiL8DTbA5_mGea9gtZEuVFh1Ca8jGgW8,38769
|
|
41
|
+
service_forge/frontend/static/assets/WorkflowEditor-CmasOOYK.css,sha256=CyYx9NchrJDMGe02Jj1oFhTAj65AcztVqYRDT5dwWqc,10252
|
|
42
|
+
service_forge/frontend/static/assets/WorkflowList-Copuwi-a.css,sha256=4UXYPXo-IcxXVqZsjEE_LCaD4NGN8nRMRFMp1S0IbJ4,5872
|
|
43
|
+
service_forge/frontend/static/assets/WorkflowList-LrRJ7B7h.js,sha256=SQo44PmGTx6PBrubRUn33Fp2oSyKLlqIWLvQ888FeAA,3146
|
|
44
|
+
service_forge/frontend/static/assets/WorkflowStudio-CthjgII2.css,sha256=vS9i4Alfm1mYSFdAJtEdwn951vbPgxUIkF49ciLGBrQ,10558
|
|
45
|
+
service_forge/frontend/static/assets/WorkflowStudio-FCyhGD4y.js,sha256=QoYmtexJkS6kLfOSzZnV-IYdurIeyn7Z8OdbNe6OnoE,22418
|
|
46
|
+
service_forge/frontend/static/assets/api-BDer3rj7.css,sha256=buXz68lEAt89IiR2u0MgniDzEZJXk6-eHXfJZL88vgg,25349
|
|
47
|
+
service_forge/frontend/static/assets/api-DyiqpKJK.js,sha256=scHXiLQhPKxxNTQ51z9P39L4ezNz_8ZbF_2pjjZn6Qk,1377
|
|
48
|
+
service_forge/frontend/static/assets/code-editor-DBSql_sc.js,sha256=W1cQHV0ntusuCMPdHaGERCIWl0jqfD7IlxBplctoCKg,418611
|
|
49
|
+
service_forge/frontend/static/assets/el-collapse-item-D4LG0FJ0.css,sha256=soO_WIOe2SVTAbm9Lz4xdnYMG7fxBI2hkkp5UKSeIeo,4640
|
|
50
|
+
service_forge/frontend/static/assets/el-empty-D4ZqTl4F.css,sha256=BnNbnVgeQqaRtWrO3Nz3UXKlKE-ItXfHBLWPMpBb2b8,1200
|
|
51
|
+
service_forge/frontend/static/assets/el-form-item-BWkJzdQ_.css,sha256=NieVUHwAif5MCbb3su377k94gEpEmaeE-FqJxyDCcfA,4749
|
|
52
|
+
service_forge/frontend/static/assets/el-input-D6B3r8CH.css,sha256=2bc4kQvE7AkssoVUbop8TrlVZ3eOPmn7yLE28K8QNtw,11216
|
|
53
|
+
service_forge/frontend/static/assets/el-select-B0XIb2QK.css,sha256=raH_etNzZv2TKoHfPPrKPlYg3dn86xAAtxw2AiDtGlU,10573
|
|
54
|
+
service_forge/frontend/static/assets/el-tag-DljBBxJR.css,sha256=r6wJu2TttSLROOD849tgi__5GwuTi3w4Ek_mePcrwyo,5519
|
|
55
|
+
service_forge/frontend/static/assets/element-ui-D3x2y3TA.js,sha256=sJaaPmvfoPf5BpaR5q03UMoUIOkeczBiYR3KMhu-WFM,364175
|
|
56
|
+
service_forge/frontend/static/assets/elkjs-Dm5QV7uy.js,sha256=VafigDtPiNFk23xS6RU7y_P1vn9iulwB57dvJD9wWpA,1458169
|
|
57
|
+
service_forge/frontend/static/assets/highlightjs-D4ATuRwX.js,sha256=fny5OhPIYIp6p4jPQalolf07V6xdO9lQKJ4LxHDeTTw,20765
|
|
58
|
+
service_forge/frontend/static/assets/index-BMvodlwc.js,sha256=ijTGQN2hQ97IzzoP391jBzFckdPSdQwaE4z3ZvSuFoo,3069
|
|
59
|
+
service_forge/frontend/static/assets/index-CjSe8i2q.css,sha256=natBIv00jgDfpuPod_oQsXFrnBT7QZ5kYUYHDMQWM4c,366882
|
|
60
|
+
service_forge/frontend/static/assets/js-yaml-yTPt38rv.js,sha256=JZoJtTxBnqwaDRdlhUZTn4wu155pNuwW2tY6GXYASl4,39763
|
|
61
|
+
service_forge/frontend/static/assets/time-DKCKV6Ug.js,sha256=h1NMJ55YFy2hxTEpgWl7ymdmXmn2Cw-B6qa6mBsqZZo,429
|
|
62
|
+
service_forge/frontend/static/assets/ui-components-DQ7-U3pr.js,sha256=aRr4Qi6RCYnn9DdFj2DIITSc1dPTibx_sJl1Axt4p00,29747
|
|
63
|
+
service_forge/frontend/static/assets/vue-core-DL-LgTX0.js,sha256=BpbfS9oSirUhQI67J1WYQg-K0ay0pyklFosVn3xTIkk,109327
|
|
64
|
+
service_forge/frontend/static/assets/vue-flow-Dn7R8GPr.js,sha256=PRjMWiyupc3a3_s8iw2PTDQo35gJJUo1EEwVkAmoECk,217212
|
|
65
|
+
service_forge/llm/__init__.py,sha256=x8--4XWqhCVR5n7U3iMvrL16mv-Altb_JgF4qdxSOGk,3170
|
|
66
|
+
service_forge/llm/llm.py,sha256=Sar99FkTPBJqkB6dwX81ww_hJp8cPYxlg7Go-zXPyg0,1865
|
|
67
|
+
service_forge/model/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
68
|
+
service_forge/model/feedback.py,sha256=Is5tkplzYkjChGb67o-Qjtbu4kSspVuaKi4Aua_QdRo,1318
|
|
69
|
+
service_forge/model/trace.py,sha256=kV5v_rZ-mq4zFwD15EKBoXKx45L1zhLJshoSVZLOxRQ,1918
|
|
70
|
+
service_forge/model/websocket.py,sha256=YIUCW32sbHIEFPHjk5FiDM_rDe2aVD6OpzBQul2R5IM,267
|
|
71
|
+
service_forge/model/meta_api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
72
|
+
service_forge/model/meta_api/schema.py,sha256=5FiChhjKODJJG43SLP5QdWm-AXGLmP2DidHt6dk3Atw,574
|
|
73
|
+
service_forge/proto/foo_input.py,sha256=-POJZSIFrGdBGz7FqZZ03r5uztpc5Apin9A0Yxbk6YI,90
|
|
74
|
+
service_forge/sft/cli.py,sha256=xcM6kiGPJeHEUqfJd4uFngVFpjfVkDxW4G_PbNRD9Xs,4265
|
|
75
|
+
service_forge/sft/cmd/config_command.py,sha256=I9t2HG28S6lCXpExHyZUc47b_1yB3i51tCFVk5J6TTU,2382
|
|
76
|
+
service_forge/sft/cmd/deploy_service.py,sha256=5IYbCVI0Nlry1KXBhm9leJmr2bzUEXrSY-2BympLR0c,4686
|
|
77
|
+
service_forge/sft/cmd/list_tars.py,sha256=Z3zvu2JLb_wNbTwi5TZXL5cZ8PxYrKks9AxkOzoUd_Q,1380
|
|
78
|
+
service_forge/sft/cmd/remote_deploy.py,sha256=AStAlbqGD7XeZFhL0fx2j12YWP_MVbdURbO5ZENEMgc,6510
|
|
79
|
+
service_forge/sft/cmd/remote_list_tars.py,sha256=mx6hkNnu0ySMyBX2Qi6blKMj5xnNnrmXq3VD_nERlmw,4176
|
|
80
|
+
service_forge/sft/cmd/service_command.py,sha256=69GMMN61KtuoEFuYzFJ74ivNt8RX8q0I6rbePfJfEwQ,5538
|
|
81
|
+
service_forge/sft/cmd/upload_service.py,sha256=86PvvJSXCZKH4BU6rLytuc45grX-sRnQnOHCo9zUaPY,1232
|
|
82
|
+
service_forge/sft/config/injector.py,sha256=EKeFq2JrZ78_7U83ntFNg7QbG3MTNoXN7BzM2S-5AHQ,7945
|
|
83
|
+
service_forge/sft/config/injector_default_files.py,sha256=t3Z9Icz2u5y_YKYlorlWHtuKjgP9DGwTRQcE-HhXjM0,3052
|
|
84
|
+
service_forge/sft/config/sf_metadata.py,sha256=W4IvWIvzQzDKODklTmtnqAbY3WrVBRJbhRzmAAxtmXI,976
|
|
85
|
+
service_forge/sft/config/sft_config.py,sha256=YRz3udK3G11_JUIBiDbGYyAbyBZHOyJyhmmsOb-icXc,8523
|
|
86
|
+
service_forge/sft/file/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
87
|
+
service_forge/sft/file/ignore_pattern.py,sha256=UrVmR83wOx51XHFcZDTPp15dGYcvMTE5W1m07-SvHpw,2521
|
|
88
|
+
service_forge/sft/file/sft_file_manager.py,sha256=poIM77tZZg7vfwBdCsdQctBbCczVLQePdTwVINEABvE,4337
|
|
89
|
+
service_forge/sft/kubernetes/kubernetes_manager.py,sha256=IF2_X9U-k5Dx7EZuGrJ9lZ85ltbilrrZDfsl8qFyTu4,11339
|
|
90
|
+
service_forge/sft/util/assert_util.py,sha256=6XVTsXKxg92ww3heWzuMvTbybGuw1cmTqWqfiSbPAcY,753
|
|
91
|
+
service_forge/sft/util/logger.py,sha256=0Hi74IoxshE-wBgvBa2EZPXYj37tTrUYwlOBd9UMMMs,502
|
|
92
|
+
service_forge/sft/util/name_util.py,sha256=WSYHM6c7SZULXCFON7nmGqsvAPPs_wavd6QjCa4UbRQ,301
|
|
93
|
+
service_forge/sft/util/yaml_utils.py,sha256=9OhJNQlzj_C1NeQoUZVF8qpDovrE7RDWtNXe-H7tuNA,1703
|
|
94
|
+
service_forge/storage/__init__.py,sha256=8Jg4R9z2JHadheV1YrHtCsFxEL5aCl9n2dMQGHcJfvM,156
|
|
95
|
+
service_forge/storage/feedback_storage.py,sha256=wnuNTmEzpnS7iisiU9MrEJIgVa2G_HysqICWk_PxzfU,9124
|
|
96
|
+
service_forge/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
97
|
+
service_forge/utils/default_type_converter.py,sha256=KFWhlZJUrQc2e-Wm9-WfPUKp5UaI-fpVjzNLO6n37e8,625
|
|
98
|
+
service_forge/utils/register.py,sha256=nxiGQBCX238FoZZhsDoDdBMv_2QzeIZpM367HPNfaqM,874
|
|
99
|
+
service_forge/utils/type_converter.py,sha256=eGAAnqEr-va1PBwYOzuzzzExVJNtusn-yGRv7i9WjRY,3204
|
|
100
|
+
service_forge/utils/workflow_clone.py,sha256=K2Y4XXsGYQn4OTKcDYEa7UZHGXta_hztKW-pr4EYaDQ,4593
|
|
101
|
+
service_forge/workflow/__init__.py,sha256=9oh4qPyA33RugrUYRAlLmFtmQPUN2wxruFQE3omTJF8,49
|
|
102
|
+
service_forge/workflow/context.py,sha256=1PotSEN_l8Emd5p8_6mtXJngXGYd3NSbOs1EKHgvnlo,346
|
|
103
|
+
service_forge/workflow/edge.py,sha256=88Ex-9_dHAGD38OHgiqP0DrfxK0FrhvDAxThR3ilUi4,627
|
|
104
|
+
service_forge/workflow/node.py,sha256=TwyRWyuNAzB4Aom9FiEPgKC8LpzP5UGAO5b5NntBOeQ,17004
|
|
105
|
+
service_forge/workflow/port.py,sha256=JVj0JrnQeOWCsp7n48Cm03bfmO8r3V5oTSEsC-HTGPE,2967
|
|
106
|
+
service_forge/workflow/trigger.py,sha256=2OqiHi0dFcoC8g5GDqVpVEpHKlmqtDADb74Z7PRzHlo,879
|
|
107
|
+
service_forge/workflow/workflow.py,sha256=PsohPbImpiBRRAL1G6MdzcPw7WcXnCL0miRz0vt6Wlc,13078
|
|
108
|
+
service_forge/workflow/workflow_callback.py,sha256=WPLNDMiinW8lQqkPCUABof38f2AhglGFacAYiZ-yLnU,6149
|
|
109
|
+
service_forge/workflow/workflow_config.py,sha256=Yih10b-utKIpaR-X-nfy7fPnmBNhRvlD8Bw2_mQ5lJI,1821
|
|
110
|
+
service_forge/workflow/workflow_event.py,sha256=QG1VFJwUUF1bTKKPKvqBICnYxkBwpfYDEoAuxwQYhhE,371
|
|
111
|
+
service_forge/workflow/workflow_factory.py,sha256=g2ImKmsUjm8BROZQIGua2OLmki8SeklEJ1nBOZvLuM4,10364
|
|
112
|
+
service_forge/workflow/workflow_group.py,sha256=c-Hcfb-nVKxCVddoEQNFV6nY4LVAku0iq7tTUef9fDM,2076
|
|
113
|
+
service_forge/workflow/workflow_type.py,sha256=zRc-gL2LBE-gOgTUCU5-VDWeGUzuQahkHIg98ipEvQg,1629
|
|
114
|
+
service_forge/workflow/nodes/__init__.py,sha256=AUOoFUAMgRwfLiHNkjnDnWToMSe2AeV5vJO3NCG1eLw,381
|
|
115
|
+
service_forge/workflow/nodes/control/if_node.py,sha256=fBRnSsz0SHW5Hcf4993Y1PsUOUt2Cg9I_zcduHUnMuI,643
|
|
116
|
+
service_forge/workflow/nodes/control/switch_node.py,sha256=27mxdcQijSawNM5Fx6LdC1MB66vAoLAAI74DQyfqPqI,708
|
|
117
|
+
service_forge/workflow/nodes/input/console_input_node.py,sha256=GhQjWRgYy3aRfYUfaEql-_Xi10cca75oz-vmSZkR54w,683
|
|
118
|
+
service_forge/workflow/nodes/llm/query_llm_node.py,sha256=rFSHsPsW2V-yhHSmjx60DcokKy5fdGhNNbt8GIgEIbk,1143
|
|
119
|
+
service_forge/workflow/nodes/nested/workflow_node.py,sha256=h5NXhRCUGaoNmqMV2PXR6JNwTCM8MCRVA6ocOjoDzhs,747
|
|
120
|
+
service_forge/workflow/nodes/output/kafka_output_node.py,sha256=mC6qRMGsuwU6qXAfXA-0ZFZudrlwmgRYOJRULUrtH40,682
|
|
121
|
+
service_forge/workflow/nodes/output/print_node.py,sha256=OSgeRQOd3dq88a1plx30g9-VB793RbXnIa5X8MF9fCo,656
|
|
122
|
+
service_forge/workflow/nodes/test/if_console_input_node.py,sha256=CtKHkFqr8PN974_iGP2VSBmNpXZ-KumRHCpoRR5RyF8,956
|
|
123
|
+
service_forge/workflow/nodes/test/time_consuming_node.py,sha256=gB2qw2DdjRf82z1158u36nSnCHrheHaxscAzPRnXNyk,1813
|
|
124
|
+
service_forge/workflow/triggers/__init__.py,sha256=iQ0WEYu6JgL191Y9XslMhZ7jS7JO8bL3SZ9YqIw5LCM,269
|
|
125
|
+
service_forge/workflow/triggers/a2a_api_trigger.py,sha256=Oaw3vRLA8fWZUIQ-h33dYmojmjp4mwNF_0LHqQ_4mZQ,8583
|
|
126
|
+
service_forge/workflow/triggers/fast_api_trigger.py,sha256=6icQJzKqVRGPOmbUU5G73geoELpVzi6GP76NkNMtaLE,9255
|
|
127
|
+
service_forge/workflow/triggers/kafka_api_trigger.py,sha256=Zv8J75Rmg1-xqxHwpBMBhsm_TWX8p3_rqldk2RVSwVc,1561
|
|
128
|
+
service_forge/workflow/triggers/once_trigger.py,sha256=YmzSQBoKE-8liNFIoDCqi2UdqhHujizsXVDft81_8jA,572
|
|
129
|
+
service_forge/workflow/triggers/period_trigger.py,sha256=JFX3yBjKqoRP55jiulaSG_SPO-zWLMcwEb1BwcKsWUM,767
|
|
130
|
+
service_forge/workflow/triggers/websocket_api_trigger.py,sha256=QiF41giGhOHImNVUX3qn56XcVI0B0u-az049KjbU51I,8605
|
|
131
|
+
service_forge-0.1.39.dist-info/METADATA,sha256=EUkxnGFK-94MvAQ8_Qc9Lm4AfK5dgY5eUdpynBJE0jU,2441
|
|
132
|
+
service_forge-0.1.39.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
133
|
+
service_forge-0.1.39.dist-info/entry_points.txt,sha256=WHntHW7GAyKQUEeMcMvHDZ7_xAb0-cZeAK4iJeu9lm8,51
|
|
134
|
+
service_forge-0.1.39.dist-info/RECORD,,
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
service_forge/current_service.py,sha256=0YKm7nQiXzUUAc1ToCcbG1QPJfOSNKcOHUpyJ4E3xrY,342
|
|
2
|
-
service_forge/service.py,sha256=lHsZraEH6Ze20QO5v6iW1MO8src8T8JKLFRBXtd0LD0,12933
|
|
3
|
-
service_forge/service_config.py,sha256=zsTdCZ1peMAotjGEVypPos7d-gjwrYoB9x_12g95G4g,1242
|
|
4
|
-
service_forge/api/deprecated_websocket_api.py,sha256=E36-fpUPxzMJ2YGlCPeqwRbryk2FMMbQD_pbb8k1FYI,3343
|
|
5
|
-
service_forge/api/deprecated_websocket_manager.py,sha256=Xiwg3zwXRVi63sXmVH-TgbpL2XH_djyLeo96STm4cNM,16757
|
|
6
|
-
service_forge/api/http_api.py,sha256=8vcN7oyxwTwu_w1f-Egh2XrFWsm-ci5_gk7KsQiP1iM,7673
|
|
7
|
-
service_forge/api/http_api_doc.py,sha256=ASlxvsIiUzDcMhVoumRjt9CfEMbh0O1U4ZLC9eobLF8,20235
|
|
8
|
-
service_forge/api/kafka_api.py,sha256=PInx2ZzKJRON7EaJFWroXkiOt_UeZY7WE6qK03gq4ak,4599
|
|
9
|
-
service_forge/api/task_manager.py,sha256=9Lk-NV4cBnuv9b8V6GVLWJJ4MCiAwCp5TVAwmYgqXbs,5269
|
|
10
|
-
service_forge/api/routers/feedback/feedback_router.py,sha256=JOJI6kaQYapg4__iA6Eo26_9su48p7R2Kpn422nbsxw,5640
|
|
11
|
-
service_forge/api/routers/service/service_router.py,sha256=hGOT-ScnXR7agHp-F9OFGWiPFjG9f3gl7NBsnayW3JI,5088
|
|
12
|
-
service_forge/api/routers/websocket/websocket_manager.py,sha256=j1AFqzXQhZZyaLQwhvZefXAS-zCOPzLcRMDEuusv6V0,3605
|
|
13
|
-
service_forge/api/routers/websocket/websocket_router.py,sha256=sPDJriEpD2mqu4508cOaWK7u040sgOdaUFlyiBqCSgc,4447
|
|
14
|
-
service_forge/db/__init__.py,sha256=EWLhH8bYsMOvRF_YXF6FgL3irKA6GZeLxSGvWDRM6f8,85
|
|
15
|
-
service_forge/db/database.py,sha256=WKtZ0MoOnbMw54ohfs9zKsrOZ5_qenLvXkAV_Gr2WOs,10068
|
|
16
|
-
service_forge/db/migrations/feedback_migration.py,sha256=-zQ71TsOlWmQPQo1NKSIu3C1T47v3cfD6IAQ5HE_ffk,4845
|
|
17
|
-
service_forge/db/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
18
|
-
service_forge/db/models/feedback.py,sha256=gltX3y-nNhXSR9z1cd82Vg-zwjF0JhnGbOvUapkcWKQ,1253
|
|
19
|
-
service_forge/llm/__init__.py,sha256=x8--4XWqhCVR5n7U3iMvrL16mv-Altb_JgF4qdxSOGk,3170
|
|
20
|
-
service_forge/llm/llm.py,sha256=Sar99FkTPBJqkB6dwX81ww_hJp8cPYxlg7Go-zXPyg0,1865
|
|
21
|
-
service_forge/model/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
22
|
-
service_forge/model/feedback.py,sha256=Is5tkplzYkjChGb67o-Qjtbu4kSspVuaKi4Aua_QdRo,1318
|
|
23
|
-
service_forge/model/websocket.py,sha256=YIUCW32sbHIEFPHjk5FiDM_rDe2aVD6OpzBQul2R5IM,267
|
|
24
|
-
service_forge/proto/foo_input.py,sha256=-POJZSIFrGdBGz7FqZZ03r5uztpc5Apin9A0Yxbk6YI,90
|
|
25
|
-
service_forge/sft/cli.py,sha256=xcM6kiGPJeHEUqfJd4uFngVFpjfVkDxW4G_PbNRD9Xs,4265
|
|
26
|
-
service_forge/sft/cmd/config_command.py,sha256=I9t2HG28S6lCXpExHyZUc47b_1yB3i51tCFVk5J6TTU,2382
|
|
27
|
-
service_forge/sft/cmd/deploy_service.py,sha256=5IYbCVI0Nlry1KXBhm9leJmr2bzUEXrSY-2BympLR0c,4686
|
|
28
|
-
service_forge/sft/cmd/list_tars.py,sha256=Z3zvu2JLb_wNbTwi5TZXL5cZ8PxYrKks9AxkOzoUd_Q,1380
|
|
29
|
-
service_forge/sft/cmd/remote_deploy.py,sha256=AStAlbqGD7XeZFhL0fx2j12YWP_MVbdURbO5ZENEMgc,6510
|
|
30
|
-
service_forge/sft/cmd/remote_list_tars.py,sha256=mx6hkNnu0ySMyBX2Qi6blKMj5xnNnrmXq3VD_nERlmw,4176
|
|
31
|
-
service_forge/sft/cmd/service_command.py,sha256=69GMMN61KtuoEFuYzFJ74ivNt8RX8q0I6rbePfJfEwQ,5538
|
|
32
|
-
service_forge/sft/cmd/upload_service.py,sha256=86PvvJSXCZKH4BU6rLytuc45grX-sRnQnOHCo9zUaPY,1232
|
|
33
|
-
service_forge/sft/config/injector.py,sha256=V79AW1W_LyU-Hn2QgJlLyTt8tdI3J1t1jS3wRoXfbSo,6581
|
|
34
|
-
service_forge/sft/config/injector_default_files.py,sha256=f7mNJ5Y9yb4e9kjLn414WiQoZrOue9ok_hq_POG4I2o,2717
|
|
35
|
-
service_forge/sft/config/sf_metadata.py,sha256=RruOe3_6JdxLnzMbmdnOcncxwnmATR-1q3Cn8R9d5eE,782
|
|
36
|
-
service_forge/sft/config/sft_config.py,sha256=MgurtgbcSmyXbGlVX3NG84KD4Hst1gZWHdF9a8zi-6U,7707
|
|
37
|
-
service_forge/sft/file/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
38
|
-
service_forge/sft/file/ignore_pattern.py,sha256=UrVmR83wOx51XHFcZDTPp15dGYcvMTE5W1m07-SvHpw,2521
|
|
39
|
-
service_forge/sft/file/sft_file_manager.py,sha256=poIM77tZZg7vfwBdCsdQctBbCczVLQePdTwVINEABvE,4337
|
|
40
|
-
service_forge/sft/kubernetes/kubernetes_manager.py,sha256=IF2_X9U-k5Dx7EZuGrJ9lZ85ltbilrrZDfsl8qFyTu4,11339
|
|
41
|
-
service_forge/sft/util/assert_util.py,sha256=6XVTsXKxg92ww3heWzuMvTbybGuw1cmTqWqfiSbPAcY,753
|
|
42
|
-
service_forge/sft/util/logger.py,sha256=0Hi74IoxshE-wBgvBa2EZPXYj37tTrUYwlOBd9UMMMs,502
|
|
43
|
-
service_forge/sft/util/name_util.py,sha256=WSYHM6c7SZULXCFON7nmGqsvAPPs_wavd6QjCa4UbRQ,301
|
|
44
|
-
service_forge/sft/util/yaml_utils.py,sha256=9OhJNQlzj_C1NeQoUZVF8qpDovrE7RDWtNXe-H7tuNA,1703
|
|
45
|
-
service_forge/storage/__init__.py,sha256=8Jg4R9z2JHadheV1YrHtCsFxEL5aCl9n2dMQGHcJfvM,156
|
|
46
|
-
service_forge/storage/feedback_storage.py,sha256=wnuNTmEzpnS7iisiU9MrEJIgVa2G_HysqICWk_PxzfU,9124
|
|
47
|
-
service_forge/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
48
|
-
service_forge/utils/default_type_converter.py,sha256=KFWhlZJUrQc2e-Wm9-WfPUKp5UaI-fpVjzNLO6n37e8,625
|
|
49
|
-
service_forge/utils/register.py,sha256=nxiGQBCX238FoZZhsDoDdBMv_2QzeIZpM367HPNfaqM,874
|
|
50
|
-
service_forge/utils/type_converter.py,sha256=eGAAnqEr-va1PBwYOzuzzzExVJNtusn-yGRv7i9WjRY,3204
|
|
51
|
-
service_forge/utils/workflow_clone.py,sha256=K2Y4XXsGYQn4OTKcDYEa7UZHGXta_hztKW-pr4EYaDQ,4593
|
|
52
|
-
service_forge/workflow/__init__.py,sha256=9oh4qPyA33RugrUYRAlLmFtmQPUN2wxruFQE3omTJF8,49
|
|
53
|
-
service_forge/workflow/context.py,sha256=1PotSEN_l8Emd5p8_6mtXJngXGYd3NSbOs1EKHgvnlo,346
|
|
54
|
-
service_forge/workflow/edge.py,sha256=88Ex-9_dHAGD38OHgiqP0DrfxK0FrhvDAxThR3ilUi4,627
|
|
55
|
-
service_forge/workflow/node.py,sha256=hoO8TdfbB5inpu55YCwecnasi4RS-Bg9R8Sp-M5c2Ys,7841
|
|
56
|
-
service_forge/workflow/port.py,sha256=JVj0JrnQeOWCsp7n48Cm03bfmO8r3V5oTSEsC-HTGPE,2967
|
|
57
|
-
service_forge/workflow/trigger.py,sha256=2OqiHi0dFcoC8g5GDqVpVEpHKlmqtDADb74Z7PRzHlo,879
|
|
58
|
-
service_forge/workflow/workflow.py,sha256=YsA_Yeh5XjYQflztqKWoWBt9euEoHVOJMGMTquIoO04,9788
|
|
59
|
-
service_forge/workflow/workflow_callback.py,sha256=MJBG_DTQGCgqCjpnBhuSteZmOxitYRdtkxXlFCOh930,5219
|
|
60
|
-
service_forge/workflow/workflow_config.py,sha256=Yih10b-utKIpaR-X-nfy7fPnmBNhRvlD8Bw2_mQ5lJI,1821
|
|
61
|
-
service_forge/workflow/workflow_event.py,sha256=QG1VFJwUUF1bTKKPKvqBICnYxkBwpfYDEoAuxwQYhhE,371
|
|
62
|
-
service_forge/workflow/workflow_factory.py,sha256=KfIxjdQhsRC0KYrEkAhqlx3oY6tABoulQGhBwBBXLq0,9933
|
|
63
|
-
service_forge/workflow/workflow_group.py,sha256=c-Hcfb-nVKxCVddoEQNFV6nY4LVAku0iq7tTUef9fDM,2076
|
|
64
|
-
service_forge/workflow/workflow_type.py,sha256=zRc-gL2LBE-gOgTUCU5-VDWeGUzuQahkHIg98ipEvQg,1629
|
|
65
|
-
service_forge/workflow/nodes/__init__.py,sha256=AUOoFUAMgRwfLiHNkjnDnWToMSe2AeV5vJO3NCG1eLw,381
|
|
66
|
-
service_forge/workflow/nodes/control/if_node.py,sha256=fBRnSsz0SHW5Hcf4993Y1PsUOUt2Cg9I_zcduHUnMuI,643
|
|
67
|
-
service_forge/workflow/nodes/control/switch_node.py,sha256=27mxdcQijSawNM5Fx6LdC1MB66vAoLAAI74DQyfqPqI,708
|
|
68
|
-
service_forge/workflow/nodes/input/console_input_node.py,sha256=GhQjWRgYy3aRfYUfaEql-_Xi10cca75oz-vmSZkR54w,683
|
|
69
|
-
service_forge/workflow/nodes/llm/query_llm_node.py,sha256=rFSHsPsW2V-yhHSmjx60DcokKy5fdGhNNbt8GIgEIbk,1143
|
|
70
|
-
service_forge/workflow/nodes/nested/workflow_node.py,sha256=h5NXhRCUGaoNmqMV2PXR6JNwTCM8MCRVA6ocOjoDzhs,747
|
|
71
|
-
service_forge/workflow/nodes/output/kafka_output_node.py,sha256=mC6qRMGsuwU6qXAfXA-0ZFZudrlwmgRYOJRULUrtH40,682
|
|
72
|
-
service_forge/workflow/nodes/output/print_node.py,sha256=OSgeRQOd3dq88a1plx30g9-VB793RbXnIa5X8MF9fCo,656
|
|
73
|
-
service_forge/workflow/nodes/test/if_console_input_node.py,sha256=CtKHkFqr8PN974_iGP2VSBmNpXZ-KumRHCpoRR5RyF8,956
|
|
74
|
-
service_forge/workflow/nodes/test/time_consuming_node.py,sha256=gB2qw2DdjRf82z1158u36nSnCHrheHaxscAzPRnXNyk,1813
|
|
75
|
-
service_forge/workflow/triggers/__init__.py,sha256=iQ0WEYu6JgL191Y9XslMhZ7jS7JO8bL3SZ9YqIw5LCM,269
|
|
76
|
-
service_forge/workflow/triggers/a2a_api_trigger.py,sha256=Oaw3vRLA8fWZUIQ-h33dYmojmjp4mwNF_0LHqQ_4mZQ,8583
|
|
77
|
-
service_forge/workflow/triggers/fast_api_trigger.py,sha256=bAtnuNkUcB5rApXj7x3oBscdavUnDGTb7lE9OpmtauE,7705
|
|
78
|
-
service_forge/workflow/triggers/kafka_api_trigger.py,sha256=Zv8J75Rmg1-xqxHwpBMBhsm_TWX8p3_rqldk2RVSwVc,1561
|
|
79
|
-
service_forge/workflow/triggers/once_trigger.py,sha256=YmzSQBoKE-8liNFIoDCqi2UdqhHujizsXVDft81_8jA,572
|
|
80
|
-
service_forge/workflow/triggers/period_trigger.py,sha256=JFX3yBjKqoRP55jiulaSG_SPO-zWLMcwEb1BwcKsWUM,767
|
|
81
|
-
service_forge/workflow/triggers/websocket_api_trigger.py,sha256=gmO3ie2ctXOpZ3LIMXpp8AQ9I2Bo3l2IBkvxH9zFh5s,7588
|
|
82
|
-
service_forge-0.1.28.dist-info/METADATA,sha256=8HUAOLGWFRFgOaztY6wsCa9kWD-v1aJlNYSAWBoBmGs,2308
|
|
83
|
-
service_forge-0.1.28.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
84
|
-
service_forge-0.1.28.dist-info/entry_points.txt,sha256=WHntHW7GAyKQUEeMcMvHDZ7_xAb0-cZeAK4iJeu9lm8,51
|
|
85
|
-
service_forge-0.1.28.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|