Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
266 commits
Select commit Hold shift + click to select a range
416774f
Fix lint code quality issue
guillaume-byte Jun 4, 2026
58f72b3
Fix ruff and vulture code quality issue
guillaume-byte Jun 4, 2026
834ac7f
fix utests after merging
guillaume-byte Jun 5, 2026
f6d7904
Code quality issues
guillaume-byte Jun 5, 2026
e43aa1b
Final code quality check
guillaume-byte Jun 5, 2026
eef7a21
change ci code quality as important for CI
guillaume-byte Jun 5, 2026
1557f9f
Fix dev release CI
guillaume-byte Jun 5, 2026
9953476
update release note format
guillaume-byte Jun 5, 2026
bed3e0f
Improve release notes: custom template with PR links, contributor pro…
guillaume-byte Jun 5, 2026
e00bd5c
Final release note fix
guillaume-byte Jun 5, 2026
1258ebd
fix instance_ids bugs matching for batch target format (targets=[bb_A…
guillaume-byte Jun 5, 2026
4c88585
188 logger granularity and structure (#189)
guillaume-byte Jun 5, 2026
7cf5c0c
revert merging PR #185
guillaume-byte Jun 5, 2026
861911c
Fix bug from reverted Merged Conflicts
guillaume-byte Jun 5, 2026
24bf58f
remove hardcoded path from config
guillaume-byte Jun 8, 2026
3383035
fix iou metric name
guillaume-byte Jun 8, 2026
685c88f
fix merged conflicts error on fct name
guillaume-byte Jun 8, 2026
10a65ff
Remove hardcoded value from src ModelInterface
guillaume-byte Jun 8, 2026
69e0936
Merge branch 'main' into dev
guillaume-byte Jun 8, 2026
456ffb1
fix merged conflicts function name
guillaume-byte Jun 8, 2026
590b6ac
Merge branch 'dev' of https://github.com/GrayboxTech/weightslab into dev
guillaume-byte Jun 8, 2026
f411225
Add weightslab.integrations.ultralytics SDK (#191)
AlexGrayBox Jun 9, 2026
6cc624b
fix useless imports and vars: code quality issues
guillaume-byte Jun 9, 2026
c5f0807
Force val to letterbox to (imgsz, imgsz) like train
Jun 9, 2026
1974d3b
Source val rect from ledger config; default False
Jun 9, 2026
901da04
small fixes around certs. and windows; and add ul deps in wl
guillaume-byte Jun 9, 2026
ca8e38b
fix ul deps version
guillaume-byte Jun 9, 2026
f3d5128
fix quotes issue
guillaume-byte Jun 9, 2026
3459058
Add geometry test for val rect-mode opt-in
Jun 9, 2026
12c91ef
Revert "Add geometry test for val rect-mode opt-in"
Jun 9, 2026
809258c
Merge branch 'main' into dev
guillaume-byte Jun 9, 2026
ed2d64b
Fix failing unit tests and dataloader infinite loop
guillaume-byte Jun 10, 2026
a9a2165
Rework UI onboarding CLI: secure-by-default launch, cleanup, banner help
guillaume-byte Jun 10, 2026
e2f65b0
Merge branch 'rework-ui-launch-onboarding' into dev
guillaume-byte Jun 10, 2026
aae4b65
Make CI run the real test suite and fix/triage dev test failures
guillaume-byte Jun 10, 2026
bea6314
Make WEIGHTSLAB_CERTS_DIR the single source of truth for TLS/auth
guillaume-byte Jun 10, 2026
9e8a067
Merge branch 'rework-ui-launch-onboarding' into dev (certs single sou…
guillaume-byte Jun 10, 2026
e985a66
Keep a valid certs bind-mount in unsecured/--no-certs launches
guillaume-byte Jun 10, 2026
6a09909
Add `weightslab example start` to run the bundled classification example
guillaume-byte Jun 10, 2026
314c60c
fix ui docker bridge and simplify certs
guillaume-byte Jun 10, 2026
f40792f
add torchmetrics deps for cls example
guillaume-byte Jun 10, 2026
2e4778d
fix onboarding certs issue and update doc and readme
guillaume-byte Jun 10, 2026
912c03c
Fix certs issues and related utests
guillaume-byte Jun 11, 2026
af6846c
Fix certs issues; change cls config; and fix issues with hist and age…
guillaume-byte Jun 11, 2026
579d8cc
Refactor wl examples syntax
guillaume-byte Jun 11, 2026
0c7f1c0
fix permissions issues and docker v1
guillaume-byte Jun 12, 2026
8695667
fix exec bits from exec files
guillaume-byte Jun 12, 2026
12f5130
fix cmds tests
guillaume-byte Jun 12, 2026
57c8313
Integrate 2d 3d point cloud detection usecase with Lidar (#199)
guillaume-byte Jun 12, 2026
5432688
fix code quality
guillaume-byte Jun 12, 2026
6ed796f
fix code quality
guillaume-byte Jun 12, 2026
f9a041a
Merge origin/main into dev (v1.2.1 + CHANGELOG)
guillaume-byte Jun 12, 2026
0927cce
Add missing source files skipped by data/ gitignore rule
guillaume-byte Jun 12, 2026
1e23d37
Fix code quality issue
guillaume-byte Jun 12, 2026
8076c25
fix utests
guillaume-byte Jun 12, 2026
73fca0c
Fix 4 ui_docker_bridge unit tests broken by --certs flag refactor
guillaume-byte Jun 12, 2026
19f2f16
Exclude heavy blob columns from histogram/metadata sweeps
Jun 14, 2026
1bbd971
Python version tests in workflows
guillaume-byte Jun 15, 2026
67f90a5
remove useless certs
guillaume-byte Jun 15, 2026
8deb810
update gitignore and add debug print exc
guillaume-byte Jun 15, 2026
e38c4f4
add docker initialization materials
guillaume-byte Jun 15, 2026
72d682e
fix logger prints format and spam
guillaume-byte Jun 15, 2026
3b88c59
maximum resolution set to 360p by default
guillaume-byte Jun 15, 2026
06e2b28
Merge branch 'main' into dev
guillaume-byte Jun 15, 2026
6c3e1d5
add auto start in examples
guillaume-byte Jun 16, 2026
59a45bc
Fix main process issues with windows and logs; and fix ultralytics in…
guillaume-byte Jun 16, 2026
058f50b
Merge branch 'dev' of https://github.com/GrayboxTech/weightslab into dev
guillaume-byte Jun 16, 2026
117bb4e
remove useless dir
guillaume-byte Jun 16, 2026
ff662f2
Disable the WatchDog; fix evaluate feature in nograd mode and no guar…
guillaume-byte Jun 17, 2026
0bee476
Fix code quality issue
guillaume-byte Jun 17, 2026
695dc5a
Merge branch 'main' into dev
guillaume-byte Jun 17, 2026
7b06e0f
Fix UL issue with custom EMA and evaluation feature
guillaume-byte Jun 17, 2026
6fff830
Merge branch 'dev' of https://github.com/GrayboxTech/weightslab into dev
guillaume-byte Jun 17, 2026
cfdbd3f
Merge branch 'main' into dev
guillaume-byte Jun 17, 2026
58ce5ee
Allow to run CI from custom branch with correct trigger flag in commit
guillaume-byte Jun 18, 2026
093f646
Merge branch 'dev' of https://github.com/GrayboxTech/weightslab into dev
guillaume-byte Jun 18, 2026
4e84dc0
Fix pandas incompatible-dtype FutureWarning in dataframe merge/upsert
guillaume-byte Jun 18, 2026
997e914
Add agent memory to repo for user
guillaume-byte Jun 18, 2026
7698e20
fix prediction normalization issues
guillaume-byte Jun 18, 2026
ee9d6e6
Fix ledgered parameters issues
guillaume-byte Jun 18, 2026
61bc12a
Fix new exp. hash after pause 4 the first time
guillaume-byte Jun 18, 2026
eca9e25
[skip ci] fix parameters wrapping in examples
guillaume-byte Jun 18, 2026
ceef8c3
Merge branch 'main' into dev
guillaume-byte Jun 18, 2026
3751825
V1.3 UI optimization and new features (#214)
guillaume-byte Jun 26, 2026
1a0f78e
add log for user
guillaume-byte Jun 26, 2026
df00cd4
Merge branch 'main' into dev
guillaume-byte Jun 26, 2026
8d3a573
Fix categorical upsert failing when origin column has new value
guillaume-byte Jun 29, 2026
7c97491
Merge branch 'main' into dev
guillaume-byte Jun 29, 2026
919bf93
Change logger msg if docker not installed to be more visible
guillaume-byte Jun 29, 2026
9508dc1
disable loading config by default
guillaume-byte Jun 30, 2026
529a2d8
fix: release notes generation (empty PR list, README noise, CLI banner)
guillaume-byte Jul 2, 2026
565e9e2
237 agent improvements (#240)
guillaume-byte Jul 6, 2026
9101ee6
Add hist. generation on categorical values (#239)
guillaume-byte Jul 6, 2026
b154d35
228 weightslab examples and documentation revamp (#238)
guillaume-byte Jul 6, 2026
2e77279
Fix merged conflicts issue
guillaume-byte Jul 6, 2026
2b9fb9b
Allow agent to change WL HP
guillaume-byte Jul 6, 2026
2806262
Update CHANGELOG
guillaume-byte Jul 6, 2026
ff91626
Add user commands in doc
guillaume-byte Jul 6, 2026
c05a5b8
add weightslab ui launch args to image repo and version, and fix cert…
guillaume-byte Jul 6, 2026
8c57820
Release CI: publish dev pre-releases from dev-branch 'dev' tags
guillaume-byte Jul 6, 2026
19f93a2
docs: document watch_or_edit signal wrapping (logger + user functions)
guillaume-byte Jul 6, 2026
fb8e0b7
Fix version resolver from pypi version / git tag
guillaume-byte Jul 6, 2026
3f4289f
Update CHANGELOG
guillaume-byte Jul 6, 2026
724b94e
Bundle docker/ and examples/ inside the weightslab package
guillaume-byte Jul 6, 2026
eac08ea
Fix truncated hash reply
guillaume-byte Jul 6, 2026
8a30567
Merge branch 'main' into dev
guillaume-byte Jul 6, 2026
e542169
Fix crash on empty detection labels in _process_sample_row
guillaume-byte Jul 6, 2026
62076b8
Update CHANGELOG
guillaume-byte Jul 7, 2026
d1c3cca
Add agent cmd to show user current config used
guillaume-byte Jul 7, 2026
e644910
Update CHANGELOG
guillaume-byte Jul 7, 2026
451feab
Merge branch 'main' into dev
guillaume-byte Jul 7, 2026
a936add
fix logger error
guillaume-byte Jul 8, 2026
053fe61
Merge branch 'dev' of https://github.com/GrayboxTech/weightslab into dev
guillaume-byte Jul 8, 2026
faffb72
Fix bugs with instances ids and also with h5 flush order
guillaume-byte Jul 8, 2026
a0d3f51
backend: advertise weightslab version to the UI
guillaume-byte Jul 10, 2026
98eaf3e
restart action from UI - dev mode only (#246)
guillaume-byte Jul 10, 2026
532824e
examples: rename ws-* directories to wl-* and update references (#247)
guillaume-byte Jul 10, 2026
c71e6f1
Torch collab examples (#248)
guillaume-byte Jul 10, 2026
2db142c
fix(ledger): Proxy[key] returns a live value proxy like .get() (#249)
guillaume-byte Jul 10, 2026
257de85
237 agent improvements (#245)
guillaume-byte Jul 10, 2026
e0f21eb
fix merged conflicts
guillaume-byte Jul 10, 2026
500d7ec
fix proto issues and usecase import issue
guillaume-byte Jul 10, 2026
dcd118c
Comment preds_raw from src to not keep logits in pending thread
Jul 10, 2026
97eb41c
Signal refinements: vectorized + reactive @wl.signal, overhead tuning…
AlexGrayBox Jul 10, 2026
aabe0b2
refactor loss shape cls example
guillaume-byte Jul 10, 2026
1175931
fix merged conflicts
guillaume-byte Jul 10, 2026
5764c48
fix issue with custom signals
guillaume-byte Jul 10, 2026
fc8fd1a
Update CHANGELOG
guillaume-byte Jul 10, 2026
51fa27d
Merge branch 'main' into dev
guillaume-byte Jul 10, 2026
da6eb42
Fix all-NaN float column treated as categorical in GetHistogram
guillaume-byte Jul 10, 2026
8ea59ae
[force ci] fix Weightslab compatibility issues with np>2
guillaume-byte Jul 13, 2026
1ac6ab7
Fix deps version and conflicts, and utests
guillaume-byte Jul 13, 2026
edf7077
Update CHANGELOG
guillaume-byte Jul 13, 2026
955f51e
Remove raised error if serving before config wrapped
guillaume-byte Jul 13, 2026
48611d0
v1.3.4.dev0 Full Collab Integration and bug fixed (#251)
guillaume-byte Jul 16, 2026
227cb33
Fix formatting of Python version requirement
luigi-dovidio Jul 17, 2026
7f3874c
Add Docker-free pip-native UI: `weightslab start`
guillaume-byte Jul 19, 2026
f45510b
Remove Docker from weightslab; rename CLI to weightslab.cli; Docker-f…
guillaume-byte Jul 20, 2026
c488636
Fix current hash exposure in experiment context
guillaume-byte Jul 20, 2026
f0575b6
Fix slow dataframe manager updates and data_service sync
guillaume-byte Jul 21, 2026
823b444
Merge branch 'dev' of https://github.com/GrayboxTech/weightslab into …
guillaume-byte Jul 21, 2026
671270b
H5 and Loggers fixes (#257)
guillaume-byte Jul 21, 2026
a6f0c1a
examples renaming lost in merge
guillaume-byte Jul 21, 2026
9f2d6fb
Rename UI launch command; auto-open browser; update Colab links to wl…
guillaume-byte Jul 21, 2026
51361ea
Add two tabular PyTorch examples: bank fraud detection + ads CTR reco…
guillaume-byte Jul 21, 2026
9fee133
Remove UI prebuilt directories
guillaume-byte Jul 21, 2026
13ddb5d
Add legacy commands from v1.3.3
guillaume-byte Jul 21, 2026
626d690
Rescue: reactive @wl.signal engine + per-sample signal perf (was orph…
AlexGrayBox Jul 21, 2026
05d3fae
feat(data_service): per-cell loss trajectory + curve-derived shape (G…
AlexGrayBox Jul 22, 2026
4017785
remove old files and rename examples
guillaume-byte Jul 22, 2026
bfe62b7
fix merged conflicts
guillaume-byte Jul 22, 2026
5a2a44b
Fix write history function dump orient
guillaume-byte Jul 23, 2026
a927957
Fix tabular experiment usecases and related stuff
guillaume-byte Jul 23, 2026
6f560b4
Update README
guillaume-byte Jul 23, 2026
a04e9ca
Remove merged conflicts in docs and add new content
guillaume-byte Jul 23, 2026
0a4d005
update tests
guillaume-byte Jul 23, 2026
427cfc8
Fix loss shape cls
guillaume-byte Jul 23, 2026
7aa69b3
Fix tabular examples
guillaume-byte Jul 23, 2026
63274af
gitignore: stop tracking the built UI (weightslab/ui/static)
guillaume-byte Jul 23, 2026
873bf04
Fix query filter crash on numeric-but-awkward columns
guillaume-byte Jul 24, 2026
51f9a4b
Fix WeightsLab Release CI - UI integration
guillaume-byte Jul 24, 2026
e59bdfa
Fix doubled "v" in release banner version (vv1.3.4 -> v1.3.4)
guillaume-byte Jul 24, 2026
72a665d
Only re-run loss-shape autotagging when a signal actually has new data
guillaume-byte Jul 24, 2026
ad578ad
Fix WL Release CI
guillaume-byte Jul 24, 2026
c489fdf
trigger CI release in dev
guillaume-byte Jul 24, 2026
5186d34
release: surface why the weights_studio dev-branch probe falls back t…
guillaume-byte Jul 24, 2026
ffdc05e
Fixing WL Release CI
guillaume-byte Jul 24, 2026
dd56007
release: drop the ls-remote probe for weights_studio's dev branch
guillaume-byte Jul 24, 2026
896dbcd
fix: retry HDFStore open in save_tag_registry to ride out Windows fil…
guillaume-byte Jul 24, 2026
31668bb
fix: anchor the data/ gitignore pattern to repo root
guillaume-byte Jul 24, 2026
883376f
add exception on data dir in gitignore
guillaume-byte Jul 24, 2026
9f17281
Remove old text from examples, and docs
guillaume-byte Jul 24, 2026
1984cc1
Fix telemetry issue with new cls command
guillaume-byte Jul 27, 2026
fc7900e
Agent: support per-sample signal history as a list (signal_history re…
guillaume-byte Jul 28, 2026
e40455c
Agent: subsample per-sample signal history to <=100 points
guillaume-byte Jul 28, 2026
1eb70d2
Remove wrong file; and exclude examples directory from code quality c…
guillaume-byte Jul 28, 2026
87ae46d
263 tabular optimization - fraud detection real example (#275)
guillaume-byte Jul 28, 2026
4383cfa
Signal-shape classification: user-defined @signal_classifier + on-dem…
guillaume-byte Jul 28, 2026
bd0918b
Fix optimizer scheduler issue, erasing new lr value with the config one
Jul 29, 2026
1b8e138
Merge remote-tracking branch 'refs/remotes/origin/dev' into dev
Jul 29, 2026
7308900
Support multi-root experiment directories in CheckpointManager
Jul 29, 2026
b118190
Fix loss shape cls issues
guillaume-byte Jul 29, 2026
268dd5f
Merge branch 'loss-shape-classification' of https://github.com/Graybo…
guillaume-byte Jul 29, 2026
3bcc51e
add new default nb_seen metadata
guillaume-byte Jul 29, 2026
dcd649a
fix(data_service): resolve bare signal names + list-safe sort fallbac…
guillaume-byte Jul 29, 2026
66957b0
Isolate signal-trajectory tests from shared on-disk logger DB
guillaume-byte Jul 29, 2026
9a78cae
Upgrade training interactions (#279)
guillaume-byte Jul 30, 2026
7372fde
Update changelog date and version to v1.4.1.dev0
guillaume-byte Aug 3, 2026
01cd5fe
Fix Merged Conflicts
guillaume-byte Aug 3, 2026
2a998d7
Fix Merged Conflicts
guillaume-byte Aug 3, 2026
17e7238
fix tests and merged conflicts in docs
guillaume-byte Aug 3, 2026
ecccbc3
Potential fix for pull request finding
guillaume-byte Aug 3, 2026
20c7cd5
Potential fix for pull request finding
guillaume-byte Aug 3, 2026
6ea2664
Uncomment test before release; and fix intent agent prompt tests
guillaume-byte Aug 3, 2026
b37f46e
Merge branch 'dev' of https://github.com/GrayboxTech/weightslab into dev
guillaume-byte Aug 3, 2026
bc76431
Fix missing payload
guillaume-byte Aug 3, 2026
b1da957
Merge branch 'main' into dev
guillaume-byte Aug 3, 2026
132088c
Update CHANGELOG
guillaume-byte Aug 3, 2026
f63683d
Update CHANGELOG
guillaume-byte Aug 4, 2026
351743d
Retry the PyPI/TestPyPI install-test steps up to 3 attempts
guillaume-byte Aug 4, 2026
091ee8f
Fix notebooks examples version
guillaume-byte Aug 4, 2026
8bad79a
Fix old ui launch command mentionned
guillaume-byte Aug 4, 2026
0f51700
Jup. Notebook integration and training live notebook with agent (#284)
guillaume-byte Aug 4, 2026
251ade4
Add wl.ai_report_generation and a CLI report command
guillaume-byte Aug 4, 2026
fca4904
Potential fix for pull request finding
guillaume-byte Aug 4, 2026
1e969e0
Potential fix for pull request finding
guillaume-byte Aug 4, 2026
56871ae
Potential fix for pull request finding
guillaume-byte Aug 4, 2026
d7b6165
Fix merged conflicts in notebooks and files
guillaume-byte Aug 4, 2026
74126f5
Merge branch 'dev' of https://github.com/GrayboxTech/weightslab into dev
guillaume-byte Aug 4, 2026
209fca8
Update CHANGELOG
guillaume-byte Aug 5, 2026
9f52e2f
Decorate the TestPyPI dev-release version with a commit-hash marker
guillaume-byte Aug 5, 2026
57d87d8
Fix merged conflicts with main; set in notebooks upgrade protobuf ver…
guillaume-byte Aug 5, 2026
f6ff04a
Merge branch 'dev' of https://github.com/GrayboxTech/weightslab into dev
guillaume-byte Aug 5, 2026
dd64043
288 data tags export to labelling integration (#293)
guillaume-byte Aug 18, 2026
8b049ed
Plots outliers interactions and Model Tracking Upgrade (#296)
guillaume-byte Aug 18, 2026
82652de
Agent coding integration (#295)
guillaume-byte Aug 18, 2026
7a7c6d0
Video generation integration and multi-modal data (#294)
guillaume-byte Aug 18, 2026
1035c24
Fix Missing Export Labels Formatting Commit from PR
guillaume-byte Aug 18, 2026
ecb7e1a
Regenerate proto files and fix tests
guillaume-byte Aug 18, 2026
3dac73f
Wire GetStepSamples, agent pause/resume, model-age resource axis, age…
guillaume-byte Aug 18, 2026
ed1f207
Examples: train open-endedly, with no step or epoch ceiling
guillaume-byte Aug 18, 2026
d244e58
Remove new hash for each model run
guillaume-byte Aug 19, 2026
f60d7f1
Allow user to define and modify exp names from runs
guillaume-byte Aug 19, 2026
5d9a4c0
Fix utest
guillaume-byte Aug 19, 2026
16970cc
fix ipykernel sync error in logs
Aug 19, 2026
204facb
Add per-step signal snapshot for the outliers highlight action
guillaume-byte Aug 19, 2026
3243ecc
Merge remote-tracking branch 'origin/dev' into dev
guillaume-byte Aug 19, 2026
80523f8
Fix DB requests, default was full history
Aug 19, 2026
a33d03d
Update how we fetch data from DB for log history
guillaume-byte Aug 20, 2026
9b995a4
Update tests related to DB
guillaume-byte Aug 20, 2026
eca9791
add gitignored file
guillaume-byte Aug 20, 2026
e9777e1
Remove old cfg artefacts
guillaume-byte Aug 20, 2026
8ab5e05
fix report generation
guillaume-byte Aug 20, 2026
e3873ba
set default model at init
guillaume-byte Aug 20, 2026
7c641b2
Fix stale GetLatestLoggerData unit tests mocking removed get_signal_h…
guillaume-byte Aug 20, 2026
67d8054
Fix test_special_points_survive_decimation fixture's outliers JSON shape
guillaume-byte Aug 20, 2026
04cc2e3
TestIngestPersample new test
guillaume-byte Aug 21, 2026
dcb77ba
remove skipped test
guillaume-byte Aug 21, 2026
2732738
Fix examples imports
guillaume-byte Aug 21, 2026
6fe2c28
Fix WeightsLab Utests
guillaume-byte Aug 21, 2026
0615ebb
Merge branch 'main' into dev
guillaume-byte Aug 21, 2026
f62a8b1
modify documentation
Aug 21, 2026
8e28827
fix docs
Aug 21, 2026
4a905e7
[skip ci] update docs for weights studio
Aug 21, 2026
0336068
fix weightsStudio details toctree
Aug 21, 2026
18f7413
Fix Merged Conflicts
guillaume-byte Aug 21, 2026
bac97c8
Fix Merged Conflicts
guillaume-byte Aug 21, 2026
5c95754
Remove tmp doc
guillaume-byte Aug 21, 2026
105c1ec
Skip test related to kernel starting due to github CI random delay issue
guillaume-byte Aug 21, 2026
29aeb13
Remove 3dots in index rst
guillaume-byte Aug 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ agents
dist
static
weightslab/ui/static/
weightslab/**/AGENTS.md
weightslab/**/opencode.json

# Ignore files and directories generated by Python
logs
Expand Down Expand Up @@ -49,9 +51,10 @@ htmlcov-report
experiment_service_pb2.py
experiment_service_pb2_grpc.py
settings.json
laumch.json
launch.json
pkg_main.py
_version.py
.wl_opencode.json

# Ignore extensions
*.onnx
Expand Down
31 changes: 31 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,37 @@ Conventions that matter for correctness:
supports both `hp.get("lr")` and `hp["lr"]` (subscript == `.get`), and stays
live — reads reflect in-place updates and re-registration.

Recording values (pick by what the value is *about*, not by convenience):

| Value describes | Verb | Example |
|---|---|---|
| one sample | `wl.save_signals(signals={...}, batch_ids=ids, ...)` | an image's loss |
| one annotation | `wl.save_instance_signals(...)` | one box's IoU |
| a group of samples | `wl.save_group_signals(signals={...}, group_ids=[...])` | a pair's contrastive loss |
| one training **step** | `wl.save_model_signals(signals={...})` | a gradient norm |

The first three write dataframe rows (sortable/filterable in the grid); the
fourth only plots a curve. Never fake a step-level value by broadcasting it
across `batch_ids` — that writes a number onto samples it was never about.

- **Training-dynamics signals** come free with
`wl.watch_or_edit(model, flag="model", track_model_signals=True,
model_signals_every_n_steps=N)`. That emits, per step and with no call in the
training loop: `metrics/global/{grad_norm,weights_norm}` and
`metrics/layer/<layer_id>/{grad_norm,weights_norm,activation_mean,
activation_std,activation_max,activation_min}`. `<layer_id>` is the same id
architecture ops (freeze/reset) address, so a bad curve names the layer to act
on. Only collects inside `guard_training_context`, so eval never contaminates
it. Implementation: `weightslab/weightslab/components/model_signals.py`;
example: `examples/Usecases/wl-fashion-mnist-signals`.
- Diagnosing from these: early-layer `grad_norm` → 0 with healthy late layers
= vanishing gradient; `grad_norm` spiking orders of magnitude = exploding;
`activation_std` → 0 on a layer = that layer went constant (dead
ReLU/saturated BN); `weights_norm` growing while loss flattens = needs decay.
- Per-layer curves need per-layer modules: an `nn.Sequential` block resolves
to ONE layer id, so a model built out of Sequentials gets one curve for the
whole block.

---

## 4. Configuration (environment variables)
Expand Down
14 changes: 14 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -319,6 +319,20 @@ Find our documentation [online](https://grayboxtech.github.io/weightslab/latest/

</details>

<details>
<summary><b>Agent: chat with your training run (OpenCode)</b></summary>

<br>

WeightsLab ships two distinct agent surfaces — the backend SDK agent for data-manipulation
queries, and a local [OpenCode](https://opencode.ai)-backed agent with a full bash/file
toolset that can restart training, edit your code, and run recurring `/loop` monitoring
jobs. See the [Agent docs](https://grayboxtech.github.io/weightslab/latest/agent.html) for
how the two connect, how to point either one at a local model, and the full `/loop`
reference.

</details>

</details>

<details>
Expand Down
35 changes: 15 additions & 20 deletions agent_config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,25 +4,20 @@
# or directly in the config file.
# Config file values will override env. variables if both are set.
# If cloned, env. variables can be defined in a .env file at the root of the repository.
#
# OpenCode (opencode.ai) is the only supported agent backend: a local OpenCode
# server backs every LLM call. There is no API key here -- the credential
# lives in OpenCode's own config, entered once via `opencode auth login` or
# the Weights Studio landing page's login modal.
agent:
# Select the model provider.
# Local: 'ollama'
# Remote: 'openrouter'
# provider: openrouter # Default to OpenRouter if API key is provided, otherwise fallback to local Ollama. This can be overridden by env variable PREFERRED_PROVIDER.
# URL of the local OpenCode server (can also be set as env variable
# OPENCODE_URL). Defaults to http://127.0.0.1:4096. This is the SAME shared
# root env var the frontend reads, so set it once and both sides point at
# one server.
opencode_url: http://127.0.0.1:4096

# Local Settings
fallback_to_local: false
ollama_model: llama3.2:3b

# # Remote Model Selection
# Default is a fast flash-class model. The intent-planning task is simple JSON
# generation, so a small/fast model responds in ~2-4s where a 70B model took
# ~15-30s for no accuracy gain. Switch back to a large model here if you see
# accuracy issues (speed/accuracy tradeoff).
openrouter_model: bytedance-seed/seed-2.0-lite # Open router model name (can also be set as env variable OPENROUTER_MODEL). Fast alternatives: openai/gpt-4o-mini, meta-llama/llama-3.1-8b-instruct. Accurate/slow: ~google/gemini-flash-latest
# openrouter_api_key: <your_openrouter_api_key> # Open router API key (can also be set as env variable OPENROUTER_API_KEY)
openrouter_base_url: https://openrouter.ai/api/v1 # Open router base URL (can also be set as env variable OPENROUTER_BASE_URL)
openrouter_request_timeout: 60.0 # Timeout for OpenRouter API requests in seconds (can also be set as env variable OPENROUTER_REQUEST_TIMEOUT)
openrouter_max_tokens: 2048 # Max completion length. OpenRouter reserves max_tokens*price against the key budget BEFORE generating, so an uncapped value can 402 ("more credits, or fewer max_tokens") on a credit/weekly-limited key. Raise only if responses get truncated (env: OPENROUTER_MAX_TOKENS)
openrouter_provider_sort: throughput # Bias OpenRouter's upstream routing to avoid slow providers: 'throughput' | 'latency' | 'price'. Empty string = let OpenRouter choose (env: OPENROUTER_PROVIDER_SORT)
openrouter_structured_output: false # Ask the model for a schema-validated plan directly (skips free-form JSON + regex repair). More reliable, but only works on models whose OpenRouter route supports structured/JSON-schema output (e.g. Gemini, GPT-4o). env: OPENROUTER_STRUCTURED_OUTPUT=1
# OpenCode model, "providerID/modelID" (can also be set as env variable
# OPENCODE_MODEL). Empty string self-heals to whatever OpenCode's own
# config was last set to, or a configured provider default, falling back
# to the free-tier "opencode/deepseek-v4-flash-free" if neither resolves.
opencode_model: "opencode/deepseek-v4-flash-free"
254 changes: 254 additions & 0 deletions docs/_scripts/update_whats_new.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,254 @@
#!/usr/bin/env python3
"""Regenerate ``docs/whats_new.rst`` from the repository's GitHub releases.

The page is committed as static RST rather than fetched while Sphinx runs: a
docs build that reached out to api.github.com would fail on an offline machine,
in an air-gapped CI runner, or simply when the unauthenticated rate limit is
spent -- and it would fail at the moment someone is trying to build the docs,
which is the worst time to discover it. Regenerating is a deliberate step::

python docs/_scripts/update_whats_new.py

Only **stable** releases are listed. Every tag push also publishes a
``vX.Y.Z.devN`` pre-release to TestPyPI for verification (see ci.yml's
``build-and-publish-dev-release``), and those outnumber the real releases
roughly two to one -- a "What's New" page carrying them would be mostly noise
about build plumbing.

Each summary is the release body **between the "Welcome" heading and the
"What's Changed precisely:" heading**, which is where the release template puts
the human description. Two transformations make that readable:

* the boilerplate wrapping it (identical in all ten releases) is stripped;
* the template flattens every PR description onto a single line, so the
structure it had as markdown survives only as inline ``" - "`` separators and
stray ``"## Heading"`` markers -- ``_description_lines`` recovers it as real
nested bullets. Without that step the page is ten paragraphs of run-on text.
"""

from __future__ import annotations

import json
import re
import urllib.request
from datetime import datetime, timezone
from pathlib import Path

REPO = "GrayboxTech/weightslab"
RELEASE_COUNT = 10
OUTPUT = Path(__file__).resolve().parents[1] / "whats_new.rst"

LEAD_IN = re.compile(
r"^Welcome to the \*\*[^*]+\*\* release of WeightsLab\.[^\n]*\n+", re.M)
TAIL = re.compile(r"\n*One platform\. Unmatched flexibility\..*\Z", re.S)

SECTION_MARKER = re.compile(r"\s*#{2,4}\s+([A-Z][^#\n]{0,40}?)\s+(?=[-*`\[A-Z])")
ITEM_SPLIT = re.compile(r"\s+-\s+(?=[\[`*\w])")
PR_BULLET = re.compile(r"^\[([^\]]+)\]\(([^)]+)\)\s*:?\s*(.*)$", re.S)


def fetch_releases() -> list:
releases, page = [], 1
while True:
url = f"https://api.github.com/repos/{REPO}/releases?per_page=100&page={page}"
req = urllib.request.Request(url, headers={"Accept": "application/vnd.github+json"})
with urllib.request.urlopen(req, timeout=30) as resp:
batch = json.load(resp)
releases += batch
if len(batch) < 100:
return releases
page += 1


def stable_releases(releases: list) -> list:
out = [r for r in releases if not r.get("prerelease") and not r.get("draft")]
out.sort(key=lambda r: r.get("published_at") or "", reverse=True)
return out[:RELEASE_COUNT]


def welcome_section(body: str) -> str:
match = re.search(
r"^#{1,4}\s*Welcome\s*$(.*?)^#{1,4}\s*What's Changed", body or "", re.M | re.S)
return (match.group(1) if match else "").strip()


def _strip_boilerplate(text: str) -> str:
return TAIL.sub("", LEAD_IN.sub("", text)).strip()


def md_inline_to_rst(text: str) -> str:
"""Convert the inline markdown that turns up in PR descriptions.

Deliberately small: these are PR descriptions pasted into a release
template, so they carry links, bold, and inline code and little else.
"""
text = re.sub(r"`([^`]+)`", r"``\1``", text)
text = re.sub(r"\[([^\]]+)\]\(([^)]+)\)", r"`\1 <\2>`__", text)
text = re.sub(r"_\(([^)]+)\)_", r"*(\1)*", text)
text = re.sub(r"\s{2,}", " ", text)
return text.strip()


def _sanitize(text: str) -> str:
"""Repair the two things the release template's flattening leaves behind.

A GitHub task-list marker (``[ ]``) carries no meaning once the checklist
has been flattened into prose, and an unbalanced backtick is an outright
RST error -- which happens whenever the template truncates a long PR body
mid-token, as it does with an ellipsis. Closing the text at the last
balanced point is honest about the truncation and keeps the build clean;
the card links to the full release notes anyway.
"""
text = re.sub(r"^[-*]\s+", "", text.strip())
text = re.sub(r"^\[[ xX]\]\s*", "", text)
for marker in ("`", "**"):
if text.count(marker) % 2:
text = text[:text.rindex(marker)].rstrip(" .") + " …"
return text.strip()


def _wrap(text: str, width: int, first: str, rest: str) -> list:
"""Greedy wrap that keeps an RST bullet or indent prefix on the first line."""
words = text.split()
if not words:
return []
out, line = [], first + words[0]
for word in words[1:]:
if len(line) + 1 + len(word) > width:
out.append(line)
line = rest + word
else:
line += " " + word
out.append(line)
return out


def _description_lines(description: str, indent: str) -> list:
"""Render one PR's flattened description as nested RST beneath its bullet."""
if not description.strip():
return []

marked = SECTION_MARKER.sub(
lambda m: "\n@@" + m.group(1).rstrip(":") + "@@\n", description)

lines = []
for block in marked.split("\n"):
block = block.strip()
if not block:
continue
heading = re.fullmatch(r"@@(.+)@@", block)
if heading:
lines.append("")
lines.append(indent + "**" + md_inline_to_rst(heading.group(1)) + "**")
continue
items = [i.strip() for i in ITEM_SPLIT.split(block) if i.strip()]
lines.append("")
if len(items) > 1:
for item in items:
lines.extend(_wrap(_sanitize(md_inline_to_rst(item)), 86,
first=indent + "- ", rest=indent + " "))
else:
lines.extend(_wrap(_sanitize(md_inline_to_rst(items[0])), 86,
first=indent, rest=indent))
return lines


def summary_to_rst(body: str) -> list:
text = _strip_boilerplate(welcome_section(body))
if not text:
return [" *No description was published with this release.*"]

lines, entries, current = [], [], None
for raw in text.splitlines():
stripped = raw.strip()
if not stripped or stripped == "---":
continue
if stripped.startswith("- "):
current = [stripped[2:]]
entries.append(current)
elif stripped.startswith(">") and current is not None:
current.append(stripped.lstrip("> ").strip())
elif current is not None:
current.append(stripped)
else:
lines.extend(_wrap(_sanitize(md_inline_to_rst(stripped)), 86, first=" ", rest=" "))

for entry in entries:
joined = " ".join(entry).strip()
match = PR_BULLET.match(joined)
if match:
label, url, description = match.groups()
lines.append(" - `" + label.strip() + " <" + url.strip() + ">`__")
lines.extend(_description_lines(description, " "))
else:
lines.extend(_wrap(_sanitize(md_inline_to_rst(joined)), 86, first=" - ", rest=" "))
lines.append("")

while lines and not lines[-1].strip():
lines.pop()
return lines


HEADER = """.. _whats-new:

What's New
==========

The last {count} stable releases of WeightsLab, newest first. Each card links to
its full release notes on GitHub, where the complete "What's Changed" commit
list lives.

.. note::

Only stable releases appear here. Every tag also publishes a
``vX.Y.Z.devN`` pre-release to TestPyPI for verification; those are build
plumbing rather than user-facing changes.

.. tip::

Upgrade with ``pip install --upgrade weightslab``. Setting up for the first
time? Start at :doc:`quickstart`.

"""

FOOTER = """
----

`Every release on GitHub → <https://github.com/{repo}/releases>`__

.. This page is generated. To refresh it after a release:
.. python docs/_scripts/update_whats_new.py
.. Last generated: {generated}
"""


def build_rst(releases: list) -> str:
parts = [HEADER.format(count=len(releases))]
for release in releases:
published = datetime.fromisoformat(
release["published_at"].replace("Z", "+00:00")).astimezone(timezone.utc)
date_label = f"{published.strftime('%B')} {published.day}, {published.year}"

parts.append(".. card::\n")
parts.append(f" :link: {release['html_url']}\n")
parts.append(" :class-card: wl-release-card\n\n")
parts.append(" .. rst-class:: wl-release-date\n\n")
parts.append(f" {date_label}\n\n")
parts.append(" .. rst-class:: wl-release-version\n\n")
parts.append(f" {release['tag_name']}\n\n")
parts.append("\n".join(summary_to_rst(release.get("body") or "")))
parts.append("\n\n")
parts.append(FOOTER.format(
repo=REPO, generated=datetime.now(timezone.utc).strftime("%Y-%m-%d")))
return "".join(parts)


def main() -> None:
releases = stable_releases(fetch_releases())
OUTPUT.write_text(build_rst(releases), encoding="utf-8")
print(f"wrote {OUTPUT} — {len(releases)} releases, "
f"{releases[-1]['tag_name']} … {releases[0]['tag_name']}")


if __name__ == "__main__":
main()
Loading
Loading