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,578 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: ml-mixin
|
|
3
|
+
title: MLClientMixin
|
|
4
|
+
sidebar_position: 5
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# MLClientMixin
|
|
8
|
+
|
|
9
|
+
Provides machine learning model management and ground truth operations for the Synapse backend.
|
|
10
|
+
|
|
11
|
+
## Overview
|
|
12
|
+
|
|
13
|
+
The `MLClientMixin` handles all operations related to machine learning models, ground truth datasets, and model evaluation workflows. This mixin is automatically included in the `BackendClient` and provides methods for ML pipeline integration.
|
|
14
|
+
|
|
15
|
+
## Model Management
|
|
16
|
+
|
|
17
|
+
### `list_models(params=None)`
|
|
18
|
+
|
|
19
|
+
List available machine learning models with filtering options.
|
|
20
|
+
|
|
21
|
+
```python
|
|
22
|
+
# List all models
|
|
23
|
+
models = client.list_models()
|
|
24
|
+
for model in models[0]:
|
|
25
|
+
print(f"Model: {model['name']} (ID: {model['id']})")
|
|
26
|
+
|
|
27
|
+
# List models for a specific project
|
|
28
|
+
project_models = client.list_models(params={'project': 123})
|
|
29
|
+
|
|
30
|
+
# List models by type
|
|
31
|
+
classification_models = client.list_models(params={'model_type': 'classification'})
|
|
32
|
+
|
|
33
|
+
# List active models only
|
|
34
|
+
active_models = client.list_models(params={'is_active': True})
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
**Parameters:**
|
|
38
|
+
|
|
39
|
+
- `params` (dict, optional): Filtering parameters
|
|
40
|
+
|
|
41
|
+
**Common filtering params:**
|
|
42
|
+
|
|
43
|
+
- `project`: Filter by project ID
|
|
44
|
+
- `model_type`: Filter by model type (`classification`, `detection`, `segmentation`)
|
|
45
|
+
- `is_active`: Filter by model status
|
|
46
|
+
- `created_after`: Filter by creation date
|
|
47
|
+
- `search`: Text search in model names and descriptions
|
|
48
|
+
|
|
49
|
+
**Returns:**
|
|
50
|
+
|
|
51
|
+
- `tuple`: (models_list, total_count)
|
|
52
|
+
|
|
53
|
+
### `get_model(pk, params=None, url_conversion=None)`
|
|
54
|
+
|
|
55
|
+
Get detailed information about a specific model.
|
|
56
|
+
|
|
57
|
+
```python
|
|
58
|
+
# Get basic model info
|
|
59
|
+
model = client.get_model(456)
|
|
60
|
+
print(f"Model: {model['name']}")
|
|
61
|
+
print(f"Type: {model['model_type']}")
|
|
62
|
+
print(f"Accuracy: {model['metrics']['accuracy']}")
|
|
63
|
+
|
|
64
|
+
# Get model with expanded metrics
|
|
65
|
+
model = client.get_model(456, params={'expand': 'metrics'})
|
|
66
|
+
|
|
67
|
+
# Get model with custom URL conversion for files
|
|
68
|
+
model = client.get_model(
|
|
69
|
+
456,
|
|
70
|
+
url_conversion={'file': lambda url: f"https://cdn.example.com{url}"}
|
|
71
|
+
)
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
**Parameters:**
|
|
75
|
+
|
|
76
|
+
- `pk` (int): Model ID
|
|
77
|
+
- `params` (dict, optional): Query parameters
|
|
78
|
+
- `url_conversion` (dict, optional): Custom URL conversion for file fields
|
|
79
|
+
|
|
80
|
+
**Common params:**
|
|
81
|
+
|
|
82
|
+
- `expand`: Include additional data (`metrics`, `evaluations`, `versions`)
|
|
83
|
+
- `include_file`: Whether to include model file information
|
|
84
|
+
|
|
85
|
+
**Returns:**
|
|
86
|
+
|
|
87
|
+
- `dict`: Complete model information including metadata and metrics
|
|
88
|
+
|
|
89
|
+
**Model structure:**
|
|
90
|
+
|
|
91
|
+
- `id`: Model ID
|
|
92
|
+
- `name`: Model name
|
|
93
|
+
- `description`: Model description
|
|
94
|
+
- `model_type`: Type of model
|
|
95
|
+
- `file`: Model file reference
|
|
96
|
+
- `metrics`: Performance metrics
|
|
97
|
+
- `project`: Associated project ID
|
|
98
|
+
- `is_active`: Whether model is currently active
|
|
99
|
+
- `created_at`: Creation timestamp
|
|
100
|
+
|
|
101
|
+
### `create_model(data)`
|
|
102
|
+
|
|
103
|
+
Create a new machine learning model with file upload.
|
|
104
|
+
|
|
105
|
+
```python
|
|
106
|
+
# Create model with file upload
|
|
107
|
+
model_data = {
|
|
108
|
+
'name': 'Object Detection Model v2',
|
|
109
|
+
'description': 'Improved object detection with better accuracy',
|
|
110
|
+
'model_type': 'detection',
|
|
111
|
+
'project': 123,
|
|
112
|
+
'metrics': {
|
|
113
|
+
'accuracy': 0.92,
|
|
114
|
+
'precision': 0.89,
|
|
115
|
+
'recall': 0.94,
|
|
116
|
+
'f1_score': 0.91
|
|
117
|
+
},
|
|
118
|
+
'configuration': {
|
|
119
|
+
'input_size': [640, 640],
|
|
120
|
+
'num_classes': 10,
|
|
121
|
+
'framework': 'pytorch'
|
|
122
|
+
},
|
|
123
|
+
'file': '/path/to/model.pkl' # Will be uploaded via chunked upload
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
new_model = client.create_model(model_data)
|
|
127
|
+
print(f"Created model with ID: {new_model['id']}")
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
**Parameters:**
|
|
131
|
+
|
|
132
|
+
- `data` (dict): Model configuration and metadata
|
|
133
|
+
|
|
134
|
+
**Model data structure:**
|
|
135
|
+
|
|
136
|
+
- `name` (str, required): Model name
|
|
137
|
+
- `description` (str): Model description
|
|
138
|
+
- `model_type` (str, required): Model type
|
|
139
|
+
- `project` (int, required): Project ID
|
|
140
|
+
- `file` (str, required): Path to model file
|
|
141
|
+
- `metrics` (dict): Performance metrics
|
|
142
|
+
- `configuration` (dict): Model configuration
|
|
143
|
+
- `is_active` (bool): Whether model should be active
|
|
144
|
+
|
|
145
|
+
**Returns:**
|
|
146
|
+
|
|
147
|
+
- `dict`: Created model with generated ID
|
|
148
|
+
|
|
149
|
+
**Note:** The model file is automatically uploaded using chunked upload for optimal performance.
|
|
150
|
+
|
|
151
|
+
## Ground Truth Operations
|
|
152
|
+
|
|
153
|
+
### `list_ground_truth_events(params=None, url_conversion=None, list_all=False)`
|
|
154
|
+
|
|
155
|
+
List ground truth events with comprehensive filtering options.
|
|
156
|
+
|
|
157
|
+
```python
|
|
158
|
+
# List ground truth events for a dataset version
|
|
159
|
+
events = client.list_ground_truth_events(params={
|
|
160
|
+
'ground_truth_dataset_versions': [123]
|
|
161
|
+
})
|
|
162
|
+
|
|
163
|
+
# List all events (handles pagination automatically)
|
|
164
|
+
all_events = client.list_ground_truth_events(list_all=True)
|
|
165
|
+
|
|
166
|
+
# List events with date filtering
|
|
167
|
+
from datetime import datetime, timedelta
|
|
168
|
+
recent_date = (datetime.now() - timedelta(days=30)).isoformat()
|
|
169
|
+
recent_events = client.list_ground_truth_events(params={
|
|
170
|
+
'created_after': recent_date,
|
|
171
|
+
'ground_truth_dataset_versions': [123]
|
|
172
|
+
})
|
|
173
|
+
|
|
174
|
+
# List events with custom URL conversion
|
|
175
|
+
events = client.list_ground_truth_events(
|
|
176
|
+
params={'ground_truth_dataset_versions': [123]},
|
|
177
|
+
url_conversion={'files': lambda url: f"https://cdn.example.com{url}"}
|
|
178
|
+
)
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
**Parameters:**
|
|
182
|
+
|
|
183
|
+
- `params` (dict, optional): Filtering parameters
|
|
184
|
+
- `url_conversion` (dict, optional): Custom URL conversion for file fields
|
|
185
|
+
- `list_all` (bool): If True, automatically handles pagination
|
|
186
|
+
|
|
187
|
+
**Common filtering params:**
|
|
188
|
+
|
|
189
|
+
- `ground_truth_dataset_versions`: List of dataset version IDs
|
|
190
|
+
- `project`: Filter by project ID
|
|
191
|
+
- `created_after`: Filter by creation date
|
|
192
|
+
- `data_type`: Filter by data type
|
|
193
|
+
- `search`: Text search in event data
|
|
194
|
+
|
|
195
|
+
**Returns:**
|
|
196
|
+
|
|
197
|
+
- `tuple`: (events_list, total_count) if `list_all=False`
|
|
198
|
+
- `list`: All events if `list_all=True`
|
|
199
|
+
|
|
200
|
+
**Ground truth event structure:**
|
|
201
|
+
|
|
202
|
+
- `id`: Event ID
|
|
203
|
+
- `data`: Annotation/ground truth data
|
|
204
|
+
- `data_unit`: Associated data unit information
|
|
205
|
+
- `ground_truth_dataset_version`: Dataset version ID
|
|
206
|
+
- `created_at`: Creation timestamp
|
|
207
|
+
- `metadata`: Additional event metadata
|
|
208
|
+
|
|
209
|
+
### `get_ground_truth_version(pk)`
|
|
210
|
+
|
|
211
|
+
Get detailed information about a ground truth dataset version.
|
|
212
|
+
|
|
213
|
+
```python
|
|
214
|
+
version = client.get_ground_truth_version(123)
|
|
215
|
+
print(f"Dataset version: {version['version']}")
|
|
216
|
+
print(f"Dataset: {version['ground_truth_dataset']['name']}")
|
|
217
|
+
print(f"Total events: {version['event_count']}")
|
|
218
|
+
print(f"Created: {version['created_at']}")
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
**Parameters:**
|
|
222
|
+
|
|
223
|
+
- `pk` (int): Ground truth dataset version ID
|
|
224
|
+
|
|
225
|
+
**Returns:**
|
|
226
|
+
|
|
227
|
+
- `dict`: Complete dataset version information
|
|
228
|
+
|
|
229
|
+
**Dataset version structure:**
|
|
230
|
+
|
|
231
|
+
- `id`: Version ID
|
|
232
|
+
- `version`: Version number/name
|
|
233
|
+
- `ground_truth_dataset`: Parent dataset information
|
|
234
|
+
- `event_count`: Number of events in this version
|
|
235
|
+
- `description`: Version description
|
|
236
|
+
- `is_active`: Whether version is currently active
|
|
237
|
+
- `created_at`: Creation timestamp
|
|
238
|
+
- `statistics`: Version statistics and metrics
|
|
239
|
+
|
|
240
|
+
## Model Evaluation Workflows
|
|
241
|
+
|
|
242
|
+
### Model Performance Analysis
|
|
243
|
+
|
|
244
|
+
```python
|
|
245
|
+
def analyze_model_performance(model_id, ground_truth_version_id):
|
|
246
|
+
"""Analyze model performance against ground truth data."""
|
|
247
|
+
|
|
248
|
+
# Get model details
|
|
249
|
+
model = client.get_model(model_id, params={'expand': 'metrics'})
|
|
250
|
+
print(f"Analyzing model: {model['name']}")
|
|
251
|
+
|
|
252
|
+
# Get ground truth data
|
|
253
|
+
gt_events = client.list_ground_truth_events(
|
|
254
|
+
params={'ground_truth_dataset_versions': [ground_truth_version_id]},
|
|
255
|
+
list_all=True
|
|
256
|
+
)
|
|
257
|
+
|
|
258
|
+
print(f"Ground truth events: {len(gt_events)}")
|
|
259
|
+
|
|
260
|
+
# Extract metrics
|
|
261
|
+
model_metrics = model.get('metrics', {})
|
|
262
|
+
print("Model Metrics:")
|
|
263
|
+
for metric, value in model_metrics.items():
|
|
264
|
+
print(f" {metric}: {value}")
|
|
265
|
+
|
|
266
|
+
# Analyze ground truth distribution
|
|
267
|
+
data_types = {}
|
|
268
|
+
for event in gt_events:
|
|
269
|
+
data_type = event['data'].get('type', 'unknown')
|
|
270
|
+
data_types[data_type] = data_types.get(data_type, 0) + 1
|
|
271
|
+
|
|
272
|
+
print("Ground Truth Distribution:")
|
|
273
|
+
for data_type, count in data_types.items():
|
|
274
|
+
print(f" {data_type}: {count}")
|
|
275
|
+
|
|
276
|
+
return {
|
|
277
|
+
'model': model,
|
|
278
|
+
'ground_truth_stats': data_types,
|
|
279
|
+
'total_gt_events': len(gt_events)
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
# Usage
|
|
283
|
+
analysis = analyze_model_performance(456, 123)
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
### Model Comparison
|
|
287
|
+
|
|
288
|
+
```python
|
|
289
|
+
def compare_models(model_ids, metric='accuracy'):
|
|
290
|
+
"""Compare multiple models by a specific metric."""
|
|
291
|
+
models = []
|
|
292
|
+
|
|
293
|
+
for model_id in model_ids:
|
|
294
|
+
model = client.get_model(model_id, params={'expand': 'metrics'})
|
|
295
|
+
models.append(model)
|
|
296
|
+
|
|
297
|
+
# Sort by metric
|
|
298
|
+
sorted_models = sorted(
|
|
299
|
+
models,
|
|
300
|
+
key=lambda m: m.get('metrics', {}).get(metric, 0),
|
|
301
|
+
reverse=True
|
|
302
|
+
)
|
|
303
|
+
|
|
304
|
+
print(f"Models ranked by {metric}:")
|
|
305
|
+
for i, model in enumerate(sorted_models, 1):
|
|
306
|
+
metric_value = model.get('metrics', {}).get(metric, 'N/A')
|
|
307
|
+
print(f"{i}. {model['name']}: {metric_value}")
|
|
308
|
+
|
|
309
|
+
return sorted_models
|
|
310
|
+
|
|
311
|
+
# Compare models by accuracy
|
|
312
|
+
model_ranking = compare_models([456, 457, 458], metric='accuracy')
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
### Ground Truth Data Export
|
|
316
|
+
|
|
317
|
+
```python
|
|
318
|
+
def export_ground_truth_data(dataset_version_id, output_format='coco'):
|
|
319
|
+
"""Export ground truth data in specified format."""
|
|
320
|
+
|
|
321
|
+
# Get dataset version info
|
|
322
|
+
version = client.get_ground_truth_version(dataset_version_id)
|
|
323
|
+
print(f"Exporting dataset: {version['ground_truth_dataset']['name']}")
|
|
324
|
+
|
|
325
|
+
# Get all events
|
|
326
|
+
events = client.list_ground_truth_events(
|
|
327
|
+
params={'ground_truth_dataset_versions': [dataset_version_id]},
|
|
328
|
+
list_all=True
|
|
329
|
+
)
|
|
330
|
+
|
|
331
|
+
if output_format == 'coco':
|
|
332
|
+
# Convert to COCO format
|
|
333
|
+
coco_data = {
|
|
334
|
+
'info': {
|
|
335
|
+
'description': version['description'],
|
|
336
|
+
'version': version['version'],
|
|
337
|
+
'year': 2023,
|
|
338
|
+
'contributor': 'Synapse SDK'
|
|
339
|
+
},
|
|
340
|
+
'images': [],
|
|
341
|
+
'annotations': [],
|
|
342
|
+
'categories': []
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
# Process events
|
|
346
|
+
for event in events:
|
|
347
|
+
# Extract image info from data_unit
|
|
348
|
+
data_unit = event['data_unit']
|
|
349
|
+
files = data_unit.get('files', {})
|
|
350
|
+
|
|
351
|
+
# Add image
|
|
352
|
+
if 'image' in files:
|
|
353
|
+
image_info = {
|
|
354
|
+
'id': data_unit['id'],
|
|
355
|
+
'file_name': files['image'].get('name', ''),
|
|
356
|
+
'width': files['image'].get('width', 0),
|
|
357
|
+
'height': files['image'].get('height', 0)
|
|
358
|
+
}
|
|
359
|
+
coco_data['images'].append(image_info)
|
|
360
|
+
|
|
361
|
+
# Add annotations
|
|
362
|
+
annotations = event['data'].get('annotations', [])
|
|
363
|
+
for ann in annotations:
|
|
364
|
+
annotation = {
|
|
365
|
+
'id': len(coco_data['annotations']),
|
|
366
|
+
'image_id': data_unit['id'],
|
|
367
|
+
'category_id': ann.get('category_id', 1),
|
|
368
|
+
'bbox': ann.get('bbox', []),
|
|
369
|
+
'area': ann.get('area', 0),
|
|
370
|
+
'iscrowd': ann.get('iscrowd', 0)
|
|
371
|
+
}
|
|
372
|
+
coco_data['annotations'].append(annotation)
|
|
373
|
+
|
|
374
|
+
return coco_data
|
|
375
|
+
|
|
376
|
+
else:
|
|
377
|
+
# Return raw format
|
|
378
|
+
return events
|
|
379
|
+
|
|
380
|
+
# Export as COCO format
|
|
381
|
+
coco_data = export_ground_truth_data(123, 'coco')
|
|
382
|
+
print(f"Exported {len(coco_data['images'])} images and {len(coco_data['annotations'])} annotations")
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
## Model Training Integration
|
|
386
|
+
|
|
387
|
+
### Training Data Preparation
|
|
388
|
+
|
|
389
|
+
```python
|
|
390
|
+
def prepare_training_data(project_id, split_ratio=0.8):
|
|
391
|
+
"""Prepare training and validation data from ground truth."""
|
|
392
|
+
|
|
393
|
+
# Get all ground truth events for project
|
|
394
|
+
events = client.list_ground_truth_events(
|
|
395
|
+
params={'project': project_id},
|
|
396
|
+
list_all=True
|
|
397
|
+
)
|
|
398
|
+
|
|
399
|
+
# Split data
|
|
400
|
+
import random
|
|
401
|
+
random.shuffle(events)
|
|
402
|
+
split_point = int(len(events) * split_ratio)
|
|
403
|
+
|
|
404
|
+
train_events = events[:split_point]
|
|
405
|
+
val_events = events[split_point:]
|
|
406
|
+
|
|
407
|
+
print(f"Training samples: {len(train_events)}")
|
|
408
|
+
print(f"Validation samples: {len(val_events)}")
|
|
409
|
+
|
|
410
|
+
return {
|
|
411
|
+
'train': train_events,
|
|
412
|
+
'validation': val_events,
|
|
413
|
+
'total': len(events)
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
# Prepare data
|
|
417
|
+
data_split = prepare_training_data(123, split_ratio=0.8)
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
### Model Deployment
|
|
421
|
+
|
|
422
|
+
```python
|
|
423
|
+
def deploy_model(model_path, model_config):
|
|
424
|
+
"""Deploy a trained model to the system."""
|
|
425
|
+
|
|
426
|
+
# Create model entry
|
|
427
|
+
model_data = {
|
|
428
|
+
'name': model_config['name'],
|
|
429
|
+
'description': model_config['description'],
|
|
430
|
+
'model_type': model_config['type'],
|
|
431
|
+
'project': model_config['project_id'],
|
|
432
|
+
'file': model_path,
|
|
433
|
+
'metrics': model_config.get('metrics', {}),
|
|
434
|
+
'configuration': model_config.get('configuration', {}),
|
|
435
|
+
'is_active': True
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
# Upload and create model
|
|
439
|
+
model = client.create_model(model_data)
|
|
440
|
+
print(f"Deployed model: {model['id']}")
|
|
441
|
+
|
|
442
|
+
# Deactivate previous models if requested
|
|
443
|
+
if model_config.get('replace_active', False):
|
|
444
|
+
existing_models = client.list_models(params={
|
|
445
|
+
'project': model_config['project_id'],
|
|
446
|
+
'is_active': True
|
|
447
|
+
})
|
|
448
|
+
|
|
449
|
+
for existing_model in existing_models[0]:
|
|
450
|
+
if existing_model['id'] != model['id']:
|
|
451
|
+
# Note: You'd need an update_model method for this
|
|
452
|
+
print(f"Would deactivate model: {existing_model['id']}")
|
|
453
|
+
|
|
454
|
+
return model
|
|
455
|
+
|
|
456
|
+
# Deploy model
|
|
457
|
+
deployment_config = {
|
|
458
|
+
'name': 'Production Object Detector v3',
|
|
459
|
+
'description': 'Latest object detection model for production',
|
|
460
|
+
'type': 'detection',
|
|
461
|
+
'project_id': 123,
|
|
462
|
+
'metrics': {'accuracy': 0.94, 'mAP': 0.87},
|
|
463
|
+
'configuration': {'input_size': [640, 640], 'confidence_threshold': 0.5},
|
|
464
|
+
'replace_active': True
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
deployed_model = deploy_model('/path/to/trained_model.pkl', deployment_config)
|
|
468
|
+
```
|
|
469
|
+
|
|
470
|
+
## Complete ML Workflow
|
|
471
|
+
|
|
472
|
+
```python
|
|
473
|
+
def complete_ml_workflow(project_id):
|
|
474
|
+
"""Complete machine learning workflow from data to deployed model."""
|
|
475
|
+
|
|
476
|
+
client = BackendClient(
|
|
477
|
+
base_url="https://api.synapse.sh",
|
|
478
|
+
api_token="your-token"
|
|
479
|
+
)
|
|
480
|
+
|
|
481
|
+
print("=== ML Workflow Started ===")
|
|
482
|
+
|
|
483
|
+
# 1. Analyze available ground truth data
|
|
484
|
+
print("1. Analyzing ground truth data...")
|
|
485
|
+
events = client.list_ground_truth_events(
|
|
486
|
+
params={'project': project_id},
|
|
487
|
+
list_all=True
|
|
488
|
+
)
|
|
489
|
+
print(f"Found {len(events)} ground truth events")
|
|
490
|
+
|
|
491
|
+
# 2. Get existing models for comparison
|
|
492
|
+
print("2. Checking existing models...")
|
|
493
|
+
existing_models = client.list_models(params={'project': project_id})
|
|
494
|
+
print(f"Found {len(existing_models[0])} existing models")
|
|
495
|
+
|
|
496
|
+
# 3. Create and deploy new model (simulated)
|
|
497
|
+
print("3. Deploying new model...")
|
|
498
|
+
model_data = {
|
|
499
|
+
'name': f'Auto-Generated Model for Project {project_id}',
|
|
500
|
+
'description': 'Model created through automated workflow',
|
|
501
|
+
'model_type': 'classification',
|
|
502
|
+
'project': project_id,
|
|
503
|
+
'file': '/path/to/new_model.pkl', # In real scenario, this would be actual trained model
|
|
504
|
+
'metrics': {
|
|
505
|
+
'accuracy': 0.93,
|
|
506
|
+
'precision': 0.91,
|
|
507
|
+
'recall': 0.95,
|
|
508
|
+
'f1_score': 0.93
|
|
509
|
+
},
|
|
510
|
+
'configuration': {
|
|
511
|
+
'framework': 'pytorch',
|
|
512
|
+
'input_size': [224, 224],
|
|
513
|
+
'num_classes': 10
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
new_model = client.create_model(model_data)
|
|
518
|
+
print(f"Deployed model: {new_model['id']}")
|
|
519
|
+
|
|
520
|
+
# 4. Compare with existing models
|
|
521
|
+
print("4. Comparing model performance...")
|
|
522
|
+
all_models = existing_models[0] + [new_model]
|
|
523
|
+
best_model = max(all_models, key=lambda m: m.get('metrics', {}).get('accuracy', 0))
|
|
524
|
+
print(f"Best model: {best_model['name']} (Accuracy: {best_model['metrics']['accuracy']})")
|
|
525
|
+
|
|
526
|
+
print("=== ML Workflow Completed ===")
|
|
527
|
+
return new_model
|
|
528
|
+
|
|
529
|
+
# Run workflow
|
|
530
|
+
if __name__ == "__main__":
|
|
531
|
+
result = complete_ml_workflow(123)
|
|
532
|
+
```
|
|
533
|
+
|
|
534
|
+
## Error Handling
|
|
535
|
+
|
|
536
|
+
```python
|
|
537
|
+
from synapse_sdk.clients.exceptions import ClientError
|
|
538
|
+
|
|
539
|
+
def robust_model_operations():
|
|
540
|
+
"""Example of robust model operations with error handling."""
|
|
541
|
+
|
|
542
|
+
try:
|
|
543
|
+
# Try to get model
|
|
544
|
+
model = client.get_model(999)
|
|
545
|
+
except ClientError as e:
|
|
546
|
+
if e.status_code == 404:
|
|
547
|
+
print("Model not found")
|
|
548
|
+
return None
|
|
549
|
+
else:
|
|
550
|
+
print(f"Error getting model: {e}")
|
|
551
|
+
raise
|
|
552
|
+
|
|
553
|
+
try:
|
|
554
|
+
# Try to create model
|
|
555
|
+
model_data = {
|
|
556
|
+
'name': 'Test Model',
|
|
557
|
+
'model_type': 'classification',
|
|
558
|
+
'project': 123,
|
|
559
|
+
'file': '/path/to/model.pkl'
|
|
560
|
+
}
|
|
561
|
+
new_model = client.create_model(model_data)
|
|
562
|
+
except ClientError as e:
|
|
563
|
+
if e.status_code == 400:
|
|
564
|
+
print(f"Invalid model data: {e.response}")
|
|
565
|
+
elif e.status_code == 413:
|
|
566
|
+
print("Model file too large")
|
|
567
|
+
else:
|
|
568
|
+
print(f"Error creating model: {e}")
|
|
569
|
+
return None
|
|
570
|
+
|
|
571
|
+
return new_model
|
|
572
|
+
```
|
|
573
|
+
|
|
574
|
+
## See Also
|
|
575
|
+
|
|
576
|
+
- [BackendClient](./backend.md) - Main backend client
|
|
577
|
+
- [DataCollectionClientMixin](./data-collection-mixin.md) - Data management operations
|
|
578
|
+
- [IntegrationClientMixin](./integration-mixin.md) - Plugin and job management
|