service-forge 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.

Potentially problematic release.


This version of service-forge might be problematic. Click here for more details.

Files changed (238) hide show
  1. service_forge-0.1.6/.gitignore +42 -0
  2. service_forge-0.1.6/.gitmodules +3 -0
  3. service_forge-0.1.6/.python-version +1 -0
  4. service_forge-0.1.6/PKG-INFO +93 -0
  5. service_forge-0.1.6/README.md +59 -0
  6. service_forge-0.1.6/backend/env.example +2 -0
  7. service_forge-0.1.6/backend/main.py +35 -0
  8. service_forge-0.1.6/backend/models/__init__.py +1 -0
  9. service_forge-0.1.6/backend/models/workflow_model.py +81 -0
  10. service_forge-0.1.6/backend/routers/__init__.py +1 -0
  11. service_forge-0.1.6/backend/routers/workflow.py +41 -0
  12. service_forge-0.1.6/backend/run.py +10 -0
  13. service_forge-0.1.6/backend/utils/__init__.py +1 -0
  14. service_forge-0.1.6/build-and-push-base.sh +49 -0
  15. service_forge-0.1.6/config_format.md +589 -0
  16. service_forge-0.1.6/configs/service/test_service.yaml +9 -0
  17. service_forge-0.1.6/configs/service/test_service_websocket.yaml +10 -0
  18. service_forge-0.1.6/configs/workflow/test_fastapi_node.yaml +12 -0
  19. service_forge-0.1.6/configs/workflow/test_if.yaml +31 -0
  20. service_forge-0.1.6/configs/workflow/test_if_console_input.yaml +29 -0
  21. service_forge-0.1.6/configs/workflow/test_kafka_api_node.yaml +15 -0
  22. service_forge-0.1.6/configs/workflow/test_query_llm.yaml +15 -0
  23. service_forge-0.1.6/configs/workflow/test_sub_workflow.yaml +45 -0
  24. service_forge-0.1.6/configs/workflow/test_websocket.yaml +37 -0
  25. service_forge-0.1.6/dockerfile.base +30 -0
  26. service_forge-0.1.6/dockerfile.service.example +15 -0
  27. service_forge-0.1.6/docs/WebSocket_API.md +528 -0
  28. service_forge-0.1.6/docs/javascript_client_example.js +184 -0
  29. service_forge-0.1.6/example/tag-service/.env.example +46 -0
  30. service_forge-0.1.6/example/tag-service/.sftignore +1 -0
  31. service_forge-0.1.6/example/tag-service/Dockerfile +17 -0
  32. service_forge-0.1.6/example/tag-service/README.md +0 -0
  33. service_forge-0.1.6/example/tag-service/alembic/README +1 -0
  34. service_forge-0.1.6/example/tag-service/alembic/env.py +110 -0
  35. service_forge-0.1.6/example/tag-service/alembic/script.py.mako +28 -0
  36. service_forge-0.1.6/example/tag-service/alembic/versions/483c59e9a5e1_add_type.py +28 -0
  37. service_forge-0.1.6/example/tag-service/alembic/versions/5fbbb21acc92_add_description_and_example.py +30 -0
  38. service_forge-0.1.6/example/tag-service/alembic/versions/78e0ab93b1e5_add_user_id.py +28 -0
  39. service_forge-0.1.6/example/tag-service/alembic/versions/8ff25e2b3fd9_create_database.py +37 -0
  40. service_forge-0.1.6/example/tag-service/alembic.ini +147 -0
  41. service_forge-0.1.6/example/tag-service/config.py +102 -0
  42. service_forge-0.1.6/example/tag-service/configs/service.yaml +32 -0
  43. service_forge-0.1.6/example/tag-service/configs/workflow/create_tag_workflow.yaml +22 -0
  44. service_forge-0.1.6/example/tag-service/configs/workflow/delete_tag_workflow.yaml +22 -0
  45. service_forge-0.1.6/example/tag-service/configs/workflow/get_tags_from_record.yaml +23 -0
  46. service_forge-0.1.6/example/tag-service/configs/workflow/kafka_workflow.yaml +28 -0
  47. service_forge-0.1.6/example/tag-service/configs/workflow/query_tags_workflow.yaml +23 -0
  48. service_forge-0.1.6/example/tag-service/configs/workflow/update_tag_workflow.yaml +22 -0
  49. service_forge-0.1.6/example/tag-service/deployment.yaml +38 -0
  50. service_forge-0.1.6/example/tag-service/main.py +40 -0
  51. service_forge-0.1.6/example/tag-service/migrate.py +119 -0
  52. service_forge-0.1.6/example/tag-service/model/db/tag_base.py +19 -0
  53. service_forge-0.1.6/example/tag-service/model/http/create_tag_model.py +6 -0
  54. service_forge-0.1.6/example/tag-service/model/http/delete_tag_model.py +4 -0
  55. service_forge-0.1.6/example/tag-service/model/http/query_tags_model.py +8 -0
  56. service_forge-0.1.6/example/tag-service/model/http/update_tag_model.py +7 -0
  57. service_forge-0.1.6/example/tag-service/nodes/__init__.py +5 -0
  58. service_forge-0.1.6/example/tag-service/nodes/get_tags_node.py +79 -0
  59. service_forge-0.1.6/example/tag-service/nodes/http_create_tag_node.py +31 -0
  60. service_forge-0.1.6/example/tag-service/nodes/http_delete_tag_node.py +35 -0
  61. service_forge-0.1.6/example/tag-service/nodes/http_query_tags_node.py +81 -0
  62. service_forge-0.1.6/example/tag-service/nodes/http_update_tag_node.py +39 -0
  63. service_forge-0.1.6/example/tag-service/prompt/default_tag.json +24 -0
  64. service_forge-0.1.6/example/tag-service/prompt/get_tags.md +39 -0
  65. service_forge-0.1.6/example/tag-service/proto/.git +1 -0
  66. service_forge-0.1.6/example/tag-service/proto/.github/workflows/update_template.yml +38 -0
  67. service_forge-0.1.6/example/tag-service/proto/.gitignore +48 -0
  68. service_forge-0.1.6/example/tag-service/proto/Makefile +55 -0
  69. service_forge-0.1.6/example/tag-service/proto/README.md +109 -0
  70. service_forge-0.1.6/example/tag-service/proto/__init__.py +1 -0
  71. service_forge-0.1.6/example/tag-service/proto/entryService/chat_message.pb.go +243 -0
  72. service_forge-0.1.6/example/tag-service/proto/entryService/chat_message_pb2.py +39 -0
  73. service_forge-0.1.6/example/tag-service/proto/entryService/chat_message_pb2.pyi +35 -0
  74. service_forge-0.1.6/example/tag-service/proto/entryService/record.pb.go +271 -0
  75. service_forge-0.1.6/example/tag-service/proto/entryService/record_pb2.py +37 -0
  76. service_forge-0.1.6/example/tag-service/proto/entryService/record_pb2.pyi +45 -0
  77. service_forge-0.1.6/example/tag-service/proto/intentService/intent.pb.go +59 -0
  78. service_forge-0.1.6/example/tag-service/proto/intentService/intent_pb2.py +35 -0
  79. service_forge-0.1.6/example/tag-service/proto/intentService/intent_pb2.pyi +4 -0
  80. service_forge-0.1.6/example/tag-service/proto/intentService/intent_response.pb.go +299 -0
  81. service_forge-0.1.6/example/tag-service/proto/intentService/intent_response_pb2.py +39 -0
  82. service_forge-0.1.6/example/tag-service/proto/intentService/intent_response_pb2.pyi +51 -0
  83. service_forge-0.1.6/example/tag-service/proto/intentService/record_group.pb.go +158 -0
  84. service_forge-0.1.6/example/tag-service/proto/intentService/record_group_pb2.py +37 -0
  85. service_forge-0.1.6/example/tag-service/proto/intentService/record_group_pb2.pyi +19 -0
  86. service_forge-0.1.6/example/tag-service/proto/parse_topics.py +235 -0
  87. service_forge-0.1.6/example/tag-service/proto/proto/entryService/chat_message.proto +21 -0
  88. service_forge-0.1.6/example/tag-service/proto/proto/entryService/record.proto +25 -0
  89. service_forge-0.1.6/example/tag-service/proto/proto/intentService/intent.proto +21 -0
  90. service_forge-0.1.6/example/tag-service/proto/proto/intentService/intent_response.proto +30 -0
  91. service_forge-0.1.6/example/tag-service/proto/proto/intentService/record_group.proto +13 -0
  92. service_forge-0.1.6/example/tag-service/proto/proto/scheduleService/schedule.proto +12 -0
  93. service_forge-0.1.6/example/tag-service/proto/proto/tagService/tag.proto +12 -0
  94. service_forge-0.1.6/example/tag-service/proto/pyproject.toml +10 -0
  95. service_forge-0.1.6/example/tag-service/proto/scheduleService/schedule.pb.go +149 -0
  96. service_forge-0.1.6/example/tag-service/proto/scheduleService/schedule_pb2.py +37 -0
  97. service_forge-0.1.6/example/tag-service/proto/scheduleService/schedule_pb2.pyi +17 -0
  98. service_forge-0.1.6/example/tag-service/proto/tagService/tag.pb.go +150 -0
  99. service_forge-0.1.6/example/tag-service/proto/tagService/tag_pb2.py +37 -0
  100. service_forge-0.1.6/example/tag-service/proto/tagService/tag_pb2.pyi +19 -0
  101. service_forge-0.1.6/example/tag-service/proto/topics.go +17 -0
  102. service_forge-0.1.6/example/tag-service/proto/topics.py +16 -0
  103. service_forge-0.1.6/example/tag-service/proto/topics.yaml +102 -0
  104. service_forge-0.1.6/example/tag-service/proto/uv.lock +58 -0
  105. service_forge-0.1.6/example/tag-service/pyproject.toml +14 -0
  106. service_forge-0.1.6/example/tag-service/sf-meta.yaml +26 -0
  107. service_forge-0.1.6/example/tag-service/start.sh +10 -0
  108. service_forge-0.1.6/frontend/.gitignore +24 -0
  109. service_forge-0.1.6/frontend/LICENSE +21 -0
  110. service_forge-0.1.6/frontend/README.md +62 -0
  111. service_forge-0.1.6/frontend/biome.json +11 -0
  112. service_forge-0.1.6/frontend/data_sample.npy +0 -0
  113. service_forge-0.1.6/frontend/index.html +13 -0
  114. service_forge-0.1.6/frontend/lefthook.yml +2 -0
  115. service_forge-0.1.6/frontend/package-lock.json +3340 -0
  116. service_forge-0.1.6/frontend/package.json +38 -0
  117. service_forge-0.1.6/frontend/pnpm-lock.yaml +2282 -0
  118. service_forge-0.1.6/frontend/public/vite.svg +1 -0
  119. service_forge-0.1.6/frontend/src/App.tsx +161 -0
  120. service_forge-0.1.6/frontend/src/components/WorkflowSidebar.css +82 -0
  121. service_forge-0.1.6/frontend/src/components/WorkflowSidebar.tsx +79 -0
  122. service_forge-0.1.6/frontend/src/index.css +17 -0
  123. service_forge-0.1.6/frontend/src/main.tsx +11 -0
  124. service_forge-0.1.6/frontend/src/services/api.ts +65 -0
  125. service_forge-0.1.6/frontend/src/vite-env.d.ts +1 -0
  126. service_forge-0.1.6/frontend/src/workflow/components/ControlPanel.tsx +129 -0
  127. service_forge-0.1.6/frontend/src/workflow/components/Edges/BaseEdge/index.tsx +124 -0
  128. service_forge-0.1.6/frontend/src/workflow/components/Edges/BaseEdge/useRebuildEdge.tsx +10 -0
  129. service_forge-0.1.6/frontend/src/workflow/components/Edges/EdgeController/index.tsx +109 -0
  130. service_forge-0.1.6/frontend/src/workflow/components/Edges/EdgeController/smart-edge.ts +570 -0
  131. service_forge-0.1.6/frontend/src/workflow/components/Edges/EdgeController/useEdgeDraggable.tsx +147 -0
  132. service_forge-0.1.6/frontend/src/workflow/components/Edges/Marker.tsx +55 -0
  133. service_forge-0.1.6/frontend/src/workflow/components/Edges/index.tsx +7 -0
  134. service_forge-0.1.6/frontend/src/workflow/components/Nodes/BaseNode/index.tsx +56 -0
  135. service_forge-0.1.6/frontend/src/workflow/components/Nodes/BaseNode/styles.css +73 -0
  136. service_forge-0.1.6/frontend/src/workflow/components/Nodes/index.tsx +7 -0
  137. service_forge-0.1.6/frontend/src/workflow/components/ReactflowInstance.tsx +16 -0
  138. service_forge-0.1.6/frontend/src/workflow/components/WorkflowRunner.tsx +97 -0
  139. service_forge-0.1.6/frontend/src/workflow/data/convert.ts +97 -0
  140. service_forge-0.1.6/frontend/src/workflow/data/data.json +83 -0
  141. service_forge-0.1.6/frontend/src/workflow/data/types.ts +100 -0
  142. service_forge-0.1.6/frontend/src/workflow/layout/edge/algorithms/a-star.ts +219 -0
  143. service_forge-0.1.6/frontend/src/workflow/layout/edge/algorithms/index.ts +127 -0
  144. service_forge-0.1.6/frontend/src/workflow/layout/edge/algorithms/simple.ts +113 -0
  145. service_forge-0.1.6/frontend/src/workflow/layout/edge/edge.ts +267 -0
  146. service_forge-0.1.6/frontend/src/workflow/layout/edge/index.ts +73 -0
  147. service_forge-0.1.6/frontend/src/workflow/layout/edge/point.ts +396 -0
  148. service_forge-0.1.6/frontend/src/workflow/layout/edge/style.ts +200 -0
  149. service_forge-0.1.6/frontend/src/workflow/layout/metadata.ts +101 -0
  150. service_forge-0.1.6/frontend/src/workflow/layout/node/algorithms/d3-dag.ts +125 -0
  151. service_forge-0.1.6/frontend/src/workflow/layout/node/algorithms/d3-hierarchy.ts +93 -0
  152. service_forge-0.1.6/frontend/src/workflow/layout/node/algorithms/dagre-tree.ts +65 -0
  153. service_forge-0.1.6/frontend/src/workflow/layout/node/algorithms/elk.ts +134 -0
  154. service_forge-0.1.6/frontend/src/workflow/layout/node/algorithms/origin.ts +20 -0
  155. service_forge-0.1.6/frontend/src/workflow/layout/node/index.ts +85 -0
  156. service_forge-0.1.6/frontend/src/workflow/layout/useAutoLayout.ts +60 -0
  157. service_forge-0.1.6/frontend/src/workflow/states/reactflow.ts +24 -0
  158. service_forge-0.1.6/frontend/tsconfig.app.json +32 -0
  159. service_forge-0.1.6/frontend/tsconfig.json +7 -0
  160. service_forge-0.1.6/frontend/tsconfig.node.json +26 -0
  161. service_forge-0.1.6/frontend/vite.config.ts +11 -0
  162. service_forge-0.1.6/main.py +24 -0
  163. service_forge-0.1.6/prompt/test_query_llm_prompt.txt +1 -0
  164. service_forge-0.1.6/prompt/test_query_llm_system_prompt.txt +1 -0
  165. service_forge-0.1.6/publish_pypi.sh +4 -0
  166. service_forge-0.1.6/pyproject.toml +58 -0
  167. service_forge-0.1.6/scripts/kafka_consumer.py +132 -0
  168. service_forge-0.1.6/scripts/tag_kafka_producer.py +51 -0
  169. service_forge-0.1.6/scripts/tag_kafka_producer_json.py +42 -0
  170. service_forge-0.1.6/scripts/test_kafka.py +16 -0
  171. service_forge-0.1.6/src/service_forge/api/http_api.py +142 -0
  172. service_forge-0.1.6/src/service_forge/api/http_api_doc.py +349 -0
  173. service_forge-0.1.6/src/service_forge/api/kafka_api.py +126 -0
  174. service_forge-0.1.6/src/service_forge/api/task_manager.py +141 -0
  175. service_forge-0.1.6/src/service_forge/api/websocket_api.py +86 -0
  176. service_forge-0.1.6/src/service_forge/api/websocket_manager.py +425 -0
  177. service_forge-0.1.6/src/service_forge/db/__init__.py +1 -0
  178. service_forge-0.1.6/src/service_forge/db/database.py +119 -0
  179. service_forge-0.1.6/src/service_forge/llm/__init__.py +62 -0
  180. service_forge-0.1.6/src/service_forge/llm/llm.py +56 -0
  181. service_forge-0.1.6/src/service_forge/main.py +121 -0
  182. service_forge-0.1.6/src/service_forge/model/__init__.py +0 -0
  183. service_forge-0.1.6/src/service_forge/model/websocket.py +13 -0
  184. service_forge-0.1.6/src/service_forge/proto/foo_input.py +5 -0
  185. service_forge-0.1.6/src/service_forge/service.py +134 -0
  186. service_forge-0.1.6/src/service_forge/service_config.py +115 -0
  187. service_forge-0.1.6/src/service_forge/sft/cli.py +91 -0
  188. service_forge-0.1.6/src/service_forge/sft/cmd/config_command.py +67 -0
  189. service_forge-0.1.6/src/service_forge/sft/cmd/deploy_service.py +124 -0
  190. service_forge-0.1.6/src/service_forge/sft/cmd/list_tars.py +41 -0
  191. service_forge-0.1.6/src/service_forge/sft/cmd/service_command.py +149 -0
  192. service_forge-0.1.6/src/service_forge/sft/cmd/upload_service.py +36 -0
  193. service_forge-0.1.6/src/service_forge/sft/config/injector.py +108 -0
  194. service_forge-0.1.6/src/service_forge/sft/config/injector_default_files.py +125 -0
  195. service_forge-0.1.6/src/service_forge/sft/config/sf_metadata.py +30 -0
  196. service_forge-0.1.6/src/service_forge/sft/config/sft_config.py +125 -0
  197. service_forge-0.1.6/src/service_forge/sft/file/__init__.py +0 -0
  198. service_forge-0.1.6/src/service_forge/sft/file/ignore_pattern.py +80 -0
  199. service_forge-0.1.6/src/service_forge/sft/file/sft_file_manager.py +107 -0
  200. service_forge-0.1.6/src/service_forge/sft/kubernetes/kubernetes_manager.py +257 -0
  201. service_forge-0.1.6/src/service_forge/sft/util/assert_util.py +25 -0
  202. service_forge-0.1.6/src/service_forge/sft/util/logger.py +16 -0
  203. service_forge-0.1.6/src/service_forge/sft/util/name_util.py +8 -0
  204. service_forge-0.1.6/src/service_forge/sft/util/yaml_utils.py +57 -0
  205. service_forge-0.1.6/src/service_forge/utils/__init__.py +0 -0
  206. service_forge-0.1.6/src/service_forge/utils/default_type_converter.py +12 -0
  207. service_forge-0.1.6/src/service_forge/utils/register.py +39 -0
  208. service_forge-0.1.6/src/service_forge/utils/type_converter.py +74 -0
  209. service_forge-0.1.6/src/service_forge/workflow/__init__.py +1 -0
  210. service_forge-0.1.6/src/service_forge/workflow/context.py +13 -0
  211. service_forge-0.1.6/src/service_forge/workflow/edge.py +31 -0
  212. service_forge-0.1.6/src/service_forge/workflow/node.py +179 -0
  213. service_forge-0.1.6/src/service_forge/workflow/nodes/__init__.py +7 -0
  214. service_forge-0.1.6/src/service_forge/workflow/nodes/control/if_node.py +29 -0
  215. service_forge-0.1.6/src/service_forge/workflow/nodes/input/console_input_node.py +26 -0
  216. service_forge-0.1.6/src/service_forge/workflow/nodes/llm/query_llm_node.py +41 -0
  217. service_forge-0.1.6/src/service_forge/workflow/nodes/nested/workflow_node.py +28 -0
  218. service_forge-0.1.6/src/service_forge/workflow/nodes/output/kafka_output_node.py +27 -0
  219. service_forge-0.1.6/src/service_forge/workflow/nodes/output/print_node.py +29 -0
  220. service_forge-0.1.6/src/service_forge/workflow/nodes/test/if_console_input_node.py +33 -0
  221. service_forge-0.1.6/src/service_forge/workflow/nodes/test/time_consuming_node.py +61 -0
  222. service_forge-0.1.6/src/service_forge/workflow/port.py +86 -0
  223. service_forge-0.1.6/src/service_forge/workflow/trigger.py +20 -0
  224. service_forge-0.1.6/src/service_forge/workflow/triggers/__init__.py +4 -0
  225. service_forge-0.1.6/src/service_forge/workflow/triggers/fast_api_trigger.py +122 -0
  226. service_forge-0.1.6/src/service_forge/workflow/triggers/kafka_api_trigger.py +44 -0
  227. service_forge-0.1.6/src/service_forge/workflow/triggers/once_trigger.py +20 -0
  228. service_forge-0.1.6/src/service_forge/workflow/triggers/period_trigger.py +26 -0
  229. service_forge-0.1.6/src/service_forge/workflow/workflow.py +254 -0
  230. service_forge-0.1.6/src/service_forge/workflow/workflow_factory.py +232 -0
  231. service_forge-0.1.6/src/service_forge/workflow/workflow_group.py +27 -0
  232. service_forge-0.1.6/src/service_forge/workflow/workflow_type.py +52 -0
  233. service_forge-0.1.6/tests/__init__.py +2 -0
  234. service_forge-0.1.6/tests/test_workflow.py +71 -0
  235. service_forge-0.1.6/tests/test_workflow_config.py +9 -0
  236. service_forge-0.1.6/tests/websocket_client_test 9000.py +256 -0
  237. service_forge-0.1.6/tests/websocket_client_test.py +256 -0
  238. service_forge-0.1.6/uv.lock +1375 -0
