synapse-sdk 1.0.0a13__py3-none-any.whl → 2025.11.7__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of synapse-sdk might be problematic. Click here for more details.

Files changed (339) hide show
  1. synapse_sdk/__init__.py +24 -0
  2. synapse_sdk/cli/__init__.py +310 -5
  3. synapse_sdk/cli/alias/__init__.py +22 -0
  4. synapse_sdk/cli/alias/create.py +36 -0
  5. synapse_sdk/cli/alias/dataclass.py +31 -0
  6. synapse_sdk/cli/alias/default.py +16 -0
  7. synapse_sdk/cli/alias/delete.py +15 -0
  8. synapse_sdk/cli/alias/list.py +19 -0
  9. synapse_sdk/cli/alias/read.py +15 -0
  10. synapse_sdk/cli/alias/update.py +17 -0
  11. synapse_sdk/cli/alias/utils.py +61 -0
  12. synapse_sdk/cli/code_server.py +687 -0
  13. synapse_sdk/cli/config.py +440 -0
  14. synapse_sdk/cli/devtools.py +90 -0
  15. synapse_sdk/cli/plugin/__init__.py +33 -0
  16. synapse_sdk/cli/{create_plugin.py → plugin/create.py} +2 -2
  17. synapse_sdk/cli/plugin/publish.py +45 -0
  18. synapse_sdk/{plugins/cli → cli/plugin}/run.py +12 -5
  19. synapse_sdk/clients/agent/__init__.py +9 -3
  20. synapse_sdk/clients/agent/container.py +133 -0
  21. synapse_sdk/clients/agent/core.py +19 -0
  22. synapse_sdk/clients/agent/ray.py +298 -9
  23. synapse_sdk/clients/backend/__init__.py +41 -12
  24. synapse_sdk/clients/backend/annotation.py +13 -5
  25. synapse_sdk/clients/backend/core.py +59 -0
  26. synapse_sdk/clients/backend/data_collection.py +186 -0
  27. synapse_sdk/clients/backend/hitl.py +17 -0
  28. synapse_sdk/clients/backend/integration.py +19 -4
  29. synapse_sdk/clients/backend/ml.py +10 -7
  30. synapse_sdk/clients/backend/models.py +78 -0
  31. synapse_sdk/clients/base.py +381 -34
  32. synapse_sdk/clients/ray/serve.py +2 -0
  33. synapse_sdk/clients/validators/collections.py +31 -0
  34. synapse_sdk/devtools/config.py +94 -0
  35. synapse_sdk/devtools/docs/.gitignore +20 -0
  36. synapse_sdk/devtools/docs/README.md +41 -0
  37. synapse_sdk/devtools/docs/blog/2019-05-28-first-blog-post.md +12 -0
  38. synapse_sdk/devtools/docs/blog/2019-05-29-long-blog-post.md +44 -0
  39. synapse_sdk/devtools/docs/blog/2021-08-01-mdx-blog-post.mdx +24 -0
  40. synapse_sdk/devtools/docs/blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg +0 -0
  41. synapse_sdk/devtools/docs/blog/2021-08-26-welcome/index.md +29 -0
  42. synapse_sdk/devtools/docs/blog/authors.yml +25 -0
  43. synapse_sdk/devtools/docs/blog/tags.yml +19 -0
  44. synapse_sdk/devtools/docs/docs/api/clients/agent.md +43 -0
  45. synapse_sdk/devtools/docs/docs/api/clients/annotation-mixin.md +378 -0
  46. synapse_sdk/devtools/docs/docs/api/clients/backend.md +420 -0
  47. synapse_sdk/devtools/docs/docs/api/clients/base.md +257 -0
  48. synapse_sdk/devtools/docs/docs/api/clients/core-mixin.md +477 -0
  49. synapse_sdk/devtools/docs/docs/api/clients/data-collection-mixin.md +422 -0
  50. synapse_sdk/devtools/docs/docs/api/clients/hitl-mixin.md +554 -0
  51. synapse_sdk/devtools/docs/docs/api/clients/index.md +391 -0
  52. synapse_sdk/devtools/docs/docs/api/clients/integration-mixin.md +571 -0
  53. synapse_sdk/devtools/docs/docs/api/clients/ml-mixin.md +578 -0
  54. synapse_sdk/devtools/docs/docs/api/clients/ray.md +342 -0
  55. synapse_sdk/devtools/docs/docs/api/index.md +52 -0
  56. synapse_sdk/devtools/docs/docs/api/plugins/categories.md +43 -0
  57. synapse_sdk/devtools/docs/docs/api/plugins/models.md +114 -0
  58. synapse_sdk/devtools/docs/docs/api/plugins/utils.md +328 -0
  59. synapse_sdk/devtools/docs/docs/categories.md +0 -0
  60. synapse_sdk/devtools/docs/docs/cli-usage.md +280 -0
  61. synapse_sdk/devtools/docs/docs/concepts/index.md +38 -0
  62. synapse_sdk/devtools/docs/docs/configuration.md +83 -0
  63. synapse_sdk/devtools/docs/docs/contributing.md +306 -0
  64. synapse_sdk/devtools/docs/docs/examples/index.md +29 -0
  65. synapse_sdk/devtools/docs/docs/faq.md +179 -0
  66. synapse_sdk/devtools/docs/docs/features/converters/index.md +455 -0
  67. synapse_sdk/devtools/docs/docs/features/index.md +24 -0
  68. synapse_sdk/devtools/docs/docs/features/utils/file.md +415 -0
  69. synapse_sdk/devtools/docs/docs/features/utils/network.md +378 -0
  70. synapse_sdk/devtools/docs/docs/features/utils/storage.md +57 -0
  71. synapse_sdk/devtools/docs/docs/features/utils/types.md +51 -0
  72. synapse_sdk/devtools/docs/docs/installation.md +94 -0
  73. synapse_sdk/devtools/docs/docs/introduction.md +47 -0
  74. synapse_sdk/devtools/docs/docs/plugins/categories/neural-net-plugins/train-action-overview.md +814 -0
  75. synapse_sdk/devtools/docs/docs/plugins/categories/pre-annotation-plugins/pre-annotation-plugin-overview.md +198 -0
  76. synapse_sdk/devtools/docs/docs/plugins/categories/pre-annotation-plugins/to-task-action-development.md +1645 -0
  77. synapse_sdk/devtools/docs/docs/plugins/categories/pre-annotation-plugins/to-task-overview.md +717 -0
  78. synapse_sdk/devtools/docs/docs/plugins/categories/pre-annotation-plugins/to-task-template-development.md +1380 -0
  79. synapse_sdk/devtools/docs/docs/plugins/categories/upload-plugins/upload-plugin-action.md +948 -0
  80. synapse_sdk/devtools/docs/docs/plugins/categories/upload-plugins/upload-plugin-overview.md +544 -0
  81. synapse_sdk/devtools/docs/docs/plugins/categories/upload-plugins/upload-plugin-template.md +766 -0
  82. synapse_sdk/devtools/docs/docs/plugins/export-plugins.md +1092 -0
  83. synapse_sdk/devtools/docs/docs/plugins/plugins.md +852 -0
  84. synapse_sdk/devtools/docs/docs/quickstart.md +78 -0
  85. synapse_sdk/devtools/docs/docs/troubleshooting.md +519 -0
  86. synapse_sdk/devtools/docs/docs/tutorial-basics/_category_.json +8 -0
  87. synapse_sdk/devtools/docs/docs/tutorial-basics/congratulations.md +23 -0
  88. synapse_sdk/devtools/docs/docs/tutorial-basics/create-a-blog-post.md +34 -0
  89. synapse_sdk/devtools/docs/docs/tutorial-basics/create-a-document.md +57 -0
  90. synapse_sdk/devtools/docs/docs/tutorial-basics/create-a-page.md +43 -0
  91. synapse_sdk/devtools/docs/docs/tutorial-basics/deploy-your-site.md +31 -0
  92. synapse_sdk/devtools/docs/docs/tutorial-basics/markdown-features.mdx +152 -0
  93. synapse_sdk/devtools/docs/docs/tutorial-extras/_category_.json +7 -0
  94. synapse_sdk/devtools/docs/docs/tutorial-extras/img/docsVersionDropdown.png +0 -0
  95. synapse_sdk/devtools/docs/docs/tutorial-extras/img/localeDropdown.png +0 -0
  96. synapse_sdk/devtools/docs/docs/tutorial-extras/manage-docs-versions.md +55 -0
  97. synapse_sdk/devtools/docs/docs/tutorial-extras/translate-your-site.md +88 -0
  98. synapse_sdk/devtools/docs/docusaurus.config.ts +148 -0
  99. synapse_sdk/devtools/docs/i18n/ko/code.json +325 -0
  100. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/agent.md +43 -0
  101. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/annotation-mixin.md +289 -0
  102. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/backend.md +420 -0
  103. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/base.md +257 -0
  104. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/core-mixin.md +417 -0
  105. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/data-collection-mixin.md +356 -0
  106. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/hitl-mixin.md +192 -0
  107. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/index.md +391 -0
  108. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/integration-mixin.md +479 -0
  109. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/ml-mixin.md +284 -0
  110. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/ray.md +342 -0
  111. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/index.md +52 -0
  112. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/plugins/models.md +114 -0
  113. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/categories.md +0 -0
  114. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/cli-usage.md +280 -0
  115. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/concepts/index.md +38 -0
  116. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/configuration.md +83 -0
  117. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/contributing.md +306 -0
  118. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/examples/index.md +29 -0
  119. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/faq.md +179 -0
  120. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/converters/index.md +30 -0
  121. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/index.md +24 -0
  122. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/utils/file.md +415 -0
  123. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/utils/network.md +378 -0
  124. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/utils/storage.md +60 -0
  125. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/utils/types.md +51 -0
  126. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/installation.md +94 -0
  127. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/introduction.md +47 -0
  128. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/neural-net-plugins/train-action-overview.md +815 -0
  129. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/pre-annotation-plugins/pre-annotation-plugin-overview.md +198 -0
  130. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/pre-annotation-plugins/to-task-action-development.md +1645 -0
  131. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/pre-annotation-plugins/to-task-overview.md +717 -0
  132. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/pre-annotation-plugins/to-task-template-development.md +1380 -0
  133. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/upload-plugins/upload-plugin-action.md +948 -0
  134. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/upload-plugins/upload-plugin-overview.md +544 -0
  135. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/upload-plugins/upload-plugin-template.md +766 -0
  136. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/export-plugins.md +1092 -0
  137. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/plugins.md +117 -0
  138. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/quickstart.md +78 -0
  139. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/troubleshooting.md +519 -0
  140. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current.json +34 -0
  141. synapse_sdk/devtools/docs/i18n/ko/docusaurus-theme-classic/footer.json +42 -0
  142. synapse_sdk/devtools/docs/i18n/ko/docusaurus-theme-classic/navbar.json +18 -0
  143. synapse_sdk/devtools/docs/package-lock.json +18784 -0
  144. synapse_sdk/devtools/docs/package.json +48 -0
  145. synapse_sdk/devtools/docs/sidebars.ts +122 -0
  146. synapse_sdk/devtools/docs/src/components/HomepageFeatures/index.tsx +71 -0
  147. synapse_sdk/devtools/docs/src/components/HomepageFeatures/styles.module.css +11 -0
  148. synapse_sdk/devtools/docs/src/css/custom.css +30 -0
  149. synapse_sdk/devtools/docs/src/pages/index.module.css +23 -0
  150. synapse_sdk/devtools/docs/src/pages/index.tsx +21 -0
  151. synapse_sdk/devtools/docs/src/pages/markdown-page.md +7 -0
  152. synapse_sdk/devtools/docs/static/.nojekyll +0 -0
  153. synapse_sdk/devtools/docs/static/img/docusaurus-social-card.jpg +0 -0
  154. synapse_sdk/devtools/docs/static/img/docusaurus.png +0 -0
  155. synapse_sdk/devtools/docs/static/img/favicon.ico +0 -0
  156. synapse_sdk/devtools/docs/static/img/logo.png +0 -0
  157. synapse_sdk/devtools/docs/static/img/undraw_docusaurus_mountain.svg +171 -0
  158. synapse_sdk/devtools/docs/static/img/undraw_docusaurus_react.svg +170 -0
  159. synapse_sdk/devtools/docs/static/img/undraw_docusaurus_tree.svg +40 -0
  160. synapse_sdk/devtools/docs/tsconfig.json +8 -0
  161. synapse_sdk/devtools/server.py +41 -0
  162. synapse_sdk/devtools/streamlit_app/__init__.py +5 -0
  163. synapse_sdk/devtools/streamlit_app/app.py +128 -0
  164. synapse_sdk/devtools/streamlit_app/services/__init__.py +11 -0
  165. synapse_sdk/devtools/streamlit_app/services/job_service.py +233 -0
  166. synapse_sdk/devtools/streamlit_app/services/plugin_service.py +236 -0
  167. synapse_sdk/devtools/streamlit_app/services/serve_service.py +95 -0
  168. synapse_sdk/devtools/streamlit_app/ui/__init__.py +15 -0
  169. synapse_sdk/devtools/streamlit_app/ui/config_tab.py +76 -0
  170. synapse_sdk/devtools/streamlit_app/ui/deployment_tab.py +66 -0
  171. synapse_sdk/devtools/streamlit_app/ui/http_tab.py +125 -0
  172. synapse_sdk/devtools/streamlit_app/ui/jobs_tab.py +573 -0
  173. synapse_sdk/devtools/streamlit_app/ui/serve_tab.py +346 -0
  174. synapse_sdk/devtools/streamlit_app/ui/status_bar.py +118 -0
  175. synapse_sdk/devtools/streamlit_app/utils/__init__.py +40 -0
  176. synapse_sdk/devtools/streamlit_app/utils/json_viewer.py +197 -0
  177. synapse_sdk/devtools/streamlit_app/utils/log_formatter.py +38 -0
  178. synapse_sdk/devtools/streamlit_app/utils/styles.py +241 -0
  179. synapse_sdk/devtools/streamlit_app/utils/ui_components.py +289 -0
  180. synapse_sdk/devtools/streamlit_app.py +10 -0
  181. synapse_sdk/loggers.py +74 -9
  182. synapse_sdk/plugins/README.md +1340 -0
  183. synapse_sdk/plugins/__init__.py +0 -13
  184. synapse_sdk/plugins/categories/base.py +145 -30
  185. synapse_sdk/plugins/categories/data_validation/actions/validation.py +72 -0
  186. synapse_sdk/plugins/categories/data_validation/templates/plugin/validation.py +33 -5
  187. synapse_sdk/plugins/categories/export/actions/__init__.py +3 -0
  188. synapse_sdk/plugins/categories/export/actions/export/__init__.py +28 -0
  189. synapse_sdk/plugins/categories/export/actions/export/action.py +165 -0
  190. synapse_sdk/plugins/categories/export/actions/export/enums.py +113 -0
  191. synapse_sdk/plugins/categories/export/actions/export/exceptions.py +53 -0
  192. synapse_sdk/plugins/categories/export/actions/export/models.py +74 -0
  193. synapse_sdk/plugins/categories/export/actions/export/run.py +195 -0
  194. synapse_sdk/plugins/categories/export/actions/export/utils.py +187 -0
  195. synapse_sdk/plugins/categories/export/templates/config.yaml +21 -0
  196. synapse_sdk/plugins/categories/export/templates/plugin/__init__.py +390 -0
  197. synapse_sdk/plugins/categories/export/templates/plugin/export.py +160 -0
  198. synapse_sdk/plugins/categories/neural_net/actions/deployment.py +29 -14
  199. synapse_sdk/plugins/categories/neural_net/actions/inference.py +13 -1
  200. synapse_sdk/plugins/categories/neural_net/actions/train.py +1084 -38
  201. synapse_sdk/plugins/categories/neural_net/actions/tune.py +534 -0
  202. synapse_sdk/plugins/categories/neural_net/base/__init__.py +0 -0
  203. synapse_sdk/plugins/categories/neural_net/base/inference.py +37 -0
  204. synapse_sdk/plugins/categories/neural_net/templates/config.yaml +30 -5
  205. synapse_sdk/plugins/categories/neural_net/templates/plugin/inference.py +26 -10
  206. synapse_sdk/plugins/categories/pre_annotation/actions/__init__.py +4 -0
  207. synapse_sdk/plugins/categories/pre_annotation/actions/pre_annotation/__init__.py +3 -0
  208. synapse_sdk/plugins/categories/{export/actions/export.py → pre_annotation/actions/pre_annotation/action.py} +4 -4
  209. synapse_sdk/plugins/categories/pre_annotation/actions/to_task/__init__.py +28 -0
  210. synapse_sdk/plugins/categories/pre_annotation/actions/to_task/action.py +145 -0
  211. synapse_sdk/plugins/categories/pre_annotation/actions/to_task/enums.py +269 -0
  212. synapse_sdk/plugins/categories/pre_annotation/actions/to_task/exceptions.py +14 -0
  213. synapse_sdk/plugins/categories/pre_annotation/actions/to_task/factory.py +76 -0
  214. synapse_sdk/plugins/categories/pre_annotation/actions/to_task/models.py +97 -0
  215. synapse_sdk/plugins/categories/pre_annotation/actions/to_task/orchestrator.py +250 -0
  216. synapse_sdk/plugins/categories/pre_annotation/actions/to_task/run.py +64 -0
  217. synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/__init__.py +17 -0
  218. synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/annotation.py +287 -0
  219. synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/base.py +170 -0
  220. synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/extraction.py +83 -0
  221. synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/metrics.py +87 -0
  222. synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/preprocessor.py +127 -0
  223. synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/validation.py +143 -0
  224. synapse_sdk/plugins/categories/pre_annotation/actions/to_task.py +966 -0
  225. synapse_sdk/plugins/categories/pre_annotation/templates/config.yaml +19 -0
  226. synapse_sdk/plugins/categories/pre_annotation/templates/plugin/to_task.py +40 -0
  227. synapse_sdk/plugins/categories/smart_tool/templates/config.yaml +5 -2
  228. synapse_sdk/plugins/categories/upload/__init__.py +0 -0
  229. synapse_sdk/plugins/categories/upload/actions/__init__.py +0 -0
  230. synapse_sdk/plugins/categories/upload/actions/upload/__init__.py +19 -0
  231. synapse_sdk/plugins/categories/upload/actions/upload/action.py +232 -0
  232. synapse_sdk/plugins/categories/upload/actions/upload/context.py +185 -0
  233. synapse_sdk/plugins/categories/upload/actions/upload/enums.py +471 -0
  234. synapse_sdk/plugins/categories/upload/actions/upload/exceptions.py +36 -0
  235. synapse_sdk/plugins/categories/upload/actions/upload/factory.py +138 -0
  236. synapse_sdk/plugins/categories/upload/actions/upload/models.py +203 -0
  237. synapse_sdk/plugins/categories/upload/actions/upload/orchestrator.py +183 -0
  238. synapse_sdk/plugins/categories/upload/actions/upload/registry.py +113 -0
  239. synapse_sdk/plugins/categories/upload/actions/upload/run.py +179 -0
  240. synapse_sdk/plugins/categories/upload/actions/upload/steps/__init__.py +1 -0
  241. synapse_sdk/plugins/categories/upload/actions/upload/steps/base.py +107 -0
  242. synapse_sdk/plugins/categories/upload/actions/upload/steps/cleanup.py +62 -0
  243. synapse_sdk/plugins/categories/upload/actions/upload/steps/collection.py +63 -0
  244. synapse_sdk/plugins/categories/upload/actions/upload/steps/generate.py +84 -0
  245. synapse_sdk/plugins/categories/upload/actions/upload/steps/initialize.py +82 -0
  246. synapse_sdk/plugins/categories/upload/actions/upload/steps/metadata.py +235 -0
  247. synapse_sdk/plugins/categories/upload/actions/upload/steps/organize.py +203 -0
  248. synapse_sdk/plugins/categories/upload/actions/upload/steps/upload.py +97 -0
  249. synapse_sdk/plugins/categories/upload/actions/upload/steps/validate.py +71 -0
  250. synapse_sdk/plugins/categories/upload/actions/upload/strategies/__init__.py +1 -0
  251. synapse_sdk/plugins/categories/upload/actions/upload/strategies/base.py +82 -0
  252. synapse_sdk/plugins/categories/upload/actions/upload/strategies/data_unit/__init__.py +1 -0
  253. synapse_sdk/plugins/categories/upload/actions/upload/strategies/data_unit/batch.py +39 -0
  254. synapse_sdk/plugins/categories/upload/actions/upload/strategies/data_unit/single.py +29 -0
  255. synapse_sdk/plugins/categories/upload/actions/upload/strategies/file_discovery/__init__.py +1 -0
  256. synapse_sdk/plugins/categories/upload/actions/upload/strategies/file_discovery/flat.py +258 -0
  257. synapse_sdk/plugins/categories/upload/actions/upload/strategies/file_discovery/recursive.py +281 -0
  258. synapse_sdk/plugins/categories/upload/actions/upload/strategies/metadata/__init__.py +1 -0
  259. synapse_sdk/plugins/categories/upload/actions/upload/strategies/metadata/excel.py +174 -0
  260. synapse_sdk/plugins/categories/upload/actions/upload/strategies/metadata/none.py +16 -0
  261. synapse_sdk/plugins/categories/upload/actions/upload/strategies/upload/__init__.py +1 -0
  262. synapse_sdk/plugins/categories/upload/actions/upload/strategies/upload/sync.py +84 -0
  263. synapse_sdk/plugins/categories/upload/actions/upload/strategies/validation/__init__.py +1 -0
  264. synapse_sdk/plugins/categories/upload/actions/upload/strategies/validation/default.py +60 -0
  265. synapse_sdk/plugins/categories/upload/actions/upload/utils.py +250 -0
  266. synapse_sdk/plugins/categories/upload/templates/README.md +470 -0
  267. synapse_sdk/plugins/categories/upload/templates/config.yaml +33 -0
  268. synapse_sdk/plugins/categories/upload/templates/plugin/__init__.py +294 -0
  269. synapse_sdk/plugins/categories/upload/templates/plugin/upload.py +102 -0
  270. synapse_sdk/plugins/enums.py +3 -1
  271. synapse_sdk/plugins/models.py +140 -16
  272. synapse_sdk/plugins/templates/plugin-config-schema.json +406 -0
  273. synapse_sdk/plugins/templates/schema.json +491 -0
  274. synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/config.yaml +1 -0
  275. synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/requirements.txt +1 -1
  276. synapse_sdk/plugins/utils/__init__.py +46 -0
  277. synapse_sdk/plugins/utils/actions.py +119 -0
  278. synapse_sdk/plugins/utils/config.py +203 -0
  279. synapse_sdk/plugins/utils/legacy.py +95 -0
  280. synapse_sdk/plugins/utils/ray_gcs.py +66 -0
  281. synapse_sdk/plugins/utils/registry.py +58 -0
  282. synapse_sdk/shared/__init__.py +25 -0
  283. synapse_sdk/shared/enums.py +93 -0
  284. synapse_sdk/types.py +19 -0
  285. synapse_sdk/utils/converters/__init__.py +240 -0
  286. synapse_sdk/utils/converters/coco/__init__.py +0 -0
  287. synapse_sdk/utils/converters/coco/from_dm.py +322 -0
  288. synapse_sdk/utils/converters/coco/to_dm.py +215 -0
  289. synapse_sdk/utils/converters/dm/__init__.py +56 -0
  290. synapse_sdk/utils/converters/dm/from_v1.py +627 -0
  291. synapse_sdk/utils/converters/dm/to_v1.py +367 -0
  292. synapse_sdk/utils/converters/pascal/__init__.py +0 -0
  293. synapse_sdk/utils/converters/pascal/from_dm.py +244 -0
  294. synapse_sdk/utils/converters/pascal/to_dm.py +214 -0
  295. synapse_sdk/utils/converters/yolo/__init__.py +0 -0
  296. synapse_sdk/utils/converters/yolo/from_dm.py +384 -0
  297. synapse_sdk/utils/converters/yolo/to_dm.py +267 -0
  298. synapse_sdk/utils/dataset.py +46 -0
  299. synapse_sdk/utils/encryption.py +158 -0
  300. synapse_sdk/utils/file/__init__.py +39 -0
  301. synapse_sdk/utils/file/archive.py +32 -0
  302. synapse_sdk/utils/file/checksum.py +56 -0
  303. synapse_sdk/utils/file/chunking.py +31 -0
  304. synapse_sdk/utils/file/download.py +385 -0
  305. synapse_sdk/utils/file/encoding.py +40 -0
  306. synapse_sdk/utils/file/io.py +22 -0
  307. synapse_sdk/utils/file/video/__init__.py +29 -0
  308. synapse_sdk/utils/file/video/transcode.py +307 -0
  309. synapse_sdk/utils/file.py.backup +301 -0
  310. synapse_sdk/utils/http.py +138 -0
  311. synapse_sdk/utils/network.py +309 -0
  312. synapse_sdk/utils/storage/__init__.py +72 -0
  313. synapse_sdk/utils/storage/providers/__init__.py +183 -0
  314. synapse_sdk/utils/storage/providers/file_system.py +134 -0
  315. synapse_sdk/utils/storage/providers/gcp.py +13 -0
  316. synapse_sdk/utils/storage/providers/http.py +190 -0
  317. synapse_sdk/utils/storage/providers/s3.py +91 -0
  318. synapse_sdk/utils/storage/providers/sftp.py +47 -0
  319. synapse_sdk/utils/storage/registry.py +17 -0
  320. synapse_sdk-2025.11.7.dist-info/METADATA +122 -0
  321. synapse_sdk-2025.11.7.dist-info/RECORD +386 -0
  322. {synapse_sdk-1.0.0a13.dist-info → synapse_sdk-2025.11.7.dist-info}/WHEEL +1 -1
  323. synapse_sdk/clients/backend/dataset.py +0 -51
  324. synapse_sdk/plugins/categories/import/actions/import.py +0 -10
  325. synapse_sdk/plugins/cli/__init__.py +0 -21
  326. synapse_sdk/plugins/cli/publish.py +0 -37
  327. synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/.env +0 -24
  328. synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/.env.dist +0 -24
  329. synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/main.py +0 -4
  330. synapse_sdk/plugins/utils.py +0 -50
  331. synapse_sdk/utils/file.py +0 -87
  332. synapse_sdk/utils/storage.py +0 -91
  333. synapse_sdk-1.0.0a13.dist-info/METADATA +0 -43
  334. synapse_sdk-1.0.0a13.dist-info/RECORD +0 -111
  335. /synapse_sdk/{plugins/categories/import → clients/validators}/__init__.py +0 -0
  336. /synapse_sdk/{plugins/categories/import/actions → devtools}/__init__.py +0 -0
  337. {synapse_sdk-1.0.0a13.dist-info → synapse_sdk-2025.11.7.dist-info}/entry_points.txt +0 -0
  338. {synapse_sdk-1.0.0a13.dist-info → synapse_sdk-2025.11.7.dist-info/licenses}/LICENSE +0 -0
  339. {synapse_sdk-1.0.0a13.dist-info → synapse_sdk-2025.11.7.dist-info}/top_level.txt +0 -0
