weightslab 1.2.1__tar.gz → 1.2.2__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.
Files changed (327) hide show
  1. {weightslab-1.2.1 → weightslab-1.2.2}/.github/workflows/ci.yml +7 -3
  2. {weightslab-1.2.1 → weightslab-1.2.2}/.gitignore +3 -0
  3. weightslab-1.2.2/AGENTS.md +209 -0
  4. weightslab-1.2.2/CHANGELOG.md +1 -0
  5. {weightslab-1.2.1/weightslab.egg-info → weightslab-1.2.2}/PKG-INFO +120 -219
  6. {weightslab-1.2.1 → weightslab-1.2.2}/README.md +118 -218
  7. {weightslab-1.2.1 → weightslab-1.2.2}/docs/quickstart.rst +55 -4
  8. {weightslab-1.2.1 → weightslab-1.2.2}/pyproject.toml +1 -0
  9. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/__init__.py +25 -37
  10. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/_version.py +3 -3
  11. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/data/data_utils.py +34 -1
  12. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/data/dataframe_manager.py +1 -1
  13. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/data/h5_dataframe_store.py +12 -0
  14. weightslab-1.2.2/weightslab/data/point_cloud_utils.py +722 -0
  15. weightslab-1.2.2/weightslab/examples/PyTorch/ws-classification/certs-debug/.grpc_auth_token +1 -0
  16. weightslab-1.2.2/weightslab/examples/PyTorch/ws-classification/certs-debug/backend-server.crt +26 -0
  17. weightslab-1.2.2/weightslab/examples/PyTorch/ws-classification/certs-debug/backend-server.key +28 -0
  18. weightslab-1.2.2/weightslab/examples/PyTorch/ws-classification/certs-debug/ca.crt +30 -0
  19. weightslab-1.2.2/weightslab/examples/PyTorch/ws-classification/certs-debug/envoy-client.crt +24 -0
  20. weightslab-1.2.2/weightslab/examples/PyTorch/ws-classification/certs-debug/envoy-client.key +28 -0
  21. weightslab-1.2.2/weightslab/examples/PyTorch/ws-classification/certs-debug/envoy-server.crt +25 -0
  22. weightslab-1.2.2/weightslab/examples/PyTorch/ws-classification/certs-debug/envoy-server.key +28 -0
  23. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-classification/config.yaml +7 -8
  24. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-classification/main.py +11 -3
  25. {weightslab-1.2.1/weightslab/examples/PyTorch/ws-face_recognition-triplet_loss → weightslab-1.2.2/weightslab/examples/PyTorch/ws-clustering}/config.yaml +1 -1
  26. {weightslab-1.2.1/weightslab/examples/PyTorch/ws-face_recognition-triplet_loss → weightslab-1.2.2/weightslab/examples/PyTorch/ws-clustering}/main.py +8 -8
  27. weightslab-1.2.2/weightslab/examples/PyTorch/ws-detection/README.md +102 -0
  28. weightslab-1.2.2/weightslab/examples/PyTorch/ws-detection/config.yaml +50 -0
  29. weightslab-1.2.2/weightslab/examples/PyTorch/ws-detection/main.py +340 -0
  30. weightslab-1.2.2/weightslab/examples/PyTorch/ws-detection/utils/criterions.py +247 -0
  31. weightslab-1.2.2/weightslab/examples/PyTorch/ws-detection/utils/data.py +226 -0
  32. weightslab-1.2.2/weightslab/examples/PyTorch/ws-detection/utils/model.py +134 -0
  33. {weightslab-1.2.1/weightslab/examples/PyTorch/ws-vad → weightslab-1.2.2/weightslab/examples/PyTorch/ws-generation}/config.yaml +4 -4
  34. {weightslab-1.2.1/weightslab/examples/PyTorch/ws-vad → weightslab-1.2.2/weightslab/examples/PyTorch/ws-generation}/main.py +2 -2
  35. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/config.yaml +3 -3
  36. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/main.py +4 -8
  37. {weightslab-1.2.1/weightslab/examples/PyTorch/ws-detection/src → weightslab-1.2.2/weightslab/examples/Ultralytics/ws-detection}/config.yaml +1 -1
  38. weightslab-1.2.2/weightslab/examples/Usecases/ws-2d-lidar-detection/README.md +66 -0
  39. weightslab-1.2.2/weightslab/examples/Usecases/ws-2d-lidar-detection/config.yaml +46 -0
  40. weightslab-1.2.2/weightslab/examples/Usecases/ws-2d-lidar-detection/main.py +194 -0
  41. weightslab-1.2.2/weightslab/examples/Usecases/ws-2d-lidar-detection/utils/criterions.py +156 -0
  42. weightslab-1.2.2/weightslab/examples/Usecases/ws-2d-lidar-detection/utils/data.py +162 -0
  43. weightslab-1.2.2/weightslab/examples/Usecases/ws-2d-lidar-detection/utils/model.py +148 -0
  44. weightslab-1.2.2/weightslab/examples/Usecases/ws-3d-lidar-detection/README.md +190 -0
  45. weightslab-1.2.2/weightslab/examples/Usecases/ws-3d-lidar-detection/config.yaml +72 -0
  46. weightslab-1.2.2/weightslab/examples/Usecases/ws-3d-lidar-detection/main.py +431 -0
  47. weightslab-1.2.2/weightslab/examples/Usecases/ws-3d-lidar-detection/utils/criterions.py +279 -0
  48. weightslab-1.2.2/weightslab/examples/Usecases/ws-3d-lidar-detection/utils/data.py +597 -0
  49. weightslab-1.2.2/weightslab/examples/Usecases/ws-3d-lidar-detection/utils/kitti_download.py +190 -0
  50. weightslab-1.2.2/weightslab/examples/Usecases/ws-3d-lidar-detection/utils/model.py +232 -0
  51. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/integrations/ultralytics/trainer.py +0 -5
  52. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/proto/experiment_service.proto +27 -0
  53. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/proto/experiment_service_pb2.py +55 -51
  54. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/proto/experiment_service_pb2_grpc.py +45 -0
  55. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/security/cert_auth_manager.py +64 -12
  56. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/src.py +72 -9
  57. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/backend/test_compare_dataloaders.py +18 -2
  58. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/backend/test_data_loader_interface.py +37 -46
  59. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/backend/test_logger_core.py +5 -0
  60. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/backend/test_model_interface_unit.py +4 -0
  61. weightslab-1.2.2/weightslab/tests/backend/test_ui_docker_bridge.py +718 -0
  62. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/backend/test_write_dataframe.py +3 -2
  63. weightslab-1.2.2/weightslab/tests/data/test_point_cloud_utils.py +330 -0
  64. weightslab-1.2.2/weightslab/tests/gRPC/test_get_point_cloud.py +99 -0
  65. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/gRPC/test_grpc_user_actions.py +5 -0
  66. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/trainer/services/test_trainer_services_unit.py +6 -0
  67. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/trainer/services/agent/agent.py +32 -1
  68. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/trainer/services/data_service.py +247 -53
  69. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/trainer/trainer_services.py +5 -0
  70. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/ui/docker/DEPLOYMENT.md +14 -4
  71. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/ui/docker/nginx-entrypoint.sh +0 -0
  72. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/ui/docker/test-deployment.sh +0 -0
  73. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/ui/docker/utils/build-and-deploy.sh +83 -62
  74. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/ui/docker/utils/generate-certs-auth-token.ps1 +8 -2
  75. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/ui/docker/utils/generate-certs-auth-token.sh +10 -1
  76. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/ui/docker/utils/test-deployment.sh +0 -0
  77. weightslab-1.2.2/weightslab/ui_docker_bridge.py +1123 -0
  78. {weightslab-1.2.1 → weightslab-1.2.2/weightslab.egg-info}/PKG-INFO +120 -219
  79. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab.egg-info/SOURCES.txt +45 -21
  80. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab.egg-info/requires.txt +1 -0
  81. weightslab-1.2.1/CHANGELOG.md +0 -1
  82. weightslab-1.2.1/_ck.txt +0 -1938
  83. weightslab-1.2.1/weightslab/examples/PyTorch/ws-detection/src/main.py +0 -135
  84. weightslab-1.2.1/weightslab/examples/PyTorch/ws-detection/src/utils/criterions.py +0 -390
  85. weightslab-1.2.1/weightslab/examples/PyTorch/ws-detection/src/utils/data.py +0 -116
  86. weightslab-1.2.1/weightslab/examples/PyTorch/ws-detection/src/utils/trainer.py +0 -195
  87. weightslab-1.2.1/weightslab/examples/PyTorch/ws-detection/src/yolo_pipeline.py +0 -171
  88. weightslab-1.2.1/weightslab/tests/backend/test_ui_docker_bridge.py +0 -567
  89. weightslab-1.2.1/weightslab/tests/test_ddp_down_only_change.py +0 -62
  90. weightslab-1.2.1/weightslab/ui_docker_bridge.py +0 -589
  91. {weightslab-1.2.1 → weightslab-1.2.2}/.gitattributes +0 -0
  92. {weightslab-1.2.1 → weightslab-1.2.2}/.github/workflows/docs-pages.yml +0 -0
  93. {weightslab-1.2.1 → weightslab-1.2.2}/.github/workflows/release.yml +0 -0
  94. {weightslab-1.2.1 → weightslab-1.2.2}/LICENSE +0 -0
  95. {weightslab-1.2.1 → weightslab-1.2.2}/agent_config.yaml +0 -0
  96. {weightslab-1.2.1 → weightslab-1.2.2}/docs/_static/.gitkeep +0 -0
  97. {weightslab-1.2.1 → weightslab-1.2.2}/docs/_static/custom.css +0 -0
  98. {weightslab-1.2.1 → weightslab-1.2.2}/docs/_static/favicon.png +0 -0
  99. {weightslab-1.2.1 → weightslab-1.2.2}/docs/_static/logo-dark.png +0 -0
  100. {weightslab-1.2.1 → weightslab-1.2.2}/docs/_static/logo-light.png +0 -0
  101. {weightslab-1.2.1 → weightslab-1.2.2}/docs/_static/version-switcher.js +0 -0
  102. {weightslab-1.2.1 → weightslab-1.2.2}/docs/_static/weights_studio_architecture.png +0 -0
  103. {weightslab-1.2.1 → weightslab-1.2.2}/docs/_templates/.gitkeep +0 -0
  104. {weightslab-1.2.1 → weightslab-1.2.2}/docs/conf.py +0 -0
  105. {weightslab-1.2.1 → weightslab-1.2.2}/docs/configuration.rst +0 -0
  106. {weightslab-1.2.1 → weightslab-1.2.2}/docs/data_exploration.rst +0 -0
  107. {weightslab-1.2.1 → weightslab-1.2.2}/docs/four_way_approach.rst +0 -0
  108. {weightslab-1.2.1 → weightslab-1.2.2}/docs/grpc/audit_logger.rst +0 -0
  109. {weightslab-1.2.1 → weightslab-1.2.2}/docs/grpc/grpc_functions.rst +0 -0
  110. {weightslab-1.2.1 → weightslab-1.2.2}/docs/grpc/index.rst +0 -0
  111. {weightslab-1.2.1 → weightslab-1.2.2}/docs/hyperparameters.rst +0 -0
  112. {weightslab-1.2.1 → weightslab-1.2.2}/docs/index.rst +0 -0
  113. {weightslab-1.2.1 → weightslab-1.2.2}/docs/logger.rst +0 -0
  114. {weightslab-1.2.1 → weightslab-1.2.2}/docs/model_interaction.rst +0 -0
  115. {weightslab-1.2.1 → weightslab-1.2.2}/docs/pytorch_lightning.rst +0 -0
  116. {weightslab-1.2.1 → weightslab-1.2.2}/docs/requirements.txt +0 -0
  117. {weightslab-1.2.1 → weightslab-1.2.2}/docs/segmentation_usecase.rst +0 -0
  118. {weightslab-1.2.1 → weightslab-1.2.2}/docs/usecases.rst +0 -0
  119. {weightslab-1.2.1 → weightslab-1.2.2}/docs/user_functions.rst +0 -0
  120. {weightslab-1.2.1 → weightslab-1.2.2}/docs/weights_studio.rst +0 -0
  121. {weightslab-1.2.1 → weightslab-1.2.2}/setup.cfg +0 -0
  122. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/art.py +0 -0
  123. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/backend/__init__.py +0 -0
  124. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/backend/audit_logger.py +0 -0
  125. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/backend/cli.py +0 -0
  126. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/backend/dataloader_interface.py +0 -0
  127. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/backend/ledgers.py +0 -0
  128. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/backend/logger.py +0 -0
  129. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/backend/model_interface.py +0 -0
  130. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/backend/optimizer_interface.py +0 -0
  131. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/baseline_models/__init__.py +0 -0
  132. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/baseline_models/pytorch/__init__.py +0 -0
  133. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/baseline_models/pytorch/models.py +0 -0
  134. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/components/__init__.py +0 -0
  135. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/components/checkpoint_manager.py +0 -0
  136. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/components/evaluation_controller.py +0 -0
  137. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/components/experiment_hash.py +0 -0
  138. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/components/global_monitoring.py +0 -0
  139. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/components/parallel_primitives.py +0 -0
  140. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/components/tracking.py +0 -0
  141. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/data/__init__.py +0 -0
  142. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/data/array_proxy.py +0 -0
  143. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/data/data_samples_with_ops.py +0 -0
  144. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/data/h5_array_store.py +0 -0
  145. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/data/sample_stats.py +0 -0
  146. {weightslab-1.2.1/weightslab/examples/PyTorch_Lightning → weightslab-1.2.2/weightslab/examples/Lightning}/ws-classification/config.yaml +0 -0
  147. {weightslab-1.2.1/weightslab/examples/PyTorch_Lightning → weightslab-1.2.2/weightslab/examples/Lightning}/ws-classification/main.py +0 -0
  148. {weightslab-1.2.1/weightslab/examples/PyTorch/ws-face_recognition-triplet_loss → weightslab-1.2.2/weightslab/examples/PyTorch/ws-clustering}/face/__init__.py +0 -0
  149. {weightslab-1.2.1/weightslab/examples/PyTorch/ws-face_recognition-triplet_loss → weightslab-1.2.2/weightslab/examples/PyTorch/ws-clustering}/face/data.py +0 -0
  150. {weightslab-1.2.1/weightslab/examples/PyTorch/ws-face_recognition-triplet_loss → weightslab-1.2.2/weightslab/examples/PyTorch/ws-clustering}/face/model.py +0 -0
  151. {weightslab-1.2.1/weightslab/examples/PyTorch/ws-face_recognition-triplet_loss → weightslab-1.2.2/weightslab/examples/PyTorch/ws-clustering}/face/signals.py +0 -0
  152. {weightslab-1.2.1/weightslab/examples/PyTorch/ws-face_recognition-triplet_loss → weightslab-1.2.2/weightslab/examples/PyTorch/ws-clustering}/face/utils.py +0 -0
  153. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/0000f77c-6257be58.jpg +0 -0
  154. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/000f8d37-d4c09a0f.jpg +0 -0
  155. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00a0f008-a315437f.jpg +0 -0
  156. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00c12bd0-bb46e479.jpg +0 -0
  157. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00c29c52-f9524f1e.jpg +0 -0
  158. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00ce6f6d-50bbee62.jpg +0 -0
  159. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00d1bafa-1b47b41c.jpg +0 -0
  160. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00d7268f-fd4487be.jpg +0 -0
  161. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00f0dd0f-5e9c9557.jpg +0 -0
  162. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/0a0d7f4c-ac5c3c8f.jpg +0 -0
  163. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/0a1f4fce-f9cac880.jpg +0 -0
  164. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/0a3bb2d8-c195d91e.jpg +0 -0
  165. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1cac6a7-04e33135.jpg +0 -0
  166. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1ceb32e-3f481b43.jpg +0 -0
  167. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1d10d08-5b108225.jpg +0 -0
  168. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1d22449-15fb948f.jpg +0 -0
  169. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1d7b3ac-5af8623b.jpg +0 -0
  170. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1dce572-c6a8cb5e.jpg +0 -0
  171. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1e1a7b8-0aec80e8.jpg +0 -0
  172. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1e8ad72-c3c79240.jpg +0 -0
  173. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1ee702d-0ae1fc10.jpg +0 -0
  174. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1f0efd9-37a14dda.jpg +0 -0
  175. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b2a0648b-d8e126bc.jpg +0 -0
  176. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b2b70230-bad4ff6e.jpg +0 -0
  177. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/0000f77c-6257be58.png +0 -0
  178. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/000f8d37-d4c09a0f.png +0 -0
  179. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00a0f008-a315437f.png +0 -0
  180. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00c12bd0-bb46e479.png +0 -0
  181. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00c29c52-f9524f1e.png +0 -0
  182. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00ce6f6d-50bbee62.png +0 -0
  183. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00d1bafa-1b47b41c.png +0 -0
  184. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00d7268f-fd4487be.png +0 -0
  185. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00f0dd0f-5e9c9557.png +0 -0
  186. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/0a0d7f4c-ac5c3c8f.png +0 -0
  187. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/0a1f4fce-f9cac880.png +0 -0
  188. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/0a3bb2d8-c195d91e.png +0 -0
  189. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1cac6a7-04e33135.png +0 -0
  190. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1ceb32e-3f481b43.png +0 -0
  191. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1d10d08-5b108225.png +0 -0
  192. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1d22449-15fb948f.png +0 -0
  193. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1d7b3ac-5af8623b.png +0 -0
  194. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1dce572-c6a8cb5e.png +0 -0
  195. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1e1a7b8-0aec80e8.png +0 -0
  196. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1e8ad72-c3c79240.png +0 -0
  197. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1ee702d-0ae1fc10.png +0 -0
  198. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1f0efd9-37a14dda.png +0 -0
  199. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b2a0648b-d8e126bc.png +0 -0
  200. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b2b70230-bad4ff6e.png +0 -0
  201. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/utils/criterions.py +0 -0
  202. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/utils/data.py +0 -0
  203. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/utils/model.py +0 -0
  204. /weightslab-1.2.1/weightslab/examples/PyTorch/ws-detection/src/main_ul_native.py → /weightslab-1.2.2/weightslab/examples/Ultralytics/ws-detection/main.py +0 -0
  205. {weightslab-1.2.1/weightslab/examples/PyTorch/ws-detection/src → weightslab-1.2.2/weightslab/examples/Ultralytics/ws-detection}/requirements.txt +0 -0
  206. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/integrations/__init__.py +0 -0
  207. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/integrations/ultralytics/README.md +0 -0
  208. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/integrations/ultralytics/__init__.py +0 -0
  209. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/integrations/ultralytics/_utils.py +0 -0
  210. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/integrations/ultralytics/collate.py +0 -0
  211. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/integrations/ultralytics/dataset.py +0 -0
  212. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/integrations/ultralytics/signals.py +0 -0
  213. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/models/__init__.py +0 -0
  214. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/models/model_with_ops.py +0 -0
  215. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/models/monkey_patcher.py +0 -0
  216. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/modules/__init__.py +0 -0
  217. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/modules/modules_with_ops.py +0 -0
  218. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/modules/neuron_ops.py +0 -0
  219. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/proto/__init__.py +0 -0
  220. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/security/__init__.py +0 -0
  221. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/__init__.py +0 -0
  222. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/backend/__init__.py +0 -0
  223. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/backend/test_audit_logger.py +0 -0
  224. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/backend/test_cli_additional_unit.py +0 -0
  225. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/backend/test_instance_signal_logger.py +0 -0
  226. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/backend/test_ledgers.py +0 -0
  227. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/backend/test_optimizer_interface.py +0 -0
  228. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/backend/test_optimizer_interface_additional_unit.py +0 -0
  229. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/backend/test_write_history.py +0 -0
  230. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/chaos_monkeys_utests/__init__.py +0 -0
  231. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/chaos_monkeys_utests/test_grpc_chaos_monkey_robustness.py +0 -0
  232. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/components/__init__.py +0 -0
  233. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/components/test_checkpoint_workflow.py +0 -0
  234. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/components/test_experiment_hash_and_art.py +0 -0
  235. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/components/test_global_monitoring_unit.py +0 -0
  236. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/data/__init__.py +0 -0
  237. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/data/test_data_samples_with_ops.py +0 -0
  238. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/data/test_data_service_metadata_copy.py +0 -0
  239. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/data/test_data_utils_unit.py +0 -0
  240. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/data/test_dataframe_manager_unit.py +0 -0
  241. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/data/test_flush_pipeline.py +0 -0
  242. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/data/test_h5_array_store.py +0 -0
  243. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/data/test_h5_dataframe_store.py +0 -0
  244. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/gRPC/__init__.py +0 -0
  245. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/gRPC/test_grpc_tag_operations.py +0 -0
  246. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/general/__init__.py +0 -0
  247. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/general/test_auditor_mode.py +0 -0
  248. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/general/test_cli.py +0 -0
  249. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/general/test_hyperparams.py +0 -0
  250. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/general/test_logger_snapshot_rotation.py +0 -0
  251. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/general/test_signals.py +0 -0
  252. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/general/test_signals_wrapping.py +0 -0
  253. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/integrations/__init__.py +0 -0
  254. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/integrations/test_pytorch_lightning_integration.py +0 -0
  255. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/integrations/ultralytics/ddp/ddp_ablation.py +0 -0
  256. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/integrations/ultralytics/ddp/ddp_test_suite.py +0 -0
  257. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/model/__init__.py +0 -0
  258. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/model/test_constraint_generation.py +0 -0
  259. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/model/test_dependency_patterns.py +0 -0
  260. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/model/test_logger.py +0 -0
  261. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/model/test_model_with_ops.py +0 -0
  262. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/model/test_model_with_ops_unit.py +0 -0
  263. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/model/test_tracking.py +0 -0
  264. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/modules/__init__.py +0 -0
  265. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/modules/test_modules_with_ops.py +0 -0
  266. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/test_secure_docker.py +0 -0
  267. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/test_src_functions.py +0 -0
  268. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/trainer/__init__.py +0 -0
  269. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/trainer/services/__init__.py +0 -0
  270. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/trainer/services/test_agent_prompt_unit.py +0 -0
  271. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/trainer/services/test_agent_service_unit.py +0 -0
  272. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/trainer/services/test_trainer_services_server.py +0 -0
  273. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/trainer/test_trainer_tools.py +0 -0
  274. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/utils/__init__.py +0 -0
  275. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/utils/test_computational_graph_utils_unit.py +0 -0
  276. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/utils/test_logs_unit.py +0 -0
  277. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/utils/test_modules_dependencies_unit.py +0 -0
  278. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/utils/test_plot_graph_render_unit.py +0 -0
  279. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/utils/test_plot_graph_unit.py +0 -0
  280. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/utils/test_shape_prop_unit.py +0 -0
  281. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/utils/test_utils_tools_unit.py +0 -0
  282. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/watchdog/__init__.py +0 -0
  283. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/watchdog/test_lock_monitor.py +0 -0
  284. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/tests/watchdog/test_watchdog.py +0 -0
  285. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/trainer/__init__.py +0 -0
  286. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/trainer/experiment_context.py +0 -0
  287. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/trainer/services/__init__.py +0 -0
  288. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/trainer/services/agent/__init__.py +0 -0
  289. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/trainer/services/agent/agent_overview/agent.png +0 -0
  290. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/trainer/services/agent/agent_overview/query_example.png +0 -0
  291. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/trainer/services/agent/agent_overview/schema.png +0 -0
  292. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/trainer/services/agent/intent_prompt.py +0 -0
  293. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/trainer/services/agent_service.py +0 -0
  294. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/trainer/services/data_image_utils.py +0 -0
  295. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/trainer/services/experiment_service.py +0 -0
  296. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/trainer/services/instance_merger.py +0 -0
  297. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/trainer/services/model_service.py +0 -0
  298. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/trainer/services/utils/__init__.py +0 -0
  299. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/trainer/services/utils/tools.py +0 -0
  300. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/trainer/trainer_tools.py +0 -0
  301. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/ui/Dockerfile +0 -0
  302. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/ui/docker/.dockerignore +0 -0
  303. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/ui/docker/.env.example +0 -0
  304. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/ui/docker/docker-compose.yml +0 -0
  305. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/ui/docker/nginx.base-path.conf copy.template +0 -0
  306. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/ui/docker/nginx.base-path.conf.template +0 -0
  307. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/ui/docker/nginx.conf +0 -0
  308. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/ui/envoy/envoy.downstream_plaintext.yaml +0 -0
  309. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/ui/envoy/envoy.downstream_upstream_plaintext.yaml +0 -0
  310. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/ui/envoy/envoy.upstream_plaintext.yaml +0 -0
  311. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/ui/envoy/envoy.yaml +0 -0
  312. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/ui/nginx.conf +0 -0
  313. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/utils/__init__.py +0 -0
  314. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/utils/computational_graph.py +0 -0
  315. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/utils/logs.py +0 -0
  316. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/utils/modules_dependencies.py +0 -0
  317. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/utils/plot_graph.py +0 -0
  318. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/utils/shape_prop.py +0 -0
  319. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/utils/tools.py +0 -0
  320. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/watchdog/__init__.py +0 -0
  321. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/watchdog/grpc_watchdog.py +0 -0
  322. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/watchdog/lock_monitor.py +0 -0
  323. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/watchdog/log_level.py +0 -0
  324. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab/watchdog/watchdog.py +0 -0
  325. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab.egg-info/dependency_links.txt +0 -0
  326. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab.egg-info/entry_points.txt +0 -0
  327. {weightslab-1.2.1 → weightslab-1.2.2}/weightslab.egg-info/top_level.txt +0 -0
