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.

Files changed (72) hide show
  1. service_forge/__init__.py +0 -0
  2. service_forge/api/deprecated_websocket_api.py +91 -33
  3. service_forge/api/deprecated_websocket_manager.py +70 -53
  4. service_forge/api/http_api.py +127 -53
  5. service_forge/api/kafka_api.py +113 -25
  6. service_forge/api/routers/meta_api/meta_api_router.py +57 -0
  7. service_forge/api/routers/service/service_router.py +42 -6
  8. service_forge/api/routers/trace/trace_router.py +326 -0
  9. service_forge/api/routers/websocket/websocket_router.py +56 -1
  10. service_forge/api/service_studio.py +9 -0
  11. service_forge/execution_context.py +106 -0
  12. service_forge/frontend/static/assets/CreateNewNodeDialog-DkrEMxSH.js +1 -0
  13. service_forge/frontend/static/assets/CreateNewNodeDialog-DwFcBiGp.css +1 -0
  14. service_forge/frontend/static/assets/EditorSidePanel-BNVms9Fq.css +1 -0
  15. service_forge/frontend/static/assets/EditorSidePanel-DZbB3ILL.js +1 -0
  16. service_forge/frontend/static/assets/FeedbackPanel-CC8HX7Yo.js +1 -0
  17. service_forge/frontend/static/assets/FeedbackPanel-ClgniIVk.css +1 -0
  18. service_forge/frontend/static/assets/FormattedCodeViewer.vue_vue_type_script_setup_true_lang-BNuI1NCs.js +1 -0
  19. service_forge/frontend/static/assets/NodeDetailWrapper-BqFFM7-r.js +1 -0
  20. service_forge/frontend/static/assets/NodeDetailWrapper-pZBxv3J0.css +1 -0
  21. service_forge/frontend/static/assets/TestRunningDialog-D0GrCoYs.js +1 -0
  22. service_forge/frontend/static/assets/TestRunningDialog-dhXOsPgH.css +1 -0
  23. service_forge/frontend/static/assets/TracePanelWrapper-B9zvDSc_.js +1 -0
  24. service_forge/frontend/static/assets/TracePanelWrapper-BiednCrq.css +1 -0
  25. service_forge/frontend/static/assets/WorkflowEditor-CcaGGbko.js +3 -0
  26. service_forge/frontend/static/assets/WorkflowEditor-CmasOOYK.css +1 -0
  27. service_forge/frontend/static/assets/WorkflowList-Copuwi-a.css +1 -0
  28. service_forge/frontend/static/assets/WorkflowList-LrRJ7B7h.js +1 -0
  29. service_forge/frontend/static/assets/WorkflowStudio-CthjgII2.css +1 -0
  30. service_forge/frontend/static/assets/WorkflowStudio-FCyhGD4y.js +2 -0
  31. service_forge/frontend/static/assets/api-BDer3rj7.css +1 -0
  32. service_forge/frontend/static/assets/api-DyiqpKJK.js +1 -0
  33. service_forge/frontend/static/assets/code-editor-DBSql_sc.js +12 -0
  34. service_forge/frontend/static/assets/el-collapse-item-D4LG0FJ0.css +1 -0
  35. service_forge/frontend/static/assets/el-empty-D4ZqTl4F.css +1 -0
  36. service_forge/frontend/static/assets/el-form-item-BWkJzdQ_.css +1 -0
  37. service_forge/frontend/static/assets/el-input-D6B3r8CH.css +1 -0
  38. service_forge/frontend/static/assets/el-select-B0XIb2QK.css +1 -0
  39. service_forge/frontend/static/assets/el-tag-DljBBxJR.css +1 -0
  40. service_forge/frontend/static/assets/element-ui-D3x2y3TA.js +12 -0
  41. service_forge/frontend/static/assets/elkjs-Dm5QV7uy.js +24 -0
  42. service_forge/frontend/static/assets/highlightjs-D4ATuRwX.js +3 -0
  43. service_forge/frontend/static/assets/index-BMvodlwc.js +2 -0
  44. service_forge/frontend/static/assets/index-CjSe8i2q.css +1 -0
  45. service_forge/frontend/static/assets/js-yaml-yTPt38rv.js +32 -0
  46. service_forge/frontend/static/assets/time-DKCKV6Ug.js +1 -0
  47. service_forge/frontend/static/assets/ui-components-DQ7-U3pr.js +1 -0
  48. service_forge/frontend/static/assets/vue-core-DL-LgTX0.js +1 -0
  49. service_forge/frontend/static/assets/vue-flow-Dn7R8GPr.js +39 -0
  50. service_forge/frontend/static/index.html +16 -0
  51. service_forge/frontend/static/vite.svg +1 -0
  52. service_forge/model/meta_api/__init__.py +0 -0
  53. service_forge/model/meta_api/schema.py +29 -0
  54. service_forge/model/trace.py +82 -0
  55. service_forge/service.py +32 -11
  56. service_forge/service_config.py +14 -0
  57. service_forge/sft/config/injector.py +32 -2
  58. service_forge/sft/config/injector_default_files.py +12 -0
  59. service_forge/sft/config/sf_metadata.py +5 -0
  60. service_forge/sft/config/sft_config.py +18 -0
  61. service_forge/telemetry.py +66 -0
  62. service_forge/workflow/node.py +266 -27
  63. service_forge/workflow/triggers/fast_api_trigger.py +61 -28
  64. service_forge/workflow/triggers/websocket_api_trigger.py +31 -10
  65. service_forge/workflow/workflow.py +87 -10
  66. service_forge/workflow/workflow_callback.py +24 -2
  67. service_forge/workflow/workflow_factory.py +13 -0
  68. {service_forge-0.1.28.dist-info → service_forge-0.1.39.dist-info}/METADATA +4 -1
  69. service_forge-0.1.39.dist-info/RECORD +134 -0
  70. service_forge-0.1.28.dist-info/RECORD +0 -85
  71. {service_forge-0.1.28.dist-info → service_forge-0.1.39.dist-info}/WHEEL +0 -0
  72. {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
- await websocket.send_text(json.dumps(message))
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
- await authenticate_websocket(websocket, trusted_domain)
147
- else:
148
- # If auth is disabled, set default values
149
- websocket.state.user_id = websocket.headers.get("X-User-ID", "0")
150
- websocket.state.auth_token = websocket.headers.get("X-User-Token")
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
- new_workflow = self._clone(task_id, trigger_node)
208
- await new_workflow.run_after_trigger()
209
- # TODO: clear new_workflow
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.28
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,,