synapse-sdk 1.0.0a36__tar.gz → 1.0.0a38__tar.gz

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 (158) hide show
  1. {synapse_sdk-1.0.0a36/synapse_sdk.egg-info → synapse_sdk-1.0.0a38}/PKG-INFO +1 -1
  2. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/clients/base.py +3 -1
  3. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/base.py +11 -3
  4. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/export/actions/export.py +67 -2
  5. synapse_sdk-1.0.0a38/synapse_sdk/plugins/categories/export/enums.py +7 -0
  6. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/export/templates/plugin/export.py +23 -5
  7. synapse_sdk-1.0.0a38/synapse_sdk/plugins/categories/neural_net/actions/tune.py +268 -0
  8. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/upload/actions/upload.py +141 -39
  9. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/models.py +9 -1
  10. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/utils/file.py +3 -2
  11. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38/synapse_sdk.egg-info}/PKG-INFO +1 -1
  12. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk.egg-info/SOURCES.txt +2 -0
  13. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/.github/workflows/lint.yml +0 -0
  14. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/.github/workflows/pypi-publish.yml +0 -0
  15. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/.gitignore +0 -0
  16. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/.pre-commit-config.yaml +0 -0
  17. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/LICENSE +0 -0
  18. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/README.md +0 -0
  19. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/locale/en/LC_MESSAGES/messages.mo +0 -0
  20. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/locale/en/LC_MESSAGES/messages.po +0 -0
  21. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/locale/ko/LC_MESSAGES/messages.mo +0 -0
  22. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/locale/ko/LC_MESSAGES/messages.po +0 -0
  23. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/pyproject.toml +0 -0
  24. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/requirements.test.txt +0 -0
  25. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/requirements.txt +0 -0
  26. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/setup.cfg +0 -0
  27. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/__init__.py +0 -0
  28. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/cli/__init__.py +0 -0
  29. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/cli/alias/__init__.py +0 -0
  30. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/cli/alias/create.py +0 -0
  31. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/cli/alias/dataclass.py +0 -0
  32. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/cli/alias/default.py +0 -0
  33. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/cli/alias/delete.py +0 -0
  34. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/cli/alias/list.py +0 -0
  35. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/cli/alias/read.py +0 -0
  36. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/cli/alias/update.py +0 -0
  37. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/cli/alias/utils.py +0 -0
  38. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/cli/plugin/__init__.py +0 -0
  39. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/cli/plugin/create.py +0 -0
  40. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/cli/plugin/publish.py +0 -0
  41. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/cli/plugin/run.py +0 -0
  42. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/clients/__init__.py +0 -0
  43. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/clients/agent/__init__.py +0 -0
  44. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/clients/agent/core.py +0 -0
  45. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/clients/agent/ray.py +0 -0
  46. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/clients/agent/service.py +0 -0
  47. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/clients/backend/__init__.py +0 -0
  48. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/clients/backend/annotation.py +0 -0
  49. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/clients/backend/core.py +0 -0
  50. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/clients/backend/dataset.py +0 -0
  51. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/clients/backend/hitl.py +0 -0
  52. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/clients/backend/integration.py +0 -0
  53. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/clients/backend/ml.py +0 -0
  54. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/clients/backend/models.py +0 -0
  55. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/clients/exceptions.py +0 -0
  56. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/clients/ray/__init__.py +0 -0
  57. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/clients/ray/core.py +0 -0
  58. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/clients/ray/serve.py +0 -0
  59. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/clients/utils.py +0 -0
  60. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/clients/validators/__init__.py +0 -0
  61. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/clients/validators/collections.py +0 -0
  62. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/i18n.py +0 -0
  63. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/loggers.py +0 -0
  64. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/__init__.py +0 -0
  65. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/__init__.py +0 -0
  66. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/data_validation/__init__.py +0 -0
  67. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/data_validation/actions/__init__.py +0 -0
  68. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/data_validation/actions/validation.py +0 -0
  69. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/data_validation/templates/config.yaml +0 -0
  70. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/data_validation/templates/plugin/__init__.py +0 -0
  71. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/data_validation/templates/plugin/validation.py +0 -0
  72. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/decorators.py +0 -0
  73. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/export/__init__.py +0 -0
  74. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/export/actions/__init__.py +0 -0
  75. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/export/templates/config.yaml +0 -0
  76. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/export/templates/plugin/__init__.py +0 -0
  77. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/neural_net/__init__.py +0 -0
  78. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/neural_net/actions/__init__.py +0 -0
  79. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/neural_net/actions/deployment.py +0 -0
  80. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/neural_net/actions/inference.py +0 -0
  81. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/neural_net/actions/test.py +0 -0
  82. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/neural_net/actions/train.py +0 -0
  83. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/neural_net/base/__init__.py +0 -0
  84. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/neural_net/base/inference.py +0 -0
  85. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/neural_net/templates/config.yaml +0 -0
  86. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/neural_net/templates/plugin/__init__.py +0 -0
  87. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/neural_net/templates/plugin/inference.py +0 -0
  88. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/neural_net/templates/plugin/test.py +0 -0
  89. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/neural_net/templates/plugin/train.py +0 -0
  90. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/post_annotation/__init__.py +0 -0
  91. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/post_annotation/actions/__init__.py +0 -0
  92. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/post_annotation/actions/post_annotation.py +0 -0
  93. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/post_annotation/templates/config.yaml +0 -0
  94. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/post_annotation/templates/plugin/__init__.py +0 -0
  95. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/post_annotation/templates/plugin/post_annotation.py +0 -0
  96. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/pre_annotation/__init__.py +0 -0
  97. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/pre_annotation/actions/__init__.py +0 -0
  98. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/pre_annotation/actions/pre_annotation.py +0 -0
  99. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/pre_annotation/templates/config.yaml +0 -0
  100. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/pre_annotation/templates/plugin/__init__.py +0 -0
  101. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/pre_annotation/templates/plugin/pre_annotation.py +0 -0
  102. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/registry.py +0 -0
  103. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/smart_tool/__init__.py +0 -0
  104. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/smart_tool/actions/__init__.py +0 -0
  105. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/smart_tool/actions/auto_label.py +0 -0
  106. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/smart_tool/templates/config.yaml +0 -0
  107. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/smart_tool/templates/plugin/__init__.py +0 -0
  108. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/smart_tool/templates/plugin/auto_label.py +0 -0
  109. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/templates.py +0 -0
  110. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/upload/__init__.py +0 -0
  111. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/upload/actions/__init__.py +0 -0
  112. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/upload/templates/config.yaml +0 -0
  113. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/upload/templates/plugin/__init__.py +0 -0
  114. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/categories/upload/templates/plugin/upload.py +0 -0
  115. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/enums.py +0 -0
  116. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/exceptions.py +0 -0
  117. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/templates/cookiecutter.json +0 -0
  118. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/templates/hooks/post_gen_project.py +0 -0
  119. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/templates/hooks/pre_prompt.py +0 -0
  120. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/.gitignore +0 -0
  121. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/.pre-commit-config.yaml +0 -0
  122. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/README.md +0 -0
  123. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/config.yaml +0 -0
  124. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/plugin/__init__.py +0 -0
  125. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/pyproject.toml +0 -0
  126. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/requirements.txt +0 -0
  127. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/upload.py +0 -0
  128. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/plugins/utils.py +0 -0
  129. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/shared/__init__.py +0 -0
  130. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/shared/enums.py +0 -0
  131. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/types.py +0 -0
  132. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/utils/__init__.py +0 -0
  133. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/utils/dataset.py +0 -0
  134. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/utils/debug.py +0 -0
  135. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/utils/module_loading.py +0 -0
  136. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/utils/network.py +0 -0
  137. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/utils/pydantic/__init__.py +0 -0
  138. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/utils/pydantic/config.py +0 -0
  139. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/utils/pydantic/errors.py +0 -0
  140. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/utils/pydantic/validators.py +0 -0
  141. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/utils/storage/__init__.py +0 -0
  142. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/utils/storage/providers/__init__.py +0 -0
  143. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/utils/storage/providers/gcp.py +0 -0
  144. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/utils/storage/providers/s3.py +0 -0
  145. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/utils/storage/providers/sftp.py +0 -0
  146. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/utils/storage/registry.py +0 -0
  147. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk/utils/string.py +0 -0
  148. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk.egg-info/dependency_links.txt +0 -0
  149. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk.egg-info/entry_points.txt +0 -0
  150. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk.egg-info/requires.txt +0 -0
  151. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/synapse_sdk.egg-info/top_level.txt +0 -0
  152. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/tests/__init__.py +0 -0
  153. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/tests/clients/__init__.py +0 -0
  154. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/tests/clients/test_backend_models.py +0 -0
  155. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/tests/clients/test_base_client.py +0 -0
  156. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/tests/clients/test_collection_validators.py +0 -0
  157. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/tests/utils/__init__,py +0 -0
  158. {synapse_sdk-1.0.0a36 → synapse_sdk-1.0.0a38}/tests/utils/test_debug.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: synapse-sdk
