weightslab 1.2.1__tar.gz → 1.2.3__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.
- {weightslab-1.2.1 → weightslab-1.2.3}/.github/workflows/ci.yml +80 -12
- {weightslab-1.2.1 → weightslab-1.2.3}/.github/workflows/release.yml +26 -9
- {weightslab-1.2.1 → weightslab-1.2.3}/.gitignore +4 -0
- weightslab-1.2.3/AGENTS.md +209 -0
- weightslab-1.2.3/CHANGELOG.md +1 -0
- {weightslab-1.2.1/weightslab.egg-info → weightslab-1.2.3}/PKG-INFO +120 -219
- {weightslab-1.2.1 → weightslab-1.2.3}/README.md +118 -218
- {weightslab-1.2.1 → weightslab-1.2.3}/docs/quickstart.rst +55 -4
- {weightslab-1.2.1 → weightslab-1.2.3}/pyproject.toml +1 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/__init__.py +38 -44
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/_version.py +3 -3
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/backend/dataloader_interface.py +48 -9
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/components/global_monitoring.py +8 -2
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/data/data_utils.py +34 -1
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/data/dataframe_manager.py +3 -3
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/data/h5_dataframe_store.py +12 -0
- weightslab-1.2.3/weightslab/data/point_cloud_utils.py +722 -0
- weightslab-1.2.3/weightslab/examples/Docker_training/README.md +38 -0
- weightslab-1.2.3/weightslab/examples/Docker_training/docker_in_docker/Dockerfile +58 -0
- weightslab-1.2.3/weightslab/examples/Docker_training/docker_in_docker/README.md +161 -0
- weightslab-1.2.3/weightslab/examples/Docker_training/docker_in_docker/docker-compose.yml +54 -0
- weightslab-1.2.3/weightslab/examples/Docker_training/docker_in_docker/entrypoint.sh +67 -0
- weightslab-1.2.3/weightslab/examples/Docker_training/siblings_self_contained/Dockerfile +56 -0
- weightslab-1.2.3/weightslab/examples/Docker_training/siblings_self_contained/README.md +159 -0
- weightslab-1.2.3/weightslab/examples/Docker_training/siblings_self_contained/docker-compose.yml +44 -0
- weightslab-1.2.3/weightslab/examples/Docker_training/siblings_self_contained/entrypoint.sh +101 -0
- weightslab-1.2.3/weightslab/examples/Docker_training/siblings_self_contained/ui-compose.yml +61 -0
- {weightslab-1.2.1/weightslab/examples/PyTorch_Lightning → weightslab-1.2.3/weightslab/examples/Lightning}/ws-classification/main.py +4 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-classification/config.yaml +7 -8
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-classification/main.py +15 -4
- {weightslab-1.2.1/weightslab/examples/PyTorch/ws-face_recognition-triplet_loss → weightslab-1.2.3/weightslab/examples/PyTorch/ws-clustering}/config.yaml +1 -1
- {weightslab-1.2.1/weightslab/examples/PyTorch/ws-face_recognition-triplet_loss → weightslab-1.2.3/weightslab/examples/PyTorch/ws-clustering}/main.py +12 -8
- weightslab-1.2.3/weightslab/examples/PyTorch/ws-detection/README.md +102 -0
- weightslab-1.2.3/weightslab/examples/PyTorch/ws-detection/config.yaml +50 -0
- weightslab-1.2.3/weightslab/examples/PyTorch/ws-detection/main.py +340 -0
- weightslab-1.2.3/weightslab/examples/PyTorch/ws-detection/utils/criterions.py +247 -0
- weightslab-1.2.3/weightslab/examples/PyTorch/ws-detection/utils/data.py +226 -0
- weightslab-1.2.3/weightslab/examples/PyTorch/ws-detection/utils/model.py +134 -0
- {weightslab-1.2.1/weightslab/examples/PyTorch/ws-vad → weightslab-1.2.3/weightslab/examples/PyTorch/ws-generation}/config.yaml +4 -4
- {weightslab-1.2.1/weightslab/examples/PyTorch/ws-vad → weightslab-1.2.3/weightslab/examples/PyTorch/ws-generation}/main.py +6 -2
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/config.yaml +3 -3
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/main.py +6 -10
- {weightslab-1.2.1/weightslab/examples/PyTorch/ws-detection/src → weightslab-1.2.3/weightslab/examples/Ultralytics/ws-detection}/config.yaml +1 -1
- weightslab-1.2.1/weightslab/examples/PyTorch/ws-detection/src/main_ul_native.py → weightslab-1.2.3/weightslab/examples/Ultralytics/ws-detection/main.py +7 -0
- weightslab-1.2.3/weightslab/examples/Usecases/ws-2d-lidar-detection/README.md +66 -0
- weightslab-1.2.3/weightslab/examples/Usecases/ws-2d-lidar-detection/config.yaml +46 -0
- weightslab-1.2.3/weightslab/examples/Usecases/ws-2d-lidar-detection/main.py +197 -0
- weightslab-1.2.3/weightslab/examples/Usecases/ws-2d-lidar-detection/utils/criterions.py +156 -0
- weightslab-1.2.3/weightslab/examples/Usecases/ws-2d-lidar-detection/utils/data.py +162 -0
- weightslab-1.2.3/weightslab/examples/Usecases/ws-2d-lidar-detection/utils/model.py +148 -0
- weightslab-1.2.3/weightslab/examples/Usecases/ws-3d-lidar-detection/README.md +190 -0
- weightslab-1.2.3/weightslab/examples/Usecases/ws-3d-lidar-detection/config.yaml +72 -0
- weightslab-1.2.3/weightslab/examples/Usecases/ws-3d-lidar-detection/main.py +431 -0
- weightslab-1.2.3/weightslab/examples/Usecases/ws-3d-lidar-detection/utils/criterions.py +279 -0
- weightslab-1.2.3/weightslab/examples/Usecases/ws-3d-lidar-detection/utils/data.py +597 -0
- weightslab-1.2.3/weightslab/examples/Usecases/ws-3d-lidar-detection/utils/kitti_download.py +190 -0
- weightslab-1.2.3/weightslab/examples/Usecases/ws-3d-lidar-detection/utils/model.py +232 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/integrations/ultralytics/dataset.py +5 -3
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/integrations/ultralytics/trainer.py +23 -10
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/proto/experiment_service.proto +27 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/proto/experiment_service_pb2.py +55 -51
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/proto/experiment_service_pb2_grpc.py +45 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/security/cert_auth_manager.py +64 -12
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/src.py +76 -9
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/backend/test_compare_dataloaders.py +18 -2
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/backend/test_data_loader_interface.py +37 -46
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/backend/test_logger_core.py +5 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/backend/test_model_interface_unit.py +4 -0
- weightslab-1.2.3/weightslab/tests/backend/test_ui_docker_bridge.py +718 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/backend/test_write_dataframe.py +3 -2
- weightslab-1.2.3/weightslab/tests/data/test_point_cloud_utils.py +330 -0
- weightslab-1.2.3/weightslab/tests/gRPC/test_get_point_cloud.py +99 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/gRPC/test_grpc_user_actions.py +5 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/trainer/services/test_trainer_services_unit.py +6 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/trainer/services/agent/agent.py +32 -1
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/trainer/services/data_service.py +268 -56
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/trainer/trainer_services.py +39 -25
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/ui/docker/DEPLOYMENT.md +14 -4
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/ui/docker/nginx-entrypoint.sh +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/ui/docker/test-deployment.sh +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/ui/docker/utils/build-and-deploy.sh +83 -62
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/ui/docker/utils/generate-certs-auth-token.ps1 +8 -2
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/ui/docker/utils/generate-certs-auth-token.sh +10 -1
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/ui/docker/utils/test-deployment.sh +0 -0
- weightslab-1.2.3/weightslab/ui_docker_bridge.py +1123 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/utils/logs.py +28 -0
- {weightslab-1.2.1 → weightslab-1.2.3/weightslab.egg-info}/PKG-INFO +120 -219
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab.egg-info/SOURCES.txt +47 -21
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab.egg-info/requires.txt +1 -0
- weightslab-1.2.1/CHANGELOG.md +0 -1
- weightslab-1.2.1/_ck.txt +0 -1938
- weightslab-1.2.1/weightslab/examples/PyTorch/ws-detection/src/main.py +0 -135
- weightslab-1.2.1/weightslab/examples/PyTorch/ws-detection/src/utils/criterions.py +0 -390
- weightslab-1.2.1/weightslab/examples/PyTorch/ws-detection/src/utils/data.py +0 -116
- weightslab-1.2.1/weightslab/examples/PyTorch/ws-detection/src/utils/trainer.py +0 -195
- weightslab-1.2.1/weightslab/examples/PyTorch/ws-detection/src/yolo_pipeline.py +0 -171
- weightslab-1.2.1/weightslab/tests/backend/test_ui_docker_bridge.py +0 -567
- weightslab-1.2.1/weightslab/tests/test_ddp_down_only_change.py +0 -62
- weightslab-1.2.1/weightslab/ui_docker_bridge.py +0 -589
- {weightslab-1.2.1 → weightslab-1.2.3}/.gitattributes +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/.github/workflows/docs-pages.yml +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/LICENSE +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/agent_config.yaml +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/docs/_static/.gitkeep +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/docs/_static/custom.css +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/docs/_static/favicon.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/docs/_static/logo-dark.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/docs/_static/logo-light.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/docs/_static/version-switcher.js +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/docs/_static/weights_studio_architecture.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/docs/_templates/.gitkeep +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/docs/conf.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/docs/configuration.rst +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/docs/data_exploration.rst +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/docs/four_way_approach.rst +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/docs/grpc/audit_logger.rst +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/docs/grpc/grpc_functions.rst +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/docs/grpc/index.rst +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/docs/hyperparameters.rst +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/docs/index.rst +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/docs/logger.rst +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/docs/model_interaction.rst +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/docs/pytorch_lightning.rst +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/docs/requirements.txt +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/docs/segmentation_usecase.rst +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/docs/usecases.rst +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/docs/user_functions.rst +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/docs/weights_studio.rst +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/setup.cfg +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/art.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/backend/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/backend/audit_logger.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/backend/cli.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/backend/ledgers.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/backend/logger.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/backend/model_interface.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/backend/optimizer_interface.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/baseline_models/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/baseline_models/pytorch/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/baseline_models/pytorch/models.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/components/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/components/checkpoint_manager.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/components/evaluation_controller.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/components/experiment_hash.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/components/parallel_primitives.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/components/tracking.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/data/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/data/array_proxy.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/data/data_samples_with_ops.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/data/h5_array_store.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/data/sample_stats.py +0 -0
- {weightslab-1.2.1/weightslab/examples/PyTorch_Lightning → weightslab-1.2.3/weightslab/examples/Lightning}/ws-classification/config.yaml +0 -0
- {weightslab-1.2.1/weightslab/examples/PyTorch/ws-face_recognition-triplet_loss → weightslab-1.2.3/weightslab/examples/PyTorch/ws-clustering}/face/__init__.py +0 -0
- {weightslab-1.2.1/weightslab/examples/PyTorch/ws-face_recognition-triplet_loss → weightslab-1.2.3/weightslab/examples/PyTorch/ws-clustering}/face/data.py +0 -0
- {weightslab-1.2.1/weightslab/examples/PyTorch/ws-face_recognition-triplet_loss → weightslab-1.2.3/weightslab/examples/PyTorch/ws-clustering}/face/model.py +0 -0
- {weightslab-1.2.1/weightslab/examples/PyTorch/ws-face_recognition-triplet_loss → weightslab-1.2.3/weightslab/examples/PyTorch/ws-clustering}/face/signals.py +0 -0
- {weightslab-1.2.1/weightslab/examples/PyTorch/ws-face_recognition-triplet_loss → weightslab-1.2.3/weightslab/examples/PyTorch/ws-clustering}/face/utils.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/0000f77c-6257be58.jpg +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/000f8d37-d4c09a0f.jpg +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00a0f008-a315437f.jpg +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00c12bd0-bb46e479.jpg +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00c29c52-f9524f1e.jpg +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00ce6f6d-50bbee62.jpg +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00d1bafa-1b47b41c.jpg +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00d7268f-fd4487be.jpg +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00f0dd0f-5e9c9557.jpg +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/0a0d7f4c-ac5c3c8f.jpg +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/0a1f4fce-f9cac880.jpg +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/0a3bb2d8-c195d91e.jpg +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1cac6a7-04e33135.jpg +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1ceb32e-3f481b43.jpg +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1d10d08-5b108225.jpg +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1d22449-15fb948f.jpg +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1d7b3ac-5af8623b.jpg +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1dce572-c6a8cb5e.jpg +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1e1a7b8-0aec80e8.jpg +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1e8ad72-c3c79240.jpg +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1ee702d-0ae1fc10.jpg +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1f0efd9-37a14dda.jpg +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b2a0648b-d8e126bc.jpg +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b2b70230-bad4ff6e.jpg +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/0000f77c-6257be58.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/000f8d37-d4c09a0f.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00a0f008-a315437f.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00c12bd0-bb46e479.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00c29c52-f9524f1e.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00ce6f6d-50bbee62.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00d1bafa-1b47b41c.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00d7268f-fd4487be.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00f0dd0f-5e9c9557.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/0a0d7f4c-ac5c3c8f.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/0a1f4fce-f9cac880.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/0a3bb2d8-c195d91e.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1cac6a7-04e33135.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1ceb32e-3f481b43.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1d10d08-5b108225.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1d22449-15fb948f.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1d7b3ac-5af8623b.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1dce572-c6a8cb5e.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1e1a7b8-0aec80e8.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1e8ad72-c3c79240.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1ee702d-0ae1fc10.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1f0efd9-37a14dda.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b2a0648b-d8e126bc.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b2b70230-bad4ff6e.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/utils/criterions.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/utils/data.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/utils/model.py +0 -0
- {weightslab-1.2.1/weightslab/examples/PyTorch/ws-detection/src → weightslab-1.2.3/weightslab/examples/Ultralytics/ws-detection}/requirements.txt +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/integrations/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/integrations/ultralytics/README.md +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/integrations/ultralytics/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/integrations/ultralytics/_utils.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/integrations/ultralytics/collate.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/integrations/ultralytics/signals.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/models/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/models/model_with_ops.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/models/monkey_patcher.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/modules/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/modules/modules_with_ops.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/modules/neuron_ops.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/proto/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/security/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/backend/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/backend/test_audit_logger.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/backend/test_cli_additional_unit.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/backend/test_instance_signal_logger.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/backend/test_ledgers.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/backend/test_optimizer_interface.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/backend/test_optimizer_interface_additional_unit.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/backend/test_write_history.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/chaos_monkeys_utests/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/chaos_monkeys_utests/test_grpc_chaos_monkey_robustness.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/components/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/components/test_checkpoint_workflow.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/components/test_experiment_hash_and_art.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/components/test_global_monitoring_unit.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/data/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/data/test_data_samples_with_ops.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/data/test_data_service_metadata_copy.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/data/test_data_utils_unit.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/data/test_dataframe_manager_unit.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/data/test_flush_pipeline.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/data/test_h5_array_store.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/data/test_h5_dataframe_store.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/gRPC/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/gRPC/test_grpc_tag_operations.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/general/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/general/test_auditor_mode.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/general/test_cli.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/general/test_hyperparams.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/general/test_logger_snapshot_rotation.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/general/test_signals.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/general/test_signals_wrapping.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/integrations/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/integrations/test_pytorch_lightning_integration.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/integrations/ultralytics/ddp/ddp_ablation.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/integrations/ultralytics/ddp/ddp_test_suite.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/model/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/model/test_constraint_generation.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/model/test_dependency_patterns.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/model/test_logger.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/model/test_model_with_ops.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/model/test_model_with_ops_unit.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/model/test_tracking.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/modules/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/modules/test_modules_with_ops.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/test_secure_docker.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/test_src_functions.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/trainer/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/trainer/services/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/trainer/services/test_agent_prompt_unit.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/trainer/services/test_agent_service_unit.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/trainer/services/test_trainer_services_server.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/trainer/test_trainer_tools.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/utils/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/utils/test_computational_graph_utils_unit.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/utils/test_logs_unit.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/utils/test_modules_dependencies_unit.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/utils/test_plot_graph_render_unit.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/utils/test_plot_graph_unit.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/utils/test_shape_prop_unit.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/utils/test_utils_tools_unit.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/watchdog/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/watchdog/test_lock_monitor.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/watchdog/test_watchdog.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/trainer/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/trainer/experiment_context.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/trainer/services/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/trainer/services/agent/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/trainer/services/agent/agent_overview/agent.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/trainer/services/agent/agent_overview/query_example.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/trainer/services/agent/agent_overview/schema.png +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/trainer/services/agent/intent_prompt.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/trainer/services/agent_service.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/trainer/services/data_image_utils.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/trainer/services/experiment_service.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/trainer/services/instance_merger.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/trainer/services/model_service.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/trainer/services/utils/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/trainer/services/utils/tools.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/trainer/trainer_tools.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/ui/Dockerfile +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/ui/docker/.dockerignore +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/ui/docker/.env.example +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/ui/docker/docker-compose.yml +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/ui/docker/nginx.base-path.conf copy.template +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/ui/docker/nginx.base-path.conf.template +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/ui/docker/nginx.conf +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/ui/envoy/envoy.downstream_plaintext.yaml +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/ui/envoy/envoy.downstream_upstream_plaintext.yaml +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/ui/envoy/envoy.upstream_plaintext.yaml +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/ui/envoy/envoy.yaml +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/ui/nginx.conf +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/utils/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/utils/computational_graph.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/utils/modules_dependencies.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/utils/plot_graph.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/utils/shape_prop.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/utils/tools.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/watchdog/__init__.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/watchdog/grpc_watchdog.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/watchdog/lock_monitor.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/watchdog/log_level.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/watchdog/watchdog.py +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab.egg-info/dependency_links.txt +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab.egg-info/entry_points.txt +0 -0
- {weightslab-1.2.1 → weightslab-1.2.3}/weightslab.egg-info/top_level.txt +0 -0
|
@@ -95,19 +95,22 @@ jobs:
|
|
|
95
95
|
echo "$FILES" | xargs vulture --min-confidence 70 ./weightslab || true
|
|
96
96
|
fi
|
|
97
97
|
|
|
98
|
+
# ── Fast install gate (always runs) ──────────────────────────────────────
|
|
99
|
+
# Single-version install on 3.11 — always runs so `test` has a gate to
|
|
100
|
+
# depend on regardless of branch.
|
|
98
101
|
install:
|
|
99
102
|
if: ${{ github.event_name != 'push' || !startsWith(github.ref, 'refs/tags/') }}
|
|
100
103
|
runs-on: ubuntu-latest
|
|
104
|
+
name: install (Python 3.11)
|
|
101
105
|
steps:
|
|
102
106
|
- name: Checkout repository
|
|
103
107
|
uses: actions/checkout@v4
|
|
104
108
|
|
|
105
|
-
- name: Set up Python
|
|
109
|
+
- name: Set up Python 3.11
|
|
106
110
|
uses: actions/setup-python@v5
|
|
107
111
|
with:
|
|
108
112
|
python-version: '3.11'
|
|
109
113
|
|
|
110
|
-
|
|
111
114
|
- name: Install project dependencies
|
|
112
115
|
run: |
|
|
113
116
|
python -m pip install --upgrade pip
|
|
@@ -117,9 +120,49 @@ jobs:
|
|
|
117
120
|
run: |
|
|
118
121
|
python -c "import weightslab; print(f'weightslab imported successfully')"
|
|
119
122
|
|
|
123
|
+
# ── Full Python version matrix (PR and main only) ─────────────────────────
|
|
124
|
+
# Verifies that `pip install` + basic import work across all supported Python
|
|
125
|
+
# versions. Runs on every PR and every push to main; skipped on dev/other
|
|
126
|
+
# branch pushes to avoid unnecessary cost on work-in-progress commits.
|
|
127
|
+
install-matrix:
|
|
128
|
+
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }}
|
|
129
|
+
runs-on: ubuntu-latest
|
|
130
|
+
strategy:
|
|
131
|
+
fail-fast: false # keep running other versions if one fails
|
|
132
|
+
matrix:
|
|
133
|
+
include:
|
|
134
|
+
- python-version: '3.10'
|
|
135
|
+
- python-version: '3.11'
|
|
136
|
+
- python-version: '3.12'
|
|
137
|
+
- python-version: '3.13'
|
|
138
|
+
- python-version: '3.14'
|
|
139
|
+
allow-prereleases: true # 3.14 is pre-release; visible failure but non-blocking
|
|
140
|
+
name: install (Python ${{ matrix.python-version }})
|
|
141
|
+
# 3.14 pre-release failures are informational — don't block the pipeline.
|
|
142
|
+
continue-on-error: ${{ matrix.allow-prereleases == true }}
|
|
143
|
+
steps:
|
|
144
|
+
- name: Checkout repository
|
|
145
|
+
uses: actions/checkout@v4
|
|
146
|
+
|
|
147
|
+
- name: Set up Python ${{ matrix.python-version }}
|
|
148
|
+
uses: actions/setup-python@v5
|
|
149
|
+
with:
|
|
150
|
+
python-version: ${{ matrix.python-version }}
|
|
151
|
+
allow-prereleases: ${{ matrix.allow-prereleases || false }}
|
|
152
|
+
|
|
153
|
+
- name: Install project dependencies
|
|
154
|
+
run: |
|
|
155
|
+
python -m pip install --upgrade pip
|
|
156
|
+
python -m pip install -e . --extra-index-url https://download.pytorch.org/whl/cpu
|
|
157
|
+
|
|
158
|
+
- name: Verify installation
|
|
159
|
+
run: |
|
|
160
|
+
python -c "import weightslab; print(f'weightslab imported successfully on Python ${{ matrix.python-version }}')"
|
|
161
|
+
|
|
120
162
|
test:
|
|
121
163
|
if: ${{ github.event_name != 'push' || !startsWith(github.ref, 'refs/tags/') }}
|
|
122
164
|
runs-on: ubuntu-latest
|
|
165
|
+
# Depends on the fast 3.11 gate only — the matrix runs independently in parallel.
|
|
123
166
|
needs: install
|
|
124
167
|
steps:
|
|
125
168
|
- name: Checkout repository
|
|
@@ -133,13 +176,17 @@ jobs:
|
|
|
133
176
|
- name: Install project dependencies
|
|
134
177
|
run: |
|
|
135
178
|
python -m pip install --upgrade pip
|
|
136
|
-
|
|
179
|
+
# Install the test extra so pytest, graphviz, torchmetrics,
|
|
180
|
+
# pytorch-lightning and tensorboard are available (several test modules
|
|
181
|
+
# import pytest / use pytest fixtures and cannot run under bare unittest).
|
|
182
|
+
python -m pip install '.[utest]' --extra-index-url https://download.pytorch.org/whl/cpu
|
|
183
|
+
python -m pip install pytest-timeout
|
|
137
184
|
|
|
138
185
|
- name: Run unit tests - General
|
|
139
186
|
run: |
|
|
140
187
|
export WEIGHTSLAB_LOG_LEVEL="DEBUG"
|
|
141
|
-
|
|
142
|
-
python -m
|
|
188
|
+
# A per-test timeout guards against any regression that hangs a test.
|
|
189
|
+
python -m pytest ./weightslab/tests -v --timeout=300
|
|
143
190
|
|
|
144
191
|
# TODO (GP): WL CI do not find WS CI for now; token or visibility problem ??
|
|
145
192
|
# - name: Trigger WeightsStudio CI
|
|
@@ -161,7 +208,8 @@ jobs:
|
|
|
161
208
|
# echo "WeightsStudio workflow dispatch requested successfully."
|
|
162
209
|
|
|
163
210
|
build-and-publish-dev:
|
|
164
|
-
|
|
211
|
+
# Only publish to TestPyPI when pushing to main (not on PRs or dev branch pushes).
|
|
212
|
+
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }}
|
|
165
213
|
name: Build & Publish Dev (TestPyPI)
|
|
166
214
|
needs: test
|
|
167
215
|
runs-on: ubuntu-latest
|
|
@@ -244,18 +292,34 @@ jobs:
|
|
|
244
292
|
fi
|
|
245
293
|
python -m twine upload --repository-url https://test.pypi.org/legacy/ --verbose dist/*
|
|
246
294
|
|
|
295
|
+
# ── Cross-version install test from TestPyPI ──────────────────────────────
|
|
296
|
+
# Installs the just-published dev package from TestPyPI on every supported
|
|
297
|
+
# Python version and verifies the import works end-to-end.
|
|
298
|
+
# Runs only on main branch pushes (same gate as the publish step above).
|
|
247
299
|
test-install-from-pip-dev:
|
|
248
|
-
if: ${{ github.event_name
|
|
249
|
-
name: Test Install From Pip Dev
|
|
300
|
+
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }}
|
|
301
|
+
name: Test Install From Pip Dev (Python ${{ matrix.python-version }})
|
|
250
302
|
needs: build-and-publish-dev
|
|
251
303
|
runs-on: ubuntu-latest
|
|
304
|
+
strategy:
|
|
305
|
+
fail-fast: false
|
|
306
|
+
matrix:
|
|
307
|
+
include:
|
|
308
|
+
- python-version: '3.10'
|
|
309
|
+
- python-version: '3.11'
|
|
310
|
+
- python-version: '3.12'
|
|
311
|
+
- python-version: '3.13'
|
|
312
|
+
- python-version: '3.14'
|
|
313
|
+
allow-prereleases: true
|
|
314
|
+
continue-on-error: ${{ matrix.allow-prereleases == true }}
|
|
252
315
|
permissions:
|
|
253
316
|
contents: read
|
|
254
317
|
steps:
|
|
255
|
-
- name: Set up Python
|
|
318
|
+
- name: Set up Python ${{ matrix.python-version }}
|
|
256
319
|
uses: actions/setup-python@v5
|
|
257
320
|
with:
|
|
258
|
-
python-version:
|
|
321
|
+
python-version: ${{ matrix.python-version }}
|
|
322
|
+
allow-prereleases: ${{ matrix.allow-prereleases || false }}
|
|
259
323
|
|
|
260
324
|
- name: Create isolated virtual environment
|
|
261
325
|
run: |
|
|
@@ -292,9 +356,13 @@ jobs:
|
|
|
292
356
|
done
|
|
293
357
|
|
|
294
358
|
python -m pip install --index-url https://test.pypi.org/simple/ --extra-index-url https://download.pytorch.org/whl/cpu --extra-index-url https://pypi.org/simple "weightslab==${WL_VERSION}" --no-cache-dir --retries 10 --timeout 60
|
|
295
|
-
echo "weightslab==${WL_VERSION} installed from TestPyPI"
|
|
359
|
+
echo "weightslab==${WL_VERSION} installed from TestPyPI on Python ${{ matrix.python-version }}"
|
|
296
360
|
|
|
297
361
|
- name: Verify package import
|
|
298
362
|
run: |
|
|
299
363
|
. .venv-ci/bin/activate
|
|
300
|
-
python -c "
|
|
364
|
+
python -c "
|
|
365
|
+
import weightslab, importlib.metadata as m
|
|
366
|
+
print('weightslab import OK on Python ${{ matrix.python-version }}')
|
|
367
|
+
print('installed version:', m.version('weightslab'))
|
|
368
|
+
"
|
|
@@ -114,16 +114,29 @@ jobs:
|
|
|
114
114
|
path: dist/
|
|
115
115
|
retention-days: 1
|
|
116
116
|
|
|
117
|
+
# ── Cross-version install test from TestPyPI (Dev Release) ───────────────
|
|
117
118
|
test-install-from-pip-dev-release:
|
|
118
|
-
name: Test Install From TestPyPI (Dev Release)
|
|
119
|
+
name: Test Install From TestPyPI — Python ${{ matrix.python-version }} (Dev Release)
|
|
119
120
|
needs: build-and-publish-dev-release
|
|
120
121
|
runs-on: ubuntu-latest
|
|
122
|
+
strategy:
|
|
123
|
+
fail-fast: false
|
|
124
|
+
matrix:
|
|
125
|
+
include:
|
|
126
|
+
- python-version: '3.10'
|
|
127
|
+
- python-version: '3.11'
|
|
128
|
+
- python-version: '3.12'
|
|
129
|
+
- python-version: '3.13'
|
|
130
|
+
- python-version: '3.14'
|
|
131
|
+
allow-prereleases: true
|
|
132
|
+
continue-on-error: ${{ matrix.allow-prereleases == true }}
|
|
121
133
|
permissions:
|
|
122
134
|
contents: read
|
|
123
135
|
steps:
|
|
124
136
|
- uses: actions/setup-python@v5
|
|
125
137
|
with:
|
|
126
|
-
python-version:
|
|
138
|
+
python-version: ${{ matrix.python-version }}
|
|
139
|
+
allow-prereleases: ${{ matrix.allow-prereleases || false }}
|
|
127
140
|
|
|
128
141
|
- name: Create isolated virtual environment
|
|
129
142
|
run: python -m venv .venv-ci
|
|
@@ -159,14 +172,14 @@ jobs:
|
|
|
159
172
|
--extra-index-url https://pypi.org/simple/ \
|
|
160
173
|
--extra-index-url https://download.pytorch.org/whl/cpu \
|
|
161
174
|
"weightslab==${WL_VERSION}" --no-cache-dir --retries 10 --timeout 60
|
|
162
|
-
echo "weightslab==${WL_VERSION} installed
|
|
175
|
+
echo "weightslab==${WL_VERSION} installed on Python ${{ matrix.python-version }}"
|
|
163
176
|
|
|
164
177
|
- name: Verify package import
|
|
165
178
|
run: |
|
|
166
179
|
. .venv-ci/bin/activate
|
|
167
180
|
python -c "
|
|
168
181
|
import weightslab, importlib.metadata as m
|
|
169
|
-
print('weightslab import OK')
|
|
182
|
+
print('weightslab import OK on Python ${{ matrix.python-version }}')
|
|
170
183
|
print('installed version:', m.version('weightslab'))
|
|
171
184
|
"
|
|
172
185
|
|
|
@@ -290,7 +303,6 @@ jobs:
|
|
|
290
303
|
|
|
291
304
|
build-and-publish-main:
|
|
292
305
|
name: Build & Publish Main (PyPI)
|
|
293
|
-
# needs: [detect-target, ]
|
|
294
306
|
needs: [detect-target]
|
|
295
307
|
runs-on: ubuntu-latest
|
|
296
308
|
if: ${{ needs.detect-target.outputs.is_main == 'true' }}
|
|
@@ -343,16 +355,21 @@ jobs:
|
|
|
343
355
|
path: dist/
|
|
344
356
|
retention-days: 1
|
|
345
357
|
|
|
358
|
+
# ── Cross-version install test from PyPI (Main Release) ──────────────────
|
|
346
359
|
test-install-from-pip-main:
|
|
347
|
-
name: Test Install From PyPI (Main Release)
|
|
360
|
+
name: Test Install From PyPI — Python ${{ matrix.python-version }} (Main Release)
|
|
348
361
|
needs: build-and-publish-main
|
|
349
362
|
runs-on: ubuntu-latest
|
|
363
|
+
strategy:
|
|
364
|
+
fail-fast: false
|
|
365
|
+
matrix:
|
|
366
|
+
python-version: ['3.10', '3.11', '3.12', '3.13']
|
|
350
367
|
permissions:
|
|
351
368
|
contents: read
|
|
352
369
|
steps:
|
|
353
370
|
- uses: actions/setup-python@v5
|
|
354
371
|
with:
|
|
355
|
-
python-version:
|
|
372
|
+
python-version: ${{ matrix.python-version }}
|
|
356
373
|
|
|
357
374
|
- name: Create isolated virtual environment
|
|
358
375
|
run: python -m venv .venv-ci
|
|
@@ -387,14 +404,14 @@ jobs:
|
|
|
387
404
|
--index-url https://pypi.org/simple/ \
|
|
388
405
|
--extra-index-url https://download.pytorch.org/whl/cpu \
|
|
389
406
|
"weightslab==${WL_VERSION}" --no-cache-dir --retries 10 --timeout 60
|
|
390
|
-
echo "weightslab==${WL_VERSION} installed
|
|
407
|
+
echo "weightslab==${WL_VERSION} installed on Python ${{ matrix.python-version }}"
|
|
391
408
|
|
|
392
409
|
- name: Verify package import
|
|
393
410
|
run: |
|
|
394
411
|
. .venv-ci/bin/activate
|
|
395
412
|
python -c "
|
|
396
413
|
import weightslab, importlib.metadata as m
|
|
397
|
-
print('weightslab import OK')
|
|
414
|
+
print('weightslab import OK on Python ${{ matrix.python-version }}')
|
|
398
415
|
print('installed version:', m.version('weightslab'))
|
|
399
416
|
"
|
|
400
417
|
|
|
@@ -10,6 +10,7 @@ __pycache__
|
|
|
10
10
|
venv
|
|
11
11
|
runs
|
|
12
12
|
data
|
|
13
|
+
MagicMock
|
|
13
14
|
|
|
14
15
|
# Ignore hidden directories
|
|
15
16
|
.history
|
|
@@ -48,6 +49,7 @@ _version.py
|
|
|
48
49
|
*.log
|
|
49
50
|
*.csv
|
|
50
51
|
*.sqlite
|
|
52
|
+
*.txt
|
|
51
53
|
*.db
|
|
52
54
|
*.ipynb_checkpoints
|
|
53
55
|
*.code-workspace
|
|
@@ -71,3 +73,5 @@ weightslab/ui/certs/*.srl
|
|
|
71
73
|
# Ignore documentation build artifacts
|
|
72
74
|
_build
|
|
73
75
|
generated
|
|
76
|
+
|
|
77
|
+
CLAUDE.md
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
# AGENTS.md — coding-agent & contributor onboarding
|
|
2
|
+
|
|
3
|
+
This file is the shared context for **AI coding agents** (Claude Code, etc.) and
|
|
4
|
+
**human contributors** working on WeightsLab. It captures the cross-repo
|
|
5
|
+
architecture and the conventions that aren't obvious from any single file, so a
|
|
6
|
+
newcomer (or an agent with no prior memory of the project) can orient quickly
|
|
7
|
+
and debug confidently.
|
|
8
|
+
|
|
9
|
+
> File/line references drift as the code evolves — treat them as starting
|
|
10
|
+
> points and verify against the current source before relying on them.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## 1. Working with AI coding agents here
|
|
15
|
+
|
|
16
|
+
WeightsLab is developed with coding agents in the loop. A few things make that
|
|
17
|
+
productive and safe:
|
|
18
|
+
|
|
19
|
+
- **This repo is one of three that ship together** (see §2). Many changes are
|
|
20
|
+
*cross-repo* — a proto edit touches the Python backend *and* the TypeScript
|
|
21
|
+
frontend. An agent that edits only one side leaves the build broken. Always
|
|
22
|
+
ask "does this change cross the proto boundary?"
|
|
23
|
+
- **Keep changes additive and verify.** The default expectation is that
|
|
24
|
+
existing usecases keep working. Run the relevant test suites (§7) before
|
|
25
|
+
declaring done; prefer adding a new branch/flag over changing a shared path.
|
|
26
|
+
- **Agent memory ≠ this file.** Agents may keep private, point-in-time "memory"
|
|
27
|
+
notes outside the repo. This file is the *committed, reviewed* distillation of
|
|
28
|
+
that knowledge — the part we want every contributor and every future agent to
|
|
29
|
+
start from. When you learn something load-bearing and non-obvious, add it
|
|
30
|
+
here (in a PR) rather than leaving it only in private memory.
|
|
31
|
+
- **Onboarding flow:** read §2–§6 top to bottom, then skim §7–§8 before your
|
|
32
|
+
first change. For a feature, find the closest existing example in
|
|
33
|
+
`weightslab/weightslab/examples/` and mirror its structure.
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## 2. The workspace: three repos, side by side
|
|
38
|
+
|
|
39
|
+
These must be checked out as **sibling directories** — codegen and proxy
|
|
40
|
+
configs reach across by relative path.
|
|
41
|
+
|
|
42
|
+
| Repo | Role | Stack |
|
|
43
|
+
|---|---|---|
|
|
44
|
+
| **weightslab** (this repo) | Backend / core: training instrumentation, data ledger, gRPC service, the shared proto | Python |
|
|
45
|
+
| **weights_studio** | Frontend: the studio UI that inspects/edits a running experiment | TypeScript + Vite |
|
|
46
|
+
| **weightslab_kitchen** | Private examples / reference material | mixed |
|
|
47
|
+
|
|
48
|
+
Layout assumption: `…/Codes/weightslab`, `…/Codes/weights_studio`,
|
|
49
|
+
`…/Codes/weightslab_kitchen`.
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## 3. Runtime integration (how backend ↔ frontend connect)
|
|
54
|
+
|
|
55
|
+
One proto is the single source of truth:
|
|
56
|
+
`weightslab/weightslab/proto/experiment_service.proto` (`service
|
|
57
|
+
ExperimentService`, ~20 RPCs).
|
|
58
|
+
|
|
59
|
+
- **Backend** implements it in `weightslab/trainer/services/experiment_service.py`
|
|
60
|
+
(servicer), delegating to `data_service.py`, `model_service.py`,
|
|
61
|
+
`agent_service.py`. The servicer and the in-process training loop run in the
|
|
62
|
+
**same process, different threads**, coordinated by the locks in
|
|
63
|
+
`weightslab/components/global_monitoring.py`.
|
|
64
|
+
- **Frontend** consumes a generated TS client
|
|
65
|
+
(`weights_studio/src/experiment_service.client.ts`) produced by
|
|
66
|
+
`npm run generate-proto:data`, which runs `protoc` against the sibling
|
|
67
|
+
weightslab proto.
|
|
68
|
+
- **Wire path:** browser → `:8080` Envoy (grpc-web ↔ grpc transcoding) → Python
|
|
69
|
+
gRPC servicer → training loop. The browser can't speak raw gRPC, so Envoy
|
|
70
|
+
translates.
|
|
71
|
+
|
|
72
|
+
**Editing the proto is a three-step, cross-repo operation — do all three or the
|
|
73
|
+
build breaks:**
|
|
74
|
+
1. Edit `experiment_service.proto`.
|
|
75
|
+
2. Regenerate Python stubs **from the repo root** (import style matters):
|
|
76
|
+
`python -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. weightslab/proto/experiment_service.proto`
|
|
77
|
+
3. Regenerate the TS client in weights_studio: `npm run generate-proto:data`.
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## 4. Backend module map (`weightslab/weightslab/`)
|
|
82
|
+
|
|
83
|
+
Public API is re-exported from `__init__.py` (← `src.py`); users do
|
|
84
|
+
`import weightslab as wl`.
|
|
85
|
+
|
|
86
|
+
- **`src.py`** — the public verbs: `watch_or_edit`, `serve`, `keep_serving`,
|
|
87
|
+
`save_signals`, `tag_samples`, `query_*`, decorators (`eval_fn`,
|
|
88
|
+
`pointcloud_thumbnail`, `pointcloud_boxes`), etc.
|
|
89
|
+
- **`trainer/`** — orchestration. `services/experiment_service.py` is the gRPC
|
|
90
|
+
servicer; `services/{model,data,agent}_service.py` are per-domain delegates;
|
|
91
|
+
`services/data_image_utils.py` handles preview/mask encoding.
|
|
92
|
+
- **`components/`** — cross-cutting runtime: `global_monitoring.py`
|
|
93
|
+
(`guard_training_context` / `guard_testing_context`, pause controller, global
|
|
94
|
+
rlock), `checkpoint_manager.py`, `evaluation_controller.py`, `tracking.py`.
|
|
95
|
+
- **`models/`** — `model_with_ops.py` (the watched/op-able model wrapper).
|
|
96
|
+
- **`data/`** — the dataframe + storage backbone: `dataframe_manager.py`,
|
|
97
|
+
`data_samples_with_ops.py`, `sample_stats.py` (`SampleStatsEx`), `data_utils.py`,
|
|
98
|
+
`point_cloud_utils.py`; storage in `h5_dataframe_store.py`, `h5_array_store.py`,
|
|
99
|
+
`array_proxy.py`.
|
|
100
|
+
- **`backend/`** — primitives: `ledgers.py` (`GLOBAL_LEDGER`, the watch/edit
|
|
101
|
+
substrate + hyperparameter registry), the watched-object interfaces, `logger.py`,
|
|
102
|
+
`audit_logger.py`, `cli.py`.
|
|
103
|
+
- **`proto/`**, **`security/`** (`CertAuthManager`), **`ui/`** (bundled
|
|
104
|
+
Docker/Envoy assets), **`examples/`**.
|
|
105
|
+
|
|
106
|
+
**Fan-in:** `ledgers.GLOBAL_LEDGER` is the hub — `watch_or_edit` registers
|
|
107
|
+
objects there; the servicer reads/mutates through it.
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## 5. Frontend module map (`weights_studio/src/`)
|
|
112
|
+
|
|
113
|
+
Vite + TypeScript; entry `index.html` → `src/main.ts`.
|
|
114
|
+
|
|
115
|
+
- **`main.ts`** — bootstrap: infers host/port (default `:8080`), builds the
|
|
116
|
+
grpc-web transport, wires panels and the sample modal.
|
|
117
|
+
- **`experiment_service.client.ts` / `experiment_service.ts`** — generated
|
|
118
|
+
client/types (do **not** hand-edit; regenerate via `npm run generate-proto:data`).
|
|
119
|
+
- **`grid_data/`** — sample grid + modal rendering (`GridCell.ts`,
|
|
120
|
+
`DataImageService.ts`, `BboxRenderer.ts`, `SegmentationRenderer.ts`,
|
|
121
|
+
`PointCloudViewer.ts` / `PointCloudService.ts`).
|
|
122
|
+
- **`left_panel/`, `plots/`, `agent/`, `helpers.ts`, `ui/`, `utils/`** — controls,
|
|
123
|
+
Chart.js plots, the LLM agent panel, shared helpers/reconnection.
|
|
124
|
+
- Tests in `tests/` (vitest unit + Playwright E2E).
|
|
125
|
+
|
|
126
|
+
Build/proto scripts read the **sibling weightslab repo** at codegen time.
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## 6. User-integration API (`import weightslab as wl`)
|
|
131
|
+
|
|
132
|
+
How a user's own PyTorch script plugs in so the studio can inspect/edit it live.
|
|
133
|
+
Examples: `weightslab/weightslab/examples/{PyTorch,Lightning,Usecases}/<usecase>/`
|
|
134
|
+
(each a `main.py` + `config.yaml`).
|
|
135
|
+
|
|
136
|
+
Wrap each training object with `wl.watch_or_edit(obj, flag=...)`; the returned
|
|
137
|
+
tracked proxy is registered in the global ledger:
|
|
138
|
+
- `flag="hyperparameters"` (dict), `flag="model"` (nn.Module, `device=…`),
|
|
139
|
+
`flag="optimizer"`, `flag="data"` (Dataset → tracked DataLoader: `loader_name`,
|
|
140
|
+
`batch_size`, `is_training`, `collate_fn`, …), `flag="loss"` (a
|
|
141
|
+
`reduction="none"` criterion; called with `(preds_raw, targets, batch_ids=ids,
|
|
142
|
+
preds=preds)`), `flag="metric"`.
|
|
143
|
+
|
|
144
|
+
Conventions:
|
|
145
|
+
- Wrap the train step in `with guard_training_context:` and eval in
|
|
146
|
+
`with guard_testing_context:` (from `weightslab.components.global_monitoring`)
|
|
147
|
+
— this is how pause/resume and train/test separation work.
|
|
148
|
+
- Use `model.get_age()` (steps actually trained; survives checkpoint reloads),
|
|
149
|
+
not the raw loop counter.
|
|
150
|
+
- `wl.serve(serving_grpc=…, serving_cli=…)` starts background serving threads in
|
|
151
|
+
the same process; end the script with `wl.keep_serving()`.
|
|
152
|
+
- `task_type` on the dataset/model selects rendering: `classification`,
|
|
153
|
+
`segmentation`, `detection`, `detection_pointcloud`.
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## 7. Tests & verification
|
|
158
|
+
|
|
159
|
+
- **Backend (Python):** `python -m pytest weightslab/tests/...` — domains under
|
|
160
|
+
`tests/{data,trainer,gRPC,...}`.
|
|
161
|
+
- **Frontend unit (vitest):** `npm run test` in weights_studio
|
|
162
|
+
(`tests/utests/**`).
|
|
163
|
+
- **E2E / user-simulation (Playwright): lives in weights_studio, not here** —
|
|
164
|
+
the tests drive the real UI against a backend the harness spins up
|
|
165
|
+
(`test:realtime:*`, `test:e2e:*`).
|
|
166
|
+
|
|
167
|
+
Before declaring a cross-repo change done: regenerate protos (both sides),
|
|
168
|
+
build the frontend (`npm run build`), and run the affected unit suites.
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
## 8. Point-cloud detection pipeline (`detection_pointcloud`)
|
|
173
|
+
|
|
174
|
+
A worked example of a non-trivial cross-repo feature; see
|
|
175
|
+
`weightslab/weightslab/examples/Usecases/ws-3d-lidar-detection/` and
|
|
176
|
+
`weightslab/weightslab/data/point_cloud_utils.py`.
|
|
177
|
+
|
|
178
|
+
- **Task type** `detection_pointcloud` (covers 2D and 3D; box-row column count
|
|
179
|
+
decides dimensionality; legacy alias `detection_3d`).
|
|
180
|
+
- **Dataset yields** `(cloud [M,F], uid, boxes, metadata)`. Cloud columns:
|
|
181
|
+
`x,y,z,intensity` (model reads the first 4) + optional viz-only channels
|
|
182
|
+
(`nx,ny,nz` normals, `r,g,b` colour) named via `point_feature_names`. Boxes:
|
|
183
|
+
3D `[cx,cy,cz,dx,dy,dz,yaw,cls?,conf?]` or 2D `[cx,cy,dx,dy,cls?,conf?]`;
|
|
184
|
+
predictions use the **same** schema.
|
|
185
|
+
- **Previews** (thumbnail/grid/modal image) are **server-rendered 2D** (BEV or
|
|
186
|
+
range projection) with boxes projected on; the raw cloud streams to the
|
|
187
|
+
browser only for the interactive **three.js 3D viewer** (modal "3D" toggle),
|
|
188
|
+
via the `GetPointCloud` streaming RPC. Colour modes are data-driven (height /
|
|
189
|
+
distance / intensity / camera-RGB / normal shading).
|
|
190
|
+
- **Override hooks:** dataset methods `render_thumbnail_2d` / `project_boxes_2d`,
|
|
191
|
+
or global decorators `@wl.pointcloud_thumbnail` / `@wl.pointcloud_boxes`.
|
|
192
|
+
- **Real data:** `source: kitti_raw` downloads a KITTI raw drive (sync +
|
|
193
|
+
tracklets for GT boxes + calibration for RGB) to a temp dir; falls back to
|
|
194
|
+
synthetic scenes offline.
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## 9. Contributor checklist & gotchas
|
|
199
|
+
|
|
200
|
+
- Proto change → regen Python (from repo root) **and** TS, or runtime breaks.
|
|
201
|
+
- The three repos must sit side by side; codegen uses relative paths.
|
|
202
|
+
- Training + serving share a process — respect the `global_monitoring` locks and
|
|
203
|
+
the `guard_*` context managers.
|
|
204
|
+
- TLS/auth in the bundled UI is decided by the presence of certs under
|
|
205
|
+
`WEIGHTSLAB_CERTS_DIR` (single source of truth) — don't hardcode secure/insecure.
|
|
206
|
+
- Per-instance data (detection/segmentation) uses a MultiIndex
|
|
207
|
+
`(sample_id, annotation_id)` through the dataframe and H5 store.
|
|
208
|
+
- Playwright/E2E tests belong in weights_studio, not here.
|
|
209
|
+
- Don't commit large datasets; real-data downloads go to a temp dir.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# Changelog - 2026-06-12 v1.2.3 (1)
|