@@ -133,13 +133,17 @@ jobs:
133
133
  - name: Install project dependencies
134
134
  run: |
135
135
  python -m pip install --upgrade pip
136
- python -m pip install . --extra-index-url https://download.pytorch.org/whl/cpu
136
+ # Install the test extra so pytest, graphviz, torchmetrics,
137
+ # pytorch-lightning and tensorboard are available (several test modules
138
+ # import pytest / use pytest fixtures and cannot run under bare unittest).
139
+ python -m pip install '.[utest]' --extra-index-url https://download.pytorch.org/whl/cpu
140
+ python -m pip install pytest-timeout
137
141
 
138
142
  - name: Run unit tests - General
139
143
  run: |
140
144
  export WEIGHTSLAB_LOG_LEVEL="DEBUG"
141
- python -m pip install pytorch_lightning
142
- python -m unittest discover -s ./weightslab/tests -p "test_*.py" -t . -v
145
+ # A per-test timeout guards against any regression that hangs a test.
146
+ python -m pytest ./weightslab/tests -v --timeout=300
143
147
 
144
148
  # TODO (GP): WL CI do not find WS CI for now; token or visibility problem ??
145
149
  # - name: Trigger WeightsStudio CI
@@ -48,6 +48,7 @@ _version.py
48
48
  *.log
