synapse-sdk 1.0.0a23__py3-none-any.whl → 2025.12.3__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.
Files changed (228) hide show
  1. synapse_sdk/__init__.py +24 -0
  2. synapse_sdk/cli/__init__.py +310 -5
  3. synapse_sdk/cli/alias/__init__.py +22 -0
  4. synapse_sdk/cli/alias/create.py +36 -0
  5. synapse_sdk/cli/alias/dataclass.py +31 -0
  6. synapse_sdk/cli/alias/default.py +16 -0
  7. synapse_sdk/cli/alias/delete.py +15 -0
  8. synapse_sdk/cli/alias/list.py +19 -0
  9. synapse_sdk/cli/alias/read.py +15 -0
  10. synapse_sdk/cli/alias/update.py +17 -0
  11. synapse_sdk/cli/alias/utils.py +61 -0
  12. synapse_sdk/cli/code_server.py +687 -0
  13. synapse_sdk/cli/config.py +440 -0
  14. synapse_sdk/cli/devtools.py +90 -0
  15. synapse_sdk/cli/plugin/__init__.py +33 -0
  16. synapse_sdk/cli/{create_plugin.py → plugin/create.py} +2 -2
  17. synapse_sdk/{plugins/cli → cli/plugin}/publish.py +23 -15
  18. synapse_sdk/clients/agent/__init__.py +9 -3
  19. synapse_sdk/clients/agent/container.py +143 -0
  20. synapse_sdk/clients/agent/core.py +19 -0
  21. synapse_sdk/clients/agent/ray.py +298 -9
  22. synapse_sdk/clients/backend/__init__.py +30 -12
  23. synapse_sdk/clients/backend/annotation.py +13 -5
  24. synapse_sdk/clients/backend/core.py +31 -4
  25. synapse_sdk/clients/backend/data_collection.py +186 -0
  26. synapse_sdk/clients/backend/hitl.py +17 -0
  27. synapse_sdk/clients/backend/integration.py +16 -1
  28. synapse_sdk/clients/backend/ml.py +5 -1
  29. synapse_sdk/clients/backend/models.py +78 -0
  30. synapse_sdk/clients/base.py +384 -41
  31. synapse_sdk/clients/ray/serve.py +2 -0
  32. synapse_sdk/clients/validators/collections.py +31 -0
  33. synapse_sdk/devtools/config.py +94 -0
  34. synapse_sdk/devtools/server.py +41 -0
  35. synapse_sdk/devtools/streamlit_app/__init__.py +5 -0
  36. synapse_sdk/devtools/streamlit_app/app.py +128 -0
  37. synapse_sdk/devtools/streamlit_app/services/__init__.py +11 -0
  38. synapse_sdk/devtools/streamlit_app/services/job_service.py +233 -0
  39. synapse_sdk/devtools/streamlit_app/services/plugin_service.py +236 -0
  40. synapse_sdk/devtools/streamlit_app/services/serve_service.py +95 -0
  41. synapse_sdk/devtools/streamlit_app/ui/__init__.py +15 -0
  42. synapse_sdk/devtools/streamlit_app/ui/config_tab.py +76 -0
  43. synapse_sdk/devtools/streamlit_app/ui/deployment_tab.py +66 -0
  44. synapse_sdk/devtools/streamlit_app/ui/http_tab.py +125 -0
  45. synapse_sdk/devtools/streamlit_app/ui/jobs_tab.py +573 -0
  46. synapse_sdk/devtools/streamlit_app/ui/serve_tab.py +346 -0
  47. synapse_sdk/devtools/streamlit_app/ui/status_bar.py +118 -0
  48. synapse_sdk/devtools/streamlit_app/utils/__init__.py +40 -0
  49. synapse_sdk/devtools/streamlit_app/utils/json_viewer.py +197 -0
  50. synapse_sdk/devtools/streamlit_app/utils/log_formatter.py +38 -0
  51. synapse_sdk/devtools/streamlit_app/utils/styles.py +241 -0
  52. synapse_sdk/devtools/streamlit_app/utils/ui_components.py +289 -0
  53. synapse_sdk/devtools/streamlit_app.py +10 -0
  54. synapse_sdk/loggers.py +120 -9
  55. synapse_sdk/plugins/README.md +1340 -0
  56. synapse_sdk/plugins/__init__.py +0 -13
  57. synapse_sdk/plugins/categories/base.py +117 -11
  58. synapse_sdk/plugins/categories/data_validation/actions/validation.py +72 -0
  59. synapse_sdk/plugins/categories/data_validation/templates/plugin/validation.py +33 -5
  60. synapse_sdk/plugins/categories/export/actions/__init__.py +3 -0
  61. synapse_sdk/plugins/categories/export/actions/export/__init__.py +28 -0
  62. synapse_sdk/plugins/categories/export/actions/export/action.py +165 -0
  63. synapse_sdk/plugins/categories/export/actions/export/enums.py +113 -0
  64. synapse_sdk/plugins/categories/export/actions/export/exceptions.py +53 -0
  65. synapse_sdk/plugins/categories/export/actions/export/models.py +74 -0
  66. synapse_sdk/plugins/categories/export/actions/export/run.py +195 -0
  67. synapse_sdk/plugins/categories/export/actions/export/utils.py +187 -0
  68. synapse_sdk/plugins/categories/export/templates/config.yaml +21 -0
  69. synapse_sdk/plugins/categories/export/templates/plugin/__init__.py +390 -0
  70. synapse_sdk/plugins/categories/export/templates/plugin/export.py +160 -0
  71. synapse_sdk/plugins/categories/neural_net/actions/deployment.py +13 -12
  72. synapse_sdk/plugins/categories/neural_net/actions/train.py +1134 -31
  73. synapse_sdk/plugins/categories/neural_net/actions/tune.py +534 -0
  74. synapse_sdk/plugins/categories/neural_net/base/inference.py +1 -1
  75. synapse_sdk/plugins/categories/neural_net/templates/config.yaml +32 -4
  76. synapse_sdk/plugins/categories/neural_net/templates/plugin/inference.py +26 -10
  77. synapse_sdk/plugins/categories/pre_annotation/actions/__init__.py +4 -0
  78. synapse_sdk/plugins/categories/pre_annotation/actions/pre_annotation/__init__.py +3 -0
  79. synapse_sdk/plugins/categories/{export/actions/export.py → pre_annotation/actions/pre_annotation/action.py} +4 -4
  80. synapse_sdk/plugins/categories/pre_annotation/actions/to_task/__init__.py +28 -0
  81. synapse_sdk/plugins/categories/pre_annotation/actions/to_task/action.py +148 -0
  82. synapse_sdk/plugins/categories/pre_annotation/actions/to_task/enums.py +269 -0
  83. synapse_sdk/plugins/categories/pre_annotation/actions/to_task/exceptions.py +14 -0
  84. synapse_sdk/plugins/categories/pre_annotation/actions/to_task/factory.py +76 -0
  85. synapse_sdk/plugins/categories/pre_annotation/actions/to_task/models.py +100 -0
  86. synapse_sdk/plugins/categories/pre_annotation/actions/to_task/orchestrator.py +248 -0
  87. synapse_sdk/plugins/categories/pre_annotation/actions/to_task/run.py +64 -0
  88. synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/__init__.py +17 -0
  89. synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/annotation.py +265 -0
  90. synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/base.py +170 -0
  91. synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/extraction.py +83 -0
  92. synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/metrics.py +92 -0
  93. synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/preprocessor.py +243 -0
  94. synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/validation.py +143 -0
  95. synapse_sdk/plugins/categories/pre_annotation/templates/config.yaml +19 -0
  96. synapse_sdk/plugins/categories/pre_annotation/templates/plugin/to_task.py +40 -0
  97. synapse_sdk/plugins/categories/smart_tool/templates/config.yaml +2 -0
  98. synapse_sdk/plugins/categories/upload/__init__.py +0 -0
  99. synapse_sdk/plugins/categories/upload/actions/__init__.py +0 -0
  100. synapse_sdk/plugins/categories/upload/actions/upload/__init__.py +19 -0
  101. synapse_sdk/plugins/categories/upload/actions/upload/action.py +236 -0
  102. synapse_sdk/plugins/categories/upload/actions/upload/context.py +185 -0
  103. synapse_sdk/plugins/categories/upload/actions/upload/enums.py +493 -0
  104. synapse_sdk/plugins/categories/upload/actions/upload/exceptions.py +36 -0
  105. synapse_sdk/plugins/categories/upload/actions/upload/factory.py +138 -0
  106. synapse_sdk/plugins/categories/upload/actions/upload/models.py +214 -0
  107. synapse_sdk/plugins/categories/upload/actions/upload/orchestrator.py +183 -0
  108. synapse_sdk/plugins/categories/upload/actions/upload/registry.py +113 -0
  109. synapse_sdk/plugins/categories/upload/actions/upload/run.py +179 -0
  110. synapse_sdk/plugins/categories/upload/actions/upload/steps/__init__.py +1 -0
  111. synapse_sdk/plugins/categories/upload/actions/upload/steps/base.py +107 -0
  112. synapse_sdk/plugins/categories/upload/actions/upload/steps/cleanup.py +62 -0
  113. synapse_sdk/plugins/categories/upload/actions/upload/steps/collection.py +63 -0
  114. synapse_sdk/plugins/categories/upload/actions/upload/steps/generate.py +91 -0
  115. synapse_sdk/plugins/categories/upload/actions/upload/steps/initialize.py +82 -0
  116. synapse_sdk/plugins/categories/upload/actions/upload/steps/metadata.py +235 -0
  117. synapse_sdk/plugins/categories/upload/actions/upload/steps/organize.py +201 -0
  118. synapse_sdk/plugins/categories/upload/actions/upload/steps/upload.py +104 -0
  119. synapse_sdk/plugins/categories/upload/actions/upload/steps/validate.py +71 -0
  120. synapse_sdk/plugins/categories/upload/actions/upload/strategies/__init__.py +1 -0
  121. synapse_sdk/plugins/categories/upload/actions/upload/strategies/base.py +82 -0
  122. synapse_sdk/plugins/categories/upload/actions/upload/strategies/data_unit/__init__.py +1 -0
  123. synapse_sdk/plugins/categories/upload/actions/upload/strategies/data_unit/batch.py +39 -0
  124. synapse_sdk/plugins/categories/upload/actions/upload/strategies/data_unit/single.py +29 -0
  125. synapse_sdk/plugins/categories/upload/actions/upload/strategies/file_discovery/__init__.py +1 -0
  126. synapse_sdk/plugins/categories/upload/actions/upload/strategies/file_discovery/flat.py +300 -0
  127. synapse_sdk/plugins/categories/upload/actions/upload/strategies/file_discovery/recursive.py +287 -0
  128. synapse_sdk/plugins/categories/upload/actions/upload/strategies/metadata/__init__.py +1 -0
  129. synapse_sdk/plugins/categories/upload/actions/upload/strategies/metadata/excel.py +174 -0
  130. synapse_sdk/plugins/categories/upload/actions/upload/strategies/metadata/none.py +16 -0
  131. synapse_sdk/plugins/categories/upload/actions/upload/strategies/upload/__init__.py +1 -0
  132. synapse_sdk/plugins/categories/upload/actions/upload/strategies/upload/sync.py +84 -0
  133. synapse_sdk/plugins/categories/upload/actions/upload/strategies/validation/__init__.py +1 -0
  134. synapse_sdk/plugins/categories/upload/actions/upload/strategies/validation/default.py +60 -0
  135. synapse_sdk/plugins/categories/upload/actions/upload/utils.py +250 -0
  136. synapse_sdk/plugins/categories/upload/templates/README.md +470 -0
  137. synapse_sdk/plugins/categories/upload/templates/config.yaml +33 -0
  138. synapse_sdk/plugins/categories/upload/templates/plugin/__init__.py +310 -0
  139. synapse_sdk/plugins/categories/upload/templates/plugin/upload.py +102 -0
  140. synapse_sdk/plugins/enums.py +3 -1
  141. synapse_sdk/plugins/models.py +148 -11
  142. synapse_sdk/plugins/templates/plugin-config-schema.json +406 -0
  143. synapse_sdk/plugins/templates/schema.json +491 -0
  144. synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/config.yaml +1 -0
  145. synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/requirements.txt +1 -1
  146. synapse_sdk/plugins/utils/__init__.py +46 -0
  147. synapse_sdk/plugins/utils/actions.py +119 -0
  148. synapse_sdk/plugins/utils/config.py +203 -0
  149. synapse_sdk/plugins/{utils.py → utils/legacy.py} +26 -46
  150. synapse_sdk/plugins/utils/ray_gcs.py +66 -0
  151. synapse_sdk/plugins/utils/registry.py +58 -0
  152. synapse_sdk/shared/__init__.py +25 -0
  153. synapse_sdk/shared/enums.py +93 -0
  154. synapse_sdk/types.py +19 -0
  155. synapse_sdk/utils/converters/__init__.py +240 -0
  156. synapse_sdk/utils/converters/coco/__init__.py +0 -0
  157. synapse_sdk/utils/converters/coco/from_dm.py +322 -0
  158. synapse_sdk/utils/converters/coco/to_dm.py +215 -0
  159. synapse_sdk/utils/converters/dm/__init__.py +57 -0
  160. synapse_sdk/utils/converters/dm/base.py +137 -0
  161. synapse_sdk/utils/converters/dm/from_v1.py +273 -0
  162. synapse_sdk/utils/converters/dm/to_v1.py +321 -0
  163. synapse_sdk/utils/converters/dm/tools/__init__.py +214 -0
  164. synapse_sdk/utils/converters/dm/tools/answer.py +95 -0
  165. synapse_sdk/utils/converters/dm/tools/bounding_box.py +132 -0
  166. synapse_sdk/utils/converters/dm/tools/bounding_box_3d.py +121 -0
  167. synapse_sdk/utils/converters/dm/tools/classification.py +75 -0
  168. synapse_sdk/utils/converters/dm/tools/keypoint.py +117 -0
  169. synapse_sdk/utils/converters/dm/tools/named_entity.py +111 -0
  170. synapse_sdk/utils/converters/dm/tools/polygon.py +122 -0
  171. synapse_sdk/utils/converters/dm/tools/polyline.py +124 -0
  172. synapse_sdk/utils/converters/dm/tools/prompt.py +94 -0
  173. synapse_sdk/utils/converters/dm/tools/relation.py +86 -0
  174. synapse_sdk/utils/converters/dm/tools/segmentation.py +141 -0
  175. synapse_sdk/utils/converters/dm/tools/segmentation_3d.py +83 -0
  176. synapse_sdk/utils/converters/dm/types.py +168 -0
  177. synapse_sdk/utils/converters/dm/utils.py +162 -0
  178. synapse_sdk/utils/converters/dm_legacy/__init__.py +56 -0
  179. synapse_sdk/utils/converters/dm_legacy/from_v1.py +627 -0
  180. synapse_sdk/utils/converters/dm_legacy/to_v1.py +367 -0
  181. synapse_sdk/utils/converters/pascal/__init__.py +0 -0
  182. synapse_sdk/utils/converters/pascal/from_dm.py +244 -0
  183. synapse_sdk/utils/converters/pascal/to_dm.py +214 -0
  184. synapse_sdk/utils/converters/yolo/__init__.py +0 -0
  185. synapse_sdk/utils/converters/yolo/from_dm.py +384 -0
  186. synapse_sdk/utils/converters/yolo/to_dm.py +267 -0
  187. synapse_sdk/utils/dataset.py +46 -0
  188. synapse_sdk/utils/encryption.py +158 -0
  189. synapse_sdk/utils/file/__init__.py +58 -0
  190. synapse_sdk/utils/file/archive.py +32 -0
  191. synapse_sdk/utils/file/checksum.py +56 -0
  192. synapse_sdk/utils/file/chunking.py +31 -0
  193. synapse_sdk/utils/file/download.py +385 -0
  194. synapse_sdk/utils/file/encoding.py +40 -0
  195. synapse_sdk/utils/file/io.py +22 -0
  196. synapse_sdk/utils/file/upload.py +165 -0
  197. synapse_sdk/utils/file/video/__init__.py +29 -0
  198. synapse_sdk/utils/file/video/transcode.py +307 -0
  199. synapse_sdk/utils/file.py.backup +301 -0
  200. synapse_sdk/utils/http.py +138 -0
  201. synapse_sdk/utils/network.py +309 -0
  202. synapse_sdk/utils/storage/__init__.py +72 -0
  203. synapse_sdk/utils/storage/providers/__init__.py +183 -0
  204. synapse_sdk/utils/storage/providers/file_system.py +134 -0
  205. synapse_sdk/utils/storage/providers/gcp.py +13 -0
  206. synapse_sdk/utils/storage/providers/http.py +190 -0
  207. synapse_sdk/utils/storage/providers/s3.py +91 -0
  208. synapse_sdk/utils/storage/providers/sftp.py +47 -0
  209. synapse_sdk/utils/storage/registry.py +17 -0
  210. synapse_sdk-2025.12.3.dist-info/METADATA +123 -0
  211. synapse_sdk-2025.12.3.dist-info/RECORD +279 -0
  212. {synapse_sdk-1.0.0a23.dist-info → synapse_sdk-2025.12.3.dist-info}/WHEEL +1 -1
  213. synapse_sdk/clients/backend/dataset.py +0 -51
  214. synapse_sdk/plugins/categories/import/actions/import.py +0 -10
  215. synapse_sdk/plugins/cli/__init__.py +0 -21
  216. synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/.env +0 -24
  217. synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/.env.dist +0 -24
  218. synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/main.py +0 -4
  219. synapse_sdk/utils/file.py +0 -168
  220. synapse_sdk/utils/storage.py +0 -91
  221. synapse_sdk-1.0.0a23.dist-info/METADATA +0 -44
  222. synapse_sdk-1.0.0a23.dist-info/RECORD +0 -114
  223. /synapse_sdk/{plugins/cli → cli/plugin}/run.py +0 -0
  224. /synapse_sdk/{plugins/categories/import → clients/validators}/__init__.py +0 -0
  225. /synapse_sdk/{plugins/categories/import/actions → devtools}/__init__.py +0 -0
  226. {synapse_sdk-1.0.0a23.dist-info → synapse_sdk-2025.12.3.dist-info}/entry_points.txt +0 -0
  227. {synapse_sdk-1.0.0a23.dist-info → synapse_sdk-2025.12.3.dist-info/licenses}/LICENSE +0 -0
  228. {synapse_sdk-1.0.0a23.dist-info → synapse_sdk-2025.12.3.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,95 @@
1
+ """Serve service for managing serve deployments."""
2
+
3
+ from typing import Dict, List, Optional
4
+
5
+ from synapse_sdk.clients.backend import BackendClient
6
+ from synapse_sdk.clients.exceptions import ClientError
7
+
8
+
9
+ class ServeService:
10
+ """Service for serve deployment operations."""
11
+
12
+ def __init__(self, backend_client: Optional[BackendClient] = None):
13
+ self.backend_client = backend_client
14
+
15
+ def list_serve_applications(self, agent_id: Optional[int] = None, agent_info: Optional[Dict] = None) -> List[Dict]:
16
+ """List serve applications from the backend."""
17
+ if not self.backend_client:
18
+ return []
19
+
20
+ try:
21
+ params = {}
22
+ if agent_id:
23
+ params['agent'] = agent_id
24
+
25
+ apps_response = self.backend_client.list_serve_applications(params=params)
26
+
27
+ # Handle paginated response - extract results
28
+ if apps_response is None:
29
+ return []
30
+ elif isinstance(apps_response, dict) and 'results' in apps_response:
31
+ applications = apps_response['results']
32
+ else:
33
+ applications = apps_response if isinstance(apps_response, list) else []
34
+
35
+ # Remove None applications
36
+ valid_apps = [app for app in applications if app is not None]
37
+
38
+ # Try to enrich applications with plugin and agent names
39
+ enriched_apps = []
40
+ for app in valid_apps:
41
+ enriched_app = app.copy()
42
+
43
+ # Try to get plugin info
44
+ if 'plugin_release' in app:
45
+ try:
46
+ # Try to fetch plugin release details
47
+ plugin_release_response = self.backend_client.get(f'/plugin_releases/{app["plugin_release"]}/')
48
+ if plugin_release_response and isinstance(plugin_release_response, dict):
49
+ # Get version from plugin release
50
+ enriched_app['plugin_version'] = plugin_release_response.get('version')
51
+
52
+ # Try to get plugin details from the plugin ID
53
+ plugin_id = plugin_release_response.get('plugin')
54
+ if plugin_id:
55
+ try:
56
+ plugin_response = self.backend_client.get(f'/plugins/{plugin_id}/')
57
+ if plugin_response and isinstance(plugin_response, dict):
58
+ enriched_app['plugin_name'] = plugin_response.get('name')
59
+ enriched_app['plugin_code'] = plugin_response.get('code')
60
+ except Exception:
61
+ # Fallback to config if plugin fetch fails
62
+ config = plugin_release_response.get('config', {})
63
+ enriched_app['plugin_name'] = config.get('name') or config.get('code')
64
+ enriched_app['plugin_code'] = config.get('code')
65
+ else:
66
+ # Fallback to config if no plugin ID
67
+ config = plugin_release_response.get('config', {})
68
+ enriched_app['plugin_name'] = config.get('name') or config.get('code')
69
+ enriched_app['plugin_code'] = config.get('code')
70
+ except Exception:
71
+ pass
72
+
73
+ # Try to get agent info
74
+ if 'agent' in app:
75
+ # First check if we have local agent info
76
+ if agent_info and app.get('agent') == agent_id:
77
+ enriched_app['agent_name'] = agent_info.get('name')
78
+ enriched_app['agent_url'] = agent_info.get('url')
79
+ else:
80
+ # Try to fetch agent details from API
81
+ try:
82
+ agent_response = self.backend_client.get(f'/agents/{app["agent"]}/')
83
+ if agent_response and isinstance(agent_response, dict):
84
+ enriched_app['agent_name'] = agent_response.get('name')
85
+ enriched_app['agent_url'] = agent_response.get('url')
86
+ except Exception:
87
+ pass
88
+
89
+ enriched_apps.append(enriched_app)
90
+
91
+ return enriched_apps
92
+ except ClientError:
93
+ raise
94
+ except Exception as e:
95
+ raise Exception(f'Failed to list serve applications: {e}')
@@ -0,0 +1,15 @@
1
+ """UI components for the Streamlit app."""
2
+
3
+ from .config_tab import ConfigTab
4
+ from .deployment_tab import DeploymentTab
5
+ from .http_tab import HttpTab
6
+ from .jobs_tab import JobsTab
7
+ from .serve_tab import ServeTab
8
+
9
+ __all__ = [
10
+ 'ConfigTab',
11
+ 'DeploymentTab',
12
+ 'HttpTab',
13
+ 'JobsTab',
14
+ 'ServeTab',
15
+ ]
@@ -0,0 +1,76 @@
1
+ """Configuration tab UI component."""
2
+
3
+ import streamlit as st
4
+
5
+ from ..services.plugin_service import PluginService
6
+ from ..utils.ui_components import render_info_card
7
+
8
+
9
+ class ConfigTab:
10
+ """UI component for the Configuration tab."""
11
+
12
+ def __init__(self, plugin_service: PluginService):
13
+ self.plugin_service = plugin_service
14
+
15
+ def render(self):
16
+ """Render the Configuration tab."""
17
+ config = st.session_state.get('config', self.plugin_service.load_config())
18
+
19
+ if not config:
20
+ render_info_card(
21
+ 'No Configuration',
22
+ 'No plugin configuration file found. Please create a config.yaml file.',
23
+ type='error',
24
+ )
25
+ return
26
+
27
+ # Display file path
28
+ render_info_card('Configuration File', str(self.plugin_service.config_path), type='neutral', icon='📁')
29
+
30
+ # Configuration form
31
+ with st.form('config_form'):
32
+ col1, col2 = st.columns(2)
33
+
34
+ with col1:
35
+ config['name'] = st.text_input('Plugin Name', value=config.get('name', ''))
36
+ config['code'] = st.text_input('Code', value=config.get('code', ''))
37
+ config['version'] = st.text_input('Version', value=config.get('version', ''))
38
+
39
+ categories = [
40
+ 'neural_net',
41
+ 'export',
42
+ 'upload',
43
+ 'smart_tool',
44
+ 'post_annotation',
45
+ 'pre_annotation',
46
+ 'data_validation',
47
+ ]
48
+ current_category = config.get('category', '')
49
+ category_index = categories.index(current_category) if current_category in categories else 0
50
+ config['category'] = st.selectbox('Category', categories, index=category_index)
51
+
52
+ with col2:
53
+ data_types = ['image', 'text', 'video', 'pcd', 'audio']
54
+ current_data_type = config.get('data_type', '')
55
+ data_type_index = data_types.index(current_data_type) if current_data_type in data_types else 0
56
+ config['data_type'] = st.selectbox('Data Type', data_types, index=data_type_index)
57
+
58
+ package_managers = ['pip', 'uv']
59
+ current_pm = config.get('package_manager', '')
60
+ pm_index = package_managers.index(current_pm) if current_pm in package_managers else 0
61
+ config['package_manager'] = st.selectbox('Package Manager', package_managers, index=pm_index)
62
+
63
+ config['description'] = st.text_area('Description', value=config.get('description', ''), height=100)
64
+
65
+ config_tasks = config.get('tasks', [])
66
+ tasks_str = ', '.join(config_tasks) if isinstance(config_tasks, list) else config.get('tasks', '')
67
+ tasks_input = st.text_input('Task Types (comma-separated)', value=tasks_str)
68
+ config['tasks'] = [t.strip() for t in tasks_input.split(',') if t.strip()]
69
+
70
+ if st.form_submit_button('Save Configuration', type='primary'):
71
+ st.session_state['config'] = config
72
+ if self.plugin_service.save_config(config):
73
+ st.success('✅ Configuration saved successfully!')
74
+ st.rerun()
75
+ else:
76
+ st.error('Failed to save configuration')
@@ -0,0 +1,66 @@
1
+ """Deployment tab UI component."""
2
+
3
+ import os
4
+
5
+ import streamlit as st
6
+
7
+ from synapse_sdk.devtools.config import get_backend_config
8
+
9
+ from ..services.plugin_service import PluginService
10
+ from ..utils.ui_components import (
11
+ render_action_button,
12
+ render_divider,
13
+ render_info_card,
14
+ render_key_value_pair,
15
+ )
16
+
17
+
18
+ class DeploymentTab:
19
+ """UI component for the Deployment tab."""
20
+
21
+ def __init__(self, plugin_service: PluginService):
22
+ self.plugin_service = plugin_service
23
+
24
+ def render(self):
25
+ """Render the Deployment tab."""
26
+ backend_config = get_backend_config()
27
+ if not backend_config:
28
+ st.error('Backend not configured')
29
+ return
30
+
31
+ # Display current configuration
32
+ col1, col2 = st.columns(2)
33
+ with col1:
34
+ st.text_input('Backend URL', value=backend_config['host'], disabled=True)
35
+ with col2:
36
+ st.text_input('Access Token', value='••••••••', disabled=True, type='password')
37
+
38
+ # Debug options
39
+ debug_mode = st.checkbox('Enable Debug Mode', value=True)
40
+ debug_modules = st.text_input('Debug Modules (comma-separated)', placeholder='module1,module2')
41
+
42
+ # Publish button
43
+ if render_action_button(
44
+ 'Publish Plugin', key='publish_plugin', icon='🚀', type='primary', use_container_width=True
45
+ ):
46
+ with st.spinner('Publishing plugin...'):
47
+ # Set debug modules env var if provided
48
+ if debug_modules:
49
+ os.environ['SYNAPSE_DEBUG_MODULES'] = debug_modules
50
+
51
+ result = self.plugin_service.publish_plugin(backend_config['host'], backend_config['token'], debug_mode)
52
+
53
+ if result['success']:
54
+ render_info_card('Published Successfully!', result['message'], type='success', icon='✅')
55
+
56
+ render_divider()
57
+
58
+ col1, col2, col3 = st.columns(3)
59
+ with col1:
60
+ render_key_value_pair('Plugin Code', result['plugin_code'], monospace_value=True, inline=False)
61
+ with col2:
62
+ render_key_value_pair('Version', result['version'], inline=False)
63
+ with col3:
64
+ render_key_value_pair('Name', result['name'], inline=False)
65
+ else:
66
+ render_info_card('Publication Failed', result['error'], type='error', icon='❌')
@@ -0,0 +1,125 @@
1
+ """HTTP Request tab UI component."""
2
+
3
+ import json
4
+ from typing import Optional
5
+
6
+ import streamlit as st
7
+ from streamlit_ace import st_ace
8
+
9
+ from synapse_sdk.devtools.config import get_backend_config
10
+
11
+ from ..services.plugin_service import PluginService
12
+ from ..utils.json_viewer import render_json_compact
13
+ from ..utils.ui_components import render_action_button, render_info_card, render_section_header
14
+
15
+
16
+ class HttpTab:
17
+ """UI component for the HTTP Request tab."""
18
+
19
+ def __init__(self, plugin_service: PluginService, agent_id: Optional[int] = None):
20
+ self.plugin_service = plugin_service
21
+ self.agent_id = agent_id
22
+
23
+ def render(self):
24
+ """Render the HTTP Request tab."""
25
+ config = st.session_state.get('config', self.plugin_service.load_config())
26
+ if not config:
27
+ st.error('Please configure your plugin first')
28
+ return
29
+
30
+ # Get available actions
31
+ actions = list(config.get('actions', {}).keys())
32
+ if not actions:
33
+ st.warning('No actions configured in your plugin')
34
+ return
35
+
36
+ # Backend configuration check
37
+ backend_config = get_backend_config()
38
+ if not backend_config:
39
+ st.error('❌ Backend not configured')
40
+ return
41
+
42
+ # Action selection
43
+ selected_action = st.selectbox('Select Action', actions)
44
+
45
+ # Load parameters from test.http
46
+ test_http_params = self.plugin_service.parse_test_http()
47
+ default_params = test_http_params.get(selected_action, {})
48
+
49
+ # Parameters editor
50
+ render_section_header('Parameters', 'Parameters are automatically saved to test.http when request succeeds')
51
+ render_info_card(
52
+ 'Editor Note',
53
+ 'Ctrl+Enter keyboard shortcut is not available in the editor. Use the Execute button below.',
54
+ type='info',
55
+ icon='ℹ️',
56
+ )
57
+
58
+ params_str = st_ace(
59
+ value=json.dumps(default_params, indent=2),
60
+ language='json',
61
+ theme='monokai',
62
+ key=f'params_{selected_action}',
63
+ height=300,
64
+ auto_update=False,
65
+ font_size=14,
66
+ )
67
+
68
+ # Execute button
69
+ col1, col2 = st.columns([2, 1])
70
+ with col1:
71
+ execute_btn = render_action_button(
72
+ 'Execute Request', key='execute_request', icon='▶', type='primary', use_container_width=True
73
+ )
74
+ with col2:
75
+ debug_mode = st.checkbox('Debug mode', value=True)
76
+
77
+ # Show endpoint reference
78
+ with st.expander('Endpoint Reference'):
79
+ plugin_code = config.get('code', 'plugin_code')
80
+ st.code(
81
+ f"""POST {backend_config['host']}/plugins/{plugin_code}/run/
82
+ Content-Type: application/json
83
+ Accept: application/json; indent=4
84
+ SYNAPSE-Access-Token: Token ••••••••
85
+
86
+ {{
87
+ "agent": {self.agent_id or 2},
88
+ "action": "{selected_action}",
89
+ "params": {params_str},
90
+ "debug": {str(debug_mode).lower()}
91
+ }}""",
92
+ language='http',
93
+ )
94
+
95
+ # Execute request
96
+ if execute_btn:
97
+ try:
98
+ params = json.loads(params_str)
99
+
100
+ with st.spinner('Executing request...'):
101
+ result = self.plugin_service.execute_plugin_action(
102
+ selected_action, params, config.get('code'), self.agent_id, debug_mode
103
+ )
104
+
105
+ # Display result
106
+ if result['success']:
107
+ st.success(f'Success - Status: {result["status_code"]} - Time: {result["execution_time"]}ms')
108
+
109
+ # Auto-save params on successful execution
110
+ if self.plugin_service.update_test_http_params(selected_action, params):
111
+ st.info('Parameters saved to test.http')
112
+ else:
113
+ status_code = result.get('status_code', 'Unknown')
114
+ exec_time = result.get('execution_time', 0)
115
+ st.error(f'Failed - Status: {status_code} - Time: {exec_time}ms')
116
+
117
+ # Show response
118
+ if 'response_data' in result:
119
+ st.markdown("<div style='margin-top: 20px;'></div>", unsafe_allow_html=True)
120
+ render_json_compact(result['response_data'], 'Response')
121
+ elif 'error' in result:
122
+ st.error(result['error'])
123
+
124
+ except json.JSONDecodeError as e:
125
+ st.error(f'Invalid JSON: {e}')