service-forge 0.1.6__tar.gz → 0.1.33__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 (297) hide show
  1. {service_forge-0.1.6 → service_forge-0.1.33}/.gitignore +2 -0
  2. {service_forge-0.1.6 → service_forge-0.1.33}/PKG-INFO +7 -2
  3. {service_forge-0.1.6 → service_forge-0.1.33}/README.md +3 -1
  4. {service_forge-0.1.6 → service_forge-0.1.33}/build-and-push-base.sh +1 -1
  5. service_forge-0.1.33/configs/service/test_service.yaml +17 -0
  6. service_forge-0.1.33/configs/workflow/test_if.yaml +19 -0
  7. {service_forge-0.1.6 → service_forge-0.1.33}/configs/workflow/test_query_llm.yaml +5 -1
  8. service_forge-0.1.33/configs/workflow/test_switch.yaml +22 -0
  9. service_forge-0.1.33/docker-compose.yaml +199 -0
  10. service_forge-0.1.33/docs/sft_config_api_guide.md +260 -0
  11. service_forge-0.1.33/example/tag-service/configs/service.yaml +53 -0
  12. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/configs/workflow/create_tag_workflow.yaml +1 -1
  13. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/configs/workflow/delete_tag_workflow.yaml +1 -1
  14. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/configs/workflow/get_tags_from_record.yaml +1 -1
  15. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/configs/workflow/kafka_workflow.yaml +1 -1
  16. service_forge-0.1.33/example/tag-service/configs/workflow/query_tags_param_workflow.yaml +23 -0
  17. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/configs/workflow/query_tags_workflow.yaml +1 -1
  18. service_forge-0.1.33/example/tag-service/configs/workflow/test_a2a_workflow.yaml +28 -0
  19. service_forge-0.1.33/example/tag-service/configs/workflow/test_context_workflow.yaml +26 -0
  20. service_forge-0.1.33/example/tag-service/configs/workflow/test_sse_workflow.yaml +22 -0
  21. service_forge-0.1.33/example/tag-service/configs/workflow/test_websocket_workflow.yaml +21 -0
  22. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/configs/workflow/update_tag_workflow.yaml +1 -1
  23. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/main.py +4 -1
  24. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/migrate.py +5 -5
  25. service_forge-0.1.33/example/tag-service/model/http/test_sse_model.py +4 -0
  26. service_forge-0.1.33/example/tag-service/nodes/__init__.py +9 -0
  27. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/nodes/get_tags_node.py +2 -2
  28. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/nodes/http_create_tag_node.py +1 -1
  29. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/nodes/http_delete_tag_node.py +1 -1
  30. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/nodes/http_query_tags_node.py +4 -2
  31. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/nodes/http_update_tag_node.py +1 -1
  32. service_forge-0.1.33/example/tag-service/nodes/test_a2a_node.py +24 -0
  33. service_forge-0.1.33/example/tag-service/nodes/test_context_node.py +24 -0
  34. service_forge-0.1.33/example/tag-service/nodes/test_sse_node.py +23 -0
  35. service_forge-0.1.33/example/tag-service/nodes/test_websocket_node.py +24 -0
  36. service_forge-0.1.33/example/tag-service/proto/.git +1 -0
  37. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/pyproject.toml +2 -1
  38. service_forge-0.1.33/example/tag-service/tests/test_service_router.py +315 -0
  39. service_forge-0.1.33/example/tag-service/tests/test_websocket_client.py +159 -0
  40. service_forge-0.1.33/main.py +27 -0
  41. service_forge-0.1.33/main_with_feedback.py +26 -0
  42. {service_forge-0.1.6 → service_forge-0.1.33}/pyproject.toml +4 -1
  43. service_forge-0.1.33/scripts/cleanup_feedback_demo.sh +24 -0
  44. service_forge-0.1.33/scripts/create_feedback_table.py +49 -0
  45. service_forge-0.1.33/scripts/start_feedback_demo.sh +134 -0
  46. service_forge-0.1.33/scripts/view_feedback_db.sh +54 -0
  47. service_forge-0.1.33/src/service_forge/api/http_api.py +238 -0
  48. {service_forge-0.1.6 → service_forge-0.1.33}/src/service_forge/api/http_api_doc.py +106 -0
  49. service_forge-0.1.33/src/service_forge/api/routers/feedback/feedback_router.py +148 -0
  50. service_forge-0.1.33/src/service_forge/api/routers/service/service_router.py +127 -0
  51. service_forge-0.1.33/src/service_forge/api/routers/websocket/websocket_manager.py +83 -0
  52. service_forge-0.1.33/src/service_forge/api/routers/websocket/websocket_router.py +91 -0
  53. service_forge-0.1.33/src/service_forge/current_service.py +14 -0
  54. service_forge-0.1.33/src/service_forge/db/__init__.py +1 -0
  55. service_forge-0.1.33/src/service_forge/db/database.py +254 -0
  56. service_forge-0.1.33/src/service_forge/db/migrations/feedback_migration.py +154 -0
  57. service_forge-0.1.33/src/service_forge/db/models/feedback.py +33 -0
  58. {service_forge-0.1.6 → service_forge-0.1.33}/src/service_forge/llm/__init__.py +5 -0
  59. service_forge-0.1.33/src/service_forge/model/feedback.py +30 -0
  60. service_forge-0.1.33/src/service_forge/service.py +287 -0
  61. service_forge-0.1.33/src/service_forge/service_config.py +44 -0
  62. {service_forge-0.1.6 → service_forge-0.1.33}/src/service_forge/sft/cli.py +39 -0
  63. {service_forge-0.1.6 → service_forge-0.1.33}/src/service_forge/sft/cmd/deploy_service.py +1 -2
  64. service_forge-0.1.33/src/service_forge/sft/cmd/remote_deploy.py +160 -0
  65. service_forge-0.1.33/src/service_forge/sft/cmd/remote_list_tars.py +111 -0
  66. {service_forge-0.1.6 → service_forge-0.1.33}/src/service_forge/sft/config/injector.py +59 -21
  67. {service_forge-0.1.6 → service_forge-0.1.33}/src/service_forge/sft/config/injector_default_files.py +7 -1
  68. service_forge-0.1.33/src/service_forge/sft/config/sf_metadata.py +29 -0
  69. {service_forge-0.1.6 → service_forge-0.1.33}/src/service_forge/sft/config/sft_config.py +83 -8
  70. {service_forge-0.1.6 → service_forge-0.1.33}/src/service_forge/sft/util/assert_util.py +0 -1
  71. service_forge-0.1.33/src/service_forge/storage/__init__.py +5 -0
  72. service_forge-0.1.33/src/service_forge/storage/feedback_storage.py +245 -0
  73. service_forge-0.1.33/src/service_forge/utils/__init__.py +0 -0
  74. {service_forge-0.1.6 → service_forge-0.1.33}/src/service_forge/utils/default_type_converter.py +1 -1
  75. {service_forge-0.1.6 → service_forge-0.1.33}/src/service_forge/utils/type_converter.py +31 -1
  76. service_forge-0.1.33/src/service_forge/utils/workflow_clone.py +125 -0
  77. {service_forge-0.1.6 → service_forge-0.1.33}/src/service_forge/workflow/context.py +2 -1
  78. service_forge-0.1.33/src/service_forge/workflow/edge.py +24 -0
  79. {service_forge-0.1.6 → service_forge-0.1.33}/src/service_forge/workflow/node.py +60 -44
  80. {service_forge-0.1.6 → service_forge-0.1.33}/src/service_forge/workflow/nodes/__init__.py +1 -0
  81. {service_forge-0.1.6 → service_forge-0.1.33}/src/service_forge/workflow/nodes/control/if_node.py +2 -2
  82. service_forge-0.1.33/src/service_forge/workflow/nodes/control/switch_node.py +28 -0
  83. {service_forge-0.1.6 → service_forge-0.1.33}/src/service_forge/workflow/nodes/llm/query_llm_node.py +1 -1
  84. {service_forge-0.1.6 → service_forge-0.1.33}/src/service_forge/workflow/nodes/test/time_consuming_node.py +2 -1
  85. {service_forge-0.1.6 → service_forge-0.1.33}/src/service_forge/workflow/port.py +16 -13
  86. {service_forge-0.1.6 → service_forge-0.1.33}/src/service_forge/workflow/trigger.py +9 -1
  87. service_forge-0.1.33/src/service_forge/workflow/triggers/__init__.py +6 -0
  88. service_forge-0.1.33/src/service_forge/workflow/triggers/a2a_api_trigger.py +257 -0
  89. service_forge-0.1.33/src/service_forge/workflow/triggers/fast_api_trigger.py +223 -0
  90. {service_forge-0.1.6 → service_forge-0.1.33}/src/service_forge/workflow/triggers/kafka_api_trigger.py +3 -0
  91. {service_forge-0.1.6 → service_forge-0.1.33}/src/service_forge/workflow/triggers/once_trigger.py +4 -1
  92. {service_forge-0.1.6 → service_forge-0.1.33}/src/service_forge/workflow/triggers/period_trigger.py +4 -1
  93. service_forge-0.1.33/src/service_forge/workflow/triggers/websocket_api_trigger.py +217 -0
  94. service_forge-0.1.33/src/service_forge/workflow/workflow.py +255 -0
  95. service_forge-0.1.33/src/service_forge/workflow/workflow_callback.py +142 -0
  96. service_forge-0.1.33/src/service_forge/workflow/workflow_config.py +66 -0
  97. service_forge-0.1.33/src/service_forge/workflow/workflow_event.py +15 -0
  98. {service_forge-0.1.6 → service_forge-0.1.33}/src/service_forge/workflow/workflow_factory.py +103 -88
  99. service_forge-0.1.33/src/service_forge/workflow/workflow_group.py +51 -0
  100. service_forge-0.1.33/tests/test_a2a_client.py +143 -0
  101. service_forge-0.1.33/tests/test_sdk_ws.py +437 -0
  102. {service_forge-0.1.6 → service_forge-0.1.33}/uv.lock +573 -2
  103. service_forge-0.1.6/configs/service/test_service.yaml +0 -9
  104. service_forge-0.1.6/configs/workflow/test_if.yaml +0 -31
  105. service_forge-0.1.6/example/tag-service/configs/service.yaml +0 -32
  106. service_forge-0.1.6/example/tag-service/nodes/__init__.py +0 -5
  107. service_forge-0.1.6/example/tag-service/proto/.git +0 -1
  108. service_forge-0.1.6/main.py +0 -24
  109. service_forge-0.1.6/src/service_forge/api/http_api.py +0 -142
  110. service_forge-0.1.6/src/service_forge/db/__init__.py +0 -1
  111. service_forge-0.1.6/src/service_forge/db/database.py +0 -119
  112. service_forge-0.1.6/src/service_forge/main.py +0 -121
  113. service_forge-0.1.6/src/service_forge/service.py +0 -134
  114. service_forge-0.1.6/src/service_forge/service_config.py +0 -115
  115. service_forge-0.1.6/src/service_forge/sft/config/sf_metadata.py +0 -30
  116. service_forge-0.1.6/src/service_forge/workflow/edge.py +0 -31
  117. service_forge-0.1.6/src/service_forge/workflow/triggers/__init__.py +0 -4
  118. service_forge-0.1.6/src/service_forge/workflow/triggers/fast_api_trigger.py +0 -122
  119. service_forge-0.1.6/src/service_forge/workflow/workflow.py +0 -254
  120. service_forge-0.1.6/src/service_forge/workflow/workflow_group.py +0 -27
  121. service_forge-0.1.6/tests/websocket_client_test 9000.py +0 -256
  122. {service_forge-0.1.6 → service_forge-0.1.33}/.gitmodules +0 -0
  123. {service_forge-0.1.6 → service_forge-0.1.33}/.python-version +0 -0
  124. {service_forge-0.1.6 → service_forge-0.1.33}/backend/env.example +0 -0
  125. {service_forge-0.1.6 → service_forge-0.1.33}/backend/main.py +0 -0
  126. {service_forge-0.1.6 → service_forge-0.1.33}/backend/models/__init__.py +0 -0
  127. {service_forge-0.1.6 → service_forge-0.1.33}/backend/models/workflow_model.py +0 -0
  128. {service_forge-0.1.6 → service_forge-0.1.33}/backend/routers/__init__.py +0 -0
  129. {service_forge-0.1.6 → service_forge-0.1.33}/backend/routers/workflow.py +0 -0
  130. {service_forge-0.1.6 → service_forge-0.1.33}/backend/run.py +0 -0
  131. {service_forge-0.1.6 → service_forge-0.1.33}/backend/utils/__init__.py +0 -0
  132. {service_forge-0.1.6 → service_forge-0.1.33}/config_format.md +0 -0
  133. {service_forge-0.1.6 → service_forge-0.1.33}/configs/service/test_service_websocket.yaml +0 -0
  134. {service_forge-0.1.6 → service_forge-0.1.33}/configs/workflow/test_fastapi_node.yaml +0 -0
  135. {service_forge-0.1.6 → service_forge-0.1.33}/configs/workflow/test_if_console_input.yaml +0 -0
  136. {service_forge-0.1.6 → service_forge-0.1.33}/configs/workflow/test_kafka_api_node.yaml +0 -0
  137. {service_forge-0.1.6 → service_forge-0.1.33}/configs/workflow/test_sub_workflow.yaml +0 -0
  138. {service_forge-0.1.6 → service_forge-0.1.33}/configs/workflow/test_websocket.yaml +0 -0
  139. {service_forge-0.1.6 → service_forge-0.1.33}/dockerfile.base +0 -0
  140. {service_forge-0.1.6 → service_forge-0.1.33}/dockerfile.service.example +0 -0
  141. {service_forge-0.1.6 → service_forge-0.1.33}/docs/WebSocket_API.md +0 -0
  142. {service_forge-0.1.6 → service_forge-0.1.33}/docs/javascript_client_example.js +0 -0
  143. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/.env.example +0 -0
  144. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/.sftignore +0 -0
  145. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/Dockerfile +0 -0
  146. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/README.md +0 -0
  147. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/alembic/README +0 -0
  148. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/alembic/env.py +0 -0
  149. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/alembic/script.py.mako +0 -0
  150. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/alembic/versions/483c59e9a5e1_add_type.py +0 -0
  151. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/alembic/versions/5fbbb21acc92_add_description_and_example.py +0 -0
  152. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/alembic/versions/78e0ab93b1e5_add_user_id.py +0 -0
  153. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/alembic/versions/8ff25e2b3fd9_create_database.py +0 -0
  154. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/alembic.ini +0 -0
  155. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/config.py +0 -0
  156. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/deployment.yaml +0 -0
  157. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/model/db/tag_base.py +0 -0
  158. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/model/http/create_tag_model.py +0 -0
  159. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/model/http/delete_tag_model.py +0 -0
  160. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/model/http/query_tags_model.py +0 -0
  161. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/model/http/update_tag_model.py +0 -0
  162. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/prompt/default_tag.json +0 -0
  163. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/prompt/get_tags.md +0 -0
  164. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/proto/.github/workflows/update_template.yml +0 -0
  165. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/proto/.gitignore +0 -0
  166. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/proto/Makefile +0 -0
  167. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/proto/README.md +0 -0
  168. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/proto/__init__.py +0 -0
  169. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/proto/entryService/chat_message.pb.go +0 -0
  170. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/proto/entryService/chat_message_pb2.py +0 -0
  171. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/proto/entryService/chat_message_pb2.pyi +0 -0
  172. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/proto/entryService/record.pb.go +0 -0
  173. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/proto/entryService/record_pb2.py +0 -0
  174. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/proto/entryService/record_pb2.pyi +0 -0
  175. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/proto/intentService/intent.pb.go +0 -0
  176. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/proto/intentService/intent_pb2.py +0 -0
  177. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/proto/intentService/intent_pb2.pyi +0 -0
  178. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/proto/intentService/intent_response.pb.go +0 -0
  179. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/proto/intentService/intent_response_pb2.py +0 -0
  180. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/proto/intentService/intent_response_pb2.pyi +0 -0
  181. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/proto/intentService/record_group.pb.go +0 -0
  182. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/proto/intentService/record_group_pb2.py +0 -0
  183. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/proto/intentService/record_group_pb2.pyi +0 -0
  184. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/proto/parse_topics.py +0 -0
  185. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/proto/proto/entryService/chat_message.proto +0 -0
  186. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/proto/proto/entryService/record.proto +0 -0
  187. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/proto/proto/intentService/intent.proto +0 -0
  188. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/proto/proto/intentService/intent_response.proto +0 -0
  189. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/proto/proto/intentService/record_group.proto +0 -0
  190. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/proto/proto/scheduleService/schedule.proto +0 -0
  191. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/proto/proto/tagService/tag.proto +0 -0
  192. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/proto/pyproject.toml +0 -0
  193. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/proto/scheduleService/schedule.pb.go +0 -0
  194. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/proto/scheduleService/schedule_pb2.py +0 -0
  195. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/proto/scheduleService/schedule_pb2.pyi +0 -0
  196. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/proto/tagService/tag.pb.go +0 -0
  197. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/proto/tagService/tag_pb2.py +0 -0
  198. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/proto/tagService/tag_pb2.pyi +0 -0
  199. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/proto/topics.go +0 -0
  200. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/proto/topics.py +0 -0
  201. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/proto/topics.yaml +0 -0
  202. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/proto/uv.lock +0 -0
  203. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/sf-meta.yaml +0 -0
  204. {service_forge-0.1.6 → service_forge-0.1.33}/example/tag-service/start.sh +0 -0
  205. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/.gitignore +0 -0
  206. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/LICENSE +0 -0
  207. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/README.md +0 -0
  208. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/biome.json +0 -0
  209. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/data_sample.npy +0 -0
  210. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/index.html +0 -0
  211. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/lefthook.yml +0 -0
  212. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/package-lock.json +0 -0
  213. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/package.json +0 -0
  214. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/pnpm-lock.yaml +0 -0
  215. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/public/vite.svg +0 -0
  216. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/src/App.tsx +0 -0
  217. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/src/components/WorkflowSidebar.css +0 -0
  218. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/src/components/WorkflowSidebar.tsx +0 -0
  219. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/src/index.css +0 -0
  220. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/src/main.tsx +0 -0
  221. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/src/services/api.ts +0 -0
  222. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/src/vite-env.d.ts +0 -0
  223. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/src/workflow/components/ControlPanel.tsx +0 -0
  224. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/src/workflow/components/Edges/BaseEdge/index.tsx +0 -0
  225. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/src/workflow/components/Edges/BaseEdge/useRebuildEdge.tsx +0 -0
  226. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/src/workflow/components/Edges/EdgeController/index.tsx +0 -0
  227. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/src/workflow/components/Edges/EdgeController/smart-edge.ts +0 -0
  228. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/src/workflow/components/Edges/EdgeController/useEdgeDraggable.tsx +0 -0
  229. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/src/workflow/components/Edges/Marker.tsx +0 -0
  230. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/src/workflow/components/Edges/index.tsx +0 -0
  231. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/src/workflow/components/Nodes/BaseNode/index.tsx +0 -0
  232. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/src/workflow/components/Nodes/BaseNode/styles.css +0 -0
  233. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/src/workflow/components/Nodes/index.tsx +0 -0
  234. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/src/workflow/components/ReactflowInstance.tsx +0 -0
  235. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/src/workflow/components/WorkflowRunner.tsx +0 -0
  236. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/src/workflow/data/convert.ts +0 -0
  237. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/src/workflow/data/data.json +0 -0
  238. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/src/workflow/data/types.ts +0 -0
  239. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/src/workflow/layout/edge/algorithms/a-star.ts +0 -0
  240. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/src/workflow/layout/edge/algorithms/index.ts +0 -0
  241. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/src/workflow/layout/edge/algorithms/simple.ts +0 -0
  242. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/src/workflow/layout/edge/edge.ts +0 -0
  243. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/src/workflow/layout/edge/index.ts +0 -0
  244. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/src/workflow/layout/edge/point.ts +0 -0
  245. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/src/workflow/layout/edge/style.ts +0 -0
  246. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/src/workflow/layout/metadata.ts +0 -0
  247. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/src/workflow/layout/node/algorithms/d3-dag.ts +0 -0
  248. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/src/workflow/layout/node/algorithms/d3-hierarchy.ts +0 -0
  249. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/src/workflow/layout/node/algorithms/dagre-tree.ts +0 -0
  250. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/src/workflow/layout/node/algorithms/elk.ts +0 -0
  251. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/src/workflow/layout/node/algorithms/origin.ts +0 -0
  252. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/src/workflow/layout/node/index.ts +0 -0
  253. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/src/workflow/layout/useAutoLayout.ts +0 -0
  254. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/src/workflow/states/reactflow.ts +0 -0
  255. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/tsconfig.app.json +0 -0
  256. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/tsconfig.json +0 -0
  257. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/tsconfig.node.json +0 -0
  258. {service_forge-0.1.6 → service_forge-0.1.33}/frontend/vite.config.ts +0 -0
  259. {service_forge-0.1.6 → service_forge-0.1.33}/prompt/test_query_llm_prompt.txt +0 -0
  260. {service_forge-0.1.6 → service_forge-0.1.33}/prompt/test_query_llm_system_prompt.txt +0 -0
  261. {service_forge-0.1.6 → service_forge-0.1.33}/publish_pypi.sh +0 -0
  262. {service_forge-0.1.6 → service_forge-0.1.33}/scripts/kafka_consumer.py +0 -0
  263. {service_forge-0.1.6 → service_forge-0.1.33}/scripts/tag_kafka_producer.py +0 -0
  264. {service_forge-0.1.6 → service_forge-0.1.33}/scripts/tag_kafka_producer_json.py +0 -0
  265. {service_forge-0.1.6 → service_forge-0.1.33}/scripts/test_kafka.py +0 -0
  266. /service_forge-0.1.6/src/service_forge/api/websocket_api.py → /service_forge-0.1.33/src/service_forge/api/deprecated_websocket_api.py +0 -0
  267. /service_forge-0.1.6/src/service_forge/api/websocket_manager.py → /service_forge-0.1.33/src/service_forge/api/deprecated_websocket_manager.py +0 -0
  268. {service_forge-0.1.6 → service_forge-0.1.33}/src/service_forge/api/kafka_api.py +0 -0
  269. {service_forge-0.1.6 → service_forge-0.1.33}/src/service_forge/api/task_manager.py +0 -0
  270. {service_forge-0.1.6/src/service_forge/model → service_forge-0.1.33/src/service_forge/db/models}/__init__.py +0 -0
  271. {service_forge-0.1.6 → service_forge-0.1.33}/src/service_forge/llm/llm.py +0 -0
  272. {service_forge-0.1.6/src/service_forge/sft/file → service_forge-0.1.33/src/service_forge/model}/__init__.py +0 -0
  273. {service_forge-0.1.6 → service_forge-0.1.33}/src/service_forge/model/websocket.py +0 -0
  274. {service_forge-0.1.6 → service_forge-0.1.33}/src/service_forge/proto/foo_input.py +0 -0
  275. {service_forge-0.1.6 → service_forge-0.1.33}/src/service_forge/sft/cmd/config_command.py +0 -0
  276. {service_forge-0.1.6 → service_forge-0.1.33}/src/service_forge/sft/cmd/list_tars.py +0 -0
  277. {service_forge-0.1.6 → service_forge-0.1.33}/src/service_forge/sft/cmd/service_command.py +0 -0
  278. {service_forge-0.1.6 → service_forge-0.1.33}/src/service_forge/sft/cmd/upload_service.py +0 -0
  279. {service_forge-0.1.6/src/service_forge/utils → service_forge-0.1.33/src/service_forge/sft/file}/__init__.py +0 -0
  280. {service_forge-0.1.6 → service_forge-0.1.33}/src/service_forge/sft/file/ignore_pattern.py +0 -0
  281. {service_forge-0.1.6 → service_forge-0.1.33}/src/service_forge/sft/file/sft_file_manager.py +0 -0
  282. {service_forge-0.1.6 → service_forge-0.1.33}/src/service_forge/sft/kubernetes/kubernetes_manager.py +0 -0
  283. {service_forge-0.1.6 → service_forge-0.1.33}/src/service_forge/sft/util/logger.py +0 -0
  284. {service_forge-0.1.6 → service_forge-0.1.33}/src/service_forge/sft/util/name_util.py +0 -0
  285. {service_forge-0.1.6 → service_forge-0.1.33}/src/service_forge/sft/util/yaml_utils.py +0 -0
  286. {service_forge-0.1.6 → service_forge-0.1.33}/src/service_forge/utils/register.py +0 -0
  287. {service_forge-0.1.6 → service_forge-0.1.33}/src/service_forge/workflow/__init__.py +0 -0
  288. {service_forge-0.1.6 → service_forge-0.1.33}/src/service_forge/workflow/nodes/input/console_input_node.py +0 -0
  289. {service_forge-0.1.6 → service_forge-0.1.33}/src/service_forge/workflow/nodes/nested/workflow_node.py +0 -0
  290. {service_forge-0.1.6 → service_forge-0.1.33}/src/service_forge/workflow/nodes/output/kafka_output_node.py +0 -0
  291. {service_forge-0.1.6 → service_forge-0.1.33}/src/service_forge/workflow/nodes/output/print_node.py +0 -0
  292. {service_forge-0.1.6 → service_forge-0.1.33}/src/service_forge/workflow/nodes/test/if_console_input_node.py +0 -0
  293. {service_forge-0.1.6 → service_forge-0.1.33}/src/service_forge/workflow/workflow_type.py +0 -0
  294. {service_forge-0.1.6 → service_forge-0.1.33}/tests/__init__.py +0 -0
  295. {service_forge-0.1.6 → service_forge-0.1.33}/tests/test_workflow.py +0 -0
  296. {service_forge-0.1.6 → service_forge-0.1.33}/tests/test_workflow_config.py +0 -0
  297. {service_forge-0.1.6 → service_forge-0.1.33}/tests/websocket_client_test.py +0 -0
