synapse-sdk 1.0.0a4__tar.gz → 1.0.0a5__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.
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/PKG-INFO +4 -2
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/pyproject.toml +9 -1
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/requirements.txt +1 -0
- synapse_sdk-1.0.0a5/synapse_sdk/cli/__init__.py +11 -0
- synapse_sdk-1.0.0a5/synapse_sdk/cli/create_plugin.py +10 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk/plugins/categories/base.py +7 -17
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk/plugins/categories/neural_net/actions/deployment.py +2 -2
- synapse_sdk-1.0.0a5/synapse_sdk/plugins/categories/neural_net/templates/config.yaml +12 -0
- synapse_sdk-1.0.0a5/synapse_sdk/plugins/categories/neural_net/templates/plugin/inference.py +4 -0
- synapse_sdk-1.0.0a5/synapse_sdk/plugins/categories/neural_net/templates/plugin/test.py +2 -0
- synapse_sdk-1.0.0a5/synapse_sdk/plugins/categories/neural_net/templates/plugin/train.py +14 -0
- synapse_sdk-1.0.0a5/synapse_sdk/plugins/categories/templates.py +32 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk/plugins/cli/publish.py +4 -4
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk/plugins/cli/run.py +10 -7
- synapse_sdk-1.0.0a5/synapse_sdk/plugins/models.py +66 -0
- synapse_sdk-1.0.0a5/synapse_sdk/plugins/templates/cookiecutter.json +11 -0
- synapse_sdk-1.0.0a5/synapse_sdk/plugins/templates/hooks/post_gen_project.py +3 -0
- synapse_sdk-1.0.0a5/synapse_sdk/plugins/templates/hooks/pre_prompt.py +20 -0
- synapse_sdk-1.0.0a5/synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/.env.dist +24 -0
- synapse_sdk-1.0.0a5/synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/.gitignore +27 -0
- synapse_sdk-1.0.0a5/synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/.pre-commit-config.yaml +7 -0
- synapse_sdk-1.0.0a5/synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/README.md +5 -0
- synapse_sdk-1.0.0a5/synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/config.yaml +18 -0
- synapse_sdk-1.0.0a5/synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/plugin/__init__.py +0 -0
- synapse_sdk-1.0.0a5/synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/pyproject.toml +13 -0
- synapse_sdk-1.0.0a5/synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/requirements.txt +1 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk/plugins/upload.py +17 -11
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk/plugins/utils.py +13 -7
- synapse_sdk-1.0.0a5/synapse_sdk/utils/__init__.py +0 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk.egg-info/PKG-INFO +4 -2
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk.egg-info/SOURCES.txt +21 -1
- synapse_sdk-1.0.0a5/synapse_sdk.egg-info/entry_points.txt +2 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk.egg-info/requires.txt +3 -0
- synapse_sdk-1.0.0a4/synapse_sdk/plugins/job.py +0 -5
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/.github/workflows/lint.yml +0 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/.github/workflows/pypi-publish.yml +0 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/.gitignore +0 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/.pre-commit-config.yaml +0 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/LICENSE +0 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/README.md +0 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/setup.cfg +0 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk/__init__.py +0 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk/clients/__init__.py +0 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk/clients/agent/__init__.py +0 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk/clients/agent/service.py +0 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk/clients/backend/__init__.py +0 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk/clients/backend/annotation.py +0 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk/clients/backend/dataset.py +0 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk/clients/backend/integration.py +0 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk/clients/backend/ml.py +0 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk/clients/base.py +0 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk/clients/exceptions.py +0 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk/clients/utils.py +0 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk/loggers.py +0 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk/plugins/__init__.py +0 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk/plugins/categories/__init__.py +0 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk/plugins/categories/data_validation/__init__.py +0 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk/plugins/categories/data_validation/actions/__init__.py +0 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk/plugins/categories/data_validation/actions/validation.py +0 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk/plugins/categories/decorators.py +0 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk/plugins/categories/export/__init__.py +0 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk/plugins/categories/export/actions/__init__.py +0 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk/plugins/categories/export/actions/export.py +0 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk/plugins/categories/import/__init__.py +0 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk/plugins/categories/import/actions/__init__.py +0 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk/plugins/categories/import/actions/import.py +0 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk/plugins/categories/neural_net/__init__.py +0 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk/plugins/categories/neural_net/actions/__init__.py +0 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk/plugins/categories/neural_net/actions/inference.py +0 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk/plugins/categories/neural_net/actions/test.py +0 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk/plugins/categories/neural_net/actions/train.py +0 -0
- {synapse_sdk-1.0.0a4/synapse_sdk/plugins/categories/post_annotation → synapse_sdk-1.0.0a5/synapse_sdk/plugins/categories/neural_net/templates/plugin}/__init__.py +0 -0
- {synapse_sdk-1.0.0a4/synapse_sdk/plugins/categories/post_annotation/actions → synapse_sdk-1.0.0a5/synapse_sdk/plugins/categories/post_annotation}/__init__.py +0 -0
- {synapse_sdk-1.0.0a4/synapse_sdk/plugins/categories/pre_annotation → synapse_sdk-1.0.0a5/synapse_sdk/plugins/categories/post_annotation/actions}/__init__.py +0 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk/plugins/categories/post_annotation/actions/post_annotation.py +0 -0
- {synapse_sdk-1.0.0a4/synapse_sdk/plugins/categories/pre_annotation/actions → synapse_sdk-1.0.0a5/synapse_sdk/plugins/categories/pre_annotation}/__init__.py +0 -0
- {synapse_sdk-1.0.0a4/synapse_sdk/utils → synapse_sdk-1.0.0a5/synapse_sdk/plugins/categories/pre_annotation/actions}/__init__.py +0 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk/plugins/categories/pre_annotation/actions/pre_annotation.py +0 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk/plugins/categories/registry.py +0 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk/plugins/cli/__init__.py +0 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk/plugins/enums.py +0 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk/utils/debug.py +0 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk/utils/file.py +0 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk/utils/module_loading.py +0 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk/utils/storage.py +0 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk/utils/string.py +0 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk.egg-info/dependency_links.txt +0 -0
- {synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: synapse-sdk
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.0a5
|
|
4
4
|
Summary: synapse sdk
|
|
5
5
|
Author-email: datamaker <developer@datamaker.io>
|
|
6
6
|
License: MIT
|
|
@@ -10,11 +10,13 @@ Description-Content-Type: text/markdown
|
|
|
10
10
|
License-File: LICENSE
|
|
11
11
|
Requires-Dist: boto3
|
|
12
12
|
Requires-Dist: click
|
|
13
|
+
Requires-Dist: cookiecutter
|
|
13
14
|
Requires-Dist: requests
|
|
14
15
|
Requires-Dist: tqdm
|
|
15
16
|
Requires-Dist: python-dotenv
|
|
16
17
|
Requires-Dist: pyyaml
|
|
17
18
|
Requires-Dist: pydantic
|
|
18
|
-
|
|
19
|
+
Provides-Extra: all
|
|
20
|
+
Requires-Dist: ray[all]; extra == "all"
|
|
19
21
|
|
|
20
22
|
This is the SDK to develop synapse plugins
|
|
@@ -15,15 +15,23 @@ classifiers = [
|
|
|
15
15
|
dependencies = [
|
|
16
16
|
'boto3',
|
|
17
17
|
'click',
|
|
18
|
+
'cookiecutter',
|
|
18
19
|
'requests',
|
|
19
20
|
'tqdm',
|
|
20
21
|
'python-dotenv',
|
|
21
22
|
'pyyaml',
|
|
22
23
|
'pydantic',
|
|
23
|
-
'ray[all]'
|
|
24
24
|
]
|
|
25
25
|
dynamic = ['version']
|
|
26
26
|
|
|
27
|
+
[project.optional-dependencies]
|
|
28
|
+
all = [
|
|
29
|
+
'ray[all]'
|
|
30
|
+
]
|
|
31
|
+
|
|
32
|
+
[project.scripts]
|
|
33
|
+
synapse = 'synapse_sdk.cli:cli'
|
|
34
|
+
|
|
27
35
|
[tool.setuptools_scm]
|
|
28
36
|
|
|
29
37
|
[tool.ruff]
|
|
@@ -11,10 +11,9 @@ from ray.dashboard.modules.job.sdk import JobSubmissionClient
|
|
|
11
11
|
from synapse_sdk.clients.backend import BackendClient
|
|
12
12
|
from synapse_sdk.loggers import ConsoleLogger, BackendLogger
|
|
13
13
|
from synapse_sdk.plugins.enums import RunMethod
|
|
14
|
+
from synapse_sdk.plugins.models import PluginRelease
|
|
14
15
|
from synapse_sdk.plugins.upload import build_and_upload, archive_and_upload, download_and_upload
|
|
15
|
-
from synapse_sdk.plugins.utils import get_plugin_checksum
|
|
16
16
|
from synapse_sdk.utils.module_loading import import_string
|
|
17
|
-
from synapse_sdk.utils.storage import get_storage
|
|
18
17
|
|
|
19
18
|
|
|
20
19
|
class Action:
|
|
@@ -23,6 +22,7 @@ class Action:
|
|
|
23
22
|
method = None
|
|
24
23
|
params = None
|
|
25
24
|
plugin_config = None
|
|
25
|
+
plugin_release = None
|
|
26
26
|
config = None
|
|
27
27
|
client = None
|
|
28
28
|
logger = None
|
|
@@ -42,23 +42,14 @@ class Action:
|
|
|
42
42
|
def __init__(self, params, plugin_config, envs=None, job_id=None, direct=False, debug=False):
|
|
43
43
|
self.params = params
|
|
44
44
|
self.plugin_config = plugin_config
|
|
45
|
-
self.
|
|
45
|
+
self.plugin_release = PluginRelease(config=plugin_config)
|
|
46
|
+
self.config = self.plugin_release.get_action_config(self.name)
|
|
46
47
|
self.job_id = job_id
|
|
47
48
|
self.direct = direct
|
|
48
49
|
self.debug = debug
|
|
49
50
|
self.envs = {**envs, **self.get_default_envs()} if envs else self.get_default_envs()
|
|
50
51
|
self.set_logger()
|
|
51
52
|
|
|
52
|
-
@cached_property
|
|
53
|
-
def plugin_id(self):
|
|
54
|
-
code = self.plugin_config['code']
|
|
55
|
-
version = self.plugin_config['version']
|
|
56
|
-
return f'{code}@{version}'
|
|
57
|
-
|
|
58
|
-
@cached_property
|
|
59
|
-
def plugin_checksum(self):
|
|
60
|
-
return get_plugin_checksum(self.plugin_id)
|
|
61
|
-
|
|
62
53
|
@cached_property
|
|
63
54
|
def entrypoint(self):
|
|
64
55
|
return import_string(self.config['entrypoint'])
|
|
@@ -79,8 +70,7 @@ class Action:
|
|
|
79
70
|
plugin_url = archive_and_upload(plugin_path, self.plugin_storage_url)
|
|
80
71
|
self.envs['SYNAPSE_DEBUG_PLUGIN_PATH'] = plugin_url
|
|
81
72
|
return plugin_url
|
|
82
|
-
|
|
83
|
-
return storage.get_url(f'{self.plugin_checksum}.zip')
|
|
73
|
+
return self.plugin_release.get_url(self.plugin_storage_url)
|
|
84
74
|
|
|
85
75
|
@property
|
|
86
76
|
def debug_modules(self):
|
|
@@ -115,7 +105,7 @@ class Action:
|
|
|
115
105
|
}
|
|
116
106
|
|
|
117
107
|
if self.debug:
|
|
118
|
-
runtime_env['pip']
|
|
108
|
+
runtime_env['pip'] = self.debug_modules + runtime_env['pip']
|
|
119
109
|
|
|
120
110
|
# 맨 마지막에 진행되어야 함
|
|
121
111
|
runtime_env['env_vars'] = self.envs
|
|
@@ -183,7 +173,7 @@ class Action:
|
|
|
183
173
|
path = self.params.pop('path', '')
|
|
184
174
|
method = self.params.pop('method')
|
|
185
175
|
|
|
186
|
-
url =
|
|
176
|
+
url = self.plugin_release.get_serve_url(self.envs['RAY_SERVE_ADDRESS'], path)
|
|
187
177
|
response = getattr(requests, method)(url, **self.params)
|
|
188
178
|
# TODO ok response가 아닌 경우 대응하기
|
|
189
179
|
return response.json()
|
|
@@ -19,5 +19,5 @@ class DeploymentAction(Action):
|
|
|
19
19
|
|
|
20
20
|
def run(self):
|
|
21
21
|
deployment = self.get_deployment()
|
|
22
|
-
serve.delete(self.
|
|
23
|
-
serve.run(deployment.bind(), name=self.
|
|
22
|
+
serve.delete(self.plugin_release.code)
|
|
23
|
+
serve.run(deployment.bind(), name=self.plugin_release.code, route_prefix=f'/{self.plugin_release.checksum}')
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import time
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def train(run, dataset, hyperparameter, checkpoint=None):
|
|
5
|
+
count_iterations = hyperparameter['iterations']
|
|
6
|
+
|
|
7
|
+
for i in range(1, count_iterations + 1):
|
|
8
|
+
time.sleep(0.5)
|
|
9
|
+
loss = float(round((count_iterations - i) / count_iterations, 2))
|
|
10
|
+
miou = 1 - loss
|
|
11
|
+
run.log_metric('iteration', i, loss=loss, miou=miou)
|
|
12
|
+
run.set_progress(i, count_iterations, category='iteration')
|
|
13
|
+
|
|
14
|
+
return {'weight': '/tmp/agent/test/a.txt', 'config': '/tmp/agent/test/b.txt'}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import shutil
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
|
|
4
|
+
import yaml
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def copy_project_category_template(category):
|
|
8
|
+
copy_plugin(category)
|
|
9
|
+
merge_config(category)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def copy_plugin(category):
|
|
13
|
+
template_path = Path(__file__).parent / category / 'templates' / 'plugin'
|
|
14
|
+
if not template_path.exists():
|
|
15
|
+
return
|
|
16
|
+
|
|
17
|
+
output_path = Path('plugin')
|
|
18
|
+
shutil.copytree(template_path, output_path, dirs_exist_ok=True)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def merge_config(category):
|
|
22
|
+
config_path = Path(__file__).parent / category / 'templates' / 'config.yaml'
|
|
23
|
+
if not config_path.exists():
|
|
24
|
+
return
|
|
25
|
+
|
|
26
|
+
config_base_path = Path('config.yaml')
|
|
27
|
+
|
|
28
|
+
config_base = yaml.safe_load(config_base_path.read_text(encoding='utf-8'))
|
|
29
|
+
config = yaml.safe_load(config_path.read_text(encoding='utf-8'))
|
|
30
|
+
|
|
31
|
+
config_base.update(config)
|
|
32
|
+
config_base_path.write_text(yaml.dump(config_base, sort_keys=False), encoding='utf-8')
|
|
@@ -4,8 +4,8 @@ from pathlib import Path
|
|
|
4
4
|
import click
|
|
5
5
|
|
|
6
6
|
from synapse_sdk.clients.backend import BackendClient
|
|
7
|
+
from synapse_sdk.plugins.models import PluginRelease
|
|
7
8
|
from synapse_sdk.plugins.upload import archive
|
|
8
|
-
from synapse_sdk.plugins.utils import read_config
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
@click.command()
|
|
@@ -17,20 +17,20 @@ from synapse_sdk.plugins.utils import read_config
|
|
|
17
17
|
def publish(ctx, host, user_token, tenant, debug_modules):
|
|
18
18
|
debug = ctx.obj['DEBUG']
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
plugin_release = PluginRelease()
|
|
21
21
|
|
|
22
22
|
source_path = Path('./')
|
|
23
23
|
archive_path = source_path / 'dist' / 'archive.zip'
|
|
24
24
|
archive(source_path, archive_path)
|
|
25
25
|
|
|
26
|
-
data = {'plugin':
|
|
26
|
+
data = {'plugin': plugin_release.plugin, 'file': str(archive_path), 'debug': debug}
|
|
27
27
|
if debug:
|
|
28
28
|
data['debug_meta'] = json.dumps({'modules': debug_modules.split(',')})
|
|
29
29
|
|
|
30
30
|
client = BackendClient(host, user_token, tenant=tenant)
|
|
31
31
|
client.create_plugin_release(data)
|
|
32
32
|
click.secho(
|
|
33
|
-
f'Successfully published "{
|
|
33
|
+
f'Successfully published "{plugin_release.name}" ({plugin_release.code}) to synapse backend!',
|
|
34
34
|
fg='green',
|
|
35
35
|
bold=True,
|
|
36
36
|
)
|
|
@@ -4,7 +4,8 @@ import click
|
|
|
4
4
|
|
|
5
5
|
from synapse_sdk.clients.agent import AgentClient
|
|
6
6
|
from synapse_sdk.clients.backend import BackendClient
|
|
7
|
-
from synapse_sdk.plugins.
|
|
7
|
+
from synapse_sdk.plugins.models import PluginRelease
|
|
8
|
+
from synapse_sdk.plugins.utils import get_action
|
|
8
9
|
|
|
9
10
|
|
|
10
11
|
@click.command()
|
|
@@ -41,7 +42,9 @@ def run_by_script(action, params, job_id, direct, debug):
|
|
|
41
42
|
|
|
42
43
|
def run_by_agent(action, params, job_id, agent_host, agent_token, user_token, tenant, debug):
|
|
43
44
|
client = AgentClient(agent_host, agent_token, user_token, tenant)
|
|
44
|
-
data = {'action': action, 'params': params
|
|
45
|
+
data = {'action': action, 'params': params}
|
|
46
|
+
if job_id:
|
|
47
|
+
data['job_id'] = job_id
|
|
45
48
|
if debug:
|
|
46
49
|
data.update({
|
|
47
50
|
'plugin_path': os.getcwd(),
|
|
@@ -49,16 +52,16 @@ def run_by_agent(action, params, job_id, agent_host, agent_token, user_token, te
|
|
|
49
52
|
})
|
|
50
53
|
result = client.run_debug_plugin_release(data=data)
|
|
51
54
|
else:
|
|
52
|
-
|
|
53
|
-
result = client.run_plugin_release(code=
|
|
55
|
+
plugin_release = PluginRelease()
|
|
56
|
+
result = client.run_plugin_release(code=plugin_release.code, data=data)
|
|
54
57
|
|
|
55
58
|
click.echo(result)
|
|
56
59
|
|
|
57
60
|
|
|
58
61
|
def run_by_backend(action, params, agent, host, user_token, tenant):
|
|
59
62
|
client = BackendClient(host, user_token, tenant=tenant)
|
|
60
|
-
|
|
61
|
-
data = {'agent': agent, 'version':
|
|
62
|
-
result = client.run_plugin(
|
|
63
|
+
plugin_release = PluginRelease()
|
|
64
|
+
data = {'agent': agent, 'version': plugin_release.version, 'action': action, 'params': params}
|
|
65
|
+
result = client.run_plugin(plugin_release.plugin, data=data)
|
|
63
66
|
|
|
64
67
|
click.echo(result)
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import os
|
|
2
|
+
from functools import cached_property
|
|
3
|
+
from typing import Dict, Any
|
|
4
|
+
|
|
5
|
+
from synapse_sdk.plugins.utils import read_plugin_config
|
|
6
|
+
from synapse_sdk.utils.storage import get_storage
|
|
7
|
+
from synapse_sdk.utils.string import hash_text
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class PluginRelease:
|
|
11
|
+
config: Dict[str, Any]
|
|
12
|
+
|
|
13
|
+
def __init__(self, config=None, plugin_path=None):
|
|
14
|
+
if config:
|
|
15
|
+
self.config = config
|
|
16
|
+
else:
|
|
17
|
+
self.config = read_plugin_config(plugin_path=plugin_path)
|
|
18
|
+
|
|
19
|
+
@cached_property
|
|
20
|
+
def plugin(self):
|
|
21
|
+
return self.config['code']
|
|
22
|
+
|
|
23
|
+
@cached_property
|
|
24
|
+
def version(self):
|
|
25
|
+
return self.config['version']
|
|
26
|
+
|
|
27
|
+
@cached_property
|
|
28
|
+
def code(self):
|
|
29
|
+
return f'{self.plugin}@{self.version}'
|
|
30
|
+
|
|
31
|
+
@cached_property
|
|
32
|
+
def category(self):
|
|
33
|
+
return self.config['category']
|
|
34
|
+
|
|
35
|
+
@cached_property
|
|
36
|
+
def name(self):
|
|
37
|
+
return self.config['name']
|
|
38
|
+
|
|
39
|
+
@cached_property
|
|
40
|
+
def checksum(self):
|
|
41
|
+
return hash_text(self.code)
|
|
42
|
+
|
|
43
|
+
@cached_property
|
|
44
|
+
def actions(self):
|
|
45
|
+
return list(self.config['actions'].keys())
|
|
46
|
+
|
|
47
|
+
def setup_runtime_env(self):
|
|
48
|
+
# TODO ray에 해당 plugin release runtime env 캐싱
|
|
49
|
+
pass
|
|
50
|
+
|
|
51
|
+
def get_action_config(self, action):
|
|
52
|
+
return self.config['actions'][action]
|
|
53
|
+
|
|
54
|
+
def get_url(self, storage_url):
|
|
55
|
+
storage = get_storage(storage_url)
|
|
56
|
+
return storage.get_url(f'{self.checksum}.zip')
|
|
57
|
+
|
|
58
|
+
def get_serve_url(self, serve_address, path):
|
|
59
|
+
return os.path.join(serve_address, self.checksum, path)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class Job:
|
|
63
|
+
job_id = None
|
|
64
|
+
|
|
65
|
+
def __init__(self, job_id):
|
|
66
|
+
self.job_id = job_id
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"category": null,
|
|
3
|
+
"plugin_name": null,
|
|
4
|
+
"plugin_code": "{{ cookiecutter.plugin_name.lower().replace(' ', '-') }}",
|
|
5
|
+
"version": "0.1.0",
|
|
6
|
+
"description": "This is {{ cookiecutter.plugin_name }} plugin",
|
|
7
|
+
"__prompts__": {
|
|
8
|
+
"project_name": "Plugin name",
|
|
9
|
+
"project_slug": "Unique identifier of your plugin. Lowercase letters, numbers, and hyphens only (e.g., 'my-plugin-name')"
|
|
10
|
+
}
|
|
11
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import json
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
from synapse_sdk.plugins.utils import get_plugin_categories
|
|
4
|
+
from synapse_sdk.utils.file import get_dict_from_file
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def update_config(config):
|
|
8
|
+
config['category'] = get_plugin_categories()
|
|
9
|
+
return config
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def main():
|
|
13
|
+
cookiecutter_path = Path('cookiecutter.json')
|
|
14
|
+
config = get_dict_from_file(cookiecutter_path)
|
|
15
|
+
config = update_config(config)
|
|
16
|
+
cookiecutter_path.write_text(json.dumps(config, indent=4, ensure_ascii=False), encoding='utf-8')
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
if __name__ == '__main__':
|
|
20
|
+
main()
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# RAY 관련
|
|
2
|
+
RAY_ADDRESS=
|
|
3
|
+
RAY_DASHBOARD_ADDRESS=
|
|
4
|
+
RAY_SERVE_ADDRESS=
|
|
5
|
+
|
|
6
|
+
# 플러그인 관련
|
|
7
|
+
SYNAPSE_PLUGIN_STORAGE=
|
|
8
|
+
|
|
9
|
+
# 플러그인 디버그 관련
|
|
10
|
+
SYNAPSE_DEBUG_PLUGIN_PATH=
|
|
11
|
+
SYNAPSE_DEBUG_MODULES=
|
|
12
|
+
|
|
13
|
+
# 플러그인 PUBLISH 관련
|
|
14
|
+
SYNAPSE_PLUGIN_PUBLISH_HOST=https://synapse.datamaker.io
|
|
15
|
+
SYNAPSE_PLUGIN_PUBLISH_USER_TOKEN=
|
|
16
|
+
SYNAPSE_PLUGIN_PUBLISH_TENANT=
|
|
17
|
+
|
|
18
|
+
# 플러그인 RUN 관련
|
|
19
|
+
SYNAPSE_PLUGIN_RUN_HOST=
|
|
20
|
+
SYNAPSE_PLUGIN_RUN_AGENT=
|
|
21
|
+
SYNAPSE_PLUGIN_RUN_AGENT_HOST=
|
|
22
|
+
SYNAPSE_PLUGIN_RUN_AGENT_TOKEN=
|
|
23
|
+
SYNAPSE_PLUGIN_RUN_USER_TOKEN=
|
|
24
|
+
SYNAPSE_PLUGIN_RUN_TENANT=
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
### Example user template template
|
|
2
|
+
# virtualenv
|
|
3
|
+
.venv
|
|
4
|
+
|
|
5
|
+
# idea
|
|
6
|
+
.DS_Store
|
|
7
|
+
*.pyc
|
|
8
|
+
.idea
|
|
9
|
+
*.iml
|
|
10
|
+
|
|
11
|
+
# http
|
|
12
|
+
/http/
|
|
13
|
+
|
|
14
|
+
# general things to ignore
|
|
15
|
+
build/
|
|
16
|
+
dist/
|
|
17
|
+
*.egg-info/
|
|
18
|
+
*.egg
|
|
19
|
+
*.py[cod]
|
|
20
|
+
__pycache__/
|
|
21
|
+
*.so
|
|
22
|
+
*~
|
|
23
|
+
.env
|
|
24
|
+
|
|
25
|
+
# due to using tox and pytest
|
|
26
|
+
.tox
|
|
27
|
+
.cache
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
name: {{ cookiecutter.plugin_name }}
|
|
2
|
+
code: {{ cookiecutter.plugin_code }}
|
|
3
|
+
version: {{ cookiecutter.version }}
|
|
4
|
+
readme: README.md
|
|
5
|
+
description: {{ cookiecutter.description }}
|
|
6
|
+
category: {{ cookiecutter.category }}
|
|
7
|
+
actions:
|
|
8
|
+
train:
|
|
9
|
+
dataset: datamaker
|
|
10
|
+
entrypoint: plugin.train.train
|
|
11
|
+
deployment:
|
|
12
|
+
entrypoint: plugin.inference.MockNetInference
|
|
13
|
+
inference:
|
|
14
|
+
method: restapi
|
|
15
|
+
endpoints:
|
|
16
|
+
- method: get
|
|
17
|
+
test:
|
|
18
|
+
entrypoint: plugin.test.test
|
|
File without changes
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
[tool.ruff]
|
|
2
|
+
line-length = 120
|
|
3
|
+
|
|
4
|
+
[tool.ruff.lint]
|
|
5
|
+
select = ['E', 'F', 'Q']
|
|
6
|
+
ignore = ['W191', 'E111', 'E114', 'E117', 'D206', 'D300', 'Q000', 'Q001', 'Q002', 'Q003', 'COM812', 'COM819', 'ISC001', 'ISC002']
|
|
7
|
+
|
|
8
|
+
[tool.ruff.lint.pydocstyle]
|
|
9
|
+
convention = 'google'
|
|
10
|
+
|
|
11
|
+
[tool.ruff.format]
|
|
12
|
+
quote-style = 'single'
|
|
13
|
+
preview = true
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
synapse-sdk
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import re
|
|
2
1
|
import subprocess
|
|
3
2
|
import tempfile
|
|
4
3
|
from pathlib import Path
|
|
@@ -17,9 +16,9 @@ def download_and_upload(source_url, url):
|
|
|
17
16
|
storage = get_storage(url)
|
|
18
17
|
with tempfile.TemporaryDirectory() as temp_path:
|
|
19
18
|
file_path = str(download_file(source_url, temp_path))
|
|
20
|
-
checksum = calculate_checksum(file_path
|
|
19
|
+
checksum = calculate_checksum(file_path)
|
|
21
20
|
# TODO 중복 체크
|
|
22
|
-
return storage.upload(file_path, f'{checksum}.zip')
|
|
21
|
+
return storage.upload(file_path, f'dev-{checksum}.zip')
|
|
23
22
|
|
|
24
23
|
|
|
25
24
|
def archive_and_upload(source_path, url):
|
|
@@ -28,8 +27,8 @@ def archive_and_upload(source_path, url):
|
|
|
28
27
|
archive_path = dist_path / 'archive.zip'
|
|
29
28
|
|
|
30
29
|
archive(source_path, archive_path)
|
|
31
|
-
checksum = calculate_checksum(archive_path
|
|
32
|
-
checksum_archive_path = dist_path / f'{checksum}.zip'
|
|
30
|
+
checksum = calculate_checksum(archive_path)
|
|
31
|
+
checksum_archive_path = dist_path / f'dev-{checksum}.zip'
|
|
33
32
|
|
|
34
33
|
if checksum_archive_path.exists():
|
|
35
34
|
# TODO 실제 스토리지 있는지 확인
|
|
@@ -48,8 +47,8 @@ def build_and_upload(source_path, url, virtualenv_path='.venv'):
|
|
|
48
47
|
archive_path = dist_path / 'archive.zip'
|
|
49
48
|
|
|
50
49
|
archive(source_path, archive_path)
|
|
51
|
-
checksum = calculate_checksum(archive_path
|
|
52
|
-
checksum_archive_path = dist_path / f'{checksum}.zip'
|
|
50
|
+
checksum = calculate_checksum(archive_path)
|
|
51
|
+
checksum_archive_path = dist_path / f'dev-{checksum}.zip'
|
|
53
52
|
|
|
54
53
|
if checksum_archive_path.exists():
|
|
55
54
|
# TODO 실제 스토리지 있는지 확인
|
|
@@ -70,13 +69,20 @@ def build_and_upload(source_path, url, virtualenv_path='.venv'):
|
|
|
70
69
|
)
|
|
71
70
|
wheel_path = next(dist_path.glob('*.whl'), None)
|
|
72
71
|
|
|
72
|
+
# whl 파일 버전이 동일한 이슈를 해결하기 위해 checksum으로 build명 변경
|
|
73
|
+
checksum_wheel_path = wheel_path.with_name(change_build_from_whl_name(wheel_path.name, checksum))
|
|
74
|
+
wheel_path.rename(checksum_wheel_path)
|
|
75
|
+
|
|
73
76
|
archive_path.rename(checksum_archive_path)
|
|
77
|
+
|
|
74
78
|
for file_path in dist_path.glob('*.zip'):
|
|
75
79
|
if file_path.name != checksum_archive_path.name:
|
|
76
80
|
file_path.unlink()
|
|
77
|
-
return storage.upload(str(
|
|
81
|
+
return storage.upload(str(checksum_wheel_path), checksum_wheel_path.name)
|
|
78
82
|
|
|
79
83
|
|
|
80
|
-
def
|
|
81
|
-
|
|
82
|
-
|
|
84
|
+
def change_build_from_whl_name(whl_name, build):
|
|
85
|
+
components = whl_name.split('-')
|
|
86
|
+
version = components[1].split('+')[0]
|
|
87
|
+
components[1] = f'{version}+{build}'
|
|
88
|
+
return '-'.join(components)
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import json
|
|
2
|
+
from pathlib import Path
|
|
2
3
|
|
|
3
4
|
from synapse_sdk.plugins.categories.registry import _REGISTERED_ACTIONS, register_actions
|
|
4
5
|
from synapse_sdk.utils.file import get_dict_from_file
|
|
5
|
-
from synapse_sdk.utils.string import hash_text
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
def get_action(action, params_data, *args, **kwargs):
|
|
@@ -17,11 +17,11 @@ def get_action(action, params_data, *args, **kwargs):
|
|
|
17
17
|
config_data = kwargs.pop('config', False)
|
|
18
18
|
if config_data:
|
|
19
19
|
if isinstance(config_data, str):
|
|
20
|
-
config =
|
|
20
|
+
config = read_plugin_config(plugin_path=config_data)
|
|
21
21
|
else:
|
|
22
22
|
config = config_data
|
|
23
23
|
else:
|
|
24
|
-
config =
|
|
24
|
+
config = read_plugin_config()
|
|
25
25
|
category = config['category']
|
|
26
26
|
return get_action_class(category, action)(params, config, *args, **kwargs)
|
|
27
27
|
|
|
@@ -36,9 +36,15 @@ def get_available_actions(category):
|
|
|
36
36
|
return list(_REGISTERED_ACTIONS[category].keys())
|
|
37
37
|
|
|
38
38
|
|
|
39
|
-
def
|
|
40
|
-
|
|
39
|
+
def get_plugin_categories():
|
|
40
|
+
register_actions()
|
|
41
|
+
return list(_REGISTERED_ACTIONS.keys())
|
|
41
42
|
|
|
42
43
|
|
|
43
|
-
def
|
|
44
|
-
|
|
44
|
+
def read_plugin_config(plugin_path=None):
|
|
45
|
+
config_file_name = 'config.yaml'
|
|
46
|
+
if plugin_path:
|
|
47
|
+
config_path = Path(plugin_path) / config_file_name
|
|
48
|
+
else:
|
|
49
|
+
config_path = config_file_name
|
|
50
|
+
return get_dict_from_file(config_path)
|
|
File without changes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: synapse-sdk
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.0a5
|
|
4
4
|
Summary: synapse sdk
|
|
5
5
|
Author-email: datamaker <developer@datamaker.io>
|
|
6
6
|
License: MIT
|
|
@@ -10,11 +10,13 @@ Description-Content-Type: text/markdown
|
|
|
10
10
|
License-File: LICENSE
|
|
11
11
|
Requires-Dist: boto3
|
|
12
12
|
Requires-Dist: click
|
|
13
|
+
Requires-Dist: cookiecutter
|
|
13
14
|
Requires-Dist: requests
|
|
14
15
|
Requires-Dist: tqdm
|
|
15
16
|
Requires-Dist: python-dotenv
|
|
16
17
|
Requires-Dist: pyyaml
|
|
17
18
|
Requires-Dist: pydantic
|
|
18
|
-
|
|
19
|
+
Provides-Extra: all
|
|
20
|
+
Requires-Dist: ray[all]; extra == "all"
|
|
19
21
|
|
|
20
22
|
This is the SDK to develop synapse plugins
|
|
@@ -11,8 +11,11 @@ synapse_sdk/loggers.py
|
|
|
11
11
|
synapse_sdk.egg-info/PKG-INFO
|
|
12
12
|
synapse_sdk.egg-info/SOURCES.txt
|
|
13
13
|
synapse_sdk.egg-info/dependency_links.txt
|
|
14
|
+
synapse_sdk.egg-info/entry_points.txt
|
|
14
15
|
synapse_sdk.egg-info/requires.txt
|
|
15
16
|
synapse_sdk.egg-info/top_level.txt
|
|
17
|
+
synapse_sdk/cli/__init__.py
|
|
18
|
+
synapse_sdk/cli/create_plugin.py
|
|
16
19
|
synapse_sdk/clients/__init__.py
|
|
17
20
|
synapse_sdk/clients/base.py
|
|
18
21
|
synapse_sdk/clients/exceptions.py
|
|
@@ -26,13 +29,14 @@ synapse_sdk/clients/backend/integration.py
|
|
|
26
29
|
synapse_sdk/clients/backend/ml.py
|
|
27
30
|
synapse_sdk/plugins/__init__.py
|
|
28
31
|
synapse_sdk/plugins/enums.py
|
|
29
|
-
synapse_sdk/plugins/
|
|
32
|
+
synapse_sdk/plugins/models.py
|
|
30
33
|
synapse_sdk/plugins/upload.py
|
|
31
34
|
synapse_sdk/plugins/utils.py
|
|
32
35
|
synapse_sdk/plugins/categories/__init__.py
|
|
33
36
|
synapse_sdk/plugins/categories/base.py
|
|
34
37
|
synapse_sdk/plugins/categories/decorators.py
|
|
35
38
|
synapse_sdk/plugins/categories/registry.py
|
|
39
|
+
synapse_sdk/plugins/categories/templates.py
|
|
36
40
|
synapse_sdk/plugins/categories/data_validation/__init__.py
|
|
37
41
|
synapse_sdk/plugins/categories/data_validation/actions/__init__.py
|
|
38
42
|
synapse_sdk/plugins/categories/data_validation/actions/validation.py
|
|
@@ -48,6 +52,11 @@ synapse_sdk/plugins/categories/neural_net/actions/deployment.py
|
|
|
48
52
|
synapse_sdk/plugins/categories/neural_net/actions/inference.py
|
|
49
53
|
synapse_sdk/plugins/categories/neural_net/actions/test.py
|
|
50
54
|
synapse_sdk/plugins/categories/neural_net/actions/train.py
|
|
55
|
+
synapse_sdk/plugins/categories/neural_net/templates/config.yaml
|
|
56
|
+
synapse_sdk/plugins/categories/neural_net/templates/plugin/__init__.py
|
|
57
|
+
synapse_sdk/plugins/categories/neural_net/templates/plugin/inference.py
|
|
58
|
+
synapse_sdk/plugins/categories/neural_net/templates/plugin/test.py
|
|
59
|
+
synapse_sdk/plugins/categories/neural_net/templates/plugin/train.py
|
|
51
60
|
synapse_sdk/plugins/categories/post_annotation/__init__.py
|
|
52
61
|
synapse_sdk/plugins/categories/post_annotation/actions/__init__.py
|
|
53
62
|
synapse_sdk/plugins/categories/post_annotation/actions/post_annotation.py
|
|
@@ -57,6 +66,17 @@ synapse_sdk/plugins/categories/pre_annotation/actions/pre_annotation.py
|
|
|
57
66
|
synapse_sdk/plugins/cli/__init__.py
|
|
58
67
|
synapse_sdk/plugins/cli/publish.py
|
|
59
68
|
synapse_sdk/plugins/cli/run.py
|
|
69
|
+
synapse_sdk/plugins/templates/cookiecutter.json
|
|
70
|
+
synapse_sdk/plugins/templates/hooks/post_gen_project.py
|
|
71
|
+
synapse_sdk/plugins/templates/hooks/pre_prompt.py
|
|
72
|
+
synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/.env.dist
|
|
73
|
+
synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/.gitignore
|
|
74
|
+
synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/.pre-commit-config.yaml
|
|
75
|
+
synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/README.md
|
|
76
|
+
synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/config.yaml
|
|
77
|
+
synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/pyproject.toml
|
|
78
|
+
synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/requirements.txt
|
|
79
|
+
synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/plugin/__init__.py
|
|
60
80
|
synapse_sdk/utils/__init__.py
|
|
61
81
|
synapse_sdk/utils/debug.py
|
|
62
82
|
synapse_sdk/utils/file.py
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk/plugins/categories/export/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk/plugins/categories/export/actions/export.py
RENAMED
|
File without changes
|
{synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk/plugins/categories/import/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk/plugins/categories/import/actions/import.py
RENAMED
|
File without changes
|
{synapse_sdk-1.0.0a4 → synapse_sdk-1.0.0a5}/synapse_sdk/plugins/categories/neural_net/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|