synapse-sdk 1.0.0a13__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 +310 -5
- synapse_sdk/cli/alias/__init__.py +22 -0
- synapse_sdk/cli/alias/create.py +36 -0
- synapse_sdk/cli/alias/dataclass.py +31 -0
- synapse_sdk/cli/alias/default.py +16 -0
- synapse_sdk/cli/alias/delete.py +15 -0
- synapse_sdk/cli/alias/list.py +19 -0
- synapse_sdk/cli/alias/read.py +15 -0
- synapse_sdk/cli/alias/update.py +17 -0
- synapse_sdk/cli/alias/utils.py +61 -0
- synapse_sdk/cli/code_server.py +687 -0
- synapse_sdk/cli/config.py +440 -0
- synapse_sdk/cli/devtools.py +90 -0
- synapse_sdk/cli/plugin/__init__.py +33 -0
- synapse_sdk/cli/{create_plugin.py → plugin/create.py} +2 -2
- synapse_sdk/cli/plugin/publish.py +45 -0
- synapse_sdk/{plugins/cli → cli/plugin}/run.py +12 -5
- 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 +41 -12
- synapse_sdk/clients/backend/annotation.py +13 -5
- synapse_sdk/clients/backend/core.py +59 -0
- synapse_sdk/clients/backend/data_collection.py +186 -0
- synapse_sdk/clients/backend/hitl.py +17 -0
- synapse_sdk/clients/backend/integration.py +19 -4
- synapse_sdk/clients/backend/ml.py +10 -7
- synapse_sdk/clients/backend/models.py +78 -0
- synapse_sdk/clients/base.py +381 -34
- synapse_sdk/clients/ray/serve.py +2 -0
- synapse_sdk/clients/validators/collections.py +31 -0
- synapse_sdk/devtools/config.py +94 -0
- synapse_sdk/devtools/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 +74 -9
- synapse_sdk/plugins/README.md +1340 -0
- synapse_sdk/plugins/__init__.py +0 -13
- synapse_sdk/plugins/categories/base.py +145 -30
- synapse_sdk/plugins/categories/data_validation/actions/validation.py +72 -0
- synapse_sdk/plugins/categories/data_validation/templates/plugin/validation.py +33 -5
- synapse_sdk/plugins/categories/export/actions/__init__.py +3 -0
- synapse_sdk/plugins/categories/export/actions/export/__init__.py +28 -0
- synapse_sdk/plugins/categories/export/actions/export/action.py +165 -0
- synapse_sdk/plugins/categories/export/actions/export/enums.py +113 -0
- synapse_sdk/plugins/categories/export/actions/export/exceptions.py +53 -0
- synapse_sdk/plugins/categories/export/actions/export/models.py +74 -0
- synapse_sdk/plugins/categories/export/actions/export/run.py +195 -0
- synapse_sdk/plugins/categories/export/actions/export/utils.py +187 -0
- synapse_sdk/plugins/categories/export/templates/config.yaml +21 -0
- synapse_sdk/plugins/categories/export/templates/plugin/__init__.py +390 -0
- synapse_sdk/plugins/categories/export/templates/plugin/export.py +160 -0
- synapse_sdk/plugins/categories/neural_net/actions/deployment.py +29 -14
- synapse_sdk/plugins/categories/neural_net/actions/inference.py +13 -1
- synapse_sdk/plugins/categories/neural_net/actions/train.py +1084 -38
- synapse_sdk/plugins/categories/neural_net/actions/tune.py +534 -0
- synapse_sdk/plugins/categories/neural_net/base/__init__.py +0 -0
- synapse_sdk/plugins/categories/neural_net/base/inference.py +37 -0
- synapse_sdk/plugins/categories/neural_net/templates/config.yaml +30 -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/{export/actions/export.py → pre_annotation/actions/pre_annotation/action.py} +4 -4
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/__init__.py +28 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/action.py +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/smart_tool/templates/config.yaml +5 -2
- synapse_sdk/plugins/categories/upload/__init__.py +0 -0
- synapse_sdk/plugins/categories/upload/actions/__init__.py +0 -0
- synapse_sdk/plugins/categories/upload/actions/upload/__init__.py +19 -0
- synapse_sdk/plugins/categories/upload/actions/upload/action.py +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 +33 -0
- synapse_sdk/plugins/categories/upload/templates/plugin/__init__.py +294 -0
- synapse_sdk/plugins/categories/upload/templates/plugin/upload.py +102 -0
- synapse_sdk/plugins/enums.py +3 -1
- synapse_sdk/plugins/models.py +140 -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/config.yaml +1 -0
- synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/requirements.txt +1 -1
- synapse_sdk/plugins/utils/__init__.py +46 -0
- synapse_sdk/plugins/utils/actions.py +119 -0
- synapse_sdk/plugins/utils/config.py +203 -0
- synapse_sdk/plugins/utils/legacy.py +95 -0
- synapse_sdk/plugins/utils/ray_gcs.py +66 -0
- synapse_sdk/plugins/utils/registry.py +58 -0
- synapse_sdk/shared/__init__.py +25 -0
- synapse_sdk/shared/enums.py +93 -0
- synapse_sdk/types.py +19 -0
- synapse_sdk/utils/converters/__init__.py +240 -0
- synapse_sdk/utils/converters/coco/__init__.py +0 -0
- synapse_sdk/utils/converters/coco/from_dm.py +322 -0
- synapse_sdk/utils/converters/coco/to_dm.py +215 -0
- synapse_sdk/utils/converters/dm/__init__.py +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.backup +301 -0
- synapse_sdk/utils/http.py +138 -0
- synapse_sdk/utils/network.py +309 -0
- synapse_sdk/utils/storage/__init__.py +72 -0
- synapse_sdk/utils/storage/providers/__init__.py +183 -0
- synapse_sdk/utils/storage/providers/file_system.py +134 -0
- synapse_sdk/utils/storage/providers/gcp.py +13 -0
- synapse_sdk/utils/storage/providers/http.py +190 -0
- synapse_sdk/utils/storage/providers/s3.py +91 -0
- synapse_sdk/utils/storage/providers/sftp.py +47 -0
- synapse_sdk/utils/storage/registry.py +17 -0
- synapse_sdk-2025.11.7.dist-info/METADATA +122 -0
- synapse_sdk-2025.11.7.dist-info/RECORD +386 -0
- {synapse_sdk-1.0.0a13.dist-info → synapse_sdk-2025.11.7.dist-info}/WHEEL +1 -1
- synapse_sdk/clients/backend/dataset.py +0 -51
- synapse_sdk/plugins/categories/import/actions/import.py +0 -10
- synapse_sdk/plugins/cli/__init__.py +0 -21
- synapse_sdk/plugins/cli/publish.py +0 -37
- synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/.env +0 -24
- synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/.env.dist +0 -24
- synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/main.py +0 -4
- synapse_sdk/plugins/utils.py +0 -50
- synapse_sdk/utils/file.py +0 -87
- synapse_sdk/utils/storage.py +0 -91
- synapse_sdk-1.0.0a13.dist-info/METADATA +0 -43
- synapse_sdk-1.0.0a13.dist-info/RECORD +0 -111
- /synapse_sdk/{plugins/categories/import → clients/validators}/__init__.py +0 -0
- /synapse_sdk/{plugins/categories/import/actions → devtools}/__init__.py +0 -0
- {synapse_sdk-1.0.0a13.dist-info → synapse_sdk-2025.11.7.dist-info}/entry_points.txt +0 -0
- {synapse_sdk-1.0.0a13.dist-info → synapse_sdk-2025.11.7.dist-info/licenses}/LICENSE +0 -0
- {synapse_sdk-1.0.0a13.dist-info → synapse_sdk-2025.11.7.dist-info}/top_level.txt +0 -0
synapse_sdk/plugins/__init__.py
CHANGED
|
@@ -11,12 +11,38 @@ 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
|
|
|
18
19
|
|
|
19
20
|
class Action:
|
|
21
|
+
"""Base class for all plugin actions.
|
|
22
|
+
|
|
23
|
+
Attrs:
|
|
24
|
+
name (str): The name of the action.
|
|
25
|
+
category (PluginCategory): The category of the action.
|
|
26
|
+
method (RunMethod): The method to run of the action.
|
|
27
|
+
run_class (Run): The class to run the action.
|
|
28
|
+
params_model (BaseModel): The model to validate the params.
|
|
29
|
+
progress_categories (Dict[str] | None): The categories to update the progress.
|
|
30
|
+
metrics_categories (Dict[str] | None): The categories to update the metrics.
|
|
31
|
+
params (Dict): The params to run the action.
|
|
32
|
+
plugin_config (Dict): The plugin config.
|
|
33
|
+
plugin_release (PluginRelease): The plugin release.
|
|
34
|
+
config (Dict): The action config.
|
|
35
|
+
requirements (List[str]): The requirements to install.
|
|
36
|
+
job_id (str): The job id.
|
|
37
|
+
direct (bool): The flag to run the action directly.
|
|
38
|
+
debug (bool): The flag to run the action in debug mode.
|
|
39
|
+
envs (Dict): The runtime envs.
|
|
40
|
+
run (Run): The run instance.
|
|
41
|
+
|
|
42
|
+
Raises:
|
|
43
|
+
ActionError: If the action fails.
|
|
44
|
+
"""
|
|
45
|
+
|
|
20
46
|
# class 변수
|
|
21
47
|
name = None
|
|
22
48
|
category = None
|
|
@@ -24,19 +50,22 @@ class Action:
|
|
|
24
50
|
run_class = Run
|
|
25
51
|
params_model = None
|
|
26
52
|
progress_categories = None
|
|
53
|
+
metrics_categories = None
|
|
27
54
|
|
|
28
55
|
# init 변수
|
|
29
56
|
params = None
|
|
30
57
|
plugin_config = None
|
|
31
58
|
plugin_release = None
|
|
32
59
|
config = None
|
|
60
|
+
requirements = None
|
|
33
61
|
job_id = None
|
|
34
62
|
direct = None
|
|
35
63
|
debug = None
|
|
36
64
|
envs = None
|
|
37
65
|
run = None
|
|
38
66
|
|
|
39
|
-
|
|
67
|
+
# TODO: Refactor to use Synapse Access Token instead of SYNAPSE_PLUGIN_RUN_USER_TOKEN and SYNAPSE_PLUGIN_RUN_TENANT
|
|
68
|
+
REQUIRED_ENVS = [
|
|
40
69
|
'RAY_ADDRESS',
|
|
41
70
|
'RAY_DASHBOARD_URL',
|
|
42
71
|
'RAY_SERVE_ADDRESS',
|
|
@@ -48,11 +77,12 @@ class Action:
|
|
|
48
77
|
'SYNAPSE_PLUGIN_RUN_TENANT',
|
|
49
78
|
]
|
|
50
79
|
|
|
51
|
-
def __init__(self, params, plugin_config, envs=None, job_id=None, direct=False, debug=False):
|
|
80
|
+
def __init__(self, params, plugin_config, requirements=None, envs=None, job_id=None, direct=False, debug=False):
|
|
52
81
|
self.params = params
|
|
53
82
|
self.plugin_config = plugin_config
|
|
54
83
|
self.plugin_release = PluginRelease(config=plugin_config)
|
|
55
84
|
self.config = self.plugin_release.get_action_config(self.name)
|
|
85
|
+
self.requirements = requirements
|
|
56
86
|
self.job_id = job_id
|
|
57
87
|
self.direct = direct
|
|
58
88
|
self.debug = debug
|
|
@@ -79,49 +109,109 @@ class Action:
|
|
|
79
109
|
def plugin_url(self):
|
|
80
110
|
if self.debug:
|
|
81
111
|
plugin_path = self.envs.get('SYNAPSE_DEBUG_PLUGIN_PATH') or '.'
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
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'):
|
|
87
123
|
plugin_url = archive_and_upload(plugin_path, self.plugin_storage_url)
|
|
124
|
+
else:
|
|
125
|
+
plugin_url = plugin_path
|
|
126
|
+
|
|
88
127
|
self.envs['SYNAPSE_DEBUG_PLUGIN_PATH'] = plugin_url
|
|
89
128
|
return plugin_url
|
|
90
|
-
|
|
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
|
|
91
143
|
|
|
92
144
|
@property
|
|
93
145
|
def debug_modules(self):
|
|
94
146
|
debug_modules = []
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
147
|
+
if self.envs.get('SYNAPSE_DEBUG_MODULES'):
|
|
148
|
+
for module_path in self.envs['SYNAPSE_DEBUG_MODULES'].split(','):
|
|
149
|
+
# TODO ray에서 지원하는 remote uri 형식 (https, s3, gs) 모두 지원
|
|
150
|
+
if module_path.startswith('https://'):
|
|
151
|
+
module_url = module_path
|
|
152
|
+
else:
|
|
153
|
+
module_url = build_and_upload(module_path, self.plugin_storage_url)
|
|
154
|
+
debug_modules.append(module_url)
|
|
155
|
+
self.envs['SYNAPSE_DEBUG_MODULES'] = ','.join(debug_modules)
|
|
102
156
|
return debug_modules
|
|
103
157
|
|
|
158
|
+
@property
|
|
159
|
+
def plugin_package_manager(self):
|
|
160
|
+
return self.plugin_config.get('package_manager', 'pip')
|
|
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
|
+
|
|
104
185
|
def get_run(self):
|
|
105
186
|
context = {
|
|
106
187
|
'plugin_release': self.plugin_release,
|
|
107
188
|
'progress_categories': self.progress_categories,
|
|
189
|
+
'metrics_categories': self.metrics_categories,
|
|
108
190
|
'params': self.params,
|
|
109
191
|
'envs': self.envs,
|
|
110
192
|
'debug': self.debug,
|
|
193
|
+
'action_name': self.name,
|
|
111
194
|
}
|
|
112
195
|
return self.run_class(self.job_id, context)
|
|
113
196
|
|
|
114
197
|
def get_default_envs(self):
|
|
115
|
-
return {env: os.environ[env] for env in self.
|
|
198
|
+
return {env: os.environ[env] for env in self.REQUIRED_ENVS if env in os.environ}
|
|
116
199
|
|
|
117
200
|
def get_runtime_env(self):
|
|
118
|
-
runtime_env = {
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
201
|
+
runtime_env = {self.plugin_package_manager: {'packages': []}, 'working_dir': self.plugin_url}
|
|
202
|
+
|
|
203
|
+
if self.requirements:
|
|
204
|
+
runtime_env[self.plugin_package_manager]['packages'] += self.requirements
|
|
122
205
|
|
|
123
206
|
if self.debug:
|
|
124
|
-
runtime_env['
|
|
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'
|
|
125
215
|
|
|
126
216
|
# 맨 마지막에 진행되어야 함
|
|
127
217
|
runtime_env['env_vars'] = self.envs
|
|
@@ -145,16 +235,25 @@ class Action:
|
|
|
145
235
|
return self.start_by_restapi()
|
|
146
236
|
else:
|
|
147
237
|
result = self.start()
|
|
148
|
-
self.
|
|
238
|
+
if self.job_id:
|
|
239
|
+
self.post_action_by_job(result)
|
|
149
240
|
return result
|
|
150
241
|
return getattr(self, f'start_by_{self.method.value}')()
|
|
151
242
|
|
|
152
243
|
def start(self):
|
|
244
|
+
"""Start the action.
|
|
245
|
+
|
|
246
|
+
TODO: Specify the return type of start method for overrided methods.
|
|
247
|
+
"""
|
|
153
248
|
if self.method == RunMethod.JOB:
|
|
154
249
|
return self.entrypoint(self.run, **self.params)
|
|
155
250
|
return self.entrypoint(**self.params)
|
|
156
251
|
|
|
157
252
|
def start_by_task(self):
|
|
253
|
+
"""Ray Task based execution.
|
|
254
|
+
|
|
255
|
+
* A task method that simply executes the entrypoint without job management functionality.
|
|
256
|
+
"""
|
|
158
257
|
import ray
|
|
159
258
|
from ray.exceptions import RayTaskError
|
|
160
259
|
|
|
@@ -180,13 +279,18 @@ class Action:
|
|
|
180
279
|
|
|
181
280
|
kwargs['direct'] = True
|
|
182
281
|
try:
|
|
183
|
-
|
|
184
|
-
ray.init(address=self.envs['RAY_ADDRESS'], ignore_reinit_error=True)
|
|
282
|
+
self.ray_init()
|
|
185
283
|
return ray.get(run_task.remote(self.category.value, self.name, *args, **kwargs))
|
|
186
284
|
except RayTaskError as e:
|
|
187
285
|
raise ActionError(e.cause)
|
|
188
286
|
|
|
189
287
|
def start_by_job(self):
|
|
288
|
+
"""Ray Job based execution.
|
|
289
|
+
|
|
290
|
+
* Executes the entrypoint with Ray job. Ray job manages the entrypoint execution and stores the results.
|
|
291
|
+
"""
|
|
292
|
+
self.ray_init()
|
|
293
|
+
|
|
190
294
|
main_options = []
|
|
191
295
|
options = ['run', '--direct']
|
|
192
296
|
arguments = [self.name, f'{json.dumps(json.dumps(self.params))}']
|
|
@@ -202,11 +306,15 @@ class Action:
|
|
|
202
306
|
client = self.get_job_client()
|
|
203
307
|
return client.submit_job(
|
|
204
308
|
submission_id=self.job_id,
|
|
205
|
-
entrypoint=f'
|
|
309
|
+
entrypoint=f'synapse plugin {cmd}',
|
|
206
310
|
runtime_env=self.get_runtime_env(),
|
|
207
311
|
)
|
|
208
312
|
|
|
209
313
|
def start_by_restapi(self):
|
|
314
|
+
"""Ray Serve based execution.
|
|
315
|
+
|
|
316
|
+
* This method executes a Fastapi endpoint defined within the Plugin.
|
|
317
|
+
"""
|
|
210
318
|
path = self.params.pop('path', '')
|
|
211
319
|
method = self.params.pop('method')
|
|
212
320
|
|
|
@@ -225,12 +333,19 @@ class Action:
|
|
|
225
333
|
raise ActionError('Unable to connect to serve application')
|
|
226
334
|
|
|
227
335
|
def post_action_by_job(self, result):
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
self.client.update_job(self.job_id, data={'result': result or {}, 'console_logs': logs})
|
|
336
|
+
job_client = self.get_job_client()
|
|
337
|
+
logs = job_client.get_job_logs(self.job_id).split('\n')
|
|
338
|
+
self.client.update_job(self.job_id, data={'result': result or {}, 'console_logs': logs})
|
|
232
339
|
|
|
233
340
|
def get_job_client(self):
|
|
234
341
|
from ray.dashboard.modules.job.sdk import JobSubmissionClient
|
|
235
342
|
|
|
236
343
|
return JobSubmissionClient(address=self.envs.get('RAY_DASHBOARD_URL'))
|
|
344
|
+
|
|
345
|
+
def ray_init(self):
|
|
346
|
+
import ray
|
|
347
|
+
|
|
348
|
+
init_sentry()
|
|
349
|
+
|
|
350
|
+
if not ray.is_initialized():
|
|
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
|