@@ -1,13 +0,0 @@
1
- import os
2
-
3
- from dotenv import load_dotenv
4
-
5
- from synapse_sdk.plugins.cli import cli
6
-
7
-
8
- def init():
9
- load_dotenv(os.path.join(os.getcwd(), '.env'))
10
- cli(obj={}, auto_envvar_prefix='SYNAPSE_PLUGIN')
11
-
12
-
13
- __all__ = ['init']
@@ -11,12 +11,38 @@ from synapse_sdk.clients.ray import RayClient
11
11
  from synapse_sdk.plugins.enums import RunMethod
12
12
  from synapse_sdk.plugins.exceptions import ActionError
13
13
  from synapse_sdk.plugins.models import PluginRelease, Run
14
- from synapse_sdk.plugins.upload import archive_and_upload, build_and_upload, download_and_upload
14
+ from synapse_sdk.plugins.upload import archive_and_upload, build_and_upload
15
+ from synapse_sdk.shared import init_sentry, needs_sentry_init
15
16
  from synapse_sdk.utils.module_loading import import_string
16
17
  from synapse_sdk.utils.pydantic.errors import pydantic_to_drf_error
17
18
 
18
19
 
19
20
  class Action:
21
+ """Base class for all plugin actions.
22
+
23
+ Attrs:
24
+ name (str): The name of the action.
25
+ category (PluginCategory): The category of the action.
26
+ method (RunMethod): The method to run of the action.
27
+ run_class (Run): The class to run the action.
28
+ params_model (BaseModel): The model to validate the params.
29
+ progress_categories (Dict[str] | None): The categories to update the progress.
30
+ metrics_categories (Dict[str] | None): The categories to update the metrics.
31
+ params (Dict): The params to run the action.
32
+ plugin_config (Dict): The plugin config.
33
+ plugin_release (PluginRelease): The plugin release.
34
+ config (Dict): The action config.
35
+ requirements (List[str]): The requirements to install.
36
+ job_id (str): The job id.
37
+ direct (bool): The flag to run the action directly.
38
+ debug (bool): The flag to run the action in debug mode.
39
+ envs (Dict): The runtime envs.
40
+ run (Run): The run instance.
41
+
42
+ Raises:
43
+ ActionError: If the action fails.
44
+ """
45
+
20
46
  # class 변수
