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
|
@@ -0,0 +1,422 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: data-collection-mixin
|
|
3
|
+
title: DataCollectionClientMixin
|
|
4
|
+
sidebar_position: 3
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# DataCollectionClientMixin
|
|
8
|
+
|
|
9
|
+
Provides data collection and file management operations for the Synapse backend.
|
|
10
|
+
|
|
11
|
+
## Overview
|
|
12
|
+
|
|
13
|
+
The `DataCollectionClientMixin` handles all operations related to data collections, file uploads, data units, and batch processing. This mixin is automatically included in the `BackendClient` and provides methods for managing large-scale data operations.
|
|
14
|
+
|
|
15
|
+
## Data Collection Operations
|
|
16
|
+
|
|
17
|
+
### `list_data_collection()`
|
|
18
|
+
|
|
19
|
+
Retrieve a list of all available data collections.
|
|
20
|
+
|
|
21
|
+
```python
|
|
22
|
+
collections = client.list_data_collection()
|
|
23
|
+
for collection in collections:
|
|
24
|
+
print(f"Collection: {collection['name']} (ID: {collection['id']})")
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**Returns:**
|
|
28
|
+
|
|
29
|
+
- `list`: List of data collection objects
|
|
30
|
+
|
|
31
|
+
### `get_data_collection(data_collection_id)`
|
|
32
|
+
|
|
33
|
+
Get detailed information about a specific data collection.
|
|
34
|
+
|
|
35
|
+
```python
|
|
36
|
+
collection = client.get_data_collection(123)
|
|
37
|
+
print(f"Collection: {collection['name']}")
|
|
38
|
+
print(f"Description: {collection['description']}")
|
|
39
|
+
|
|
40
|
+
# Access file specifications
|
|
41
|
+
file_specs = collection['file_specifications']
|
|
42
|
+
for spec in file_specs:
|
|
43
|
+
print(f"File type: {spec['name']}, Required: {spec['is_required']}")
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
**Parameters:**
|
|
47
|
+
|
|
48
|
+
- `data_collection_id` (int): Data collection ID
|
|
49
|
+
|
|
50
|
+
**Returns:**
|
|
51
|
+
|
|
52
|
+
- `dict`: Detailed collection information including file specifications
|
|
53
|
+
|
|
54
|
+
**Collection structure:**
|
|
55
|
+
|
|
56
|
+
- `id`: Collection ID
|
|
57
|
+
- `name`: Collection name
|
|
58
|
+
- `description`: Collection description
|
|
59
|
+
- `file_specifications`: List of required file types and formats
|
|
60
|
+
- `project`: Associated project ID
|
|
61
|
+
- `created_at`: Creation timestamp
|
|
62
|
+
|
|
63
|
+
## File Operations
|
|
64
|
+
|
|
65
|
+
### `create_data_file(file_path, use_chunked_upload=False)`
|
|
66
|
+
|
|
67
|
+
Create and upload a data file to the backend.
|
|
68
|
+
|
|
69
|
+
```python
|
|
70
|
+
from pathlib import Path
|
|
71
|
+
|
|
72
|
+
# Regular upload for smaller files
|
|
73
|
+
data_file = client.create_data_file(Path('/path/to/image.jpg'))
|
|
74
|
+
print(f"Uploaded file ID: {data_file['id']}")
|
|
75
|
+
|
|
76
|
+
# Chunked upload for large files (>50MB recommended)
|
|
77
|
+
large_file = client.create_data_file(
|
|
78
|
+
Path('/path/to/large_dataset.zip'),
|
|
79
|
+
use_chunked_upload=True
|
|
80
|
+
)
|
|
81
|
+
print(f"Large file uploaded: {large_file['id']}")
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
**Parameters:**
|
|
85
|
+
|
|
86
|
+
- `file_path` (Path): Path object pointing to the file to upload
|
|
87
|
+
- `use_chunked_upload` (bool): Enable chunked upload for large files
|
|
88
|
+
|
|
89
|
+
**Returns:**
|
|
90
|
+
|
|
91
|
+
- `dict` or `str`: File upload response with file ID and metadata
|
|
92
|
+
|
|
93
|
+
**When to use chunked upload:**
|
|
94
|
+
|
|
95
|
+
- Files larger than 50MB
|
|
96
|
+
- Unreliable network connections
|
|
97
|
+
- When you need upload progress tracking
|
|
98
|
+
- For better error recovery
|
|
99
|
+
|
|
100
|
+
### `upload_data_file(organized_file, collection_id, use_chunked_upload=False)`
|
|
101
|
+
|
|
102
|
+
Upload organized file data to a specific collection.
|
|
103
|
+
|
|
104
|
+
```python
|
|
105
|
+
# Organize file data
|
|
106
|
+
organized_file = {
|
|
107
|
+
'files': {
|
|
108
|
+
'image': Path('/path/to/image.jpg'),
|
|
109
|
+
'annotation': Path('/path/to/annotation.json'),
|
|
110
|
+
'metadata': Path('/path/to/metadata.xml')
|
|
111
|
+
},
|
|
112
|
+
'meta': {
|
|
113
|
+
'origin_file_stem': 'sample_001',
|
|
114
|
+
'origin_file_extension': '.jpg',
|
|
115
|
+
'created_at': '2023-10-01T12:00:00Z',
|
|
116
|
+
'batch_id': 'batch_001'
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
# Upload to collection
|
|
121
|
+
result = client.upload_data_file(
|
|
122
|
+
organized_file=organized_file,
|
|
123
|
+
collection_id=123,
|
|
124
|
+
use_chunked_upload=False
|
|
125
|
+
)
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
**Parameters:**
|
|
129
|
+
|
|
130
|
+
- `organized_file` (dict): Structured file data with files and metadata
|
|
131
|
+
- `collection_id` (int): Target data collection ID
|
|
132
|
+
- `use_chunked_upload` (bool): Enable chunked upload
|
|
133
|
+
|
|
134
|
+
**Organized file structure:**
|
|
135
|
+
|
|
136
|
+
- `files` (dict): Dictionary mapping file types to file paths
|
|
137
|
+
- `meta` (dict): Metadata associated with the file group
|
|
138
|
+
|
|
139
|
+
**Returns:**
|
|
140
|
+
|
|
141
|
+
- `dict`: Upload result with file references and IDs
|
|
142
|
+
|
|
143
|
+
### `create_data_units(uploaded_files)`
|
|
144
|
+
|
|
145
|
+
Create data units from previously uploaded files.
|
|
146
|
+
|
|
147
|
+
```python
|
|
148
|
+
# Files that have been uploaded
|
|
149
|
+
uploaded_files = [
|
|
150
|
+
{
|
|
151
|
+
'id': 1,
|
|
152
|
+
'file': {'image': 'file_id_123', 'annotation': 'file_id_124'},
|
|
153
|
+
'meta': {'batch': 'batch_001'}
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
'id': 2,
|
|
157
|
+
'file': {'image': 'file_id_125', 'annotation': 'file_id_126'},
|
|
158
|
+
'meta': {'batch': 'batch_001'}
|
|
159
|
+
}
|
|
160
|
+
]
|
|
161
|
+
|
|
162
|
+
# Create data units
|
|
163
|
+
data_units = client.create_data_units(uploaded_files)
|
|
164
|
+
print(f"Created {len(data_units)} data units")
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
**Parameters:**
|
|
168
|
+
|
|
169
|
+
- `uploaded_files` (list): List of uploaded file structures
|
|
170
|
+
|
|
171
|
+
**Returns:**
|
|
172
|
+
|
|
173
|
+
- `list`: Created data units with IDs and metadata
|
|
174
|
+
|
|
175
|
+
## Batch Processing
|
|
176
|
+
|
|
177
|
+
The mixin supports efficient batch processing for large-scale operations:
|
|
178
|
+
|
|
179
|
+
```python
|
|
180
|
+
from multiprocessing import Pool
|
|
181
|
+
from pathlib import Path
|
|
182
|
+
|
|
183
|
+
# Example: Batch upload multiple files
|
|
184
|
+
file_paths = [
|
|
185
|
+
Path('/data/batch1/file1.jpg'),
|
|
186
|
+
Path('/data/batch1/file2.jpg'),
|
|
187
|
+
Path('/data/batch1/file3.jpg'),
|
|
188
|
+
# ... more files
|
|
189
|
+
]
|
|
190
|
+
|
|
191
|
+
# Process files in batches
|
|
192
|
+
batch_size = 10
|
|
193
|
+
for i in range(0, len(file_paths), batch_size):
|
|
194
|
+
batch = file_paths[i:i+batch_size]
|
|
195
|
+
|
|
196
|
+
# Upload batch
|
|
197
|
+
uploaded_files = []
|
|
198
|
+
for file_path in batch:
|
|
199
|
+
result = client.create_data_file(file_path)
|
|
200
|
+
uploaded_files.append({
|
|
201
|
+
'id': len(uploaded_files) + 1,
|
|
202
|
+
'file': {'image': result['id']},
|
|
203
|
+
'meta': {'batch': f'batch_{i//batch_size}'}
|
|
204
|
+
})
|
|
205
|
+
|
|
206
|
+
# Create data units for batch
|
|
207
|
+
data_units = client.create_data_units(uploaded_files)
|
|
208
|
+
print(f"Processed batch {i//batch_size}: {len(data_units)} data units")
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
## Progress Tracking
|
|
212
|
+
|
|
213
|
+
For large uploads, you can track progress:
|
|
214
|
+
|
|
215
|
+
```python
|
|
216
|
+
import os
|
|
217
|
+
from tqdm import tqdm
|
|
218
|
+
|
|
219
|
+
def upload_with_progress(file_paths, collection_id):
|
|
220
|
+
"""Upload files with progress tracking."""
|
|
221
|
+
uploaded_files = []
|
|
222
|
+
|
|
223
|
+
with tqdm(total=len(file_paths), desc="Uploading files") as pbar:
|
|
224
|
+
for file_path in file_paths:
|
|
225
|
+
try:
|
|
226
|
+
# Check file size to decide upload method
|
|
227
|
+
file_size = os.path.getsize(file_path)
|
|
228
|
+
use_chunked = file_size > 50 * 1024 * 1024 # 50MB
|
|
229
|
+
|
|
230
|
+
# Upload file
|
|
231
|
+
result = client.create_data_file(
|
|
232
|
+
file_path,
|
|
233
|
+
use_chunked_upload=use_chunked
|
|
234
|
+
)
|
|
235
|
+
|
|
236
|
+
# Organize for collection
|
|
237
|
+
organized_file = {
|
|
238
|
+
'files': {'primary': file_path},
|
|
239
|
+
'meta': {
|
|
240
|
+
'origin_file_stem': file_path.stem,
|
|
241
|
+
'origin_file_extension': file_path.suffix,
|
|
242
|
+
'file_size': file_size
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
upload_result = client.upload_data_file(
|
|
247
|
+
organized_file,
|
|
248
|
+
collection_id,
|
|
249
|
+
use_chunked_upload=use_chunked
|
|
250
|
+
)
|
|
251
|
+
|
|
252
|
+
uploaded_files.append(upload_result)
|
|
253
|
+
pbar.update(1)
|
|
254
|
+
|
|
255
|
+
except Exception as e:
|
|
256
|
+
print(f"Failed to upload {file_path}: {e}")
|
|
257
|
+
pbar.update(1)
|
|
258
|
+
continue
|
|
259
|
+
|
|
260
|
+
return uploaded_files
|
|
261
|
+
|
|
262
|
+
# Usage
|
|
263
|
+
file_paths = [Path(f'/data/file_{i}.jpg') for i in range(100)]
|
|
264
|
+
results = upload_with_progress(file_paths, collection_id=123)
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
## Data Validation
|
|
268
|
+
|
|
269
|
+
### File Specification Validation
|
|
270
|
+
|
|
271
|
+
```python
|
|
272
|
+
def validate_files_against_collection(file_paths, collection_id):
|
|
273
|
+
"""Validate files against collection specifications."""
|
|
274
|
+
collection = client.get_data_collection(collection_id)
|
|
275
|
+
file_specs = collection['file_specifications']
|
|
276
|
+
|
|
277
|
+
# Create specification lookup
|
|
278
|
+
required_types = {spec['name'] for spec in file_specs if spec['is_required']}
|
|
279
|
+
optional_types = {spec['name'] for spec in file_specs if not spec['is_required']}
|
|
280
|
+
|
|
281
|
+
# Validate file organization
|
|
282
|
+
organized_files = []
|
|
283
|
+
for file_path in file_paths:
|
|
284
|
+
# Extract file type from path or metadata
|
|
285
|
+
file_type = extract_file_type(file_path) # Custom function
|
|
286
|
+
|
|
287
|
+
if file_type in required_types or file_type in optional_types:
|
|
288
|
+
organized_files.append({
|
|
289
|
+
'path': file_path,
|
|
290
|
+
'type': file_type,
|
|
291
|
+
'valid': True
|
|
292
|
+
})
|
|
293
|
+
else:
|
|
294
|
+
print(f"Warning: Unknown file type '{file_type}' for {file_path}")
|
|
295
|
+
organized_files.append({
|
|
296
|
+
'path': file_path,
|
|
297
|
+
'type': file_type,
|
|
298
|
+
'valid': False
|
|
299
|
+
})
|
|
300
|
+
|
|
301
|
+
return organized_files
|
|
302
|
+
|
|
303
|
+
def extract_file_type(file_path):
|
|
304
|
+
"""Extract file type from path - implement based on your naming convention."""
|
|
305
|
+
# Example implementation
|
|
306
|
+
if 'image' in str(file_path):
|
|
307
|
+
return 'image'
|
|
308
|
+
elif 'annotation' in str(file_path):
|
|
309
|
+
return 'annotation'
|
|
310
|
+
elif 'metadata' in str(file_path):
|
|
311
|
+
return 'metadata'
|
|
312
|
+
else:
|
|
313
|
+
return 'unknown'
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
## Error Handling and Retry Logic
|
|
317
|
+
|
|
318
|
+
```python
|
|
319
|
+
import time
|
|
320
|
+
from synapse_sdk.clients.exceptions import ClientError
|
|
321
|
+
|
|
322
|
+
def robust_upload(file_path, max_retries=3):
|
|
323
|
+
"""Upload with retry logic for reliability."""
|
|
324
|
+
for attempt in range(max_retries):
|
|
325
|
+
try:
|
|
326
|
+
result = client.create_data_file(file_path, use_chunked_upload=True)
|
|
327
|
+
return result
|
|
328
|
+
except ClientError as e:
|
|
329
|
+
if e.status_code == 413: # File too large
|
|
330
|
+
print(f"File {file_path} too large, trying chunked upload")
|
|
331
|
+
try:
|
|
332
|
+
return client.create_data_file(file_path, use_chunked_upload=True)
|
|
333
|
+
except Exception as retry_e:
|
|
334
|
+
print(f"Chunked upload failed: {retry_e}")
|
|
335
|
+
if attempt == max_retries - 1:
|
|
336
|
+
raise
|
|
337
|
+
elif e.status_code == 429: # Rate limited
|
|
338
|
+
wait_time = 2 ** attempt # Exponential backoff
|
|
339
|
+
print(f"Rate limited, waiting {wait_time} seconds...")
|
|
340
|
+
time.sleep(wait_time)
|
|
341
|
+
else:
|
|
342
|
+
print(f"Upload failed (attempt {attempt + 1}): {e}")
|
|
343
|
+
if attempt == max_retries - 1:
|
|
344
|
+
raise
|
|
345
|
+
except Exception as e:
|
|
346
|
+
print(f"Unexpected error (attempt {attempt + 1}): {e}")
|
|
347
|
+
if attempt == max_retries - 1:
|
|
348
|
+
raise
|
|
349
|
+
time.sleep(1) # Brief pause before retry
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
## Complete Workflow Example
|
|
353
|
+
|
|
354
|
+
```python
|
|
355
|
+
from pathlib import Path
|
|
356
|
+
from synapse_sdk.clients.backend import BackendClient
|
|
357
|
+
|
|
358
|
+
def complete_data_ingestion_workflow():
|
|
359
|
+
"""Complete workflow for data ingestion."""
|
|
360
|
+
client = BackendClient(
|
|
361
|
+
base_url="https://api.synapse.sh",
|
|
362
|
+
api_token="your-token"
|
|
363
|
+
)
|
|
364
|
+
|
|
365
|
+
# 1. Choose or create data collection
|
|
366
|
+
collections = client.list_data_collection()
|
|
367
|
+
collection_id = collections[0]['id'] # Use first available
|
|
368
|
+
|
|
369
|
+
# 2. Get collection specifications
|
|
370
|
+
collection = client.get_data_collection(collection_id)
|
|
371
|
+
print(f"Using collection: {collection['name']}")
|
|
372
|
+
|
|
373
|
+
# 3. Prepare file paths
|
|
374
|
+
data_dir = Path('/path/to/your/data')
|
|
375
|
+
image_files = list(data_dir.glob('*.jpg'))
|
|
376
|
+
|
|
377
|
+
# 4. Upload files and create data units
|
|
378
|
+
uploaded_files = []
|
|
379
|
+
for i, image_path in enumerate(image_files):
|
|
380
|
+
# Upload individual file
|
|
381
|
+
data_file = client.create_data_file(image_path)
|
|
382
|
+
|
|
383
|
+
# Organize for collection
|
|
384
|
+
organized_file = {
|
|
385
|
+
'files': {'image': image_path},
|
|
386
|
+
'meta': {
|
|
387
|
+
'origin_file_stem': image_path.stem,
|
|
388
|
+
'origin_file_extension': image_path.suffix,
|
|
389
|
+
'sequence': i,
|
|
390
|
+
'batch': 'batch_001'
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
# Upload to collection
|
|
395
|
+
upload_result = client.upload_data_file(
|
|
396
|
+
organized_file,
|
|
397
|
+
collection_id
|
|
398
|
+
)
|
|
399
|
+
uploaded_files.append(upload_result)
|
|
400
|
+
|
|
401
|
+
# 5. Create data units in batches
|
|
402
|
+
batch_size = 10
|
|
403
|
+
all_data_units = []
|
|
404
|
+
for i in range(0, len(uploaded_files), batch_size):
|
|
405
|
+
batch = uploaded_files[i:i+batch_size]
|
|
406
|
+
data_units = client.create_data_units(batch)
|
|
407
|
+
all_data_units.extend(data_units)
|
|
408
|
+
print(f"Created batch {i//batch_size}: {len(data_units)} data units")
|
|
409
|
+
|
|
410
|
+
print(f"Total data units created: {len(all_data_units)}")
|
|
411
|
+
return all_data_units
|
|
412
|
+
|
|
413
|
+
# Run the workflow
|
|
414
|
+
if __name__ == "__main__":
|
|
415
|
+
data_units = complete_data_ingestion_workflow()
|
|
416
|
+
```
|
|
417
|
+
|
|
418
|
+
## See Also
|
|
419
|
+
|
|
420
|
+
- [BackendClient](./backend.md) - Main backend client
|
|
421
|
+
- [CoreClientMixin](./core-mixin.md) - Core file operations
|
|
422
|
+
- [AnnotationClientMixin](./annotation-mixin.md) - Task and annotation management
|