@@ -8,6 +8,7 @@ wheels/
8
8
 
9
9
  # Virtual environments
10
10
  .venv
11
+ venv/
11
12
 
12
13
  # General
13
14
  .DS_Store
@@ -15,6 +16,7 @@ __MACOSX/
15
16
  .AppleDouble
16
17
  .LSOverride
17
18
  Icon[]
19
+ CLAUDE.md
18
20
 
19
21
  # Thumbnails
20
22
  ._*
@@ -1,9 +1,10 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: service-forge
3
- Version: 0.1.6
3
+ Version: 0.1.33
4
4
  Summary: Add your description here
5
5
  Author-email: euxcet <zcc.qwer@gmail.com>
6
6
  Requires-Python: >=3.11
7
+ Requires-Dist: a2a-sdk>=0.3.22
7
8
  Requires-Dist: aiokafka>=0.12.0
8
9
  Requires-Dist: alembic>=1.17.0
9
10
  Requires-Dist: asyncpg>=0.30.0
@@ -18,11 +19,13 @@ Requires-Dist: openai>=2.3.0
18
19
  Requires-Dist: protobuf>=6.33.1
19
20
  Requires-Dist: psycopg2-binary>=2.9.11
20
21
  Requires-Dist: pydantic>=2.12.0
22
+ Requires-Dist: pymongo>=4.15.5
21
23
  Requires-Dist: pytest-asyncio>=1.2.0