3
- Version: 1.0.0a36
3
+ Version: 1.0.0a38
4
4
  Summary: synapse sdk
5
5
  Author-email: datamaker <developer@datamaker.io>
6
6
  License: MIT
@@ -11,6 +11,7 @@ from synapse_sdk.utils.file import files_url_to_path_from_objs
11
11
  class BaseClient:
12
12
  name = None
13
13
  base_url = None
14
+ page_size = 100
14
15
 
15
16
  def __init__(self, base_url):
16
17
  self.base_url = base_url
@@ -146,7 +147,8 @@ class BaseClient:
146
147
  else:
147
148
  return response
148
149
 
149
- def _list_all(self, path, url_conversion=None, params=None, **kwargs):
150
+ def _list_all(self, path, url_conversion=None, params={}, **kwargs):
151
+ params['page_size'] = self.page_size
150
152
  response = self._get(path, url_conversion, params=params, **kwargs)
151
153
  yield from response['results']
152
154
  if response['next']:
@@ -133,6 +133,11 @@ class Action:
133
133
  def plugin_package_manager(self):
134
134
  return self.plugin_config.get('package_manager', 'pip')
135
135
 
136
+ @property
137
+ def package_manager_options(self):
138
+ options = {'pip': {}, 'uv': {'uv_pip_install_options': []}}
139
+ return options[self.plugin_package_manager]
140
+
136
141
  def get_run(self):