@@ -0,0 +1,42 @@
1
+ # Python-generated files
2
+ __pycache__/
3
+ *.py[oc]
4
+ build/
5
+ dist/
6
+ wheels/
7
+ *.egg-info
8
+
9
+ # Virtual environments
10
+ .venv
11
+
12
+ # General
13
+ .DS_Store
14
+ __MACOSX/
15
+ .AppleDouble
16
+ .LSOverride
17
+ Icon[]
18
+
19
+ # Thumbnails
20
+ ._*
21
+
22
+ # Files that might appear in the root of a volume
23
+ .DocumentRevisions-V100
24
+ .fseventsd
25
+ .Spotlight-V100
26
+ .TemporaryItems
27
+ .Trashes
28
+ .VolumeIcon.icns
29
+ .com.apple.timemachine.donotpresent
30
+
31
+ # Directories potentially created on remote AFP share
32
+ .AppleDB
33
+ .AppleDesktop
34
+ Network Trash Folder
35
+ Temporary Items
36
+ .apdisk
37
+
38
+ .env
39
+ .vscode/settings.json
40
+ .vscode/launch.json
41
+ example/tag-service/.vscode/settings.json
42
+ client_id.txt
@@ -0,0 +1,3 @@
1
+ [submodule "example/tag-service/proto"]
2
+ path = example/tag-service/proto
3
+ url = git@github.com:NextHCI/second-brain-proto.git
@@ -0,0 +1 @@
1
+ 3.11
@@ -0,0 +1,93 @@
1
+ Metadata-Version: 2.4
2
+ Name: service-forge
3
+ Version: 0.1.6
4
+ Summary: Add your description here
5
+ Author-email: euxcet <zcc.qwer@gmail.com>
6
+ Requires-Python: >=3.11
7
+ Requires-Dist: aiokafka>=0.12.0
8
+ Requires-Dist: alembic>=1.17.0
9
+ Requires-Dist: asyncpg>=0.30.0
10
+ Requires-Dist: dotenv>=0.9.9
11
+ Requires-Dist: fastapi>=0.119.1
12
+ Requires-Dist: greenlet>=3.2.4
13
+ Requires-Dist: jinja2>=3.1.6
14
+ Requires-Dist: kubernetes>=28.0.0
15
+ Requires-Dist: loguru>=0.7.3
16
+ Requires-Dist: omegaconf>=2.3.0
17
+ Requires-Dist: openai>=2.3.0
18
+ Requires-Dist: protobuf>=6.33.1
19
+ Requires-Dist: psycopg2-binary>=2.9.11
20
+ Requires-Dist: pydantic>=2.12.0
21
+ Requires-Dist: pytest-asyncio>=1.2.0
22
+ Requires-Dist: pytest>=8.4.2
23
+ Requires-Dist: python-dotenv>=1.1.1
24
+ Requires-Dist: python-jose>=3.5.0
25
+ Requires-Dist: python-multipart>=0.0.20
26
+ Requires-Dist: requests>=2.32.5
27
+ Requires-Dist: restrictedpython>=8.0
28
+ Requires-Dist: rich>=13.0.0
29
+ Requires-Dist: sqlalchemy>=2.0.44
30
+ Requires-Dist: typer>=0.12.0
31
+ Requires-Dist: uvicorn>=0.38.0
32
+ Requires-Dist: websockets>=15.0.1
33
+ Description-Content-Type: text/markdown
34
+
35
+ # Service Forge
36
+
37
+ Automated service creation and maintenance tool.
38
+
39
+ ## Install
40
+
41
+ ```bash
42
+ pip install -e .
43
+ ```
44
+
45
+ ## CLI Usage (sft)
46
+
47
+ Service Forge 提供了命令行工具 `sft` 用于服务管理。
48
+
49
+ ### 服务上传和部署
50
+
51
+ ```bash
52
+ # 上传服务(打包并上传到服务器)
53
+ sft upload [project_path]
54
+
55
+ # 列出本地已打包的服务包
56
+ sft list
57
+
58
+ # 部署服务(只在服务器上使用)
59
+ sft deploy <name> <version>
60
+ ```
61
+
62
+ ### 配置管理
63
+
64
+ ```bash
65
+ # 列出所有配置项
66
+ sft config list
67
+
68
+ # 获取指定配置项的值
69
+ sft config get <key>
70
+
71
+ # 设置配置项的值
72
+ sft config set <key> <value>
73
+ ```
74
+
75
+ ### 服务管理
76
+
77
+ ```bash
78
+ # 列出所有服务
79
+ sft service list
80
+
81
+ # 删除服务(只在服务器上使用)
82
+ sft service delete <service_name> [--force, -f]
83
+
84
+ # 查看服务日志(只在服务器上使用)
85
+ sft service logs <service_name> [--container, -c] [--tail, -n] [--follow, -f] [--previous, -p]
86
+ ```
87
+
88
+ ## TODO
89
+
90
+ - [x] 多次 trigger 并行执行
91
+ - [x] 支持 websocket 来做 trigger、输入和输出
92
+ - [x] 优化 websocket 客户端映射和重连支持
93
+ - [ ] 节点和 workflow 运行情况的回调函数
@@ -0,0 +1,59 @@
1
+ # Service Forge
2
+
3
+ Automated service creation and maintenance tool.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ pip install -e .
9
+ ```
10
+
11
+ ## CLI Usage (sft)
12
+
13
+ Service Forge 提供了命令行工具 `sft` 用于服务管理。
14
+
15
+ ### 服务上传和部署
16
+
17
+ ```bash
18
+ # 上传服务(打包并上传到服务器)
19
+ sft upload [project_path]
20
+
21
+ # 列出本地已打包的服务包
22
+ sft list
23
+
24
+ # 部署服务(只在服务器上使用)
25
+ sft deploy <name> <version>
26
+ ```
27
+
28
+ ### 配置管理
29
+
30
+ ```bash
31
+ # 列出所有配置项
32
+ sft config list
33
+
34
+ # 获取指定配置项的值
35
+ sft config get <key>
36
+
37
+ # 设置配置项的值
38
+ sft config set <key> <value>
39
+ ```
40
+
41
+ ### 服务管理
42
+
43
+ ```bash
44
+ # 列出所有服务
45
+ sft service list
46
+
47
+ # 删除服务(只在服务器上使用)
48
+ sft service delete <service_name> [--force, -f]
49
+
50
+ # 查看服务日志(只在服务器上使用)
51
+ sft service logs <service_name> [--container, -c] [--tail, -n] [--follow, -f] [--previous, -p]
52
+ ```
53
+
54
+ ## TODO
55
+
56
+ - [x] 多次 trigger 并行执行
57
+ - [x] 支持 websocket 来做 trigger、输入和输出
58
+ - [x] 优化 websocket 客户端映射和重连支持
59
+ - [ ] 节点和 workflow 运行情况的回调函数
@@ -0,0 +1,2 @@
1
+ # CORS
2
+ CORS_ORIGINS=http://localhost:3000
@@ -0,0 +1,35 @@
1
+ import uvicorn
2
+ from fastapi import FastAPI
3
+ from fastapi.middleware.cors import CORSMiddleware
4
+ from routers import workflow
5
+
6
+ app = FastAPI(
7
+ title="Service Forge API",
8
+ description="A modern service management API",
9
+ version="1.0.0"
10
+ )
11
+
12
+ # Configure CORS
13
+ app.add_middleware(
14
+ CORSMiddleware,
15
+ allow_origins=["http://localhost:5173"], # React dev server
16
+ allow_credentials=True,
17
+ allow_methods=["*"],
18
+ allow_headers=["*"],
19
+ )
20
+
21
+ # Include routers
22
+ app.include_router(workflow.router, prefix="/api/v1/workflow", tags=["workflow"])
23
+
24
+ @app.get("/")
25
+ async def root():
26
+ return {"message": "Welcome to Service Forge API"}
27
+
28
+ if __name__ == "__main__":
29
+ uvicorn.run(
30
+ "main:app",
31
+ host="0.0.0.0",
32
+ port=8001,
33
+ reload=True,
34
+ log_level="info"
35
+ )
@@ -0,0 +1 @@
1
+ # Models package
@@ -0,0 +1,81 @@
1
+ import os
2
+ import uuid
3
+ from pydantic import BaseModel
4
+ import omegaconf
5
+
6
+ config_folders = [
7
+ os.path.join("configs", "workflow"),
8
+ os.path.join("example", "tag-service", "configs", "workflow"),
9
+ ]
10
+
11
+
12
+ class NodeModel(BaseModel):
13
+ id: str
14
+ type: str
15
+
16
+ class EdgeModel(BaseModel):
17
+ id: str
18
+ source: str
19
+ target: str
20
+ sourceHandle: str
21
+ targetHandle: str
22
+
23
+ class WorkflowModel(BaseModel):
24
+ id: str
25
+ name: str
26
+ path: str
27
+ nodes: list[NodeModel]
28
+ edges: list[EdgeModel]
29
+
30
+ def get_workflow_path(workflow_id: str) -> str:
31
+ for workflow in workflows:
32
+ if workflow.id == workflow_id:
33
+ return workflow.path
34
+ return None
35
+
36
+ def load_workflow(workflow_path: str) -> WorkflowModel:
37
+ config = omegaconf.OmegaConf.load(workflow_path)
38
+ if 'workflows' in config:
39
+ return None # sub workflow is not supported yet
40
+ nodes = []
41
+ edges = []
42
+ print(workflow_path)
43
+ if 'nodes' in config:
44
+ for node in config['nodes']:
45
+ nodes.append(NodeModel(id=node['name'], type='base'))
46
+ for node in config['nodes']:
47
+ if outputs := node.get('outputs', None):
48
+ for port, value in outputs.items():
49
+ if value is None:
50
+ continue
51
+ source_node_name, source_port_name = node['name'], port
52
+ if type(value) == str:
53
+ value = [value]
54
+ for edge_value in list(value):
55
+ target_node_name, target_port_name = edge_value.split('|')
56
+ edges.append(EdgeModel(
57
+ id=str(uuid.uuid4()),
58
+ source=node['name'],
59
+ target=target_node_name,
60
+ sourceHandle=f"{source_node_name}#source#{source_port_name}",
61
+ targetHandle=f"{target_node_name}#target#{target_port_name}"
62
+ ))
63
+ return WorkflowModel(
64
+ id=str(uuid.uuid4()),
65
+ name=config.get('name', 'Unknown Workflow'),
66
+ path=workflow_path,
67
+ nodes=nodes,
68
+ edges=edges
69
+ )
70
+
71
+ def load_workflows() -> list[WorkflowModel]:
72
+ workflows = []
73
+
74
+ for config_folder in config_folders:
75
+ for config_path in os.listdir(config_folder):
76
+ if config_path.endswith(".yaml"):
77
+ if workflow := load_workflow(os.path.join(config_folder, config_path)):
78
+ workflows.append(workflow)
79
+ return workflows
80
+
81
+ workflows = load_workflows()
@@ -0,0 +1 @@
1
+ # Routers package
@@ -0,0 +1,41 @@
1
+ from fastapi import APIRouter, HTTPException
2
+ from typing import List, Dict, Any
3
+ from pydantic import BaseModel
4
+ from models.workflow_model import workflows, WorkflowModel, load_workflow, get_workflow_path
5
+ from service_forge.workflow.workflow_factory import create_workflow
6
+
7
+ router = APIRouter()
8
+
9
+ @router.get("/", response_model=List[WorkflowModel])
10
+ async def get_workflows():
11
+ return workflows
12
+
13
+ @router.get("/{workflow_id}", response_model=WorkflowModel)
14
+ async def get_workflow(workflow_id: str):
15
+ return load_workflow(get_workflow_path(workflow_id))
16
+
17
+ @router.post("/{workflow_id}")
18
+ async def run_workflow(workflow_id: str):
19
+ result = ""
20
+
21
+ async def _handle_stream_output(node_name: str, stream):
22
+ nonlocal result
23
+ result += f"[{node_name}] Starting stream output:\n"
24
+ buffer = []
25
+ async for char in stream:
26
+ buffer.append(char)
27
+ result += f"[{node_name}] Received char: '{char}'\n"
28
+
29
+ complete_message = ''.join(buffer)
30
+ result += f"[{node_name}] Complete message: '{complete_message}'\n"
31
+
32
+ workflow = create_workflow(
33
+ config_path=get_workflow_path(workflow_id),
34
+ _handle_stream_output=_handle_stream_output,
35
+ )
36
+ if workflow is None:
37
+ raise HTTPException(status_code=404, detail="Workflow not found")
38
+
39
+ await workflow.run()
40
+
41
+ return {"message": result}
@@ -0,0 +1,10 @@
1
+ import uvicorn
2
+
3
+ if __name__ == "__main__":
4
+ uvicorn.run(
5
+ "main:app",
6
+ host="0.0.0.0",
7
+ port=8001,
8
+ reload=True,
9
+ log_level="info"
10
+ )
@@ -0,0 +1 @@
1
+ # Utils package
@@ -0,0 +1,49 @@
1
+ #!/bin/bash
2
+ # 一键 Docker 构建和上传 service-forge 基础镜像脚本
3
+ # 配置参数
4
+ IMAGE_NAME="service-forge"
5
+ REGISTRY_ADDRESS="crpi-cev6qq28wwgwwj0y.cn-beijing.personal.cr.aliyuncs.com"
6
+ REPOSITORY_NAMESPACE="nexthci"
7
+ REPOSITORY_NAME="service-forge"
8
+ VERSION="latest"
9
+ DOCKERFILE="dockerfile.base"
10
+
11
+ echo "=== 开始构建 service-forge 基础镜像 ==="
12
+
13
+ if [ ! -f "$DOCKERFILE" ]; then
14
+ echo "错误: 找不到基础镜像 Dockerfile $DOCKERFILE!"
15
+ exit 1
16
+ fi
17
+
18
+ # 1. 构建 Docker 镜像
19
+ echo "步骤 1/3: 构建 Docker 基础镜像..."
20
+ docker build -f $DOCKERFILE -t $IMAGE_NAME:latest .
21
+ if [ $? -ne 0 ]; then
22
+ echo "错误: Docker 基础镜像构建失败!"
23
+ exit 1
24
+ fi
25
+ echo "✓ 基础镜像构建成功"
26
+
27
+ # 2. 获取镜像ID并标记
28
+ echo "步骤 2/3: 标记基础镜像..."
29
+ IMAGE_ID=$(docker images -q $IMAGE_NAME:latest)
30
+ if [ -z "$IMAGE_ID" ]; then
31
+ echo "错误: 找不到 $IMAGE_NAME:latest 镜像!"
32
+ exit 1
33
+ fi
34
+ TARGET_IMAGE="$REGISTRY_ADDRESS/$REPOSITORY_NAMESPACE/$REPOSITORY_NAME:$VERSION"
35
+ docker tag $IMAGE_ID $TARGET_IMAGE
36
+ echo "✓ 基础镜像标记完成: $TARGET_IMAGE"
37
+
38
+ # 3. 推送镜像
39
+ echo "步骤 3/3: 推送基础镜像到仓库..."
40
+ docker push $TARGET_IMAGE
41
+ if [ $? -ne 0 ]; then
42
+ echo "错误: 基础镜像推送失败!"
43
+ exit 1
44
+ fi
45
+ echo "✓ 基础镜像推送成功"
46
+
47
+
48
+ echo "=== 基础镜像构建完成 ==="
49
+ echo "基础镜像地址: $TARGET_IMAGE"