Release v1.10.0
Action required
Regenerate JAX Tesseracts to pick up future recipe updates (optional)
Existing JAX Tesseracts keep working unchanged, so no action is strictly required. However, the gradient-endpoint logic that used to be inlined in each tesseract_api.py now lives in the tesseract_core.runtime.jax_recipes module, and old Tesseracts retain their own inlined copy. To benefit from future improvements and fixes to these endpoints, regenerate your Tesseract from the updated JAX template (tesseract init --recipe jax), or manually adapt tesseract_api.py to import and call jax_apply, jax_jacobian, jax_jvp, and jax_vjp. See the slimmer recipe under Highlights below.
Highlights
Configurable Python version
You can now pin the Python version used inside a Tesseract independently of the base image. UV bootstraps the requested version at build time, so you no longer need to find a base image that happens to ship the right interpreter.
Set it in tesseract_config.yaml:
build_config:
python_version: "3.12"
The default remains null, which keeps using the base image’s system Python — so existing Tesseracts are unaffected. Note: python_version cannot be combined with conda requirements (set the version in tesseract_environment.yaml instead) or with inherit_base_image_packages (see below).
Inherit packages from the base image
When building on a vendor-provided base image that already ships heavy Python dependencies (e.g. PyTorch, Firedrake, FEniCS), you can now reuse those packages instead of reinstalling them. Setting the new flag creates the virtual environment with --system-site-packages:
build_config:
base_image: "firedrakeproject/firedrake:2026.4.0"
inherit_base_image_packages: true
Defaults to false. It cannot be combined with python_version, since the inherited packages are tied to the base image’s own interpreter. See the new examples/inherit_base_image_packages Tesseract for a complete setup.
Slimmer JAX recipe (+ experimental VJP cache)
The JAX template’s gradient-endpoint boilerplate now lives in the new tesseract_core.runtime.jax_recipes module. A JAX-backed Tesseract is mostly your schemas plus an apply_jit function — apply, jacobian, jvp, and vjp are one-line calls into jax_apply, jax_jacobian, jax_jvp, and jax_vjp, with JIT compilation handled and cached internally. This only affects newly generated tesseract_api.py files — see the note under Action required above.
This also ships an opt-in, experimental VJP residual cache. When enabled, jax_apply stashes the backward function from the forward pass so a following jax_vjp on the same inputs can skip the redundant forward pass (the common pattern under jax.value_and_grad / jax.jacrev). It’s off by default and tuned via:
from tesseract_core.runtime.experimental import set_jax_vjp_cache_size
set_jax_vjp_cache_size(1) # 0 = disabled (default); 1 covers the standard apply -> vjp pattern
The speedup is problem-dependent and scales with the cost of your forward pass — for trivially small models the cache overhead can outweigh the savings, so benchmark before turning it on. The interface is experimental and may change.
Other changes
- Builds for
target_platform: nativenow force the current host architecture and fail loudly if it’s unavailable, rather than silently pulling a mismatched arch (#615).
What’s Changed
Features
- Make Python version configurable (#592)
- Add
inherit_base_image_packagesflag to tesseract_config.yaml (#600) - Reduce boilerplate in JAX recipe, add experimental VJP cache (#577)
Bug Fixes
- Force building for the current arch when platform is set to native (#615)
Full diff: Comparing v1.9.0...v1.10.0 · pasteurlabs/tesseract-core · GitHub