Repository navigation
Releases
v0.0.9
Highlights
OpenRL now lives at openrl-dev/openrl. The repository moved from gke-labs/open-rl to the openrl-dev organization (#434). This is the first release published from the new home. Images now publish to ghcr.io/openrl-dev/openrl/<name>:<tag>; the bundles, image defaults, agent skill and docs point at the new paths. The old ghcr.io/gke-labs/open-rl images stay available but get no new tags.
A time-sliced trainer's turn takes in requests that queue during it (#437). An optim_step that arrived during the turn no longer waits for a turn of its own. The trainer keeps taking queued requests for up to OPEN_RL_TURN_DRAIN_SECONDS (default 5; 0 turns it off). On a 20-job sweep on 8 H100s, lone optim_step turns went from about a third of all turns to none.
Harvey LAB recipe (#431, #432, #433):
- Agent Substrate is a third sandbox backend next to Podman and Agent Sandbox. Idle sandboxes suspend and resume with files and processes intact.
- Each turn's budget comes from what remains of the context window. An empty judge verdict is a reward error, not a zero.
- Gemma 4 E4B trains at its full 131k window on the Automodel trainer.
- The README and the GKE guide are rewritten around the current recipe.
CNCF onboarding
- The Developer Certificate of Origin replaces the Google CLA (#444). Commit with
git commit -s. - The project adopts the CNCF Code of Conduct (#445).
- Documentation is licensed under CC BY 4.0; code stays Apache 2.0 (#448).
- The site footer carries the LF Projects copyright line and the CNCF sandbox notice (#446).
- The sampler sets
VLLM_NO_USAGE_STATS=1, so vLLM no longer reports to stats.vllm.ai (#447). Set it to0to opt back in.
What's Changed
- Point repo, image, and module paths at openrl-dev/openrl by @hodaaaaaaaaaa in #434
- harvey_labs: fair grading, and Gemma 4 E4B at full context on Automodel by @ShubyM in #431
- harvey_labs: Agent Substrate sandbox backend with idle suspend by @ShubyM in #432
- harvey_labs: rewrite the recipe README and GKE guide by @ShubyM in #433
- Replace the Google CLA with the DCO in the contributing guide by @hodaaaaaaaaaa in #444
- Add the CC BY 4.0 license for documentation by @hodaaaaaaaaaa in #448
- Disable vLLM usage reporting in the sampler by @hodaaaaaaaaaa in #447
- Adopt the CNCF Code of Conduct by @hodaaaaaaaaaa in #445
- site: add the LF footer and CNCF sandbox notice by @hodaaaaaaaaaa in #446
- training: improve training batch construction by @droot in #437
Full Changelog: v0.0.8...v0.0.9
v0.0.8
Highlights
Sampling pools. Sampling now goes through pools (#386, design in #324). The API server adds each sample request to a Redis Stream for the model's pool (#336). A dispatcher reads the stream, sends each request to a sampler, and saves exactly one result per request (#354). A sampler that stops does not lose requests. A shared pool serves its jobs in round-robin order, so one job's large batch does not block the other jobs. A request that no sampler answers within OPEN_RL_SAMPLE_DEADLINE_SECONDS fails with an error. A pool with one owner runs its sampler in process, as before. Shared LoRA pools and pools with two or more replicas run vllm serve replicas behind a dispatcher pod with Envoy and the llm-d endpoint picker. The dispatcher loads each new FFT revision onto every replica (#357).
Inspection API. The API server now serves read-only routes under /api/v1/inspect/ for agents and dashboards (#388, #389, #392, #393, #395, #396, #397):
inventorylists each run with its model, recipe, lifecycle, pods and nodes. It also lists the cluster's nodes, GPUs and problem pods.runslists one line per run.runs/{run_id}/summaryexplains why a run does not behave: pace, goodput, lost requests, failures, saves and placement.runs/{run_id}/stepsreturns each step's ops, timing and metrics, including the density of each sparse delta (#404).activityreturns one lane per Workload with its GPUs, runs, held interval, time-slicer turns and waits (#411).logs?run_id=<id>pages a run's logs. SetOPEN_RL_LOG_STORE=cloud-loggingon the API server to enable it.query?name=runs named PromQL queries such asgpu_utilandgpu_busy. SetOPEN_RL_PROMETHEUS_URLto enable it.
The scheduler now records the GPU UUIDs, the placement time and the release time on each Workload's status (#393). Each DRA node lists its GPUs by name, UUID, product and memory (#409). Trainers and samplers record their activity in Redis (#396). One flusher thread per process writes the records every 5 seconds, so the request path makes no Redis calls.
Fleet demo app. k8s/deploy/demo adds a web app over the inspection API (#412). It starts a sweep of RL client Jobs and shows the fleet as one row per GPU. It also draws an occupancy timeline and shows the sparse deltas of each FFT run. It runs on the API server image with its code in a ConfigMap, so there is no image to build.
GPU metrics in every bundle. The lora and fft bundles now ship the DCGM exporter (#391). Before, only the distributed-fft-timeslice bundle had it. docs/configuration.md lists the Workload Identity grants that the inspection API needs for metrics and logs on GKE.
Faster job start.
- If you set
openrl.recipe=rlinTINKER_TAGSoruser_metadata,create_modelstarts the sampler together with the trainer (#368). Before, the sampler started at the first sample request. In an eight-job fleet test, every job reached its first step 17 to 60 seconds sooner. - Sampler pods keep vLLM's compile cache on the shared volume (#358). The first sampler for a model, GPU type and engine setup compiles and saves the result. Later samplers load it in 2 to 6 seconds instead of 42 to 83 seconds.
- The sampler records CUDA graphs for power-of-two batch sizes only (#359).
- The gemma-4 LoRA sampler loads the text-only model (#360). Set
VLLM_ENABLE_MULTIMODAL=1to keep the full model. - Trainers read a checkpoint on nfs or lustre into the page cache with eight threads before they load it (#380).
- The client image installs the projects at build time, so a client container starts 8 to 27 seconds sooner (#410).
Faster training steps.
- If
OPEN_RL_TRAIN_TOKEN_BUDGETis unset orauto, the trainer groups sequences into passes of up to 16384 tokens, or fewer on a small GPU (#350). Before, an unset budget meant one sequence per pass. A 64-sequence gemma-4-E2B LoRA step on an A100 takes 3.5 s instead of 43 s. - The trainer starts a new pass when padding would exceed 25% of a pass (#351).
- The trainer computes target log-probabilities in chunks of 1024 positions, so loss memory no longer grows with tokens × vocabulary size (#348). This raises the token budget for large-vocabulary models such as gemma-4.
Fleet placement.
OPEN_RL_LORA_JOBS_PER_RUNTIMEcaps the LoRA jobs on one shared trainer and sampler (#371). The next job on the same base model starts a second runtime with its own workers. Unset or0keeps one runtime.- The scheduler flag
--max-seats-per-claim(OPEN_RL_MAX_SEATS_PER_CLAIM) caps the time-sliced workers on one shared GPU (#394). A worker that finds every claim full waits for a free GPU or a free seat. The default0sets no limit.
Shared volume class and size. make render takes STORAGE_CLASS and STORAGE_SIZE and patches open-rl-shared-pvc with them (#384). Unset keeps standard-rwx and 1Ti, so the release bundles do not change. A five-job fleet finished in 412 s on a Filestore Zonal volume instead of 950 s on Basic HDD.
Performance comparison script. scripts/perf_compare.py runs the same 23-job GSM8K workload on a "before" and an "after" image set (#385). Its report compares total time, time to the first step, step time by phase and peak GPU memory. Run it with make perf-compare PERF_BEFORE=... PERF_AFTER=....
Breaking changes
- Sampling pools (#386). Drain every job before you upgrade. Old samplers read the old queue, and the owner names of shared LoRA runtimes change. Apply the Role before the image. The API server needs new
listverbs on Deployments and NetworkPolicies. Rebuild custom trainer images, because the trainer now freezes each LoRA save for the sampler. This release removes the old queue sampler. - Sampling settings (#352). vLLM no longer applies a checkpoint's default sampling settings, such as Qwen3's temperature of 0.6. A request gets exactly what the client asks for. vLLM now uses prefix caching.
- Token budget default (#350). An unset
OPEN_RL_TRAIN_TOKEN_BUDGETnow meansauto. Set it to0to keep one sequence per pass. - PodMonitoring CRD (#391). The
loraandfftbundles now need the PodMonitoring CRD, which GKE's Managed Prometheus provides.
Fixes
- A time-sliced sampler now wakes its weights, applies the delta, and then wakes its KV cache (#425). Before, a large delta ran out of memory because the KV cache took the GPU first.
- A sampler that exits during a turn now lets its park finish before it unregisters (#427). Before, the process died with
readuntil() called while another coroutine is already waiting. - A time-sliced sampler can restart while the llm-d snapshot agent still holds its job as SAVED. That sampler now fails its pending requests with the reason in seconds (#428). Before, it restarted for an hour until the client hit the 3600 s deadline. The job still cannot recover under the same name.
- The FFT trainer writes a full sampler save when no earlier save holds the base of a sparse delta, for example after
load_from_state(#357). Before, the sampler could end up on the wrong weights. - The
gpu_busyquery falls back toDCGM_FI_DEV_GPU_UTILwhen Managed Service for Prometheus answersnullfor a query with no series (#408). - The
openrlskill'sSKILL.mdfrontmatter now parses as YAML (#356).
Docs and site
- Sampling pools design (#324).
- The NVIDIA DRA driver install now sets
gpuResourcesEnabledOverride=true, which chart 25.8.0 requires (#418). - Blog posts: OpenRL in October (#334, #335) and Delta Weight Sync in OpenRL (#346).
- The slide deck has a new section on the problems OpenRL solves, and controls for background, text and presenter (#367).
New Contributors
- @sunnythecode made their first contribution in #346
- @linde made their first contribution in #356
Full Changelog: v0.0.7...v0.0.8
v0.0.7
Highlights
Self-describing server. get_server_capabilities now returns an openrl object (#328). This object gives the release version, the launcher mode for workers, and the server limits. It also gives the URLs for the settings schema and the agent skill. The OpenAPI document (/openapi.json) lists all openrl.* settings under components.schemas.OpenRLSettings.
Model status view. Clients can check the state of a model at GET /api/v1/openrl/models/{model_id} without kubectl access (#328). Each worker reports one of five states:
waiting_for_placementstartingreadyfailedstopped
Trainer workers now report ready only after they load the model into memory. While a worker loads the model, its state stays starting. The tiny_sft and tiny_rl examples print the model_id and the curl command for this endpoint right after create_model.
OpenRL agent skill. Each release now includes openrl-skill.tar.gz as a release asset, and the repository includes a plugin manifest for Claude Code (#328). The skill explains how to connect, how to read the settings schema, how to size workers for large models, and how to fix common errors. It works alongside the research and debug skills from tinker-cookbook, and it lists how OpenRL differs from the hosted Tinker service.
Deployment check (openrl-doctor). The new openrl-doctor CLI checks an OpenRL server from the client side (#328). Run uv run --project examples openrl-doctor --base-url $OPENRL to check health, capabilities, and the settings schema. Add --train to run a short training job and stream its output.
Full Changelog: v0.0.6...v0.0.7
v0.0.6
Highlights
Automodel trainers. A new worker runs NVIDIA NeMo Automodel trainers (#296). The worker supports data parallelism and context parallelism (#297). To use more than one GPU for a trainer, set openrl.trainer_gpus=N. The scheduler then starts one torchrun trainer on N GPUs (#307). To split one sequence across some of these GPUs, set openrl.trainer_cp. You can resume an adapter and its optimizer state from a checkpoint (#322).
Exclusive mode. If you set openrl.exclusive=true in user_metadata, the workload gets its own GPUs (#272). No other worker uses these GPUs, and the scheduler does not time-slice them.
Sampler replicas. If you set openrl.sampler_replicas=N, OpenRL starts N samplers (#308). Each sampler uses one GPU. All the samplers take requests from the same sampling queue.
vLLM 0.30. OpenRL now uses vLLM 0.30 (#281). One sampler now serves both LoRA models and FFT models. For delta weight sync, the sampler applies sparse patches with the vLLM function load_checkpoint_weight_patches.
Getting started guide. The new guide, docs/getting-started.md, starts from a GPU cluster (#294). It shows how to train a model on that cluster with SFT and RL.
Breaking changes
-
FFT settings (#318). The API server no longer accepts these inputs:
- the
x-open-rl-fine-tuning-typeheader - the
x-open-rl-weight-sync-strategyheader - the
full_configbody field
If a request sends one of them, the API server returns a 400 error. The error message gives the name of the new setting. Put the new settings in
TINKER_TAGSor inuser_metadata:Setting Values openrl.fine_tuning_typelora(default),fullopenrl.weight_syncdelta(default),fullopenrl.fft_seedint openrl.fft_cpu_offloadtrue/false - the
-
Sampler (#281). This release removes
lora_sampler.pyandMOCK_VLLM. The weight sync configuration now has one field,strategy. Its value isdeltaorfull. -
Local setup (#285). This release removes
make vllmandVLLM_URL. To sample with vLLM, setREDIS_URL. The API server then starts the sampler worker.
Fixes
- The Redis client now waits 30 seconds before a socket read stops (#287). Before this fix, the client could lose a request after Redis removed it from the queue.
- Worker pods now get
VLLM_MAX_MODEL_LEN,OPEN_RL_TRAIN_TOKEN_BUDGET, andMAX_JOBSfrom the deployment (#307).
Examples
The Harvey LAB recipe has these changes:
- New default values for Qwen3.5-9B, and fixes to grading (#319)
- A backend that uses Agent Sandbox (#320)
- A Kubernetes Job that runs the recipe in the cluster (#321)
Full Changelog: v0.0.5...v0.0.6
v0.0.5
What's Changed
- feat: gateway -> api_server rename by @ShubyM in #253
- API server: typed request bodies and one error path by @ShubyM in #254
- Validate typed training commands by @ShubyM in #255
- Unify LoRA and FFT command execution by @ShubyM in #256
- chore(deps): bump aiohttp from 3.14.0 to 3.14.3 in /examples by @dependabot[bot] in #168
- Separate request storage from typed model state by @ShubyM in #258
- security: configure Dependabot for automated dependency vulnerability patching by @wespanther in #242
- chore(deps): bump actions/checkout from 4.4.0 to 7.0.1 by @dependabot[bot] in #264
- chore(deps): bump pyasn1 from 0.6.3 to 0.6.4 by @dependabot[bot] in #202
- site: openrl.dev website (Hugo + GitHub Pages) by @droot in #268
- release: publish only the scheduler-based bundles by @droot in #276
- examples: move Text-to-SQL and math_rl onto the multi-tenant stack by @droot in #277
New Contributors
- @wespanther made their first contribution in #242
Full Changelog: v0.0.4...v0.0.5
v0.0.4
What's Changed
Full Changelog: v0.0.3...v0.0.4
v0.0.3
What's Changed
- fix(gateway): don't treat a save seq_id of 0 as missing by @hodaaaaaaaaaa in #240
- docs: add the OpenRL presentation deck by @droot in #241
- fix: include all pods in host memory calculation by @ShubyM in #239
- fix: release blockers found running v0.0.2 and the LoRA Without Regret sweeps by @ShubyM in #244
Full Changelog: v0.0.2...v0.0.3
v0.0.2
What's Changed
- feat: k8s worker manager by @ShubyM in #123
- Full parameter fine-tuning sampler sub-system by @droot in #129
- feat: llmd snapshot agent integration by @ShubyM in #132
- fixes: minor fixes by @droot in #134
- refactor(fft): rename internal snapshot-agent to accel-timeslicer and automate E2E worker cleanup by @droot in #135
- feat(fft): structured model metadata and time-slicer env cleanup by @droot in #136
- Feat/fft multi gpu fsdp by @droot in #137
- docs(fft): add comprehensive FFT architecture report (fft.md) by @droot in #138
- docs(fft): consolidate FFT architecture and sampler documentation int… by @droot in #139
- feat: implement 3-phase batched async DMA offloading and proactive ch… by @droot in #140
- Feat: add Gemma 4 and Qwen 4B RL e2e training support and Redis conne… by @droot in #141
- feat: implement non-blocking DRAM checkpoint saving, buffer offloading by @droot in #142
- feat(timeslicer): implement configurable LRS/FIFO anti-platoon priority selector by @droot in #143
- feat(k8s): add minimal client Dockerfile and K8s Job runner for E2E testing by @droot in #145
- Implement Delta Snapshot Weight Synchronization & Vectorized Host-CPU Diffing Engine by @droot in #147
- FFT fixes and migrate to vllm v0.25.1 by @droot in #154
- fix(ci): pin GitHub Action SHAs and enforce permissions to satisfy zizmor by @droot in #165
- RL workload scheduler by @droot in #170
- fix: weight-sync and sizing fixes for FFT by @aishukamal in #187
- chore: pin the timeslice client and adopt its 0.2.x API by @aishukamal in #195
- feat: make fft mergable by @ShubyM in #201
- Revert "feat: make fft mergable" by @ShubyM in #203
- Fft mergable by @ShubyM in #204
- Support dev loop on kind clusters by @droot in #205
- Fix DRA claim scheduling, size FFT by model, cut worker startup cost by @droot in #206
- chore(fft): deploy the published llm-d Snapshot Agent image instead of building our own by @hodaaaaaaaaaa in #207
- Point the kind snapshot agent at the node's own driver root by @hodaaaaaaaaaa in #209
- chore(fft): track the llm-d v0.1.0 release instead of an image digest by @hodaaaaaaaaaa in #212
- feat(gateway): add the sampler metadata route by @hodaaaaaaaaaa in #213
- Size LoRA memory tier by base-model weights by @droot in #210
- fix(sampler): skip vLLM's multimodal profiling for text models by @hodaaaaaaaaaa in #215
- fix(sampler): route string stop sequences to vLLM's stop argument by @hodaaaaaaaaaa in #214
- feat: standalone GPU claim scheduler (OpenRLWorker) by @ShubyM in #178
- docs: add the FY 2026 roadmap by @droot in #220
- feat: add estimator.py by @ShubyM in #222
- feat: add grouping to timeslicer by @ShubyM in #223
- feat: place FFT workers through the scheduler by @ShubyM in #224
- feat: make binpack aware of worker kind by @ShubyM in #231
- Slim server image by @droot in #232
- Release LoRA scheduling with dedicated GPUs and portable deployment by @ShubyM in #226
- feat: harvey recipe refactor by @ShubyM in #228
- Fix Gemma tokenizer routing and delta name mapping, add a two-family e2e scenario by @droot in #235
- feat: wire heartbeats to teardown sessions by @ShubyM in #234
New Contributors
- @aishukamal made their first contribution in #187
Full Changelog: v0.0.1...v0.0.2
v0.0.1
What's Changed
- Feat/gemma pig latin by @ShubyM in #3
- fix: remove --no-sync flag and bump pyjwt to 2.12.0 by @droot in #5
- cli sampe fixes by @droot in #6
- test: add unit test for gemma pig-latin fine-tuning flow by @droot in #7
- Docs/uv getting started by @ShubyM in #8
- refactor: overhaul documentation structure, move diagrams to assets, … by @droot in #9
- Refreshed the README by @droot in #10
- Cleaned up the docs and diagrams by @droot in #12
- Include pngs in assets directory by @droot in #13
- Cleaned up GKE deployment instructions by @droot in #14
- Support both FS (shared and lustre) by @droot in #15
- feat: gemma3 sql to text recipe by @ShubyM in #16
- Refine Pig Latin SFT examples to single words and update README with … by @droot in #21
- feat: Make LoRA alpha and dropout configurable, adjust SFT training s… by @droot in #22
- Gemma notebook by @ShubyM in #23
- Pig latin notebook by @ShubyM in #24
- Add links in readme + change flow of notebooks by @ShubyM in #25
- add kustomize + tip by @ShubyM in #26
- chore(deps): bump cryptography from 46.0.5 to 46.0.6 in /server by @dependabot[bot] in #31
- chore(deps): bump requests from 2.32.5 to 2.33.0 in /client by @dependabot[bot] in #27
- chore(deps): bump cbor2 from 5.8.0 to 5.9.0 in /server by @dependabot[bot] in #20
- chore(deps): bump pyasn1 from 0.6.2 to 0.6.3 in /client by @dependabot[bot] in #19
- chore(deps): bump pyasn1 from 0.6.2 to 0.6.3 in /server by @dependabot[bot] in #11
- chore(deps): bump pygments from 2.19.2 to 2.20.0 in /client by @dependabot[bot] in #32
- feat: sqllite for eval by @ShubyM in #33
- Add blog post: From Your Mac to GKE with Open-RL by @ShubyM in #34
- feat: make single process and engine default by @ShubyM in #37
- Singe process kustomize by @ShubyM in #39
- remove custom transformers wheel pull by @ShubyM in #40
- feat: add ruff fmt to makefile and CI by @ShubyM in #43
- feat: rename by @ShubyM in #44
- refactor: split trainer into two files and clean up gateway by @ShubyM in #47
- fix: override vllm to fix linux cpu install by @ShubyM in #53
- chore(deps): bump pillow from 12.1.1 to 12.2.0 in /server by @dependabot[bot] in #54
- chore(deps): bump aiohttp from 3.13.3 to 3.13.4 in /server by @dependabot[bot] in #36
- chore(deps): bump aiohttp from 3.13.3 to 3.13.4 in /client by @dependabot[bot] in #38
- chore(deps): bump cryptography from 46.0.6 to 46.0.7 in /server by @dependabot[bot] in #48
- chore(deps): bump cryptography from 46.0.5 to 46.0.7 in /client by @dependabot[bot] in #45
- chore(deps): bump pillow from 12.1.1 to 12.2.0 in /client by @dependabot[bot] in #50
- chore(deps): bump python-multipart from 0.0.22 to 0.0.26 in /server by @dependabot[bot] in #52
- chore(deps): bump pygments from 2.19.2 to 2.20.0 in /server by @dependabot[bot] in #56
- Fix/client lock and tinker pin by @ShubyM in #57
- feat: simplify runtime config by @ShubyM in #55
- clean: cleanup notebook and add CI job for qwen by @ShubyM in #58
- Restructure repo by @chuangw6 in #59
- feat: RL recipe for ttsql by @ShubyM in #60
- add gif by @ShubyM in #62
- cleanup: configuration file by @ShubyM in #68
- Add gh workflow to build and push image to ghcr by @chuangw6 in #64
- feat: enumerate tinker client methods to see what we support by @ShubyM in #63
- ttsql: Improve recipe documentation and add sanity check by @chuangw6 in #71
- feat: upgrade vllm to 0.20.0 by @ShubyM in #78
- cleanup architecture.md by @ShubyM in #79
- fix: optimizer adapter isolation by @ShubyM in #80
- Feat/ttsql gke guide by @ShubyM in #82
- feat: guide for latest tinker cookbook recipes by @ShubyM in #81
- Update examples/README.md: remove old references and reorganize by @droot in #84
- fix: update accelerator-types list command in README by @chuangw6 in #85
- Replace watches with waits in README by @chuangw6 in #87
- Cleanup examples: remove tinker-rl-basic, hello-world, and unused files by @droot in #92
- feat: ttsql rl notebook by @ShubyM in #90
- Consolidate Text-to-SQL guides and decouple infrastructure setup by @chuangw6 in #96
- feat: add trainer padded batching by @ShubyM in #97
- Enable gradient checkpointing to prevent OOM on long training sequences by @chuangw6 in #99
- feat: autoresearch support by @ShubyM in #103
- docs: Rename Open-RL to OpenRL across all markdown files by @droot in #104
- docs: Fix broken links to examples, recipes, and setup guides in READ… by @droot in #106
- chore(deps): bump urllib3 from 2.6.3 to 2.7.0 in /src/server by @dependabot[bot] in #94
- chore(deps): bump idna from 3.13 to 3.15 in /src/server by @dependabot[bot] in #102
- chore(deps): bump urllib3 from 2.6.3 to 2.7.0 in /dev/tools by @dependabot[bot] in #95
- feat: snapshot agent by @ShubyM in #109
- feat: add FFT trainer worker class by @ShubyM in #113
- feat: wire in FFT worker by @ShubyM in #114
- chore(deps): bump aiohttp from 3.13.5 to 3.14.0 in /src/server by @dependabot[bot] in #111
- chore(deps): bump aiohttp from 3.13.5 to 3.14.0 in /examples by @dependabot[bot] in #110
- chore(deps): bump idna from 3.11 to 3.15 in /dev/tools by @dependabot[bot] in #100
- chore(deps): bump starlette from 0.52.1 to 1.0.1 in /src/server by @dependabot[bot] in #112
- chore(deps): bump idna from 3.13 to 3.15 in /examples by @dependabot[bot] in #101
- feat: FFT snapshot integration by @ShubyM in #116
- chore: make src the server package root by @ShubyM in #117
- docs: add AGENTS.md with environment and testing guidelines by @droot in #120
- chore(deps): bump aiohttp from 3.14.0 to 3.14.1 in /examples by @dependabot[bot] in #127
- chore(deps): bump pydantic-settings from 2.14.1 to 2.14.2 by @dependabot[bot] in #133
- chore(deps): bump cryptography from 48.0.0 to 48.0.1 by @dependabot[bot] in #131
- chore(deps): bump starlette from 1.2.1 to 1.3.1 by @dependabot[bot] in #130
- chore(deps): bump tornado from 6.5.5 to 6.5.7 in /examples by @dependabot[bot] in #128
- Add Harvey LAB RL recipe by @ShubyM in #159
- chore(deps): bump pyasn1 from 0.6.3 to 0.6.4 by @dependabot[bot] in #158
- chore(deps): bump mcp from 1.27.2 to 1.28.1 by @dependabot[bot] in #149
- chore(deps): bump pillow from 12.2.0 to 12.3.0 in /dev/tools by @dependabot[bot] in #155
- chore(deps-dev): bump setuptools from 81.0.0 to 83.0.0 in /examples by @dependabot[bot] in #157
- chore(deps): bump pyasn1 from 0.6.3 to 0.6.4 in /examples by @dependabot[b...