22
24
  Requires-Dist: pytest>=8.4.2
23
25
  Requires-Dist: python-dotenv>=1.1.1
24
26
  Requires-Dist: python-jose>=3.5.0
25
27
  Requires-Dist: python-multipart>=0.0.20
28
+ Requires-Dist: redis>=7.1.0
26
29
  Requires-Dist: requests>=2.32.5
27
30
  Requires-Dist: restrictedpython>=8.0
28
31
  Requires-Dist: rich>=13.0.0
@@ -90,4 +93,6 @@ sft service logs <service_name> [--container, -c] [--tail, -n] [--follow, -f] [-
90
93
  - [x] 多次 trigger 并行执行
91
94
  - [x] 支持 websocket 来做 trigger、输入和输出
92
95
  - [x] 优化 websocket 客户端映射和重连支持
93
- - [ ] 节点和 workflow 运行情况的回调函数
96
+ - [x] 节点和 workflow 运行情况的回调函数
97
+ - [ ] 支持 a2a
98
+ - [ ] workflow 执行异常处理
@@ -56,4 +56,6 @@ sft service logs <service_name> [--container, -c] [--tail, -n] [--follow, -f] [-
56
56
  - [x] 多次 trigger 并行执行
57
57
  - [x] 支持 websocket 来做 trigger、输入和输出
58
58
  - [x] 优化 websocket 客户端映射和重连支持
59
- - [ ] 节点和 workflow 运行情况的回调函数
59
+ - [x] 节点和 workflow 运行情况的回调函数
60
+ - [ ] 支持 a2a
61
+ - [ ] workflow 执行异常处理
@@ -46,4 +46,4 @@ echo "✓ 基础镜像推送成功"
46
46
 
47
47
 
48
48
  echo "=== 基础镜像构建完成 ==="
49
- echo "基础镜像地址: $TARGET_IMAGE"
49
+ echo "基础镜像地址: $TARGET_IMAGE"
@@ -0,0 +1,17 @@
1
+ name: test_service
2
+ workflows:
3
+ - ../workflow/test_query_llm.yaml
4
+ enable_http: true
5
+ http_host: 0.0.0.0
6
+ http_port: 37200
7
+ enable_kafka: false
8
+ kafka_host: localhost
9
+ kafka_port: 9092
10
+
11
+ databases:
12
+ - name: feedback_db
13
+ postgres_user: postgres
14
+ postgres_password: Luxuyang410641F
15
+ postgres_host: localhost
16
+ postgres_port: 5433
17
+ postgres_db: service_forge_feedback
@@ -0,0 +1,19 @@
1
+ name: test_if
2
+ nodes:
3
+ - name: trigger
4
+ type: OnceTrigger
5
+ args:
6
+ outputs:
7
+ trigger: if|TRIGGER
8
+
9
+ - name: if
10
+ type: IfNode
11
+ args:
12
+ condition: "1 == 1"
13
+ outputs:
14
+ 'true': print|message
15
+ 'false': print|message
16
+
17
+ - name: print
18
+ type: PrintNode
19
+ args:
@@ -1,8 +1,12 @@
1
1
  name: test_query_llm
2
2
  nodes:
3
3
  - name: trigger
4
- type: OnceTrigger
4
+ type: FastAPITrigger
5
5
  args:
6
+ app: app
7
+ path: "/api/trigger"
8
+ method: "GET"
9
+ data_type: FooInput
6
10
  outputs:
7
11
  trigger: query_llm|TRIGGER
8
12
 
@@ -0,0 +1,22 @@
1
+ name: test_switch
2
+ nodes:
3
+ - name: trigger
4
+ type: OnceTrigger
5
+ args:
6
+ outputs:
7
+ trigger: switch|TRIGGER
8
+
9
+ - name: switch
10
+ type: SwitchNode
11
+ args:
12
+ condition_0: "2 > 5"
13
+ condition_1: "3 > 1"
14
+ condition_2: "5 > 1"
15
+ outputs:
16
+ 'result_0': print|message
17
+ 'result_1': print|message
18
+ 'result_2': print|message
19
+
20
+ - name: print
21
+ type: PrintNode
22
+ args:
@@ -0,0 +1,199 @@
1
+ x-common: &common
2
+ networks:
3
+ - signoz-net
4
+ restart: unless-stopped
5
+ logging:
6
+ options:
7
+ max-size: 50m
8
+ max-file: "3"
9
+ x-clickhouse-defaults: &clickhouse-defaults
10
+ !!merge <<: *common
11
+ # addding non LTS version due to this fix https://github.com/ClickHouse/ClickHouse/commit/32caf8716352f45c1b617274c7508c86b7d1afab
12
+ image: clickhouse/clickhouse-server:24.1.2-alpine
13
+ tty: true
14
+ labels:
15
+ signoz.io/scrape: "true"
16
+ signoz.io/port: "9363"
17
+ signoz.io/path: "/metrics"
18
+ depends_on:
19
+ init-clickhouse:
20
+ condition: service_completed_successfully
21
+ zookeeper-1:
22
+ condition: service_healthy
23
+ healthcheck:
24
+ test:
25
+ - CMD
26
+ - wget
27
+ - --spider
28
+ - -q
29
+ - 0.0.0.0:8123/ping
30
+ interval: 30s
31
+ timeout: 5s
32
+ retries: 3
33
+ ulimits:
34
+ nproc: 65535
35
+ nofile:
36
+ soft: 262144
37
+ hard: 262144
38
+ x-zookeeper-defaults: &zookeeper-defaults
39
+ !!merge <<: *common
40
+ image: zookeeper
41
+ user: root
42
+ labels:
43
+ signoz.io/scrape: "true"
44
+ signoz.io/port: "9141"
45
+ signoz.io/path: "/metrics"
46
+ healthcheck:
47
+ test:
48
+ - CMD-SHELL
49
+ - curl -s -m 2 http://localhost:8080/commands/ruok | grep error | grep null
50
+ interval: 30s
51
+ timeout: 5s
52
+ retries: 3
53
+ x-db-depend: &db-depend
54
+ !!merge <<: *common
55
+ depends_on:
56
+ clickhouse:
57
+ condition: service_healthy
58
+ schema-migrator-sync:
59
+ condition: service_completed_successfully
60
+ services:
61
+ init-clickhouse:
62
+ !!merge <<: *common
63
+ image: clickhouse/clickhouse-server:24.1.2-alpine
64
+ container_name: signoz-init-clickhouse
65
+ command:
66
+ - bash
67
+ - -c
68
+ - |
69
+ version="v0.0.1"
70
+ node_os=$$(uname -s | tr '[:upper:]' '[:lower:]')
71
+ node_arch=$$(uname -m | sed s/aarch64/arm64/ | sed s/x86_64/amd64/)
72
+ echo "Fetching histogram-binary for $${node_os}/$${node_arch}"
73
+ cd /tmp
74
+ wget -O histogram-quantile.tar.gz "https://github.com/SigNoz/signoz/releases/download/histogram-quantile%2F$${version}/histogram-quantile_$${node_os}_$${node_arch}.tar.gz"
75
+ tar -xvzf histogram-quantile.tar.gz
76
+ mv histogram-quantile /var/lib/clickhouse/user_scripts/histogramQuantile
77
+ restart: on-failure
78
+ volumes:
79
+ - ../common/clickhouse/user_scripts:/var/lib/clickhouse/user_scripts/
80
+ zookeeper-1:
81
+ !!merge <<: *zookeeper-defaults
82
+ container_name: signoz-zookeeper-1
83
+ # ports:
84
+ # - "2181:2181"
85
+ # - "2888:2888"
86
+ # - "3888:3888"
87
+ volumes:
88
+ - zookeeper-1:/bitnami/zookeeper
89
+ environment:
90
+ - ZOO_SERVER_ID=1
91
+ - ALLOW_ANONYMOUS_LOGIN=yes
92
+ - ZOO_AUTOPURGE_INTERVAL=1
93
+ - ZOO_ENABLE_PROMETHEUS_METRICS=yes
94
+ - ZOO_PROMETHEUS_METRICS_PORT_NUMBER=9141
95
+ clickhouse:
96
+ !!merge <<: *clickhouse-defaults
97
+ container_name: signoz-clickhouse
98
+ # ports:
99
+ # - "9000:9000"
100
+ # - "8123:8123"
101
+ # - "9181:9181"
102
+ volumes:
103
+ # - ../common/clickhouse/config.xml:/etc/clickhouse-server/config.xml
104
+ # - ../common/clickhouse/users.xml:/etc/clickhouse-server/users.xml
105
+ # - ../common/clickhouse/custom-function.xml:/etc/clickhouse-server/custom-function.xml
106
+ - ../common/clickhouse/user_scripts:/var/lib/clickhouse/user_scripts/
107
+ # - ../common/clickhouse/cluster.xml:/etc/clickhouse-server/config.d/cluster.xml
108
+ - clickhouse:/var/lib/clickhouse/
109
+ # - ../common/clickhouse/storage.xml:/etc/clickhouse-server/config.d/storage.xml
110
+ signoz:
111
+ !!merge <<: *db-depend
112
+ image: signoz/signoz:${VERSION:-v0.91.0}
113
+ container_name: signoz
114
+ command:
115
+ - --config=/root/config/prometheus.yml
116
+ ports:
117
+ - "8080:8080" # signoz port
118
+ # - "6060:6060" # pprof port
119
+ volumes:
120
+ - ../common/signoz/prometheus.yml:/root/config/prometheus.yml
121
+ - ../common/dashboards:/root/config/dashboards
122
+ - sqlite:/var/lib/signoz/
123
+ environment:
124
+ - SIGNOZ_ALERTMANAGER_PROVIDER=signoz
125
+ - SIGNOZ_TELEMETRYSTORE_CLICKHOUSE_DSN=tcp://clickhouse:9000
126
+ - SIGNOZ_SQLSTORE_SQLITE_PATH=/var/lib/signoz/signoz.db
127
+ - DASHBOARDS_PATH=/root/config/dashboards
128
+ - STORAGE=clickhouse
129
+ - GODEBUG=netdns=go
130
+ - TELEMETRY_ENABLED=true
131
+ - DEPLOYMENT_TYPE=docker-standalone-amd
132
+ - DOT_METRICS_ENABLED=true
133
+ healthcheck:
134
+ test:
135
+ - CMD
136
+ - wget
137
+ - --spider
138
+ - -q
139
+ - localhost:8080/api/v1/health
140
+ interval: 30s
141
+ timeout: 5s
142
+ retries: 3
143
+ otel-collector:
144
+ !!merge <<: *db-depend
145
+ image: signoz/signoz-otel-collector:${OTELCOL_TAG:-v0.128.2}
146
+ container_name: signoz-otel-collector
147
+ command:
148
+ - --config=/etc/otel-collector-config.yaml
149
+ - --manager-config=/etc/manager-config.yaml
150
+ - --copy-path=/var/tmp/collector-config.yaml
151
+ - --feature-gates=-pkg.translator.prometheus.NormalizeName
152
+ volumes:
153
+ - ./otel-collector-config.yaml:/etc/otel-collector-config.yaml
154
+ - ../common/signoz/otel-collector-opamp-config.yaml:/etc/manager-config.yaml
155
+ environment:
156
+ - OTEL_RESOURCE_ATTRIBUTES=host.name=signoz-host,os.type=linux
157
+ - LOW_CARDINAL_EXCEPTION_GROUPING=false
158
+ ports:
159
+ # - "1777:1777" # pprof extension
160
+ - "4317:4317" # OTLP gRPC receiver
161
+ - "4318:4318" # OTLP HTTP receiver
162
+ depends_on:
163
+ signoz:
164
+ condition: service_healthy
165
+ schema-migrator-sync:
166
+ !!merge <<: *common
167
+ image: signoz/signoz-schema-migrator:${OTELCOL_TAG:-v0.128.2}
168
+ container_name: schema-migrator-sync
169
+ command:
170
+ - sync
171
+ - --dsn=tcp://clickhouse:9000
172
+ - --dev
173
+ - --cluster-name=default
174
+ - --up=
175
+ depends_on:
176
+ clickhouse:
177
+ condition: service_healthy
178
+ restart: on-failure
179
+ schema-migrator-async:
180
+ !!merge <<: *db-depend
181
+ image: signoz/signoz-schema-migrator:${OTELCOL_TAG:-v0.128.2}
182
+ container_name: schema-migrator-async
183
+ command:
184
+ - async
185
+ - --dsn=tcp://clickhouse:9000
186
+ - --dev
187
+ - --cluster-name=default
188
+ - --up=
189
+ restart: on-failure
190
+ networks:
191
+ signoz-net:
192
+ name: signoz-net
193
+ volumes:
194
+ clickhouse:
195
+ name: signoz-clickhouse
196
+ sqlite:
197
+ name: signoz-sqlite
198
+ zookeeper-1:
199
+ name: signoz-zookeeper-1
@@ -0,0 +1,260 @@
1
+ # SFT 配置 API 使用指南
2
+
3
+ 本指南介绍如何通过 Python API 修改 Service Forge (SFT) 的配置,适用于导入了 service-forge 仓库的项目。
4
+
5
+ ## 概述
6
+
7
+ SFT 配置系统提供了两种方式修改配置:
8
+ 1. 命令行工具 (`sft config` 命令)
9
+ 2. Python API (直接在代码中操作)
10
+
11
+ 本指南专注于 Python API 的使用方法。
12
+
13
+ ## 基本用法
14
+
15
+ ### 1. 导入配置模块
16
+
17
+ ```python
18
+ from service_forge.sft.config.sft_config import sft_config, SftConfig
19
+ ```
20
+
21
+ ### 2. 读取配置
22
+
23
+ ```python
24
+ # 获取单个配置项
25
+ sft_file_root = sft_config.get("sft_file_root")
26
+ print(f"SFT 文件根目录: {sft_file_root}")
27
+
28
+ # 获取所有配置项
29
+ config_dict = sft_config.to_dict()
30
+ for key, value in config_dict.items():
31
+ print(f"{key}: {value}")
32
+
33
+ # 直接访问配置属性
34
+ k8s_namespace = sft_config.k8s_namespace
35
+ service_center = sft_config.service_center_address
36
+ ```
37
+
38
+ ### 3. 修改配置
39
+
40
+ ```python
41
+ # 设置单个配置项
42
+ sft_config.set("sft_file_root", "/new/path/to/sft")
43
+ sft_config.set("k8s_namespace", "new-namespace")
44
+
45
+ # 批量更新配置
46
+ updates = {
47
+ "k8s_namespace": "production",
48
+ "inject_http_port": 8080,
49
+ "inject_kafka_host": "kafka.example.com"
50
+ }
51
+ sft_config.update(updates)
52
+
53
+ # 保存配置到文件
54
+ sft_config.save()
55
+ ```
56
+
57
+ ### 4. 创建新的配置实例
58
+
59
+ ```python
60
+ # 创建新的配置实例
61
+ new_config = SftConfig(
62
+ sft_file_root="/custom/path",
63
+ k8s_namespace="custom-namespace",
64
+ service_center_address="http://custom.service.center"
65
+ )
66
+
67
+ # 保存新配置
68
+ new_config.save()
69
+
70
+ # 加载指定配置文件
71
+ custom_config = SftConfig()
72
+ custom_config.from_file("/path/to/custom/config.yaml")
73
+ ```
74
+
75
+ ## 高级用法
76
+
77
+ ### 1. 配置文件位置操作
78
+
79
+ ```python
80
+ # 获取配置文件路径
81
+ config_path = sft_config.config_file_path
82
+ print(f"配置文件位置: {config_path}")
83
+
84
+ # 确保配置目录存在
85
+ sft_config.ensure_config_dir()
86
+ ```
87
+
88
+ ### 2. 配置验证
89
+
90
+ ```python
91
+ # 检查配置项是否存在
92
+ if hasattr(sft_config, 'k8s_namespace'):
93
+ print(f"K8s 命名空间: {sft_config.k8s_namespace}")
94
+
95
+ # 获取所有可用的配置键
96
+ available_keys = SftConfig.get_config_keys()
97
+ print("可用的配置项:", available_keys)
98
+ ```
99
+
100
+ ### 3. 配置描述信息
101
+
102
+ ```python
103
+ # 获取配置项的描述
104
+ key = "k8s_namespace"
105
+ description = SftConfig.CONFIG_DESCRIPTIONS.get(key, "无描述")
106
+ print(f"{key}: {description}")
107
+
108
+ # 显示所有配置项及其描述
109
+ for key, description in SftConfig.CONFIG_DESCRIPTIONS.items():
110
+ value = getattr(sft_config, key, "未设置")
111
+ print(f"{key}: {value} - {description}")
112
+ ```
113
+
114
+ ## 实际应用示例
115
+
116
+ ### 示例 1: 环境特定配置
117
+
118
+ ```python
119
+ from service_forge.sft.config.sft_config import sft_config
120
+ import os
121
+
122
+ def setup_environment_config():
123
+ """根据环境变量设置配置"""
124
+ env = os.getenv("ENVIRONMENT", "development")
125
+
126
+ if env == "production":
127
+ updates = {
128
+ "k8s_namespace": "prod",
129
+ "inject_http_port": 80,
130
+ "inject_kafka_host": "kafka.prod.example.com"
131
+ }
132
+ elif env == "staging":
133
+ updates = {
134
+ "k8s_namespace": "staging",
135
+ "inject_http_port": 8080,
136
+ "inject_kafka_host": "kafka.staging.example.com"
137
+ }
138
+ else: # development
139
+ updates = {
140
+ "k8s_namespace": "dev",
141
+ "inject_http_port": 8000,
142
+ "inject_kafka_host": "localhost"
143
+ }
144
+
145
+ sft_config.update(updates)
146
+ sft_config.save()
147
+ print(f"已应用 {env} 环境配置")
148
+
149
+ # 使用示例
150
+ setup_environment_config()
151
+ ```
152
+
153
+ ### 示例 2: 配置备份和恢复
154
+
155
+ ```python
156
+ from service_forge.sft.config.sft_config import sft_config, SftConfig
157
+ import shutil
158
+ from datetime import datetime
159
+
160
+ def backup_config():
161
+ """备份当前配置"""
162
+ timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
163
+ backup_path = f"~/.sft/config_backup_{timestamp}.yaml"
164
+ backup_path = shutil.copy2(sft_config.config_file_path, backup_path)
165
+ print(f"配置已备份到: {backup_path}")
166
+ return backup_path
167
+
168
+ def restore_config(backup_path):
169
+ """从备份恢复配置"""
170
+ shutil.copy2(backup_path, sft_config.config_file_path)
171
+ # 重新加载配置
172
+ global sft_config
173
+ sft_config = SftConfig.load()
174
+ print(f"配置已从 {backup_path} 恢复")
175
+
176
+ # 使用示例
177
+ backup_path = backup_config()
178
+ # ... 进行一些配置修改 ...
179
+ # restore_config(backup_path) # 恢复配置
180
+ ```
181
+
182
+ ### 示例 3: 配置模板应用
183
+
184
+ ```python
185
+ from service_forge.sft.config.sft_config import sft_config
186
+
187
+ def apply_config_template(template_name):
188
+ """应用预定义的配置模板"""
189
+ templates = {
190
+ "local": {
191
+ "k8s_namespace": "local",
192
+ "inject_kafka_host": "localhost",
193
+ "inject_postgres_host": "localhost",
194
+ "inject_redis_host": "localhost"
195
+ },
196
+ "cloud": {
197
+ "k8s_namespace": "production",
198
+ "inject_kafka_host": "kafka.cloud.example.com",
199
+ "inject_postgres_host": "postgres.cloud.example.com",
200
+ "inject_redis_host": "redis.cloud.example.com"
201
+ },
202
+ "minimal": {
203
+ "sft_file_root": "/tmp/sft-minimal",
204
+ "k8s_namespace": "minimal"
205
+ }
206
+ }
207
+
208
+ if template_name not in templates:
209
+ raise ValueError(f"未知的模板: {template_name}")
210
+
211
+ sft_config.update(templates[template_name])
212
+ sft_config.save()
213
+ print(f"已应用 '{template_name}' 配置模板")
214
+
215
+ # 使用示例
216
+ apply_config_template("local")
217
+ ```
218
+
219
+ ## 注意事项
220
+
221
+ 1. **配置持久化**: 修改配置后必须调用 `sft_config.save()` 才能持久化到文件
222
+ 2. **只读配置**: `config_root` 是只读配置,不能通过 API 修改
223
+ 3. **配置验证**: 设置配置时会验证配置项是否存在,不存在的配置项会抛出异常
224
+ 4. **线程安全**: 配置操作不是线程安全的,多线程环境下需要加锁
225
+ 5. **配置覆盖**: 每次保存都会覆盖整个配置文件
226
+
227
+ ## 错误处理
228
+
229
+ ```python
230
+ from service_forge.sft.config.sft_config import sft_config
231
+
232
+ try:
233
+ # 尝试设置不存在的配置项
234
+ sft_config.set("invalid_key", "value")
235
+ except ValueError as e:
236
+ print(f"配置错误: {e}")
237
+
238
+ try:
239
+ # 尝试设置只读配置
240
+ sft_config.set("config_root", "/new/path")
241
+ except ValueError as e:
242
+ print(f"只读配置错误: {e}")
243
+
244
+ try:
245
+ # 保存配置时的错误处理
246
+ sft_config.save()
247
+ except Exception as e:
248
+ print(f"保存配置失败: {e}")
249
+ ```
250
+
251
+ ## 与命令行工具的对比
252
+
253
+ | 操作 | Python API | 命令行工具 |
254
+ |------|------------|------------|
255
+ | 查看所有配置 | `sft_config.to_dict()` | `sft config list` |
256
+ | 获取单个配置 | `sft_config.get(key)` | `sft config get <key>` |
257
+ | 设置配置 | `sft_config.set(key, value)` | `sft config set <key> <value>` |
258
+ | 保存配置 | `sft_config.save()` | 自动保存 |
259
+
260
+ Python API 提供了更灵活的配置管理方式,特别适合在应用程序中动态调整配置。
@@ -0,0 +1,53 @@
1
+ name: tag_service
2
+ workflows:
3
+ # - ./workflow/kafka_workflow.yaml
4
+ - ./workflow/query_tags_workflow.yaml
5
+ - ./workflow/query_tags_param_workflow.yaml
6
+ # - ./workflow/create_tag_workflow.yaml
7
+ # - ./workflow/update_tag_workflow.yaml
8
+ # - ./workflow/delete_tag_workflow.yaml
9
+ # - ./workflow/get_tags_from_record.yaml
10
+ # - ./workflow/test_sse_workflow.yaml
11
+ - ./workflow/test_websocket_workflow.yaml
12
+ # - ./workflow/test_a2a_workflow.yaml
13
+ # - ./workflow/test_context_workflow.yaml
14
+
15
+ enable_http: true
16
+ enable_kafka: false
17
+
18
+ # Following configs will be auto-injected by sft.
19
+ http_host: 0.0.0.0
20
+ http_port: 37200
21
+ kafka_host: localhost
22
+ kafka_port: 9092
23
+
24
+ databases:
25
+ # - name: tag
26
+ # postgres_user: postgres
27
+ # postgres_password: "gnBGWg7aL4"
28
+ # postgres_host: second-brain-postgres-postgresql
29
+ # postgres_port: 5432
30
+ # postgres_db: tag-service-tag
31
+
32
+ - name: tag
33
+ postgres_user: postgres
34
+ postgres_password: postgres
35
+ postgres_host: localhost
36
+ postgres_port: 5433
37
+ postgres_db: tag-service-tag
38
+
39
+ - name: tag-mongo
40
+ mongo_host: localhost
41
+ mongo_port: 27017
42
+ mongo_user: admin
43
+ mongo_db:
44
+ mongo_password: mongo123
45
+
46
+ - name: tag-redis
47
+ redis_host: localhost
48
+ redis_port: 6379
49
+ redis_password: myredispass
50
+
51
+ feedback:
52
+ api_url: http://localhost:8000/api/v1/feedback
53
+ api_timeout: 10
@@ -15,7 +15,7 @@ nodes:
15
15
  - name: http_create_tag
16
16
  type: HttpCreateTagNode
17
17
  args:
18
- outputs: []
18
+ outputs:
19
19
 
20
20
  outputs:
21
21
  - name: result
@@ -15,7 +15,7 @@ nodes:
15
15
  - name: http_delete_tag
16
16
  type: HttpDeleteTagNode
17
17
  args:
18
- outputs: []
18
+ outputs:
19
19
 
20
20
  outputs:
21
21
  - name: result
@@ -16,7 +16,7 @@ nodes:
16
16
  args:
17
17
  prompt: prompt/get_tags.md
18
18
  temperature: 0
19
- outputs: []
19
+ outputs:
20
20
 
21
21
  outputs:
22
22
  - name: result
@@ -25,4 +25,4 @@ nodes:
25
25
  app: kafka_app
26
26
  topic: <{OUTPUT_TOPIC}>
27
27
  data_type: <{OUTPUT_TOPIC_TYPE}>
28
- outputs: []
28
+ outputs: