weightslab 1.2.4__tar.gz → 1.2.6__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 (321) hide show
  1. {weightslab-1.2.4 → weightslab-1.2.6}/.github/workflows/ci.yml +45 -10
  2. weightslab-1.2.6/AGENTS.md +268 -0
  3. weightslab-1.2.6/CHANGELOG.md +1 -0
  4. {weightslab-1.2.4/weightslab.egg-info → weightslab-1.2.6}/PKG-INFO +27 -89
  5. {weightslab-1.2.4 → weightslab-1.2.6}/README.md +26 -88
  6. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/_version.py +3 -3
  7. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/backend/ledgers.py +89 -10
  8. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/components/experiment_hash.py +2 -0
  9. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/data/dataframe_manager.py +33 -7
  10. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/data/h5_dataframe_store.py +24 -0
  11. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-classification/main.py +8 -9
  12. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-detection/main.py +11 -11
  13. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/main.py +8 -9
  14. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/Usecases/ws-3d-lidar-detection/main.py +9 -9
  15. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/integrations/ultralytics/trainer.py +15 -13
  16. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/src.py +3 -2
  17. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/backend/test_ledgers.py +87 -25
  18. {weightslab-1.2.4 → weightslab-1.2.6/weightslab.egg-info}/PKG-INFO +27 -89
  19. weightslab-1.2.4/AGENTS.md +0 -209
  20. weightslab-1.2.4/CHANGELOG.md +0 -1
  21. {weightslab-1.2.4 → weightslab-1.2.6}/.gitattributes +0 -0
  22. {weightslab-1.2.4 → weightslab-1.2.6}/.github/workflows/docs-pages.yml +0 -0
  23. {weightslab-1.2.4 → weightslab-1.2.6}/.github/workflows/release.yml +0 -0
  24. {weightslab-1.2.4 → weightslab-1.2.6}/.gitignore +0 -0
  25. {weightslab-1.2.4 → weightslab-1.2.6}/LICENSE +0 -0
  26. {weightslab-1.2.4 → weightslab-1.2.6}/agent_config.yaml +0 -0
  27. {weightslab-1.2.4 → weightslab-1.2.6}/docs/_static/.gitkeep +0 -0
  28. {weightslab-1.2.4 → weightslab-1.2.6}/docs/_static/custom.css +0 -0
  29. {weightslab-1.2.4 → weightslab-1.2.6}/docs/_static/favicon.png +0 -0
  30. {weightslab-1.2.4 → weightslab-1.2.6}/docs/_static/logo-dark.png +0 -0
  31. {weightslab-1.2.4 → weightslab-1.2.6}/docs/_static/logo-light.png +0 -0
  32. {weightslab-1.2.4 → weightslab-1.2.6}/docs/_static/version-switcher.js +0 -0
  33. {weightslab-1.2.4 → weightslab-1.2.6}/docs/_static/weights_studio_architecture.png +0 -0
  34. {weightslab-1.2.4 → weightslab-1.2.6}/docs/_templates/.gitkeep +0 -0
  35. {weightslab-1.2.4 → weightslab-1.2.6}/docs/conf.py +0 -0
  36. {weightslab-1.2.4 → weightslab-1.2.6}/docs/configuration.rst +0 -0
  37. {weightslab-1.2.4 → weightslab-1.2.6}/docs/data_exploration.rst +0 -0
  38. {weightslab-1.2.4 → weightslab-1.2.6}/docs/four_way_approach.rst +0 -0
  39. {weightslab-1.2.4 → weightslab-1.2.6}/docs/grpc/audit_logger.rst +0 -0
  40. {weightslab-1.2.4 → weightslab-1.2.6}/docs/grpc/grpc_functions.rst +0 -0
  41. {weightslab-1.2.4 → weightslab-1.2.6}/docs/grpc/index.rst +0 -0
  42. {weightslab-1.2.4 → weightslab-1.2.6}/docs/hyperparameters.rst +0 -0
  43. {weightslab-1.2.4 → weightslab-1.2.6}/docs/index.rst +0 -0
  44. {weightslab-1.2.4 → weightslab-1.2.6}/docs/logger.rst +0 -0
  45. {weightslab-1.2.4 → weightslab-1.2.6}/docs/model_interaction.rst +0 -0
  46. {weightslab-1.2.4 → weightslab-1.2.6}/docs/pytorch_lightning.rst +0 -0
  47. {weightslab-1.2.4 → weightslab-1.2.6}/docs/quickstart.rst +0 -0
  48. {weightslab-1.2.4 → weightslab-1.2.6}/docs/requirements.txt +0 -0
  49. {weightslab-1.2.4 → weightslab-1.2.6}/docs/segmentation_usecase.rst +0 -0
  50. {weightslab-1.2.4 → weightslab-1.2.6}/docs/usecases.rst +0 -0
  51. {weightslab-1.2.4 → weightslab-1.2.6}/docs/user_functions.rst +0 -0
  52. {weightslab-1.2.4 → weightslab-1.2.6}/docs/weights_studio.rst +0 -0
  53. {weightslab-1.2.4 → weightslab-1.2.6}/pyproject.toml +0 -0
  54. {weightslab-1.2.4 → weightslab-1.2.6}/setup.cfg +0 -0
  55. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/__init__.py +0 -0
  56. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/art.py +0 -0
  57. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/backend/__init__.py +0 -0
  58. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/backend/audit_logger.py +0 -0
  59. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/backend/cli.py +0 -0
  60. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/backend/dataloader_interface.py +0 -0
  61. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/backend/logger.py +0 -0
  62. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/backend/model_interface.py +0 -0
  63. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/backend/optimizer_interface.py +0 -0
  64. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/baseline_models/__init__.py +0 -0
  65. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/baseline_models/pytorch/__init__.py +0 -0
  66. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/baseline_models/pytorch/models.py +0 -0
  67. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/components/__init__.py +0 -0
  68. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/components/checkpoint_manager.py +0 -0
  69. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/components/evaluation_controller.py +0 -0
  70. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/components/global_monitoring.py +0 -0
  71. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/components/parallel_primitives.py +0 -0
  72. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/components/tracking.py +0 -0
  73. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/data/__init__.py +0 -0
  74. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/data/array_proxy.py +0 -0
  75. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/data/data_samples_with_ops.py +0 -0
  76. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/data/data_utils.py +0 -0
  77. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/data/h5_array_store.py +0 -0
  78. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/data/point_cloud_utils.py +0 -0
  79. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/data/sample_stats.py +0 -0
  80. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/Docker_training/README.md +0 -0
  81. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/Docker_training/docker_in_docker/Dockerfile +0 -0
  82. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/Docker_training/docker_in_docker/README.md +0 -0
  83. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/Docker_training/docker_in_docker/docker-compose.yml +0 -0
  84. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/Docker_training/docker_in_docker/entrypoint.sh +0 -0
  85. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/Docker_training/siblings_self_contained/Dockerfile +0 -0
  86. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/Docker_training/siblings_self_contained/README.md +0 -0
  87. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/Docker_training/siblings_self_contained/docker-compose.yml +0 -0
  88. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/Docker_training/siblings_self_contained/entrypoint.sh +0 -0
  89. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/Docker_training/siblings_self_contained/ui-compose.yml +0 -0
  90. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/Lightning/ws-classification/config.yaml +0 -0
  91. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/Lightning/ws-classification/main.py +0 -0
  92. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-classification/config.yaml +0 -0
  93. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-clustering/config.yaml +0 -0
  94. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-clustering/face/__init__.py +0 -0
  95. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-clustering/face/data.py +0 -0
  96. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-clustering/face/model.py +0 -0
  97. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-clustering/face/signals.py +0 -0
  98. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-clustering/face/utils.py +0 -0
  99. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-clustering/main.py +8 -8
  100. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-detection/README.md +0 -0
  101. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-detection/config.yaml +0 -0
  102. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-detection/utils/criterions.py +0 -0
  103. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-detection/utils/data.py +0 -0
  104. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-detection/utils/model.py +0 -0
  105. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-generation/config.yaml +0 -0
  106. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-generation/main.py +3 -3
  107. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/0000f77c-6257be58.jpg +0 -0
  108. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/000f8d37-d4c09a0f.jpg +0 -0
  109. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00a0f008-a315437f.jpg +0 -0
  110. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00c12bd0-bb46e479.jpg +0 -0
  111. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00c29c52-f9524f1e.jpg +0 -0
  112. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00ce6f6d-50bbee62.jpg +0 -0
  113. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00d1bafa-1b47b41c.jpg +0 -0
  114. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00d7268f-fd4487be.jpg +0 -0
  115. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00f0dd0f-5e9c9557.jpg +0 -0
  116. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/0a0d7f4c-ac5c3c8f.jpg +0 -0
  117. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/0a1f4fce-f9cac880.jpg +0 -0
  118. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/0a3bb2d8-c195d91e.jpg +0 -0
  119. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1cac6a7-04e33135.jpg +0 -0
  120. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1ceb32e-3f481b43.jpg +0 -0
  121. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1d10d08-5b108225.jpg +0 -0
  122. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1d22449-15fb948f.jpg +0 -0
  123. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1d7b3ac-5af8623b.jpg +0 -0
  124. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1dce572-c6a8cb5e.jpg +0 -0
  125. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1e1a7b8-0aec80e8.jpg +0 -0
  126. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1e8ad72-c3c79240.jpg +0 -0
  127. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1ee702d-0ae1fc10.jpg +0 -0
  128. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1f0efd9-37a14dda.jpg +0 -0
  129. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b2a0648b-d8e126bc.jpg +0 -0
  130. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b2b70230-bad4ff6e.jpg +0 -0
  131. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/0000f77c-6257be58.png +0 -0
  132. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/000f8d37-d4c09a0f.png +0 -0
  133. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00a0f008-a315437f.png +0 -0
  134. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00c12bd0-bb46e479.png +0 -0
  135. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00c29c52-f9524f1e.png +0 -0
  136. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00ce6f6d-50bbee62.png +0 -0
  137. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00d1bafa-1b47b41c.png +0 -0
  138. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00d7268f-fd4487be.png +0 -0
  139. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00f0dd0f-5e9c9557.png +0 -0
  140. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/0a0d7f4c-ac5c3c8f.png +0 -0
  141. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/0a1f4fce-f9cac880.png +0 -0
  142. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/0a3bb2d8-c195d91e.png +0 -0
  143. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1cac6a7-04e33135.png +0 -0
  144. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1ceb32e-3f481b43.png +0 -0
  145. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1d10d08-5b108225.png +0 -0
  146. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1d22449-15fb948f.png +0 -0
  147. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1d7b3ac-5af8623b.png +0 -0
  148. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1dce572-c6a8cb5e.png +0 -0
  149. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1e1a7b8-0aec80e8.png +0 -0
  150. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1e8ad72-c3c79240.png +0 -0
  151. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1ee702d-0ae1fc10.png +0 -0
  152. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1f0efd9-37a14dda.png +0 -0
  153. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b2a0648b-d8e126bc.png +0 -0
  154. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b2b70230-bad4ff6e.png +0 -0
  155. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/config.yaml +0 -0
  156. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/utils/criterions.py +0 -0
  157. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/utils/data.py +0 -0
  158. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/PyTorch/ws-segmentation/utils/model.py +0 -0
  159. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/Ultralytics/ws-detection/config.yaml +0 -0
  160. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/Ultralytics/ws-detection/main.py +1 -1
  161. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/Ultralytics/ws-detection/requirements.txt +0 -0
  162. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/Usecases/ws-2d-lidar-detection/README.md +0 -0
  163. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/Usecases/ws-2d-lidar-detection/config.yaml +0 -0
  164. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/Usecases/ws-2d-lidar-detection/main.py +3 -3
  165. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/Usecases/ws-2d-lidar-detection/utils/criterions.py +0 -0
  166. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/Usecases/ws-2d-lidar-detection/utils/data.py +0 -0
  167. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/Usecases/ws-2d-lidar-detection/utils/model.py +0 -0
  168. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/Usecases/ws-3d-lidar-detection/README.md +0 -0
  169. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/Usecases/ws-3d-lidar-detection/config.yaml +0 -0
  170. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/Usecases/ws-3d-lidar-detection/utils/criterions.py +0 -0
  171. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/Usecases/ws-3d-lidar-detection/utils/data.py +0 -0
  172. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/Usecases/ws-3d-lidar-detection/utils/kitti_download.py +0 -0
  173. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/examples/Usecases/ws-3d-lidar-detection/utils/model.py +0 -0
  174. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/integrations/__init__.py +0 -0
  175. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/integrations/ultralytics/README.md +0 -0
  176. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/integrations/ultralytics/__init__.py +0 -0
  177. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/integrations/ultralytics/_utils.py +0 -0
  178. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/integrations/ultralytics/collate.py +0 -0
  179. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/integrations/ultralytics/dataset.py +0 -0
  180. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/integrations/ultralytics/signals.py +0 -0
  181. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/models/__init__.py +0 -0
  182. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/models/model_with_ops.py +0 -0
  183. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/models/monkey_patcher.py +0 -0
  184. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/modules/__init__.py +0 -0
  185. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/modules/modules_with_ops.py +0 -0
  186. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/modules/neuron_ops.py +0 -0
  187. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/proto/__init__.py +0 -0
  188. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/proto/experiment_service.proto +0 -0
  189. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/proto/experiment_service_pb2.py +0 -0
  190. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/proto/experiment_service_pb2_grpc.py +0 -0
  191. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/security/__init__.py +0 -0
  192. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/security/cert_auth_manager.py +0 -0
  193. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/__init__.py +0 -0
  194. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/backend/__init__.py +0 -0
  195. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/backend/test_audit_logger.py +0 -0
  196. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/backend/test_cli_additional_unit.py +0 -0
  197. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/backend/test_compare_dataloaders.py +0 -0
  198. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/backend/test_data_loader_interface.py +0 -0
  199. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/backend/test_instance_signal_logger.py +0 -0
  200. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/backend/test_logger_core.py +0 -0
  201. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/backend/test_model_interface_unit.py +0 -0
  202. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/backend/test_optimizer_interface.py +0 -0
  203. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/backend/test_optimizer_interface_additional_unit.py +0 -0
  204. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/backend/test_ui_docker_bridge.py +0 -0
  205. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/backend/test_write_dataframe.py +0 -0
  206. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/backend/test_write_history.py +0 -0
  207. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/chaos_monkeys_utests/__init__.py +0 -0
  208. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/chaos_monkeys_utests/test_grpc_chaos_monkey_robustness.py +0 -0
  209. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/components/__init__.py +0 -0
  210. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/components/test_checkpoint_workflow.py +0 -0
  211. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/components/test_experiment_hash_and_art.py +0 -0
  212. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/components/test_global_monitoring_unit.py +0 -0
  213. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/data/__init__.py +0 -0
  214. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/data/test_data_samples_with_ops.py +0 -0
  215. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/data/test_data_service_metadata_copy.py +0 -0
  216. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/data/test_data_utils_unit.py +0 -0
  217. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/data/test_dataframe_manager_unit.py +0 -0
  218. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/data/test_flush_pipeline.py +0 -0
  219. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/data/test_h5_array_store.py +0 -0
  220. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/data/test_h5_dataframe_store.py +0 -0
  221. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/data/test_point_cloud_utils.py +0 -0
  222. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/gRPC/__init__.py +0 -0
  223. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/gRPC/test_get_point_cloud.py +0 -0
  224. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/gRPC/test_grpc_tag_operations.py +0 -0
  225. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/gRPC/test_grpc_user_actions.py +0 -0
  226. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/general/__init__.py +0 -0
  227. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/general/test_auditor_mode.py +0 -0
  228. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/general/test_cli.py +0 -0
  229. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/general/test_hyperparams.py +0 -0
  230. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/general/test_logger_snapshot_rotation.py +0 -0
  231. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/general/test_signals.py +0 -0
  232. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/general/test_signals_wrapping.py +0 -0
  233. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/integrations/__init__.py +0 -0
  234. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/integrations/test_pytorch_lightning_integration.py +0 -0
  235. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/integrations/ultralytics/ddp/ddp_ablation.py +0 -0
  236. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/integrations/ultralytics/ddp/ddp_test_suite.py +0 -0
  237. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/model/__init__.py +0 -0
  238. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/model/test_constraint_generation.py +0 -0
  239. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/model/test_dependency_patterns.py +0 -0
  240. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/model/test_logger.py +0 -0
  241. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/model/test_model_with_ops.py +0 -0
  242. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/model/test_model_with_ops_unit.py +0 -0
  243. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/model/test_tracking.py +0 -0
  244. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/modules/__init__.py +0 -0
  245. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/modules/test_modules_with_ops.py +0 -0
  246. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/test_secure_docker.py +0 -0
  247. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/test_src_functions.py +0 -0
  248. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/trainer/__init__.py +0 -0
  249. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/trainer/services/__init__.py +0 -0
  250. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/trainer/services/test_agent_prompt_unit.py +0 -0
  251. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/trainer/services/test_agent_service_unit.py +0 -0
  252. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/trainer/services/test_trainer_services_server.py +0 -0
  253. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/trainer/services/test_trainer_services_unit.py +0 -0
  254. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/trainer/test_trainer_tools.py +0 -0
  255. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/utils/__init__.py +0 -0
  256. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/utils/test_computational_graph_utils_unit.py +0 -0
  257. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/utils/test_logs_unit.py +0 -0
  258. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/utils/test_modules_dependencies_unit.py +0 -0
  259. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/utils/test_plot_graph_render_unit.py +0 -0
  260. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/utils/test_plot_graph_unit.py +0 -0
  261. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/utils/test_shape_prop_unit.py +0 -0
  262. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/utils/test_utils_tools_unit.py +0 -0
  263. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/watchdog/__init__.py +0 -0
  264. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/watchdog/test_lock_monitor.py +0 -0
  265. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/tests/watchdog/test_watchdog.py +0 -0
  266. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/trainer/__init__.py +0 -0
  267. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/trainer/experiment_context.py +0 -0
  268. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/trainer/services/__init__.py +0 -0
  269. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/trainer/services/agent/__init__.py +0 -0
  270. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/trainer/services/agent/agent.py +0 -0
  271. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/trainer/services/agent/agent_overview/agent.png +0 -0
  272. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/trainer/services/agent/agent_overview/query_example.png +0 -0
  273. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/trainer/services/agent/agent_overview/schema.png +0 -0
  274. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/trainer/services/agent/intent_prompt.py +0 -0
  275. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/trainer/services/agent_service.py +0 -0
  276. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/trainer/services/data_image_utils.py +0 -0
  277. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/trainer/services/data_service.py +0 -0
  278. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/trainer/services/experiment_service.py +0 -0
  279. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/trainer/services/instance_merger.py +0 -0
  280. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/trainer/services/model_service.py +0 -0
  281. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/trainer/services/utils/__init__.py +0 -0
  282. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/trainer/services/utils/tools.py +0 -0
  283. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/trainer/trainer_services.py +0 -0
  284. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/trainer/trainer_tools.py +0 -0
  285. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/ui/Dockerfile +0 -0
  286. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/ui/docker/.dockerignore +0 -0
  287. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/ui/docker/.env.example +0 -0
  288. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/ui/docker/DEPLOYMENT.md +0 -0
  289. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/ui/docker/docker-compose.yml +0 -0
  290. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/ui/docker/nginx-entrypoint.sh +0 -0
  291. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/ui/docker/nginx.base-path.conf copy.template +0 -0
  292. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/ui/docker/nginx.base-path.conf.template +0 -0
  293. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/ui/docker/nginx.conf +0 -0
  294. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/ui/docker/test-deployment.sh +0 -0
  295. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/ui/docker/utils/build-and-deploy.sh +0 -0
  296. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/ui/docker/utils/generate-certs-auth-token.ps1 +0 -0
  297. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/ui/docker/utils/generate-certs-auth-token.sh +0 -0
  298. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/ui/docker/utils/test-deployment.sh +0 -0
  299. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/ui/envoy/envoy.downstream_plaintext.yaml +0 -0
  300. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/ui/envoy/envoy.downstream_upstream_plaintext.yaml +0 -0
  301. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/ui/envoy/envoy.upstream_plaintext.yaml +0 -0
  302. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/ui/envoy/envoy.yaml +0 -0
  303. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/ui/nginx.conf +0 -0
  304. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/ui_docker_bridge.py +0 -0
  305. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/utils/__init__.py +0 -0
  306. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/utils/computational_graph.py +0 -0
  307. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/utils/logs.py +0 -0
  308. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/utils/modules_dependencies.py +0 -0
  309. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/utils/plot_graph.py +0 -0
  310. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/utils/shape_prop.py +0 -0
  311. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/utils/tools.py +0 -0
  312. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/watchdog/__init__.py +0 -0
  313. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/watchdog/grpc_watchdog.py +0 -0
  314. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/watchdog/lock_monitor.py +0 -0
  315. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/watchdog/log_level.py +0 -0
  316. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab/watchdog/watchdog.py +0 -0
  317. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab.egg-info/SOURCES.txt +0 -0
  318. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab.egg-info/dependency_links.txt +0 -0
  319. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab.egg-info/entry_points.txt +0 -0
  320. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab.egg-info/requires.txt +0 -0
  321. {weightslab-1.2.4 → weightslab-1.2.6}/weightslab.egg-info/top_level.txt +0 -0
