Release v1.12.0
Action required
python-pip provider renamed to uv-pip, python_version moved under the provider
The build has always run under uv, so the python-pip requirements provider was renamed to uv-pip, and python_version moved from build_config into the provider’s requirements block (#680):
build_config:
requirements:
provider: uv-pip # was: python-pip
python_version: "3.12" # was: build_config.python_version
The old python-pip name and top-level build_config.python_version still work but now emit deprecation warnings and will be removed in 1.13.0. Update your tesseract_config.yaml files now.
Highlights
Build against private package indices, git repos, and conda channels
You can now build Tesseracts that depend on private sources without leaking credentials into the image or build cache (#680). Declare which host needs authentication in tesseract_config.yaml, then pass the token out-of-band at build time via a BuildKit secret:
build_config:
host_credentials:
- host: pkgs.dev.azure.com
secret: azure_token # name of the build secret carrying the token
username: __token__ # optional, this is the default
tesseract build . --secret id=azure_token,env=AZURE_TOKEN
# or: --secret id=azure_token,src=./token.txt
A single host_credentials entry authenticates everything fetched from that host — --extra-index-url indices, PEP 508 direct-reference wheels, git+https dependencies, and conda channels alike. Tokens are assembled into netrc/git-credential entries on a tmpfs inside the build stage and never land in the config, an image layer, or the build cache. The same PR also adds build_config.build_env for non-secret, build-stage-only environment variables (e.g. UV_INDEX_STRATEGY) that are not carried into the final image.
Faster same-machine array transfer
Two new opt-in output formats cut per-call overhead when the client and a served Tesseract run on the same machine — the common case for solver-in-the-loop and differentiable-physics workloads where json+base64 copies dominate the call.
Shared memory (Linux, #664). With json+binref on a /dev/shm tmpfs, only lightweight file references travel over HTTP while array data stays in shared memory. An experimental warm-buffer pool pushes latency further. In benchmarks, a 76 MB float64 round-trip dropped from ~1,130 ms (base64) to ~206 ms (shmem binref) to ~87 ms (with the pool):
import tempfile
from pathlib import Path
from tesseract_core import Tesseract
shm = Path("/dev/shm")
with Tesseract.from_image(
"my-tesseract",
input_path=Path(tempfile.mkdtemp(dir=shm)),
output_path=Path(tempfile.mkdtemp(dir=shm)),
output_format="json+binref",
experimental_binref_pool=True, # opt in to the warm-buffer fast path
) as t:
result = t.apply({"x": x})
GPU-direct via CUDA IPC (experimental, #588). For arrays exchanged between co-located GPU processes, the new json+cuda_ipc format passes GPU arrays by reference: only a 64-byte cudaIpcMemHandle_t travels over HTTP while the data never leaves the device. It works with any producer implementing __cuda_array_interface__ (CuPy, PyTorch, JAX, Numba, …) and is gated behind an experimental flag:
with Tesseract.from_image(
"my-gpu-tesseract",
gpus=["all"],
output_format="json+cuda_ipc",
runtime_config={"enable_experimental_cuda_ipc": True},
) as t:
result = t.apply({"a": a, "b": b, "s": 3.0})
out = result["result"] # exposes __cuda_array_interface__ and __dlpack__
out_host = np.asarray(out) # copy to host works as expected
Debug tesseract run, not just serve
The --debug flag now works on one-shot tesseract run ... commands, not only serve (#631). The runtime waits for a debugger to attach before executing, so even import-time code in tesseract_api.py becomes observable. The debugpy host/port are now configurable via RuntimeConfig, environment variables, or CLI flags for non-containerised Tesseracts (#663).
Other changes
- A JSON schema for
tesseract_config.yamlis now generated and hosted alongside the docs, ready for SchemaStore registration so editors can validate config files with real-time feedback (#683). - The docs were reorganised around Diátaxis and
.htmlsuffixes stripped from page URLs; redirects keep existing links working (#655). New Bayesian inference (NumPyro) and multiphysics demos were added (#628, #627). - Cross-arch builds with a pinned
python_version(e.g.linux/amd64on arm64) no longer fail during venv setup, and the uv image is pinned to a released version for reproducibility (#686). --config-overridevalues are now passed through as strings, so e.g.python_version=3.13is no longer mangled into a float (#679).- Auto-created output temp directories are now cleaned up on garbage collection instead of accumulating under
/tmp(#685). check-gradientsno longer aborts on Tesseracts with absent optional container inputs (#689), and two correctness bugs in the experimental VJP cache were fixed (#667).
What’s Changed
Features
- Add debug mode to one-shot commands (#631)
- Make the debugpy address configurable (#663)
- (sdk) Add deprecation tombstone registry (#681)
- Add
json+cuda_ipcarray encoding for GPU-direct tensor transfer (#588) - Add shared memory tooling, docs, and example for fast same-machine IPC on Linux (#664)
- Add yaml schema for tesseract_config.yaml, ready for integration with SchemaStore (#683)
- Secret handling for private dependencies + more configurability of the build process (#680)
Bug Fixes
- Get rid of hardcoded ports in run_tesseract’s debug logic (#657)
- Run the console scripts under test, not whichever are on PATH (#662)
- (runtime) Compare VJP cache keys, and don’t trace non-JAX inputs (#667)
- (sdk) Pin uv image to target platform for cross-arch builds (#686)
- (runtime) Skip absent optional containers when expanding paths (#689)
- Config parsing with string fallbacks (#679)
- (sdk) Purge auto-created output tempdirs on garbage collection (#685)
Documentation
- Refactor according to Diátaxis, eliminate .html suffixes (#655)
- Add Bayesian inference via NumPyro demo (#628)
- Add hackathon banner (#653)
- Set runtime license (#659)
- Fix dead links and broken images throughout docs (#661)
- Blog post on cookiecutter-tesseract announcement (#665)
- Add multiphysics demo (#627)
Performance
- (runtime) Sweep the VJP once per path pair in check-gradients (#688)
Testing
- (runtime) Cover the gradient fallbacks with more than one key (#701)
Full diff: Comparing v1.11.0...v1.12.0 · pasteurlabs/tesseract-core · GitHub