# Changelog

Notable updates to the Tinker SDK, the [Tinker Cookbook](https://github.com/thinking-machines-lab/tinker-cookbook), and the [Tinker Console](https://tinker-console.thinkingmachines.ai/). SDK and Cookbook entries are dated by PyPI release, Console entries by launch date. For model availability and retirements, see [Models & Pricing](https://tinker-docs.thinkingmachines.ai/tinker/models/) and [Model Deprecations](https://tinker-docs.thinkingmachines.ai/tinker/model-deprecations/).

| Release | Date | Changes |
| --- | --- | --- |
| **SDK 0.23.0** | July 15, 2026 | - `SampleResponse` now reports `prompt_cache_hit_tokens`, the number of prompt tokens billed as prefix-cache hits. It is counted on the prompt itself, so it is not multiplied across samples when `num_samples > 1`.<br>- `DmelChunk.length` now returns the token count from the tensor instead of raising. |
| **Cookbook 0.5.2** | July 15, 2026 | - The `inkling.sample_reasoning` script's default generation budget now scales with reasoning effort (`max_tokens` of 4096 / 8192 / 16384) unless you pin a single `max_tokens`. |
| **Cookbook 0.5.1** | July 15, 2026 | - The `sl_basic` and `rl_basic` recipes now derive the renderer and dataset tokenizer from a `model_name=` command-line override, instead of always using the default model's. A `model_name` override previously trained with the wrong renderer and tokenizer. |
| **Cookbook 0.5.0** | July 15, 2026 | - Added a Modal inference integration (`tinker_cookbook.inference.modal`, installed via the `[modal]` extra) that turns a `tinker://` LoRA checkpoint into an OpenAI-compatible endpoint: `prepare` merges the adapter into the base model, `serve` runs it behind an SGLang endpoint on Modal, and `compare` checks outputs against the Tinker sampler.<br>- Supervised NLL evaluation now reports **bits-per-byte (BPB)** alongside NLL, giving a tokenizer-independent metric for comparing models (special tokens are excluded from the count). |
| **Console** | July 15, 2026 | - Launched the **Playground**, opened to all organizations (usage is not billed for now), for chatting with **Inkling** directly in the console. It includes a reasoning-effort control (minimal / low / medium / high / xhigh, with a custom value), an editable system prompt (with a reset button and a `{{ current_date }}` template), and a **View code** button that shows the equivalent API request. The console home page was redesigned around it. |
| **Console** | July 14, 2026 | - The billing **Pricing** tab now links out to the [Models & Pricing](https://tinker-docs.thinkingmachines.ai/tinker/models/) docs page instead of showing a separate in-console table. |
| **Console** | July 10, 2026 | - Invoices and the **Usage** page's By Type view now show sampler prefill as separate **Cache Hit** and **Cache Miss** line items, instead of one merged `Tinker Sampler Prefill` line, so you can see how much of your prefill was billed at the discounted cached rate. See [Models & Pricing](https://tinker-docs.thinkingmachines.ai/tinker/models/) for the rates. |
| **Console** | July 8, 2026 | - The console is now served at [tinker.thinkingmachines.ai](https://tinker.thinkingmachines.ai/). The previous `tinker-console.thinkingmachines.ai` address now redirects there (preserving the path and query string), so existing links keep working. |
| **Console** | July 6, 2026 | - Added a **Session Metrics** view to every session page, rolling out to all organizations. Time-series panels show what your training and sampling traffic did over time — active sample requests, training utilization, and average training, sampling, and prefill throughput — with drag-to-zoom, a time-range picker, and a plain-language explanation of each metric.<br>- Added a **Download Perfetto** button to the session page that exports the full session timeline as a `.pftrace` you can open at [ui.perfetto.dev](https://ui.perfetto.dev/). The trace goes deeper than the console panels: per-request training and sampling spans, plus counter tracks for concurrency, throughput, per-request sizes, latency percentiles (p50/p90/p99), running totals, and rate-limit events. Re-exporting picks up new session activity. See the [session metrics docs](https://tinker-docs.thinkingmachines.ai/tinker/session-metrics) for details. |
| **SDK 0.22.7** | July 1, 2026 | - Fixed `ServiceClient.create_training_client_from_state()` not authenticating correctly when given a `weights_access_token`, which broke loading from checkpoints shared by another account. |
| **SDK 0.22.6** | June 26, 2026 | - Added a `project_id` filter to `RestClient.list_training_runs()`, so you no longer need to page through all runs to find a project's runs.<br>- Weights-info REST clients no longer create a session on construction. |
| **SDK 0.22.4** | June 24, 2026 | - `ServiceClient` now falls back to the `TINKER_PROJECT_ID` environment variable when no `project_id` argument is passed, mirroring `TINKER_API_KEY`.<br>- Raised the default cap on in-flight sample requests from 1000 to 2000. The cap is now delivered via server client config; the server value overrides `max_connections` while preserving your other retry settings.<br>- Raised the minimum `zstandard` dependency to `>=0.24.0` so the SDK installs cleanly on Python 3.14. |
| **Cookbook 0.4.3** | June 24, 2026 | - Kimi K2 tokenizers are now loaded directly instead of via `AutoTokenizer`, avoiding a tokenizer regression in some `transformers` releases (which are also excluded from the supported range).<br>- Distillation recipes were rerun and updated to target Qwen3.5 models, with refreshed configs and expected results.<br>- Tutorial 407 (RLHF pipeline) now uses a capped 40-step RL stage and documents expected runtime. |
| **Console** | June 17, 2026 | - Reorganized navigation around sessions: the Training Runs list is replaced by a **Sessions** list (session ID, created time, owner, project — with filtering and pagination), and each session page shows its training runs. Listing is index-backed, so large projects load much faster. |
| **Cookbook 0.4.2** | June 10, 2026 | - Added a Nemotron Ultra renderer with model info and recommended-hyperparameter support, enabling Nemotron Ultra across cookbook training and sampling recipes.<br>- Improved `tinker_cookbook.scripts.copy_checkpoint` with destination-project support and simpler source-access-token handling for cross-organization copies.<br>- Added `tinker_cookbook.scripts.save_audit_log` to archive audit log events as per-day JSONL files, with one-shot, backfill, and recurring polling modes.<br>- Added token- and wall-clock-based checkpoint cadence options (`save_every_tokens`, `save_every_seconds`) to supervised training and `CheckpointManager`.<br>- Recipe entrypoints now tag Tinker runs with the recipe name and cookbook revision, making recipe-launched jobs easier to trace.<br>- Migrated all tutorial series and the cookbook recipes off the models retired on June 12, 2026, alongside fixes for SDK API drift and a GRPO grouping fix in the abstractions tutorials. |
| **SDK 0.22.3** | May 31, 2026 | - Added `RetryConfig.enable_stuck_detection` (default `true`) to control whether the client raises `APIConnectionError` when requests stop making progress.<br>- Fixed `tinker checkpoint delete -y tinker://...` failing to parse explicit checkpoint paths. |
| **SDK 0.22.2** | May 28, 2026 | - Fixed checkpoint archive downloads that could hang after the signed-URL redirect on the new HTTP transport. |
| **SDK 0.22.1** | May 27, 2026 | - `TensorData` now copies non-writable NumPy inputs at construction, eliminating PyTorch's "given NumPy array is not writable" warning from `to_torch()`.<br>- `tinker checkpoint download` and `push-hf` now retry transient connection failures.<br>- `forward_backward` uploads can be zstd-compressed (rolled out server-side; payloads shrink roughly 3x or more). |
| **SDK 0.22.0** | May 22, 2026 | - Added `RestClient.assign_session_project()` and `assign_session_project_async()` to move an existing session — with all of its training runs and samplers — into a project. Note that a session cannot be moved out of a project once placed.<br>- The SDK's HTTP client now uses the pyqwest transport (a Rust reqwest/hyper-based backend for httpx) by default. |
| **SDK 0.21.0** | May 19, 2026 | - Sampling requests keep a stable request ID across submission retries (sampling is idempotent on the backend), making retries more reliable.<br>- Updated the pinned `moonshotai/Kimi-K2.6` tokenizer revision to keep client-side tokenization consistent with the serving backend. |
| **Cookbook 0.4.1** | May 12, 2026 | - Fixed Kimi K2.6 tokenizer loading by pinning to the fast-tokenizer revision.<br>- Fixed `get_lora_param_count()` for models with per-component LoRA parameter tables. |
| **Cookbook 0.4.0** | May 8, 2026 | - Added renderer and model-info support for Kimi K2.6, Qwen3.6 variants, and Nemotron-3 Super low-thinking mode.<br>- Added `tinker_cookbook.scripts.copy_checkpoint` for copying trainable Tinker checkpoints into another authenticated account.<br>- Unified checkpoint handling across training loops and added fire-and-forget periodic checkpoint saves for supervised training.<br>- Improved supervised training throughput with additional runahead, and normalized SFT example weights for more consistent gradient magnitudes.<br>- `Renderer.parse_response()` now returns `ParseTermination` instead of a boolean, distinguishing clean EOS from malformed parses and fixing base-model single-turn evals that were incorrectly scored as failed parses.<br>- Improved the TextArena tic-tac-toe self-play recipe and added a playable CLI.