@@ -2,19 +2,52 @@ name: Code CI
2
2
 
3
3
  on:
4
4
  push:
5
- branches: [ main, dev ]
5
+ # Fire on every branch so the `gate` job below can decide whether to run.
6
+ # GitHub cannot filter on commit message at the event level, so we trigger
7
+ # broadly and gate execution: main/dev always run, other branches run only
8
+ # when the head commit message contains "[force ci]".
9
+ branches: [ '**' ]
6
10
  tags: [ 'v*' ]
7
11
  pull_request:
8
12
  types: [ opened, reopened, ready_for_review ]
9
13
  workflow_dispatch:
10
14
 
11
15
  jobs:
12
- # Required gate: a lint violation here FAILS the CI run. This job has no
13
- # `needs` and nothing `needs` it, so it runs in parallel with install/test/
14
- # build its failure turns the run red but does NOT stop the other jobs from
15
- # running (GitHub Actions does not cancel sibling jobs on failure).
16
+ # Single source of truth for "should the core CI jobs run?". Reproduces the
17
+ # previous trigger rules (PR / manual dispatch / main / dev run; tags skip)
18
+ # and adds a manual escape hatch for custom branches via "[force ci]".
19
+ gate:
20
+ runs-on: ubuntu-latest
21
+ outputs:
22
+ run_ci: ${{ steps.decide.outputs.run_ci }}
23
+ steps:
24
+ - name: Decide whether to run CI
25
+ id: decide
26
+ env:
27
+ # Evaluated by GitHub (not the shell) so the raw commit message is
28
+ # never interpolated into bash — avoids quoting/injection issues.
29
+ FORCE_CI: ${{ contains(github.event.head_commit.message, '[force ci]') }}
30
+ run: |
31
+ if [ "${{ github.event_name }}" != "push" ]; then
32
+ run_ci=true # PRs and manual dispatch always run
33
+ elif [[ "${{ github.ref }}" == refs/tags/* ]]; then
34
+ run_ci=false # tag pushes are handled by the release workflow
35
+ elif [ "${{ github.ref }}" = "refs/heads/main" ] || [ "${{ github.ref }}" = "refs/heads/dev" ]; then
36
+ run_ci=true # default branches always run
37
+ elif [ "${FORCE_CI}" = "true" ]; then
38
+ run_ci=true # custom branch opted in via [force ci]
39
+ else
40
+ run_ci=false # custom branch without [force ci] → skip
41
+ fi
42
+ echo "run_ci=${run_ci}" >> "$GITHUB_OUTPUT"
43
+ echo "Decision: run_ci=${run_ci} (event=${{ github.event_name }}, ref=${{ github.ref }}, force_ci=${FORCE_CI})"
44
+ # Required gate: a lint violation here FAILS the CI run. Nothing `needs` this
45
+ # job, so it runs in parallel with install/test/build — its failure turns the
46
+ # run red but does NOT stop the other jobs from running (GitHub Actions does
47
+ # not cancel sibling jobs on failure).
16
48
  code-quality:
17
- if: ${{ github.event_name != 'push' || !startsWith(github.ref, 'refs/tags/') }}
49
+ needs: gate
50
+ if: ${{ needs.gate.outputs.run_ci == 'true' }}
18
51
  runs-on: ubuntu-latest
19
52
  steps:
20
53
  - name: Checkout repository
@@ -99,7 +132,8 @@ jobs:
99
132
  # Single-version install on 3.11 — always runs so `test` has a gate to
100
133
  # depend on regardless of branch.
101
134
  install:
102
- if: ${{ github.event_name != 'push' || !startsWith(github.ref, 'refs/tags/') }}
135
+ needs: gate
136
+ if: ${{ needs.gate.outputs.run_ci == 'true' }}
103
137
  runs-on: ubuntu-latest
104
138
  name: install (Python 3.11)
105
139
  steps:
@@ -160,10 +194,11 @@ jobs:
160
194
  python -c "import weightslab; print(f'weightslab imported successfully on Python ${{ matrix.python-version }}')"
161
195
 
162
196
  test:
163
- if: ${{ github.event_name != 'push' || !startsWith(github.ref, 'refs/tags/') }}
197
+ if: ${{ needs.gate.outputs.run_ci == 'true' }}
164
198
  runs-on: ubuntu-latest
165
- # Depends on the fast 3.11 gate only the matrix runs independently in parallel.
166
- needs: install
199
+ # Depends on the fast 3.11 install gate; `gate` is also a direct need so this
200
+ # job can read run_ci (the matrix and main-only jobs run independently).
201
+ needs: [ gate, install ]
167
202
  steps:
168
203
  - name: Checkout repository
169
204
  uses: actions/checkout@v4
@@ -0,0 +1,268 @@
1
+ # WeightsLab — agent context for users & debugging
2
+
3
+ This file is a **portable context for AI coding agents** (Claude Code, etc.) and
4
+ the humans driving them. Its job is to let you — or an agent helping you —
5
+ **install, configure, run, and debug WeightsLab and Weights Studio** without
6
+ having to reverse-engineer the system first.
7
+
8
+ It deliberately covers only the two shipped repositories:
9
+
10
+ - **weightslab** — the Python backend / core (training instrumentation, data
11
+ ledger, gRPC service, the shared proto).
12
+ - **weights_studio** — the browser frontend (the studio UI that inspects and
13
+ edits a *running* experiment).
14
+
15
+ > File/line references drift as the code evolves — treat them as starting points
16
+ > and verify against the current source before relying on them. Environment
17
+ > variable names and defaults are the most stable thing here; when in doubt the
18
+ > authoritative reference is `weightslab/docs/configuration.rst`.
19
+
20
+ ---
21
+
22
+ ## 0. How to load this guide into Claude Code
23
+
24
+ So an agent actually *has* this context when you ask it for help:
25
+
26
+ - **Working inside a checkout of the repo** (`git clone`): this guide is
27
+ committed as `AGENTS.md`; the repo keeps a gitignored `CLAUDE.md` copy of it at
28
+ the root so Claude Code auto-loads it every session. Nothing to do. (Claude
29
+ Code also loads `~/.claude/CLAUDE.md` global memory and any parent-dir
30
+ `CLAUDE.md`.)
31
+ - **You only ran `pip install weightslab`** (no checkout — the package lives in
32
+ `site-packages`): absolute `@import` paths are fragile because the path
33
+ changes per venv/OS. The robust pattern is a small **skill** that locates the
34
+ installed file at runtime. Create `~/.claude/skills/weightslab/SKILL.md`:
35
+
36
+ ```yaml
37
+ ---
38
+ name: weightslab
39
+ description: Load the WeightsLab debugging & configuration guide when helping with weightslab or weights_studio problems (connection, TLS, env vars, training hangs, rendering).
40
+ ---
41
+ !`python -c "import weightslab, os; print(open(os.path.join(os.path.dirname(weightslab.__file__), 'AGENTS.md')).read())"`
42
+
43
+ Use the guide above to diagnose the user's weightslab / weights_studio issue.
44
+ ```
45
+
46
+ Then run `/weightslab` (or let Claude auto-invoke it). This requires the guide
47
+ to be **shipped as package data** inside the installed package (see §7); the
48
+ copy at the repo root is for contributors working in a checkout.
49
+ - **Quick-and-dirty:** copy this file to `~/.claude/WEIGHTSLAB.md` and add
50
+ `@~/.claude/WEIGHTSLAB.md` to your `~/.claude/CLAUDE.md`.
51
+
52
+ ---
53
+
54
+ ## 1. What it is and how the pieces connect
55
+
56
+ A user wraps their own PyTorch training script with WeightsLab so a running
57
+ experiment becomes inspectable/editable; Weights Studio is the UI for that.
58
+
59
+ **Wire path (the thing that breaks most often):**
60
+
61
+ ```
62
+ Browser (Vite app) → Envoy :8080 (grpc-web ↔ grpc) → Python gRPC servicer → training loop
63
+ ```
64
+
65
+ - The browser cannot speak raw gRPC, so **Envoy** transcodes grpc-web ↔ gRPC.
66
+ If Envoy is down or misconfigured, the UI loads but no data appears.
67
+ - The gRPC servicer and the training loop run in the **same process, different
68
+ threads**, coordinated by locks in
69
+ `weightslab/weightslab/components/global_monitoring.py`.
70
+ - One proto is the single source of truth:
71
+ `weightslab/weightslab/proto/experiment_service.proto`.
72
+
73
+ ---
74
+
75
+ ## 2. Install & run (the happy path)
76
+
77
+ ```bash
78
+ pip install weightslab
79
+ ```
80
+
81
+ In your training script:
82
+
83
+ ```python
84
+ import weightslab as wl
85
+ # wrap your objects so the studio can see/edit them (see §3), then:
86
+ wl.serve(serving_grpc=True, serving_cli=True) # background threads, same process
87
+ # ... your training loop ...
88
+ wl.keep_serving() # keep the process alive for the UI
89
+ ```
90
+
91
+ Then start the studio stack (Envoy + frontend) and open it in a browser.
92
+ Working starting points live in
93
+ `weightslab/weightslab/examples/{PyTorch,Lightning,Usecases}/<usecase>/`
94
+ (each is a `main.py` + `config.yaml`) — find the closest example and mirror it.
95
+
96
+ Studio deployment details (Docker compose, Envoy, ports, certs) are in
97
+ `weights_studio/docker/` and documented in `weightslab/docs/weights_studio.rst`.
98
+
99
+ ---
100
+
101
+ ## 3. The integration API (`import weightslab as wl`)
102
+
103
+ How a user's script plugs in. Wrap each training object with
104
+ `wl.watch_or_edit(obj, flag=...)`; the returned tracked proxy is registered in
105
+ the global ledger (`weightslab/weightslab/backend/ledgers.py`,
106
+ `GLOBAL_LEDGER` — the hub everything reads/mutates through).
107
+
108
+ - `flag="hyperparameters"` (dict), `flag="model"` (nn.Module, `device=…`),
109
+ `flag="optimizer"`, `flag="data"` (Dataset → tracked DataLoader: `loader_name`,
110
+ `batch_size`, `is_training`, `collate_fn`, …), `flag="loss"` (a
111
+ `reduction="none"` criterion, called with `(preds_raw, targets, batch_ids=ids,
112
+ preds=preds)`), `flag="metric"`.
113
+
114
+ Conventions that matter for correctness:
115
+
116
+ - Wrap the train step in `with guard_training_context:` and eval in
117
+ `with guard_testing_context:` (from
118
+ `weightslab.components.global_monitoring`). This is how pause/resume and
119
+ train/test separation work — **skip it and pause/resume or stats will misbehave.**
120
+ - Use `model.get_age()` (steps actually trained; survives checkpoint reloads),
121
+ not the raw loop counter.
122
+ - `task_type` on the dataset/model selects rendering: `classification`,
123
+ `segmentation`, `detection`, `detection_pointcloud`.
124
+ - **Hyperparameter handle access:** the registered hyperparameters proxy
125
+ supports both `hp.get("lr")` and `hp["lr"]` (subscript == `.get`), and stays
126
+ live — reads reflect in-place updates and re-registration.
127
+
128
+ ---
129
+
130
+ ## 4. Configuration (environment variables)
131
+
132
+ WeightsLab and Weights Studio are configured almost entirely through env vars.
133
+ **Authoritative reference: `weightslab/docs/configuration.rst`.** The high-signal
134
+ ones when debugging:
135
+
136
+ **Backend (Python):**
137
+
138
+ | Variable | Default | Why you touch it |
139
+ |---|---|---|
140
+ | `WEIGHTSLAB_LOG_LEVEL` | `INFO` | Set `DEBUG` to see what's happening. (`WATCHDOG` level sits between WARNING/ERROR.) |
141
+ | `GRPC_BACKEND_HOST` / `GRPC_BACKEND_PORT` | `0.0.0.0` / `50051` | Backend must listen where Envoy expects it. |
142
+ | `GRPC_TLS_ENABLED` | `1` | TLS on the gRPC socket. Set `0` **only** for isolated local debugging. |
143
+ | `GRPC_TLS_REQUIRE_CLIENT_AUTH` | `1` | mTLS. Must match what Envoy presents. |
144
+ | `GRPC_TLS_CERT_DIR` | `~/certs` | Where default cert files are looked up. |
145
+ | `GRPC_AUTH_TOKEN` | *(unset)* | Optional metadata-token auth on top of mTLS. |
146
+ | `GRPC_MAX_MESSAGE_BYTES` | `268435456` (256 MB) | Raise it if large tensors/image batches fail. |
147
+ | `WEIGHTSLAB_DISABLE_WATCHDOGS` | `0` | Set `1` when debugging with breakpoints (see §5). |
148
+ | `GRPC_WATCHDOG_STUCK_SECONDS` | `60` | Lock/RPC stuck threshold + lock-acquire timeout. |
149
+
150
+ **Frontend (Weights Studio) — runtime-injected `window.*` globals:**
151
+
152
+ | Variable | Default | Why you touch it |
153
+ |---|---|---|
154
+ | `WS_SERVER_HOST` / `WS_SERVER_PORT` / `WS_SERVER_PROTOCOL` | `localhost` / `8080` / `https` | How the browser reaches the backend (via Envoy). The #1 connection-issue knob. |
155
+ | `WS_HISTOGRAM_MAX_BINS` | `512` | Cap on metadata histogram bars. |
156
+ | `BB_THUMB_RENDER` | `10` | Max bounding boxes drawn per **thumbnail**, per overlay (GT and PRED capped independently). |
157
+ | `BB_MODAL_RENDER` | `100` | Max bounding boxes drawn per **modal** image, per overlay. A `?` button in the modal shows the active limit. |
158
+
159
+ > **VITE_ vs WS_/BB_:** `VITE_*` variables are baked at **build time** (changing
160
+ > them needs a rebuild). `WS_*` / `BB_*` are injected at **container start** into
161
+ > `config.js` and read as `window.*` globals — changing them needs only a
162
+ > container restart + browser reload (see the caching note in §5).
163
+
164
+ ---
165
+
166
+ ## 5. Troubleshooting — symptom → cause → fix
167
+
168
+ This is the core of the guide. Each entry is a real failure mode (several are
169
+ distilled from issues hit in development).
170
+
171
+ **UI loads but the sample grid is empty / "failed to fetch" / gRPC errors.**
172
+ The wire path (§1) is broken somewhere. Check in order: (1) backend actually
173
+ serving on `0.0.0.0:50051`; (2) Envoy running and reachable on `:8080`;
174
+ (3) frontend `WS_SERVER_HOST/PORT/PROTOCOL` point at Envoy, not the raw backend;
175
+ (4) **TLS mismatch** — `WS_SERVER_PROTOCOL=https` vs `http`, Envoy server certs,
176
+ and Envoy→backend mTLS certs all consistent. For local debugging you can drop
177
+ TLS end-to-end (`GRPC_TLS_ENABLED=0` + `VITE_SERVER_PROTOCOL=http`).
178
+
179
+ **Changed an env var, restarted, but the UI still uses the old value.**
180
+ - `VITE_*` is build-time → you must **rebuild** the frontend, not just restart.
181
+ - `WS_*` / `BB_*` are read once per page load → you must **reload the tab**.
182
+ - Historically `config.js` was served `Cache-Control: immutable` so even a
183
+ restart needed a **hard refresh**; current builds serve `/config.js` with
184
+ `no-store`, so a container restart + normal reload is enough. On an older
185
+ deployment, hard-refresh (Ctrl+Shift+R) or clear cache.
186
+
187
+ **Sample grid flashes empty cells when auto-refresh fires.**
188
+ An auto-refresh (timer or manual) that lands while a `GetDataSamples` grid fetch
189
+ is still in flight used to clear the cache mid-render. The fix in
190
+ `weights_studio/src/grid_data/gridDataManager.ts` is `isFetchInProgress()`:
191
+ refreshes are skipped while a grid fetch is ongoing. If you see this, confirm
192
+ you're on a build that has that guard.
193
+
194
+ **Detection overlays are slow or unreadably cluttered.**
195
+ Dense detection samples can carry hundreds of boxes. Cap rendering with
196
+ `BB_THUMB_RENDER` (thumbnails) and `BB_MODAL_RENDER` (modal); each is applied
197
+ separately to GT and to predictions. Render-only — no sample data is dropped.
198
+
199
+ **Training appears hung; RPCs return `RESOURCE_EXHAUSTED`; server "restarts".**
200
+ A watchdog monitors the global rlock and in-flight RPCs. If a lock/RPC is held
201
+ longer than `GRPC_WATCHDOG_STUCK_SECONDS` (60s) it's flagged; locks get
202
+ interrupted, and after `GRPC_WATCHDOG_RESTART_THRESHOLD` unhealthy polls the
203
+ gRPC server restarts. When **debugging with breakpoints** that intentionally
204
+ pause longer than that, set `WEIGHTSLAB_DISABLE_WATCHDOGS=1`. If RPCs fail with
205
+ `RESOURCE_EXHAUSTED`, a handler couldn't acquire the lock within the window —
206
+ something else is holding it; check for a long/blocking train or eval step.
207
+
208
+ **Pause/resume doesn't work, or train vs test stats are mixed up.**
209
+ The train step isn't wrapped in `guard_training_context` (or eval in
210
+ `guard_testing_context`). See §3 — these context managers are how the system
211
+ gates and separates phases.
212
+
213
+ **Large weights/images fail to transfer.** Raise `GRPC_MAX_MESSAGE_BYTES`.
214
+
215
+ **The agent bar says it's unconfigured.** The LLM agent needs a provider: a
216
+ local **Ollama** server (`provider: ollama`, available immediately) or **cloud
217
+ OpenRouter** initialized from the UI via `/init` (then `/model` to switch,
218
+ `/reset` to clear). See `weightslab/docs/weights_studio.rst`.
219
+
220
+ ---
221
+
222
+ ## 6. Where things live (for deeper digging)
223
+
224
+ **Backend (`weightslab/weightslab/`):**
225
+ - `src.py` — the public verbs (`watch_or_edit`, `serve`, `keep_serving`,
226
+ `tag_samples`, `query_*`, decorators) re-exported from `__init__.py`.
227
+ - `trainer/services/` — `experiment_service.py` (gRPC servicer) delegating to
228
+ `{model,data,agent}_service.py`; `data_image_utils.py` (preview/mask encoding).
229
+ - `components/` — `global_monitoring.py` (locks, `guard_*` contexts, pause),
230
+ `checkpoint_manager.py`, `evaluation_controller.py`.
231
+ - `data/` — `dataframe_manager.py`, `data_samples_with_ops.py`, `sample_stats.py`,
232
+ H5 storage (`h5_dataframe_store.py`, `h5_array_store.py`, `array_proxy.py`).
233
+ - `backend/` — `ledgers.py` (`GLOBAL_LEDGER`), `logger.py`, `audit_logger.py`, `cli.py`.
234
+ - `security/` (`CertAuthManager`), `proto/`, `examples/`, `docs/`.
235
+
236
+ **Frontend (`weights_studio/src/`):**
237
+ - `main.ts` — bootstrap; builds the grpc-web transport from `WS_SERVER_*`.
238
+ - `experiment_service.client.ts` / `experiment_service.ts` — generated client
239
+ (regenerate with `npm run generate-proto:data`; do not hand-edit).
240
+ - `grid_data/` — grid + modal rendering (`GridCell.ts`, `DataImageService.ts`,
241
+ `gridDataManager.ts`, `BboxRenderer.ts`, `SegmentationRenderer.ts`,
242
+ `PointCloudViewer.ts`).
243
+ - `docker/` — compose, `nginx-entrypoint.sh` (injects `config.js`), Envoy assets.
244
+
245
+ **Docs:** `weightslab/docs/` (Sphinx) — `configuration.rst` (all env vars),
246
+ `weights_studio.rst` (studio deploy + agent), `quickstart.rst`, `grpc/`.
247
+
248
+ ---
249
+
250
+ ## 7. For contributors (working in a checkout)
251
+
252
+ - **The two repos must sit side by side** (`…/weightslab`, `…/weights_studio`);
253
+ codegen and Envoy configs reach across by relative path.
254
+ - **Editing the proto is cross-repo** — do all of: edit
255
+ `experiment_service.proto`; regenerate Python stubs from the repo root; run
256
+ `npm run generate-proto:data` in weights_studio. Editing one side only leaves
257
+ the build broken.
258
+ - **Tests:** backend `python -m pytest weightslab/tests/...`; frontend unit
259
+ `npm run test` (vitest); E2E/user-simulation Playwright lives in
260
+ **weights_studio** (`test:realtime:*`, `test:e2e:*`), not here.
261
+ - **CI on a custom branch:** pushes to non-`main`/`dev` branches only run CI when
262
+ the commit message contains `[force ci]` (both repos).
263
+ - **TLS/auth in the bundled UI** is decided by cert presence under
264
+ `WEIGHTSLAB_CERTS_DIR` (single source of truth) — don't hardcode secure/insecure.
265
+ - **To make this guide available to pip users**, ship it as package data inside
266
+ the installed package (e.g. as `weightslab/weightslab/AGENTS.md`) so the §0
267
+ skill can locate it; keep the root `AGENTS.md` (mirrored as the gitignored
268
+ `CLAUDE.md`) as the contributor-facing source.
@@ -0,0 +1 @@
1
+ # Changelog - 2026-06-18 v1.2.6 (1)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: weightslab
3
- Version: 1.2.4
3
+ Version: 1.2.6
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
@@ -120,23 +120,16 @@ The granular statistics and interactive paradigm enable powerful workflows:
120
120
  - **Docker Desktop v4.77 or newer** — required to deploy the Weights Studio UI (`weightslab ui launch`).
121
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
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.
128
123
 
129
124
 
130
125
  ### Installation
131
-
132
- > [!OPTIONAL]
133
- > Seting a clean environment:
134
- > Define a Python environment:
135
- ```bash
136
- python -m venv weightslab_venv
137
- ./weightslab_venv/Scripts/activate
138
- ```
139
- > Or install directly on your machine.
126
+ Install directly on your machine.
127
+ > [!TIP]
128
+ > Setting a clean Python environment:
129
+ > ```bash
130
+ > python -m venv weightslab_venv
131
+ > ./weightslab_venv/Scripts/activate
132
+ > ```
140
133
 
141
134
  Install our framework:
142
135
  ```bash
@@ -148,17 +141,16 @@ Deploy our interface:
148
141
  weightslab ui launch
149
142
  ```
150
143
 
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]
144
+ The command `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. However, communication are not safe.**
145
+ > [!TIP]
146
+ > To run secured communication, pass the arguments `--certs`:
147
+ > ```bash
148
+ > weightslab ui launch --certs # generates TLS certs + a gRPC auth token if missing, then launches secured
149
+ > ```
159
150
  > 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`.
151
+
160
152
  <!--
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:
153
+ 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
154
  ```bash
163
155
  weightslab start example # classification (default)
164
156
  weightslab start example --cls # classification
@@ -186,27 +178,29 @@ weightslab start example --gen # generation
186
178
 
187
179
  2. **Wrap your parameters** with WeightsLab tracking:
188
180
  ```python
189
- model = wl.watch_or_edit(parameters, ...) # ← Now WeightsLab monitors your parameters and allow you to update them from your UI
181
+ model = wl.watch_or_edit(parameters, flag='hp', ...) # ← Now WeightsLab monitors your parameters and allow you to update them from your UI
190
182
  ```
191
183
 
192
184
  3. **Wrap your model** with WeightsLab tracking:
193
185
  ```python
194
- model = wl.watch_or_edit(SimpleModel(...), ...) # ← Now WeightsLab monitors your model state
186
+ model = wl.watch_or_edit(SimpleModel(...), flag='model', ...) # ← Now WeightsLab monitors your model state
195
187
  ```
196
188
 
197
189
  4. **Wrap your optimizer** with WeightsLab tracking:
198
190
  ```python
199
- optimizer = wl.watch_or_edit(optim.Adam(...), ...) # ← Tracks optimizer state and update optimizer learning rate from your UI
191
+ optimizer = wl.watch_or_edit(optim.Adam(...), flag='opt', ...) # ← Tracks optimizer state and update optimizer learning rate from your UI
200
192
  ```
201
193
 
202
194
  5. **Wrap your signal** with WeightsLab tracking:
203
195
  ```python
204
- criterion = wl.watch_or_edit(nn.CrossEntropyLoss(reduction="none"), ...) # ← Tracks this signal and others (metrics, ..etc) from your UI
196
+ train_criterion = wl.watch_or_edit(nn.CrossEntropyLoss(reduction="none"), flag='signal', name="train_loss/sample", per_sample=True, log=True) # ← Tracks this signal and others (metrics, ..etc) from your UI
197
+ test_criterion = wl.watch_or_edit(nn.CrossEntropyLoss(reduction="none"), flag='signal', name="test_loss/sample", per_sample=True, log=False) # ← Tracks this signal and others (metrics, ..etc) from your UI - Plot is disabled, only per sample signal
205
198
  ```
206
199
 
207
200
  6. **Wrap your dataset** with WeightsLab tracking:
208
201
  ```python
209
- train_loader = wl.watch_or_edit(dataset, ...) # ← Tracks this dataset and others (validation, test) from your UI
202
+ train_loader = wl.watch_or_edit(train_dataset, flag='data', loader_name="train_loader", ...) # ← Tracks this dataset and others (validation, test) from your UI
203
+ val_loader = wl.watch_or_edit(val_dataset, flag='data', loader_name="val_loader", ...) # ← Tracks this dataset and others (validation, test) from your UI
210
204
  ```
211
205
 
212
206
  7. **Run your training script** as usual:
@@ -451,9 +445,10 @@ if __name__ == "__main__":
451
445
  ## Examples
452
446
 
453
447
  ### Local examples
448
+
454
449
  After starting the UI, launch a local experiment with the command:
455
450
  ```bash
456
- weightslab start example # classification (default)
451
+ weightslab start example # classification (default)
457
452
  # weightslab start example --cls # classification
458
453
  # weightslab start example --seg # segmentation
459
454
  # weightslab start example --det # detection
@@ -461,66 +456,9 @@ weightslab start example # classification (default)
461
456
  # weightslab start example --gen # generation
462
457
  ```
463
458
 
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>
469
-
470
-
471
- ## AI Agent
472
-
473
- WeightsLab can run its data agent in two modes:
474
-
475
- - Local provider with Ollama
476
- - Cloud provider with OpenRouter
477
-
478
- Use local Ollama when you want a fully local setup and do not need cloud-hosted models (see more details installation from the documentation).
479
- Use OpenRouter when you want larger hosted models and model selection directly from Weightslab UI.
480
-
481
-
482
- ### Cloud OpenRouter
483
- You can either preconfigure OpenRouter in `agent_config.yaml` / `.env`, or initialize it interactively from Weightslab UI.
484
-
485
- #### SDK Configuration
486
-
487
- Example static configuration:
488
-
489
- ```yaml
490
- agent:
491
- provider: openrouter
492
- openrouter_model: meta-llama/llama-3.3-70b-instruct
493
- fallback_to_local: false
494
- # openrouter_api_key: ${OPENROUTER_API_KEY}
495
- ```
496
-
497
- Environment variable:
498
-
499
- ```bash
500
- export OPENROUTER_API_KEY=your_key_here
501
- ```
502
-
503
- #### Interactive setup from Weightslab UI
504
459
 
505
- OpenRouter models can be initialized and set directly from the UI:
506
- 1. Click in the agent bar or double-click to expand the agent window.
507
- 2. Type `/init`.
508
- 3. Choose either:
509
- - `A` Enter your OpenRouter API key manually
510
- - `B` Use the OpenRouter OAuth flow
511
- 4. Select a model from the fetched list, then confirm.
512
-
513
- The default OpenRouter model, as recommended by Graybx, is `meta-llama/llama-3.3-70b-instruct`.
514
-
515
- ### Typical Usage Flow
516
-
517
- 1. Start your WeightsLab backend (e.g., "main.py").
518
- 2. Start Weightslab UI.
519
- 3. If you use Ollama, query the agent directly.
520
- 4. If you use OpenRouter and the agent is not configured yet, type `/init`.
521
- 5. Ask natural-language data operations such as sorting, filtering, slicing, and inspection requests. You can also ask questions about the data.
522
- 6. Use `/model` to try another cloud model without re-entering the key.
523
- 7. Use `/reset` if you want to clear the current connection and start over.
460
+ ### Cloud examples
461
+ Find our [sandbox](https://preview.graybx.com) online. The password is **graybx**.
524
462
 
525
463
 
526
464
  ## Documentation (API + SDK)