synapse-sdk 1.0.0a35__py3-none-any.whl → 2025.11.7__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of synapse-sdk might be problematic. Click here for more details.
- synapse_sdk/__init__.py +24 -0
- synapse_sdk/cli/__init__.py +308 -5
- synapse_sdk/cli/alias/utils.py +1 -1
- synapse_sdk/cli/code_server.py +687 -0
- synapse_sdk/cli/config.py +440 -0
- synapse_sdk/cli/devtools.py +90 -0
- synapse_sdk/cli/plugin/publish.py +23 -15
- synapse_sdk/clients/agent/__init__.py +9 -3
- synapse_sdk/clients/agent/container.py +133 -0
- synapse_sdk/clients/agent/core.py +19 -0
- synapse_sdk/clients/agent/ray.py +298 -9
- synapse_sdk/clients/backend/__init__.py +28 -12
- synapse_sdk/clients/backend/annotation.py +9 -1
- synapse_sdk/clients/backend/core.py +31 -4
- synapse_sdk/clients/backend/data_collection.py +186 -0
- synapse_sdk/clients/backend/hitl.py +1 -1
- synapse_sdk/clients/backend/integration.py +4 -3
- synapse_sdk/clients/backend/ml.py +1 -1
- synapse_sdk/clients/backend/models.py +35 -1
- synapse_sdk/clients/base.py +309 -36
- synapse_sdk/clients/ray/serve.py +2 -0
- synapse_sdk/devtools/__init__.py +0 -0
- synapse_sdk/devtools/config.py +94 -0
- synapse_sdk/devtools/docs/.gitignore +20 -0
- synapse_sdk/devtools/docs/README.md +41 -0
- synapse_sdk/devtools/docs/blog/2019-05-28-first-blog-post.md +12 -0
- synapse_sdk/devtools/docs/blog/2019-05-29-long-blog-post.md +44 -0
- synapse_sdk/devtools/docs/blog/2021-08-01-mdx-blog-post.mdx +24 -0
- synapse_sdk/devtools/docs/blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg +0 -0
- synapse_sdk/devtools/docs/blog/2021-08-26-welcome/index.md +29 -0
- synapse_sdk/devtools/docs/blog/authors.yml +25 -0
- synapse_sdk/devtools/docs/blog/tags.yml +19 -0
- synapse_sdk/devtools/docs/docs/api/clients/agent.md +43 -0
- synapse_sdk/devtools/docs/docs/api/clients/annotation-mixin.md +378 -0
- synapse_sdk/devtools/docs/docs/api/clients/backend.md +420 -0
- synapse_sdk/devtools/docs/docs/api/clients/base.md +257 -0
- synapse_sdk/devtools/docs/docs/api/clients/core-mixin.md +477 -0
- synapse_sdk/devtools/docs/docs/api/clients/data-collection-mixin.md +422 -0
- synapse_sdk/devtools/docs/docs/api/clients/hitl-mixin.md +554 -0
- synapse_sdk/devtools/docs/docs/api/clients/index.md +391 -0
- synapse_sdk/devtools/docs/docs/api/clients/integration-mixin.md +571 -0
- synapse_sdk/devtools/docs/docs/api/clients/ml-mixin.md +578 -0
- synapse_sdk/devtools/docs/docs/api/clients/ray.md +342 -0
- synapse_sdk/devtools/docs/docs/api/index.md +52 -0
- synapse_sdk/devtools/docs/docs/api/plugins/categories.md +43 -0
- synapse_sdk/devtools/docs/docs/api/plugins/models.md +114 -0
- synapse_sdk/devtools/docs/docs/api/plugins/utils.md +328 -0
- synapse_sdk/devtools/docs/docs/categories.md +0 -0
- synapse_sdk/devtools/docs/docs/cli-usage.md +280 -0
- synapse_sdk/devtools/docs/docs/concepts/index.md +38 -0
- synapse_sdk/devtools/docs/docs/configuration.md +83 -0
- synapse_sdk/devtools/docs/docs/contributing.md +306 -0
- synapse_sdk/devtools/docs/docs/examples/index.md +29 -0
- synapse_sdk/devtools/docs/docs/faq.md +179 -0
- synapse_sdk/devtools/docs/docs/features/converters/index.md +455 -0
- synapse_sdk/devtools/docs/docs/features/index.md +24 -0
- synapse_sdk/devtools/docs/docs/features/utils/file.md +415 -0
- synapse_sdk/devtools/docs/docs/features/utils/network.md +378 -0
- synapse_sdk/devtools/docs/docs/features/utils/storage.md +57 -0
- synapse_sdk/devtools/docs/docs/features/utils/types.md +51 -0
- synapse_sdk/devtools/docs/docs/installation.md +94 -0
- synapse_sdk/devtools/docs/docs/introduction.md +47 -0
- synapse_sdk/devtools/docs/docs/plugins/categories/neural-net-plugins/train-action-overview.md +814 -0
- synapse_sdk/devtools/docs/docs/plugins/categories/pre-annotation-plugins/pre-annotation-plugin-overview.md +198 -0
- synapse_sdk/devtools/docs/docs/plugins/categories/pre-annotation-plugins/to-task-action-development.md +1645 -0
- synapse_sdk/devtools/docs/docs/plugins/categories/pre-annotation-plugins/to-task-overview.md +717 -0
- synapse_sdk/devtools/docs/docs/plugins/categories/pre-annotation-plugins/to-task-template-development.md +1380 -0
- synapse_sdk/devtools/docs/docs/plugins/categories/upload-plugins/upload-plugin-action.md +948 -0
- synapse_sdk/devtools/docs/docs/plugins/categories/upload-plugins/upload-plugin-overview.md +544 -0
- synapse_sdk/devtools/docs/docs/plugins/categories/upload-plugins/upload-plugin-template.md +766 -0
- synapse_sdk/devtools/docs/docs/plugins/export-plugins.md +1092 -0
- synapse_sdk/devtools/docs/docs/plugins/plugins.md +852 -0
- synapse_sdk/devtools/docs/docs/quickstart.md +78 -0
- synapse_sdk/devtools/docs/docs/troubleshooting.md +519 -0
- synapse_sdk/devtools/docs/docs/tutorial-basics/_category_.json +8 -0
- synapse_sdk/devtools/docs/docs/tutorial-basics/congratulations.md +23 -0
- synapse_sdk/devtools/docs/docs/tutorial-basics/create-a-blog-post.md +34 -0
- synapse_sdk/devtools/docs/docs/tutorial-basics/create-a-document.md +57 -0
- synapse_sdk/devtools/docs/docs/tutorial-basics/create-a-page.md +43 -0
- synapse_sdk/devtools/docs/docs/tutorial-basics/deploy-your-site.md +31 -0
- synapse_sdk/devtools/docs/docs/tutorial-basics/markdown-features.mdx +152 -0
- synapse_sdk/devtools/docs/docs/tutorial-extras/_category_.json +7 -0
- synapse_sdk/devtools/docs/docs/tutorial-extras/img/docsVersionDropdown.png +0 -0
- synapse_sdk/devtools/docs/docs/tutorial-extras/img/localeDropdown.png +0 -0
- synapse_sdk/devtools/docs/docs/tutorial-extras/manage-docs-versions.md +55 -0
- synapse_sdk/devtools/docs/docs/tutorial-extras/translate-your-site.md +88 -0
- synapse_sdk/devtools/docs/docusaurus.config.ts +148 -0
- synapse_sdk/devtools/docs/i18n/ko/code.json +325 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/agent.md +43 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/annotation-mixin.md +289 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/backend.md +420 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/base.md +257 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/core-mixin.md +417 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/data-collection-mixin.md +356 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/hitl-mixin.md +192 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/index.md +391 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/integration-mixin.md +479 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/ml-mixin.md +284 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/ray.md +342 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/index.md +52 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/plugins/models.md +114 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/categories.md +0 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/cli-usage.md +280 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/concepts/index.md +38 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/configuration.md +83 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/contributing.md +306 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/examples/index.md +29 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/faq.md +179 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/converters/index.md +30 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/index.md +24 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/utils/file.md +415 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/utils/network.md +378 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/utils/storage.md +60 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/utils/types.md +51 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/installation.md +94 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/introduction.md +47 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/neural-net-plugins/train-action-overview.md +815 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/pre-annotation-plugins/pre-annotation-plugin-overview.md +198 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/pre-annotation-plugins/to-task-action-development.md +1645 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/pre-annotation-plugins/to-task-overview.md +717 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/pre-annotation-plugins/to-task-template-development.md +1380 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/upload-plugins/upload-plugin-action.md +948 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/upload-plugins/upload-plugin-overview.md +544 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/upload-plugins/upload-plugin-template.md +766 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/export-plugins.md +1092 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/plugins.md +117 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/quickstart.md +78 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/troubleshooting.md +519 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current.json +34 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-theme-classic/footer.json +42 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-theme-classic/navbar.json +18 -0
- synapse_sdk/devtools/docs/package-lock.json +18784 -0
- synapse_sdk/devtools/docs/package.json +48 -0
- synapse_sdk/devtools/docs/sidebars.ts +122 -0
- synapse_sdk/devtools/docs/src/components/HomepageFeatures/index.tsx +71 -0
- synapse_sdk/devtools/docs/src/components/HomepageFeatures/styles.module.css +11 -0
- synapse_sdk/devtools/docs/src/css/custom.css +30 -0
- synapse_sdk/devtools/docs/src/pages/index.module.css +23 -0
- synapse_sdk/devtools/docs/src/pages/index.tsx +21 -0
- synapse_sdk/devtools/docs/src/pages/markdown-page.md +7 -0
- synapse_sdk/devtools/docs/static/.nojekyll +0 -0
- synapse_sdk/devtools/docs/static/img/docusaurus-social-card.jpg +0 -0
- synapse_sdk/devtools/docs/static/img/docusaurus.png +0 -0
- synapse_sdk/devtools/docs/static/img/favicon.ico +0 -0
- synapse_sdk/devtools/docs/static/img/logo.png +0 -0
- synapse_sdk/devtools/docs/static/img/undraw_docusaurus_mountain.svg +171 -0
- synapse_sdk/devtools/docs/static/img/undraw_docusaurus_react.svg +170 -0
- synapse_sdk/devtools/docs/static/img/undraw_docusaurus_tree.svg +40 -0
- synapse_sdk/devtools/docs/tsconfig.json +8 -0
- synapse_sdk/devtools/server.py +41 -0
- synapse_sdk/devtools/streamlit_app/__init__.py +5 -0
- synapse_sdk/devtools/streamlit_app/app.py +128 -0
- synapse_sdk/devtools/streamlit_app/services/__init__.py +11 -0
- synapse_sdk/devtools/streamlit_app/services/job_service.py +233 -0
- synapse_sdk/devtools/streamlit_app/services/plugin_service.py +236 -0
- synapse_sdk/devtools/streamlit_app/services/serve_service.py +95 -0
- synapse_sdk/devtools/streamlit_app/ui/__init__.py +15 -0
- synapse_sdk/devtools/streamlit_app/ui/config_tab.py +76 -0
- synapse_sdk/devtools/streamlit_app/ui/deployment_tab.py +66 -0
- synapse_sdk/devtools/streamlit_app/ui/http_tab.py +125 -0
- synapse_sdk/devtools/streamlit_app/ui/jobs_tab.py +573 -0
- synapse_sdk/devtools/streamlit_app/ui/serve_tab.py +346 -0
- synapse_sdk/devtools/streamlit_app/ui/status_bar.py +118 -0
- synapse_sdk/devtools/streamlit_app/utils/__init__.py +40 -0
- synapse_sdk/devtools/streamlit_app/utils/json_viewer.py +197 -0
- synapse_sdk/devtools/streamlit_app/utils/log_formatter.py +38 -0
- synapse_sdk/devtools/streamlit_app/utils/styles.py +241 -0
- synapse_sdk/devtools/streamlit_app/utils/ui_components.py +289 -0
- synapse_sdk/devtools/streamlit_app.py +10 -0
- synapse_sdk/loggers.py +65 -7
- synapse_sdk/plugins/README.md +1340 -0
- synapse_sdk/plugins/categories/base.py +73 -11
- synapse_sdk/plugins/categories/data_validation/actions/validation.py +72 -0
- synapse_sdk/plugins/categories/data_validation/templates/plugin/validation.py +33 -5
- synapse_sdk/plugins/categories/export/actions/__init__.py +3 -0
- synapse_sdk/plugins/categories/export/actions/export/__init__.py +28 -0
- synapse_sdk/plugins/categories/export/actions/export/action.py +165 -0
- synapse_sdk/plugins/categories/export/actions/export/enums.py +113 -0
- synapse_sdk/plugins/categories/export/actions/export/exceptions.py +53 -0
- synapse_sdk/plugins/categories/export/actions/export/models.py +74 -0
- synapse_sdk/plugins/categories/export/actions/export/run.py +195 -0
- synapse_sdk/plugins/categories/export/actions/{export.py → export/utils.py} +47 -82
- synapse_sdk/plugins/categories/export/templates/config.yaml +19 -1
- synapse_sdk/plugins/categories/export/templates/plugin/__init__.py +390 -0
- synapse_sdk/plugins/categories/export/templates/plugin/export.py +153 -129
- synapse_sdk/plugins/categories/neural_net/actions/deployment.py +9 -62
- synapse_sdk/plugins/categories/neural_net/actions/train.py +1062 -32
- synapse_sdk/plugins/categories/neural_net/actions/tune.py +534 -0
- synapse_sdk/plugins/categories/neural_net/templates/config.yaml +27 -5
- synapse_sdk/plugins/categories/neural_net/templates/plugin/inference.py +26 -10
- synapse_sdk/plugins/categories/pre_annotation/actions/__init__.py +4 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/pre_annotation/__init__.py +3 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/pre_annotation/action.py +10 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/__init__.py +28 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/action.py +145 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/enums.py +269 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/exceptions.py +14 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/factory.py +76 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/models.py +97 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/orchestrator.py +250 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/run.py +64 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/__init__.py +17 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/annotation.py +287 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/base.py +170 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/extraction.py +83 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/metrics.py +87 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/preprocessor.py +127 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/validation.py +143 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task.py +966 -0
- synapse_sdk/plugins/categories/pre_annotation/templates/config.yaml +19 -0
- synapse_sdk/plugins/categories/pre_annotation/templates/plugin/to_task.py +40 -0
- synapse_sdk/plugins/categories/upload/actions/upload/__init__.py +19 -0
- synapse_sdk/plugins/categories/upload/actions/upload/action.py +232 -0
- synapse_sdk/plugins/categories/upload/actions/upload/context.py +185 -0
- synapse_sdk/plugins/categories/upload/actions/upload/enums.py +471 -0
- synapse_sdk/plugins/categories/upload/actions/upload/exceptions.py +36 -0
- synapse_sdk/plugins/categories/upload/actions/upload/factory.py +138 -0
- synapse_sdk/plugins/categories/upload/actions/upload/models.py +203 -0
- synapse_sdk/plugins/categories/upload/actions/upload/orchestrator.py +183 -0
- synapse_sdk/plugins/categories/upload/actions/upload/registry.py +113 -0
- synapse_sdk/plugins/categories/upload/actions/upload/run.py +179 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/__init__.py +1 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/base.py +107 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/cleanup.py +62 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/collection.py +63 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/generate.py +84 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/initialize.py +82 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/metadata.py +235 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/organize.py +203 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/upload.py +97 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/validate.py +71 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/__init__.py +1 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/base.py +82 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/data_unit/__init__.py +1 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/data_unit/batch.py +39 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/data_unit/single.py +29 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/file_discovery/__init__.py +1 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/file_discovery/flat.py +258 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/file_discovery/recursive.py +281 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/metadata/__init__.py +1 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/metadata/excel.py +174 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/metadata/none.py +16 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/upload/__init__.py +1 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/upload/sync.py +84 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/validation/__init__.py +1 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/validation/default.py +60 -0
- synapse_sdk/plugins/categories/upload/actions/upload/utils.py +250 -0
- synapse_sdk/plugins/categories/upload/templates/README.md +470 -0
- synapse_sdk/plugins/categories/upload/templates/config.yaml +29 -2
- synapse_sdk/plugins/categories/upload/templates/plugin/__init__.py +294 -0
- synapse_sdk/plugins/categories/upload/templates/plugin/upload.py +88 -30
- synapse_sdk/plugins/models.py +122 -16
- synapse_sdk/plugins/templates/plugin-config-schema.json +406 -0
- synapse_sdk/plugins/templates/schema.json +491 -0
- synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/requirements.txt +1 -1
- synapse_sdk/plugins/utils/__init__.py +46 -0
- synapse_sdk/plugins/utils/actions.py +119 -0
- synapse_sdk/plugins/utils/config.py +203 -0
- synapse_sdk/plugins/{utils.py → utils/legacy.py} +26 -46
- synapse_sdk/plugins/utils/ray_gcs.py +66 -0
- synapse_sdk/plugins/utils/registry.py +58 -0
- synapse_sdk/shared/__init__.py +25 -0
- synapse_sdk/shared/enums.py +93 -0
- synapse_sdk/utils/converters/__init__.py +240 -0
- synapse_sdk/utils/converters/coco/__init__.py +0 -0
- synapse_sdk/utils/converters/coco/from_dm.py +322 -0
- synapse_sdk/utils/converters/coco/to_dm.py +215 -0
- synapse_sdk/utils/converters/dm/__init__.py +56 -0
- synapse_sdk/utils/converters/dm/from_v1.py +627 -0
- synapse_sdk/utils/converters/dm/to_v1.py +367 -0
- synapse_sdk/utils/converters/pascal/__init__.py +0 -0
- synapse_sdk/utils/converters/pascal/from_dm.py +244 -0
- synapse_sdk/utils/converters/pascal/to_dm.py +214 -0
- synapse_sdk/utils/converters/yolo/__init__.py +0 -0
- synapse_sdk/utils/converters/yolo/from_dm.py +384 -0
- synapse_sdk/utils/converters/yolo/to_dm.py +267 -0
- synapse_sdk/utils/dataset.py +46 -0
- synapse_sdk/utils/encryption.py +158 -0
- synapse_sdk/utils/file/__init__.py +39 -0
- synapse_sdk/utils/file/archive.py +32 -0
- synapse_sdk/utils/file/checksum.py +56 -0
- synapse_sdk/utils/file/chunking.py +31 -0
- synapse_sdk/utils/file/download.py +385 -0
- synapse_sdk/utils/file/encoding.py +40 -0
- synapse_sdk/utils/file/io.py +22 -0
- synapse_sdk/utils/file/video/__init__.py +29 -0
- synapse_sdk/utils/file/video/transcode.py +307 -0
- synapse_sdk/utils/{file.py → file.py.backup} +84 -2
- synapse_sdk/utils/http.py +138 -0
- synapse_sdk/utils/network.py +293 -0
- synapse_sdk/utils/storage/__init__.py +36 -2
- synapse_sdk/utils/storage/providers/__init__.py +141 -0
- synapse_sdk/utils/storage/providers/file_system.py +134 -0
- synapse_sdk/utils/storage/providers/http.py +190 -0
- synapse_sdk/utils/storage/providers/s3.py +54 -6
- synapse_sdk/utils/storage/providers/sftp.py +31 -0
- synapse_sdk/utils/storage/registry.py +6 -0
- synapse_sdk-2025.11.7.dist-info/METADATA +122 -0
- synapse_sdk-2025.11.7.dist-info/RECORD +386 -0
- {synapse_sdk-1.0.0a35.dist-info → synapse_sdk-2025.11.7.dist-info}/WHEEL +1 -1
- synapse_sdk/clients/backend/dataset.py +0 -102
- synapse_sdk/plugins/categories/upload/actions/upload.py +0 -293
- synapse_sdk-1.0.0a35.dist-info/METADATA +0 -47
- synapse_sdk-1.0.0a35.dist-info/RECORD +0 -137
- {synapse_sdk-1.0.0a35.dist-info → synapse_sdk-2025.11.7.dist-info}/entry_points.txt +0 -0
- {synapse_sdk-1.0.0a35.dist-info → synapse_sdk-2025.11.7.dist-info}/licenses/LICENSE +0 -0
- {synapse_sdk-1.0.0a35.dist-info → synapse_sdk-2025.11.7.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import os
|
|
2
|
+
from urllib.parse import urljoin, urlparse
|
|
3
|
+
|
|
4
|
+
import requests
|
|
5
|
+
|
|
6
|
+
from synapse_sdk.utils.storage.providers import BaseStorage
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class HTTPStorage(BaseStorage):
|
|
10
|
+
"""Storage provider for no-auth HTTP file servers (e.g., Django FileSystemStorage served over HTTP)."""
|
|
11
|
+
|
|
12
|
+
OPTION_CASTS = {
|
|
13
|
+
'timeout': int,
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
def __init__(self, connection_params: str | dict):
|
|
17
|
+
super().__init__(connection_params)
|
|
18
|
+
|
|
19
|
+
# Extract base URL
|
|
20
|
+
if isinstance(connection_params, dict):
|
|
21
|
+
self.base_url = self.query_params.get('base_url', '')
|
|
22
|
+
self.timeout = self.query_params.get('timeout', 30)
|
|
23
|
+
else:
|
|
24
|
+
# Parse URL like: http://example.com/media/
|
|
25
|
+
parsed = urlparse(connection_params)
|
|
26
|
+
self.base_url = f'{parsed.scheme}://{parsed.netloc}{parsed.path}'
|
|
27
|
+
self.timeout = self.query_params.get('timeout', 30)
|
|
28
|
+
|
|
29
|
+
# Ensure base_url ends with /
|
|
30
|
+
if not self.base_url.endswith('/'):
|
|
31
|
+
self.base_url += '/'
|
|
32
|
+
|
|
33
|
+
# Setup session for connection pooling
|
|
34
|
+
self.session = requests.Session()
|
|
35
|
+
|
|
36
|
+
def _get_full_url(self, path: str) -> str:
|
|
37
|
+
"""Get the full URL for a given path."""
|
|
38
|
+
# Remove leading slash from path to avoid double slashes
|
|
39
|
+
if path.startswith('/'):
|
|
40
|
+
path = path[1:]
|
|
41
|
+
return urljoin(self.base_url, path)
|
|
42
|
+
|
|
43
|
+
def upload(self, source: str, target: str) -> str:
|
|
44
|
+
"""Upload a file to the HTTP server.
|
|
45
|
+
|
|
46
|
+
Args:
|
|
47
|
+
source: Local file path to upload
|
|
48
|
+
target: Target path on the HTTP server
|
|
49
|
+
|
|
50
|
+
Returns:
|
|
51
|
+
URL of the uploaded file
|
|
52
|
+
"""
|
|
53
|
+
url = self._get_full_url(target)
|
|
54
|
+
|
|
55
|
+
with open(source, 'rb') as f:
|
|
56
|
+
files = {'file': (os.path.basename(source), f)}
|
|
57
|
+
|
|
58
|
+
# Try PUT first (more RESTful), fallback to POST
|
|
59
|
+
response = self.session.put(url, files=files, timeout=self.timeout)
|
|
60
|
+
|
|
61
|
+
if response.status_code == 405: # Method not allowed
|
|
62
|
+
# Reset file pointer and try POST
|
|
63
|
+
f.seek(0)
|
|
64
|
+
response = self.session.post(url, files=files, timeout=self.timeout)
|
|
65
|
+
|
|
66
|
+
response.raise_for_status()
|
|
67
|
+
|
|
68
|
+
return url
|
|
69
|
+
|
|
70
|
+
def exists(self, target: str) -> bool:
|
|
71
|
+
"""Check if a file exists on the HTTP server.
|
|
72
|
+
|
|
73
|
+
Args:
|
|
74
|
+
target: Path to check
|
|
75
|
+
|
|
76
|
+
Returns:
|
|
77
|
+
True if file exists, False otherwise
|
|
78
|
+
"""
|
|
79
|
+
url = self._get_full_url(target)
|
|
80
|
+
|
|
81
|
+
try:
|
|
82
|
+
response = self.session.head(url, timeout=self.timeout)
|
|
83
|
+
return response.status_code == 200
|
|
84
|
+
except requests.RequestException:
|
|
85
|
+
return False
|
|
86
|
+
|
|
87
|
+
def get_url(self, target: str) -> str:
|
|
88
|
+
"""Get the URL for a file.
|
|
89
|
+
|
|
90
|
+
Args:
|
|
91
|
+
target: File path
|
|
92
|
+
|
|
93
|
+
Returns:
|
|
94
|
+
Full URL of the file
|
|
95
|
+
"""
|
|
96
|
+
return self._get_full_url(target)
|
|
97
|
+
|
|
98
|
+
def get_pathlib(self, path: str) -> 'HTTPPath':
|
|
99
|
+
"""Get a pathlib-like object for HTTP operations.
|
|
100
|
+
|
|
101
|
+
Args:
|
|
102
|
+
path: Path to wrap
|
|
103
|
+
|
|
104
|
+
Returns:
|
|
105
|
+
HTTPPath object
|
|
106
|
+
"""
|
|
107
|
+
return HTTPPath(self, path)
|
|
108
|
+
|
|
109
|
+
def get_path_file_count(self, pathlib_obj) -> int:
|
|
110
|
+
"""Get file count in a directory.
|
|
111
|
+
|
|
112
|
+
Note: This requires the HTTP server to provide directory listing functionality.
|
|
113
|
+
|
|
114
|
+
Args:
|
|
115
|
+
pathlib_obj: HTTPPath object
|
|
116
|
+
|
|
117
|
+
Returns:
|
|
118
|
+
File count
|
|
119
|
+
"""
|
|
120
|
+
# Most HTTP servers don't provide directory listing
|
|
121
|
+
# This would need custom server-side support
|
|
122
|
+
raise NotImplementedError('File counting requires server-side directory listing support')
|
|
123
|
+
|
|
124
|
+
def get_path_total_size(self, pathlib_obj) -> int:
|
|
125
|
+
"""Get total size of files in a directory.
|
|
126
|
+
|
|
127
|
+
Note: This requires the HTTP server to provide directory listing functionality.
|
|
128
|
+
|
|
129
|
+
Args:
|
|
130
|
+
pathlib_obj: HTTPPath object
|
|
131
|
+
|
|
132
|
+
Returns:
|
|
133
|
+
Total size in bytes
|
|
134
|
+
"""
|
|
135
|
+
# Most HTTP servers don't provide directory listing
|
|
136
|
+
# This would need custom server-side support
|
|
137
|
+
raise NotImplementedError('Size calculation requires server-side directory listing support')
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
class HTTPPath:
|
|
141
|
+
"""A pathlib-like interface for HTTP paths."""
|
|
142
|
+
|
|
143
|
+
def __init__(self, storage: HTTPStorage, path: str):
|
|
144
|
+
self.storage = storage
|
|
145
|
+
self.path = path.strip('/')
|
|
146
|
+
|
|
147
|
+
def __str__(self):
|
|
148
|
+
return self.path
|
|
149
|
+
|
|
150
|
+
def __truediv__(self, other):
|
|
151
|
+
"""Join paths using / operator."""
|
|
152
|
+
new_path = f'{self.path}/{other}' if self.path else str(other)
|
|
153
|
+
return HTTPPath(self.storage, new_path)
|
|
154
|
+
|
|
155
|
+
def joinuri(self, *parts):
|
|
156
|
+
"""Join path parts."""
|
|
157
|
+
parts = [self.path] + [str(p) for p in parts]
|
|
158
|
+
new_path = '/'.join(p.strip('/') for p in parts if p)
|
|
159
|
+
return HTTPPath(self.storage, new_path)
|
|
160
|
+
|
|
161
|
+
@property
|
|
162
|
+
def name(self):
|
|
163
|
+
"""Get the final component of the path."""
|
|
164
|
+
return os.path.basename(self.path)
|
|
165
|
+
|
|
166
|
+
@property
|
|
167
|
+
def parent(self):
|
|
168
|
+
"""Get the parent directory."""
|
|
169
|
+
parent_path = os.path.dirname(self.path)
|
|
170
|
+
return HTTPPath(self.storage, parent_path)
|
|
171
|
+
|
|
172
|
+
def exists(self):
|
|
173
|
+
"""Check if this path exists."""
|
|
174
|
+
return self.storage.exists(self.path)
|
|
175
|
+
|
|
176
|
+
def is_file(self):
|
|
177
|
+
"""Check if this path is a file."""
|
|
178
|
+
# For HTTP, we assume it's a file if it exists
|
|
179
|
+
return self.exists()
|
|
180
|
+
|
|
181
|
+
def read_bytes(self):
|
|
182
|
+
"""Read file contents as bytes."""
|
|
183
|
+
url = self.storage.get_url(self.path)
|
|
184
|
+
response = self.storage.session.get(url, timeout=self.storage.timeout)
|
|
185
|
+
response.raise_for_status()
|
|
186
|
+
return response.content
|
|
187
|
+
|
|
188
|
+
def read_text(self, encoding='utf-8'):
|
|
189
|
+
"""Read file contents as text."""
|
|
190
|
+
return self.read_bytes().decode(encoding)
|
|
@@ -13,15 +13,17 @@ class S3Storage(BaseStorage):
|
|
|
13
13
|
self.upath = self._get_upath()
|
|
14
14
|
|
|
15
15
|
def _get_upath(self):
|
|
16
|
+
client_kwargs = {'region_name': self.query_params.get('region_name', self.DEFAULT_REGION)}
|
|
17
|
+
|
|
18
|
+
if self.query_params.get('endpoint_url'):
|
|
19
|
+
client_kwargs['endpoint_url'] = self.query_params['endpoint_url']
|
|
20
|
+
|
|
16
21
|
upath_kwargs = {
|
|
17
22
|
'key': self.query_params['access_key'],
|
|
18
23
|
'secret': self.query_params['secret_key'],
|
|
19
|
-
'client_kwargs':
|
|
24
|
+
'client_kwargs': client_kwargs,
|
|
20
25
|
}
|
|
21
26
|
|
|
22
|
-
if self.query_params.get('endpoint_url'):
|
|
23
|
-
upath_kwargs['endpoint_url'] = self.query_params['endpoint_url']
|
|
24
|
-
|
|
25
27
|
return UPath(
|
|
26
28
|
f's3://{self.query_params["bucket_name"]}',
|
|
27
29
|
**upath_kwargs,
|
|
@@ -29,15 +31,61 @@ class S3Storage(BaseStorage):
|
|
|
29
31
|
|
|
30
32
|
def upload(self, source, target):
|
|
31
33
|
with open(source, 'rb') as file:
|
|
32
|
-
self.upath.
|
|
34
|
+
(self.upath / target).write_bytes(file.read())
|
|
33
35
|
|
|
34
36
|
return self.get_url(target)
|
|
35
37
|
|
|
36
38
|
def exists(self, target):
|
|
37
|
-
return self.upath.exists(
|
|
39
|
+
return (self.upath / target).exists()
|
|
38
40
|
|
|
39
41
|
def get_url(self, target):
|
|
40
42
|
return str(self.upath.joinuri(target))
|
|
41
43
|
|
|
42
44
|
def get_pathlib(self, path):
|
|
43
45
|
return self.upath.joinuri(path)
|
|
46
|
+
|
|
47
|
+
def get_path_file_count(self, pathlib_obj: UPath):
|
|
48
|
+
"""Get file count in the path from S3 provider.
|
|
49
|
+
|
|
50
|
+
TODO: Need to find a method to get file count using S3 API
|
|
51
|
+
|
|
52
|
+
Args:
|
|
53
|
+
pathlib_obj (UPath): The path to get file count.
|
|
54
|
+
|
|
55
|
+
Returns:
|
|
56
|
+
int: The file count in the path.
|
|
57
|
+
"""
|
|
58
|
+
count = 0
|
|
59
|
+
files = list(pathlib_obj.glob('**/*'))
|
|
60
|
+
for file in files:
|
|
61
|
+
if file.is_file():
|
|
62
|
+
count += 1
|
|
63
|
+
return count
|
|
64
|
+
|
|
65
|
+
def get_path_total_size(self, pathlib_obj: UPath):
|
|
66
|
+
"""Get total size of the files in the path from S3 provider.
|
|
67
|
+
|
|
68
|
+
TODO: Need to find a method to get total file size using S3 API
|
|
69
|
+
|
|
70
|
+
Args:
|
|
71
|
+
pathlib_obj (UPath): The path to get total size.
|
|
72
|
+
|
|
73
|
+
Returns:
|
|
74
|
+
int: The total size of the files in the path.
|
|
75
|
+
"""
|
|
76
|
+
total_size = 0
|
|
77
|
+
for file in pathlib_obj.glob('**/*'):
|
|
78
|
+
if file.is_file():
|
|
79
|
+
total_size += file.stat().st_size
|
|
80
|
+
return total_size
|
|
81
|
+
|
|
82
|
+
def glob(self, pattern):
|
|
83
|
+
"""Glob pattern matching in S3 storage.
|
|
84
|
+
|
|
85
|
+
Args:
|
|
86
|
+
pattern (str): The glob pattern to match.
|
|
87
|
+
|
|
88
|
+
Returns:
|
|
89
|
+
list: List of matching paths.
|
|
90
|
+
"""
|
|
91
|
+
return list((self.upath / '').glob(pattern))
|
|
@@ -14,3 +14,34 @@ class SFTPStorage(BaseStorage):
|
|
|
14
14
|
if path == '/':
|
|
15
15
|
path = ''
|
|
16
16
|
return UPath(f'sftp://{host}', username=username, password=password) / root_path / path
|
|
17
|
+
|
|
18
|
+
def get_path_file_count(self, pathlib_obj: UPath):
|
|
19
|
+
"""Get file count in the path from SFTP provider.
|
|
20
|
+
|
|
21
|
+
Args:
|
|
22
|
+
pathlib_obj (UPath): The path to get file count.
|
|
23
|
+
|
|
24
|
+
Returns:
|
|
25
|
+
int: The file count in the path.
|
|
26
|
+
"""
|
|
27
|
+
count = 0
|
|
28
|
+
files = list(pathlib_obj.glob('**/*'))
|
|
29
|
+
for file in files:
|
|
30
|
+
if file.is_file():
|
|
31
|
+
count += 1
|
|
32
|
+
return count
|
|
33
|
+
|
|
34
|
+
def get_path_total_size(self, pathlib_obj: UPath):
|
|
35
|
+
"""Get total size of the files in the path from SFTP provider.
|
|
36
|
+
|
|
37
|
+
Args:
|
|
38
|
+
pathlib_obj (UPath): The path to get total size.
|
|
39
|
+
|
|
40
|
+
Returns:
|
|
41
|
+
int: The total size of the files in the path.
|
|
42
|
+
"""
|
|
43
|
+
total_size = 0
|
|
44
|
+
for file in pathlib_obj.glob('**/*'):
|
|
45
|
+
if file.is_file():
|
|
46
|
+
total_size += file.stat().st_size
|
|
47
|
+
return total_size
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
from synapse_sdk.utils.storage.providers.file_system import FileSystemStorage
|
|
1
2
|
from synapse_sdk.utils.storage.providers.gcp import GCPStorage
|
|
3
|
+
from synapse_sdk.utils.storage.providers.http import HTTPStorage
|
|
2
4
|
from synapse_sdk.utils.storage.providers.s3 import S3Storage
|
|
3
5
|
from synapse_sdk.utils.storage.providers.sftp import SFTPStorage
|
|
4
6
|
|
|
@@ -6,6 +8,10 @@ STORAGE_PROVIDERS = {
|
|
|
6
8
|
's3': S3Storage,
|
|
7
9
|
'amazon_s3': S3Storage,
|
|
8
10
|
'minio': S3Storage,
|
|
11
|
+
'gs': GCPStorage,
|
|
9
12
|
'gcp': GCPStorage,
|
|
10
13
|
'sftp': SFTPStorage,
|
|
14
|
+
'http': HTTPStorage,
|
|
15
|
+
'https': HTTPStorage,
|
|
16
|
+
'file_system': FileSystemStorage,
|
|
11
17
|
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: synapse-sdk
|
|
3
|
+
Version: 2025.11.7
|
|
4
|
+
Summary: synapse sdk
|
|
5
|
+
Author-email: datamaker <developer@datamaker.io>
|
|
6
|
+
License: MIT
|
|
7
|
+
Classifier: Programming Language :: Python :: 3
|
|
8
|
+
Requires-Python: >=3.10
|
|
9
|
+
Description-Content-Type: text/markdown
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Requires-Dist: boto3
|
|
12
|
+
Requires-Dist: click
|
|
13
|
+
Requires-Dist: cookiecutter
|
|
14
|
+
Requires-Dist: requests
|
|
15
|
+
Requires-Dist: tqdm
|
|
16
|
+
Requires-Dist: openpyxl
|
|
17
|
+
Requires-Dist: python-dotenv
|
|
18
|
+
Requires-Dist: pyyaml
|
|
19
|
+
Requires-Dist: pydantic
|
|
20
|
+
Requires-Dist: pyjwt
|
|
21
|
+
Requires-Dist: universal-pathlib
|
|
22
|
+
Requires-Dist: fsspec[gcs,s3,sftp]
|
|
23
|
+
Requires-Dist: inquirer
|
|
24
|
+
Requires-Dist: pillow
|
|
25
|
+
Requires-Dist: websockets
|
|
26
|
+
Requires-Dist: ffmpeg-python==0.2.0
|
|
27
|
+
Requires-Dist: sentry-sdk==2.38.0
|
|
28
|
+
Provides-Extra: all
|
|
29
|
+
Requires-Dist: ray[all]==2.50.0; extra == "all"
|
|
30
|
+
Requires-Dist: python-nmap; extra == "all"
|
|
31
|
+
Requires-Dist: hyperopt; extra == "all"
|
|
32
|
+
Requires-Dist: bayesian-optimization==1.4.3; extra == "all"
|
|
33
|
+
Provides-Extra: devtools
|
|
34
|
+
Requires-Dist: streamlit>=1.29.0; extra == "devtools"
|
|
35
|
+
Requires-Dist: streamlit-ace>=0.1.1; extra == "devtools"
|
|
36
|
+
Provides-Extra: test
|
|
37
|
+
Requires-Dist: pytest>=7.0.0; extra == "test"
|
|
38
|
+
Requires-Dist: pytest-cov>=4.0.0; extra == "test"
|
|
39
|
+
Requires-Dist: pytest-mock>=3.10.0; extra == "test"
|
|
40
|
+
Requires-Dist: pytest-timeout>=2.1.0; extra == "test"
|
|
41
|
+
Requires-Dist: pytest-xdist>=3.0.0; extra == "test"
|
|
42
|
+
Requires-Dist: pytest-html>=3.1.0; extra == "test"
|
|
43
|
+
Requires-Dist: pytest-json-report>=1.5.0; extra == "test"
|
|
44
|
+
Requires-Dist: requests-mock>=1.10.0; extra == "test"
|
|
45
|
+
Requires-Dist: responses>=0.25.0; extra == "test"
|
|
46
|
+
Provides-Extra: dev
|
|
47
|
+
Requires-Dist: pre-commit; extra == "dev"
|
|
48
|
+
Dynamic: license-file
|
|
49
|
+
|
|
50
|
+
# 🧠 Synapse SDK
|
|
51
|
+
|
|
52
|
+

|
|
53
|
+

|
|
54
|
+
|
|
55
|
+
A Python SDK for building and managing ML plugins, data annotation workflows, and AI agents.
|
|
56
|
+
|
|
57
|
+
## ✨ Features
|
|
58
|
+
|
|
59
|
+
- **🔌 Plugin System**: Create and manage ML plugins with categories like neural networks, data validation, and export tools
|
|
60
|
+
- **🤖 Agent Management**: Backend and Ray-based agent clients for distributed AI workflows
|
|
61
|
+
- **🔄 Data Converters**: Convert between formats (COCO, Pascal VOC, YOLO) and annotation schemas
|
|
62
|
+
- **🛠️ Development Tools**: Interactive web dashboard for monitoring and debugging
|
|
63
|
+
- **⚡ CLI Interface**: Command-line tool for configuration, plugin management, and development
|
|
64
|
+
|
|
65
|
+
## 📅 Versioning
|
|
66
|
+
|
|
67
|
+
Synapse SDK uses **CalVer (Calendar Versioning)**.
|
|
68
|
+
The version format is `YYYY.MM.PATCH`, based on the release year and month.
|
|
69
|
+
|
|
70
|
+
Examples:
|
|
71
|
+
|
|
72
|
+
- `2025.9.5` → 5th release in September 2025
|
|
73
|
+
- `2025.10.1` → 1st release in October 2025
|
|
74
|
+
|
|
75
|
+
We recommend using the latest monthly release.
|
|
76
|
+
If needed, you can pin to a specific month, e.g. `2025.9.*`.
|
|
77
|
+
|
|
78
|
+
## 🚀 Quick Start
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
pip install synapse-sdk
|
|
82
|
+
synapse --help
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## 🔍 Code Review
|
|
86
|
+
|
|
87
|
+
This repository uses systematic code review with P1-P4 priority rules:
|
|
88
|
+
|
|
89
|
+
### Using the Review-PR Command
|
|
90
|
+
|
|
91
|
+
Review pull requests using the integrated review system:
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
# Review a PR with English comments
|
|
95
|
+
/review-pr 123
|
|
96
|
+
|
|
97
|
+
# Review a PR with Korean comments
|
|
98
|
+
/review-pr 123 ko
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Code Review Priority Levels
|
|
102
|
+
|
|
103
|
+
- **[P1_rules.md](P1_rules.md)** - Security and Stability (Critical) 🔴
|
|
104
|
+
- **[P2_rules.md](P2_rules.md)** - Core Functionality (High Priority) 🟡
|
|
105
|
+
- **[P3_rules.md](P3_rules.md)** - Best Practices (Medium Priority) 🟠
|
|
106
|
+
- **[P4_rules.md](P4_rules.md)** - Code Style (Low Priority) 🔵
|
|
107
|
+
|
|
108
|
+
### Review Process
|
|
109
|
+
|
|
110
|
+
1. **Automated Analysis**: The review-pr command systematically applies P1-P4 rules
|
|
111
|
+
2. **Priority-Based Feedback**: Issues are categorized by severity and impact
|
|
112
|
+
3. **Actionable Comments**: Each issue includes specific recommendations and rule references
|
|
113
|
+
4. **Language Support**: Comments can be generated in English or Korean
|
|
114
|
+
5. **Decision Logic**:
|
|
115
|
+
- P1, P2, or P3 violations → Request Changes
|
|
116
|
+
- Only P4 violations or no issues → Approve
|
|
117
|
+
|
|
118
|
+
See [AGENT.md](AGENT.md) for complete development guidelines and code review rules.
|
|
119
|
+
|
|
120
|
+
## 📚 Documentation
|
|
121
|
+
|
|
122
|
+
*Docs [https://docs.synapse.sh](https://docs.synapse.sh)*
|