synapse-sdk 1.0.0a9__tar.gz → 1.0.0a11__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 (128) hide show
  1. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/.github/workflows/pypi-publish.yml +4 -0
  2. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/.gitignore +3 -0
  3. {synapse_sdk-1.0.0a9/synapse_sdk.egg-info → synapse_sdk-1.0.0a11}/PKG-INFO +22 -1
  4. synapse_sdk-1.0.0a11/README.md +22 -0
  5. synapse_sdk-1.0.0a11/locale/en/LC_MESSAGES/messages.mo +0 -0
  6. synapse_sdk-1.0.0a11/locale/en/LC_MESSAGES/messages.po +39 -0
  7. synapse_sdk-1.0.0a11/locale/ko/LC_MESSAGES/messages.mo +0 -0
  8. synapse_sdk-1.0.0a11/locale/ko/LC_MESSAGES/messages.po +34 -0
  9. synapse_sdk-1.0.0a11/pyproject.toml +55 -0
  10. synapse_sdk-1.0.0a11/synapse_sdk/clients/agent/__init__.py +51 -0
  11. synapse_sdk-1.0.0a9/synapse_sdk/clients/agent/service.py → synapse_sdk-1.0.0a11/synapse_sdk/clients/agent/ray.py +13 -13
  12. synapse_sdk-1.0.0a11/synapse_sdk/clients/agent/service.py +15 -0
  13. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/clients/backend/integration.py +4 -0
  14. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/clients/backend/ml.py +4 -0
  15. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/clients/base.py +3 -0
  16. synapse_sdk-1.0.0a11/synapse_sdk/clients/ray/__init__.py +6 -0
  17. synapse_sdk-1.0.0a11/synapse_sdk/clients/ray/core.py +22 -0
  18. synapse_sdk-1.0.0a11/synapse_sdk/clients/ray/serve.py +20 -0
  19. synapse_sdk-1.0.0a11/synapse_sdk/i18n.py +35 -0
  20. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/loggers.py +3 -3
  21. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/categories/base.py +37 -9
  22. synapse_sdk-1.0.0a11/synapse_sdk/plugins/categories/neural_net/actions/deployment.py +45 -0
  23. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/categories/neural_net/actions/inference.py +8 -0
  24. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/categories/neural_net/actions/train.py +7 -6
  25. synapse_sdk-1.0.0a11/synapse_sdk/plugins/categories/smart_tool/actions/auto_label.py +37 -0
  26. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/categories/smart_tool/templates/config.yaml +1 -0
  27. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/cli/__init__.py +3 -1
  28. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/cli/publish.py +2 -1
  29. synapse_sdk-1.0.0a11/synapse_sdk/plugins/exceptions.py +22 -0
  30. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/models.py +26 -7
  31. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/upload.py +2 -1
  32. synapse_sdk-1.0.0a11/synapse_sdk/shared/enums.py +8 -0
  33. synapse_sdk-1.0.0a11/synapse_sdk/utils/debug.py +5 -0
  34. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/utils/file.py +2 -0
  35. synapse_sdk-1.0.0a11/synapse_sdk/utils/pydantic/__init__.py +0 -0
  36. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11/synapse_sdk.egg-info}/PKG-INFO +22 -1
  37. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk.egg-info/SOURCES.txt +13 -0
  38. synapse_sdk-1.0.0a9/README.md +0 -1
  39. synapse_sdk-1.0.0a9/pyproject.toml +0 -49
  40. synapse_sdk-1.0.0a9/synapse_sdk/clients/agent/__init__.py +0 -23
  41. synapse_sdk-1.0.0a9/synapse_sdk/plugins/categories/neural_net/actions/deployment.py +0 -24
  42. synapse_sdk-1.0.0a9/synapse_sdk/plugins/categories/smart_tool/actions/auto_label.py +0 -22
  43. synapse_sdk-1.0.0a9/synapse_sdk/plugins/exceptions.py +0 -6
  44. synapse_sdk-1.0.0a9/synapse_sdk/utils/debug.py +0 -2
  45. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/.github/workflows/lint.yml +0 -0
  46. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/.pre-commit-config.yaml +0 -0
  47. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/LICENSE +0 -0
  48. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/requirements.txt +0 -0
  49. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/setup.cfg +0 -0
  50. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/__init__.py +0 -0
  51. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/cli/__init__.py +0 -0
  52. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/cli/create_plugin.py +0 -0
  53. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/clients/__init__.py +0 -0
  54. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/clients/agent/core.py +0 -0
  55. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/clients/backend/__init__.py +0 -0
  56. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/clients/backend/annotation.py +0 -0
  57. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/clients/backend/dataset.py +0 -0
  58. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/clients/exceptions.py +0 -0
  59. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/clients/utils.py +0 -0
  60. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/__init__.py +0 -0
  61. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/categories/__init__.py +0 -0
  62. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/categories/data_validation/__init__.py +0 -0
  63. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/categories/data_validation/actions/__init__.py +0 -0
  64. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/categories/data_validation/actions/validation.py +0 -0
  65. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/categories/data_validation/templates/config.yaml +0 -0
  66. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/categories/data_validation/templates/plugin/__init__.py +0 -0
  67. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/categories/data_validation/templates/plugin/validation.py +0 -0
  68. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/categories/decorators.py +0 -0
  69. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/categories/export/__init__.py +0 -0
  70. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/categories/export/actions/__init__.py +0 -0
  71. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/categories/export/actions/export.py +0 -0
  72. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/categories/import/__init__.py +0 -0
  73. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/categories/import/actions/__init__.py +0 -0
  74. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/categories/import/actions/import.py +0 -0
  75. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/categories/neural_net/__init__.py +0 -0
  76. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/categories/neural_net/actions/__init__.py +0 -0
  77. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/categories/neural_net/actions/test.py +0 -0
  78. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/categories/neural_net/templates/config.yaml +0 -0
  79. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/categories/neural_net/templates/plugin/__init__.py +0 -0
  80. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/categories/neural_net/templates/plugin/inference.py +0 -0
  81. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/categories/neural_net/templates/plugin/test.py +0 -0
  82. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/categories/neural_net/templates/plugin/train.py +0 -0
  83. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/categories/post_annotation/__init__.py +0 -0
  84. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/categories/post_annotation/actions/__init__.py +0 -0
  85. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/categories/post_annotation/actions/post_annotation.py +0 -0
  86. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/categories/post_annotation/templates/config.yaml +0 -0
  87. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/categories/post_annotation/templates/plugin/__init__.py +0 -0
  88. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/categories/post_annotation/templates/plugin/post_annotation.py +0 -0
  89. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/categories/pre_annotation/__init__.py +0 -0
  90. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/categories/pre_annotation/actions/__init__.py +0 -0
  91. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/categories/pre_annotation/actions/pre_annotation.py +0 -0
  92. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/categories/pre_annotation/templates/config.yaml +0 -0
  93. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/categories/pre_annotation/templates/plugin/__init__.py +0 -0
  94. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/categories/pre_annotation/templates/plugin/pre_annotation.py +0 -0
  95. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/categories/registry.py +0 -0
  96. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/categories/smart_tool/__init__.py +0 -0
  97. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/categories/smart_tool/actions/__init__.py +0 -0
  98. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/categories/smart_tool/templates/plugin/__init__.py +0 -0
  99. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/categories/smart_tool/templates/plugin/auto_label.py +0 -0
  100. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/categories/templates.py +0 -0
  101. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/cli/run.py +0 -0
  102. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/enums.py +0 -0
  103. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/templates/cookiecutter.json +0 -0
  104. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/templates/hooks/post_gen_project.py +0 -0
  105. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/templates/hooks/pre_prompt.py +0 -0
  106. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/.env +0 -0
  107. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/.env.dist +0 -0
  108. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/.gitignore +0 -0
  109. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/.pre-commit-config.yaml +0 -0
  110. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/README.md +0 -0
  111. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/config.yaml +0 -0
  112. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/main.py +0 -0
  113. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/plugin/__init__.py +0 -0
  114. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/pyproject.toml +0 -0
  115. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/requirements.txt +0 -0
  116. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/plugins/utils.py +0 -0
  117. {synapse_sdk-1.0.0a9/synapse_sdk/utils → synapse_sdk-1.0.0a11/synapse_sdk/shared}/__init__.py +0 -0
  118. {synapse_sdk-1.0.0a9/synapse_sdk/utils/pydantic → synapse_sdk-1.0.0a11/synapse_sdk/utils}/__init__.py +0 -0
  119. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/utils/module_loading.py +0 -0
  120. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/utils/pydantic/config.py +0 -0
  121. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/utils/pydantic/errors.py +0 -0
  122. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/utils/pydantic/validators.py +0 -0
  123. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/utils/storage.py +0 -0
  124. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk/utils/string.py +0 -0
  125. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk.egg-info/dependency_links.txt +0 -0
  126. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk.egg-info/entry_points.txt +0 -0
  127. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk.egg-info/requires.txt +0 -0
  128. {synapse_sdk-1.0.0a9 → synapse_sdk-1.0.0a11}/synapse_sdk.egg-info/top_level.txt +0 -0
