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
|
@@ -11,7 +11,8 @@ from synapse_sdk.clients.ray import RayClient
|
|
|
11
11
|
from synapse_sdk.plugins.enums import RunMethod
|
|
12
12
|
from synapse_sdk.plugins.exceptions import ActionError
|
|
13
13
|
from synapse_sdk.plugins.models import PluginRelease, Run
|
|
14
|
-
from synapse_sdk.plugins.upload import archive_and_upload, build_and_upload
|
|
14
|
+
from synapse_sdk.plugins.upload import archive_and_upload, build_and_upload
|
|
15
|
+
from synapse_sdk.shared import init_sentry, needs_sentry_init
|
|
15
16
|
from synapse_sdk.utils.module_loading import import_string
|
|
16
17
|
from synapse_sdk.utils.pydantic.errors import pydantic_to_drf_error
|
|
17
18
|
|
|
@@ -25,7 +26,8 @@ class Action:
|
|
|
25
26
|
method (RunMethod): The method to run of the action.
|
|
26
27
|
run_class (Run): The class to run the action.
|
|
27
28
|
params_model (BaseModel): The model to validate the params.
|
|
28
|
-
progress_categories (
|
|
29
|
+
progress_categories (Dict[str] | None): The categories to update the progress.
|
|
30
|
+
metrics_categories (Dict[str] | None): The categories to update the metrics.
|
|
29
31
|
params (Dict): The params to run the action.
|
|
30
32
|
plugin_config (Dict): The plugin config.
|
|
31
33
|
plugin_release (PluginRelease): The plugin release.
|
|
@@ -48,6 +50,7 @@ class Action:
|
|
|
48
50
|
run_class = Run
|
|
49
51
|
params_model = None
|
|
50
52
|
progress_categories = None
|
|
53
|
+
metrics_categories = None
|
|
51
54
|
|
|
52
55
|
# init 변수
|
|
53
56
|
params = None
|
|
@@ -61,6 +64,7 @@ class Action:
|
|
|
61
64
|
envs = None
|
|
62
65
|
run = None
|
|
63
66
|
|
|
67
|
+
# TODO: Refactor to use Synapse Access Token instead of SYNAPSE_PLUGIN_RUN_USER_TOKEN and SYNAPSE_PLUGIN_RUN_TENANT
|
|
64
68
|
REQUIRED_ENVS = [
|
|
65
69
|
'RAY_ADDRESS',
|
|
66
70
|
'RAY_DASHBOARD_URL',
|
|
@@ -105,15 +109,37 @@ class Action:
|
|
|
105
109
|
def plugin_url(self):
|
|
106
110
|
if self.debug:
|
|
107
111
|
plugin_path = self.envs.get('SYNAPSE_DEBUG_PLUGIN_PATH') or '.'
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
112
|
+
|
|
113
|
+
# For HTTP/HTTPS URLs in debug mode, convert to Ray GCS (Global Control Store) URL
|
|
114
|
+
if plugin_path.startswith(('http://', 'https://')):
|
|
115
|
+
try:
|
|
116
|
+
from synapse_sdk.plugins.utils import convert_http_to_ray_gcs
|
|
117
|
+
|
|
118
|
+
plugin_url = convert_http_to_ray_gcs(plugin_path)
|
|
119
|
+
except (ImportError, RuntimeError):
|
|
120
|
+
plugin_url = plugin_path
|
|
121
|
+
|
|
122
|
+
elif self.envs.get('SYNAPSE_PLUGIN_STORAGE'):
|
|
113
123
|
plugin_url = archive_and_upload(plugin_path, self.plugin_storage_url)
|
|
124
|
+
else:
|
|
125
|
+
plugin_url = plugin_path
|
|
126
|
+
|
|
114
127
|
self.envs['SYNAPSE_DEBUG_PLUGIN_PATH'] = plugin_url
|
|
115
128
|
return plugin_url
|
|
116
|
-
|
|
129
|
+
|
|
130
|
+
# Production path: get URL from storage provider
|
|
131
|
+
url = self.plugin_release.get_url(self.plugin_storage_url)
|
|
132
|
+
|
|
133
|
+
# Convert HTTP URLs to Ray GCS URLs if needed
|
|
134
|
+
if url.startswith(('http://', 'https://')):
|
|
135
|
+
try:
|
|
136
|
+
from synapse_sdk.plugins.utils import convert_http_to_ray_gcs
|
|
137
|
+
|
|
138
|
+
url = convert_http_to_ray_gcs(url)
|
|
139
|
+
except (ImportError, RuntimeError):
|
|
140
|
+
pass
|
|
141
|
+
|
|
142
|
+
return url
|
|
117
143
|
|
|
118
144
|
@property
|
|
119
145
|
def debug_modules(self):
|
|
@@ -133,13 +159,38 @@ class Action:
|
|
|
133
159
|
def plugin_package_manager(self):
|
|
134
160
|
return self.plugin_config.get('package_manager', 'pip')
|
|
135
161
|
|
|
162
|
+
@property
|
|
163
|
+
def package_manager_options(self):
|
|
164
|
+
# Get user-defined options from plugin config
|
|
165
|
+
user_options = self.plugin_config.get('package_manager_options', [])
|
|
166
|
+
|
|
167
|
+
if self.plugin_package_manager == 'uv':
|
|
168
|
+
defaults = ['--no-cache']
|
|
169
|
+
# Add defaults if not already present
|
|
170
|
+
options_list = defaults.copy()
|
|
171
|
+
for option in user_options:
|
|
172
|
+
if option not in options_list:
|
|
173
|
+
options_list.append(option)
|
|
174
|
+
return {'uv_pip_install_options': options_list}
|
|
175
|
+
else:
|
|
176
|
+
# For pip, use pip_install_options with --upgrade flag to ensure
|
|
177
|
+
# packages from requirements.txt (like synapse-sdk) override pre-installed versions
|
|
178
|
+
defaults = ['--upgrade']
|
|
179
|
+
options_list = defaults.copy()
|
|
180
|
+
for option in user_options:
|
|
181
|
+
if option not in options_list:
|
|
182
|
+
options_list.append(option)
|
|
183
|
+
return {'pip_install_options': options_list}
|
|
184
|
+
|
|
136
185
|
def get_run(self):
|
|
137
186
|
context = {
|
|
138
187
|
'plugin_release': self.plugin_release,
|
|
139
188
|
'progress_categories': self.progress_categories,
|
|
189
|
+
'metrics_categories': self.metrics_categories,
|
|
140
190
|
'params': self.params,
|
|
141
191
|
'envs': self.envs,
|
|
142
192
|
'debug': self.debug,
|
|
193
|
+
'action_name': self.name,
|
|
143
194
|
}
|
|
144
195
|
return self.run_class(self.job_id, context)
|
|
145
196
|
|
|
@@ -147,13 +198,20 @@ class Action:
|
|
|
147
198
|
return {env: os.environ[env] for env in self.REQUIRED_ENVS if env in os.environ}
|
|
148
199
|
|
|
149
200
|
def get_runtime_env(self):
|
|
150
|
-
runtime_env = {self.plugin_package_manager: [], 'working_dir': self.plugin_url}
|
|
201
|
+
runtime_env = {self.plugin_package_manager: {'packages': []}, 'working_dir': self.plugin_url}
|
|
151
202
|
|
|
152
203
|
if self.requirements:
|
|
153
|
-
runtime_env[self.plugin_package_manager] += self.requirements
|
|
204
|
+
runtime_env[self.plugin_package_manager]['packages'] += self.requirements
|
|
154
205
|
|
|
155
206
|
if self.debug:
|
|
156
|
-
runtime_env[self.plugin_package_manager] += self.debug_modules
|
|
207
|
+
runtime_env[self.plugin_package_manager]['packages'] += self.debug_modules
|
|
208
|
+
|
|
209
|
+
for key, value in self.package_manager_options.items():
|
|
210
|
+
runtime_env[self.plugin_package_manager][key] = value
|
|
211
|
+
|
|
212
|
+
# Sentry init if SENTRY_DSN is set
|
|
213
|
+
if needs_sentry_init():
|
|
214
|
+
runtime_env['worker_process_setup_hook'] = 'synapse_sdk.shared.worker_process_setup_hook'
|
|
157
215
|
|
|
158
216
|
# 맨 마지막에 진행되어야 함
|
|
159
217
|
runtime_env['env_vars'] = self.envs
|
|
@@ -231,6 +289,8 @@ class Action:
|
|
|
231
289
|
|
|
232
290
|
* Executes the entrypoint with Ray job. Ray job manages the entrypoint execution and stores the results.
|
|
233
291
|
"""
|
|
292
|
+
self.ray_init()
|
|
293
|
+
|
|
234
294
|
main_options = []
|
|
235
295
|
options = ['run', '--direct']
|
|
236
296
|
arguments = [self.name, f'{json.dumps(json.dumps(self.params))}']
|
|
@@ -285,5 +345,7 @@ class Action:
|
|
|
285
345
|
def ray_init(self):
|
|
286
346
|
import ray
|
|
287
347
|
|
|
348
|
+
init_sentry()
|
|
349
|
+
|
|
288
350
|
if not ray.is_initialized():
|
|
289
351
|
ray.init(address=self.envs['RAY_ADDRESS'], ignore_reinit_error=True)
|
|
@@ -1,10 +1,82 @@
|
|
|
1
|
+
from enum import Enum
|
|
2
|
+
from typing import Any, Dict, List
|
|
3
|
+
|
|
4
|
+
from pydantic import BaseModel
|
|
5
|
+
|
|
1
6
|
from synapse_sdk.plugins.categories.base import Action
|
|
2
7
|
from synapse_sdk.plugins.categories.decorators import register_action
|
|
3
8
|
from synapse_sdk.plugins.enums import PluginCategory, RunMethod
|
|
4
9
|
|
|
5
10
|
|
|
11
|
+
class ValidationDataStatus(str, Enum):
|
|
12
|
+
"""Validation data status enumeration.
|
|
13
|
+
|
|
14
|
+
Represents the possible status values for validation operations.
|
|
15
|
+
|
|
16
|
+
Attributes:
|
|
17
|
+
SUCCESS: Validation completed successfully with no errors.
|
|
18
|
+
FAILED: Validation failed with one or more errors.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
SUCCESS = 'success'
|
|
22
|
+
FAILED = 'failed'
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class ValidationResult(BaseModel):
|
|
26
|
+
"""Validation result model.
|
|
27
|
+
|
|
28
|
+
Args:
|
|
29
|
+
status: The validation status.
|
|
30
|
+
errors: List of validation errors.
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
status: ValidationDataStatus
|
|
34
|
+
errors: List[str]
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class CriticalError(Exception):
|
|
38
|
+
"""Critical error exception for validation processing.
|
|
39
|
+
|
|
40
|
+
Raised when a critical error occurs during validation that prevents
|
|
41
|
+
the validation process from continuing normally.
|
|
42
|
+
|
|
43
|
+
Args:
|
|
44
|
+
message: Custom error message. Defaults to a standard critical error message.
|
|
45
|
+
|
|
46
|
+
Attributes:
|
|
47
|
+
message: The error message associated with this exception.
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
def __init__(self, message: str = 'Critical error occured while processing validation'):
|
|
51
|
+
self.message = message
|
|
52
|
+
super().__init__(self.message)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class ValidationParams(BaseModel):
|
|
56
|
+
"""Validation action parameters.
|
|
57
|
+
|
|
58
|
+
Args:
|
|
59
|
+
data (dict): The validation data.
|
|
60
|
+
"""
|
|
61
|
+
|
|
62
|
+
data: Dict[str, Any]
|
|
63
|
+
|
|
64
|
+
|
|
6
65
|
@register_action
|
|
7
66
|
class ValidationAction(Action):
|
|
67
|
+
"""Validation action for data validation processing.
|
|
68
|
+
|
|
69
|
+
This action handles the process of validating data with assignment IDs.
|
|
70
|
+
It supports validation methods and provides structured logging.
|
|
71
|
+
|
|
72
|
+
Attrs:
|
|
73
|
+
name (str): Action name, set to 'validation'.
|
|
74
|
+
category (PluginCategory): Plugin category, set to DATA_VALIDATION.
|
|
75
|
+
method (RunMethod): Execution method, set to TASK.
|
|
76
|
+
params_model (Type[ValidationParams]): Parameter validation model.
|
|
77
|
+
"""
|
|
78
|
+
|
|
8
79
|
name = 'validation'
|
|
9
80
|
category = PluginCategory.DATA_VALIDATION
|
|
10
81
|
method = RunMethod.TASK
|
|
82
|
+
params_model = ValidationParams
|
|
@@ -1,5 +1,33 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
from typing import Any, Dict, List, Optional
|
|
2
|
+
|
|
3
|
+
from synapse_sdk.plugins.categories.data_validation.actions.validation import ValidationDataStatus, ValidationResult
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def validate(data: Optional[Dict[str, Any]] = None, **kwargs: Any) -> Dict[str, Any]:
|
|
7
|
+
"""Validate data with assignment data.
|
|
8
|
+
|
|
9
|
+
* Custom validation logic can be added here.
|
|
10
|
+
* Error messages can be added to the errors list if errors exist in data.
|
|
11
|
+
* The validation result will be returned as a dict with ValidationResult structure.
|
|
12
|
+
|
|
13
|
+
Args:
|
|
14
|
+
data: The data to validate.
|
|
15
|
+
**kwargs: Additional arguments.
|
|
16
|
+
|
|
17
|
+
Returns:
|
|
18
|
+
Dict[str, Any]: The validation result as a dictionary with ValidationResult structure.
|
|
19
|
+
"""
|
|
20
|
+
errors: List[str] = []
|
|
21
|
+
|
|
22
|
+
# Add custom validation logic here
|
|
23
|
+
|
|
24
|
+
# Add error messages into errors list if errors exist in data
|
|
25
|
+
|
|
26
|
+
# Determine status based on errors
|
|
27
|
+
status = ValidationDataStatus.FAILED if errors else ValidationDataStatus.SUCCESS
|
|
28
|
+
|
|
29
|
+
# DO NOT MODIFY BELOW THIS LINE - Validation result should be returned as a dumped ValidationResult.
|
|
30
|
+
validation_result = ValidationResult(status=status, errors=errors)
|
|
31
|
+
result_dict = validation_result.model_dump()
|
|
32
|
+
result_dict['status'] = status.value
|
|
33
|
+
return result_dict
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
from .action import ExportAction
|
|
2
|
+
from .enums import ExportStatus, LogCode
|
|
3
|
+
from .exceptions import ExportError, ExportTargetError, ExportValidationError
|
|
4
|
+
from .models import ExportParams
|
|
5
|
+
from .run import ExportRun
|
|
6
|
+
from .utils import (
|
|
7
|
+
AssignmentExportTargetHandler,
|
|
8
|
+
ExportTargetHandler,
|
|
9
|
+
GroundTruthExportTargetHandler,
|
|
10
|
+
TargetHandlerFactory,
|
|
11
|
+
TaskExportTargetHandler,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
__all__ = [
|
|
15
|
+
'ExportAction',
|
|
16
|
+
'ExportStatus',
|
|
17
|
+
'LogCode',
|
|
18
|
+
'ExportError',
|
|
19
|
+
'ExportTargetError',
|
|
20
|
+
'ExportValidationError',
|
|
21
|
+
'ExportParams',
|
|
22
|
+
'ExportRun',
|
|
23
|
+
'ExportTargetHandler',
|
|
24
|
+
'AssignmentExportTargetHandler',
|
|
25
|
+
'GroundTruthExportTargetHandler',
|
|
26
|
+
'TaskExportTargetHandler',
|
|
27
|
+
'TargetHandlerFactory',
|
|
28
|
+
]
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
from itertools import tee
|
|
2
|
+
from typing import Any, Dict
|
|
3
|
+
|
|
4
|
+
from pydantic_core import PydanticCustomError
|
|
5
|
+
|
|
6
|
+
from synapse_sdk.clients.exceptions import ClientError
|
|
7
|
+
from synapse_sdk.i18n import gettext as _
|
|
8
|
+
from synapse_sdk.plugins.categories.base import Action
|
|
9
|
+
from synapse_sdk.plugins.categories.decorators import register_action
|
|
10
|
+
from synapse_sdk.plugins.enums import PluginCategory, RunMethod
|
|
11
|
+
from synapse_sdk.utils.storage import get_pathlib
|
|
12
|
+
|
|
13
|
+
from .enums import LogCode
|
|
14
|
+
from .models import ExportParams
|
|
15
|
+
from .run import ExportRun
|
|
16
|
+
from .utils import TargetHandlerFactory
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@register_action
|
|
20
|
+
class ExportAction(Action):
|
|
21
|
+
"""Main export action for processing and exporting data from various targets.
|
|
22
|
+
|
|
23
|
+
Handles export operations including target validation, data retrieval,
|
|
24
|
+
and file generation. Supports export from assignment, ground_truth, and task
|
|
25
|
+
targets with comprehensive progress tracking and error handling.
|
|
26
|
+
|
|
27
|
+
Features:
|
|
28
|
+
- Multiple target source support (assignment, ground_truth, task)
|
|
29
|
+
- Filter validation and data retrieval
|
|
30
|
+
- Original file and data file export options
|
|
31
|
+
- Progress tracking with detailed metrics
|
|
32
|
+
- Comprehensive error logging
|
|
33
|
+
- Project configuration handling
|
|
34
|
+
|
|
35
|
+
Class Attributes:
|
|
36
|
+
name (str): Action identifier ('export')
|
|
37
|
+
category (PluginCategory): EXPORT category
|
|
38
|
+
method (RunMethod): JOB execution method
|
|
39
|
+
run_class (type): ExportRun for specialized logging
|
|
40
|
+
params_model (type): ExportParams for parameter validation
|
|
41
|
+
progress_categories (dict): Progress tracking configuration
|
|
42
|
+
metrics_categories (dict): Metrics collection configuration
|
|
43
|
+
|
|
44
|
+
Example:
|
|
45
|
+
>>> action = ExportAction(
|
|
46
|
+
... params={
|
|
47
|
+
... 'name': 'Assignment Export',
|
|
48
|
+
... 'storage': 1,
|
|
49
|
+
... 'path': '/exports/assignments',
|
|
50
|
+
... 'target': 'assignment',
|
|
51
|
+
... 'filter': {'project': 123}
|
|
52
|
+
... },
|
|
53
|
+
... plugin_config=config
|
|
54
|
+
... )
|
|
55
|
+
>>> result = action.start()
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
name = 'export'
|
|
59
|
+
category = PluginCategory.EXPORT
|
|
60
|
+
method = RunMethod.JOB
|
|
61
|
+
params_model = ExportParams
|
|
62
|
+
run_class = ExportRun
|
|
63
|
+
progress_categories = {
|
|
64
|
+
'dataset_conversion': {
|
|
65
|
+
'proportion': 100,
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
metrics_categories = {
|
|
69
|
+
'data_file': {
|
|
70
|
+
'stand_by': 0,
|
|
71
|
+
'failed': 0,
|
|
72
|
+
'success': 0,
|
|
73
|
+
},
|
|
74
|
+
'original_file': {
|
|
75
|
+
'stand_by': 0,
|
|
76
|
+
'failed': 0,
|
|
77
|
+
'success': 0,
|
|
78
|
+
},
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
def get_filtered_results(self, filters, handler):
|
|
82
|
+
"""Get filtered target results.
|
|
83
|
+
|
|
84
|
+
Retrieves data from the specified target using the provided filters
|
|
85
|
+
through the appropriate target handler.
|
|
86
|
+
|
|
87
|
+
Args:
|
|
88
|
+
filters (dict): Filter criteria to apply
|
|
89
|
+
handler (ExportTargetHandler): Target-specific handler
|
|
90
|
+
|
|
91
|
+
Returns:
|
|
92
|
+
tuple: (results, count) where results is the data and count is total
|
|
93
|
+
|
|
94
|
+
Raises:
|
|
95
|
+
PydanticCustomError: If data retrieval fails
|
|
96
|
+
"""
|
|
97
|
+
try:
|
|
98
|
+
result_list = handler.get_results(self.client, filters)
|
|
99
|
+
results = result_list[0]
|
|
100
|
+
count = result_list[1]
|
|
101
|
+
except ClientError:
|
|
102
|
+
raise PydanticCustomError('client_error', _('Unable to get dataset.'))
|
|
103
|
+
return results, count
|
|
104
|
+
|
|
105
|
+
def start(self) -> Dict[str, Any]:
|
|
106
|
+
"""Start the export process.
|
|
107
|
+
|
|
108
|
+
Main entry point for export operations. Handles parameter preparation,
|
|
109
|
+
target handler selection, data retrieval, and export execution.
|
|
110
|
+
|
|
111
|
+
Returns:
|
|
112
|
+
Dict[str, Any]: Export results from the entrypoint
|
|
113
|
+
|
|
114
|
+
Raises:
|
|
115
|
+
Various exceptions based on validation and processing failures
|
|
116
|
+
"""
|
|
117
|
+
self.run.log_message_with_code(LogCode.EXPORT_STARTED)
|
|
118
|
+
|
|
119
|
+
# Get expand setting from config, default to True (expand data)
|
|
120
|
+
filters = {**self.params['filter']}
|
|
121
|
+
data_expand = self.config.get('data_expand', True)
|
|
122
|
+
if data_expand:
|
|
123
|
+
filters['expand'] = 'data'
|
|
124
|
+
|
|
125
|
+
target = self.params['target']
|
|
126
|
+
handler = TargetHandlerFactory.get_handler(target)
|
|
127
|
+
|
|
128
|
+
self.params['results'], self.params['count'] = self.get_filtered_results(filters, handler)
|
|
129
|
+
|
|
130
|
+
if self.params['count'] == 0:
|
|
131
|
+
self.run.log_message_with_code(LogCode.NO_RESULTS_FOUND)
|
|
132
|
+
else:
|
|
133
|
+
self.run.log_message_with_code(LogCode.RESULTS_RETRIEVED, self.params['count'])
|
|
134
|
+
|
|
135
|
+
# For the 'ground_truth' target, retrieve project information from the first result and add configuration
|
|
136
|
+
if target == 'ground_truth':
|
|
137
|
+
try:
|
|
138
|
+
# Split generator into two using tee()
|
|
139
|
+
peek_iter, main_iter = tee(self.params['results'])
|
|
140
|
+
first_result = next(peek_iter) # Peek first value only
|
|
141
|
+
project_pk = first_result['project']
|
|
142
|
+
project_info = self.client.get_project(project_pk)
|
|
143
|
+
self.params['project_id'] = project_pk
|
|
144
|
+
self.params['configuration'] = project_info.get('configuration', {})
|
|
145
|
+
self.params['results'] = main_iter # Keep original generator intact
|
|
146
|
+
except (StopIteration, KeyError):
|
|
147
|
+
self.params['configuration'] = {}
|
|
148
|
+
# For the 'assignment' and 'task' targets, retrieve the project from the filter as before
|
|
149
|
+
elif target in ['assignment', 'task'] and 'project' in self.params['filter']:
|
|
150
|
+
project_pk = self.params['filter']['project']
|
|
151
|
+
project_info = self.client.get_project(project_pk)
|
|
152
|
+
self.params['configuration'] = project_info.get('configuration', {})
|
|
153
|
+
|
|
154
|
+
export_items = handler.get_export_item(self.params['results'])
|
|
155
|
+
storage = self.client.get_storage(self.params['storage'])
|
|
156
|
+
pathlib_cwd = get_pathlib(storage, self.params['path'])
|
|
157
|
+
exporter = self.entrypoint(self.run, export_items, pathlib_cwd, **self.params)
|
|
158
|
+
|
|
159
|
+
try:
|
|
160
|
+
result = exporter.export()
|
|
161
|
+
self.run.log_message_with_code(LogCode.EXPORT_COMPLETED)
|
|
162
|
+
return result
|
|
163
|
+
except Exception as e:
|
|
164
|
+
self.run.log_message_with_code(LogCode.EXPORT_FAILED, str(e))
|
|
165
|
+
raise
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
from enum import Enum
|
|
2
|
+
|
|
3
|
+
from synapse_sdk.shared.enums import Context
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class ExportStatus(str, Enum):
|
|
7
|
+
"""Export processing status enumeration.
|
|
8
|
+
|
|
9
|
+
Defines the possible states for export operations, data files, and export items
|
|
10
|
+
throughout the export process.
|
|
11
|
+
|
|
12
|
+
Attributes:
|
|
13
|
+
SUCCESS: Export completed successfully
|
|
14
|
+
FAILED: Export failed with errors
|
|
15
|
+
STAND_BY: Export waiting to be processed
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
SUCCESS = 'success'
|
|
19
|
+
FAILED = 'failed'
|
|
20
|
+
STAND_BY = 'stand_by'
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class LogCode(str, Enum):
|
|
24
|
+
"""Type-safe logging codes for export operations.
|
|
25
|
+
|
|
26
|
+
Enumeration of all possible log events during export processing. Each code
|
|
27
|
+
corresponds to a specific event or error state with predefined message
|
|
28
|
+
templates and log levels.
|
|
29
|
+
|
|
30
|
+
The codes are organized by category:
|
|
31
|
+
- Validation codes (VALIDATION_FAILED, STORAGE_VALIDATION_FAILED, etc.)
|
|
32
|
+
- Export processing codes (EXPORT_STARTED, EXPORT_COMPLETED, etc.)
|
|
33
|
+
- File processing codes (ORIGINAL_FILE_EXPORTED, DATA_FILE_EXPORTED, etc.)
|
|
34
|
+
- Error handling codes (TARGET_HANDLER_ERROR, EXPORT_FAILED, etc.)
|
|
35
|
+
|
|
36
|
+
Each code maps to a configuration in LOG_MESSAGES with message template
|
|
37
|
+
and appropriate log level.
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
STORAGE_VALIDATION_FAILED = 'STORAGE_VALIDATION_FAILED'
|
|
41
|
+
FILTER_VALIDATION_FAILED = 'FILTER_VALIDATION_FAILED'
|
|
42
|
+
TARGET_VALIDATION_FAILED = 'TARGET_VALIDATION_FAILED'
|
|
43
|
+
VALIDATION_FAILED = 'VALIDATION_FAILED'
|
|
44
|
+
EXPORT_STARTED = 'EXPORT_STARTED'
|
|
45
|
+
EXPORT_COMPLETED = 'EXPORT_COMPLETED'
|
|
46
|
+
EXPORT_FAILED = 'EXPORT_FAILED'
|
|
47
|
+
NO_RESULTS_FOUND = 'NO_RESULTS_FOUND'
|
|
48
|
+
RESULTS_RETRIEVED = 'RESULTS_RETRIEVED'
|
|
49
|
+
ORIGINAL_FILE_EXPORTED = 'ORIGINAL_FILE_EXPORTED'
|
|
50
|
+
DATA_FILE_EXPORTED = 'DATA_FILE_EXPORTED'
|
|
51
|
+
FILE_EXPORT_FAILED = 'FILE_EXPORT_FAILED'
|
|
52
|
+
TARGET_HANDLER_ERROR = 'TARGET_HANDLER_ERROR'
|
|
53
|
+
NULL_DATA_DETECTED = 'NULL_DATA_DETECTED'
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
LOG_MESSAGES = {
|
|
57
|
+
LogCode.STORAGE_VALIDATION_FAILED: {
|
|
58
|
+
'message': 'Storage validation failed.',
|
|
59
|
+
'level': Context.DANGER,
|
|
60
|
+
},
|
|
61
|
+
LogCode.FILTER_VALIDATION_FAILED: {
|
|
62
|
+
'message': 'Filter validation failed.',
|
|
63
|
+
'level': Context.DANGER,
|
|
64
|
+
},
|
|
65
|
+
LogCode.TARGET_VALIDATION_FAILED: {
|
|
66
|
+
'message': 'Target validation failed.',
|
|
67
|
+
'level': Context.DANGER,
|
|
68
|
+
},
|
|
69
|
+
LogCode.VALIDATION_FAILED: {
|
|
70
|
+
'message': 'Validation failed.',
|
|
71
|
+
'level': Context.DANGER,
|
|
72
|
+
},
|
|
73
|
+
LogCode.EXPORT_STARTED: {
|
|
74
|
+
'message': 'Export process started.',
|
|
75
|
+
'level': None,
|
|
76
|
+
},
|
|
77
|
+
LogCode.EXPORT_COMPLETED: {
|
|
78
|
+
'message': 'Export process completed.',
|
|
79
|
+
'level': None,
|
|
80
|
+
},
|
|
81
|
+
LogCode.EXPORT_FAILED: {
|
|
82
|
+
'message': 'Export process failed: {}',
|
|
83
|
+
'level': Context.DANGER,
|
|
84
|
+
},
|
|
85
|
+
LogCode.NO_RESULTS_FOUND: {
|
|
86
|
+
'message': 'No results found for export.',
|
|
87
|
+
'level': Context.WARNING,
|
|
88
|
+
},
|
|
89
|
+
LogCode.RESULTS_RETRIEVED: {
|
|
90
|
+
'message': 'Retrieved {} results for export',
|
|
91
|
+
'level': None,
|
|
92
|
+
},
|
|
93
|
+
LogCode.ORIGINAL_FILE_EXPORTED: {
|
|
94
|
+
'message': 'Original file exported successfully.',
|
|
95
|
+
'level': None,
|
|
96
|
+
},
|
|
97
|
+
LogCode.DATA_FILE_EXPORTED: {
|
|
98
|
+
'message': 'Data file exported successfully.',
|
|
99
|
+
'level': None,
|
|
100
|
+
},
|
|
101
|
+
LogCode.FILE_EXPORT_FAILED: {
|
|
102
|
+
'message': 'Failed to export file: {}',
|
|
103
|
+
'level': Context.DANGER,
|
|
104
|
+
},
|
|
105
|
+
LogCode.TARGET_HANDLER_ERROR: {
|
|
106
|
+
'message': 'Target handler error: {}',
|
|
107
|
+
'level': Context.DANGER,
|
|
108
|
+
},
|
|
109
|
+
LogCode.NULL_DATA_DETECTED: {
|
|
110
|
+
'message': 'Data is null for export item',
|
|
111
|
+
'level': Context.WARNING,
|
|
112
|
+
},
|
|
113
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
class ExportError(Exception):
|
|
2
|
+
"""Base exception for export-related errors.
|
|
3
|
+
|
|
4
|
+
This exception is raised when an export operation encounters errors
|
|
5
|
+
that prevent successful completion. It serves as the base class for
|
|
6
|
+
more specific export-related exceptions.
|
|
7
|
+
|
|
8
|
+
Used during export processing to handle various error conditions
|
|
9
|
+
such as validation failures, data access errors, or processing issues.
|
|
10
|
+
|
|
11
|
+
Example:
|
|
12
|
+
>>> if not validate_export_data(data):
|
|
13
|
+
... raise ExportError("Export data validation failed")
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
pass
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class ExportValidationError(ExportError):
|
|
20
|
+
"""Exception raised when export parameter validation fails.
|
|
21
|
+
|
|
22
|
+
This exception is raised when export parameters or configuration
|
|
23
|
+
fail validation checks, preventing the export operation from starting.
|
|
24
|
+
|
|
25
|
+
Used during parameter validation to distinguish validation errors
|
|
26
|
+
from other types of export failures.
|
|
27
|
+
|
|
28
|
+
Example:
|
|
29
|
+
>>> if not storage_exists(storage_id):
|
|
30
|
+
... raise ExportValidationError(f"Storage {storage_id} does not exist")
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
pass
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class ExportTargetError(ExportError):
|
|
37
|
+
"""Exception raised when export target handling encounters errors.
|
|
38
|
+
|
|
39
|
+
This exception is raised when target-specific operations (assignment,
|
|
40
|
+
ground_truth, task) fail due to data access issues, filter problems,
|
|
41
|
+
or target-specific validation failures.
|
|
42
|
+
|
|
43
|
+
Used during target data retrieval and processing to handle target-specific
|
|
44
|
+
errors separately from general export errors.
|
|
45
|
+
|
|
46
|
+
Example:
|
|
47
|
+
>>> try:
|
|
48
|
+
... results = client.list_assignments(params=filters)
|
|
49
|
+
... except ClientError as e:
|
|
50
|
+
... raise ExportTargetError(f"Failed to retrieve assignments: {e}")
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
pass
|