synapse-sdk 1.0.0a35__py3-none-any.whl → 2025.11.7__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of synapse-sdk might be problematic. Click here for more details.
- synapse_sdk/__init__.py +24 -0
- synapse_sdk/cli/__init__.py +308 -5
- synapse_sdk/cli/alias/utils.py +1 -1
- synapse_sdk/cli/code_server.py +687 -0
- synapse_sdk/cli/config.py +440 -0
- synapse_sdk/cli/devtools.py +90 -0
- synapse_sdk/cli/plugin/publish.py +23 -15
- synapse_sdk/clients/agent/__init__.py +9 -3
- synapse_sdk/clients/agent/container.py +133 -0
- synapse_sdk/clients/agent/core.py +19 -0
- synapse_sdk/clients/agent/ray.py +298 -9
- synapse_sdk/clients/backend/__init__.py +28 -12
- synapse_sdk/clients/backend/annotation.py +9 -1
- synapse_sdk/clients/backend/core.py +31 -4
- synapse_sdk/clients/backend/data_collection.py +186 -0
- synapse_sdk/clients/backend/hitl.py +1 -1
- synapse_sdk/clients/backend/integration.py +4 -3
- synapse_sdk/clients/backend/ml.py +1 -1
- synapse_sdk/clients/backend/models.py +35 -1
- synapse_sdk/clients/base.py +309 -36
- synapse_sdk/clients/ray/serve.py +2 -0
- synapse_sdk/devtools/__init__.py +0 -0
- synapse_sdk/devtools/config.py +94 -0
- synapse_sdk/devtools/docs/.gitignore +20 -0
- synapse_sdk/devtools/docs/README.md +41 -0
- synapse_sdk/devtools/docs/blog/2019-05-28-first-blog-post.md +12 -0
- synapse_sdk/devtools/docs/blog/2019-05-29-long-blog-post.md +44 -0
- synapse_sdk/devtools/docs/blog/2021-08-01-mdx-blog-post.mdx +24 -0
- synapse_sdk/devtools/docs/blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg +0 -0
- synapse_sdk/devtools/docs/blog/2021-08-26-welcome/index.md +29 -0
- synapse_sdk/devtools/docs/blog/authors.yml +25 -0
- synapse_sdk/devtools/docs/blog/tags.yml +19 -0
- synapse_sdk/devtools/docs/docs/api/clients/agent.md +43 -0
- synapse_sdk/devtools/docs/docs/api/clients/annotation-mixin.md +378 -0
- synapse_sdk/devtools/docs/docs/api/clients/backend.md +420 -0
- synapse_sdk/devtools/docs/docs/api/clients/base.md +257 -0
- synapse_sdk/devtools/docs/docs/api/clients/core-mixin.md +477 -0
- synapse_sdk/devtools/docs/docs/api/clients/data-collection-mixin.md +422 -0
- synapse_sdk/devtools/docs/docs/api/clients/hitl-mixin.md +554 -0
- synapse_sdk/devtools/docs/docs/api/clients/index.md +391 -0
- synapse_sdk/devtools/docs/docs/api/clients/integration-mixin.md +571 -0
- synapse_sdk/devtools/docs/docs/api/clients/ml-mixin.md +578 -0
- synapse_sdk/devtools/docs/docs/api/clients/ray.md +342 -0
- synapse_sdk/devtools/docs/docs/api/index.md +52 -0
- synapse_sdk/devtools/docs/docs/api/plugins/categories.md +43 -0
- synapse_sdk/devtools/docs/docs/api/plugins/models.md +114 -0
- synapse_sdk/devtools/docs/docs/api/plugins/utils.md +328 -0
- synapse_sdk/devtools/docs/docs/categories.md +0 -0
- synapse_sdk/devtools/docs/docs/cli-usage.md +280 -0
- synapse_sdk/devtools/docs/docs/concepts/index.md +38 -0
- synapse_sdk/devtools/docs/docs/configuration.md +83 -0
- synapse_sdk/devtools/docs/docs/contributing.md +306 -0
- synapse_sdk/devtools/docs/docs/examples/index.md +29 -0
- synapse_sdk/devtools/docs/docs/faq.md +179 -0
- synapse_sdk/devtools/docs/docs/features/converters/index.md +455 -0
- synapse_sdk/devtools/docs/docs/features/index.md +24 -0
- synapse_sdk/devtools/docs/docs/features/utils/file.md +415 -0
- synapse_sdk/devtools/docs/docs/features/utils/network.md +378 -0
- synapse_sdk/devtools/docs/docs/features/utils/storage.md +57 -0
- synapse_sdk/devtools/docs/docs/features/utils/types.md +51 -0
- synapse_sdk/devtools/docs/docs/installation.md +94 -0
- synapse_sdk/devtools/docs/docs/introduction.md +47 -0
- synapse_sdk/devtools/docs/docs/plugins/categories/neural-net-plugins/train-action-overview.md +814 -0
- synapse_sdk/devtools/docs/docs/plugins/categories/pre-annotation-plugins/pre-annotation-plugin-overview.md +198 -0
- synapse_sdk/devtools/docs/docs/plugins/categories/pre-annotation-plugins/to-task-action-development.md +1645 -0
- synapse_sdk/devtools/docs/docs/plugins/categories/pre-annotation-plugins/to-task-overview.md +717 -0
- synapse_sdk/devtools/docs/docs/plugins/categories/pre-annotation-plugins/to-task-template-development.md +1380 -0
- synapse_sdk/devtools/docs/docs/plugins/categories/upload-plugins/upload-plugin-action.md +948 -0
- synapse_sdk/devtools/docs/docs/plugins/categories/upload-plugins/upload-plugin-overview.md +544 -0
- synapse_sdk/devtools/docs/docs/plugins/categories/upload-plugins/upload-plugin-template.md +766 -0
- synapse_sdk/devtools/docs/docs/plugins/export-plugins.md +1092 -0
- synapse_sdk/devtools/docs/docs/plugins/plugins.md +852 -0
- synapse_sdk/devtools/docs/docs/quickstart.md +78 -0
- synapse_sdk/devtools/docs/docs/troubleshooting.md +519 -0
- synapse_sdk/devtools/docs/docs/tutorial-basics/_category_.json +8 -0
- synapse_sdk/devtools/docs/docs/tutorial-basics/congratulations.md +23 -0
- synapse_sdk/devtools/docs/docs/tutorial-basics/create-a-blog-post.md +34 -0
- synapse_sdk/devtools/docs/docs/tutorial-basics/create-a-document.md +57 -0
- synapse_sdk/devtools/docs/docs/tutorial-basics/create-a-page.md +43 -0
- synapse_sdk/devtools/docs/docs/tutorial-basics/deploy-your-site.md +31 -0
- synapse_sdk/devtools/docs/docs/tutorial-basics/markdown-features.mdx +152 -0
- synapse_sdk/devtools/docs/docs/tutorial-extras/_category_.json +7 -0
- synapse_sdk/devtools/docs/docs/tutorial-extras/img/docsVersionDropdown.png +0 -0
- synapse_sdk/devtools/docs/docs/tutorial-extras/img/localeDropdown.png +0 -0
- synapse_sdk/devtools/docs/docs/tutorial-extras/manage-docs-versions.md +55 -0
- synapse_sdk/devtools/docs/docs/tutorial-extras/translate-your-site.md +88 -0
- synapse_sdk/devtools/docs/docusaurus.config.ts +148 -0
- synapse_sdk/devtools/docs/i18n/ko/code.json +325 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/agent.md +43 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/annotation-mixin.md +289 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/backend.md +420 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/base.md +257 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/core-mixin.md +417 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/data-collection-mixin.md +356 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/hitl-mixin.md +192 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/index.md +391 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/integration-mixin.md +479 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/ml-mixin.md +284 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/ray.md +342 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/index.md +52 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/plugins/models.md +114 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/categories.md +0 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/cli-usage.md +280 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/concepts/index.md +38 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/configuration.md +83 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/contributing.md +306 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/examples/index.md +29 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/faq.md +179 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/converters/index.md +30 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/index.md +24 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/utils/file.md +415 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/utils/network.md +378 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/utils/storage.md +60 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/utils/types.md +51 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/installation.md +94 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/introduction.md +47 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/neural-net-plugins/train-action-overview.md +815 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/pre-annotation-plugins/pre-annotation-plugin-overview.md +198 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/pre-annotation-plugins/to-task-action-development.md +1645 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/pre-annotation-plugins/to-task-overview.md +717 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/pre-annotation-plugins/to-task-template-development.md +1380 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/upload-plugins/upload-plugin-action.md +948 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/upload-plugins/upload-plugin-overview.md +544 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/upload-plugins/upload-plugin-template.md +766 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/export-plugins.md +1092 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/plugins.md +117 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/quickstart.md +78 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/troubleshooting.md +519 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current.json +34 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-theme-classic/footer.json +42 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-theme-classic/navbar.json +18 -0
- synapse_sdk/devtools/docs/package-lock.json +18784 -0
- synapse_sdk/devtools/docs/package.json +48 -0
- synapse_sdk/devtools/docs/sidebars.ts +122 -0
- synapse_sdk/devtools/docs/src/components/HomepageFeatures/index.tsx +71 -0
- synapse_sdk/devtools/docs/src/components/HomepageFeatures/styles.module.css +11 -0
- synapse_sdk/devtools/docs/src/css/custom.css +30 -0
- synapse_sdk/devtools/docs/src/pages/index.module.css +23 -0
- synapse_sdk/devtools/docs/src/pages/index.tsx +21 -0
- synapse_sdk/devtools/docs/src/pages/markdown-page.md +7 -0
- synapse_sdk/devtools/docs/static/.nojekyll +0 -0
- synapse_sdk/devtools/docs/static/img/docusaurus-social-card.jpg +0 -0
- synapse_sdk/devtools/docs/static/img/docusaurus.png +0 -0
- synapse_sdk/devtools/docs/static/img/favicon.ico +0 -0
- synapse_sdk/devtools/docs/static/img/logo.png +0 -0
- synapse_sdk/devtools/docs/static/img/undraw_docusaurus_mountain.svg +171 -0
- synapse_sdk/devtools/docs/static/img/undraw_docusaurus_react.svg +170 -0
- synapse_sdk/devtools/docs/static/img/undraw_docusaurus_tree.svg +40 -0
- synapse_sdk/devtools/docs/tsconfig.json +8 -0
- synapse_sdk/devtools/server.py +41 -0
- synapse_sdk/devtools/streamlit_app/__init__.py +5 -0
- synapse_sdk/devtools/streamlit_app/app.py +128 -0
- synapse_sdk/devtools/streamlit_app/services/__init__.py +11 -0
- synapse_sdk/devtools/streamlit_app/services/job_service.py +233 -0
- synapse_sdk/devtools/streamlit_app/services/plugin_service.py +236 -0
- synapse_sdk/devtools/streamlit_app/services/serve_service.py +95 -0
- synapse_sdk/devtools/streamlit_app/ui/__init__.py +15 -0
- synapse_sdk/devtools/streamlit_app/ui/config_tab.py +76 -0
- synapse_sdk/devtools/streamlit_app/ui/deployment_tab.py +66 -0
- synapse_sdk/devtools/streamlit_app/ui/http_tab.py +125 -0
- synapse_sdk/devtools/streamlit_app/ui/jobs_tab.py +573 -0
- synapse_sdk/devtools/streamlit_app/ui/serve_tab.py +346 -0
- synapse_sdk/devtools/streamlit_app/ui/status_bar.py +118 -0
- synapse_sdk/devtools/streamlit_app/utils/__init__.py +40 -0
- synapse_sdk/devtools/streamlit_app/utils/json_viewer.py +197 -0
- synapse_sdk/devtools/streamlit_app/utils/log_formatter.py +38 -0
- synapse_sdk/devtools/streamlit_app/utils/styles.py +241 -0
- synapse_sdk/devtools/streamlit_app/utils/ui_components.py +289 -0
- synapse_sdk/devtools/streamlit_app.py +10 -0
- synapse_sdk/loggers.py +65 -7
- synapse_sdk/plugins/README.md +1340 -0
- synapse_sdk/plugins/categories/base.py +73 -11
- synapse_sdk/plugins/categories/data_validation/actions/validation.py +72 -0
- synapse_sdk/plugins/categories/data_validation/templates/plugin/validation.py +33 -5
- synapse_sdk/plugins/categories/export/actions/__init__.py +3 -0
- synapse_sdk/plugins/categories/export/actions/export/__init__.py +28 -0
- synapse_sdk/plugins/categories/export/actions/export/action.py +165 -0
- synapse_sdk/plugins/categories/export/actions/export/enums.py +113 -0
- synapse_sdk/plugins/categories/export/actions/export/exceptions.py +53 -0
- synapse_sdk/plugins/categories/export/actions/export/models.py +74 -0
- synapse_sdk/plugins/categories/export/actions/export/run.py +195 -0
- synapse_sdk/plugins/categories/export/actions/{export.py → export/utils.py} +47 -82
- synapse_sdk/plugins/categories/export/templates/config.yaml +19 -1
- synapse_sdk/plugins/categories/export/templates/plugin/__init__.py +390 -0
- synapse_sdk/plugins/categories/export/templates/plugin/export.py +153 -129
- synapse_sdk/plugins/categories/neural_net/actions/deployment.py +9 -62
- synapse_sdk/plugins/categories/neural_net/actions/train.py +1062 -32
- synapse_sdk/plugins/categories/neural_net/actions/tune.py +534 -0
- synapse_sdk/plugins/categories/neural_net/templates/config.yaml +27 -5
- synapse_sdk/plugins/categories/neural_net/templates/plugin/inference.py +26 -10
- synapse_sdk/plugins/categories/pre_annotation/actions/__init__.py +4 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/pre_annotation/__init__.py +3 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/pre_annotation/action.py +10 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/__init__.py +28 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/action.py +145 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/enums.py +269 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/exceptions.py +14 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/factory.py +76 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/models.py +97 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/orchestrator.py +250 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/run.py +64 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/__init__.py +17 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/annotation.py +287 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/base.py +170 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/extraction.py +83 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/metrics.py +87 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/preprocessor.py +127 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/validation.py +143 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task.py +966 -0
- synapse_sdk/plugins/categories/pre_annotation/templates/config.yaml +19 -0
- synapse_sdk/plugins/categories/pre_annotation/templates/plugin/to_task.py +40 -0
- synapse_sdk/plugins/categories/upload/actions/upload/__init__.py +19 -0
- synapse_sdk/plugins/categories/upload/actions/upload/action.py +232 -0
- synapse_sdk/plugins/categories/upload/actions/upload/context.py +185 -0
- synapse_sdk/plugins/categories/upload/actions/upload/enums.py +471 -0
- synapse_sdk/plugins/categories/upload/actions/upload/exceptions.py +36 -0
- synapse_sdk/plugins/categories/upload/actions/upload/factory.py +138 -0
- synapse_sdk/plugins/categories/upload/actions/upload/models.py +203 -0
- synapse_sdk/plugins/categories/upload/actions/upload/orchestrator.py +183 -0
- synapse_sdk/plugins/categories/upload/actions/upload/registry.py +113 -0
- synapse_sdk/plugins/categories/upload/actions/upload/run.py +179 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/__init__.py +1 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/base.py +107 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/cleanup.py +62 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/collection.py +63 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/generate.py +84 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/initialize.py +82 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/metadata.py +235 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/organize.py +203 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/upload.py +97 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/validate.py +71 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/__init__.py +1 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/base.py +82 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/data_unit/__init__.py +1 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/data_unit/batch.py +39 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/data_unit/single.py +29 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/file_discovery/__init__.py +1 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/file_discovery/flat.py +258 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/file_discovery/recursive.py +281 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/metadata/__init__.py +1 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/metadata/excel.py +174 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/metadata/none.py +16 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/upload/__init__.py +1 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/upload/sync.py +84 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/validation/__init__.py +1 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/validation/default.py +60 -0
- synapse_sdk/plugins/categories/upload/actions/upload/utils.py +250 -0
- synapse_sdk/plugins/categories/upload/templates/README.md +470 -0
- synapse_sdk/plugins/categories/upload/templates/config.yaml +29 -2
- synapse_sdk/plugins/categories/upload/templates/plugin/__init__.py +294 -0
- synapse_sdk/plugins/categories/upload/templates/plugin/upload.py +88 -30
- synapse_sdk/plugins/models.py +122 -16
- synapse_sdk/plugins/templates/plugin-config-schema.json +406 -0
- synapse_sdk/plugins/templates/schema.json +491 -0
- synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/requirements.txt +1 -1
- synapse_sdk/plugins/utils/__init__.py +46 -0
- synapse_sdk/plugins/utils/actions.py +119 -0
- synapse_sdk/plugins/utils/config.py +203 -0
- synapse_sdk/plugins/{utils.py → utils/legacy.py} +26 -46
- synapse_sdk/plugins/utils/ray_gcs.py +66 -0
- synapse_sdk/plugins/utils/registry.py +58 -0
- synapse_sdk/shared/__init__.py +25 -0
- synapse_sdk/shared/enums.py +93 -0
- synapse_sdk/utils/converters/__init__.py +240 -0
- synapse_sdk/utils/converters/coco/__init__.py +0 -0
- synapse_sdk/utils/converters/coco/from_dm.py +322 -0
- synapse_sdk/utils/converters/coco/to_dm.py +215 -0
- synapse_sdk/utils/converters/dm/__init__.py +56 -0
- synapse_sdk/utils/converters/dm/from_v1.py +627 -0
- synapse_sdk/utils/converters/dm/to_v1.py +367 -0
- synapse_sdk/utils/converters/pascal/__init__.py +0 -0
- synapse_sdk/utils/converters/pascal/from_dm.py +244 -0
- synapse_sdk/utils/converters/pascal/to_dm.py +214 -0
- synapse_sdk/utils/converters/yolo/__init__.py +0 -0
- synapse_sdk/utils/converters/yolo/from_dm.py +384 -0
- synapse_sdk/utils/converters/yolo/to_dm.py +267 -0
- synapse_sdk/utils/dataset.py +46 -0
- synapse_sdk/utils/encryption.py +158 -0
- synapse_sdk/utils/file/__init__.py +39 -0
- synapse_sdk/utils/file/archive.py +32 -0
- synapse_sdk/utils/file/checksum.py +56 -0
- synapse_sdk/utils/file/chunking.py +31 -0
- synapse_sdk/utils/file/download.py +385 -0
- synapse_sdk/utils/file/encoding.py +40 -0
- synapse_sdk/utils/file/io.py +22 -0
- synapse_sdk/utils/file/video/__init__.py +29 -0
- synapse_sdk/utils/file/video/transcode.py +307 -0
- synapse_sdk/utils/{file.py → file.py.backup} +84 -2
- synapse_sdk/utils/http.py +138 -0
- synapse_sdk/utils/network.py +293 -0
- synapse_sdk/utils/storage/__init__.py +36 -2
- synapse_sdk/utils/storage/providers/__init__.py +141 -0
- synapse_sdk/utils/storage/providers/file_system.py +134 -0
- synapse_sdk/utils/storage/providers/http.py +190 -0
- synapse_sdk/utils/storage/providers/s3.py +54 -6
- synapse_sdk/utils/storage/providers/sftp.py +31 -0
- synapse_sdk/utils/storage/registry.py +6 -0
- synapse_sdk-2025.11.7.dist-info/METADATA +122 -0
- synapse_sdk-2025.11.7.dist-info/RECORD +386 -0
- {synapse_sdk-1.0.0a35.dist-info → synapse_sdk-2025.11.7.dist-info}/WHEEL +1 -1
- synapse_sdk/clients/backend/dataset.py +0 -102
- synapse_sdk/plugins/categories/upload/actions/upload.py +0 -293
- synapse_sdk-1.0.0a35.dist-info/METADATA +0 -47
- synapse_sdk-1.0.0a35.dist-info/RECORD +0 -137
- {synapse_sdk-1.0.0a35.dist-info → synapse_sdk-2025.11.7.dist-info}/entry_points.txt +0 -0
- {synapse_sdk-1.0.0a35.dist-info → synapse_sdk-2025.11.7.dist-info}/licenses/LICENSE +0 -0
- {synapse_sdk-1.0.0a35.dist-info → synapse_sdk-2025.11.7.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,477 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: core-mixin
|
|
3
|
+
title: CoreClientMixin
|
|
4
|
+
sidebar_position: 7
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# CoreClientMixin
|
|
8
|
+
|
|
9
|
+
Provides core file upload and fundamental operations for the Synapse backend.
|
|
10
|
+
|
|
11
|
+
## Overview
|
|
12
|
+
|
|
13
|
+
The `CoreClientMixin` handles core system operations, particularly file upload capabilities including chunked upload for large files. This mixin is automatically included in the `BackendClient` and provides essential functionality used by other mixins.
|
|
14
|
+
|
|
15
|
+
## File Upload Operations
|
|
16
|
+
|
|
17
|
+
### `create_chunked_upload(file_path)`
|
|
18
|
+
|
|
19
|
+
Upload large files using chunked upload for optimal performance and reliability.
|
|
20
|
+
|
|
21
|
+
```python
|
|
22
|
+
from pathlib import Path
|
|
23
|
+
|
|
24
|
+
# Upload a large file
|
|
25
|
+
file_path = Path('/path/to/large_dataset.zip')
|
|
26
|
+
result = client.create_chunked_upload(file_path)
|
|
27
|
+
print(f"Upload completed: {result}")
|
|
28
|
+
print(f"File ID: {result['id']}")
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
**Parameters:**
|
|
32
|
+
|
|
33
|
+
- `file_path` (str | Path): Path to the file to upload
|
|
34
|
+
|
|
35
|
+
**Returns:**
|
|
36
|
+
|
|
37
|
+
- `dict`: Upload result with file ID and metadata
|
|
38
|
+
|
|
39
|
+
**Features:**
|
|
40
|
+
|
|
41
|
+
- **50MB Chunks**: Uses optimal chunk size for performance
|
|
42
|
+
- **MD5 Integrity**: Automatic checksum verification
|
|
43
|
+
- **Resume Capability**: Can resume interrupted uploads
|
|
44
|
+
- **Progress Tracking**: Supports upload progress monitoring
|
|
45
|
+
- **Error Recovery**: Automatic retry for failed chunks
|
|
46
|
+
|
|
47
|
+
### Upload Process Details
|
|
48
|
+
|
|
49
|
+
The chunked upload process works as follows:
|
|
50
|
+
|
|
51
|
+
1. **File Analysis**: Calculate file size and MD5 hash
|
|
52
|
+
2. **Chunk Creation**: Split file into 50MB chunks
|
|
53
|
+
3. **Sequential Upload**: Upload chunks one by one
|
|
54
|
+
4. **Integrity Check**: Verify each chunk with MD5
|
|
55
|
+
5. **Assembly**: Server assembles chunks into final file
|
|
56
|
+
6. **Verification**: Final integrity check of complete file
|
|
57
|
+
|
|
58
|
+
```python
|
|
59
|
+
import hashlib
|
|
60
|
+
import os
|
|
61
|
+
from pathlib import Path
|
|
62
|
+
|
|
63
|
+
def upload_with_progress(file_path):
|
|
64
|
+
"""Upload file with detailed progress tracking."""
|
|
65
|
+
|
|
66
|
+
file_path = Path(file_path)
|
|
67
|
+
|
|
68
|
+
# Get file info
|
|
69
|
+
file_size = os.path.getsize(file_path)
|
|
70
|
+
print(f"Uploading file: {file_path.name}")
|
|
71
|
+
print(f"File size: {file_size / (1024*1024):.2f} MB")
|
|
72
|
+
|
|
73
|
+
# Calculate MD5 (this is done automatically by the client)
|
|
74
|
+
hash_md5 = hashlib.md5()
|
|
75
|
+
with open(file_path, "rb") as f:
|
|
76
|
+
for chunk in iter(lambda: f.read(4096), b""):
|
|
77
|
+
hash_md5.update(chunk)
|
|
78
|
+
|
|
79
|
+
print(f"MD5 checksum: {hash_md5.hexdigest()}")
|
|
80
|
+
|
|
81
|
+
# Upload with chunked upload
|
|
82
|
+
try:
|
|
83
|
+
result = client.create_chunked_upload(file_path)
|
|
84
|
+
print("Upload successful!")
|
|
85
|
+
return result
|
|
86
|
+
except Exception as e:
|
|
87
|
+
print(f"Upload failed: {e}")
|
|
88
|
+
raise
|
|
89
|
+
|
|
90
|
+
# Usage
|
|
91
|
+
upload_result = upload_with_progress('/path/to/large_file.zip')
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## Advanced Upload Scenarios
|
|
95
|
+
|
|
96
|
+
### Batch File Upload
|
|
97
|
+
|
|
98
|
+
```python
|
|
99
|
+
def batch_chunked_upload(file_paths, max_concurrent=3):
|
|
100
|
+
"""Upload multiple large files with concurrency control."""
|
|
101
|
+
import concurrent.futures
|
|
102
|
+
import threading
|
|
103
|
+
|
|
104
|
+
upload_results = []
|
|
105
|
+
failed_uploads = []
|
|
106
|
+
|
|
107
|
+
def upload_single_file(file_path):
|
|
108
|
+
try:
|
|
109
|
+
print(f"Starting upload: {file_path}")
|
|
110
|
+
result = client.create_chunked_upload(file_path)
|
|
111
|
+
print(f"Completed upload: {file_path}")
|
|
112
|
+
return {'file_path': file_path, 'result': result, 'status': 'success'}
|
|
113
|
+
except Exception as e:
|
|
114
|
+
print(f"Failed upload: {file_path} - {e}")
|
|
115
|
+
return {'file_path': file_path, 'error': str(e), 'status': 'failed'}
|
|
116
|
+
|
|
117
|
+
# Use ThreadPoolExecutor for concurrent uploads
|
|
118
|
+
with concurrent.futures.ThreadPoolExecutor(max_workers=max_concurrent) as executor:
|
|
119
|
+
future_to_file = {
|
|
120
|
+
executor.submit(upload_single_file, file_path): file_path
|
|
121
|
+
for file_path in file_paths
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
for future in concurrent.futures.as_completed(future_to_file):
|
|
125
|
+
result = future.result()
|
|
126
|
+
|
|
127
|
+
if result['status'] == 'success':
|
|
128
|
+
upload_results.append(result)
|
|
129
|
+
else:
|
|
130
|
+
failed_uploads.append(result)
|
|
131
|
+
|
|
132
|
+
return {
|
|
133
|
+
'successful': upload_results,
|
|
134
|
+
'failed': failed_uploads,
|
|
135
|
+
'total': len(file_paths)
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
# Upload multiple files
|
|
139
|
+
file_list = [
|
|
140
|
+
Path('/data/file1.zip'),
|
|
141
|
+
Path('/data/file2.zip'),
|
|
142
|
+
Path('/data/file3.zip')
|
|
143
|
+
]
|
|
144
|
+
|
|
145
|
+
batch_results = batch_chunked_upload(file_list, max_concurrent=2)
|
|
146
|
+
print(f"Successful uploads: {len(batch_results['successful'])}")
|
|
147
|
+
print(f"Failed uploads: {len(batch_results['failed'])}")
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### Upload with Retry Logic
|
|
151
|
+
|
|
152
|
+
```python
|
|
153
|
+
import time
|
|
154
|
+
from synapse_sdk.clients.exceptions import ClientError
|
|
155
|
+
|
|
156
|
+
def robust_chunked_upload(file_path, max_retries=3, retry_delay=5):
|
|
157
|
+
"""Upload with retry logic for improved reliability."""
|
|
158
|
+
|
|
159
|
+
for attempt in range(max_retries):
|
|
160
|
+
try:
|
|
161
|
+
result = client.create_chunked_upload(file_path)
|
|
162
|
+
print(f"Upload successful on attempt {attempt + 1}")
|
|
163
|
+
return result
|
|
164
|
+
|
|
165
|
+
except ClientError as e:
|
|
166
|
+
if e.status_code == 413: # File too large
|
|
167
|
+
print(f"File {file_path} is too large for upload")
|
|
168
|
+
raise
|
|
169
|
+
elif e.status_code == 507: # Insufficient storage
|
|
170
|
+
print("Server storage full")
|
|
171
|
+
raise
|
|
172
|
+
elif e.status_code >= 500: # Server error
|
|
173
|
+
if attempt < max_retries - 1:
|
|
174
|
+
print(f"Server error on attempt {attempt + 1}, retrying in {retry_delay} seconds...")
|
|
175
|
+
time.sleep(retry_delay)
|
|
176
|
+
retry_delay *= 2 # Exponential backoff
|
|
177
|
+
else:
|
|
178
|
+
print(f"Upload failed after {max_retries} attempts")
|
|
179
|
+
raise
|
|
180
|
+
else:
|
|
181
|
+
print(f"Upload failed with error: {e}")
|
|
182
|
+
raise
|
|
183
|
+
|
|
184
|
+
except OSError as e:
|
|
185
|
+
print(f"File system error: {e}")
|
|
186
|
+
raise
|
|
187
|
+
|
|
188
|
+
except Exception as e:
|
|
189
|
+
if attempt < max_retries - 1:
|
|
190
|
+
print(f"Unexpected error on attempt {attempt + 1}: {e}")
|
|
191
|
+
time.sleep(retry_delay)
|
|
192
|
+
else:
|
|
193
|
+
print(f"Upload failed after {max_retries} attempts with error: {e}")
|
|
194
|
+
raise
|
|
195
|
+
|
|
196
|
+
# Use robust upload
|
|
197
|
+
try:
|
|
198
|
+
result = robust_chunked_upload('/path/to/file.zip')
|
|
199
|
+
print(f"File uploaded successfully: {result['id']}")
|
|
200
|
+
except Exception as e:
|
|
201
|
+
print(f"Final upload failure: {e}")
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
### Upload Progress Monitoring
|
|
205
|
+
|
|
206
|
+
```python
|
|
207
|
+
import os
|
|
208
|
+
from tqdm import tqdm
|
|
209
|
+
|
|
210
|
+
class ProgressTracker:
|
|
211
|
+
"""Simple progress tracker for file uploads."""
|
|
212
|
+
|
|
213
|
+
def __init__(self, total_size):
|
|
214
|
+
self.total_size = total_size
|
|
215
|
+
self.uploaded_size = 0
|
|
216
|
+
self.progress_bar = tqdm(total=total_size, unit='B', unit_scale=True, desc="Uploading")
|
|
217
|
+
|
|
218
|
+
def update(self, chunk_size):
|
|
219
|
+
self.uploaded_size += chunk_size
|
|
220
|
+
self.progress_bar.update(chunk_size)
|
|
221
|
+
|
|
222
|
+
if self.uploaded_size >= self.total_size:
|
|
223
|
+
self.progress_bar.close()
|
|
224
|
+
|
|
225
|
+
def get_progress_percentage(self):
|
|
226
|
+
return (self.uploaded_size / self.total_size) * 100 if self.total_size > 0 else 0
|
|
227
|
+
|
|
228
|
+
def upload_with_progress_bar(file_path):
|
|
229
|
+
"""Upload file with visual progress bar."""
|
|
230
|
+
|
|
231
|
+
file_path = Path(file_path)
|
|
232
|
+
file_size = os.path.getsize(file_path)
|
|
233
|
+
|
|
234
|
+
# Create progress tracker
|
|
235
|
+
tracker = ProgressTracker(file_size)
|
|
236
|
+
|
|
237
|
+
try:
|
|
238
|
+
# Note: The actual chunked upload doesn't expose chunk-level progress
|
|
239
|
+
# This is a conceptual example of how you might track progress
|
|
240
|
+
print(f"Starting upload of {file_path.name} ({file_size / (1024*1024):.2f} MB)")
|
|
241
|
+
|
|
242
|
+
result = client.create_chunked_upload(file_path)
|
|
243
|
+
|
|
244
|
+
# Simulate progress completion
|
|
245
|
+
tracker.update(file_size)
|
|
246
|
+
print(f"Upload completed: {result['id']}")
|
|
247
|
+
|
|
248
|
+
return result
|
|
249
|
+
|
|
250
|
+
except Exception as e:
|
|
251
|
+
tracker.progress_bar.close()
|
|
252
|
+
print(f"Upload failed: {e}")
|
|
253
|
+
raise
|
|
254
|
+
|
|
255
|
+
# Usage
|
|
256
|
+
upload_result = upload_with_progress_bar('/path/to/large_file.zip')
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
## File Validation
|
|
260
|
+
|
|
261
|
+
### Pre-Upload Validation
|
|
262
|
+
|
|
263
|
+
```python
|
|
264
|
+
def validate_file_for_upload(file_path, max_size_gb=10):
|
|
265
|
+
"""Validate file before attempting upload."""
|
|
266
|
+
|
|
267
|
+
file_path = Path(file_path)
|
|
268
|
+
|
|
269
|
+
# Check if file exists
|
|
270
|
+
if not file_path.exists():
|
|
271
|
+
raise FileNotFoundError(f"File not found: {file_path}")
|
|
272
|
+
|
|
273
|
+
# Check if it's a file (not directory)
|
|
274
|
+
if not file_path.is_file():
|
|
275
|
+
raise ValueError(f"Path is not a file: {file_path}")
|
|
276
|
+
|
|
277
|
+
# Check file size
|
|
278
|
+
file_size = os.path.getsize(file_path)
|
|
279
|
+
max_size_bytes = max_size_gb * 1024 * 1024 * 1024
|
|
280
|
+
|
|
281
|
+
if file_size > max_size_bytes:
|
|
282
|
+
raise ValueError(f"File too large: {file_size / (1024**3):.2f} GB (max: {max_size_gb} GB)")
|
|
283
|
+
|
|
284
|
+
# Check file permissions
|
|
285
|
+
if not os.access(file_path, os.R_OK):
|
|
286
|
+
raise PermissionError(f"Cannot read file: {file_path}")
|
|
287
|
+
|
|
288
|
+
# Basic file integrity check
|
|
289
|
+
try:
|
|
290
|
+
with open(file_path, 'rb') as f:
|
|
291
|
+
f.read(1024) # Try to read first 1KB
|
|
292
|
+
except Exception as e:
|
|
293
|
+
raise ValueError(f"File appears to be corrupted: {e}")
|
|
294
|
+
|
|
295
|
+
return {
|
|
296
|
+
'valid': True,
|
|
297
|
+
'file_size': file_size,
|
|
298
|
+
'file_path': str(file_path)
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
def safe_chunked_upload(file_path):
|
|
302
|
+
"""Upload with pre-validation."""
|
|
303
|
+
|
|
304
|
+
try:
|
|
305
|
+
# Validate file first
|
|
306
|
+
validation = validate_file_for_upload(file_path)
|
|
307
|
+
print(f"File validation passed: {validation['file_size'] / (1024*1024):.2f} MB")
|
|
308
|
+
|
|
309
|
+
# Proceed with upload
|
|
310
|
+
result = client.create_chunked_upload(file_path)
|
|
311
|
+
print(f"Upload successful: {result['id']}")
|
|
312
|
+
|
|
313
|
+
return result
|
|
314
|
+
|
|
315
|
+
except (FileNotFoundError, ValueError, PermissionError) as e:
|
|
316
|
+
print(f"Validation failed: {e}")
|
|
317
|
+
return None
|
|
318
|
+
except Exception as e:
|
|
319
|
+
print(f"Upload failed: {e}")
|
|
320
|
+
return None
|
|
321
|
+
|
|
322
|
+
# Usage
|
|
323
|
+
upload_result = safe_chunked_upload('/path/to/file.zip')
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
## Performance Optimization
|
|
327
|
+
|
|
328
|
+
### Optimized Upload Strategy
|
|
329
|
+
|
|
330
|
+
```python
|
|
331
|
+
def optimized_upload_strategy(file_path):
|
|
332
|
+
"""Choose optimal upload strategy based on file characteristics."""
|
|
333
|
+
|
|
334
|
+
file_path = Path(file_path)
|
|
335
|
+
file_size = os.path.getsize(file_path)
|
|
336
|
+
|
|
337
|
+
# Thresholds (in bytes)
|
|
338
|
+
SMALL_FILE_THRESHOLD = 10 * 1024 * 1024 # 10MB
|
|
339
|
+
LARGE_FILE_THRESHOLD = 100 * 1024 * 1024 # 100MB
|
|
340
|
+
|
|
341
|
+
if file_size < SMALL_FILE_THRESHOLD:
|
|
342
|
+
print(f"Small file ({file_size / (1024*1024):.2f} MB) - using regular upload")
|
|
343
|
+
# For small files, you might use a different upload method
|
|
344
|
+
# This is conceptual as the CoreClientMixin only provides chunked upload
|
|
345
|
+
return client.create_chunked_upload(file_path)
|
|
346
|
+
|
|
347
|
+
elif file_size < LARGE_FILE_THRESHOLD:
|
|
348
|
+
print(f"Medium file ({file_size / (1024*1024):.2f} MB) - using chunked upload")
|
|
349
|
+
return client.create_chunked_upload(file_path)
|
|
350
|
+
|
|
351
|
+
else:
|
|
352
|
+
print(f"Large file ({file_size / (1024*1024):.2f} MB) - using optimized chunked upload")
|
|
353
|
+
# For very large files, you might want additional optimizations
|
|
354
|
+
return robust_chunked_upload(file_path, max_retries=5)
|
|
355
|
+
|
|
356
|
+
# Usage
|
|
357
|
+
result = optimized_upload_strategy('/path/to/any_size_file.zip')
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
## Integration with Other Operations
|
|
361
|
+
|
|
362
|
+
### Upload and Process Workflow
|
|
363
|
+
|
|
364
|
+
```python
|
|
365
|
+
def upload_and_process_workflow(file_path, collection_id):
|
|
366
|
+
"""Complete workflow: upload file and create data unit."""
|
|
367
|
+
|
|
368
|
+
try:
|
|
369
|
+
# Step 1: Upload file using chunked upload
|
|
370
|
+
print("Step 1: Uploading file...")
|
|
371
|
+
upload_result = client.create_chunked_upload(file_path)
|
|
372
|
+
file_id = upload_result['id']
|
|
373
|
+
print(f"File uploaded successfully: {file_id}")
|
|
374
|
+
|
|
375
|
+
# Step 2: Create data file entry
|
|
376
|
+
print("Step 2: Creating data file entry...")
|
|
377
|
+
data_file = client.create_data_file(Path(file_path))
|
|
378
|
+
print(f"Data file created: {data_file}")
|
|
379
|
+
|
|
380
|
+
# Step 3: Organize for collection
|
|
381
|
+
print("Step 3: Organizing for collection...")
|
|
382
|
+
organized_file = {
|
|
383
|
+
'files': {'primary': Path(file_path)},
|
|
384
|
+
'meta': {
|
|
385
|
+
'origin_file_stem': Path(file_path).stem,
|
|
386
|
+
'origin_file_extension': Path(file_path).suffix,
|
|
387
|
+
'uploaded_file_id': file_id
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
# Step 4: Upload to collection
|
|
392
|
+
collection_result = client.upload_data_file(
|
|
393
|
+
organized_file,
|
|
394
|
+
collection_id
|
|
395
|
+
)
|
|
396
|
+
print(f"Added to collection: {collection_result}")
|
|
397
|
+
|
|
398
|
+
# Step 5: Create data unit
|
|
399
|
+
data_units = client.create_data_units([collection_result])
|
|
400
|
+
print(f"Data unit created: {data_units[0]['id']}")
|
|
401
|
+
|
|
402
|
+
return {
|
|
403
|
+
'file_id': file_id,
|
|
404
|
+
'data_file': data_file,
|
|
405
|
+
'collection_result': collection_result,
|
|
406
|
+
'data_unit': data_units[0]
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
except Exception as e:
|
|
410
|
+
print(f"Workflow failed: {e}")
|
|
411
|
+
raise
|
|
412
|
+
|
|
413
|
+
# Complete workflow
|
|
414
|
+
workflow_result = upload_and_process_workflow(
|
|
415
|
+
'/path/to/data.zip',
|
|
416
|
+
collection_id=123
|
|
417
|
+
)
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
## Error Handling
|
|
421
|
+
|
|
422
|
+
```python
|
|
423
|
+
from synapse_sdk.clients.exceptions import ClientError
|
|
424
|
+
|
|
425
|
+
def handle_upload_errors():
|
|
426
|
+
"""Comprehensive error handling for uploads."""
|
|
427
|
+
|
|
428
|
+
try:
|
|
429
|
+
result = client.create_chunked_upload('/path/to/file.zip')
|
|
430
|
+
return result
|
|
431
|
+
|
|
432
|
+
except FileNotFoundError:
|
|
433
|
+
print("Error: File not found")
|
|
434
|
+
return None
|
|
435
|
+
|
|
436
|
+
except PermissionError:
|
|
437
|
+
print("Error: Permission denied - check file permissions")
|
|
438
|
+
return None
|
|
439
|
+
|
|
440
|
+
except ClientError as e:
|
|
441
|
+
if e.status_code == 413:
|
|
442
|
+
print("Error: File too large for upload")
|
|
443
|
+
elif e.status_code == 507:
|
|
444
|
+
print("Error: Server storage full")
|
|
445
|
+
elif e.status_code == 429:
|
|
446
|
+
print("Error: Rate limited - too many requests")
|
|
447
|
+
elif e.status_code >= 500:
|
|
448
|
+
print(f"Error: Server error ({e.status_code})")
|
|
449
|
+
else:
|
|
450
|
+
print(f"Error: Client error ({e.status_code}): {e}")
|
|
451
|
+
return None
|
|
452
|
+
|
|
453
|
+
except OSError as e:
|
|
454
|
+
print(f"Error: Operating system error: {e}")
|
|
455
|
+
return None
|
|
456
|
+
|
|
457
|
+
except MemoryError:
|
|
458
|
+
print("Error: Insufficient memory for upload")
|
|
459
|
+
return None
|
|
460
|
+
|
|
461
|
+
except Exception as e:
|
|
462
|
+
print(f"Error: Unexpected error: {e}")
|
|
463
|
+
return None
|
|
464
|
+
|
|
465
|
+
# Use error handling
|
|
466
|
+
upload_result = handle_upload_errors()
|
|
467
|
+
if upload_result:
|
|
468
|
+
print(f"Upload successful: {upload_result['id']}")
|
|
469
|
+
else:
|
|
470
|
+
print("Upload failed")
|
|
471
|
+
```
|
|
472
|
+
|
|
473
|
+
## See Also
|
|
474
|
+
|
|
475
|
+
- [BackendClient](./backend.md) - Main backend client
|
|
476
|
+
- [DataCollectionClientMixin](./data-collection-mixin.md) - Data collection operations that use chunked upload
|
|
477
|
+
- [MLClientMixin](./ml-mixin.md) - ML model uploads that use chunked upload
|