Skip to content

v1.13.0

Choose a tag to compare

@PasteurBot PasteurBot released this 16 Sep 13:46
e069c56

Release v1.13.0

Action required

Removed deprecated features (#765)

Four previously-deprecated entry points now fail loudly instead of warning:

  • python-pip requirements provider → use uv-pip.
  • build_config.python_version → nest it under requirements: build_config.requirements.python_version.
  • Direct Tesseract(...) instantiation → now raises TypeError; use Tesseract.from_url(), from_image(), or from_tesseract_api().
  • InputFileReference / OutputFileReference → use InputPath / OutputPath.

Updated tesseract_config.yaml:

build_config:
requirements:
provider: uv-pip
python_version: "3.12"

GPU transport is now a separate knob from CPU array encoding (#737)

The json+cuda_ipc output format and the enable_experimental_cuda_ipc runtime flag have been removed. Previously, json+cuda_ipc meant "use IPC for everything", so a Tesseract returning a mix of GPU- and CPU-backed arrays failed outright. GPU transport is now controlled by its own gpu_transport knob (default "none"), orthogonal to output_format, and each array is routed by where it lives — CPU arrays inline as usual, GPU arrays leave as cuda_ipc handles.

To restore the old behavior, request cuda_ipc explicitly (this also folds in the former enable_experimental_cuda_ipc opt-in):

from tesseract_core import Tesseract

tess = Tesseract.from_image("my-gpu-tesseract", gpu_transport="cuda_ipc")

gpu_transport is a first-class kwarg on Tesseract.from_image, Tesseract.from_tesseract_api, and engine.serve, and can also be set via runtime_config (the kwarg takes precedence). Raw HTTP clients can negotiate it per request through an Accept media-type parameter, e.g. application/json+base64; gpu_transport=cuda_ipc.

Highlights

Configurable startup timeout for slow-starting Tesseracts (#696)

Waiting for a container to answer /health was previously fixed at 30 seconds, so a Tesseract slow to initialize — loading a large model, or spinning up a Julia runtime — could not be served without disabling the health check entirely. serve and from_image now accept a startup_timeout (in seconds, default 30):

tess = Tesseract.from_image("slow-to-load-tesseract", startup_timeout=300)

Containers that never become healthy are now also disposed of automatically, and the resulting error carries the container's exit code and output for diagnosis rather than leaving a stopped container behind on a taken port.

Other changes

  • Both packages can now be run as modules: python -m tesseract_core build ... and python -m tesseract_core.runtime --help (#719).
  • Unsupported Accept formats now return 406 (with the list of accepted formats) instead of 500, and multi-type/wildcard/q-value headers sent by browsers are parsed correctly (#728).
  • The OpenAPI schema now advertises accepted output formats via a top-level x-supported-output-formats list (#732).
  • check-gradients gains a per-input eps and VJP output sampling (#713, #739, #712).
  • Tesseract.close now also closes open HTTP sessions (#761), and empty (zero-length) arrays now pass through encoding (#760).

See the full changelog below for the complete list of fixes and internal changes.

What's Changed

Features

  • Let a Tesseract be given longer to start, and dispose of one that never does (#696)
  • Advertise the accepted output formats in the OpenAPI schema (#732)
  • Let both packages be run as modules (#719)
  • [breaking] Split CPU array encoding from GPU transport by introducing separate gpu_transport knobs (#737)
  • (runtime) Accept a per-input eps in check-gradients (#713)
  • (runtime) Sample VJP outputs in check-gradients (#739)
  • (runtime) Serialize TesseractReference outputs (#725) (#742)
  • (runtime) Accept a per-input eps in the finite-difference helpers (#712)

Bug Fixes

  • (runtime) Stop advertising negative list indices in gradient path patterns (#700)
  • (runtime) Advertise every dict key the path resolver can reach (#707)
  • (runtime) Serialize stdio redirection across overlapping runs (#710)
  • (runtime) Find wheel-installed libcudart for cuda_ipc decode (#716)
  • (sdk) Recognise Podman machine's wording for a taken host port (#733)
  • (runtime) Answer an unsupported Accept format with 406, not 500; accept more valid header formats (#728)
  • (runtime) Clear the sticky CUDA error from a failed IPC handle export (#727)
  • (sdk) Stop leaking a container when a port publish collides (#721)
  • (runtime) Reject input values that do not fit the declared dtype (#730)
  • Build Tesseracts on base images that set UV_SYSTEM_PYTHON (#750)
  • (runtime) Allow empty (zero-length) arrays through encoding (#760)
  • Make sure Tesseract.close also ends open http sessions (#761)

Refactor

  • Give Container a live is_running method, and lift the serving primitives out of engine.py (#693)
  • (runtime) Isolate CUDA access in a standalone cuda library module (#736)
  • (runtime) Introduce a pluggable device-transport interface (#722)
  • [breaking] Remove deprecations scheduled for 1.13.0 (#765)

Documentation

  • Remove Tesseract Hackathon 2026 banner from landing page (#735)
  • Make "View on GitHub" links track the build ref (#752)

Full diff: v1.12.0...v1.13.0