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.

Files changed (307) hide show
  1. synapse_sdk/__init__.py +24 -0
  2. synapse_sdk/cli/__init__.py +308 -5
  3. synapse_sdk/cli/alias/utils.py +1 -1
  4. synapse_sdk/cli/code_server.py +687 -0
  5. synapse_sdk/cli/config.py +440 -0
  6. synapse_sdk/cli/devtools.py +90 -0
  7. synapse_sdk/cli/plugin/publish.py +23 -15
  8. synapse_sdk/clients/agent/__init__.py +9 -3
  9. synapse_sdk/clients/agent/container.py +133 -0
  10. synapse_sdk/clients/agent/core.py +19 -0
  11. synapse_sdk/clients/agent/ray.py +298 -9
  12. synapse_sdk/clients/backend/__init__.py +28 -12
  13. synapse_sdk/clients/backend/annotation.py +9 -1
  14. synapse_sdk/clients/backend/core.py +31 -4
  15. synapse_sdk/clients/backend/data_collection.py +186 -0
  16. synapse_sdk/clients/backend/hitl.py +1 -1
  17. synapse_sdk/clients/backend/integration.py +4 -3
  18. synapse_sdk/clients/backend/ml.py +1 -1
  19. synapse_sdk/clients/backend/models.py +35 -1
  20. synapse_sdk/clients/base.py +309 -36
  21. synapse_sdk/clients/ray/serve.py +2 -0
  22. synapse_sdk/devtools/__init__.py +0 -0
  23. synapse_sdk/devtools/config.py +94 -0
  24. synapse_sdk/devtools/docs/.gitignore +20 -0
  25. synapse_sdk/devtools/docs/README.md +41 -0
  26. synapse_sdk/devtools/docs/blog/2019-05-28-first-blog-post.md +12 -0
  27. synapse_sdk/devtools/docs/blog/2019-05-29-long-blog-post.md +44 -0
  28. synapse_sdk/devtools/docs/blog/2021-08-01-mdx-blog-post.mdx +24 -0
  29. synapse_sdk/devtools/docs/blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg +0 -0
  30. synapse_sdk/devtools/docs/blog/2021-08-26-welcome/index.md +29 -0
  31. synapse_sdk/devtools/docs/blog/authors.yml +25 -0
  32. synapse_sdk/devtools/docs/blog/tags.yml +19 -0
  33. synapse_sdk/devtools/docs/docs/api/clients/agent.md +43 -0
  34. synapse_sdk/devtools/docs/docs/api/clients/annotation-mixin.md +378 -0
  35. synapse_sdk/devtools/docs/docs/api/clients/backend.md +420 -0
  36. synapse_sdk/devtools/docs/docs/api/clients/base.md +257 -0
  37. synapse_sdk/devtools/docs/docs/api/clients/core-mixin.md +477 -0
  38. synapse_sdk/devtools/docs/docs/api/clients/data-collection-mixin.md +422 -0
  39. synapse_sdk/devtools/docs/docs/api/clients/hitl-mixin.md +554 -0
  40. synapse_sdk/devtools/docs/docs/api/clients/index.md +391 -0
  41. synapse_sdk/devtools/docs/docs/api/clients/integration-mixin.md +571 -0
  42. synapse_sdk/devtools/docs/docs/api/clients/ml-mixin.md +578 -0
  43. synapse_sdk/devtools/docs/docs/api/clients/ray.md +342 -0
  44. synapse_sdk/devtools/docs/docs/api/index.md +52 -0
  45. synapse_sdk/devtools/docs/docs/api/plugins/categories.md +43 -0
  46. synapse_sdk/devtools/docs/docs/api/plugins/models.md +114 -0
  47. synapse_sdk/devtools/docs/docs/api/plugins/utils.md +328 -0
  48. synapse_sdk/devtools/docs/docs/categories.md +0 -0
  49. synapse_sdk/devtools/docs/docs/cli-usage.md +280 -0
  50. synapse_sdk/devtools/docs/docs/concepts/index.md +38 -0
  51. synapse_sdk/devtools/docs/docs/configuration.md +83 -0
  52. synapse_sdk/devtools/docs/docs/contributing.md +306 -0
  53. synapse_sdk/devtools/docs/docs/examples/index.md +29 -0
  54. synapse_sdk/devtools/docs/docs/faq.md +179 -0
  55. synapse_sdk/devtools/docs/docs/features/converters/index.md +455 -0
  56. synapse_sdk/devtools/docs/docs/features/index.md +24 -0
  57. synapse_sdk/devtools/docs/docs/features/utils/file.md +415 -0
  58. synapse_sdk/devtools/docs/docs/features/utils/network.md +378 -0
  59. synapse_sdk/devtools/docs/docs/features/utils/storage.md +57 -0
  60. synapse_sdk/devtools/docs/docs/features/utils/types.md +51 -0
  61. synapse_sdk/devtools/docs/docs/installation.md +94 -0
  62. synapse_sdk/devtools/docs/docs/introduction.md +47 -0
  63. synapse_sdk/devtools/docs/docs/plugins/categories/neural-net-plugins/train-action-overview.md +814 -0
  64. synapse_sdk/devtools/docs/docs/plugins/categories/pre-annotation-plugins/pre-annotation-plugin-overview.md +198 -0
  65. synapse_sdk/devtools/docs/docs/plugins/categories/pre-annotation-plugins/to-task-action-development.md +1645 -0
  66. synapse_sdk/devtools/docs/docs/plugins/categories/pre-annotation-plugins/to-task-overview.md +717 -0
  67. synapse_sdk/devtools/docs/docs/plugins/categories/pre-annotation-plugins/to-task-template-development.md +1380 -0
  68. synapse_sdk/devtools/docs/docs/plugins/categories/upload-plugins/upload-plugin-action.md +948 -0
  69. synapse_sdk/devtools/docs/docs/plugins/categories/upload-plugins/upload-plugin-overview.md +544 -0
  70. synapse_sdk/devtools/docs/docs/plugins/categories/upload-plugins/upload-plugin-template.md +766 -0
  71. synapse_sdk/devtools/docs/docs/plugins/export-plugins.md +1092 -0
  72. synapse_sdk/devtools/docs/docs/plugins/plugins.md +852 -0
  73. synapse_sdk/devtools/docs/docs/quickstart.md +78 -0
  74. synapse_sdk/devtools/docs/docs/troubleshooting.md +519 -0
  75. synapse_sdk/devtools/docs/docs/tutorial-basics/_category_.json +8 -0
  76. synapse_sdk/devtools/docs/docs/tutorial-basics/congratulations.md +23 -0
  77. synapse_sdk/devtools/docs/docs/tutorial-basics/create-a-blog-post.md +34 -0
  78. synapse_sdk/devtools/docs/docs/tutorial-basics/create-a-document.md +57 -0
  79. synapse_sdk/devtools/docs/docs/tutorial-basics/create-a-page.md +43 -0
  80. synapse_sdk/devtools/docs/docs/tutorial-basics/deploy-your-site.md +31 -0
  81. synapse_sdk/devtools/docs/docs/tutorial-basics/markdown-features.mdx +152 -0
  82. synapse_sdk/devtools/docs/docs/tutorial-extras/_category_.json +7 -0
  83. synapse_sdk/devtools/docs/docs/tutorial-extras/img/docsVersionDropdown.png +0 -0
  84. synapse_sdk/devtools/docs/docs/tutorial-extras/img/localeDropdown.png +0 -0
  85. synapse_sdk/devtools/docs/docs/tutorial-extras/manage-docs-versions.md +55 -0
  86. synapse_sdk/devtools/docs/docs/tutorial-extras/translate-your-site.md +88 -0
  87. synapse_sdk/devtools/docs/docusaurus.config.ts +148 -0
  88. synapse_sdk/devtools/docs/i18n/ko/code.json +325 -0
  89. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/agent.md +43 -0
  90. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/annotation-mixin.md +289 -0
  91. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/backend.md +420 -0
  92. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/base.md +257 -0
  93. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/core-mixin.md +417 -0
  94. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/data-collection-mixin.md +356 -0
  95. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/hitl-mixin.md +192 -0
  96. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/index.md +391 -0
  97. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/integration-mixin.md +479 -0
  98. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/ml-mixin.md +284 -0
  99. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/ray.md +342 -0
  100. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/index.md +52 -0
  101. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/plugins/models.md +114 -0
  102. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/categories.md +0 -0
  103. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/cli-usage.md +280 -0
  104. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/concepts/index.md +38 -0
  105. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/configuration.md +83 -0
  106. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/contributing.md +306 -0
  107. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/examples/index.md +29 -0
  108. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/faq.md +179 -0
  109. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/converters/index.md +30 -0
  110. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/index.md +24 -0
  111. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/utils/file.md +415 -0
  112. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/utils/network.md +378 -0
  113. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/utils/storage.md +60 -0
  114. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/utils/types.md +51 -0
  115. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/installation.md +94 -0
  116. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/introduction.md +47 -0
  117. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/neural-net-plugins/train-action-overview.md +815 -0
  118. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/pre-annotation-plugins/pre-annotation-plugin-overview.md +198 -0
  119. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/pre-annotation-plugins/to-task-action-development.md +1645 -0
  120. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/pre-annotation-plugins/to-task-overview.md +717 -0
  121. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/pre-annotation-plugins/to-task-template-development.md +1380 -0
  122. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/upload-plugins/upload-plugin-action.md +948 -0
  123. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/upload-plugins/upload-plugin-overview.md +544 -0
  124. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/upload-plugins/upload-plugin-template.md +766 -0
  125. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/export-plugins.md +1092 -0
  126. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/plugins.md +117 -0
  127. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/quickstart.md +78 -0
  128. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/troubleshooting.md +519 -0
  129. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current.json +34 -0
  130. synapse_sdk/devtools/docs/i18n/ko/docusaurus-theme-classic/footer.json +42 -0
  131. synapse_sdk/devtools/docs/i18n/ko/docusaurus-theme-classic/navbar.json +18 -0
  132. synapse_sdk/devtools/docs/package-lock.json +18784 -0
  133. synapse_sdk/devtools/docs/package.json +48 -0
  134. synapse_sdk/devtools/docs/sidebars.ts +122 -0
  135. synapse_sdk/devtools/docs/src/components/HomepageFeatures/index.tsx +71 -0
  136. synapse_sdk/devtools/docs/src/components/HomepageFeatures/styles.module.css +11 -0
  137. synapse_sdk/devtools/docs/src/css/custom.css +30 -0
  138. synapse_sdk/devtools/docs/src/pages/index.module.css +23 -0
  139. synapse_sdk/devtools/docs/src/pages/index.tsx +21 -0
  140. synapse_sdk/devtools/docs/src/pages/markdown-page.md +7 -0
  141. synapse_sdk/devtools/docs/static/.nojekyll +0 -0
  142. synapse_sdk/devtools/docs/static/img/docusaurus-social-card.jpg +0 -0
  143. synapse_sdk/devtools/docs/static/img/docusaurus.png +0 -0
  144. synapse_sdk/devtools/docs/static/img/favicon.ico +0 -0
  145. synapse_sdk/devtools/docs/static/img/logo.png +0 -0
  146. synapse_sdk/devtools/docs/static/img/undraw_docusaurus_mountain.svg +171 -0
  147. synapse_sdk/devtools/docs/static/img/undraw_docusaurus_react.svg +170 -0
  148. synapse_sdk/devtools/docs/static/img/undraw_docusaurus_tree.svg +40 -0
  149. synapse_sdk/devtools/docs/tsconfig.json +8 -0
  150. synapse_sdk/devtools/server.py +41 -0
  151. synapse_sdk/devtools/streamlit_app/__init__.py +5 -0
  152. synapse_sdk/devtools/streamlit_app/app.py +128 -0
  153. synapse_sdk/devtools/streamlit_app/services/__init__.py +11 -0
  154. synapse_sdk/devtools/streamlit_app/services/job_service.py +233 -0
  155. synapse_sdk/devtools/streamlit_app/services/plugin_service.py +236 -0
  156. synapse_sdk/devtools/streamlit_app/services/serve_service.py +95 -0
  157. synapse_sdk/devtools/streamlit_app/ui/__init__.py +15 -0
  158. synapse_sdk/devtools/streamlit_app/ui/config_tab.py +76 -0
  159. synapse_sdk/devtools/streamlit_app/ui/deployment_tab.py +66 -0
  160. synapse_sdk/devtools/streamlit_app/ui/http_tab.py +125 -0
  161. synapse_sdk/devtools/streamlit_app/ui/jobs_tab.py +573 -0
  162. synapse_sdk/devtools/streamlit_app/ui/serve_tab.py +346 -0
  163. synapse_sdk/devtools/streamlit_app/ui/status_bar.py +118 -0
  164. synapse_sdk/devtools/streamlit_app/utils/__init__.py +40 -0
  165. synapse_sdk/devtools/streamlit_app/utils/json_viewer.py +197 -0
  166. synapse_sdk/devtools/streamlit_app/utils/log_formatter.py +38 -0
  167. synapse_sdk/devtools/streamlit_app/utils/styles.py +241 -0
  168. synapse_sdk/devtools/streamlit_app/utils/ui_components.py +289 -0
  169. synapse_sdk/devtools/streamlit_app.py +10 -0
  170. synapse_sdk/loggers.py +65 -7
  171. synapse_sdk/plugins/README.md +1340 -0
  172. synapse_sdk/plugins/categories/base.py +73 -11
  173. synapse_sdk/plugins/categories/data_validation/actions/validation.py +72 -0
  174. synapse_sdk/plugins/categories/data_validation/templates/plugin/validation.py +33 -5
  175. synapse_sdk/plugins/categories/export/actions/__init__.py +3 -0
  176. synapse_sdk/plugins/categories/export/actions/export/__init__.py +28 -0
  177. synapse_sdk/plugins/categories/export/actions/export/action.py +165 -0
  178. synapse_sdk/plugins/categories/export/actions/export/enums.py +113 -0
  179. synapse_sdk/plugins/categories/export/actions/export/exceptions.py +53 -0
  180. synapse_sdk/plugins/categories/export/actions/export/models.py +74 -0
  181. synapse_sdk/plugins/categories/export/actions/export/run.py +195 -0
  182. synapse_sdk/plugins/categories/export/actions/{export.py → export/utils.py} +47 -82
  183. synapse_sdk/plugins/categories/export/templates/config.yaml +19 -1
  184. synapse_sdk/plugins/categories/export/templates/plugin/__init__.py +390 -0
  185. synapse_sdk/plugins/categories/export/templates/plugin/export.py +153 -129
  186. synapse_sdk/plugins/categories/neural_net/actions/deployment.py +9 -62
  187. synapse_sdk/plugins/categories/neural_net/actions/train.py +1062 -32
  188. synapse_sdk/plugins/categories/neural_net/actions/tune.py +534 -0
  189. synapse_sdk/plugins/categories/neural_net/templates/config.yaml +27 -5
  190. synapse_sdk/plugins/categories/neural_net/templates/plugin/inference.py +26 -10
  191. synapse_sdk/plugins/categories/pre_annotation/actions/__init__.py +4 -0
  192. synapse_sdk/plugins/categories/pre_annotation/actions/pre_annotation/__init__.py +3 -0
  193. synapse_sdk/plugins/categories/pre_annotation/actions/pre_annotation/action.py +10 -0
  194. synapse_sdk/plugins/categories/pre_annotation/actions/to_task/__init__.py +28 -0
  195. synapse_sdk/plugins/categories/pre_annotation/actions/to_task/action.py +145 -0
  196. synapse_sdk/plugins/categories/pre_annotation/actions/to_task/enums.py +269 -0
  197. synapse_sdk/plugins/categories/pre_annotation/actions/to_task/exceptions.py +14 -0
  198. synapse_sdk/plugins/categories/pre_annotation/actions/to_task/factory.py +76 -0
  199. synapse_sdk/plugins/categories/pre_annotation/actions/to_task/models.py +97 -0
  200. synapse_sdk/plugins/categories/pre_annotation/actions/to_task/orchestrator.py +250 -0
  201. synapse_sdk/plugins/categories/pre_annotation/actions/to_task/run.py +64 -0
  202. synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/__init__.py +17 -0
  203. synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/annotation.py +287 -0
  204. synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/base.py +170 -0
  205. synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/extraction.py +83 -0
  206. synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/metrics.py +87 -0
  207. synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/preprocessor.py +127 -0
  208. synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/validation.py +143 -0
  209. synapse_sdk/plugins/categories/pre_annotation/actions/to_task.py +966 -0
  210. synapse_sdk/plugins/categories/pre_annotation/templates/config.yaml +19 -0
  211. synapse_sdk/plugins/categories/pre_annotation/templates/plugin/to_task.py +40 -0
  212. synapse_sdk/plugins/categories/upload/actions/upload/__init__.py +19 -0
  213. synapse_sdk/plugins/categories/upload/actions/upload/action.py +232 -0
  214. synapse_sdk/plugins/categories/upload/actions/upload/context.py +185 -0
  215. synapse_sdk/plugins/categories/upload/actions/upload/enums.py +471 -0
  216. synapse_sdk/plugins/categories/upload/actions/upload/exceptions.py +36 -0
  217. synapse_sdk/plugins/categories/upload/actions/upload/factory.py +138 -0
  218. synapse_sdk/plugins/categories/upload/actions/upload/models.py +203 -0
  219. synapse_sdk/plugins/categories/upload/actions/upload/orchestrator.py +183 -0
  220. synapse_sdk/plugins/categories/upload/actions/upload/registry.py +113 -0
  221. synapse_sdk/plugins/categories/upload/actions/upload/run.py +179 -0
  222. synapse_sdk/plugins/categories/upload/actions/upload/steps/__init__.py +1 -0
  223. synapse_sdk/plugins/categories/upload/actions/upload/steps/base.py +107 -0
  224. synapse_sdk/plugins/categories/upload/actions/upload/steps/cleanup.py +62 -0
  225. synapse_sdk/plugins/categories/upload/actions/upload/steps/collection.py +63 -0
  226. synapse_sdk/plugins/categories/upload/actions/upload/steps/generate.py +84 -0
  227. synapse_sdk/plugins/categories/upload/actions/upload/steps/initialize.py +82 -0
  228. synapse_sdk/plugins/categories/upload/actions/upload/steps/metadata.py +235 -0
  229. synapse_sdk/plugins/categories/upload/actions/upload/steps/organize.py +203 -0
  230. synapse_sdk/plugins/categories/upload/actions/upload/steps/upload.py +97 -0
  231. synapse_sdk/plugins/categories/upload/actions/upload/steps/validate.py +71 -0
  232. synapse_sdk/plugins/categories/upload/actions/upload/strategies/__init__.py +1 -0
  233. synapse_sdk/plugins/categories/upload/actions/upload/strategies/base.py +82 -0
  234. synapse_sdk/plugins/categories/upload/actions/upload/strategies/data_unit/__init__.py +1 -0
  235. synapse_sdk/plugins/categories/upload/actions/upload/strategies/data_unit/batch.py +39 -0
  236. synapse_sdk/plugins/categories/upload/actions/upload/strategies/data_unit/single.py +29 -0
  237. synapse_sdk/plugins/categories/upload/actions/upload/strategies/file_discovery/__init__.py +1 -0
  238. synapse_sdk/plugins/categories/upload/actions/upload/strategies/file_discovery/flat.py +258 -0
  239. synapse_sdk/plugins/categories/upload/actions/upload/strategies/file_discovery/recursive.py +281 -0
  240. synapse_sdk/plugins/categories/upload/actions/upload/strategies/metadata/__init__.py +1 -0
  241. synapse_sdk/plugins/categories/upload/actions/upload/strategies/metadata/excel.py +174 -0
  242. synapse_sdk/plugins/categories/upload/actions/upload/strategies/metadata/none.py +16 -0
  243. synapse_sdk/plugins/categories/upload/actions/upload/strategies/upload/__init__.py +1 -0
  244. synapse_sdk/plugins/categories/upload/actions/upload/strategies/upload/sync.py +84 -0
  245. synapse_sdk/plugins/categories/upload/actions/upload/strategies/validation/__init__.py +1 -0
  246. synapse_sdk/plugins/categories/upload/actions/upload/strategies/validation/default.py +60 -0
  247. synapse_sdk/plugins/categories/upload/actions/upload/utils.py +250 -0
  248. synapse_sdk/plugins/categories/upload/templates/README.md +470 -0
  249. synapse_sdk/plugins/categories/upload/templates/config.yaml +29 -2
  250. synapse_sdk/plugins/categories/upload/templates/plugin/__init__.py +294 -0
  251. synapse_sdk/plugins/categories/upload/templates/plugin/upload.py +88 -30
  252. synapse_sdk/plugins/models.py +122 -16
  253. synapse_sdk/plugins/templates/plugin-config-schema.json +406 -0
  254. synapse_sdk/plugins/templates/schema.json +491 -0
  255. synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/requirements.txt +1 -1
  256. synapse_sdk/plugins/utils/__init__.py +46 -0
  257. synapse_sdk/plugins/utils/actions.py +119 -0
  258. synapse_sdk/plugins/utils/config.py +203 -0
  259. synapse_sdk/plugins/{utils.py → utils/legacy.py} +26 -46
  260. synapse_sdk/plugins/utils/ray_gcs.py +66 -0
  261. synapse_sdk/plugins/utils/registry.py +58 -0
  262. synapse_sdk/shared/__init__.py +25 -0
  263. synapse_sdk/shared/enums.py +93 -0
  264. synapse_sdk/utils/converters/__init__.py +240 -0
  265. synapse_sdk/utils/converters/coco/__init__.py +0 -0
  266. synapse_sdk/utils/converters/coco/from_dm.py +322 -0
  267. synapse_sdk/utils/converters/coco/to_dm.py +215 -0
  268. synapse_sdk/utils/converters/dm/__init__.py +56 -0
  269. synapse_sdk/utils/converters/dm/from_v1.py +627 -0
  270. synapse_sdk/utils/converters/dm/to_v1.py +367 -0
  271. synapse_sdk/utils/converters/pascal/__init__.py +0 -0
  272. synapse_sdk/utils/converters/pascal/from_dm.py +244 -0
  273. synapse_sdk/utils/converters/pascal/to_dm.py +214 -0
  274. synapse_sdk/utils/converters/yolo/__init__.py +0 -0
  275. synapse_sdk/utils/converters/yolo/from_dm.py +384 -0
  276. synapse_sdk/utils/converters/yolo/to_dm.py +267 -0
  277. synapse_sdk/utils/dataset.py +46 -0
  278. synapse_sdk/utils/encryption.py +158 -0
  279. synapse_sdk/utils/file/__init__.py +39 -0
  280. synapse_sdk/utils/file/archive.py +32 -0
  281. synapse_sdk/utils/file/checksum.py +56 -0
  282. synapse_sdk/utils/file/chunking.py +31 -0
  283. synapse_sdk/utils/file/download.py +385 -0
  284. synapse_sdk/utils/file/encoding.py +40 -0
  285. synapse_sdk/utils/file/io.py +22 -0
  286. synapse_sdk/utils/file/video/__init__.py +29 -0
  287. synapse_sdk/utils/file/video/transcode.py +307 -0
  288. synapse_sdk/utils/{file.py → file.py.backup} +84 -2
  289. synapse_sdk/utils/http.py +138 -0
  290. synapse_sdk/utils/network.py +293 -0
  291. synapse_sdk/utils/storage/__init__.py +36 -2
  292. synapse_sdk/utils/storage/providers/__init__.py +141 -0
  293. synapse_sdk/utils/storage/providers/file_system.py +134 -0
  294. synapse_sdk/utils/storage/providers/http.py +190 -0
  295. synapse_sdk/utils/storage/providers/s3.py +54 -6
  296. synapse_sdk/utils/storage/providers/sftp.py +31 -0
  297. synapse_sdk/utils/storage/registry.py +6 -0
  298. synapse_sdk-2025.11.7.dist-info/METADATA +122 -0
  299. synapse_sdk-2025.11.7.dist-info/RECORD +386 -0
  300. {synapse_sdk-1.0.0a35.dist-info → synapse_sdk-2025.11.7.dist-info}/WHEEL +1 -1
  301. synapse_sdk/clients/backend/dataset.py +0 -102
  302. synapse_sdk/plugins/categories/upload/actions/upload.py +0 -293
  303. synapse_sdk-1.0.0a35.dist-info/METADATA +0 -47
  304. synapse_sdk-1.0.0a35.dist-info/RECORD +0 -137
  305. {synapse_sdk-1.0.0a35.dist-info → synapse_sdk-2025.11.7.dist-info}/entry_points.txt +0 -0
  306. {synapse_sdk-1.0.0a35.dist-info → synapse_sdk-2025.11.7.dist-info}/licenses/LICENSE +0 -0
  307. {synapse_sdk-1.0.0a35.dist-info → synapse_sdk-2025.11.7.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,420 @@
1
+ ---
2
+ id: backend
3
+ title: BackendClient
4
+ sidebar_position: 1
5
+ ---
6
+
7
+ # BackendClient
8
+
9
+ Main client for interacting with the Synapse backend API.
10
+
11
+ ## Overview
12
+
13
+ The `BackendClient` provides comprehensive access to all backend operations including data management, plugin execution, annotations, and machine learning workflows. It aggregates functionality from multiple specialized mixins:
14
+
15
+ - **AnnotationClientMixin**: Task and annotation management
16
+ - **CoreClientMixin**: File upload and core operations
17
+ - **DataCollectionClientMixin**: Data collection and file management
18
+ - **HITLClientMixin**: Human-in-the-loop assignment operations
19
+ - **IntegrationClientMixin**: Plugin and job management
20
+ - **MLClientMixin**: Machine learning models and ground truth operations
21
+
22
+ ## Constructor
23
+
24
+ ```python
25
+ BackendClient(
26
+ base_url: str,
27
+ api_token: str = None,
28
+ agent_token: str = None,
29
+ timeout: dict = None
30
+ )
31
+ ```
32
+
33
+ ### Parameters
34
+
35
+ - **base_url** (`str`): The base URL of the Synapse backend API
36
+ - **api_token** (`str`, optional): API authentication token. Can also be set via `SYNAPSE_API_TOKEN` environment variable
37
+ - **agent_token** (`str`, optional): Agent authentication token. Can also be set via `SYNAPSE_AGENT_TOKEN` environment variable
38
+ - **timeout** (`dict`, optional): Custom timeout settings. Defaults to `{'connect': 5, 'read': 30}`
39
+
40
+ ### Example
41
+
42
+ ```python
43
+ from synapse_sdk.clients.backend import BackendClient
44
+
45
+ # Create client with explicit token
46
+ client = BackendClient(
47
+ base_url="https://api.synapse.sh",
48
+ api_token="your-api-token"
49
+ )
50
+
51
+ # Or use environment variables
52
+ import os
53
+ os.environ['SYNAPSE_API_TOKEN'] = "your-api-token"
54
+ client = BackendClient(base_url="https://api.synapse.sh")
55
+ ```
56
+
57
+ ## API Methods
58
+
59
+ ### Annotation Operations
60
+
61
+ #### `get_project(pk)`
62
+
63
+ Get project details by ID.
64
+
65
+ ```python
66
+ project = client.get_project(123)
67
+ ```
68
+
69
+ #### `get_task(pk, params)`
70
+
71
+ Get task details with optional parameters.
72
+
73
+ ```python
74
+ task = client.get_task(456, params={'expand': 'data_unit'})
75
+ ```
76
+
77
+ #### `annotate_task_data(pk, data)`
78
+
79
+ Submit annotation data for a task.
80
+
81
+ ```python
82
+ result = client.annotate_task_data(456, {
83
+ 'annotations': [
84
+ {'type': 'bbox', 'coordinates': [10, 10, 100, 100]}
85
+ ]
86
+ })
87
+ ```
88
+
89
+ #### `list_tasks(params=None, url_conversion=None, list_all=False)`
90
+
91
+ List tasks with filtering and pagination.
92
+
93
+ ```python
94
+ # Get tasks for a project
95
+ tasks = client.list_tasks(params={'project': 123})
96
+
97
+ # Get all tasks (handles pagination automatically)
98
+ all_tasks = client.list_tasks(list_all=True)
99
+ ```
100
+
101
+ #### `create_tasks(data)`
102
+
103
+ Create new tasks.
104
+
105
+ ```python
106
+ new_tasks = client.create_tasks([
107
+ {'project': 123, 'data_unit': 789},
108
+ {'project': 123, 'data_unit': 790}
109
+ ])
110
+ ```
111
+
112
+ #### `set_tags_tasks(data, params=None)`
113
+
114
+ Set tags for multiple tasks.
115
+
116
+ ```python
117
+ client.set_tags_tasks({
118
+ 'task_ids': [456, 457],
119
+ 'tag_ids': [1, 2, 3]
120
+ })
121
+ ```
122
+
123
+ ### Core Operations
124
+
125
+ #### `create_chunked_upload(file_path)`
126
+
127
+ Upload large files using chunked upload for optimal performance.
128
+
129
+ ```python
130
+ from pathlib import Path
131
+
132
+ result = client.create_chunked_upload(Path('/path/to/large_file.zip'))
133
+ print(f"Upload completed: {result}")
134
+ ```
135
+
136
+ **Features:**
137
+
138
+ - Uses 50MB chunks for optimal performance
139
+ - Automatic retry and resume capability
140
+ - MD5 integrity verification
141
+ - Progress tracking support
142
+
143
+ ### Data Collection Operations
144
+
145
+ #### `list_data_collection()`
146
+
147
+ List all available data collections.
148
+
149
+ ```python
150
+ collections = client.list_data_collection()
151
+ ```
152
+
153
+ #### `get_data_collection(data_collection_id)`
154
+
155
+ Get detailed information about a specific data collection.
156
+
157
+ ```python
158
+ collection = client.get_data_collection(123)
159
+ file_specs = collection['file_specifications']
160
+ ```
161
+
162
+ #### `create_data_file(file_path, use_chunked_upload=False)`
163
+
164
+ Create and upload a data file to the backend.
165
+
166
+ ```python
167
+ from pathlib import Path
168
+
169
+ # Regular upload
170
+ data_file = client.create_data_file(Path('/path/to/file.jpg'))
171
+
172
+ # Chunked upload for large files
173
+ large_file = client.create_data_file(
174
+ Path('/path/to/large_file.zip'),
175
+ use_chunked_upload=True
176
+ )
177
+ ```
178
+
179
+ #### `upload_data_file(organized_file, collection_id, use_chunked_upload=False)`
180
+
181
+ Upload organized file data to a collection.
182
+
183
+ ```python
184
+ result = client.upload_data_file(
185
+ organized_file={'files': {...}, 'meta': {...}},
186
+ collection_id=123,
187
+ use_chunked_upload=False
188
+ )
189
+ ```
190
+
191
+ #### `create_data_units(uploaded_files)`
192
+
193
+ Create data units from uploaded files.
194
+
195
+ ```python
196
+ data_units = client.create_data_units([
197
+ {'id': 1, 'file': {...}},
198
+ {'id': 2, 'file': {...}}
199
+ ])
200
+ ```
201
+
202
+ ### HITL (Human-in-the-Loop) Operations
203
+
204
+ #### `get_assignment(pk)`
205
+
206
+ Get assignment details by ID.
207
+
208
+ ```python
209
+ assignment = client.get_assignment(789)
210
+ ```
211
+
212
+ #### `list_assignments(params=None, url_conversion=None, list_all=False)`
213
+
214
+ List assignments with filtering options.
215
+
216
+ ```python
217
+ # Get assignments for a project
218
+ assignments = client.list_assignments(params={'project': 123})
219
+
220
+ # Get all assignments
221
+ all_assignments = client.list_assignments(list_all=True)
222
+ ```
223
+
224
+ #### `set_tags_assignments(data, params=None)`
225
+
226
+ Set tags for multiple assignments.
227
+
228
+ ```python
229
+ client.set_tags_assignments({
230
+ 'assignment_ids': [789, 790],
231
+ 'tag_ids': [1, 2]
232
+ })
233
+ ```
234
+
235
+ ### Integration Operations
236
+
237
+ #### `health_check_agent(token)`
238
+
239
+ Check agent health status.
240
+
241
+ ```python
242
+ status = client.health_check_agent('agent-token-123')
243
+ ```
244
+
245
+ #### `get_plugin(pk)` / `create_plugin(data)` / `update_plugin(pk, data)`
246
+
247
+ Manage plugins.
248
+
249
+ ```python
250
+ # Get plugin
251
+ plugin = client.get_plugin(123)
252
+
253
+ # Create plugin
254
+ new_plugin = client.create_plugin({
255
+ 'name': 'My Plugin',
256
+ 'description': 'Plugin description'
257
+ })
258
+
259
+ # Update plugin
260
+ updated = client.update_plugin(123, {'description': 'Updated description'})
261
+ ```
262
+
263
+ #### `run_plugin(pk, data)`
264
+
265
+ Execute a plugin with provided data.
266
+
267
+ ```python
268
+ result = client.run_plugin(123, {
269
+ 'parameters': {'input': 'value'},
270
+ 'context': {...}
271
+ })
272
+ ```
273
+
274
+ #### Plugin Release Management
275
+
276
+ ```python
277
+ # Create plugin release
278
+ release = client.create_plugin_release({
279
+ 'plugin': 123,
280
+ 'version': '1.0.0',
281
+ 'file': open('/path/to/plugin.zip', 'rb')
282
+ })
283
+
284
+ # Get release details
285
+ release_info = client.get_plugin_release(456)
286
+ ```
287
+
288
+ #### Job Management
289
+
290
+ ```python
291
+ # List jobs
292
+ jobs = client.list_jobs(params={'status': 'running'})
293
+
294
+ # Get job details
295
+ job = client.get_job(789, params={'expand': 'logs'})
296
+
297
+ # Update job status
298
+ client.update_job(789, {'status': 'completed'})
299
+
300
+ # Get job console logs
301
+ logs = client.list_job_console_logs(789)
302
+ ```
303
+
304
+ #### Storage Operations
305
+
306
+ ```python
307
+ # List storages
308
+ storages = client.list_storages()
309
+
310
+ # Get storage details
311
+ storage = client.get_storage(123)
312
+
313
+ # Create storage
314
+ new_storage = client.create_storage({
315
+ 'name': 'My Storage',
316
+ 'provider': 'amazon_s3',
317
+ 'configuration': {...}
318
+ })
319
+ ```
320
+
321
+ ### Machine Learning Operations
322
+
323
+ #### `list_models(params=None)` / `get_model(pk, params=None, url_conversion=None)`
324
+
325
+ Manage ML models.
326
+
327
+ ```python
328
+ # List models
329
+ models = client.list_models(params={'project': 123})
330
+
331
+ # Get model details
332
+ model = client.get_model(456, params={'expand': 'metrics'})
333
+ ```
334
+
335
+ #### `create_model(data)`
336
+
337
+ Create a new ML model with file upload.
338
+
339
+ ```python
340
+ new_model = client.create_model({
341
+ 'name': 'My Model',
342
+ 'project': 123,
343
+ 'file': '/path/to/model.pkl'
344
+ })
345
+ ```
346
+
347
+ #### Ground Truth Operations
348
+
349
+ ```python
350
+ # List ground truth events
351
+ events = client.list_ground_truth_events(
352
+ params={'ground_truth_dataset_versions': [123]},
353
+ list_all=True
354
+ )
355
+
356
+ # Get ground truth version
357
+ version = client.get_ground_truth_version(123)
358
+ ```
359
+
360
+ ## Storage Models
361
+
362
+ The backend client includes predefined models for storage operations:
363
+
364
+ ### StorageCategory
365
+
366
+ - `INTERNAL`: Internal storage systems
367
+ - `EXTERNAL`: External storage providers
368
+
369
+ ### StorageProvider
370
+
371
+ - `AMAZON_S3`: Amazon S3
372
+ - `AZURE`: Microsoft Azure Blob Storage
373
+ - `DIGITAL_OCEAN`: DigitalOcean Spaces
374
+ - `FILE_SYSTEM`: Local file system
375
+ - `FTP` / `SFTP`: FTP protocols
376
+ - `MINIO`: MinIO storage
377
+ - `GCP`: Google Cloud Storage
378
+
379
+ ## Error Handling
380
+
381
+ All API methods may raise `ClientError` exceptions for various error conditions:
382
+
383
+ ```python
384
+ from synapse_sdk.clients.exceptions import ClientError
385
+
386
+ try:
387
+ project = client.get_project(999)
388
+ except ClientError as e:
389
+ print(f"API Error: {e}")
390
+ print(f"Status Code: {e.status_code}")
391
+ print(f"Response: {e.response}")
392
+ ```
393
+
394
+ ## Pagination
395
+
396
+ Methods supporting `list_all=True` will automatically handle pagination:
397
+
398
+ ```python
399
+ # Manual pagination
400
+ tasks_page1 = client.list_tasks(params={'page': 1, 'page_size': 100})
401
+
402
+ # Automatic pagination (recommended)
403
+ all_tasks = client.list_tasks(list_all=True)
404
+ ```
405
+
406
+ ## URL Conversion
407
+
408
+ Some methods support URL conversion for file fields:
409
+
410
+ ```python
411
+ # Custom URL conversion
412
+ tasks = client.list_tasks(
413
+ url_conversion={'files': lambda url: f"https://cdn.example.com{url}"}
414
+ )
415
+ ```
416
+
417
+ ## See Also
418
+
419
+ - [AgentClient](./agent.md) - For agent-specific operations
420
+ - [BaseClient](./base.md) - Base client implementation
@@ -0,0 +1,257 @@
1
+ ---
2
+ id: base
3
+ title: BaseClient
4
+ sidebar_position: 3
5
+ ---
6
+
7
+ # BaseClient
8
+
9
+ Base class for all Synapse SDK clients providing core HTTP operations and pagination.
10
+
11
+ ## Overview
12
+
13
+ The `BaseClient` provides common functionality for HTTP operations, error handling, request management, and pagination used by all other clients. It implements efficient pagination handling with automatic file URL conversion capabilities.
14
+
15
+ ## Features
16
+
17
+ - HTTP request handling with retry logic
18
+ - Automatic timeout management
19
+ - Efficient pagination with generators
20
+ - File URL to local path conversion
21
+ - Pydantic model validation
22
+ - Connection pooling
23
+
24
+ ## Core HTTP Methods
25
+
26
+ The BaseClient provides low-level HTTP methods that are used internally by all client mixins:
27
+
28
+ - `_get()` - GET requests with optional response model validation
29
+ - `_post()` - POST requests with request/response validation
30
+ - `_put()` - PUT requests with model validation
31
+ - `_patch()` - PATCH requests with model validation
32
+ - `_delete()` - DELETE requests with model validation
33
+
34
+ These methods are typically not called directly. Instead, use the higher-level methods provided by client mixins.
35
+
36
+ ## Pagination Methods
37
+
38
+ ### `_list(path, url_conversion=None, list_all=False, params=None, **kwargs)`
39
+
40
+ List resources from a paginated API endpoint with optional automatic pagination and file URL conversion.
41
+
42
+ **Parameters:**
43
+
44
+ - `path` (str): URL path to request
45
+ - `url_conversion` (dict, optional): Configuration for converting file URLs to local paths
46
+ - Structure: `{'files_fields': ['field1', 'field2'], 'is_list': True}`
47
+ - Automatically downloads files and replaces URLs with local paths
48
+ - `list_all` (bool): If True, returns all results across all pages using a generator
49
+ - `params` (dict, optional): Query parameters (filters, sorting, etc.)
50
+ - `**kwargs`: Additional request arguments
51
+
52
+ **Returns:**
53
+
54
+ - If `list_all=False`: Dict with `results`, `count`, `next`, `previous`
55
+ - If `list_all=True`: Tuple of `(generator, total_count)`
56
+
57
+ **Examples:**
58
+
59
+ ```python
60
+ # Get first page only
61
+ response = client._list('api/tasks/')
62
+ tasks = response['results'] # First page of tasks
63
+ total = response['count'] # Total number of tasks
64
+
65
+ # Get all results using generator (memory efficient)
66
+ generator, total_count = client._list('api/tasks/', list_all=True)
67
+ all_tasks = list(generator) # Fetches all pages automatically
68
+
69
+ # With filters
70
+ params = {'status': 'pending', 'priority': 'high'}
71
+ response = client._list('api/tasks/', params=params)
72
+
73
+ # With url_conversion for file fields
74
+ url_conversion = {'files_fields': ['files'], 'is_list': True}
75
+ generator, count = client._list(
76
+ 'api/data_units/',
77
+ url_conversion=url_conversion,
78
+ list_all=True,
79
+ params={'status': 'active'}
80
+ )
81
+ # File URLs in 'files' field are automatically downloaded and converted to local paths
82
+ for unit in generator:
83
+ print(unit['files']) # Local file paths, not URLs
84
+ ```
85
+
86
+ ### `_list_all(path, url_conversion=None, params=None, **kwargs)`
87
+
88
+ Generator that yields all results from a paginated API endpoint.
89
+
90
+ This method is called internally by `_list()` when `list_all=True`. It handles pagination automatically by following `next` URLs and uses an iterative approach (while loop) instead of recursion to avoid stack overflow with deep pagination.
91
+
92
+ **Key Improvements (SYN-5757):**
93
+
94
+ 1. **No duplicate page_size**: The `page_size` parameter is only added to the first request. Subsequent requests use the `next` URL directly, which already contains all necessary parameters.
95
+
96
+ 2. **Proper params handling**: User-specified query parameters are correctly passed to the first request and preserved through pagination via the `next` URL.
97
+
98
+ 3. **url_conversion on all pages**: URL conversion is applied to every page, not just the first one.
99
+
100
+ 4. **Iterative instead of recursive**: Uses a while loop instead of recursion for better memory efficiency and to prevent stack overflow on large datasets.
101
+
102
+ **Parameters:**
103
+
104
+ - `path` (str): Initial URL path
105
+ - `url_conversion` (dict, optional): Applied to all pages
106
+ - `params` (dict, optional): Query parameters for first request only
107
+ - `**kwargs`: Additional request arguments
108
+
109
+ **Yields:**
110
+
111
+ Individual result items from all pages, fetched lazily.
112
+
113
+ **Examples:**
114
+
115
+ ```python
116
+ # Basic: iterate through all tasks
117
+ for task in client._list_all('api/tasks/'):
118
+ process_task(task)
119
+
120
+ # With filters
121
+ params = {'status': 'pending'}
122
+ for task in client._list_all('api/tasks/', params=params):
123
+ print(task['id'])
124
+
125
+ # With url_conversion for nested file fields
126
+ url_conversion = {'files_fields': ['data.files', 'metadata.attachments'], 'is_list': True}
127
+ for item in client._list_all('api/items/', url_conversion=url_conversion):
128
+ print(item['data']['files']) # Local paths
129
+
130
+ # Collect all results (memory intensive for large datasets)
131
+ all_results = list(client._list_all('api/tasks/'))
132
+ ```
133
+
134
+ ## URL Conversion for File Downloads
135
+
136
+ The `url_conversion` parameter enables automatic downloading of files referenced by URLs in API responses. This is particularly useful when working with data units, tasks, or any resources that include file references.
137
+
138
+ ### URL Conversion Structure
139
+
140
+ ```python
141
+ url_conversion = {
142
+ 'files_fields': ['files', 'images', 'data.attachments'], # Field paths
143
+ 'is_list': True # Whether processing a list of items
144
+ }
145
+ ```
146
+
147
+ - `files_fields`: List of field paths (supports dot notation for nested fields)
148
+ - `is_list`: Set to `True` for paginated list responses
149
+
150
+ ### How It Works
151
+
152
+ 1. API returns responses with file URLs
153
+ 2. `url_conversion` identifies fields containing URLs
154
+ 3. Files are downloaded automatically to a temporary directory
155
+ 4. URLs are replaced with local file paths
156
+ 5. Your code receives responses with local paths instead of URLs
157
+
158
+ ### Examples
159
+
160
+ ```python
161
+ # Simple file field
162
+ url_conversion = {'files_fields': ['image_url'], 'is_list': True}
163
+ generator, count = client._list(
164
+ 'api/photos/',
165
+ url_conversion=url_conversion,
166
+ list_all=True
167
+ )
168
+ for photo in generator:
169
+ # photo['image_url'] is now a local Path object, not a URL
170
+ with open(photo['image_url'], 'rb') as f:
171
+ process_image(f)
172
+
173
+ # Multiple file fields
174
+ url_conversion = {
175
+ 'files_fields': ['thumbnail', 'full_image', 'raw_data'],
176
+ 'is_list': True
177
+ }
178
+
179
+ # Nested fields using dot notation
180
+ url_conversion = {
181
+ 'files_fields': ['data.files', 'metadata.preview', 'annotations.image'],
182
+ 'is_list': True
183
+ }
184
+
185
+ # With async download for better performance
186
+ from synapse_sdk.utils.file import files_url_to_path_from_objs
187
+
188
+ results = client._list('api/data_units/')['results']
189
+ files_url_to_path_from_objs(
190
+ results,
191
+ files_fields=['files'],
192
+ is_list=True,
193
+ is_async=True # Download all files concurrently
194
+ )
195
+ ```
196
+
197
+ ## Performance Considerations
198
+
199
+ ### Memory Efficiency
200
+
201
+ When working with large datasets, use generators instead of loading all results into memory:
202
+
203
+ ```python
204
+ # ❌ Memory intensive - loads all results
205
+ all_tasks = list(client._list('api/tasks/', list_all=True)[0])
206
+
207
+ # ✅ Memory efficient - processes one at a time
208
+ generator, _ = client._list('api/tasks/', list_all=True)
209
+ for task in generator:
210
+ process_task(task)
211
+ # Task is processed and can be garbage collected
212
+ ```
213
+
214
+ ### Pagination Best Practices
215
+
216
+ 1. **Use list_all=True** for datasets larger than one page
217
+ 2. **Set appropriate page_size** in params if default (100) isn't optimal
218
+ 3. **Use url_conversion** only when you need to process files
219
+ 4. **Consider async downloads** for multiple files per item
220
+
221
+ ```python
222
+ # Optimal pagination for large dataset
223
+ params = {'page_size': 50} # Smaller pages for faster first response
224
+ generator, total = client._list(
225
+ 'api/large_dataset/',
226
+ list_all=True,
227
+ params=params
228
+ )
229
+
230
+ # Process with progress tracking
231
+ from tqdm import tqdm
232
+ for item in tqdm(generator, total=total):
233
+ process_item(item)
234
+ ```
235
+
236
+ ## Usage in Client Mixins
237
+
238
+ The BaseClient pagination methods are used internally by all client mixins:
239
+
240
+ ```python
241
+ # DataCollectionClientMixin
242
+ def list_data_units(self, params=None, url_conversion=None, list_all=False):
243
+ return self._list('data_units/', params=params,
244
+ url_conversion=url_conversion, list_all=list_all)
245
+
246
+ # AnnotationClientMixin
247
+ def list_tasks(self, params=None, url_conversion=None, list_all=False):
248
+ return self._list('sdk/tasks/', params=params,
249
+ url_conversion=url_conversion, list_all=list_all)
250
+ ```
251
+
252
+ ## See Also
253
+
254
+ - [BackendClient](./backend.md) - Main client implementation
255
+ - [AgentClient](./agent.md) - Agent-specific operations
256
+ - [DataCollectionClientMixin](./data-collection-mixin.md) - Data and file operations
257
+ - [AnnotationClientMixin](./annotation-mixin.md) - Task and annotation management