49
49
  *.csv
50
50
  *.sqlite
51
+ *.txt
51
52
  *.db
52
53
  *.ipynb_checkpoints
53
54
  *.code-workspace
@@ -71,3 +72,5 @@ weightslab/ui/certs/*.srl
71
72
  # Ignore documentation build artifacts
72
73
  _build
73
74
  generated
75
+
76
+ 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.2 (1)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: weightslab
3
- Version: 1.2.1
3
+ Version: 1.2.2
4
4
  Summary: Paving the way between black-box and white-box modeling.
5
5
  Author-email: Alexandru-Andrei Rotaru <alexandru@graybx.com>, Guillaue Pelluet <guillaue@graybx.com>
6
6
  License: BSD 2-clause
@@ -26,6 +26,7 @@ Requires-Dist: torch<2.9,>=2.1; python_version < "3.13"
26
26
  Requires-Dist: torch==2.9; python_version >= "3.13"
27
27
  Requires-Dist: torchvision<0.24,>=0.16; python_version < "3.13"
28
28
  Requires-Dist: torchvision<1,>=0.24; python_version >= "3.13"
29
+ Requires-Dist: torchmetrics>=1.9
29
30
  Requires-Dist: grpcio<2,>=1.80
30
31
  Requires-Dist: protobuf<7,>=4.25
31
32
  Requires-Dist: pydantic<3,>=2.7
@@ -112,40 +113,117 @@ The granular statistics and interactive paradigm enable powerful workflows:
112
113
  * Iterative pruning or growing of the architectures (INCOMING feature)
113
114
 
114
115
 
115
- ## Find our demos:
116
- The password is **graybx**. More demo to come in the future!
116
+ ## Quick Start
117
117
 
118
- <a href="https://preview.graybx.com/">
119
- <p style="text-indent:20px;">DEMOS</p>
120
- </a>
118
+ ### Requirements
119
+
120
+ - **Docker Desktop v4.77 or newer** — required to deploy the Weights Studio UI (`weightslab ui launch`).
121
+ - **Docker Compose v2** (the `docker compose` CLI plugin, bundled with Docker Desktop) — *recommended*. The legacy v1 standalone binary (`docker-compose`, **≥ 1.27**) also works: `weightslab ui launch` auto-detects whichever is installed and uses it. Compose v1 below 1.27 is **not** supported.
122
+ - **Python >=3.10, <3.15** — to install and run the `weightslab` framework.
123
+ > [!OPTIONAL]
124
+ > We are fully compatible with Conda.
125
+
126
+ > [!TIP]
127
+ > Check your Compose version with `docker compose version` (v2) or `docker-compose --version` (v1). If `docker compose version` prints a version string, you have v2.
121
128
 
122
129
 
123
- ## Getting Started
124
130
  ### Installation
125
131
 
126
- Define a Python environment (Python >=3.10, <3.15)
132
+ > [!OPTIONAL]
133
+ > Seting a clean environment:
134
+ > Define a Python environment:
127
135
  ```bash
128
136
  python -m venv weightslab_venv
129
137
  ./weightslab_venv/Scripts/activate
130
138
  ```
131
- Or install directly on your machine.
139
+ > Or install directly on your machine.
132
140
 
133
141
  Install our framework:
134
142
  ```bash
135
143
  pip install weightslab
136
144
  ```
137
145
 
138
- Deploy our interface with Docker:
146
+ Deploy our interface:
139
147
  ```bash
140
148
  weightslab ui launch
141
149
  ```
142
150
 
151
+ `weightslab ui launch` removes any stale weightslab/weights_studio Docker resources that could break the launch, then starts the UI stack. **By default it runs unsecured (HTTP, no gRPC auth) — no certificates are generated.**
152
+
153
+ To run secured (HTTPS + gRPC auth), pass `--certs`:
154
+ ```bash
155
+ weightslab ui launch --certs # generates TLS certs + a gRPC auth token if missing, then launches secured
156
+ ```
157
+
158
+ > [!IMPORTANT]
159
+ > When using certs, set `WEIGHTSLAB_CERTS_DIR` so the training backend and any new terminal use the **same** certificates (it is the single source of truth). `weightslab se` and `weightslab ui launch --certs` print the exact export/`setx` command for your shell. You can also generate certs up front with `weightslab se`.
160
+ <!--
161
+ Want to see it working end to end without writing any code? Start a bundled demo (it installs the example's requirements first — no prompts — then trains and serves until you stop it with `Ctrl+C`). It defaults to classification; pick another with a flag:
162
+ ```bash
163
+ weightslab start example # classification (default)
164
+ weightslab start example --cls # classification
165
+ weightslab start example --seg # segmentation
166
+ weightslab start example --det # detection
167
+ weightslab start example --clus # clustering
168
+ weightslab start example --gen # generation
169
+ ``` -->
170
+ <!-- Then run `weightslab ui launch` in another terminal and open `https://localhost:5173`. -->
171
+
172
+ <!-- Run `weightslab`, `weightslab help`, or `weightslab -h` at any time to see the banner and the full command reference. -->
173
+
143
174
  > [!IMPORTANT]
144
175
  > For a detailed installation guide and more advanced features, please see the [Installation Documentation](https://grayboxtech.github.io/weightslab/latest/quickstart.html).
145
176
 
146
177
 
147
178
  ## Quick Training Example
148
179
 
180
+ ### Step-by-Step Integration
181
+
182
+ 1. **Add the import** at the top of your script:
183
+ ```python
184
+ import weightslab as wl # ← Include our SDK into your experiment
185
+ ```
186
+
187
+ 2. **Wrap your parameters** with WeightsLab tracking:
188
+ ```python
189
+ model = wl.watch_or_edit(parameters, ...) # ← Now WeightsLab monitors your parameters and allow you to update them from your UI
190
+ ```
191
+
192
+ 3. **Wrap your model** with WeightsLab tracking:
193
+ ```python
194
+ model = wl.watch_or_edit(SimpleModel(...), ...) # ← Now WeightsLab monitors your model state
195
+ ```
196
+
197
+ 4. **Wrap your optimizer** with WeightsLab tracking:
198
+ ```python
199
+ optimizer = wl.watch_or_edit(optim.Adam(...), ...) # ← Tracks optimizer state and update optimizer learning rate from your UI
200
+ ```
201
+
202
+ 5. **Wrap your signal** with WeightsLab tracking:
203
+ ```python
204
+ criterion = wl.watch_or_edit(nn.CrossEntropyLoss(reduction="none"), ...) # ← Tracks this signal and others (metrics, ..etc) from your UI
205
+ ```
206
+
207
+ 6. **Wrap your dataset** with WeightsLab tracking:
208
+ ```python
209
+ train_loader = wl.watch_or_edit(dataset, ...) # ← Tracks this dataset and others (validation, test) from your UI
210
+ ```
211
+
212
+ 7. **Run your training script** as usual:
213
+ ```bash
214
+ python train.py
215
+ ```
216
+
217
+ 8. **Launch the UI** in another terminal:
218
+ ```bash
219
+ weightslab ui launch
220
+ ```
221
+
222
+ 9. **Open your browser** to `https://localhost:5173` to track experiment evoluation and results!
223
+
224
+
225
+ ### Details
226
+
149
227
  <details>
150
228
  <summary><b>Here's a complete example showing how to integrate WeightsLab into a basic PyTorch training script:</b></summary>
151
229
 
@@ -158,7 +236,7 @@ import torch
158
236
  import torch.nn as nn
159
237
  import torch.optim as optim
160
238
  from torch.utils.data import DataLoader, TensorDataset
161
- import weightslab as wl # ← Import WeightsLab (auto-creates secure certs!)
239
+ import weightslab as wl # ← Import WeightsLab (uses TLS certs from WEIGHTSLAB_CERTS_DIR if present)
162
240
 
163
241
 
164
242
  # Define a simple model
@@ -234,7 +312,7 @@ def main():
234
312
 
235
313
  # Training loop
236
314
  print("🏃 Starting training...")
237
- print("💡 Launch the UI with: weightslab ui docker launch")
315
+ print("💡 Launch the UI with: weightslab ui launch")
238
316
  print("🌐 Open browser to: https://localhost:5173")
239
317
  n_epochs = parameters.get('n_epochs')
240
318
  pbar = tqdm.tqdm(range(n_epochs), desc='Training..') if parameters.get('tqdm_display', False) else range(n_epochs)
@@ -360,207 +438,34 @@ if __name__ == "__main__":
360
438
  </details>
361
439
 
362
440
 
363
- ### Step-by-Step Integration
364
-
365
- 1. **Add the import** at the top of your script:
366
- ```python
367
- import weightslab as wl # ← Include our SDK into your experiment
368
- ```
369
-
370
- 2. **Wrap your parameters** with WeightsLab tracking:
371
- ```python
372
- model = wl.watch_or_edit(parameters, ...) # ← Now WeightsLab monitors your parameters and allow you to update them from your UI
373
- ```
374
-
375
- 3. **Wrap your model** with WeightsLab tracking:
376
- ```python
377
- model = wl.watch_or_edit(SimpleModel(...), ...) # ← Now WeightsLab monitors your model state
378
- ```
379
-
380
- 4. **Wrap your optimizer** with WeightsLab tracking:
381
- ```python
382
- optimizer = wl.watch_or_edit(optim.Adam(...), ...) # ← Tracks optimizer state and update optimizer learning rate from your UI
383
- ```
384
-
385
- 5. **Wrap your signal** with WeightsLab tracking:
386
- ```python
387
- criterion = wl.watch_or_edit(nn.CrossEntropyLoss(reduction="none"), ...) # ← Tracks this signal and others (metrics, ..etc) from your UI
388
- ```
389
-
390
- 6. **Wrap your dataset** with WeightsLab tracking:
391
- ```python
392
- train_loader = wl.watch_or_edit(dataset, ...) # ← Tracks this dataset and others (validation, test) from your UI
393
- ```
394
-
395
- 7. **Run your training script** as usual:
396
- ```bash
397
- python train.py
398
- ```
399
-
400
- 8. **Launch the UI** in another terminal:
401
- ```bash
402
- weightslab ui docker launch
403
- ```
404
-
405
- 9. **Open your browser** to `https://localhost:5173` to track experiment evoluation and results!
406
-
407
441
 
408
442
  ### What WeightsLab Does Automatically
409
443
 
410
- - 🔐 **Creates TLS certificates** in `~/.weightslab-certs/`
411
- - 🎫 **Generates secure auth tokens** for gRPC communication
412
- - 📊 **Tracks model parameters** and optimizer state in real-time
444
+ <!-- - 📊 **Tracks model parameters** and optimizer state in real-time -->
445
+ <!-- - 🔄 **Enables model editing (incoming feature)** and hyperparameter tuning through the UI -->
446
+ - 📊 **Experiment tracking for reproducibility**
413
447
  - 📈 **Provides live metrics** and visualization in the web UI
414
- - 🔄 **Enables model editing (incoming feature)** and hyperparameter tuning through the UI
415
-
416
-
417
- ## Security
418
-
419
- By default, WeightsLab runs in **unsecured mode** (NO TLS, HTTP, no gRPC authentification). To enable TLS encryption and gRPC authentication:
420
-
421
- ### Quick Setup + Launch
422
- Setup secure environment AND launch Docker in one command:
423
- ```bash
424
- weightslab ui docker se
425
- export WEIGHTSLAB_CERTS_DIR='~/.weightslab-certs/' # Windows commands is
426
- ```
427
-
428
- This will:
429
- 1. Generate TLS certificates and gRPC auth token in `~/.weightslab-certs/`
430
- 2. Launch the Docker stack with security enabled
431
- 3. If setup fails, Docker still launches (unsecured fallback)
432
-
433
- ### Separate Steps (If Needed)
434
- Setup secure environment only:
435
- ```bash
436
- weightslab se
437
-
438
- # Ubuntu command
439
- echo 'export WEIGHTSLAB_CERTS_DIR="~/.weightslab-certs/"' >> ~/.bashrc
440
- source ~/.bashrc
441
-
442
- # Windows command
443
- # setx WEIGHTSLAB_CERTS_DIR '~/.weightslab-certs/' /M
444
- ```
445
-
446
- Then launch Docker later:
447
- ```bash
448
- weightslab ui docker launch
449
- ```
450
-
451
- ### Custom Certificates Directory
452
- Store certificates in a custom location using the `WEIGHTSLAB_CERTS_DIR` environment variable:
453
- ```bash
454
- # Generate the certs
455
- weightslab se "/path/to/my/certs"
456
-
457
- # Export path to env.
458
- # Ubuntu command
459
- echo 'export WEIGHTSLAB_CERTS_DIR=/path/to/my/certs' >> ~/.bashrc
460
- source ~/.bashrc
461
-
462
- # Windows command
463
- # setx WEIGHTSLAB_CERTS_DIR /path/to/my/certs /M
448
+ - 🔄 **Enables data supervision during training** and experiment hyperparameter tuning through the UI
464
449
 
465
- # Start UI
466
- weightslab ui docker launch
467
- ```
468
-
469
- ### Options for Secure Environment Setup
470
-
471
- **For `weightslab se` or `weightslab ui docker se`:**
472
-
473
- | Flag | Effect |
474
- |---|---|
475
- | `--force-certs` | Regenerate certificates even if they already exist |
476
- | `--no-auth` | Skip gRPC auth token generation (TLS only) |
477
-
478
- **Examples:**
479
- ```bash
480
- weightslab se --force-certs # Regenerate certs only
481
- weightslab se --no-auth # TLS only, no gRPC token
482
- weightslab ui docker se # Setup + launch in one
483
- weightslab ui docker se --force-certs # Setup (regenerate) + launch
484
- ```
485
-
486
- ### What Gets Created?
487
- After running `weightslab se` or `weightslab ui docker se`, your `~/.weightslab-certs/` directory contains:
488
- - `backend-server.crt` — Backend TLS certificate
489
- - `backend-server.key` — Backend TLS private key
490
- - `ca.crt` — CA certificate
491
- - `.grpc_auth_token` — gRPC authentication token (if not using `--no-auth`)
492
-
493
- ### Running Without Security
494
- To explicitly run in unsecured mode, delete the certificates directory:
495
- ```bash
496
- rm -r ~/.weightslab-certs
497
- weightslab ui docker launch # Falls back to unsecured HTTP
498
- ```
499
450
 
500
- ### Testing the Setup
501
- **Secured environment:**
502
- ```bash
503
- weightslab se # Setup certs and token
504
- weightslab ui docker launch # Launch Docker
505
- python main.py # Backend finds certs, runs secured
506
- ```
451
+ ## Examples
507
452
 
508
- **Unsecured environment:**
453
+ ### Local examples
454
+ After starting the UI, launch a local experiment with the command:
509
455
  ```bash
510
- weightslab ui docker launch # Launch Docker (no certs)
511
- python main.py # Backend runs unsecured
456
+ weightslab start example # classification (default)
457
+ # weightslab start example --cls # classification
458
+ # weightslab start example --seg # segmentation
459
+ # weightslab start example --det # detection
460
+ # weightslab start example --clus # clustering
461
+ # weightslab start example --gen # generation
512
462
  ```
513
463
 
514
-
515
- ## Cookbook
516
-
517
- Check out our materials, which include examples ranging from toys to more complex models and experiments.
518
-
519
- Quickstart examples:
520
- - [WeightsLab - Classification toy (PyTorch)](https://github.com/GrayboxTech/weightslab/tree/main/weightslab/examples/PyTorch/ws-classification)
521
- - [WeightsLab - Segmentation toy (PyTorch)](https://github.com/GrayboxTech/weightslab/tree/main/weightslab/examples/PyTorch/ws-segmentation)
522
- - [WeightsLab - Detection toy (PyTorch)](https://github.com/GrayboxTech/weightslab/tree/main/weightslab/examples/PyTorch/ws-detection)
523
- - [WeightsLab - Classification toy (PyTorch Lightning)](https://github.com/GrayboxTech/weightslab/tree/main/weightslab/examples/PyTorch_Lightning/ws-classification)
524
-
525
-
526
- ## Configuration
527
-
528
- WeightsLab and Weightslab UI are configured through environment variables.
529
- A fully commented .env template is included at the repository root — copy it and adjust for your setup:
530
-
531
- ```bash
532
- cp .env .env.local # or edit .env directly
533
- ```
534
-
535
- | Category | Key variables |
536
- |---|---|
537
- | **Logging** | `WEIGHTSLAB_LOG_LEVEL`, `WEIGHTSLAB_LOG_TO_FILE`, `WEIGHTSLAB_ROOT_LOG_DIR` |
538
- | **gRPC server** | `GRPC_BACKEND_HOST`, `GRPC_BACKEND_PORT`, `GRPC_MAX_MESSAGE_BYTES`, `GRPC_TLS_ENABLED`, `GRPC_TLS_CERT_DIR`, `GRPC_TLS_CERT_FILE`, `GRPC_TLS_KEY_FILE`, `GRPC_TLS_CA_FILE`, `GRPC_TLS_REQUIRE_CLIENT_AUTH`, `GRPC_AUTH_TOKEN`, `GRPC_AUTH_TOKENS` |
539
- | **Watchdog** | `GRPC_WATCHDOG_STUCK_SECONDS`, `GRPC_WATCHDOG_INTERVAL_SECONDS`, `GRPC_WATCHDOG_RESTART_THRESHOLD`, `GRPC_WATCHDOG_EXIT_ON_STUCK` |
540
- | **Data / cache** | `WL_MAX_PREVIEW_CACHE_SIZE`, `WL_PREVIEW_CACHE_WARMUP_WAIT_MS`, `WL_DEFAULT_THUMBNAIL_SIZE`, `WL_INSTANCE_AGGREGATION`, `WEIGHTSLAB_SAVE_PREDICTIONS_IN_H5` |
541
- | **AI keys** | `OPENROUTER_API_KEY` |
542
- | **Agent config** | `AGENT_CONFIG_PATH` |
543
- | **Weightslab UI** | `VITE_SERVER_HOST`, `VITE_SERVER_PORT`, `VITE_HISTOGRAM_MAX_BINS`, `ENVOY_HOST`, `ENVOY_PORT` |
544
-
545
- `AGENT_CONFIG_PATH` lets you point the data agent to a custom directory that contains `agent_config.yaml`.
546
- If set, WeightsLab looks for `<AGENT_CONFIG_PATH>/agent_config.yaml` before fallback locations.
547
-
548
- WeightsLab also reads TLS settings from registered runtime config (hyperparameters),
549
- using config-first precedence over environment variables.
550
-
551
- If TLS is enabled (`grpc_tls_enabled` in config or `GRPC_TLS_ENABLED` in env),
552
- certificate path resolution is:
553
- 1. config file paths (`grpc_tls_cert_file`, `grpc_tls_key_file`, `grpc_tls_ca_file`)
554
- 2. env file paths (`GRPC_TLS_CERT_FILE`, `GRPC_TLS_KEY_FILE`, `GRPC_TLS_CA_FILE`)
555
- 3. config directory (`grpc_tls_cert_dir`)
556
- 4. env directory (`GRPC_TLS_CERT_DIR`)
557
- 5. default `~/certs` (`backend-server.crt`, `backend-server.key`, `ca.crt`)
558
-
559
- TLS flags also follow config-first precedence:
560
- `grpc_tls_enabled` then `GRPC_TLS_ENABLED`, and
561
- `grpc_tls_require_client_auth` then `GRPC_TLS_REQUIRE_CLIENT_AUTH`.
562
-
563
- > Full documentation with all variables and their descriptions: [docs/configuration.rst](docs/configuration.rst)
464
+ ### Cloud examples
465
+ Find our demos online. The password is **graybx**.
466
+ <a href="https://preview.graybx.com/">
467
+ <p style="text-indent:20px;">DEMOS</p>
468
+ </a>
564
469
 
565
470
 
566
471
  ## AI Agent
@@ -575,9 +480,10 @@ Use OpenRouter when you want larger hosted models and model selection directly f
575
480
 
576
481
 
577
482
  ### Cloud OpenRouter
578
- #### SDK Configuration
579
483
  You can either preconfigure OpenRouter in `agent_config.yaml` / `.env`, or initialize it interactively from Weightslab UI.
580
484
 
485
+ #### SDK Configuration
486
+
581
487
  Example static configuration:
582
488
 
583
489
  ```yaml
@@ -606,16 +512,6 @@ OpenRouter models can be initialized and set directly from the UI:
606
512
 
607
513
  The default OpenRouter model, as recommended by Graybx, is `meta-llama/llama-3.3-70b-instruct`.
608
514
 
609
- ### Agent Commands in Weightslab UI
610
-
611
- The agent input supports these commands:
612
-
613
- - `/init` initializes the cloud provider flow for OpenRouter
614
- - `/model` opens the model chooser and switches the active OpenRouter model
615
- - `/reset` clears the current runtime agent connection and status
616
-
617
- The agent history also records setup and model-change events as log-style entries, separate from normal agent responses.
618
-
619
515
  ### Typical Usage Flow
620
516
 
621
517
  1. Start your WeightsLab backend (e.g., "main.py").
@@ -629,11 +525,16 @@ The agent history also records setup and model-change events as log-style entrie
629
525
 
630
526
  ## Documentation (API + SDK)
631
527
 
632
- * <div>
633
- <a href="https://grayboxtech.github.io/weightslab/latest/index.html">
634
- <p>Documentation</p>
635
- </a>
636
- </div>
528
+ Find our documentation [online](https://grayboxtech.github.io/weightslab/latest/index.html).
529
+
530
+
531
+ ## Contributing & onboarding
532
+
533
+ New here (human or AI coding agent)? Start with [AGENTS.md](AGENTS.md) — it
534
+ captures the cross-repo architecture (weightslab backend ↔ weights_studio
535
+ frontend via the shared proto), the module maps, the `wl.watch_or_edit`
536
+ integration pattern, where tests live, and the gotchas that aren't obvious from
537
+ any single file. It's the fastest way to orient before a first change.
637
538
 
638
539
 
639
540
  ## Community