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,385 @@
1
+ import asyncio
2
+ import operator
3
+ from functools import reduce
4
+ from pathlib import Path
5
+
6
+ import aiohttp
7
+ import requests
8
+
9
+ from synapse_sdk.utils.network import clean_url
10
+ from synapse_sdk.utils.string import hash_text
11
+
12
+ from .io import get_temp_path
13
+
14
+
15
+ def download_file(url, path_download, name=None, coerce=None, use_cached=True):
16
+ """Download a file from a URL to a specified directory.
17
+
18
+ This function downloads a file from a URL with support for caching, custom naming,
19
+ and optional path transformation. Downloads are streamed in chunks for memory efficiency.
20
+
21
+ Args:
22
+ url (str): The URL to download from. Query parameters and fragments are cleaned
23
+ before generating the cached filename.
24
+ path_download (str | Path): Directory path where the file will be saved.
25
+ name (str, optional): Custom filename for the downloaded file (without extension).
26
+ If provided, caching is disabled. If None, a hash of the URL is used as the name.
27
+ coerce (callable, optional): A function to transform the downloaded file path.
28
+ Called with the Path object after download completes.
29
+ Example: lambda p: str(p) to convert Path to string
30
+ use_cached (bool): If True (default), skip download if file already exists.
31
+ Automatically set to False when a custom name is provided.
32
+
33
+ Returns:
34
+ Path | Any: Path object pointing to the downloaded file, or the result of
35
+ coerce(path) if a coerce function was provided.
36
+
37
+ Raises:
38
+ requests.HTTPError: If the HTTP request fails (e.g., 404, 500 errors).
39
+ IOError: If file write fails due to permissions or disk space.
40
+
41
+ Examples:
42
+ Basic download with caching:
43
+ >>> path = download_file('https://example.com/image.jpg', '/tmp/downloads')
44
+ >>> print(path) # /tmp/downloads/abc123def456.jpg (hash-based name)
45
+
46
+ Custom filename without caching:
47
+ >>> path = download_file(
48
+ ... 'https://example.com/data.json',
49
+ ... '/tmp/downloads',
50
+ ... name='my_data'
51
+ ... )
52
+ >>> print(path) # /tmp/downloads/my_data.json
53
+
54
+ With path coercion to string:
55
+ >>> path_str = download_file(
56
+ ... 'https://example.com/file.txt',
57
+ ... '/tmp',
58
+ ... coerce=str
59
+ ... )
60
+ >>> print(type(path_str)) # <class 'str'>
61
+
62
+ Note:
63
+ - Downloads are streamed in 50MB chunks for memory efficiency
64
+ - URL is cleaned (query params removed) before generating cached filename
65
+ - File extension is preserved from the cleaned URL
66
+ - Existing files are reused when use_cached=True
67
+ """
68
+ chunk_size = 1024 * 1024 * 50
69
+ cleaned_url = clean_url(url) # remove query params and fragment
70
+
71
+ if name:
72
+ use_cached = False
73
+ else:
74
+ name = hash_text(cleaned_url)
75
+
76
+ name += Path(cleaned_url).suffix
77
+
78
+ path = Path(path_download) / name
79
+
80
+ if not use_cached or not path.is_file():
81
+ response = requests.get(url, allow_redirects=True, stream=True)
82
+ response.raise_for_status()
83
+
84
+ with path.open('wb') as file:
85
+ for chunk in response.iter_content(chunk_size=chunk_size):
86
+ file.write(chunk)
87
+
88
+ if coerce:
89
+ path = coerce(path)
90
+
91
+ return path
92
+
93
+
94
+ def files_url_to_path(files, coerce=None, file_field=None):
95
+ """Convert file URLs to local file paths by downloading them.
96
+
97
+ This function downloads files from URLs and replaces the URLs with local paths
98
+ in the provided dictionary. Supports both flat dictionaries and nested structures.
99
+
100
+ Args:
101
+ files (dict): Dictionary containing file URLs or file objects.
102
+ - If values are strings: treated as URLs and replaced with local paths
103
+ - If values are dicts with 'url' key: 'url' is replaced with 'path'
104
+ coerce (callable, optional): Function to transform downloaded paths.
105
+ Applied to each downloaded file path.
106
+ file_field (str, optional): Specific field name to process. If provided,
107
+ only this field is processed. If None, all fields are processed.
108
+
109
+ Returns:
110
+ None: Modifies the files dictionary in-place.
111
+
112
+ Examples:
113
+ Simple URL replacement:
114
+ >>> files = {'image': 'https://example.com/img.jpg'}
115
+ >>> files_url_to_path(files)
116
+ >>> print(files['image']) # Path('/tmp/media/abc123.jpg')
117
+
118
+ With nested objects:
119
+ >>> files = {'video': {'url': 'https://example.com/vid.mp4', 'size': 1024}}
120
+ >>> files_url_to_path(files)
121
+ >>> print(files['video']) # {'path': Path('/tmp/media/def456.mp4'), 'size': 1024}
122
+
123
+ Process specific field only:
124
+ >>> files = {'image': 'https://ex.com/a.jpg', 'doc': 'https://ex.com/b.pdf'}
125
+ >>> files_url_to_path(files, file_field='image')
126
+ >>> # Only 'image' is downloaded, 'doc' remains as URL
127
+
128
+ With path coercion:
129
+ >>> files = {'data': 'https://example.com/data.csv'}
130
+ >>> files_url_to_path(files, coerce=str)
131
+ >>> print(type(files['data'])) # <class 'str'>
132
+
133
+ Note:
134
+ - Downloads to temporary media directory: get_temp_path('media')
135
+ - Creates download directory if it doesn't exist
136
+ - Modifies input dictionary in-place
137
+ - Uses caching by default (via download_file)
138
+ """
139
+ path_download = get_temp_path('media')
140
+ path_download.mkdir(parents=True, exist_ok=True)
141
+ if file_field:
142
+ files[file_field] = download_file(files[file_field], path_download, coerce=coerce)
143
+ else:
144
+ for file_name in files:
145
+ if isinstance(files[file_name], str):
146
+ files[file_name] = download_file(files[file_name], path_download, coerce=coerce)
147
+ else:
148
+ files[file_name]['path'] = download_file(files[file_name].pop('url'), path_download, coerce=coerce)
149
+
150
+
151
+ def files_url_to_path_from_objs(objs, files_fields, coerce=None, is_list=False, is_async=False):
152
+ """Convert file URLs to paths for multiple objects with nested field support.
153
+
154
+ This function processes one or more objects, extracting file URLs from specified
155
+ nested fields and replacing them with local file paths. Supports both synchronous
156
+ and asynchronous operation.
157
+
158
+ Args:
159
+ objs (dict | list): Single object or list of objects to process.
160
+ If is_list=False, can be a single dict.
161
+ If is_list=True, should be a list of dicts.
162
+ files_fields (list[str]): List of field paths to process.
163
+ Supports dot notation for nested fields (e.g., 'data.files', 'meta.image').
164
+ coerce (callable, optional): Function to transform downloaded paths.
165
+ is_list (bool): If True, objs is treated as a list. If False, objs is wrapped
166
+ in a list for processing. Default False.
167
+ is_async (bool): If True, uses async download (afiles_url_to_path_from_objs).
168
+ If False, uses synchronous download. Default False.
169
+
170
+ Returns:
171
+ None: Modifies objects in-place, replacing URLs with local paths.
172
+
173
+ Examples:
174
+ Single object with simple field:
175
+ >>> obj = {'files': {'image': 'https://example.com/img.jpg'}}
176
+ >>> files_url_to_path_from_objs(obj, files_fields=['files'])
177
+ >>> print(obj['files']['image']) # Path('/tmp/media/abc123.jpg')
178
+
179
+ Multiple objects with nested fields:
180
+ >>> objs = [
181
+ ... {'data': {'files': {'img': 'https://ex.com/1.jpg'}}},
182
+ ... {'data': {'files': {'img': 'https://ex.com/2.jpg'}}}
183
+ ... ]
184
+ >>> files_url_to_path_from_objs(objs, files_fields=['data.files'], is_list=True)
185
+ >>> # Both images are downloaded and URLs replaced with paths
186
+
187
+ Async download for better performance:
188
+ >>> objs = [{'files': {'a': 'url1', 'b': 'url2'}} for _ in range(10)]
189
+ >>> files_url_to_path_from_objs(
190
+ ... objs,
191
+ ... files_fields=['files'],
192
+ ... is_list=True,
193
+ ... is_async=True
194
+ ... )
195
+ >>> # All files downloaded concurrently
196
+
197
+ Multiple field paths:
198
+ >>> obj = {
199
+ ... 'images': {'photo': 'https://ex.com/photo.jpg'},
200
+ ... 'videos': {'clip': 'https://ex.com/video.mp4'}
201
+ ... }
202
+ >>> files_url_to_path_from_objs(obj, files_fields=['images', 'videos'])
203
+ >>> # Both images and videos fields are processed
204
+
205
+ Note:
206
+ - Silently skips missing fields (KeyError is caught and ignored)
207
+ - Supports dot notation for nested field access
208
+ - Async mode (is_async=True) provides better performance for multiple files
209
+ - Commonly used with API responses containing file URLs
210
+ - Used by BaseClient._list() with url_conversion parameter
211
+ """
212
+ if is_async:
213
+ asyncio.run(afiles_url_to_path_from_objs(objs, files_fields, coerce=coerce, is_list=is_list))
214
+ else:
215
+ if not is_list:
216
+ objs = [objs]
217
+
218
+ for obj in objs:
219
+ for files_field in files_fields:
220
+ try:
221
+ files = reduce(operator.getitem, files_field.split('.'), obj)
222
+ if isinstance(files, str):
223
+ files_url_to_path(obj, coerce=coerce, file_field=files_field)
224
+ else:
225
+ files_url_to_path(files, coerce=coerce)
226
+ except KeyError:
227
+ pass
228
+
229
+
230
+ async def adownload_file(url, path_download, name=None, coerce=None, use_cached=True):
231
+ """Asynchronously download a file from a URL to a specified directory.
232
+
233
+ Async version of download_file() using aiohttp for concurrent downloads.
234
+ All parameters and behavior are identical to download_file().
235
+
236
+ Args:
237
+ url (str): The URL to download from.
238
+ path_download (str | Path): Directory path where the file will be saved.
239
+ name (str, optional): Custom filename (without extension).
240
+ coerce (callable, optional): Function to transform the downloaded file path.
241
+ use_cached (bool): If True (default), skip download if file exists.
242
+
243
+ Returns:
244
+ Path | Any: Path to downloaded file, or coerce(path) if provided.
245
+
246
+ Examples:
247
+ Basic async download:
248
+ >>> path = await adownload_file('https://example.com/large.zip', '/tmp')
249
+
250
+ Multiple concurrent downloads:
251
+ >>> urls = ['https://ex.com/1.jpg', 'https://ex.com/2.jpg']
252
+ >>> paths = await asyncio.gather(*[
253
+ ... adownload_file(url, '/tmp') for url in urls
254
+ ... ])
255
+
256
+ Note:
257
+ - Uses aiohttp.ClientSession for async HTTP requests
258
+ - Downloads in 50MB chunks for memory efficiency
259
+ - Recommended for downloading multiple files concurrently
260
+ """
261
+ chunk_size = 1024 * 1024 * 50
262
+ cleaned_url = clean_url(url) # remove query params and fragment
263
+
264
+ if name:
265
+ use_cached = False
266
+ else:
267
+ name = hash_text(cleaned_url)
268
+
269
+ name += Path(cleaned_url).suffix
270
+
271
+ path = Path(path_download) / name
272
+
273
+ if not use_cached or not path.is_file():
274
+ async with aiohttp.ClientSession() as session:
275
+ async with session.get(url) as response:
276
+ with path.open('wb') as file:
277
+ while chunk := await response.content.read(chunk_size):
278
+ file.write(chunk)
279
+
280
+ if coerce:
281
+ path = coerce(path)
282
+
283
+ return path
284
+
285
+
286
+ async def afiles_url_to_path(files, coerce=None):
287
+ """Asynchronously convert file URLs to local paths by downloading them.
288
+
289
+ Async version of files_url_to_path() for concurrent file downloads.
290
+ Processes all files in the dictionary concurrently for better performance.
291
+
292
+ Args:
293
+ files (dict): Dictionary containing file URLs or file objects.
294
+ coerce (callable, optional): Function to transform downloaded paths.
295
+
296
+ Returns:
297
+ None: Modifies the files dictionary in-place.
298
+
299
+ Examples:
300
+ Download multiple files concurrently:
301
+ >>> files = {
302
+ ... 'image1': 'https://ex.com/1.jpg',
303
+ ... 'image2': 'https://ex.com/2.jpg',
304
+ ... 'image3': 'https://ex.com/3.jpg'
305
+ ... }
306
+ >>> await afiles_url_to_path(files)
307
+ >>> # All 3 files downloaded concurrently
308
+
309
+ With nested file objects:
310
+ >>> files = {
311
+ ... 'thumb': {'url': 'https://ex.com/thumb.jpg'},
312
+ ... 'full': {'url': 'https://ex.com/full.jpg'}
313
+ ... }
314
+ >>> await afiles_url_to_path(files)
315
+ >>> print(files['thumb']['path']) # Path object
316
+
317
+ Note:
318
+ - All files are downloaded concurrently using asyncio
319
+ - More efficient than synchronous version for multiple files
320
+ - Does not support file_field parameter (processes all fields)
321
+ """
322
+ path_download = get_temp_path('media')
323
+ path_download.mkdir(parents=True, exist_ok=True)
324
+ for file_name in files:
325
+ if isinstance(files[file_name], str):
326
+ files[file_name] = await adownload_file(files[file_name], path_download, coerce=coerce)
327
+ else:
328
+ files[file_name]['path'] = await adownload_file(files[file_name].pop('url'), path_download, coerce=coerce)
329
+
330
+
331
+ async def afiles_url_to_path_from_objs(objs, files_fields, coerce=None, is_list=False):
332
+ """Asynchronously convert file URLs to paths for multiple objects.
333
+
334
+ Async version of files_url_to_path_from_objs() that downloads all files
335
+ concurrently using asyncio.gather() for maximum performance.
336
+
337
+ Args:
338
+ objs (dict | list): Single object or list of objects to process.
339
+ files_fields (list[str]): List of field paths to process (supports dot notation).
340
+ coerce (callable, optional): Function to transform downloaded paths.
341
+ is_list (bool): If True, objs is treated as a list. Default False.
342
+
343
+ Returns:
344
+ None: Modifies objects in-place, replacing URLs with local paths.
345
+
346
+ Examples:
347
+ Download files from multiple objects concurrently:
348
+ >>> objs = [
349
+ ... {'files': {'img': 'https://ex.com/1.jpg'}},
350
+ ... {'files': {'img': 'https://ex.com/2.jpg'}},
351
+ ... {'files': {'img': 'https://ex.com/3.jpg'}}
352
+ ... ]
353
+ >>> await afiles_url_to_path_from_objs(objs, ['files'], is_list=True)
354
+ >>> # All 3 images downloaded concurrently
355
+
356
+ Process large dataset efficiently:
357
+ >>> # 100 objects with multiple files each
358
+ >>> objs = [{'data': {'files': {...}}} for _ in range(100)]
359
+ >>> await afiles_url_to_path_from_objs(
360
+ ... objs,
361
+ ... files_fields=['data.files'],
362
+ ... is_list=True
363
+ ... )
364
+ >>> # All files downloaded in parallel, much faster than sync version
365
+
366
+ Note:
367
+ - All file downloads happen concurrently using asyncio.gather()
368
+ - Significantly faster than synchronous version for large datasets
369
+ - Ideal for processing API responses with many file URLs
370
+ - Used internally when is_async=True in files_url_to_path_from_objs()
371
+ """
372
+ if not is_list:
373
+ objs = [objs]
374
+
375
+ tasks = []
376
+
377
+ for obj in objs:
378
+ for files_field in files_fields:
379
+ try:
380
+ files = reduce(operator.getitem, files_field.split('.'), obj)
381
+ tasks.append(afiles_url_to_path(files, coerce=coerce))
382
+ except KeyError:
383
+ pass
384
+
385
+ await asyncio.gather(*tasks)
@@ -0,0 +1,40 @@
1
+ import base64
2
+ import mimetypes
3
+ from pathlib import Path
4
+
5
+
6
+ def convert_file_to_base64(file_path):
7
+ """
8
+ Convert a file to base64 using pathlib.
9
+
10
+ Args:
11
+ file_path (str): Path to the file to convert
12
+
13
+ Returns:
14
+ str: Base64 encoded string of the file contents
15
+ """
16
+ # FIXME base64 is sent sometimes.
17
+ if file_path.startswith('data:'):
18
+ return file_path
19
+
20
+ # Convert string path to Path object
21
+ path = Path(file_path)
22
+
23
+ try:
24
+ # Read binary content of the file
25
+ binary_content = path.read_bytes()
26
+
27
+ # Convert to base64
28
+ base64_encoded = base64.b64encode(binary_content).decode('utf-8')
29
+
30
+ # Get the MIME type of the file
31
+ mime_type, _ = mimetypes.guess_type(path)
32
+ assert mime_type is not None, 'MIME type cannot be guessed'
33
+
34
+ # Convert bytes to string for readable output
35
+ return f'data:{mime_type};base64,{base64_encoded}'
36
+
37
+ except FileNotFoundError:
38
+ raise FileNotFoundError(f'File not found: {file_path}')
39
+ except Exception as e:
40
+ raise Exception(f'Error converting file to base64: {str(e)}')
@@ -0,0 +1,22 @@
1
+ import json
2
+ from pathlib import Path
3
+
4
+ import yaml
5
+
6
+
7
+ def get_dict_from_file(file_path):
8
+ if isinstance(file_path, str):
9
+ file_path = Path(file_path)
10
+
11
+ with open(file_path) as f:
12
+ if file_path.suffix == '.yaml':
13
+ return yaml.safe_load(f)
14
+ else:
15
+ return json.load(f)
16
+
17
+
18
+ def get_temp_path(sub_path=None):
19
+ path = Path('/tmp/datamaker')
20
+ if sub_path:
21
+ path = path / sub_path
22
+ return path
@@ -0,0 +1,29 @@
1
+ # Video processing utilities
2
+
3
+ from .transcode import (
4
+ FFmpegNotFoundError,
5
+ TranscodeConfig,
6
+ TranscodingFailedError,
7
+ UnsupportedFormatError,
8
+ VideoTranscodeError,
9
+ atranscode_video,
10
+ get_video_info,
11
+ optimize_for_web,
12
+ transcode_batch,
13
+ transcode_video,
14
+ validate_video_format,
15
+ )
16
+
17
+ __all__ = [
18
+ 'TranscodeConfig',
19
+ 'VideoTranscodeError',
20
+ 'UnsupportedFormatError',
21
+ 'FFmpegNotFoundError',
22
+ 'TranscodingFailedError',
23
+ 'transcode_video',
24
+ 'atranscode_video',
25
+ 'get_video_info',
26
+ 'validate_video_format',
27
+ 'optimize_for_web',
28
+ 'transcode_batch',
29
+ ]