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.
- synapse_sdk/__init__.py +24 -0
- synapse_sdk/cli/__init__.py +310 -5
- synapse_sdk/cli/alias/__init__.py +22 -0
- synapse_sdk/cli/alias/create.py +36 -0
- synapse_sdk/cli/alias/dataclass.py +31 -0
- synapse_sdk/cli/alias/default.py +16 -0
- synapse_sdk/cli/alias/delete.py +15 -0
- synapse_sdk/cli/alias/list.py +19 -0
- synapse_sdk/cli/alias/read.py +15 -0
- synapse_sdk/cli/alias/update.py +17 -0
- synapse_sdk/cli/alias/utils.py +61 -0
- synapse_sdk/cli/code_server.py +687 -0
- synapse_sdk/cli/config.py +440 -0
- synapse_sdk/cli/devtools.py +90 -0
- synapse_sdk/cli/plugin/__init__.py +33 -0
- synapse_sdk/cli/{create_plugin.py → plugin/create.py} +2 -2
- synapse_sdk/{plugins/cli → cli/plugin}/publish.py +23 -15
- synapse_sdk/clients/agent/__init__.py +9 -3
- synapse_sdk/clients/agent/container.py +143 -0
- synapse_sdk/clients/agent/core.py +19 -0
- synapse_sdk/clients/agent/ray.py +298 -9
- synapse_sdk/clients/backend/__init__.py +30 -12
- synapse_sdk/clients/backend/annotation.py +13 -5
- synapse_sdk/clients/backend/core.py +31 -4
- synapse_sdk/clients/backend/data_collection.py +186 -0
- synapse_sdk/clients/backend/hitl.py +17 -0
- synapse_sdk/clients/backend/integration.py +16 -1
- synapse_sdk/clients/backend/ml.py +5 -1
- synapse_sdk/clients/backend/models.py +78 -0
- synapse_sdk/clients/base.py +384 -41
- synapse_sdk/clients/ray/serve.py +2 -0
- synapse_sdk/clients/validators/collections.py +31 -0
- synapse_sdk/devtools/config.py +94 -0
- synapse_sdk/devtools/server.py +41 -0
- synapse_sdk/devtools/streamlit_app/__init__.py +5 -0
- synapse_sdk/devtools/streamlit_app/app.py +128 -0
- synapse_sdk/devtools/streamlit_app/services/__init__.py +11 -0
- synapse_sdk/devtools/streamlit_app/services/job_service.py +233 -0
- synapse_sdk/devtools/streamlit_app/services/plugin_service.py +236 -0
- synapse_sdk/devtools/streamlit_app/services/serve_service.py +95 -0
- synapse_sdk/devtools/streamlit_app/ui/__init__.py +15 -0
- synapse_sdk/devtools/streamlit_app/ui/config_tab.py +76 -0
- synapse_sdk/devtools/streamlit_app/ui/deployment_tab.py +66 -0
- synapse_sdk/devtools/streamlit_app/ui/http_tab.py +125 -0
- synapse_sdk/devtools/streamlit_app/ui/jobs_tab.py +573 -0
- synapse_sdk/devtools/streamlit_app/ui/serve_tab.py +346 -0
- synapse_sdk/devtools/streamlit_app/ui/status_bar.py +118 -0
- synapse_sdk/devtools/streamlit_app/utils/__init__.py +40 -0
- synapse_sdk/devtools/streamlit_app/utils/json_viewer.py +197 -0
- synapse_sdk/devtools/streamlit_app/utils/log_formatter.py +38 -0
- synapse_sdk/devtools/streamlit_app/utils/styles.py +241 -0
- synapse_sdk/devtools/streamlit_app/utils/ui_components.py +289 -0
- synapse_sdk/devtools/streamlit_app.py +10 -0
- synapse_sdk/loggers.py +120 -9
- synapse_sdk/plugins/README.md +1340 -0
- synapse_sdk/plugins/__init__.py +0 -13
- synapse_sdk/plugins/categories/base.py +117 -11
- synapse_sdk/plugins/categories/data_validation/actions/validation.py +72 -0
- synapse_sdk/plugins/categories/data_validation/templates/plugin/validation.py +33 -5
- synapse_sdk/plugins/categories/export/actions/__init__.py +3 -0
- synapse_sdk/plugins/categories/export/actions/export/__init__.py +28 -0
- synapse_sdk/plugins/categories/export/actions/export/action.py +165 -0
- synapse_sdk/plugins/categories/export/actions/export/enums.py +113 -0
- synapse_sdk/plugins/categories/export/actions/export/exceptions.py +53 -0
- synapse_sdk/plugins/categories/export/actions/export/models.py +74 -0
- synapse_sdk/plugins/categories/export/actions/export/run.py +195 -0
- synapse_sdk/plugins/categories/export/actions/export/utils.py +187 -0
- synapse_sdk/plugins/categories/export/templates/config.yaml +21 -0
- synapse_sdk/plugins/categories/export/templates/plugin/__init__.py +390 -0
- synapse_sdk/plugins/categories/export/templates/plugin/export.py +160 -0
- synapse_sdk/plugins/categories/neural_net/actions/deployment.py +13 -12
- synapse_sdk/plugins/categories/neural_net/actions/train.py +1134 -31
- synapse_sdk/plugins/categories/neural_net/actions/tune.py +534 -0
- synapse_sdk/plugins/categories/neural_net/base/inference.py +1 -1
- synapse_sdk/plugins/categories/neural_net/templates/config.yaml +32 -4
- synapse_sdk/plugins/categories/neural_net/templates/plugin/inference.py +26 -10
- synapse_sdk/plugins/categories/pre_annotation/actions/__init__.py +4 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/pre_annotation/__init__.py +3 -0
- synapse_sdk/plugins/categories/{export/actions/export.py → pre_annotation/actions/pre_annotation/action.py} +4 -4
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/__init__.py +28 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/action.py +148 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/enums.py +269 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/exceptions.py +14 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/factory.py +76 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/models.py +100 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/orchestrator.py +248 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/run.py +64 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/__init__.py +17 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/annotation.py +265 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/base.py +170 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/extraction.py +83 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/metrics.py +92 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/preprocessor.py +243 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/validation.py +143 -0
- synapse_sdk/plugins/categories/pre_annotation/templates/config.yaml +19 -0
- synapse_sdk/plugins/categories/pre_annotation/templates/plugin/to_task.py +40 -0
- synapse_sdk/plugins/categories/smart_tool/templates/config.yaml +2 -0
- synapse_sdk/plugins/categories/upload/__init__.py +0 -0
- synapse_sdk/plugins/categories/upload/actions/__init__.py +0 -0
- synapse_sdk/plugins/categories/upload/actions/upload/__init__.py +19 -0
- synapse_sdk/plugins/categories/upload/actions/upload/action.py +236 -0
- synapse_sdk/plugins/categories/upload/actions/upload/context.py +185 -0
- synapse_sdk/plugins/categories/upload/actions/upload/enums.py +493 -0
- synapse_sdk/plugins/categories/upload/actions/upload/exceptions.py +36 -0
- synapse_sdk/plugins/categories/upload/actions/upload/factory.py +138 -0
- synapse_sdk/plugins/categories/upload/actions/upload/models.py +214 -0
- synapse_sdk/plugins/categories/upload/actions/upload/orchestrator.py +183 -0
- synapse_sdk/plugins/categories/upload/actions/upload/registry.py +113 -0
- synapse_sdk/plugins/categories/upload/actions/upload/run.py +179 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/__init__.py +1 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/base.py +107 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/cleanup.py +62 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/collection.py +63 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/generate.py +91 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/initialize.py +82 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/metadata.py +235 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/organize.py +201 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/upload.py +104 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/validate.py +71 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/__init__.py +1 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/base.py +82 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/data_unit/__init__.py +1 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/data_unit/batch.py +39 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/data_unit/single.py +29 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/file_discovery/__init__.py +1 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/file_discovery/flat.py +300 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/file_discovery/recursive.py +287 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/metadata/__init__.py +1 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/metadata/excel.py +174 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/metadata/none.py +16 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/upload/__init__.py +1 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/upload/sync.py +84 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/validation/__init__.py +1 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/validation/default.py +60 -0
- synapse_sdk/plugins/categories/upload/actions/upload/utils.py +250 -0
- synapse_sdk/plugins/categories/upload/templates/README.md +470 -0
- synapse_sdk/plugins/categories/upload/templates/config.yaml +33 -0
- synapse_sdk/plugins/categories/upload/templates/plugin/__init__.py +310 -0
- synapse_sdk/plugins/categories/upload/templates/plugin/upload.py +102 -0
- synapse_sdk/plugins/enums.py +3 -1
- synapse_sdk/plugins/models.py +148 -11
- synapse_sdk/plugins/templates/plugin-config-schema.json +406 -0
- synapse_sdk/plugins/templates/schema.json +491 -0
- synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/config.yaml +1 -0
- synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/requirements.txt +1 -1
- synapse_sdk/plugins/utils/__init__.py +46 -0
- synapse_sdk/plugins/utils/actions.py +119 -0
- synapse_sdk/plugins/utils/config.py +203 -0
- synapse_sdk/plugins/{utils.py → utils/legacy.py} +26 -46
- synapse_sdk/plugins/utils/ray_gcs.py +66 -0
- synapse_sdk/plugins/utils/registry.py +58 -0
- synapse_sdk/shared/__init__.py +25 -0
- synapse_sdk/shared/enums.py +93 -0
- synapse_sdk/types.py +19 -0
- synapse_sdk/utils/converters/__init__.py +240 -0
- synapse_sdk/utils/converters/coco/__init__.py +0 -0
- synapse_sdk/utils/converters/coco/from_dm.py +322 -0
- synapse_sdk/utils/converters/coco/to_dm.py +215 -0
- synapse_sdk/utils/converters/dm/__init__.py +57 -0
- synapse_sdk/utils/converters/dm/base.py +137 -0
- synapse_sdk/utils/converters/dm/from_v1.py +273 -0
- synapse_sdk/utils/converters/dm/to_v1.py +321 -0
- synapse_sdk/utils/converters/dm/tools/__init__.py +214 -0
- synapse_sdk/utils/converters/dm/tools/answer.py +95 -0
- synapse_sdk/utils/converters/dm/tools/bounding_box.py +132 -0
- synapse_sdk/utils/converters/dm/tools/bounding_box_3d.py +121 -0
- synapse_sdk/utils/converters/dm/tools/classification.py +75 -0
- synapse_sdk/utils/converters/dm/tools/keypoint.py +117 -0
- synapse_sdk/utils/converters/dm/tools/named_entity.py +111 -0
- synapse_sdk/utils/converters/dm/tools/polygon.py +122 -0
- synapse_sdk/utils/converters/dm/tools/polyline.py +124 -0
- synapse_sdk/utils/converters/dm/tools/prompt.py +94 -0
- synapse_sdk/utils/converters/dm/tools/relation.py +86 -0
- synapse_sdk/utils/converters/dm/tools/segmentation.py +141 -0
- synapse_sdk/utils/converters/dm/tools/segmentation_3d.py +83 -0
- synapse_sdk/utils/converters/dm/types.py +168 -0
- synapse_sdk/utils/converters/dm/utils.py +162 -0
- synapse_sdk/utils/converters/dm_legacy/__init__.py +56 -0
- synapse_sdk/utils/converters/dm_legacy/from_v1.py +627 -0
- synapse_sdk/utils/converters/dm_legacy/to_v1.py +367 -0
- synapse_sdk/utils/converters/pascal/__init__.py +0 -0
- synapse_sdk/utils/converters/pascal/from_dm.py +244 -0
- synapse_sdk/utils/converters/pascal/to_dm.py +214 -0
- synapse_sdk/utils/converters/yolo/__init__.py +0 -0
- synapse_sdk/utils/converters/yolo/from_dm.py +384 -0
- synapse_sdk/utils/converters/yolo/to_dm.py +267 -0
- synapse_sdk/utils/dataset.py +46 -0
- synapse_sdk/utils/encryption.py +158 -0
- synapse_sdk/utils/file/__init__.py +58 -0
- synapse_sdk/utils/file/archive.py +32 -0
- synapse_sdk/utils/file/checksum.py +56 -0
- synapse_sdk/utils/file/chunking.py +31 -0
- synapse_sdk/utils/file/download.py +385 -0
- synapse_sdk/utils/file/encoding.py +40 -0
- synapse_sdk/utils/file/io.py +22 -0
- synapse_sdk/utils/file/upload.py +165 -0
- synapse_sdk/utils/file/video/__init__.py +29 -0
- synapse_sdk/utils/file/video/transcode.py +307 -0
- synapse_sdk/utils/file.py.backup +301 -0
- synapse_sdk/utils/http.py +138 -0
- synapse_sdk/utils/network.py +309 -0
- synapse_sdk/utils/storage/__init__.py +72 -0
- synapse_sdk/utils/storage/providers/__init__.py +183 -0
- synapse_sdk/utils/storage/providers/file_system.py +134 -0
- synapse_sdk/utils/storage/providers/gcp.py +13 -0
- synapse_sdk/utils/storage/providers/http.py +190 -0
- synapse_sdk/utils/storage/providers/s3.py +91 -0
- synapse_sdk/utils/storage/providers/sftp.py +47 -0
- synapse_sdk/utils/storage/registry.py +17 -0
- synapse_sdk-2025.12.3.dist-info/METADATA +123 -0
- synapse_sdk-2025.12.3.dist-info/RECORD +279 -0
- {synapse_sdk-1.0.0a23.dist-info → synapse_sdk-2025.12.3.dist-info}/WHEEL +1 -1
- synapse_sdk/clients/backend/dataset.py +0 -51
- synapse_sdk/plugins/categories/import/actions/import.py +0 -10
- synapse_sdk/plugins/cli/__init__.py +0 -21
- synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/.env +0 -24
- synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/.env.dist +0 -24
- synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/main.py +0 -4
- synapse_sdk/utils/file.py +0 -168
- synapse_sdk/utils/storage.py +0 -91
- synapse_sdk-1.0.0a23.dist-info/METADATA +0 -44
- synapse_sdk-1.0.0a23.dist-info/RECORD +0 -114
- /synapse_sdk/{plugins/cli → cli/plugin}/run.py +0 -0
- /synapse_sdk/{plugins/categories/import → clients/validators}/__init__.py +0 -0
- /synapse_sdk/{plugins/categories/import/actions → devtools}/__init__.py +0 -0
- {synapse_sdk-1.0.0a23.dist-info → synapse_sdk-2025.12.3.dist-info}/entry_points.txt +0 -0
- {synapse_sdk-1.0.0a23.dist-info → synapse_sdk-2025.12.3.dist-info/licenses}/LICENSE +0 -0
- {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}')
|