21
47
  name = None
22
48
  category = None
@@ -24,19 +50,22 @@ class Action:
24
50
  run_class = Run
25
51
  params_model = None
26
52
  progress_categories = None
53
+ metrics_categories = None
27
54
 
28
55
  # init 변수
29
56
  params = None
30
57
  plugin_config = None
31
58
  plugin_release = None
32
59
  config = None
60
+ requirements = None
33
61
  job_id = None
34
62
  direct = None
35
63
  debug = None
36
64
  envs = None
37
65
  run = None
38
66
 
39
- default_envs = [
67
+ # TODO: Refactor to use Synapse Access Token instead of SYNAPSE_PLUGIN_RUN_USER_TOKEN and SYNAPSE_PLUGIN_RUN_TENANT
68
+ REQUIRED_ENVS = [
40
69
  'RAY_ADDRESS',
41
70
  'RAY_DASHBOARD_URL',
42
71
  'RAY_SERVE_ADDRESS',
@@ -48,11 +77,12 @@ class Action:
48
77
  'SYNAPSE_PLUGIN_RUN_TENANT',
49
78
  ]
50
79
 
51
- def __init__(self, params, plugin_config, envs=None, job_id=None, direct=False, debug=False):
80
+ def __init__(self, params, plugin_config, requirements=None, envs=None, job_id=None, direct=False, debug=False):
52
81
  self.params = params
53
82
  self.plugin_config = plugin_config
54
83
  self.plugin_release = PluginRelease(config=plugin_config)
55
84
  self.config = self.plugin_release.get_action_config(self.name)
85
+ self.requirements = requirements
56
86
  self.job_id = job_id
57
87
  self.direct = direct
58
88
  self.debug = debug
@@ -79,49 +109,109 @@ class Action:
79
109
  def plugin_url(self):
80
110
  if self.debug:
81
111
  plugin_path = self.envs.get('SYNAPSE_DEBUG_PLUGIN_PATH') or '.'
82
- if plugin_path.startswith('https://'): # TODO ray에서 지원하는 remote uri 형식 (https, s3, gs) 모두 지원
83
- plugin_url = plugin_path
84
- elif plugin_path.startswith('http://'):
85
- plugin_url = download_and_upload(plugin_path, self.plugin_storage_url)
86
- else:
112
+
113
+ # For HTTP/HTTPS URLs in debug mode, convert to Ray GCS (Global Control Store) URL
114
+ if plugin_path.startswith(('http://', 'https://')):
115
+ try:
116
+ from synapse_sdk.plugins.utils import convert_http_to_ray_gcs
117
+
118
+ plugin_url = convert_http_to_ray_gcs(plugin_path)
119
+ except (ImportError, RuntimeError):
120
+ plugin_url = plugin_path
121
+
122
+ elif self.envs.get('SYNAPSE_PLUGIN_STORAGE'):
87
123
  plugin_url = archive_and_upload(plugin_path, self.plugin_storage_url)
124
+ else:
125
+ plugin_url = plugin_path
126
+
88
127
  self.envs['SYNAPSE_DEBUG_PLUGIN_PATH'] = plugin_url
89
128
  return plugin_url
90
- return self.plugin_release.get_url(self.plugin_storage_url)
129
+
130
+ # Production path: get URL from storage provider
131
+ url = self.plugin_release.get_url(self.plugin_storage_url)
132
+
133
+ # Convert HTTP URLs to Ray GCS URLs if needed
134
+ if url.startswith(('http://', 'https://')):
135
+ try:
136
+ from synapse_sdk.plugins.utils import convert_http_to_ray_gcs
137
+
138
+ url = convert_http_to_ray_gcs(url)
139
+ except (ImportError, RuntimeError):
140
+ pass
141
+
142
+ return url
91
143
 
92
144
  @property
93
145
  def debug_modules(self):
94
146
  debug_modules = []
95
- for module_path in self.envs.get('SYNAPSE_DEBUG_MODULES', '').split(','):
96
- if module_path.startswith('https://'): # TODO ray에서 지원하는 remote uri 형식 (https, s3, gs) 모두 지원
97
- module_url = module_path
98
- else:
99
- module_url = build_and_upload(module_path, self.plugin_storage_url)
100
- debug_modules.append(module_url)
101
- self.envs['SYNAPSE_DEBUG_MODULES'] = ','.join(debug_modules)
147
+ if self.envs.get('SYNAPSE_DEBUG_MODULES'):
148
+ for module_path in self.envs['SYNAPSE_DEBUG_MODULES'].split(','):
149
+ # TODO ray에서 지원하는 remote uri 형식 (https, s3, gs) 모두 지원
150
+ if module_path.startswith('https://'):
151
+ module_url = module_path
152
+ else:
153
+ module_url = build_and_upload(module_path, self.plugin_storage_url)
154
+ debug_modules.append(module_url)
155
+ self.envs['SYNAPSE_DEBUG_MODULES'] = ','.join(debug_modules)
102
156
  return debug_modules
103
157
 
158
+ @property
159
+ def plugin_package_manager(self):
160
+ return self.plugin_config.get('package_manager', 'pip')
161
+
162
+ @property
163
+ def package_manager_options(self):
164
+ # Get user-defined options from plugin config
165
+ user_options = self.plugin_config.get('package_manager_options', [])
166
+
167
+ if self.plugin_package_manager == 'uv':
168
+ defaults = ['--no-cache']
169
+ # Add defaults if not already present
170
+ options_list = defaults.copy()
171
+ for option in user_options:
172
+ if option not in options_list:
173
+ options_list.append(option)
174
+ return {'uv_pip_install_options': options_list}
175
+ else:
176
+ # For pip, use pip_install_options with --upgrade flag to ensure
177
+ # packages from requirements.txt (like synapse-sdk) override pre-installed versions
178
+ defaults = ['--upgrade']
179
+ options_list = defaults.copy()
180
+ for option in user_options:
181
+ if option not in options_list:
182
+ options_list.append(option)
183
+ return {'pip_install_options': options_list}
184
+
104
185
  def get_run(self):
105
186
  context = {
106
187
  'plugin_release': self.plugin_release,
107
188
  'progress_categories': self.progress_categories,
189
+ 'metrics_categories': self.metrics_categories,
108
190
  'params': self.params,
109
191
  'envs': self.envs,
110
192
  'debug': self.debug,
193
+ 'action_name': self.name,
111
194
  }
112
195
  return self.run_class(self.job_id, context)
113
196
 
114
197
  def get_default_envs(self):
115
- return {env: os.environ[env] for env in self.default_envs if env in os.environ}
198
+ return {env: os.environ[env] for env in self.REQUIRED_ENVS if env in os.environ}
116
199
 
117
200
  def get_runtime_env(self):
118
- runtime_env = {
119
- 'pip': ['-r ${RAY_RUNTIME_ENV_CREATE_WORKING_DIR}/requirements.txt'],
120
- 'working_dir': self.plugin_url,
121
- }
201
+ runtime_env = {self.plugin_package_manager: {'packages': []}, 'working_dir': self.plugin_url}
202
+
203
+ if self.requirements:
204
+ runtime_env[self.plugin_package_manager]['packages'] += self.requirements
122
205
 
123
206
  if self.debug:
124
- runtime_env['pip'] += self.debug_modules
207
+ runtime_env[self.plugin_package_manager]['packages'] += self.debug_modules
208
+
209
+ for key, value in self.package_manager_options.items():
210
+ runtime_env[self.plugin_package_manager][key] = value
211
+
212
+ # Sentry init if SENTRY_DSN is set
213
+ if needs_sentry_init():
214
+ runtime_env['worker_process_setup_hook'] = 'synapse_sdk.shared.worker_process_setup_hook'
125
215
 
126
216
  # 맨 마지막에 진행되어야 함
127
217
  runtime_env['env_vars'] = self.envs
@@ -145,16 +235,25 @@ class Action:
145
235
  return self.start_by_restapi()
146
236
  else:
147
237
  result = self.start()
148
- self.post_action_by_job(result)
238
+ if self.job_id:
239
+ self.post_action_by_job(result)
149
240
  return result
150
241
  return getattr(self, f'start_by_{self.method.value}')()
151
242
 
152
243
  def start(self):
244
+ """Start the action.
245
+
246
+ TODO: Specify the return type of start method for overrided methods.
247
+ """
153
248
  if self.method == RunMethod.JOB:
154
249
  return self.entrypoint(self.run, **self.params)
155
250
  return self.entrypoint(**self.params)
156
251
 
157
252
  def start_by_task(self):
253
+ """Ray Task based execution.
254
+
255
+ * A task method that simply executes the entrypoint without job management functionality.
256
+ """
158
257
  import ray
159
258
  from ray.exceptions import RayTaskError
160
259
 
@@ -180,13 +279,18 @@ class Action:
180
279
 
181
280
  kwargs['direct'] = True
182
281
  try:
183
- if not ray.is_initialized():
184
- ray.init(address=self.envs['RAY_ADDRESS'], ignore_reinit_error=True)
282
+ self.ray_init()
185
283
  return ray.get(run_task.remote(self.category.value, self.name, *args, **kwargs))
186
284
  except RayTaskError as e:
187
285
  raise ActionError(e.cause)
188
286
 
189
287
  def start_by_job(self):
288
+ """Ray Job based execution.
289
+
290
+ * Executes the entrypoint with Ray job. Ray job manages the entrypoint execution and stores the results.
291
+ """
292
+ self.ray_init()
293
+
190
294
  main_options = []
191
295
  options = ['run', '--direct']
192
296
  arguments = [self.name, f'{json.dumps(json.dumps(self.params))}']
@@ -202,11 +306,15 @@ class Action:
202
306
  client = self.get_job_client()
203
307
  return client.submit_job(
204
308
  submission_id=self.job_id,
205
- entrypoint=f'python main.py {cmd}',
309
+ entrypoint=f'synapse plugin {cmd}',
206
310
  runtime_env=self.get_runtime_env(),
207
311
  )
208
312
 
209
313
  def start_by_restapi(self):
314
+ """Ray Serve based execution.
315
+
316
+ * This method executes a Fastapi endpoint defined within the Plugin.
317
+ """
210
318
  path = self.params.pop('path', '')
211
319
  method = self.params.pop('method')
212
320
 
@@ -225,12 +333,19 @@ class Action:
225
333
  raise ActionError('Unable to connect to serve application')
226
334
 
227
335
  def post_action_by_job(self, result):
228
- if self.client:
229
- job_client = self.get_job_client()
230
- logs = job_client.get_job_logs(self.job_id).split('\n')
231
- self.client.update_job(self.job_id, data={'result': result or {}, 'console_logs': logs})
336
+ job_client = self.get_job_client()
337
+ logs = job_client.get_job_logs(self.job_id).split('\n')
338
+ self.client.update_job(self.job_id, data={'result': result or {}, 'console_logs': logs})
232
339
 
233
340
  def get_job_client(self):
234
341
  from ray.dashboard.modules.job.sdk import JobSubmissionClient
235
342
 
236
343
  return JobSubmissionClient(address=self.envs.get('RAY_DASHBOARD_URL'))
344
+
345
+ def ray_init(self):
346
+ import ray
347
+
348
+ init_sentry()
349
+
350
+ if not ray.is_initialized():
351
+ ray.init(address=self.envs['RAY_ADDRESS'], ignore_reinit_error=True)
@@ -1,10 +1,82 @@
1
+ from enum import Enum
2
+ from typing import Any, Dict, List
3
+
4
+ from pydantic import BaseModel
5
+
1
6
  from synapse_sdk.plugins.categories.base import Action
2
7
  from synapse_sdk.plugins.categories.decorators import register_action
3
8
  from synapse_sdk.plugins.enums import PluginCategory, RunMethod
4
9
 
5
10
 
11
+ class ValidationDataStatus(str, Enum):
12
+ """Validation data status enumeration.
13
+
14
+ Represents the possible status values for validation operations.
15
+
16
+ Attributes:
17
+ SUCCESS: Validation completed successfully with no errors.
18
+ FAILED: Validation failed with one or more errors.
19
+ """
20
+
21
+ SUCCESS = 'success'
22
+ FAILED = 'failed'
23
+
24
+
25
+ class ValidationResult(BaseModel):
26
+ """Validation result model.
27
+
28
+ Args:
29
+ status: The validation status.
30
+ errors: List of validation errors.
31
+ """
32
+
33
+ status: ValidationDataStatus
34
+ errors: List[str]
35
+
36
+
37
+ class CriticalError(Exception):
38
+ """Critical error exception for validation processing.
39
+
40
+ Raised when a critical error occurs during validation that prevents
41
+ the validation process from continuing normally.
42
+
43
+ Args:
44
+ message: Custom error message. Defaults to a standard critical error message.
45
+
46
+ Attributes:
47
+ message: The error message associated with this exception.
48
+ """
49
+
50
+ def __init__(self, message: str = 'Critical error occured while processing validation'):
51
+ self.message = message
52
+ super().__init__(self.message)
53
+
54
+
55
+ class ValidationParams(BaseModel):
56
+ """Validation action parameters.
57
+
58
+ Args:
59
+ data (dict): The validation data.
60
+ """
61
+
62
+ data: Dict[str, Any]
63
+
64
+
6
65
  @register_action
7
66
  class ValidationAction(Action):
67
+ """Validation action for data validation processing.
68
+
69
+ This action handles the process of validating data with assignment IDs.
70
+ It supports validation methods and provides structured logging.
71
+
72
+ Attrs:
73
+ name (str): Action name, set to 'validation'.
74
+ category (PluginCategory): Plugin category, set to DATA_VALIDATION.
75
+ method (RunMethod): Execution method, set to TASK.
76
+ params_model (Type[ValidationParams]): Parameter validation model.
77
+ """
78
+
8
79
  name = 'validation'
9
80
  category = PluginCategory.DATA_VALIDATION
10
81
  method = RunMethod.TASK
82
+ params_model = ValidationParams
@@ -1,5 +1,33 @@
1
- def validate(data, assignment_id, **kwargs):
2
- errors = []
3
- if data.get('errors'):
4
- errors += data['errors']
5
- return errors
1
+ from typing import Any, Dict, List, Optional
2
+
3
+ from synapse_sdk.plugins.categories.data_validation.actions.validation import ValidationDataStatus, ValidationResult
4
+
5
+
6
+ def validate(data: Optional[Dict[str, Any]] = None, **kwargs: Any) -> Dict[str, Any]:
7
+ """Validate data with assignment data.
8
+
9
+ * Custom validation logic can be added here.
10
+ * Error messages can be added to the errors list if errors exist in data.
11
+ * The validation result will be returned as a dict with ValidationResult structure.
12
+
13
+ Args:
14
+ data: The data to validate.
15
+ **kwargs: Additional arguments.
16
+
17
+ Returns:
18
+ Dict[str, Any]: The validation result as a dictionary with ValidationResult structure.
19
+ """
20
+ errors: List[str] = []
21
+
22
+ # Add custom validation logic here
23
+
24
+ # Add error messages into errors list if errors exist in data
25
+
26
+ # Determine status based on errors
27
+ status = ValidationDataStatus.FAILED if errors else ValidationDataStatus.SUCCESS
28
+
29
+ # DO NOT MODIFY BELOW THIS LINE - Validation result should be returned as a dumped ValidationResult.
30
+ validation_result = ValidationResult(status=status, errors=errors)
31
+ result_dict = validation_result.model_dump()
32
+ result_dict['status'] = status.value
33
+ return result_dict
@@ -0,0 +1,3 @@
1
+ from .export import ExportAction
2
+
3
+ __all__ = ['ExportAction']
@@ -0,0 +1,28 @@
1
+ from .action import ExportAction
2
+ from .enums import ExportStatus, LogCode
3
+ from .exceptions import ExportError, ExportTargetError, ExportValidationError
4
+ from .models import ExportParams
5
+ from .run import ExportRun
6
+ from .utils import (
7
+ AssignmentExportTargetHandler,
8
+ ExportTargetHandler,
9
+ GroundTruthExportTargetHandler,
10
+ TargetHandlerFactory,
11
+ TaskExportTargetHandler,
12
+ )
13
+
14
+ __all__ = [
15
+ 'ExportAction',
16
+ 'ExportStatus',
17
+ 'LogCode',
18
+ 'ExportError',
19
+ 'ExportTargetError',
20
+ 'ExportValidationError',
21
+ 'ExportParams',
22
+ 'ExportRun',
23
+ 'ExportTargetHandler',
24
+ 'AssignmentExportTargetHandler',
25
+ 'GroundTruthExportTargetHandler',
26
+ 'TaskExportTargetHandler',
27
+ 'TargetHandlerFactory',
28
+ ]
@@ -0,0 +1,165 @@
1
+ from itertools import tee
2
+ from typing import Any, Dict
3
+
4
+ from pydantic_core import PydanticCustomError
5
+
6
+ from synapse_sdk.clients.exceptions import ClientError
7
+ from synapse_sdk.i18n import gettext as _
8
+ from synapse_sdk.plugins.categories.base import Action
9
+ from synapse_sdk.plugins.categories.decorators import register_action
10
+ from synapse_sdk.plugins.enums import PluginCategory, RunMethod
11
+ from synapse_sdk.utils.storage import get_pathlib
12
+
13
+ from .enums import LogCode
14
+ from .models import ExportParams
15
+ from .run import ExportRun
16
+ from .utils import TargetHandlerFactory
17
+
18
+
19
+ @register_action
20
+ class ExportAction(Action):
21
+ """Main export action for processing and exporting data from various targets.
22
+
23
+ Handles export operations including target validation, data retrieval,
24
+ and file generation. Supports export from assignment, ground_truth, and task
25
+ targets with comprehensive progress tracking and error handling.
26
+
27
+ Features:
28
+ - Multiple target source support (assignment, ground_truth, task)
29
+ - Filter validation and data retrieval
30
+ - Original file and data file export options
31
+ - Progress tracking with detailed metrics
32
+ - Comprehensive error logging
33
+ - Project configuration handling
34
+
35
+ Class Attributes:
36
+ name (str): Action identifier ('export')
37
+ category (PluginCategory): EXPORT category
38
+ method (RunMethod): JOB execution method
39
+ run_class (type): ExportRun for specialized logging
40
+ params_model (type): ExportParams for parameter validation
41
+ progress_categories (dict): Progress tracking configuration
42
+ metrics_categories (dict): Metrics collection configuration
43
+
44
+ Example:
45
+ >>> action = ExportAction(
46
+ ... params={
47
+ ... 'name': 'Assignment Export',
48
+ ... 'storage': 1,
49
+ ... 'path': '/exports/assignments',
50
+ ... 'target': 'assignment',
51
+ ... 'filter': {'project': 123}
52
+ ... },
53
+ ... plugin_config=config
54
+ ... )
55
+ >>> result = action.start()
56
+ """
57
+
58
+ name = 'export'
59
+ category = PluginCategory.EXPORT
60
+ method = RunMethod.JOB
61
+ params_model = ExportParams
62
+ run_class = ExportRun
63
+ progress_categories = {
64
+ 'dataset_conversion': {
65
+ 'proportion': 100,
66
+ }
67
+ }
68
+ metrics_categories = {
69
+ 'data_file': {
70
+ 'stand_by': 0,
71
+ 'failed': 0,
72
+ 'success': 0,
73
+ },
74
+ 'original_file': {
75
+ 'stand_by': 0,
76
+ 'failed': 0,
77
+ 'success': 0,
78
+ },
79
+ }
80
+
81
+ def get_filtered_results(self, filters, handler):
82
+ """Get filtered target results.
83
+
84
+ Retrieves data from the specified target using the provided filters
85
+ through the appropriate target handler.
86
+
87
+ Args:
88
+ filters (dict): Filter criteria to apply
89
+ handler (ExportTargetHandler): Target-specific handler
90
+
91
+ Returns:
92
+ tuple: (results, count) where results is the data and count is total
93
+
94
+ Raises:
95
+ PydanticCustomError: If data retrieval fails
96
+ """
97
+ try:
98
+ result_list = handler.get_results(self.client, filters)
99
+ results = result_list[0]
100
+ count = result_list[1]
101
+ except ClientError:
102
+ raise PydanticCustomError('client_error', _('Unable to get dataset.'))
103
+ return results, count
104
+
105
+ def start(self) -> Dict[str, Any]:
106
+ """Start the export process.
107
+
108
+ Main entry point for export operations. Handles parameter preparation,
109
+ target handler selection, data retrieval, and export execution.
110
+
111
+ Returns:
112
+ Dict[str, Any]: Export results from the entrypoint
113
+
114
+ Raises:
115
+ Various exceptions based on validation and processing failures
116
+ """
117
+ self.run.log_message_with_code(LogCode.EXPORT_STARTED)
118
+
119
+ # Get expand setting from config, default to True (expand data)
120
+ filters = {**self.params['filter']}
121
+ data_expand = self.config.get('data_expand', True)
122
+ if data_expand:
123
+ filters['expand'] = 'data'
124
+
125
+ target = self.params['target']
126
+ handler = TargetHandlerFactory.get_handler(target)
127
+
128
+ self.params['results'], self.params['count'] = self.get_filtered_results(filters, handler)
129
+
130
+ if self.params['count'] == 0:
131
+ self.run.log_message_with_code(LogCode.NO_RESULTS_FOUND)
132
+ else:
133
+ self.run.log_message_with_code(LogCode.RESULTS_RETRIEVED, self.params['count'])
134
+
135
+ # For the 'ground_truth' target, retrieve project information from the first result and add configuration
136
+ if target == 'ground_truth':
137
+ try:
138
+ # Split generator into two using tee()
139
+ peek_iter, main_iter = tee(self.params['results'])
140
+ first_result = next(peek_iter) # Peek first value only
141
+ project_pk = first_result['project']
142
+ project_info = self.client.get_project(project_pk)
143
+ self.params['project_id'] = project_pk
144
+ self.params['configuration'] = project_info.get('configuration', {})
145
+ self.params['results'] = main_iter # Keep original generator intact
146
+ except (StopIteration, KeyError):
147
+ self.params['configuration'] = {}
148
+ # For the 'assignment' and 'task' targets, retrieve the project from the filter as before
149
+ elif target in ['assignment', 'task'] and 'project' in self.params['filter']:
150
+ project_pk = self.params['filter']['project']
151
+ project_info = self.client.get_project(project_pk)
152
+ self.params['configuration'] = project_info.get('configuration', {})
153
+
154
+ export_items = handler.get_export_item(self.params['results'])
155
+ storage = self.client.get_storage(self.params['storage'])
156
+ pathlib_cwd = get_pathlib(storage, self.params['path'])
157
+ exporter = self.entrypoint(self.run, export_items, pathlib_cwd, **self.params)
158
+
159
+ try:
160
+ result = exporter.export()
161
+ self.run.log_message_with_code(LogCode.EXPORT_COMPLETED)
162
+ return result
163
+ except Exception as e:
164
+ self.run.log_message_with_code(LogCode.EXPORT_FAILED, str(e))
165
+ raise