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,554 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: hitl-mixin
|
|
3
|
+
title: HITLClientMixin
|
|
4
|
+
sidebar_position: 6
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# HITLClientMixin
|
|
8
|
+
|
|
9
|
+
Provides Human-in-the-Loop (HITL) assignment management operations for the Synapse backend.
|
|
10
|
+
|
|
11
|
+
## Overview
|
|
12
|
+
|
|
13
|
+
The `HITLClientMixin` handles all operations related to human-in-the-loop workflows, including assignment management and tagging. This mixin is automatically included in the `BackendClient` and provides methods for managing human annotation and review workflows.
|
|
14
|
+
|
|
15
|
+
## Assignment Operations
|
|
16
|
+
|
|
17
|
+
### `get_assignment(pk)`
|
|
18
|
+
|
|
19
|
+
Retrieve detailed information about a specific assignment.
|
|
20
|
+
|
|
21
|
+
```python
|
|
22
|
+
assignment = client.get_assignment(789)
|
|
23
|
+
print(f"Assignment: {assignment['id']}")
|
|
24
|
+
print(f"Project: {assignment['project']}")
|
|
25
|
+
print(f"Status: {assignment['status']}")
|
|
26
|
+
print(f"Assignee: {assignment['assignee']}")
|
|
27
|
+
print(f"Data: {assignment['data']}")
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
**Parameters:**
|
|
31
|
+
|
|
32
|
+
- `pk` (int): Assignment ID
|
|
33
|
+
|
|
34
|
+
**Returns:**
|
|
35
|
+
|
|
36
|
+
- `dict`: Complete assignment information
|
|
37
|
+
|
|
38
|
+
**Assignment structure:**
|
|
39
|
+
|
|
40
|
+
- `id`: Assignment ID
|
|
41
|
+
- `project`: Associated project ID
|
|
42
|
+
- `status`: Assignment status (`pending`, `in_progress`, `completed`, `rejected`)
|
|
43
|
+
- `assignee`: User ID of assigned reviewer
|
|
44
|
+
- `data`: Assignment data and annotations
|
|
45
|
+
- `file`: Associated files
|
|
46
|
+
- `created_at`: Creation timestamp
|
|
47
|
+
- `updated_at`: Last update timestamp
|
|
48
|
+
- `metadata`: Additional assignment metadata
|
|
49
|
+
|
|
50
|
+
### `list_assignments(params=None, url_conversion=None, list_all=False)`
|
|
51
|
+
|
|
52
|
+
List assignments with comprehensive filtering and pagination support.
|
|
53
|
+
|
|
54
|
+
```python
|
|
55
|
+
# List assignments for a specific project
|
|
56
|
+
assignments = client.list_assignments(params={'project': 123})
|
|
57
|
+
|
|
58
|
+
# List assignments by status
|
|
59
|
+
pending_assignments = client.list_assignments(params={
|
|
60
|
+
'project': 123,
|
|
61
|
+
'status': 'pending'
|
|
62
|
+
})
|
|
63
|
+
|
|
64
|
+
# List assignments for specific assignee
|
|
65
|
+
user_assignments = client.list_assignments(params={
|
|
66
|
+
'assignee': 456
|
|
67
|
+
})
|
|
68
|
+
|
|
69
|
+
# Get all assignments (handles pagination automatically)
|
|
70
|
+
all_assignments = client.list_assignments(list_all=True)
|
|
71
|
+
|
|
72
|
+
# List assignments with custom URL conversion for files
|
|
73
|
+
assignments = client.list_assignments(
|
|
74
|
+
params={'project': 123},
|
|
75
|
+
url_conversion={'files': lambda url: f"https://cdn.example.com{url}"}
|
|
76
|
+
)
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
**Parameters:**
|
|
80
|
+
|
|
81
|
+
- `params` (dict, optional): Filtering parameters
|
|
82
|
+
- `url_conversion` (dict, optional): Custom URL conversion for file fields
|
|
83
|
+
- `list_all` (bool): If True, automatically handles pagination
|
|
84
|
+
|
|
85
|
+
**Common filtering params:**
|
|
86
|
+
|
|
87
|
+
- `project`: Filter by project ID
|
|
88
|
+
- `status`: Filter by assignment status
|
|
89
|
+
- `assignee`: Filter by assigned user ID
|
|
90
|
+
- `created_after`: Filter by creation date
|
|
91
|
+
- `updated_after`: Filter by last update date
|
|
92
|
+
- `priority`: Filter by assignment priority
|
|
93
|
+
- `search`: Text search in assignment content
|
|
94
|
+
|
|
95
|
+
**Returns:**
|
|
96
|
+
|
|
97
|
+
- `tuple`: (assignments_list, total_count) if `list_all=False`
|
|
98
|
+
- `list`: All assignments if `list_all=True`
|
|
99
|
+
|
|
100
|
+
### `set_tags_assignments(data, params=None)`
|
|
101
|
+
|
|
102
|
+
Set tags for multiple assignments in batch operations.
|
|
103
|
+
|
|
104
|
+
```python
|
|
105
|
+
# Set tags for multiple assignments
|
|
106
|
+
client.set_tags_assignments({
|
|
107
|
+
'assignment_ids': [789, 790, 791],
|
|
108
|
+
'tag_ids': [1, 2, 3] # Tag IDs to apply
|
|
109
|
+
})
|
|
110
|
+
|
|
111
|
+
# Set tags with replacement option
|
|
112
|
+
client.set_tags_assignments(
|
|
113
|
+
{
|
|
114
|
+
'assignment_ids': [789, 790],
|
|
115
|
+
'tag_ids': [1, 2]
|
|
116
|
+
},
|
|
117
|
+
params={'replace': True} # Replace existing tags
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
# Set priority tags
|
|
121
|
+
client.set_tags_assignments({
|
|
122
|
+
'assignment_ids': [789],
|
|
123
|
+
'tag_ids': [5] # High priority tag
|
|
124
|
+
})
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
**Parameters:**
|
|
128
|
+
|
|
129
|
+
- `data` (dict): Batch tagging data
|
|
130
|
+
- `params` (dict, optional): Additional parameters
|
|
131
|
+
|
|
132
|
+
**Data structure:**
|
|
133
|
+
|
|
134
|
+
- `assignment_ids` (list): List of assignment IDs to tag
|
|
135
|
+
- `tag_ids` (list): List of tag IDs to apply
|
|
136
|
+
|
|
137
|
+
**Optional params:**
|
|
138
|
+
|
|
139
|
+
- `replace` (bool): If True, replace existing tags; if False, add to existing
|
|
140
|
+
- `notify` (bool): If True, notify assignees of tag changes
|
|
141
|
+
|
|
142
|
+
**Returns:**
|
|
143
|
+
|
|
144
|
+
- `dict`: Tagging operation result
|
|
145
|
+
|
|
146
|
+
## HITL Workflow Examples
|
|
147
|
+
|
|
148
|
+
### Assignment Queue Management
|
|
149
|
+
|
|
150
|
+
```python
|
|
151
|
+
def manage_assignment_queue(project_id, max_assignments_per_user=10):
|
|
152
|
+
"""Manage assignment distribution and queue."""
|
|
153
|
+
|
|
154
|
+
# Get pending assignments
|
|
155
|
+
pending = client.list_assignments(params={
|
|
156
|
+
'project': project_id,
|
|
157
|
+
'status': 'pending'
|
|
158
|
+
})
|
|
159
|
+
|
|
160
|
+
# Get active assignments by user
|
|
161
|
+
active = client.list_assignments(params={
|
|
162
|
+
'project': project_id,
|
|
163
|
+
'status': 'in_progress'
|
|
164
|
+
})
|
|
165
|
+
|
|
166
|
+
# Count assignments per user
|
|
167
|
+
user_workload = {}
|
|
168
|
+
for assignment in active[0]:
|
|
169
|
+
user_id = assignment['assignee']
|
|
170
|
+
user_workload[user_id] = user_workload.get(user_id, 0) + 1
|
|
171
|
+
|
|
172
|
+
print(f"Pending assignments: {len(pending[0])}")
|
|
173
|
+
print("User workload:")
|
|
174
|
+
for user_id, count in user_workload.items():
|
|
175
|
+
print(f" User {user_id}: {count} assignments")
|
|
176
|
+
|
|
177
|
+
# Find users with capacity
|
|
178
|
+
available_users = [
|
|
179
|
+
user_id for user_id, count in user_workload.items()
|
|
180
|
+
if count < max_assignments_per_user
|
|
181
|
+
]
|
|
182
|
+
|
|
183
|
+
return {
|
|
184
|
+
'pending_count': len(pending[0]),
|
|
185
|
+
'user_workload': user_workload,
|
|
186
|
+
'available_users': available_users
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
# Monitor queue
|
|
190
|
+
queue_status = manage_assignment_queue(123)
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
### Quality Control Workflow
|
|
194
|
+
|
|
195
|
+
```python
|
|
196
|
+
def quality_control_workflow(project_id):
|
|
197
|
+
"""Implement quality control for completed assignments."""
|
|
198
|
+
|
|
199
|
+
# Get completed assignments
|
|
200
|
+
completed = client.list_assignments(params={
|
|
201
|
+
'project': project_id,
|
|
202
|
+
'status': 'completed'
|
|
203
|
+
})
|
|
204
|
+
|
|
205
|
+
quality_results = []
|
|
206
|
+
|
|
207
|
+
for assignment in completed[0]:
|
|
208
|
+
assignment_id = assignment['id']
|
|
209
|
+
|
|
210
|
+
# Get detailed assignment data
|
|
211
|
+
detailed = client.get_assignment(assignment_id)
|
|
212
|
+
|
|
213
|
+
# Perform quality checks (custom logic)
|
|
214
|
+
quality_score = calculate_quality_score(detailed)
|
|
215
|
+
|
|
216
|
+
if quality_score >= 0.9:
|
|
217
|
+
# High quality - approve
|
|
218
|
+
tag_name = 'approved'
|
|
219
|
+
tag_id = get_tag_id(tag_name) # Custom function
|
|
220
|
+
|
|
221
|
+
client.set_tags_assignments({
|
|
222
|
+
'assignment_ids': [assignment_id],
|
|
223
|
+
'tag_ids': [tag_id]
|
|
224
|
+
})
|
|
225
|
+
|
|
226
|
+
elif quality_score >= 0.7:
|
|
227
|
+
# Medium quality - needs review
|
|
228
|
+
tag_name = 'needs_review'
|
|
229
|
+
tag_id = get_tag_id(tag_name)
|
|
230
|
+
|
|
231
|
+
client.set_tags_assignments({
|
|
232
|
+
'assignment_ids': [assignment_id],
|
|
233
|
+
'tag_ids': [tag_id]
|
|
234
|
+
})
|
|
235
|
+
|
|
236
|
+
else:
|
|
237
|
+
# Low quality - reject
|
|
238
|
+
tag_name = 'rejected'
|
|
239
|
+
tag_id = get_tag_id(tag_name)
|
|
240
|
+
|
|
241
|
+
client.set_tags_assignments({
|
|
242
|
+
'assignment_ids': [assignment_id],
|
|
243
|
+
'tag_ids': [tag_id]
|
|
244
|
+
})
|
|
245
|
+
|
|
246
|
+
quality_results.append({
|
|
247
|
+
'assignment_id': assignment_id,
|
|
248
|
+
'quality_score': quality_score,
|
|
249
|
+
'action': tag_name
|
|
250
|
+
})
|
|
251
|
+
|
|
252
|
+
return quality_results
|
|
253
|
+
|
|
254
|
+
def calculate_quality_score(assignment):
|
|
255
|
+
"""Calculate quality score for an assignment (custom implementation)."""
|
|
256
|
+
# Implement your quality scoring logic here
|
|
257
|
+
# This could include annotation completeness, consistency, etc.
|
|
258
|
+
import random
|
|
259
|
+
return random.uniform(0.5, 1.0) # Placeholder
|
|
260
|
+
|
|
261
|
+
def get_tag_id(tag_name):
|
|
262
|
+
"""Get tag ID by name (custom implementation)."""
|
|
263
|
+
# You might want to cache tag mappings or use a lookup service
|
|
264
|
+
tag_mapping = {
|
|
265
|
+
'approved': 1,
|
|
266
|
+
'needs_review': 2,
|
|
267
|
+
'rejected': 3,
|
|
268
|
+
'high_priority': 4,
|
|
269
|
+
'low_priority': 5
|
|
270
|
+
}
|
|
271
|
+
return tag_mapping.get(tag_name, 1)
|
|
272
|
+
|
|
273
|
+
# Run quality control
|
|
274
|
+
quality_results = quality_control_workflow(123)
|
|
275
|
+
print(f"Processed {len(quality_results)} assignments")
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
### Assignment Analytics
|
|
279
|
+
|
|
280
|
+
```python
|
|
281
|
+
def assignment_analytics(project_id, days=30):
|
|
282
|
+
"""Generate analytics for assignment performance."""
|
|
283
|
+
from datetime import datetime, timedelta
|
|
284
|
+
|
|
285
|
+
# Calculate date range
|
|
286
|
+
end_date = datetime.now()
|
|
287
|
+
start_date = end_date - timedelta(days=days)
|
|
288
|
+
|
|
289
|
+
# Get assignments in date range
|
|
290
|
+
assignments = client.list_assignments(params={
|
|
291
|
+
'project': project_id,
|
|
292
|
+
'created_after': start_date.isoformat()
|
|
293
|
+
}, list_all=True)
|
|
294
|
+
|
|
295
|
+
# Calculate metrics
|
|
296
|
+
analytics = {
|
|
297
|
+
'total_assignments': len(assignments),
|
|
298
|
+
'status_breakdown': {},
|
|
299
|
+
'assignee_performance': {},
|
|
300
|
+
'completion_rate': 0,
|
|
301
|
+
'average_time_to_complete': 0
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
completion_times = []
|
|
305
|
+
|
|
306
|
+
for assignment in assignments:
|
|
307
|
+
# Status breakdown
|
|
308
|
+
status = assignment['status']
|
|
309
|
+
analytics['status_breakdown'][status] = \
|
|
310
|
+
analytics['status_breakdown'].get(status, 0) + 1
|
|
311
|
+
|
|
312
|
+
# Assignee performance
|
|
313
|
+
assignee = assignment.get('assignee')
|
|
314
|
+
if assignee:
|
|
315
|
+
if assignee not in analytics['assignee_performance']:
|
|
316
|
+
analytics['assignee_performance'][assignee] = {
|
|
317
|
+
'total': 0,
|
|
318
|
+
'completed': 0,
|
|
319
|
+
'in_progress': 0,
|
|
320
|
+
'pending': 0
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
analytics['assignee_performance'][assignee]['total'] += 1
|
|
324
|
+
analytics['assignee_performance'][assignee][status] += 1
|
|
325
|
+
|
|
326
|
+
# Calculate completion time
|
|
327
|
+
if status == 'completed':
|
|
328
|
+
created = datetime.fromisoformat(assignment['created_at'].replace('Z', '+00:00'))
|
|
329
|
+
updated = datetime.fromisoformat(assignment['updated_at'].replace('Z', '+00:00'))
|
|
330
|
+
completion_time = (updated - created).total_seconds() / 3600 # hours
|
|
331
|
+
completion_times.append(completion_time)
|
|
332
|
+
|
|
333
|
+
# Calculate rates
|
|
334
|
+
completed_count = analytics['status_breakdown'].get('completed', 0)
|
|
335
|
+
analytics['completion_rate'] = completed_count / analytics['total_assignments'] if analytics['total_assignments'] > 0 else 0
|
|
336
|
+
analytics['average_time_to_complete'] = sum(completion_times) / len(completion_times) if completion_times else 0
|
|
337
|
+
|
|
338
|
+
return analytics
|
|
339
|
+
|
|
340
|
+
# Generate analytics
|
|
341
|
+
analytics = assignment_analytics(123, days=30)
|
|
342
|
+
print(f"Assignment Analytics:")
|
|
343
|
+
print(f" Total assignments: {analytics['total_assignments']}")
|
|
344
|
+
print(f" Completion rate: {analytics['completion_rate']:.2%}")
|
|
345
|
+
print(f" Average completion time: {analytics['average_time_to_complete']:.1f} hours")
|
|
346
|
+
print(f" Status breakdown: {analytics['status_breakdown']}")
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
### Batch Assignment Operations
|
|
350
|
+
|
|
351
|
+
```python
|
|
352
|
+
def batch_assignment_operations(project_id):
|
|
353
|
+
"""Perform batch operations on assignments."""
|
|
354
|
+
|
|
355
|
+
# Get assignments that need batch processing
|
|
356
|
+
assignments = client.list_assignments(params={
|
|
357
|
+
'project': project_id,
|
|
358
|
+
'status': 'completed'
|
|
359
|
+
}, list_all=True)
|
|
360
|
+
|
|
361
|
+
# Group assignments by assignee for performance review
|
|
362
|
+
assignee_groups = {}
|
|
363
|
+
for assignment in assignments:
|
|
364
|
+
assignee = assignment.get('assignee')
|
|
365
|
+
if assignee:
|
|
366
|
+
if assignee not in assignee_groups:
|
|
367
|
+
assignee_groups[assignee] = []
|
|
368
|
+
assignee_groups[assignee].append(assignment['id'])
|
|
369
|
+
|
|
370
|
+
# Apply performance-based tags
|
|
371
|
+
for assignee, assignment_ids in assignee_groups.items():
|
|
372
|
+
assignment_count = len(assignment_ids)
|
|
373
|
+
|
|
374
|
+
if assignment_count >= 50:
|
|
375
|
+
# High performer
|
|
376
|
+
tag_id = get_tag_id('high_performer')
|
|
377
|
+
elif assignment_count >= 20:
|
|
378
|
+
# Regular performer
|
|
379
|
+
tag_id = get_tag_id('regular_performer')
|
|
380
|
+
else:
|
|
381
|
+
# New contributor
|
|
382
|
+
tag_id = get_tag_id('new_contributor')
|
|
383
|
+
|
|
384
|
+
# Apply tags in batch
|
|
385
|
+
client.set_tags_assignments({
|
|
386
|
+
'assignment_ids': assignment_ids,
|
|
387
|
+
'tag_ids': [tag_id]
|
|
388
|
+
})
|
|
389
|
+
|
|
390
|
+
print(f"Tagged {assignment_count} assignments for user {assignee}")
|
|
391
|
+
|
|
392
|
+
return assignee_groups
|
|
393
|
+
|
|
394
|
+
# Run batch operations
|
|
395
|
+
assignee_groups = batch_assignment_operations(123)
|
|
396
|
+
```
|
|
397
|
+
|
|
398
|
+
### Assignment Workflow Automation
|
|
399
|
+
|
|
400
|
+
```python
|
|
401
|
+
def automate_assignment_workflow(project_id):
|
|
402
|
+
"""Automate assignment workflow based on rules."""
|
|
403
|
+
|
|
404
|
+
# Get all assignments that need processing
|
|
405
|
+
assignments = client.list_assignments(params={
|
|
406
|
+
'project': project_id
|
|
407
|
+
}, list_all=True)
|
|
408
|
+
|
|
409
|
+
automation_actions = []
|
|
410
|
+
|
|
411
|
+
for assignment in assignments:
|
|
412
|
+
assignment_id = assignment['id']
|
|
413
|
+
status = assignment['status']
|
|
414
|
+
created_at = datetime.fromisoformat(assignment['created_at'].replace('Z', '+00:00'))
|
|
415
|
+
age_hours = (datetime.now(created_at.tzinfo) - created_at).total_seconds() / 3600
|
|
416
|
+
|
|
417
|
+
actions = []
|
|
418
|
+
|
|
419
|
+
# Rule 1: Mark old pending assignments as urgent
|
|
420
|
+
if status == 'pending' and age_hours > 24:
|
|
421
|
+
urgent_tag_id = get_tag_id('urgent')
|
|
422
|
+
client.set_tags_assignments({
|
|
423
|
+
'assignment_ids': [assignment_id],
|
|
424
|
+
'tag_ids': [urgent_tag_id]
|
|
425
|
+
})
|
|
426
|
+
actions.append('marked_urgent')
|
|
427
|
+
|
|
428
|
+
# Rule 2: Escalate very old in-progress assignments
|
|
429
|
+
if status == 'in_progress' and age_hours > 72:
|
|
430
|
+
escalation_tag_id = get_tag_id('escalated')
|
|
431
|
+
client.set_tags_assignments({
|
|
432
|
+
'assignment_ids': [assignment_id],
|
|
433
|
+
'tag_ids': [escalation_tag_id]
|
|
434
|
+
})
|
|
435
|
+
actions.append('escalated')
|
|
436
|
+
|
|
437
|
+
# Rule 3: Archive very old completed assignments
|
|
438
|
+
if status == 'completed' and age_hours > 168: # 1 week
|
|
439
|
+
archive_tag_id = get_tag_id('archived')
|
|
440
|
+
client.set_tags_assignments({
|
|
441
|
+
'assignment_ids': [assignment_id],
|
|
442
|
+
'tag_ids': [archive_tag_id]
|
|
443
|
+
})
|
|
444
|
+
actions.append('archived')
|
|
445
|
+
|
|
446
|
+
if actions:
|
|
447
|
+
automation_actions.append({
|
|
448
|
+
'assignment_id': assignment_id,
|
|
449
|
+
'actions': actions,
|
|
450
|
+
'age_hours': age_hours
|
|
451
|
+
})
|
|
452
|
+
|
|
453
|
+
return automation_actions
|
|
454
|
+
|
|
455
|
+
# Run automation
|
|
456
|
+
automation_results = automate_assignment_workflow(123)
|
|
457
|
+
print(f"Automated {len(automation_results)} assignments")
|
|
458
|
+
```
|
|
459
|
+
|
|
460
|
+
## Error Handling
|
|
461
|
+
|
|
462
|
+
```python
|
|
463
|
+
from synapse_sdk.clients.exceptions import ClientError
|
|
464
|
+
|
|
465
|
+
def robust_assignment_operations():
|
|
466
|
+
"""Example of robust assignment operations with error handling."""
|
|
467
|
+
|
|
468
|
+
try:
|
|
469
|
+
# Try to get assignment
|
|
470
|
+
assignment = client.get_assignment(999)
|
|
471
|
+
except ClientError as e:
|
|
472
|
+
if e.status_code == 404:
|
|
473
|
+
print("Assignment not found")
|
|
474
|
+
return None
|
|
475
|
+
elif e.status_code == 403:
|
|
476
|
+
print("Permission denied - insufficient access rights")
|
|
477
|
+
return None
|
|
478
|
+
else:
|
|
479
|
+
print(f"Error getting assignment: {e}")
|
|
480
|
+
raise
|
|
481
|
+
|
|
482
|
+
try:
|
|
483
|
+
# Try to set tags
|
|
484
|
+
client.set_tags_assignments({
|
|
485
|
+
'assignment_ids': [999],
|
|
486
|
+
'tag_ids': [1, 2, 3]
|
|
487
|
+
})
|
|
488
|
+
except ClientError as e:
|
|
489
|
+
if e.status_code == 400:
|
|
490
|
+
print(f"Invalid tagging data: {e.response}")
|
|
491
|
+
elif e.status_code == 404:
|
|
492
|
+
print("Assignment or tags not found")
|
|
493
|
+
else:
|
|
494
|
+
print(f"Error setting tags: {e}")
|
|
495
|
+
|
|
496
|
+
return assignment
|
|
497
|
+
|
|
498
|
+
# Use robust operations
|
|
499
|
+
assignment = robust_assignment_operations()
|
|
500
|
+
```
|
|
501
|
+
|
|
502
|
+
## Complete HITL Workflow
|
|
503
|
+
|
|
504
|
+
```python
|
|
505
|
+
def complete_hitl_workflow(project_id):
|
|
506
|
+
"""Complete HITL workflow from assignment creation to quality control."""
|
|
507
|
+
|
|
508
|
+
print("=== HITL Workflow Started ===")
|
|
509
|
+
|
|
510
|
+
# 1. Analyze current assignment status
|
|
511
|
+
print("1. Analyzing assignment status...")
|
|
512
|
+
queue_status = manage_assignment_queue(project_id)
|
|
513
|
+
print(f"Pending assignments: {queue_status['pending_count']}")
|
|
514
|
+
|
|
515
|
+
# 2. Run quality control on completed assignments
|
|
516
|
+
print("2. Running quality control...")
|
|
517
|
+
quality_results = quality_control_workflow(project_id)
|
|
518
|
+
print(f"Quality control processed: {len(quality_results)} assignments")
|
|
519
|
+
|
|
520
|
+
# 3. Generate analytics
|
|
521
|
+
print("3. Generating analytics...")
|
|
522
|
+
analytics = assignment_analytics(project_id)
|
|
523
|
+
print(f"Completion rate: {analytics['completion_rate']:.2%}")
|
|
524
|
+
|
|
525
|
+
# 4. Run automation rules
|
|
526
|
+
print("4. Running automation...")
|
|
527
|
+
automation_results = automate_assignment_workflow(project_id)
|
|
528
|
+
print(f"Automated actions: {len(automation_results)}")
|
|
529
|
+
|
|
530
|
+
# 5. Summary
|
|
531
|
+
print("5. Workflow Summary:")
|
|
532
|
+
print(f" - Total assignments processed: {analytics['total_assignments']}")
|
|
533
|
+
print(f" - Quality control actions: {len(quality_results)}")
|
|
534
|
+
print(f" - Automation actions: {len(automation_results)}")
|
|
535
|
+
|
|
536
|
+
print("=== HITL Workflow Completed ===")
|
|
537
|
+
|
|
538
|
+
return {
|
|
539
|
+
'queue_status': queue_status,
|
|
540
|
+
'quality_results': quality_results,
|
|
541
|
+
'analytics': analytics,
|
|
542
|
+
'automation_results': automation_results
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
# Run complete workflow
|
|
546
|
+
if __name__ == "__main__":
|
|
547
|
+
workflow_results = complete_hitl_workflow(123)
|
|
548
|
+
```
|
|
549
|
+
|
|
550
|
+
## See Also
|
|
551
|
+
|
|
552
|
+
- [BackendClient](./backend.md) - Main backend client
|
|
553
|
+
- [AnnotationClientMixin](./annotation-mixin.md) - Task and annotation management
|
|
554
|
+
- [IntegrationClientMixin](./integration-mixin.md) - Plugin and job management
|