137
142
  context = {
138
143
  'plugin_release': self.plugin_release,
@@ -147,13 +152,16 @@ class Action:
147
152
  return {env: os.environ[env] for env in self.REQUIRED_ENVS if env in os.environ}
148
153
 
149
154
  def get_runtime_env(self):
150
- runtime_env = {self.plugin_package_manager: [], 'working_dir': self.plugin_url}
155
+ runtime_env = {self.plugin_package_manager: {'packages': []}, 'working_dir': self.plugin_url}
151
156
 
152
157
  if self.requirements:
153
- runtime_env[self.plugin_package_manager] += self.requirements
158
+ runtime_env[self.plugin_package_manager]['packages'] += self.requirements
154
159
 
155
160
  if self.debug:
156
- runtime_env[self.plugin_package_manager] += self.debug_modules
161
+ runtime_env[self.plugin_package_manager]['packages'] += self.debug_modules
162
+
163
+ for key, value in self.package_manager_options.items():
164
+ runtime_env[self.plugin_package_manager][key] = value
157
165
 
158
166
  # 맨 마지막에 진행되어야 함
159
167
  runtime_env['env_vars'] = self.envs
@@ -1,17 +1,77 @@
1
+ import json
1
2
  from abc import ABC, abstractmethod
2
- from typing import Any, Literal
3
+ from datetime import datetime
4
+ from typing import Annotated, Any, Literal
3
5
 
4
- from pydantic import BaseModel, field_validator
6
+ from pydantic import AfterValidator, BaseModel, field_validator
5
7
  from pydantic_core import PydanticCustomError
6
8
 
7
9
  from synapse_sdk.clients.exceptions import ClientError
8
10
  from synapse_sdk.i18n import gettext as _
9
11
  from synapse_sdk.plugins.categories.base import Action
10
12
  from synapse_sdk.plugins.categories.decorators import register_action
13
+ from synapse_sdk.plugins.categories.export.enums import ExportStatus
11
14
  from synapse_sdk.plugins.enums import PluginCategory, RunMethod
15
+ from synapse_sdk.plugins.models import Run
16
+ from synapse_sdk.utils.pydantic.validators import non_blank
12
17
  from synapse_sdk.utils.storage import get_pathlib
13
18
 
14
19
 
20
+ class ExportRun(Run):
21
+ class DataFileLog(BaseModel):
22
+ """Data file log model."""
23
+
24
+ target_id: int
25
+ data_file_info: str | None
26
+ status: ExportStatus
27
+ error: str | None = None
28
+ created: str
29
+
30
+ def log_file(
31
+ self, log_type: str, target_id: int, data_file_info: dict, status: ExportStatus, error: str | None = None
32
+ ):
33
+ """Log export file information.
34
+
35
+ Args:
36
+ log_type (str): The type of log ('export_data_file' or 'export_origin_file').
37
+ target_id (int): The ID of the data file.
38
+ data_file_info (dict): The JSON info of the data file.
39
+ status (ExportStatus): The status of the data file.
40
+ error (str | None): The error message, if any.
41
+ """
42
+ now = datetime.now().isoformat()
43
+ self.log(
44
+ log_type,
45
+ self.DataFileLog(
46
+ target_id=target_id,
47
+ data_file_info=json.dumps(data_file_info),
48
+ status=status.value,
49
+ error=error,
50
+ created=now,
51
+ ).model_dump(),
52
+ )
53
+
54
+ def export_log_json_file(
55
+ self,
56
+ target_id: int,
57
+ data_file_info: dict,
58
+ status: ExportStatus = ExportStatus.STAND_BY,
59
+ error: str | None = None,
60
+ ):
61
+ """Log export json data file."""
62
+ self.log_file('export_data_file', target_id, data_file_info, status, error)
63
+
64
+ def export_log_original_file(
65
+ self,
66
+ target_id: int,
67
+ data_file_info: dict,
68
+ status: ExportStatus = ExportStatus.STAND_BY,
69
+ error: str | None = None,
70
+ ):
71
+ """Log export origin data file."""
72
+ self.log_file('export_origin_file', target_id, data_file_info, status, error)
73
+
74
+
15
75
  class ExportTargetHandler(ABC):
16
76
  """
17
77
  Abstract base class for handling export targets.
@@ -153,6 +213,8 @@ class ExportParams(BaseModel):
153
213
  Parameters for the export action.
154
214
 
155
215
  Attributes:
216
+ name (str): The name of the action.
217
+ description (str | None): The description of the action.
156
218
  storage (int): The storage ID to save the exported data.
157
219
  save_original_file (bool): Whether to save the original file.
158
220
  path (str): The path to save the exported data.
@@ -160,6 +222,8 @@ class ExportParams(BaseModel):
160
222
  filter (dict): The filter criteria to apply.
161
223
  """
162
224
 
225
+ name: Annotated[str, AfterValidator(non_blank)]
226
+ description: str | None = None
163
227
  storage: int
164
228
  save_original_file: bool = True
165
229
  path: str
@@ -193,6 +257,7 @@ class ExportAction(Action):
193
257
  category = PluginCategory.EXPORT
194
258
  method = RunMethod.JOB
195
259
  params_model = ExportParams
260
+ run_class = ExportRun
196
261
  progress_categories = {
197
262
  'dataset_conversion': {
198
263
  'proportion': 100,
@@ -0,0 +1,7 @@
1
+ from enum import Enum
2
+
3
+
4
+ class ExportStatus(str, Enum):
5
+ SUCCESS = 'success'
6
+ FAILED = 'failed'
7
+ STAND_BY = 'stand_by'
@@ -3,6 +3,8 @@ from pathlib import Path
3
3
 
4
4
  import requests
5
5
 
6
+ from synapse_sdk.plugins.categories.export.enums import ExportStatus
7
+
6
8
 
7
9
  def export(run, export_items, path_root, **params):
8
10
  """Executes the export task.
@@ -54,12 +56,12 @@ def export(run, export_items, path_root, **params):
54
56
  if save_original_file_flag:
55
57
  if no == 1:
56
58
  run.log_message('Saving original file.')
57
- save_original_file(final_data, origin_files_output_path, errors_original_file_list)
59
+ save_original_file(run, final_data, origin_files_output_path, errors_original_file_list)
58
60
 
59
61
  # Extract data as JSON files
60
62
  if no == 1:
61
63
  run.log_message('Saving json file.')
62
- save_as_json(final_data, json_output_path, errors_json_file_list)
64
+ save_as_json(run, final_data, json_output_path, errors_json_file_list)
63
65
 
64
66
  run.end_log()
65
67
 
@@ -100,10 +102,11 @@ def get_original_file_pathlib(files):
100
102
  return Path(files['meta']['path_original'])
101
103
 
102
104
 
103
- def save_original_file(result, base_path, error_file_list):
105
+ def save_original_file(run, result, base_path, error_file_list):
104
106
  """Saves the original file.
105
107
 
106
108
  Args:
109
+ run : Execution object
107
110
  result (dict): API response data containing file information.
108
111
  base_path (Path): The directory where the file will be saved.
109
112
  error_file_list (list): A list to store error files.
@@ -111,17 +114,25 @@ def save_original_file(result, base_path, error_file_list):
111
114
  file_url = result['files']['url']
112
115
  file_name = get_original_file_pathlib(result['files']).name
113
116
  response = requests.get(file_url)
117
+ file_info = {'file_name': file_name}
118
+ error_msg = ''
114
119
  try:
115
120
  with (base_path / file_name).open('wb') as file:
116
121
  file.write(response.content)
122
+ status = ExportStatus.SUCCESS
117
123
  except Exception as e:
118
- error_file_list.append([file_name, str(e)])
124
+ error_msg = str(e)
125
+ error_file_list.append([file_name, error_msg])
126
+ status = ExportStatus.FAILED
127
+
128
+ run.export_log_original_file(result['id'], file_info, status, error_msg)
119
129
 
120
130
 
121
- def save_as_json(result, base_path, error_file_list):
131
+ def save_as_json(run, result, base_path, error_file_list):
122
132
  """Saves the data as a JSON file.
123
133
 
124
134
  Args:
135
+ run : Execution object
125
136
  result (dict): API response data containing file information.
126
137
  base_path (Path): The directory where the file will be saved.
127
138
  error_file_list (list): A list to store error files.
@@ -129,8 +140,15 @@ def save_as_json(result, base_path, error_file_list):
129
140
  # Default save file name: original file name
130
141
  file_name = get_original_file_pathlib(result['files']).stem
131
142
  json_data = result['data']
143
+ file_info = {'file_name': file_name}
144
+ error_msg = ''
132
145
  try:
133
146
  with (base_path / f'{file_name}.json').open('w', encoding='utf-8') as f:
134
147
  json.dump(json_data, f, indent=4, ensure_ascii=False)
148
+ status = ExportStatus.SUCCESS
135
149
  except Exception as e:
150
+ error_msg = str(e)
136
151
  error_file_list.append([f'{file_name}.json', str(e)])
152
+ status = ExportStatus.FAILED
153
+
154
+ run.export_log_json_file(result['id'], file_info, status, error_msg)
@@ -0,0 +1,268 @@
1
+ import copy
2
+ import tempfile
3
+ from pathlib import Path
4
+ from typing import Annotated, Optional
5
+
6
+ from pydantic import AfterValidator, BaseModel, field_validator
7
+ from pydantic_core import PydanticCustomError
8
+
9
+ from synapse_sdk.clients.exceptions import ClientError
10
+ from synapse_sdk.plugins.categories.decorators import register_action
11
+ from synapse_sdk.plugins.categories.neural_net.actions.train import TrainAction, TrainRun
12
+ from synapse_sdk.plugins.enums import PluginCategory, RunMethod
13
+ from synapse_sdk.utils.file import archive
14
+ from synapse_sdk.utils.module_loading import import_string
15
+ from synapse_sdk.utils.pydantic.validators import non_blank
16
+
17
+
18
+ class TuneRun(TrainRun):
19
+ is_tune = True
20
+ completed_samples = 0
21
+ num_samples = 0
22
+ checkpoint_output = None
23
+
24
+
25
+ class TuneConfig(BaseModel):
26
+ mode: Optional[str] = None
27
+ metric: Optional[str] = None
28
+ num_samples: int = 1
29
+ max_concurrent_trials: Optional[int] = None
30
+
31
+
32
+ class TuneParams(BaseModel):
33
+ name: Annotated[str, AfterValidator(non_blank)]
34
+ description: str
35
+ checkpoint: int | None
36
+ dataset: int
37
+ tune_config: TuneConfig
38
+
39
+ @field_validator('name')
40
+ @staticmethod
41
+ def unique_name(value, info):
42
+ action = info.context['action']
43
+ client = action.client
44
+ try:
45
+ job_exists = client.exists(
46
+ 'list_jobs',
47
+ params={
48
+ 'ids_ex': action.job_id,
49
+ 'category': 'neural_net',
50
+ 'job__action': 'tune',
51
+ 'is_active': True,
52
+ 'params': f'name:{value}',
53
+ },
54
+ )
55
+ assert not job_exists, '존재하는 튜닝 작업 이름입니다.'
56
+ except ClientError:
57
+ raise PydanticCustomError('client_error', '')
58
+ return value
59
+
60
+
61
+ @register_action
62
+ class TuneAction(TrainAction):
63
+ """
64
+ **Must read** Important notes before using Tune:
65
+
66
+ 1. Path to the model output (which is the return value of your train function)
67
+ should be set to the checkpoint_output attribute of the run object **before**
68
+ starting the training.
69
+ 2. Before exiting the training function, report the results to Tune.
70
+ 3. When using own tune.py, take note of the difference in the order of parameters.
71
+ tune() function starts with hyperparameter, run, dataset, checkpoint, **kwargs
72
+ whereas the train() function starts with run, dataset, hyperparameter, checkpoint, **kwargs.
73
+ ----
74
+ 1)
75
+ Set the output path for the checkpoint to export best model
76
+
77
+ output_path = Path('path/to/your/weights')
78
+ run.checkpoint_output = str(output_path)
79
+
80
+ 2)
81
+ Before exiting the training function, report the results to Tune.
82
+ The results_dict should contain the metrics you want to report.
83
+
84
+ Example: (In train function)
85
+ results_dict = {
86
+ "accuracy": accuracy,
87
+ "loss": loss,
88
+ # Add other metrics as needed
89
+ }
90
+ if hasattr(self.dm_run, 'is_tune') and self.dm_run.is_tune:
91
+ tune.report(results_dict, checkpoint=tune.Checkpoint.from_directory(self.dm_run.checkpoint_output))
92
+
93
+
94
+ 3)
95
+ tune() function takes hyperparameter, run, dataset, checkpoint, **kwargs in that order
96
+ whereas train() function takes run, dataset, hyperparameter, checkpoint, **kwargs in that order.
97
+
98
+ --------------------------------------------------------------------------------------------------------
99
+
100
+ **중요** Tune 사용 전 반드시 읽어야 할 사항들
101
+
102
+ 1. 본 플러그인의 train 함수에서, 학습을 진행하기 코드 전에
103
+ 결과 모델 파일의 경로(train함수의 리턴 값)을 checkpoint_output 속성에 설정해야 합니다.
104
+ 2. 학습이 종료되기 전에, 결과를 Tune에 보고해야 합니다.
105
+ 3. 플러그인에서 tune.py를 직접 생성해서 사용할 시, 매개변수의 순서가 다릅니다.
106
+
107
+ ----
108
+ 1)
109
+ 체크포인트를 설정할 경로를 지정합니다.
110
+ output_path = Path('path/to/your/weights')
111
+ run.checkpoint_output = str(output_path)
112
+
113
+ 2)
114
+ 학습이 종료되기 전에, 결과를 Tune에 보고합니다.
115
+ results_dict = {
116
+ "accuracy": accuracy,
117
+ "loss": loss,
118
+ # 필요한 다른 메트릭 추가
119
+ }
120
+ if hasattr(self.dm_run, 'is_tune') and self.dm_run.is_tune:
121
+ tune.report(results_dict, checkpoint=tune.Checkpoint.from_directory(self.dm_run.checkpoint_output))
122
+
123
+ 3)
124
+ tune() 함수는 hyperparameter, run, dataset, checkpoint, **kwargs 순서이고
125
+ train() 함수는 run, dataset, hyperparameter, checkpoint, **kwargs 순서입니다.
126
+ """
127
+
128
+ name = 'tune'
129
+ category = PluginCategory.NEURAL_NET
130
+ method = RunMethod.JOB
131
+ run_class = TuneRun
132
+ params_model = TuneParams
133
+ progress_categories = {
134
+ 'dataset': {
135
+ 'proportion': 5,
136
+ },
137
+ 'trials': {
138
+ 'proportion': 90,
139
+ },
140
+ 'model_upload': {
141
+ 'proportion': 5,
142
+ },
143
+ }
144
+
145
+ def start(self):
146
+ from ray import tune
147
+
148
+ # download dataset
149
+ self.run.log_message('Preparing dataset for hyperparameter tuning.')
150
+ input_dataset = self.get_dataset()
151
+
152
+ # retrieve checkpoint
153
+ checkpoint = None
154
+ if self.params['checkpoint']:
155
+ self.run.log_message('Retrieving checkpoint.')
156
+ checkpoint = self.get_model(self.params['checkpoint'])
157
+
158
+ # train dataset
159
+ self.run.log_message('Starting training for hyperparameter tuning.')
160
+
161
+ # Save num_samples to TuneRun for logging
162
+ self.run.num_samples = self.params['tune_config']['num_samples']
163
+
164
+ entrypoint = self.entrypoint
165
+ if not self._tune_override_exists():
166
+ # entrypoint must be train entrypoint
167
+ def _tune(param_space, run, dataset, checkpoint=None, **kwargs):
168
+ return entrypoint(run, dataset, param_space, checkpoint, **kwargs)
169
+
170
+ entrypoint = _tune
171
+
172
+ trainable = tune.with_parameters(entrypoint, run=self.run, dataset=input_dataset, checkpoint=checkpoint)
173
+ tune_config = self.params['tune_config']
174
+
175
+ hyperparameter = self.params['hyperparameter']
176
+ param_space = self.convert_tune_params(hyperparameter)
177
+ temp_path = tempfile.TemporaryDirectory()
178
+
179
+ tuner = tune.Tuner(
180
+ tune.with_resources(trainable, resources=self.tune_resources),
181
+ tune_config=tune.TuneConfig(**tune_config),
182
+ run_config=tune.RunConfig(
183
+ name=f'synapse_tune_hpo_{self.job_id}',
184
+ log_to_file=('stdout.log', 'stderr.log'),
185
+ storage_path=temp_path.name,
186
+ ),
187
+ param_space=param_space,
188
+ )
189
+ result = tuner.fit()
190
+
191
+ best_result = result.get_best_result()
192
+
193
+ # upload model_data
194
+ self.run.log_message('Registering best model data.')
195
+ self.run.set_progress(0, 1, category='model_upload')
196
+ self.create_model_from_result(best_result)
197
+ self.run.set_progress(1, 1, category='model_upload')
198
+
199
+ self.run.end_log()
200
+
201
+ return {'best_result': best_result.config}
202
+
203
+ @property
204
+ def tune_resources(self):
205
+ resources = {}
206
+ for option in ['num_cpus', 'num_gpus']:
207
+ option_value = self.params.get(option)
208
+ if option_value:
209
+ # Remove the 'num_' prefix and trailing s from the option name
210
+ resources[(lambda s: s[4:-1])(option)] = option_value
211
+ return resources
212
+
213
+ def create_model_from_result(self, result):
214
+ params = copy.deepcopy(self.params)
215
+ configuration_fields = ['hyperparameter']
216
+ configuration = {field: params.pop(field) for field in configuration_fields}
217
+
218
+ with tempfile.TemporaryDirectory() as temp_path:
219
+ archive_path = Path(temp_path, 'archive.zip')
220
+
221
+ # Archive tune results
222
+ # https://docs.ray.io/en/latest/tune/tutorials/tune_get_data_in_and_out.html#getting-data-out-of-tune-using-checkpoints-other-artifacts
223
+ archive(result.path, archive_path)
224
+
225
+ return self.client.create_model({
226
+ 'plugin': self.plugin_release.plugin,
227
+ 'version': self.plugin_release.version,
228
+ 'file': str(archive_path),
229
+ 'configuration': configuration,
230
+ **params,
231
+ })
232
+
233
+ @staticmethod
234
+ def convert_tune_params(param_list):
235
+ """
236
+ Convert YAML hyperparameter configuration to Ray Tune parameter dictionary.
237
+
238
+ Args:
239
+ param_list (list): List of hyperparameter configurations.
240
+
241
+ Returns:
242
+ dict: Ray Tune parameter dictionary
243
+ """
244
+ from ray import tune
245
+
246
+ param_space = {}
247
+
248
+ for param in param_list:
249
+ name = param['name']
250
+ param_type = param['type']
251
+
252
+ if param_type == 'loguniform':
253
+ param_space[name] = tune.loguniform(param['min'], param['max'])
254
+ elif param_type == 'choice':
255
+ param_space[name] = tune.choice(param['options'])
256
+ elif param_type == 'randint':
257
+ param_space[name] = tune.randint(param['min'], param['max'])
258
+ # Add more type handlers as needed
259
+
260
+ return param_space
261
+
262
+ @staticmethod
263
+ def _tune_override_exists(module_path='plugin.tune') -> bool:
264
+ try:
265
+ import_string(module_path)
266
+ return True
267
+ except ImportError:
268
+ return False