# Changelog Notable updates to the Tinker SDK, the [Tinker Cookbook](https://github.com/thinking-machines-lab/tinker-cookbook), the [Tinker Console](https://tinker-console.thinkingmachines.ai), and the Tinker documentation. SDK and Cookbook entries are dated by PyPI release, Console entries by launch date, and Docs entries by their merge-to-main date. For model availability and retirements, see [Models & Pricing](https://tinker-docs.thinkingmachines.ai/tinker/models/index.md) and [Model Deprecations](https://tinker-docs.thinkingmachines.ai/tinker/model-deprecations/index.md). | Release | Date | Changes | | ------------------ | ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **SDK 0.27.1** | September 4, 2026 | - **Breaking:** Subprocess-isolated sampling has been removed. `TINKER_SUBPROCESS_SAMPLING=1` no longer has any effect, and passing `subprocess_sampling=` to a [`SamplingClient`](https://tinker-docs.thinkingmachines.ai/tinker/api-reference/samplingclient/index.md) is now an error — `sample()` and `compute_logprobs()` always run in the calling process. If you were relying on it to keep CPU-heavy grading or environment code from stalling network IO, move that work to your own process or thread pool. - Added `get_console_url()` for jumping from code to the Tinker Console: on [`ServiceClient`](https://tinker-docs.thinkingmachines.ai/tinker/api-reference/serviceclient/#get_console_url) it returns the current session's page, and on the responses from `save_state()` and `save_weights_for_sampler()` it returns the saved checkpoint's page. | | **Docs** | September 4, 2026 | - Every page now has **Copy as Markdown** and **View as Markdown** buttons above its title, and the site publishes [llms.txt](https://tinker-docs.thinkingmachines.ai/llms.txt) (an index of every page, grouped like the nav) plus [llms-full.txt](https://tinker-docs.thinkingmachines.ai/llms-full.txt) (the whole documentation in one file). The Markdown of any page is also fetchable directly at `index.md`. | | **Cookbook 0.5.7** | September 3, 2026 | - The GLM-5.3 renderer now trains the turn terminator on **every** assistant turn instead of only the last one: each assistant message owns its terminator (\`\< | | **SDK 0.26.2** | September 1, 2026 | - Added [`ServiceClient.copy_weights()`](https://tinker-docs.thinkingmachines.ai/tinker/api-reference/serviceclient/#copy_weights), which copies weights into the client's own project and returns the tinker path of the copy. Either kind of weights can be copied and the copy keeps that kind; storage is shared with the source, so no bytes are duplicated. The copy lands in a new training run that cannot be trained on, and takes an optional `ttl_seconds` expiry (the source's is not inherited) and a `weights_access_token` for sources readable under a different account. - The audit log now covers administrative activity — projects, teams, and organizations — alongside checkpoints, and [`RestClient.get_audit_log()`](https://tinker-docs.thinkingmachines.ai/tinker/api-reference/restclient/#get_audit_log) takes `event_type="projects"`, `"teams"` or `"organizations"` to filter by resource. - [`AuditLogEntry`](https://tinker-docs.thinkingmachines.ai/tinker/api-reference/types/auditlogentry/index.md) has a new `event_details` field carrying the whole record for an event — the actor, the resource, and the action with its own parameters — for every event type. `model_id`, `tinker_path` and `purpose` are deprecated: they are still set on checkpoint events, but events for the new resources leave them unset. - `loss_fn_config` now accepts string values alongside floats, on `forward()`, `forward_backward()` and their async variants. - [`tinker auth login --api-key`](https://tinker-docs.thinkingmachines.ai/tinker/cli/auth/index.md) now verifies the key with the server before storing it, and records it under its real key id, with the name and note the server has for it. | | **Cookbook 0.5.6** | September 1, 2026 | - Added support for **GLM-5.3**: a `glm5_3` renderer family (tool calling, reasoning, and the model's \`\< | | **SDK 0.26.0** | August 25, 2026 | - Added [`tinker auth`](https://tinker-docs.thinkingmachines.ai/tinker/cli/auth/index.md) to the CLI. `tinker auth login` logs in through the browser (WorkOS device authorization), mints an API key, and stores it as the default credential; `tinker auth login --api-key` stores a key you paste in; `tinker auth logout` removes the default credential, deleting a browser-minted key on the server and removing a manually entered one locally. - [`Datum`](https://tinker-docs.thinkingmachines.ai/tinker/api-reference/types/datum/index.md) can now carry token provenance. `datum.with_provenance(model_input=..., loss_fn_inputs=...)` attaches runs of `PromptProvenanceSpan` / `SampledProvenanceSpan` that tile the input tokens and the loss rows, naming the sampled sequence each run came from. The tiling is validated at the call site, so a miscounted partition fails immediately instead of as a request error. - [`SupportedModel`](https://tinker-docs.thinkingmachines.ai/tinker/api-reference/types/supportedmodel/index.md) reports `trainable` and `sampleable`, so `get_server_capabilities()` tells you which models can host a training run and which have sampling capacity. | | **Cookbook 0.5.5** | August 22, 2026 | - Added support for **Qwen3.8**: a `qwen3_8` renderer family with tool calling, alongside tool-declaration and parsing updates shared with the other Qwen renderers. - Renderer fixes: message text can no longer write Qwen turn markers itself, and a renderer with reasoning disabled now refuses a turn that carries reasoning instead of silently dropping it. | | **Cookbook 0.5.4** | August 11, 2026 | - The `[inkling]` install extra has been removed and its dependencies folded into the base install, so `tml-renderers` now comes with `pip install tinker-cookbook` and Inkling rendering works out of the box. The base install now requires `torch>=2.10` and `tinker>=0.23.0`. - Added support for **Nemotron 3.5 Lightning** (`NVIDIA-Nemotron-3.5-Lightning-30B-A3B-BF16`) across the cookbook's training and sampling recipes, plus new `nemotron3_preserve_thinking` and `nemotron3_ultra_preserve_thinking` renderers that keep historical `` blocks in the context, for multi-turn RL and long-horizon agents. | | **SDK 0.24.1** | August 6, 2026 | - Added a `base_model` argument to `ServiceClient.create_training_client_from_state()` and `create_training_client_from_state_with_optimizer()` (and their async variants), overriding the base model recorded in the checkpoint when you resume training. It must be compatible with the checkpoint's base model — for example, a different-context-length variant of the same model. | | **Docs** | August 3, 2026 | - The [Under the Hood](https://tinker-docs.thinkingmachines.ai/tinker/under-the-hood/index.md) page has a new **Avoid Client-Side Timeouts and Retries** section: wrapping `sample_async` in your own timeouts and retries (common in RL sampling loops like GRPO) turns backend slowness into total failure, because the SDK and backend already retry and latency scales with load. It recommends submitting sampling requests concurrently and letting slow steps resolve on their own. | | **Docs** | July 31, 2026 | - The [Models & Pricing](https://tinker-docs.thinkingmachines.ai/tinker/models/index.md) page now documents its **machine-readable interface**: the `models.json` and `serverless.json` files published alongside the page are the stable contract for reading prices programmatically — with the full field list and a short fetch snippet — so scripts no longer have to scrape the HTML tables. | | **Cookbook 0.5.3** | July 30, 2026 | - Added `tinker_cookbook.capture`, a token-level capture system for training and sampling traffic with near-zero recipe changes: wrap a run in the `capture_to_store(...)` context manager (or point an external agent harness at its local Anthropic/OpenAI-compatible proxy), and every sampled sequence — prompt and sampled tokens, logprobs, and run coordinates — lands in a queryable local SQLite store (with HTTP query and SSE streaming) while the run is still going. - The inspect/Tinker eval bridge now defaults to `max_tokens=2048` (was 128) when a config doesn't set one, matching inspect's own default so generations aren't silently truncated. - Cookbook process pools now use the `spawn` multiprocessing start method, fixing workers that could hang silently because the Tinker client's background event loop doesn't survive `fork()`. Scripts that call `sweep.run()` must now guard it under `if __name__ == "__main__":`. | | **Console** | July 30, 2026 | - The **Playground** now works with all base models and your own fine-tuned checkpoints, not just Inkling, and accepts image and audio input when chatting with Inkling and Inkling-Small. Inkling and Inkling-Small usage in the Playground now draws on your account balance and is billed like other usage (it was free during the initial launch). | | **SDK 0.24.0** | July 29, 2026 | - Added `RestClient.export_session_trace()` (and `export_session_trace_async()`), which builds a Perfetto trace (`.pftrace`) of a session's training and sampling requests and returns a signed download URL you can open at [ui.perfetto.dev](https://ui.perfetto.dev) (the URL expires after about an hour; call again for a fresh one). New `tinker session export-trace ` CLI command that downloads the trace (or prints the URL with `--url-only`). | | **SDK 0.23.4** | July 25, 2026 | - Added `RestClient.get_billing_usage()` (and `get_billing_usage_async()`), which returns your organization's usage for any past time window (at most 14 days per request, so step the window to cover longer ranges) as hourly-bucketed, typed billing events — training, sampler prefill and sample, checkpoint, and storage — each tagged with the model, user, session, and project it belongs to. - New `tinker billing usage ` CLI command that exports that usage, with `--csv` and `--sessions-csv` flags to write the hourly usage rows and the per-session metadata for spreadsheet or pandas use. | | **SDK 0.23.3** | July 22, 2026 | - Fixed the SDK failing to connect (`invalid peer certificate: UnknownIssuer`) through TLS-intercepting proxies and VPNs when `pyqwest` 0.7.0 is installed; the HTTP transport now trusts the operating system's certificate store again. | | **SDK 0.23.2** | July 21, 2026 | - Added `RestClient.whoami()` (and `whoami_async()`), returning a `WhoamiResponse` with the calling principal's user URN and, for user-backed credentials, email. It reads the identity from the auth token the SDK already holds, so it makes no extra API requests. | | **SDK 0.23.1** | July 18, 2026 | - Fixed `RestClient.get_audit_log()` failing when the audit-log response redirects to a signed download URL; the redirect is now followed correctly instead of erroring out. | | **Docs** | July 17, 2026 | - [Models & Pricing](https://tinker-docs.thinkingmachines.ai/tinker/models/index.md) now shows the new pricing that took effect July 17: prefill, sample, and training rates went up on standard context-length models (cached prefill stays 20% of the prefill price); the 128K/256K long-context variants and Inkling keep their existing prices. | | **Docs** | July 16, 2026 | - New [**Data Model & Permissions**](https://tinker-docs.thinkingmachines.ai/tinker/data-model/index.md) guide: how Tinker organizes data across organizations, teams, projects, sessions, training runs, and checkpoints, plus the organization- and project-level roles, the sharing model, and the data-isolation rules that govern who can see what. | | **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`. - `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. - 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. | | **Docs** | July 15, 2026 | - New Cookbook [**Using Inkling**](https://tinker-docs.thinkingmachines.ai/cookbook/inkling/index.md) section covering the Inkling model and how to build its inputs with `tml-renderers` — chat messages, tool calls, controllable thinking effort, and image and audio input — plus a new [`tinker.types.DmelChunk`](https://tinker-docs.thinkingmachines.ai/tinker/api-reference/types/dmelchunk/index.md) reference page for client-encoded audio input. - New [**Anthropic API Compatible Inference**](https://tinker-docs.thinkingmachines.ai/tinker/compatible-apis/anthropic/index.md) page (beta): sample from Inkling, base models, or your own fine-tuned checkpoints through an endpoint compatible with the Anthropic Messages API, so Anthropic SDKs and Claude Code work with only a base-URL and API-key change. | | **Console** | July 14, 2026 | - The billing **Pricing** tab now links out to the [Models & Pricing](https://tinker-docs.thinkingmachines.ai/tinker/models/index.md) 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/index.md) 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. - 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](/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. - 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`. - 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. - 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). - Distillation recipes were rerun and updated to target Qwen3.5 models, with refreshed configs and expected results. - 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. - Improved `tinker_cookbook.scripts.copy_checkpoint` with destination-project support and simpler source-access-token handling for cross-organization copies. - 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. - Added token- and wall-clock-based checkpoint cadence options (`save_every_tokens`, `save_every_seconds`) to supervised training and `CheckpointManager`. - Recipe entrypoints now tag Tinker runs with the recipe name and cookbook revision, making recipe-launched jobs easier to trace. - 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. - 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()`. - `tinker checkpoint download` and `push-hf` now retry transient connection failures. - `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. - 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. - 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. - 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. - Added `tinker_cookbook.scripts.copy_checkpoint` for copying trainable Tinker checkpoints into another authenticated account. - Unified checkpoint handling across training loops and added fire-and-forget periodic checkpoint saves for supervised training. - Improved supervised training throughput with additional runahead, and normalized SFT example weights for more consistent gradient magnitudes. - `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. - Improved the TextArena tic-tac-toe self-play recipe and added a playable CLI. |