synapse-sdk 1.0.0a35__py3-none-any.whl → 2025.11.7__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of synapse-sdk might be problematic. Click here for more details.
- synapse_sdk/__init__.py +24 -0
- synapse_sdk/cli/__init__.py +308 -5
- synapse_sdk/cli/alias/utils.py +1 -1
- 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/publish.py +23 -15
- synapse_sdk/clients/agent/__init__.py +9 -3
- synapse_sdk/clients/agent/container.py +133 -0
- synapse_sdk/clients/agent/core.py +19 -0
- synapse_sdk/clients/agent/ray.py +298 -9
- synapse_sdk/clients/backend/__init__.py +28 -12
- synapse_sdk/clients/backend/annotation.py +9 -1
- synapse_sdk/clients/backend/core.py +31 -4
- synapse_sdk/clients/backend/data_collection.py +186 -0
- synapse_sdk/clients/backend/hitl.py +1 -1
- synapse_sdk/clients/backend/integration.py +4 -3
- synapse_sdk/clients/backend/ml.py +1 -1
- synapse_sdk/clients/backend/models.py +35 -1
- synapse_sdk/clients/base.py +309 -36
- synapse_sdk/clients/ray/serve.py +2 -0
- synapse_sdk/devtools/__init__.py +0 -0
- synapse_sdk/devtools/config.py +94 -0
- synapse_sdk/devtools/docs/.gitignore +20 -0
- synapse_sdk/devtools/docs/README.md +41 -0
- synapse_sdk/devtools/docs/blog/2019-05-28-first-blog-post.md +12 -0
- synapse_sdk/devtools/docs/blog/2019-05-29-long-blog-post.md +44 -0
- synapse_sdk/devtools/docs/blog/2021-08-01-mdx-blog-post.mdx +24 -0
- synapse_sdk/devtools/docs/blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg +0 -0
- synapse_sdk/devtools/docs/blog/2021-08-26-welcome/index.md +29 -0
- synapse_sdk/devtools/docs/blog/authors.yml +25 -0
- synapse_sdk/devtools/docs/blog/tags.yml +19 -0
- synapse_sdk/devtools/docs/docs/api/clients/agent.md +43 -0
- synapse_sdk/devtools/docs/docs/api/clients/annotation-mixin.md +378 -0
- synapse_sdk/devtools/docs/docs/api/clients/backend.md +420 -0
- synapse_sdk/devtools/docs/docs/api/clients/base.md +257 -0
- synapse_sdk/devtools/docs/docs/api/clients/core-mixin.md +477 -0
- synapse_sdk/devtools/docs/docs/api/clients/data-collection-mixin.md +422 -0
- synapse_sdk/devtools/docs/docs/api/clients/hitl-mixin.md +554 -0
- synapse_sdk/devtools/docs/docs/api/clients/index.md +391 -0
- synapse_sdk/devtools/docs/docs/api/clients/integration-mixin.md +571 -0
- synapse_sdk/devtools/docs/docs/api/clients/ml-mixin.md +578 -0
- synapse_sdk/devtools/docs/docs/api/clients/ray.md +342 -0
- synapse_sdk/devtools/docs/docs/api/index.md +52 -0
- synapse_sdk/devtools/docs/docs/api/plugins/categories.md +43 -0
- synapse_sdk/devtools/docs/docs/api/plugins/models.md +114 -0
- synapse_sdk/devtools/docs/docs/api/plugins/utils.md +328 -0
- synapse_sdk/devtools/docs/docs/categories.md +0 -0
- synapse_sdk/devtools/docs/docs/cli-usage.md +280 -0
- synapse_sdk/devtools/docs/docs/concepts/index.md +38 -0
- synapse_sdk/devtools/docs/docs/configuration.md +83 -0
- synapse_sdk/devtools/docs/docs/contributing.md +306 -0
- synapse_sdk/devtools/docs/docs/examples/index.md +29 -0
- synapse_sdk/devtools/docs/docs/faq.md +179 -0
- synapse_sdk/devtools/docs/docs/features/converters/index.md +455 -0
- synapse_sdk/devtools/docs/docs/features/index.md +24 -0
- synapse_sdk/devtools/docs/docs/features/utils/file.md +415 -0
- synapse_sdk/devtools/docs/docs/features/utils/network.md +378 -0
- synapse_sdk/devtools/docs/docs/features/utils/storage.md +57 -0
- synapse_sdk/devtools/docs/docs/features/utils/types.md +51 -0
- synapse_sdk/devtools/docs/docs/installation.md +94 -0
- synapse_sdk/devtools/docs/docs/introduction.md +47 -0
- synapse_sdk/devtools/docs/docs/plugins/categories/neural-net-plugins/train-action-overview.md +814 -0
- synapse_sdk/devtools/docs/docs/plugins/categories/pre-annotation-plugins/pre-annotation-plugin-overview.md +198 -0
- synapse_sdk/devtools/docs/docs/plugins/categories/pre-annotation-plugins/to-task-action-development.md +1645 -0
- synapse_sdk/devtools/docs/docs/plugins/categories/pre-annotation-plugins/to-task-overview.md +717 -0
- synapse_sdk/devtools/docs/docs/plugins/categories/pre-annotation-plugins/to-task-template-development.md +1380 -0
- synapse_sdk/devtools/docs/docs/plugins/categories/upload-plugins/upload-plugin-action.md +948 -0
- synapse_sdk/devtools/docs/docs/plugins/categories/upload-plugins/upload-plugin-overview.md +544 -0
- synapse_sdk/devtools/docs/docs/plugins/categories/upload-plugins/upload-plugin-template.md +766 -0
- synapse_sdk/devtools/docs/docs/plugins/export-plugins.md +1092 -0
- synapse_sdk/devtools/docs/docs/plugins/plugins.md +852 -0
- synapse_sdk/devtools/docs/docs/quickstart.md +78 -0
- synapse_sdk/devtools/docs/docs/troubleshooting.md +519 -0
- synapse_sdk/devtools/docs/docs/tutorial-basics/_category_.json +8 -0
- synapse_sdk/devtools/docs/docs/tutorial-basics/congratulations.md +23 -0
- synapse_sdk/devtools/docs/docs/tutorial-basics/create-a-blog-post.md +34 -0
- synapse_sdk/devtools/docs/docs/tutorial-basics/create-a-document.md +57 -0
- synapse_sdk/devtools/docs/docs/tutorial-basics/create-a-page.md +43 -0
- synapse_sdk/devtools/docs/docs/tutorial-basics/deploy-your-site.md +31 -0
- synapse_sdk/devtools/docs/docs/tutorial-basics/markdown-features.mdx +152 -0
- synapse_sdk/devtools/docs/docs/tutorial-extras/_category_.json +7 -0
- synapse_sdk/devtools/docs/docs/tutorial-extras/img/docsVersionDropdown.png +0 -0
- synapse_sdk/devtools/docs/docs/tutorial-extras/img/localeDropdown.png +0 -0
- synapse_sdk/devtools/docs/docs/tutorial-extras/manage-docs-versions.md +55 -0
- synapse_sdk/devtools/docs/docs/tutorial-extras/translate-your-site.md +88 -0
- synapse_sdk/devtools/docs/docusaurus.config.ts +148 -0
- synapse_sdk/devtools/docs/i18n/ko/code.json +325 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/agent.md +43 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/annotation-mixin.md +289 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/backend.md +420 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/base.md +257 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/core-mixin.md +417 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/data-collection-mixin.md +356 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/hitl-mixin.md +192 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/index.md +391 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/integration-mixin.md +479 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/ml-mixin.md +284 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/ray.md +342 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/index.md +52 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/plugins/models.md +114 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/categories.md +0 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/cli-usage.md +280 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/concepts/index.md +38 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/configuration.md +83 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/contributing.md +306 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/examples/index.md +29 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/faq.md +179 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/converters/index.md +30 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/index.md +24 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/utils/file.md +415 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/utils/network.md +378 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/utils/storage.md +60 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/utils/types.md +51 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/installation.md +94 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/introduction.md +47 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/neural-net-plugins/train-action-overview.md +815 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/pre-annotation-plugins/pre-annotation-plugin-overview.md +198 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/pre-annotation-plugins/to-task-action-development.md +1645 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/pre-annotation-plugins/to-task-overview.md +717 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/pre-annotation-plugins/to-task-template-development.md +1380 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/upload-plugins/upload-plugin-action.md +948 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/upload-plugins/upload-plugin-overview.md +544 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/upload-plugins/upload-plugin-template.md +766 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/export-plugins.md +1092 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/plugins.md +117 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/quickstart.md +78 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/troubleshooting.md +519 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current.json +34 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-theme-classic/footer.json +42 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-theme-classic/navbar.json +18 -0
- synapse_sdk/devtools/docs/package-lock.json +18784 -0
- synapse_sdk/devtools/docs/package.json +48 -0
- synapse_sdk/devtools/docs/sidebars.ts +122 -0
- synapse_sdk/devtools/docs/src/components/HomepageFeatures/index.tsx +71 -0
- synapse_sdk/devtools/docs/src/components/HomepageFeatures/styles.module.css +11 -0
- synapse_sdk/devtools/docs/src/css/custom.css +30 -0
- synapse_sdk/devtools/docs/src/pages/index.module.css +23 -0
- synapse_sdk/devtools/docs/src/pages/index.tsx +21 -0
- synapse_sdk/devtools/docs/src/pages/markdown-page.md +7 -0
- synapse_sdk/devtools/docs/static/.nojekyll +0 -0
- synapse_sdk/devtools/docs/static/img/docusaurus-social-card.jpg +0 -0
- synapse_sdk/devtools/docs/static/img/docusaurus.png +0 -0
- synapse_sdk/devtools/docs/static/img/favicon.ico +0 -0
- synapse_sdk/devtools/docs/static/img/logo.png +0 -0
- synapse_sdk/devtools/docs/static/img/undraw_docusaurus_mountain.svg +171 -0
- synapse_sdk/devtools/docs/static/img/undraw_docusaurus_react.svg +170 -0
- synapse_sdk/devtools/docs/static/img/undraw_docusaurus_tree.svg +40 -0
- synapse_sdk/devtools/docs/tsconfig.json +8 -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 +65 -7
- synapse_sdk/plugins/README.md +1340 -0
- synapse_sdk/plugins/categories/base.py +73 -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.py → export/utils.py} +47 -82
- synapse_sdk/plugins/categories/export/templates/config.yaml +19 -1
- synapse_sdk/plugins/categories/export/templates/plugin/__init__.py +390 -0
- synapse_sdk/plugins/categories/export/templates/plugin/export.py +153 -129
- synapse_sdk/plugins/categories/neural_net/actions/deployment.py +9 -62
- synapse_sdk/plugins/categories/neural_net/actions/train.py +1062 -32
- synapse_sdk/plugins/categories/neural_net/actions/tune.py +534 -0
- synapse_sdk/plugins/categories/neural_net/templates/config.yaml +27 -5
- 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/pre_annotation/actions/pre_annotation/action.py +10 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/__init__.py +28 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/action.py +145 -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 +97 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/orchestrator.py +250 -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 +287 -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 +87 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/preprocessor.py +127 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/validation.py +143 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task.py +966 -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/upload/actions/upload/__init__.py +19 -0
- synapse_sdk/plugins/categories/upload/actions/upload/action.py +232 -0
- synapse_sdk/plugins/categories/upload/actions/upload/context.py +185 -0
- synapse_sdk/plugins/categories/upload/actions/upload/enums.py +471 -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 +203 -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 +84 -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 +203 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/upload.py +97 -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 +258 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/file_discovery/recursive.py +281 -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 +29 -2
- synapse_sdk/plugins/categories/upload/templates/plugin/__init__.py +294 -0
- synapse_sdk/plugins/categories/upload/templates/plugin/upload.py +88 -30
- synapse_sdk/plugins/models.py +122 -16
- 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/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/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 +56 -0
- synapse_sdk/utils/converters/dm/from_v1.py +627 -0
- synapse_sdk/utils/converters/dm/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 +39 -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/video/__init__.py +29 -0
- synapse_sdk/utils/file/video/transcode.py +307 -0
- synapse_sdk/utils/{file.py → file.py.backup} +84 -2
- synapse_sdk/utils/http.py +138 -0
- synapse_sdk/utils/network.py +293 -0
- synapse_sdk/utils/storage/__init__.py +36 -2
- synapse_sdk/utils/storage/providers/__init__.py +141 -0
- synapse_sdk/utils/storage/providers/file_system.py +134 -0
- synapse_sdk/utils/storage/providers/http.py +190 -0
- synapse_sdk/utils/storage/providers/s3.py +54 -6
- synapse_sdk/utils/storage/providers/sftp.py +31 -0
- synapse_sdk/utils/storage/registry.py +6 -0
- synapse_sdk-2025.11.7.dist-info/METADATA +122 -0
- synapse_sdk-2025.11.7.dist-info/RECORD +386 -0
- {synapse_sdk-1.0.0a35.dist-info → synapse_sdk-2025.11.7.dist-info}/WHEEL +1 -1
- synapse_sdk/clients/backend/dataset.py +0 -102
- synapse_sdk/plugins/categories/upload/actions/upload.py +0 -293
- synapse_sdk-1.0.0a35.dist-info/METADATA +0 -47
- synapse_sdk-1.0.0a35.dist-info/RECORD +0 -137
- {synapse_sdk-1.0.0a35.dist-info → synapse_sdk-2025.11.7.dist-info}/entry_points.txt +0 -0
- {synapse_sdk-1.0.0a35.dist-info → synapse_sdk-2025.11.7.dist-info}/licenses/LICENSE +0 -0
- {synapse_sdk-1.0.0a35.dist-info → synapse_sdk-2025.11.7.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,440 @@
|
|
|
1
|
+
import os
|
|
2
|
+
|
|
3
|
+
import click
|
|
4
|
+
import inquirer
|
|
5
|
+
import requests
|
|
6
|
+
|
|
7
|
+
from synapse_sdk.devtools.config import (
|
|
8
|
+
clear_backend_config,
|
|
9
|
+
get_backend_config,
|
|
10
|
+
load_devtools_config,
|
|
11
|
+
save_devtools_config,
|
|
12
|
+
set_backend_config,
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def clear_screen():
|
|
17
|
+
"""Clear the terminal screen"""
|
|
18
|
+
os.system('cls' if os.name == 'nt' else 'clear')
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def check_backend_connection(host, token):
|
|
22
|
+
"""Test backend connection with given credentials"""
|
|
23
|
+
try:
|
|
24
|
+
# Try an authenticated endpoint to verify token validity
|
|
25
|
+
response = requests.get(
|
|
26
|
+
f'{host}/users/me/',
|
|
27
|
+
headers={'Synapse-Access-Token': f'Token {token}'},
|
|
28
|
+
timeout=5,
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
if response.status_code == 200:
|
|
32
|
+
return True, 'Connection successful'
|
|
33
|
+
elif response.status_code == 401:
|
|
34
|
+
return False, 'Invalid token (401)'
|
|
35
|
+
elif response.status_code == 403:
|
|
36
|
+
return False, 'Access forbidden (403)'
|
|
37
|
+
elif response.status_code == 404:
|
|
38
|
+
# If /users/me/ doesn't exist, try /health as fallback
|
|
39
|
+
try:
|
|
40
|
+
health_response = requests.get(
|
|
41
|
+
f'{host}/health',
|
|
42
|
+
headers={'Synapse-Access-Token': f'Token {token}'},
|
|
43
|
+
timeout=3,
|
|
44
|
+
)
|
|
45
|
+
if health_response.status_code == 200:
|
|
46
|
+
return True, 'Connection successful'
|
|
47
|
+
elif health_response.status_code == 401:
|
|
48
|
+
return False, 'Invalid token (401)'
|
|
49
|
+
elif health_response.status_code == 403:
|
|
50
|
+
return False, 'Access forbidden (403)'
|
|
51
|
+
else:
|
|
52
|
+
return False, f'HTTP {health_response.status_code}'
|
|
53
|
+
except Exception:
|
|
54
|
+
return False, 'Endpoint not found (404)'
|
|
55
|
+
else:
|
|
56
|
+
return False, f'HTTP {response.status_code}'
|
|
57
|
+
|
|
58
|
+
except requests.exceptions.Timeout:
|
|
59
|
+
return False, 'Connection timeout (>5s)'
|
|
60
|
+
except requests.exceptions.ConnectionError:
|
|
61
|
+
return False, 'Connection failed'
|
|
62
|
+
except Exception as e:
|
|
63
|
+
return False, f'Connection error: {str(e)}'
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def check_agent_connection(agent_url, agent_token):
|
|
67
|
+
"""Test agent connection with given credentials"""
|
|
68
|
+
if not agent_url or not agent_token:
|
|
69
|
+
return True, 'Agent configured (no URL/token to test)'
|
|
70
|
+
|
|
71
|
+
try:
|
|
72
|
+
# Try to connect to the agent
|
|
73
|
+
response = requests.get(
|
|
74
|
+
f'{agent_url}/health/',
|
|
75
|
+
headers={'Authorization': agent_token},
|
|
76
|
+
timeout=5,
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
if response.status_code == 200:
|
|
80
|
+
return True, 'Agent connection successful'
|
|
81
|
+
elif response.status_code == 401:
|
|
82
|
+
return False, 'Invalid agent token (401)'
|
|
83
|
+
elif response.status_code == 403:
|
|
84
|
+
return False, 'Agent access forbidden (403)'
|
|
85
|
+
else:
|
|
86
|
+
return False, f'Agent HTTP {response.status_code}'
|
|
87
|
+
|
|
88
|
+
except requests.exceptions.Timeout:
|
|
89
|
+
return False, 'Agent connection timeout (>5s)'
|
|
90
|
+
except requests.exceptions.ConnectionError:
|
|
91
|
+
return False, 'Agent connection failed'
|
|
92
|
+
except Exception as e:
|
|
93
|
+
return False, f'Agent error: {str(e)}'
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def get_agent_config():
|
|
97
|
+
"""Get current agent configuration"""
|
|
98
|
+
config = load_devtools_config()
|
|
99
|
+
return config.get('agent', {})
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def get_tenant_config():
|
|
103
|
+
"""Get current tenant configuration"""
|
|
104
|
+
config = load_devtools_config()
|
|
105
|
+
return config.get('tenant', {})
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def set_tenant_config(tenant_code: str, tenant_name: str = None):
|
|
109
|
+
"""Set tenant configuration"""
|
|
110
|
+
config = load_devtools_config()
|
|
111
|
+
config['tenant'] = {'code': tenant_code}
|
|
112
|
+
if tenant_name:
|
|
113
|
+
config['tenant']['name'] = tenant_name
|
|
114
|
+
save_devtools_config(config)
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def clear_tenant_config():
|
|
118
|
+
"""Clear tenant configuration"""
|
|
119
|
+
config = load_devtools_config()
|
|
120
|
+
if 'tenant' in config:
|
|
121
|
+
del config['tenant']
|
|
122
|
+
save_devtools_config(config)
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
def set_agent_config(agent_id: str, agent_name: str = None, agent_url: str = None, agent_token: str = None):
|
|
126
|
+
"""Set agent configuration"""
|
|
127
|
+
config = load_devtools_config()
|
|
128
|
+
config['agent'] = {'id': agent_id}
|
|
129
|
+
if agent_name:
|
|
130
|
+
config['agent']['name'] = agent_name
|
|
131
|
+
if agent_url:
|
|
132
|
+
config['agent']['url'] = agent_url
|
|
133
|
+
if agent_token:
|
|
134
|
+
config['agent']['token'] = agent_token
|
|
135
|
+
|
|
136
|
+
save_devtools_config(config)
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
def clear_agent_config():
|
|
140
|
+
"""Clear agent configuration"""
|
|
141
|
+
config = load_devtools_config()
|
|
142
|
+
if 'agent' in config:
|
|
143
|
+
del config['agent']
|
|
144
|
+
save_devtools_config(config)
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
def fetch_agents_from_backend():
|
|
148
|
+
"""Fetch available agents from the backend"""
|
|
149
|
+
backend_config = get_backend_config()
|
|
150
|
+
if not backend_config:
|
|
151
|
+
return None, 'No backend configuration found. Configure backend first.'
|
|
152
|
+
|
|
153
|
+
def extract_uuid(string):
|
|
154
|
+
import re
|
|
155
|
+
|
|
156
|
+
"""Extract UUID between 'agents/' and '/node_install_script' from a string."""
|
|
157
|
+
pattern = r'agents/([a-f0-9]{40})/node_install_script'
|
|
158
|
+
match = re.search(pattern, string)
|
|
159
|
+
return match.group(1) if match else None
|
|
160
|
+
|
|
161
|
+
try:
|
|
162
|
+
response = requests.get(
|
|
163
|
+
f'{backend_config["host"]}/agents/',
|
|
164
|
+
headers={'Synapse-Access-Token': f'Token {backend_config["token"]}'},
|
|
165
|
+
timeout=10,
|
|
166
|
+
)
|
|
167
|
+
if response.status_code == 200:
|
|
168
|
+
try:
|
|
169
|
+
data = response.json()
|
|
170
|
+
results = data.get('results', [])
|
|
171
|
+
for result in results:
|
|
172
|
+
_node_install_script = result.get('node_install_script')
|
|
173
|
+
if _node_install_script:
|
|
174
|
+
result['token'] = extract_uuid(_node_install_script)
|
|
175
|
+
return results, None
|
|
176
|
+
except ValueError:
|
|
177
|
+
return None, 'Invalid JSON response from server'
|
|
178
|
+
elif response.status_code == 401:
|
|
179
|
+
return None, 'Authentication failed. Check your backend token.'
|
|
180
|
+
elif response.status_code == 403:
|
|
181
|
+
return None, 'Access forbidden. Check your permissions.'
|
|
182
|
+
else:
|
|
183
|
+
return None, f'Failed to fetch agents: HTTP {response.status_code}'
|
|
184
|
+
|
|
185
|
+
except requests.exceptions.Timeout:
|
|
186
|
+
return None, 'Request timeout. Check your network connection.'
|
|
187
|
+
except requests.exceptions.ConnectionError:
|
|
188
|
+
return None, 'Connection failed. Check backend host URL.'
|
|
189
|
+
except Exception as e:
|
|
190
|
+
return None, f'Error fetching agents: {str(e)}'
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
def configure_backend():
|
|
194
|
+
"""Interactive backend configuration"""
|
|
195
|
+
backend_config = get_backend_config()
|
|
196
|
+
|
|
197
|
+
if backend_config:
|
|
198
|
+
click.echo(f'Current backend: {backend_config["host"]}')
|
|
199
|
+
click.echo(f'Token: {backend_config["token"]}')
|
|
200
|
+
click.echo()
|
|
201
|
+
|
|
202
|
+
questions = [
|
|
203
|
+
inquirer.List(
|
|
204
|
+
'action',
|
|
205
|
+
message='What would you like to do?',
|
|
206
|
+
choices=[
|
|
207
|
+
('Configure new backend', 'configure'),
|
|
208
|
+
('Show current configuration', 'show'),
|
|
209
|
+
('Clear configuration', 'clear'),
|
|
210
|
+
('← Back to main menu', 'back'),
|
|
211
|
+
],
|
|
212
|
+
)
|
|
213
|
+
]
|
|
214
|
+
|
|
215
|
+
answers = inquirer.prompt(questions)
|
|
216
|
+
if not answers or answers['action'] == 'back':
|
|
217
|
+
return
|
|
218
|
+
|
|
219
|
+
if answers['action'] == 'show':
|
|
220
|
+
if backend_config:
|
|
221
|
+
click.echo(click.style('\n✓ Backend Configuration:', fg='green'))
|
|
222
|
+
click.echo(f' Host: {backend_config["host"]}')
|
|
223
|
+
click.echo(f' Token: {backend_config["token"]}')
|
|
224
|
+
else:
|
|
225
|
+
click.echo(click.style('\n⚠ No backend configuration found.', fg='yellow'))
|
|
226
|
+
return
|
|
227
|
+
|
|
228
|
+
if answers['action'] == 'clear':
|
|
229
|
+
confirm = inquirer.confirm('Are you sure you want to clear the backend configuration?')
|
|
230
|
+
if confirm:
|
|
231
|
+
clear_backend_config()
|
|
232
|
+
click.echo(click.style('\n✓ Backend configuration cleared.', fg='yellow'))
|
|
233
|
+
return
|
|
234
|
+
|
|
235
|
+
if answers['action'] == 'configure':
|
|
236
|
+
config_questions = [
|
|
237
|
+
inquirer.Text(
|
|
238
|
+
'host',
|
|
239
|
+
message='Backend host URL',
|
|
240
|
+
default=backend_config['host'] if backend_config else 'https://api.synapse.sh',
|
|
241
|
+
),
|
|
242
|
+
inquirer.Text('token', default=backend_config['token'] if backend_config else '', message='API token'),
|
|
243
|
+
]
|
|
244
|
+
|
|
245
|
+
config_answers = inquirer.prompt(config_questions)
|
|
246
|
+
if config_answers and config_answers['token']:
|
|
247
|
+
set_backend_config(config_answers['host'], config_answers['token'])
|
|
248
|
+
click.echo(click.style('\n✓ Backend configuration saved!', fg='green'))
|
|
249
|
+
click.echo(f'Host: {config_answers["host"]}')
|
|
250
|
+
click.echo(f'Token: {config_answers["token"]}')
|
|
251
|
+
|
|
252
|
+
# Test the connection
|
|
253
|
+
click.echo('\nTesting connection...')
|
|
254
|
+
success, message = check_backend_connection(config_answers['host'], config_answers['token'])
|
|
255
|
+
if success:
|
|
256
|
+
click.echo(click.style(f'🟢 {message}', fg='green'))
|
|
257
|
+
else:
|
|
258
|
+
click.echo(click.style(f'🔴 {message}', fg='red'))
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
def configure_agent():
|
|
262
|
+
"""Interactive agent configuration"""
|
|
263
|
+
agent_config = get_agent_config()
|
|
264
|
+
|
|
265
|
+
if agent_config:
|
|
266
|
+
click.echo(f'Current agent: {agent_config.get("name", "Unknown")} ({agent_config.get("id")})')
|
|
267
|
+
click.echo()
|
|
268
|
+
|
|
269
|
+
questions = [
|
|
270
|
+
inquirer.List(
|
|
271
|
+
'action',
|
|
272
|
+
message='What would you like to do?',
|
|
273
|
+
choices=[
|
|
274
|
+
('Select agent', 'select'),
|
|
275
|
+
('Set agent ID manually', 'manual'),
|
|
276
|
+
('← Back to main menu', 'back'),
|
|
277
|
+
],
|
|
278
|
+
)
|
|
279
|
+
]
|
|
280
|
+
|
|
281
|
+
answers = inquirer.prompt(questions)
|
|
282
|
+
if not answers or answers['action'] == 'back':
|
|
283
|
+
return
|
|
284
|
+
|
|
285
|
+
if answers['action'] == 'select':
|
|
286
|
+
click.echo('Fetching available agents...')
|
|
287
|
+
agents, error = fetch_agents_from_backend()
|
|
288
|
+
|
|
289
|
+
if error:
|
|
290
|
+
click.echo(click.style(f'\nError: {error}', fg='red'))
|
|
291
|
+
return
|
|
292
|
+
|
|
293
|
+
if not agents:
|
|
294
|
+
click.echo(click.style('\n⚠ No agents found in current workspace.', fg='yellow'))
|
|
295
|
+
return
|
|
296
|
+
|
|
297
|
+
# Create choices for agent selection
|
|
298
|
+
agent_choices = []
|
|
299
|
+
for agent in agents:
|
|
300
|
+
status_indicator = '🟢' if agent.get('status', '').lower() == 'connected' else '🔴'
|
|
301
|
+
display_name = f'{status_indicator} {agent["name"]} ({agent["id"]})'
|
|
302
|
+
if agent.get('url'):
|
|
303
|
+
display_name += f' - {agent["url"]}'
|
|
304
|
+
agent_choices.append((display_name, agent))
|
|
305
|
+
|
|
306
|
+
agent_choices.append(('← Cancel', None))
|
|
307
|
+
|
|
308
|
+
agent_questions = [inquirer.List('selected_agent', message='Select an agent:', choices=agent_choices)]
|
|
309
|
+
|
|
310
|
+
agent_answers = inquirer.prompt(agent_questions)
|
|
311
|
+
if agent_answers and agent_answers['selected_agent']:
|
|
312
|
+
selected = agent_answers['selected_agent']
|
|
313
|
+
set_agent_config(selected['id'], selected.get('name'), selected.get('url'), selected.get('token'))
|
|
314
|
+
click.echo(click.style('\n✓ Agent configured!', fg='green'))
|
|
315
|
+
click.echo(f'Selected: {selected["name"]} ({selected["id"]})')
|
|
316
|
+
if selected.get('url'):
|
|
317
|
+
click.echo(f'URL: {selected["url"]}')
|
|
318
|
+
|
|
319
|
+
# Test the agent connection if URL and token are provided
|
|
320
|
+
if selected.get('url') and selected.get('token'):
|
|
321
|
+
click.echo('\nTesting agent connection...')
|
|
322
|
+
success, message = check_agent_connection(selected['url'], selected['token'])
|
|
323
|
+
if success:
|
|
324
|
+
click.echo(click.style(f'🟢 {message}', fg='green'))
|
|
325
|
+
else:
|
|
326
|
+
click.echo(click.style(f'🔴 {message}', fg='red'))
|
|
327
|
+
|
|
328
|
+
if answers['action'] == 'manual':
|
|
329
|
+
manual_questions = [
|
|
330
|
+
inquirer.Text('agent_id', message='Agent ID', default=agent_config.get('id', '') if agent_config else ''),
|
|
331
|
+
inquirer.Text(
|
|
332
|
+
'agent_url', message='Agent URL', default=agent_config.get('url', '') if agent_config else ''
|
|
333
|
+
),
|
|
334
|
+
inquirer.Text(
|
|
335
|
+
'agent_token', message='Agent Token', default=agent_config.get('token', '') if agent_config else ''
|
|
336
|
+
),
|
|
337
|
+
]
|
|
338
|
+
|
|
339
|
+
manual_answers = inquirer.prompt(manual_questions)
|
|
340
|
+
if manual_answers and manual_answers['agent_id']:
|
|
341
|
+
set_agent_config(
|
|
342
|
+
manual_answers['agent_id'], None, manual_answers.get('agent_url'), manual_answers.get('agent_token')
|
|
343
|
+
)
|
|
344
|
+
click.echo(click.style('\n✓ Agent configured!', fg='green'))
|
|
345
|
+
click.echo(f'Agent ID: {manual_answers["agent_id"]}')
|
|
346
|
+
if manual_answers.get('agent_url'):
|
|
347
|
+
click.echo(f'Agent URL: {manual_answers["agent_url"]}')
|
|
348
|
+
|
|
349
|
+
# Test the agent connection if URL and token are provided
|
|
350
|
+
if manual_answers.get('agent_url') and manual_answers.get('agent_token'):
|
|
351
|
+
click.echo('\nTesting agent connection...')
|
|
352
|
+
success, message = check_agent_connection(manual_answers['agent_url'], manual_answers['agent_token'])
|
|
353
|
+
if success:
|
|
354
|
+
click.echo(click.style(f'🟢 {message}', fg='green'))
|
|
355
|
+
else:
|
|
356
|
+
click.echo(click.style(f'🔴 {message}', fg='red'))
|
|
357
|
+
return
|
|
358
|
+
|
|
359
|
+
|
|
360
|
+
def show_current_config():
|
|
361
|
+
"""Show all current configuration"""
|
|
362
|
+
backend_config = get_backend_config()
|
|
363
|
+
agent_config = get_agent_config()
|
|
364
|
+
|
|
365
|
+
click.echo(click.style('\n📋 Current Configuration', fg='cyan', bold=True))
|
|
366
|
+
click.echo('=' * 30)
|
|
367
|
+
|
|
368
|
+
# Backend section
|
|
369
|
+
click.echo(click.style('\n🔗 Backend:', fg='blue', bold=True))
|
|
370
|
+
if backend_config:
|
|
371
|
+
click.echo(f' Host: {backend_config["host"]}')
|
|
372
|
+
click.echo(f' Token: {backend_config["token"]}')
|
|
373
|
+
click.echo(click.style(' Status: ✓ Configured', fg='green'))
|
|
374
|
+
else:
|
|
375
|
+
click.echo(click.style(' Status: ✗ Not configured', fg='red'))
|
|
376
|
+
|
|
377
|
+
# Agent section
|
|
378
|
+
click.echo(click.style('\n🤖 Agent:', fg='blue', bold=True))
|
|
379
|
+
if agent_config:
|
|
380
|
+
click.echo(f' ID: {agent_config.get("id", "Not set")}')
|
|
381
|
+
if 'name' in agent_config:
|
|
382
|
+
click.echo(f' Name: {agent_config["name"]}')
|
|
383
|
+
click.echo(click.style(' Status: ✓ Configured', fg='green'))
|
|
384
|
+
else:
|
|
385
|
+
click.echo(click.style(' Status: ✗ Not configured', fg='red'))
|
|
386
|
+
|
|
387
|
+
|
|
388
|
+
def interactive_config():
|
|
389
|
+
while True:
|
|
390
|
+
clear_screen()
|
|
391
|
+
click.echo(click.style('🔧 Configuration', fg='cyan', bold=True))
|
|
392
|
+
click.echo('Configure your Synapse settings\n')
|
|
393
|
+
|
|
394
|
+
questions = [
|
|
395
|
+
inquirer.List(
|
|
396
|
+
'choice',
|
|
397
|
+
message='What would you like to configure?',
|
|
398
|
+
choices=[
|
|
399
|
+
('Synapse Backend Host', 'backend'),
|
|
400
|
+
('Synapse Agent', 'agent'),
|
|
401
|
+
('Show Current Config', 'show'),
|
|
402
|
+
('← Back to Main Menu', 'exit'),
|
|
403
|
+
],
|
|
404
|
+
)
|
|
405
|
+
]
|
|
406
|
+
|
|
407
|
+
try:
|
|
408
|
+
answers = inquirer.prompt(questions)
|
|
409
|
+
if not answers or answers['choice'] == 'exit':
|
|
410
|
+
clear_screen() # Clear screen when exiting config
|
|
411
|
+
break
|
|
412
|
+
|
|
413
|
+
clear_screen()
|
|
414
|
+
|
|
415
|
+
if answers['choice'] == 'backend':
|
|
416
|
+
configure_backend()
|
|
417
|
+
click.echo('\nPress Enter to continue...')
|
|
418
|
+
input()
|
|
419
|
+
elif answers['choice'] == 'agent':
|
|
420
|
+
configure_agent()
|
|
421
|
+
click.echo('\nPress Enter to continue...')
|
|
422
|
+
input()
|
|
423
|
+
elif answers['choice'] == 'show':
|
|
424
|
+
show_current_config()
|
|
425
|
+
click.echo('\nPress Enter to continue...')
|
|
426
|
+
input()
|
|
427
|
+
|
|
428
|
+
except (KeyboardInterrupt, EOFError):
|
|
429
|
+
clear_screen() # Clear screen on interrupt
|
|
430
|
+
break
|
|
431
|
+
except Exception as e:
|
|
432
|
+
click.echo(click.style(f'\nError: {str(e)}', fg='red'))
|
|
433
|
+
click.echo('\nPress Enter to continue...')
|
|
434
|
+
input()
|
|
435
|
+
|
|
436
|
+
|
|
437
|
+
@click.command()
|
|
438
|
+
def config():
|
|
439
|
+
"""Configure Synapse settings interactively"""
|
|
440
|
+
interactive_config()
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import subprocess
|
|
3
|
+
import sys
|
|
4
|
+
import time
|
|
5
|
+
|
|
6
|
+
import click
|
|
7
|
+
|
|
8
|
+
from synapse_sdk.i18n import gettext as _
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@click.command()
|
|
12
|
+
@click.option('--host', default=None, help='Host to bind the devtools server')
|
|
13
|
+
@click.option('--port', default=None, type=int, help='Port to bind the devtools server')
|
|
14
|
+
@click.option('--debug', is_flag=True, help='Run in debug mode')
|
|
15
|
+
def devtools(host, port, debug):
|
|
16
|
+
"""Start the Synapse devtools web interface"""
|
|
17
|
+
|
|
18
|
+
try:
|
|
19
|
+
import importlib.util
|
|
20
|
+
|
|
21
|
+
if not importlib.util.find_spec('streamlit') or not importlib.util.find_spec('streamlit_ace'):
|
|
22
|
+
raise ImportError('Missing dependencies')
|
|
23
|
+
except ImportError:
|
|
24
|
+
click.echo(
|
|
25
|
+
click.style(
|
|
26
|
+
_('Devtools dependencies not installed. Install with: pip install synapse-sdk[devtools]'), fg='red'
|
|
27
|
+
),
|
|
28
|
+
err=True,
|
|
29
|
+
)
|
|
30
|
+
click.echo(
|
|
31
|
+
click.style(_('Specifically, you need: pip install streamlit streamlit-ace'), fg='yellow'),
|
|
32
|
+
err=True,
|
|
33
|
+
)
|
|
34
|
+
sys.exit(1)
|
|
35
|
+
|
|
36
|
+
click.echo('Starting Synapse DevTools...')
|
|
37
|
+
|
|
38
|
+
# Get the path to the streamlit app
|
|
39
|
+
from pathlib import Path
|
|
40
|
+
|
|
41
|
+
app_path = Path(__file__).parent.parent / 'devtools' / 'streamlit_app.py'
|
|
42
|
+
|
|
43
|
+
if not app_path.exists():
|
|
44
|
+
click.echo(click.style(f'Streamlit app not found at {app_path}', fg='red'), err=True)
|
|
45
|
+
sys.exit(1)
|
|
46
|
+
|
|
47
|
+
# Build streamlit command
|
|
48
|
+
cmd = ['streamlit', 'run', str(app_path)]
|
|
49
|
+
|
|
50
|
+
# Add host and port if specified
|
|
51
|
+
if host:
|
|
52
|
+
cmd.extend(['--server.address', host])
|
|
53
|
+
else:
|
|
54
|
+
cmd.extend(['--server.address', '0.0.0.0'])
|
|
55
|
+
|
|
56
|
+
if port:
|
|
57
|
+
cmd.extend(['--server.port', str(port)])
|
|
58
|
+
else:
|
|
59
|
+
cmd.extend(['--server.port', '8080']) # Default port
|
|
60
|
+
|
|
61
|
+
cmd.extend(['--server.headless', 'false'])
|
|
62
|
+
|
|
63
|
+
if debug:
|
|
64
|
+
cmd.extend(['--logger.level', 'debug'])
|
|
65
|
+
else:
|
|
66
|
+
cmd.extend(['--logger.level', 'error'])
|
|
67
|
+
|
|
68
|
+
# Set working directory to current directory (plugin directory)
|
|
69
|
+
plugin_directory = os.getcwd()
|
|
70
|
+
|
|
71
|
+
try:
|
|
72
|
+
# Add a small delay to ensure clean output
|
|
73
|
+
time.sleep(0.5)
|
|
74
|
+
|
|
75
|
+
# Start streamlit
|
|
76
|
+
process = subprocess.Popen(cmd, cwd=plugin_directory, env=os.environ.copy())
|
|
77
|
+
|
|
78
|
+
click.echo('Press Ctrl+C to stop')
|
|
79
|
+
|
|
80
|
+
# Wait for process
|
|
81
|
+
process.wait()
|
|
82
|
+
|
|
83
|
+
except KeyboardInterrupt:
|
|
84
|
+
click.echo(_('\nDevTools stopped.'))
|
|
85
|
+
if process:
|
|
86
|
+
process.terminate()
|
|
87
|
+
process.wait()
|
|
88
|
+
except Exception as e:
|
|
89
|
+
click.echo(click.style(f'Failed to start devtools: {e}', fg='red'), err=True)
|
|
90
|
+
sys.exit(1)
|
|
@@ -8,15 +8,14 @@ from synapse_sdk.plugins.models import PluginRelease
|
|
|
8
8
|
from synapse_sdk.plugins.upload import archive
|
|
9
9
|
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
11
|
+
def _publish(host, access_token, debug, debug_modules=''):
|
|
12
|
+
"""
|
|
13
|
+
Publish a plugin release to the Synapse backend.
|
|
14
|
+
|
|
15
|
+
:param host: The host URL of the Synapse backend.
|
|
16
|
+
:param access_token: The access token for authentication.
|
|
17
|
+
:param debug_modules: Comma-separated list of debug modules.
|
|
18
|
+
"""
|
|
20
19
|
plugin_release = PluginRelease()
|
|
21
20
|
|
|
22
21
|
source_path = Path('./')
|
|
@@ -28,10 +27,19 @@ def publish(ctx, host, user_token, tenant, debug_modules):
|
|
|
28
27
|
modules = debug_modules.split(',') if debug_modules else []
|
|
29
28
|
data['meta'] = {'modules': modules}
|
|
30
29
|
|
|
31
|
-
client = BackendClient(host,
|
|
30
|
+
client = BackendClient(host, access_token)
|
|
32
31
|
client.create_plugin_release(data)
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
32
|
+
|
|
33
|
+
message = _('Successfully published "{}" ({}) to synapse backend!').format(plugin_release.name, plugin_release.code)
|
|
34
|
+
click.secho(message, fg='green', bold=True)
|
|
35
|
+
return plugin_release
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
@click.command()
|
|
39
|
+
@click.option('--host', required=True)
|
|
40
|
+
@click.option('--access_token', required=True)
|
|
41
|
+
@click.option('--debug_modules', default='', envvar='SYNAPSE_DEBUG_MODULES')
|
|
42
|
+
@click.pass_context
|
|
43
|
+
def publish(ctx, host, access_token, debug_modules):
|
|
44
|
+
debug = ctx.obj['DEBUG']
|
|
45
|
+
_publish(host, access_token, debug, debug_modules)
|
|
@@ -1,18 +1,24 @@
|
|
|
1
|
+
from synapse_sdk.clients.agent.container import ContainerClientMixin
|
|
1
2
|
from synapse_sdk.clients.agent.core import CoreClientMixin
|
|
2
3
|
from synapse_sdk.clients.agent.ray import RayClientMixin
|
|
3
4
|
from synapse_sdk.clients.agent.service import ServiceClientMixin
|
|
4
5
|
from synapse_sdk.clients.exceptions import ClientError
|
|
5
6
|
|
|
6
7
|
|
|
7
|
-
class AgentClient(CoreClientMixin, RayClientMixin, ServiceClientMixin):
|
|
8
|
+
class AgentClient(CoreClientMixin, RayClientMixin, ServiceClientMixin, ContainerClientMixin):
|
|
8
9
|
name = 'Agent'
|
|
9
10
|
agent_token = None
|
|
10
11
|
user_token = None
|
|
11
12
|
tenant = None
|
|
12
13
|
long_poll_handler = None
|
|
13
14
|
|
|
14
|
-
def __init__(self, base_url, agent_token, user_token=None, tenant=None, long_poll_handler=None):
|
|
15
|
-
|
|
15
|
+
def __init__(self, base_url, agent_token, user_token=None, tenant=None, long_poll_handler=None, timeout=None):
|
|
16
|
+
# Use shorter timeouts for agent connections for better UX
|
|
17
|
+
agent_timeout = timeout or {
|
|
18
|
+
'connect': 3, # Connection timeout: 3 seconds
|
|
19
|
+
'read': 10, # Read timeout: 10 seconds
|
|
20
|
+
}
|
|
21
|
+
super().__init__(base_url, timeout=agent_timeout)
|
|
16
22
|
self.agent_token = agent_token
|
|
17
23
|
self.user_token = user_token
|
|
18
24
|
self.tenant = tenant
|