@@ -27,6 +27,10 @@ jobs:
27
27
  run: |
28
28
  python -m pip install --upgrade pip
29
29
  pip install build
30
+ - name: Compile i18n messages
31
+ run : |
32
+ msgfmt locale/ko/LC_MESSAGES/messages.po -o locale/ko/LC_MESSAGES/messages.mo
33
+ msgfmt locale/en/LC_MESSAGES/messages.po -o locale/en/LC_MESSAGES/messages.mo
30
34
  - name: Build package
31
35
  run: python -m build
32
36
  - name: Store the distribution packages
@@ -26,3 +26,6 @@ __pycache__/
26
26
 
27
27
  # python
28
28
  /main.py
29
+
30
+ *.mo
31
+ messages.pot
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: synapse-sdk
3
- Version: 1.0.0a9
3
+ Version: 1.0.0a11
4
4
  Summary: synapse sdk
5
5
  Author-email: datamaker <developer@datamaker.io>
6
6
  License: MIT
@@ -20,3 +20,24 @@ Provides-Extra: all
20
20
  Requires-Dist: ray[all]; extra == "all"
21
21
 
22
22
  This is the SDK to develop synapse plugins
23
+
24
+
25
+ ## Internationalization
26
+
27
+ ### Find Messages
28
+ ```bash
29
+ $ find . -name "*.py" | xargs xgettext -o messages.pot
30
+ ```
31
+
32
+ ### Make Messages
33
+ ```bash
34
+ $ msginit -l ko -i messages.pot -o locale/ko/LC_MESSAGES/messages.po
35
+ $ msginit -l en -i messages.pot -o locale/en/LC_MESSAGES/messages.po
36
+ ```
37
+
38
+ ### Compile Messages
39
+
40
+ ```bash
41
+ $ msgfmt locale/ko/LC_MESSAGES/messages.po -o locale/ko/LC_MESSAGES/messages.mo
42
+ $ msgfmt locale/en/LC_MESSAGES/messages.po -o locale/en/LC_MESSAGES/messages.mo
43
+ ```
@@ -0,0 +1,22 @@
1
+ This is the SDK to develop synapse plugins
2
+
3
+
4
+ ## Internationalization
5
+
6
+ ### Find Messages
7
+ ```bash
8
+ $ find . -name "*.py" | xargs xgettext -o messages.pot
9
+ ```
10
+
11
+ ### Make Messages
12
+ ```bash
13
+ $ msginit -l ko -i messages.pot -o locale/ko/LC_MESSAGES/messages.po
14
+ $ msginit -l en -i messages.pot -o locale/en/LC_MESSAGES/messages.po
15
+ ```
16
+
17
+ ### Compile Messages
18
+
19
+ ```bash
20
+ $ msgfmt locale/ko/LC_MESSAGES/messages.po -o locale/ko/LC_MESSAGES/messages.mo
21
+ $ msgfmt locale/en/LC_MESSAGES/messages.po -o locale/en/LC_MESSAGES/messages.mo
22
+ ```
@@ -0,0 +1,39 @@
1
+ # English translations for PACKAGE package.
2
+ # Copyright (C) 2024 THE PACKAGE'S COPYRIGHT HOLDER
3
+ # This file is distributed under the same license as the PACKAGE package.
4
+ # <developer@datamaker.io>, 2024.
5
+ #
6
+ msgid ""
7
+ msgstr ""
8
+ "Project-Id-Version: PACKAGE VERSION\n"
9
+ "Report-Msgid-Bugs-To: \n"
10
+ "POT-Creation-Date: 2024-11-27 16:15+0900\n"
11
+ "PO-Revision-Date: 2024-11-27 16:17+0900\n"
12
+ "Last-Translator: <developer@datamaker.io>\n"
13
+ "Language-Team: English\n"
14
+ "Language: en\n"
15
+ "MIME-Version: 1.0\n"
16
+ "Content-Type: text/plain; charset=UTF-8\n"
17
+ "Content-Transfer-Encoding: 8bit\n"
18
+ "Plural-Forms: nplurals=2; plural=(n != 1);\n"
19
+
20
+ #: synapse_sdk/utils/debug.py:5
21
+ msgid "hello world from sdk"
22
+ msgstr "hello world from sdk"
23
+
24
+ #: synapse_sdk/plugins/cli/publish.py:34
25
+ #, python-brace-format
26
+ msgid ""
27
+ "Successfully published \"{plugin_release.name}\" ({plugin_release.code}) to "
28
+ "synapse backend!"
29
+ msgstr ""
30
+ "Successfully published \"{plugin_release.name}\" ({plugin_release.code}) to "
31
+ "synapse backend!"
32
+
33
+ #: synapse_sdk/plugins/cli/__init__.py:15
34
+ msgid "Debug mode is \"on\""
35
+ msgstr "Debug mode is \"on\""
36
+
37
+ #: synapse_sdk/plugins/upload.py:62
38
+ msgid "Building {Path(source_path).name}..."
39
+ msgstr "Building {Path(source_path).name}..."
@@ -0,0 +1,34 @@
1
+ # Korean translations for PACKAGE package.
2
+ # Copyright (C) 2024 THE PACKAGE'S COPYRIGHT HOLDER
3
+ # This file is distributed under the same license as the PACKAGE package.
4
+ # <developer@datamaker.io>, 2024.
5
+ #
6
+ msgid ""
7
+ msgstr ""
8
+ "Project-Id-Version: PACKAGE VERSION\n"
9
+ "Report-Msgid-Bugs-To: \n"
10
+ "POT-Creation-Date: 2024-11-27 17:16+0900\n"
11
+ "PO-Revision-Date: 2024-11-27 17:16+0900\n"
12
+ "Last-Translator: <developer@datamaker.io>\n"
13
+ "Language-Team: Korean <translation-team-ko@googlegroups.com>\n"
14
+ "Language: ko\n"
15
+ "MIME-Version: 1.0\n"
16
+ "Content-Type: text/plain; charset=UTF-8\n"
17
+ "Content-Transfer-Encoding: 8bit\n"
18
+ "Plural-Forms: nplurals=1; plural=0;\n"
19
+
20
+ #: synapse_sdk/utils/debug.py:5
21
+ msgid "hello world from sdk"
22
+ msgstr ""
23
+
24
+ #: synapse_sdk/plugins/cli/publish.py:34
25
+ msgid "Successfully published \"{}\" ({}) to synapse backend!"
26
+ msgstr "Synapse 백엔드에 \"{}\" ({})를 성공적으로 등록되었습니다!"
27
+
28
+ #: synapse_sdk/plugins/cli/__init__.py:17
29
+ msgid "Debug mode is \"on\""
30
+ msgstr "디버그 모드가 \"켜짐\" 상태입니다"
31
+
32
+ #: synapse_sdk/plugins/upload.py:63
33
+ msgid "Building {}..."
34
+ msgstr "{} 빌드 중..."
@@ -0,0 +1,55 @@
1
+ [build-system]
2
+ requires = ["setuptools>=64", "setuptools-scm>=8"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "synapse-sdk"
7
+ authors = [{ name = "datamaker", email = "developer@datamaker.io" }]
8
+ description = "synapse sdk"
9
+ readme = { file = "README.md", content-type = "text/markdown" }
10
+ requires-python = ">=3.11"
11
+ license = { text = "MIT" }
12
+ classifiers = [
13
+ "Programming Language :: Python :: 3",
14
+ ]
15
+ dependencies = [
16
+ "boto3",
17
+ "click",
18
+ "cookiecutter",
19
+ "requests",
20
+ "tqdm",
21
+ "python-dotenv",
22
+ "pyyaml",
23
+ "pydantic",
24
+ ]
25
+ dynamic = ["version"]
26
+
27
+ [project.optional-dependencies]
28
+ all = [
29
+ "ray[all]"
30
+ ]
31
+
32
+ [project.scripts]
33
+ synapse = "synapse_sdk.cli:cli"
34
+
35
+ [tool.setuptools]
36
+ packages = ["synapse_sdk"]
37
+
38
+ [tool.setuptools.package-data]
39
+ "synapse_sdk" = ["../locale/**/*"]
40
+
41
+ [tool.setuptools_scm]
42
+
43
+ [tool.ruff]
44
+ line-length = 120
45
+
46
+ [tool.ruff.lint]
47
+ select = ["E", "F", "I", "Q"]
48
+ ignore = ["W191", "E111", "E114", "E117", "D206", "D300", "Q000", "Q001", "Q002", "Q003", "COM812", "COM819", "ISC001", "ISC002"]
49
+
50
+ [tool.ruff.lint.pydocstyle]
51
+ convention = "google"
52
+
53
+ [tool.ruff.format]
54
+ quote-style = "single"
55
+ preview = true
@@ -0,0 +1,51 @@
1
+ from synapse_sdk.clients.agent.core import CoreClientMixin
2
+ from synapse_sdk.clients.agent.ray import RayClientMixin
3
+ from synapse_sdk.clients.agent.service import ServiceClientMixin
4
+ from synapse_sdk.clients.exceptions import ClientError
5
+
6
+
7
+ class AgentClient(CoreClientMixin, RayClientMixin, ServiceClientMixin):
8
+ name = 'Agent'
9
+ agent_token = None
10
+ user_token = None
11
+ tenant = None
12
+ long_poll_handler = None
13
+
14
+ def __init__(self, base_url, agent_token, user_token=None, tenant=None, long_poll_handler=None):
15
+ super().__init__(base_url)
16
+ self.agent_token = agent_token
17
+ self.user_token = user_token
18
+ self.tenant = tenant
19
+ self.long_poll_handler = long_poll_handler
20
+
21
+ def _get_headers(self):
22
+ headers = {'Authorization': self.agent_token}
23
+ if self.user_token:
24
+ headers['SYNAPSE-User'] = f'Token {self.user_token}'
25
+ if self.tenant:
26
+ headers['SYNAPSE-Tenant'] = f'Token {self.tenant}'
27
+ return headers
28
+
29
+ def _request(self, method, path, **kwargs):
30
+ if self.long_poll_handler:
31
+ return self._request_long_poll(method, path, **kwargs)
32
+ return super()._request(method, path, **kwargs)
33
+
34
+ def _request_long_poll(self, method, path, **kwargs):
35
+ headers = self._get_headers()
36
+
37
+ if kwargs.get('files'):
38
+ raise ClientError(400, 'file is not allowed when long polling')
39
+
40
+ headers['Content-Type'] = 'application/json'
41
+
42
+ request_id = self.long_poll_handler.set_request({'method': method, 'path': path, 'headers': headers, **kwargs})
43
+ try:
44
+ response = self.long_poll_handler.get_response(request_id)
45
+ except TimeoutError:
46
+ raise ClientError(408, f'{self.name} is not responding')
47
+
48
+ if 400 <= response['status'] < 600:
49
+ raise ClientError(response['status'], response.json() if response['status'] == 400 else response['reason'])
50
+
51
+ return response['data']
@@ -1,19 +1,8 @@
1
1
  from synapse_sdk.clients.base import BaseClient
2
+ from synapse_sdk.clients.exceptions import ClientError
2
3
 
3
4
 
4
- class ServiceClientMixin(BaseClient):
5
- def run_plugin_release(self, code, data):
6
- path = f'plugin_releases/{code}/run/'
7
- return self._post(path, data=data)
8
-
9
- def run_debug_plugin_release(self, data):
10
- path = 'plugin_releases/run_debug/'
11
- return self._post(path, data=data)
12
-
13
- def create_plugin_release(self, data):
14
- path = 'plugin_releases/'
15
- return self._post(path, data=data)
16
-
5
+ class RayClientMixin(BaseClient):
17
6
  def get_job(self, pk):
18
7
  path = f'jobs/{pk}/'
19
8
  return self._get(path)
@@ -27,6 +16,9 @@ class ServiceClientMixin(BaseClient):
27
16
  return self._get(path)
28
17
 
29
18
  def tail_job_logs(self, pk):
19
+ if self.long_poll_handler:
20
+ raise ClientError(400, '"tail_job_logs" does not support long polling')
21
+
30
22
  path = f'jobs/{pk}/tail_logs/'
31
23
 
32
24
  url = self._get_url(path)
@@ -52,3 +44,11 @@ class ServiceClientMixin(BaseClient):
52
44
  def list_tasks(self):
53
45
  path = 'tasks/'
54
46
  return self._get(path)
47
+
48
+ def get_serve_application(self, pk):
49
+ path = f'serve_application/{pk}/'
50
+ return self._get(path)
51
+
52
+ def list_serve_applications(self):
53
+ path = 'serve_applications/'
54
+ return self._get(path)
@@ -0,0 +1,15 @@
1
+ from synapse_sdk.clients.base import BaseClient
2
+
3
+
4
+ class ServiceClientMixin(BaseClient):
5
+ def run_plugin_release(self, code, data):
6
+ path = f'plugin_releases/{code}/run/'
7
+ return self._post(path, data=data)
8
+
9
+ def run_debug_plugin_release(self, data):
10
+ path = 'plugin_releases/run_debug/'
11
+ return self._post(path, data=data)
12
+
13
+ def create_plugin_release(self, data):
14
+ path = 'plugin_releases/'
15
+ return self._post(path, data=data)
@@ -31,6 +31,10 @@ class IntegrationClientMixin(BaseClient):
31
31
  files = {'file': data.pop('file')}
32
32
  return self._post(path, data=data, files=files)
33
33
 
34
+ def get_job(self, pk, params=None):
35
+ path = f'jobs/{pk}/'
36
+ return self._get(path, params=params)
37
+
34
38
  def list_jobs(self, params=None):
35
39
  path = 'jobs/'
36
40
  return self._get(path, params=params)
@@ -19,6 +19,10 @@ class MLClientMixin(BaseClient):
19
19
  files = {'file': data.pop('file')}
20
20
  return self._post(path, data=data, files=files)
21
21
 
22
+ def create_serve_application(self, data):
23
+ path = 'serve_applications/'
24
+ return self._post(path, data=data)
25
+
22
26
  def list_ground_truth_events(self, params=None, url_conversion=None, list_all=False):
23
27
  path = 'ground_truth_events/'
24
28
  url_conversion = get_default_url_conversion(url_conversion, files_fields=['files'])
@@ -50,6 +50,9 @@ class BaseClient:
50
50
  except requests.ConnectionError:
51
51
  raise ClientError(408, f'{self.name} is not responding')
52
52
 
53
+ return self._post_response(response)
54
+
55
+ def _post_response(self, response):
53
56
  try:
54
57
  return response.json()
55
58
  except ValueError:
@@ -0,0 +1,6 @@
1
+ from synapse_sdk.clients.ray.core import CoreClientMixin
2
+ from synapse_sdk.clients.ray.serve import ServeClientMixin
3
+
4
+
5
+ class RayClient(ServeClientMixin, CoreClientMixin):
6
+ name = 'Ray'
@@ -0,0 +1,22 @@
1
+ from synapse_sdk.clients.base import BaseClient
2
+ from synapse_sdk.clients.exceptions import ClientError
3
+
4
+
5
+ class CoreClientMixin(BaseClient):
6
+ def list_nodes(self, params=None):
7
+ path = 'nodes'
8
+ response = self._get(path, params=params)
9
+ if not response['result']:
10
+ raise ClientError(200, response['msg'])
11
+ return response['data']['summary']
12
+
13
+ def get_node(self, pk, params=None):
14
+ path = f'nodes/{pk}'
15
+ response = self._get(path, params=params)['detail']
16
+
17
+ if not response['result']:
18
+ raise ClientError(200, response['msg'])
19
+
20
+ if 'agent' not in response['data']:
21
+ raise ClientError(404, 'Node Not Found')
22
+ return response['data']
@@ -0,0 +1,20 @@
1
+ from synapse_sdk.clients.base import BaseClient
2
+ from synapse_sdk.clients.exceptions import ClientError
3
+
4
+
5
+ class ServeClientMixin(BaseClient):
6
+ def list_serve_applications(self, params=None):
7
+ path = 'api/serve/applications/'
8
+ response = self._get(path, params=params)
9
+ for key, item in response['applications'].items():
10
+ response['applications'][key]['deployments'] = list(item['deployments'].values())
11
+ return list(response['applications'].values())
12
+
13
+ def get_serve_application(self, pk, params=None):
14
+ path = 'api/serve/applications/'
15
+ response = self._get(path, params=params)
16
+ try:
17
+ response['applications'][pk]['deployments'] = list(response['applications'][pk]['deployments'].values())
18
+ return response['applications'][pk]
19
+ except KeyError:
20
+ raise ClientError(404, 'Serve Application Not Found')
@@ -0,0 +1,35 @@
1
+ import gettext as _gettext
2
+ import locale
3
+ from pathlib import Path
4
+
5
+ ASSIGNED_LOCALE = None
6
+
7
+
8
+ def set_language(language):
9
+ ASSIGNED_LOCALE = language # noqa: F841
10
+
11
+
12
+ def get_locale():
13
+ if ASSIGNED_LOCALE is not None:
14
+ return ASSIGNED_LOCALE
15
+
16
+ system_locale, encoding = locale.getlocale()
17
+
18
+ if system_locale is None:
19
+ system_locale = 'en'
20
+
21
+ return system_locale
22
+
23
+
24
+ language = get_locale().split('_')[0]
25
+
26
+ PACKAGE_DIR = Path(__file__).parent
27
+ LOCALE_DIR = PACKAGE_DIR.parent / 'locale'
28
+
29
+ translation = _gettext.translation('messages', localedir=LOCALE_DIR, languages=[language], fallback=True)
30
+ translation.install()
31
+
32
+ gettext = translation.gettext
33
+ ngettext = translation.ngettext
34
+ pgettext = translation.pgettext
35
+ npgettext = translation.npgettext
@@ -99,11 +99,11 @@ class BackendLogger(BaseLogger):
99
99
  except ClientError:
100
100
  pass
101
101
 
102
- def log(self, action, data):
103
- print(action, data)
102
+ def log(self, event, data):
103
+ print(event, data)
104
104
 
105
105
  log = {
106
- 'action': action,
106
+ 'event': event,
107
107
  'data': data,
108
108
  'datetime': datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f'),
109
109
  'job': self.job_id,
@@ -8,9 +8,11 @@ import ray
8
8
  import requests
9
9
  from pydantic import ValidationError
10
10
  from ray.dashboard.modules.job.sdk import JobSubmissionClient
11
+ from ray.exceptions import RayTaskError
11
12
 
13
+ from synapse_sdk.clients.ray import RayClient
12
14
  from synapse_sdk.plugins.enums import RunMethod
13
- from synapse_sdk.plugins.exceptions import ActionValidationError
15
+ from synapse_sdk.plugins.exceptions import ActionError
14
16
  from synapse_sdk.plugins.models import PluginRelease, Run
15
17
  from synapse_sdk.plugins.upload import archive_and_upload, build_and_upload, download_and_upload
16
18
  from synapse_sdk.utils.module_loading import import_string
@@ -38,6 +40,7 @@ class Action:
38
40
  run = None
39
41
 
40
42
  default_envs = [
43
+ 'RAY_ADDRESS',
41
44
  'RAY_DASHBOARD_URL',
42
45
  'RAY_SERVE_ADDRESS',
43
46
  'SYNAPSE_PLUGIN_STORAGE',
@@ -56,7 +59,7 @@ class Action:
56
59
  self.job_id = job_id
57
60
  self.direct = direct
58
61
  self.debug = debug
59
- self.envs = {**envs, **self.get_default_envs()} if envs else self.get_default_envs()
62
+ self.envs = {**self.get_default_envs(), **envs} if envs else self.get_default_envs()
60
63
  self.run = self.get_run()
61
64
 
62
65
  @cached_property
@@ -71,6 +74,10 @@ class Action:
71
74
  def client(self):
72
75
  return self.run.client
73
76
 
77
+ @property
78
+ def ray_client(self):
79
+ return RayClient(self.envs['RAY_DASHBOARD_URL'])
80
+
74
81
  @property
75
82
  def plugin_url(self):
76
83
  if self.debug:
@@ -131,10 +138,14 @@ class Action:
131
138
  try:
132
139
  self.params_model.model_validate(self.params, context={'action': self})
133
140
  except ValidationError as e:
134
- raise ActionValidationError({'params': pydantic_to_drf_error(e)})
141
+ raise ActionError({'params': pydantic_to_drf_error(e)})
135
142
 
136
143
  def run_action(self):
137
144
  self.validate_params()
145
+
146
+ if not ray.is_initialized():
147
+ ray.init(address=self.envs['RAY_ADDRESS'], ignore_reinit_error=True)
148
+
138
149
  if self.direct:
139
150
  if self.method == RunMethod.RESTAPI:
140
151
  return self.start_by_restapi()
@@ -171,7 +182,10 @@ class Action:
171
182
  kwargs[param.name] = getattr(self, param.name)
172
183
 
173
184
  kwargs['direct'] = True
174
- return ray.get(run_task.remote(self.category.value, self.name, *args, **kwargs))
185
+ try:
186
+ return ray.get(run_task.remote(self.category.value, self.name, *args, **kwargs))
187
+ except RayTaskError as e:
188
+ raise ActionError(e.cause)
175
189
 
176
190
  def start_by_job(self):
177
191
  main_options = []
@@ -186,7 +200,7 @@ class Action:
186
200
 
187
201
  cmd = ' '.join(main_options + options + arguments)
188
202
 
189
- client = JobSubmissionClient(address=self.envs.get('RAY_DASHBOARD_URL'))
203
+ client = self.get_job_client()
190
204
  return client.submit_job(
191
205
  submission_id=self.job_id,
192
206
  entrypoint=f'python main.py {cmd}',
@@ -198,10 +212,24 @@ class Action:
198
212
  method = self.params.pop('method')
199
213
 
200
214
  url = self.plugin_release.get_serve_url(self.envs['RAY_SERVE_ADDRESS'], path)
201
- response = getattr(requests, method)(url, **self.params)
202
- # TODO ok response가 아닌 경우 대응하기
203
- return response.json()
215
+ try:
216
+ response = getattr(requests, method)(url, **self.params)
217
+ try:
218
+ response_body = response.json()
219
+ except ValueError:
220
+ response_body = response.text
221
+ if response.ok:
222
+ return response_body
223
+ else:
224
+ raise ActionError({'status': response.status_code, 'reason': response.reason, 'message': response_body})
225
+ except requests.ConnectionError:
226
+ raise ActionError('Unable to connect to serve application')
204
227
 
205
228
  def post_action_by_job(self, result):
206
229
  if self.client:
207
- self.client.update_job(self.job_id, data={'result': result})
230
+ job_client = self.get_job_client()
231
+ logs = job_client.get_job_logs(self.job_id).split('\n')
232
+ self.client.update_job(self.job_id, data={'result': result or {}, 'console_logs': logs})
233
+
234
+ def get_job_client(self):
235
+ return JobSubmissionClient(address=self.envs.get('RAY_DASHBOARD_URL'))
@@ -0,0 +1,45 @@
1
+ from ray import serve
2
+
3
+ from synapse_sdk.clients.exceptions import ClientError
4
+ from synapse_sdk.plugins.categories.base import Action
5
+ from synapse_sdk.plugins.categories.decorators import register_action
6
+ from synapse_sdk.plugins.enums import PluginCategory, RunMethod
7
+
8
+
9
+ @register_action
10
+ class DeploymentAction(Action):
11
+ name = 'deployment'
12
+ category = PluginCategory.NEURAL_NET
13
+ method = RunMethod.JOB
14
+
15
+ def get_deployment(self):
16
+ return serve.deployment(ray_actor_options=self.get_actor_options())(self.entrypoint)
17
+
18
+ def get_actor_options(self):
19
+ return {'runtime_env': self.get_runtime_env()}
20
+
21
+ def start(self):
22
+ deployment = self.get_deployment()
23
+ serve.delete(self.plugin_release.code)
24
+ # TODO add run object
25
+ serve.run(deployment.bind(), name=self.plugin_release.code, route_prefix=f'/{self.plugin_release.checksum}')
26
+
27
+ # 백엔드에 ServeApplication 추가
28
+ serve_application = self.create_serve_application()
29
+ return {'serve_application': serve_application['id'] if serve_application else None}
30
+
31
+ def create_serve_application(self):
32
+ if self.client:
33
+ try:
34
+ job = self.client.get_job(self.job_id)
35
+ serve_application = self.ray_client.get_serve_application(self.plugin_release.code)
36
+ return self.client.create_serve_application({
37
+ 'plugin': self.plugin_release.plugin,
38
+ 'version': self.plugin_release.version,
39
+ 'agent': job['agent'],
40
+ 'status': serve_application['status'],
41
+ 'data': serve_application,
42
+ })
43
+ except ClientError:
44
+ pass
45
+ return None
@@ -8,3 +8,11 @@ class InferenceAction(Action):
8
8
  name = 'inference'
9
9
  category = PluginCategory.NEURAL_NET
10
10
  method = RunMethod.RESTAPI
11
+
12
+ def __init__(self, *args, **kwargs):
13
+ super().__init__(*args, **kwargs)
14
+ headers = {'serve_multiplexed_model_id': str(self.params.pop('model'))}
15
+ if 'headers' in self.params:
16
+ self.params['headers'].update(headers)
17
+ else:
18
+ self.params['headers'] = headers