Skip to content

Releases: pasteurlabs/tesseract-core

v1.9.0

27 May 18:42
54d5c74

Choose a tag to compare

Release v1.9.0

Highlights

Environment variables in tesseract_config.yaml

You can now set environment variables directly in tesseract_config.yaml via a new env: section, without resorting to custom_build_steps:

env:
XLA_PYTHON_CLIENT_PREALLOCATE: "false"
OMP_NUM_THREADS: "4"

These values are baked into the Docker image at build time. You can still override them at runtime with tesseract serve --env or tesseract run --env. (#591)

Timeout parameter for the Python API

Tesseract.from_image() and Tesseract.from_url() now accept an optional timeout parameter to guard against hanging HTTP requests (e.g. when a container runs out of memory):

with Tesseract.from_image("my_tesseract", timeout=30) as t:
...

# or use a (connect, read) tuple for finer control
t = Tesseract.from_url("http://host:8000", timeout=(5, 300))

The default remains no timeout, so existing code is unaffected. (#597)

Tesseract.container_info()

A new container_info() method on the Tesseract class exposes the underlying Docker container object during a serve session. This is useful for resource monitoring, executing commands inside the container, or retrieving container logs outside of the SDK:

with Tesseract.from_image("my_tesseract") as t:
container = t.container_info()
print(container.id, container.name, container.host_port)

(#601)

Other changes

  • tesseract serve now supports a --skip-health-check flag (also available as skip_health_check in Tesseract.from_image()). Use this for Tesseracts with slow startup, e.g. due to JIT compilation or large model loading. The caller is responsible for polling /health manually. (#596)
  • Foreign array-like objects such as PyTorch tensors can now be passed directly to the Python API without manual conversion. (#587)
  • Docker builds no longer fail when the base image sets a non-root default user. (#598)
  • IO schemas now include explicit field declaration order in their metadata (field_order), allowing downstream clients to restore the correct order even after round-tripping through systems that scramble JSON keys. (#595)
  • click is now an explicit dependency, fixing potential import errors with newer versions of typer. (#610)

What's Changed

Features

  • Add env: section to tesseract_config.yaml to allow setting environment variables in built Tesseracts (#591)
  • Add timeout parameter to Python API functions (#597)
  • Add tesseract serve --skip-health-check argument (#596)
  • Add Tesseract.container_info to expose information about running containers in Python API (#601)
  • Explicitly export IO schema field order (#595)

Bug Fixes

  • Better support for foreign arrays (like torch tensors) in Python API (#587)
  • Always become root at the start of docker builds (#598)
  • Add click to base install dependencies (#610)

Documentation

  • Add new landing page for Tesseract ecosystem (#562)
  • Add Tesseract Blog (#549)

Testing

  • Rewrite stale-keepalive retry test without real socket dependence (#611)

Full diff: v1.8.2...v1.9.0

v1.8.2

06 May 16:17
ebf410c

Choose a tag to compare

Release v1.8.2

This is a patch release that fixes schema parsing of some downstream projects involving InputPath and OutputPath objects.

What's Changed

Bug Fixes

  • Mark InputPath/OutputPath fields with format: "path" in JSON schema (#583)

Full diff: v1.8.1...v1.8.2

v1.8.1

05 May 12:05
95c3ca8

Choose a tag to compare

Release v1.8.1

This is a bug fix release addressing two issues related to file path handling.

  • OutputPath with chdir: Fixed a bug where using chdir in combination with OutputPath would fail (#578). If you were working around this, you can now use them together as expected.
  • OutputFileReference validation: Fixed broken validation for OutputFileReference (#581). Validation now works correctly again, although the type is still deprecated.

What's Changed

Bug Fixes

  • Bug when using chdir with OutputPath (#578)
  • OutputFileReference validation was broken (#581)

Documentation

  • Move unclickable GH links to example subpages (#570)

Full diff: v1.8.0...v1.8.1

v1.8.0

22 Apr 15:08
6f2595b

Choose a tag to compare

Release v1.8.0

Highlights

Native Windows support

Tesseract Core now runs natively on Windows, including Docker interaction for building and running Tesseracts. WSL is no longer required, but can still be useful as a convenience if you prefer a Linux-like workflow.

File and directory I/O with InputPath / OutputPath

Tesseract Core now supports directories (not just files) in apply schemas via new InputPath and OutputPath types. These replace the old InputFileReference / OutputFileReference, which only supported files.

Quick start:

from tesseract_core.runtime.experimental import InputPath, OutputPath

class InputSchema(BaseModel):
data: InputPath  # accepts files or directories

class OutputSchema(BaseModel):
result: OutputPath

def apply(inputs: InputSchema) -> OutputSchema:
# inputs.data is a resolved Path — use it directly
...

Paths are automatically resolved relative to the configured input/output directories, with built-in validation against path traversal.

Migration: InputFileReference and OutputFileReference still work but now emit a DeprecationWarning. To migrate, replace:

# Before
from tesseract_core.runtime.experimental import InputFileReference, OutputFileReference

# After
from tesseract_core.runtime.experimental import InputPath, OutputPath

No other code changes are needed — the new types are drop-in replacements that additionally support directories.

Other changes

  • Python 3.14 support — Tesseract Core is now tested against Python 3.14.
  • New MATLAB example — See the MATLAB guide or the example source for wrapping MATLAB code in a Tesseract.

What's Changed

Features

  • Allow *PathReferences in apply schemas (#555)
  • Add native windows support (#559)

Bug Fixes

  • Support Python 3.14 (#388)

Documentation

  • Add matlab example (#560)

Full diff: v1.7.0...v1.8.0

v1.7.0

17 Apr 11:46
c2d4ea6

Choose a tag to compare

Release v1.7.0

Highlights

Automatic Docker network creation — You no longer need to manually run docker network create before using --network. If the network doesn't exist, Tesseract creates it for you:

# Before: required two steps
docker network create my-net
tesseract serve my_tesseract --network my-net

# Now: just this
tesseract serve my_tesseract --network my-net

See the updated networking docs for more on multi-Tesseract communication patterns.

Container resource leak fixed — If you use TesseractReference with type="image" in a loop (e.g., during optimization), previous versions leaked containers because atexit prevented garbage collection. This is now fixed — containers are properly cleaned up when references go out of scope. If you had manual workarounds for this, you can remove them.

Things to look out for

Live logging now respects log level. Container logs are now routed through logger.info instead of being printed directly to stderr. This means:

  • At log level info or debug: no change in behavior.
  • At warning: logs are re-emitted at warning severity only on error.
  • At error or critical: logs are suppressed entirely.

If you run with a non-default log level and relied on always seeing live container output, adjust your log level accordingly.

Subprocess logging is more reliable. If you use non-Python runtimes (Julia, Fortran, etc.), logging no longer deadlocks when subprocesses write heavily to stdout. No action needed — this just works now.

Other fixes

  • Tracebacks are no longer hard-wrapped, fixing truncated output in CI/cloud environments (#539)
  • False-positive "image not found" errors on Docker Desktop in resource-saving mode are resolved (#535)
  • HTTP keep-alive timeouts are now retried automatically (#543)

What's Changed

Features

  • Automatically create network specified via --network option if it does not exist (#544)

Bug Fixes

  • Don't hard wrap tracebacks (#539)
  • False-positive 'image not found' errors when docker is in resource saving mode (#535)
  • Resource leak when using TesseractReference + more fault tolerance when HTTP sessions time out (#543)
  • Make logging from subprocesses more reliable (#551)

Refactor

  • Thread live logging through logger.info instead of printing directly to stderr (#536)

Documentation

  • Add performance guide (#508)
  • Document how to use tesseract serve --network parameter (#530)
  • Update rocket fin example to recent versions of Tesseract (#541)

Full diff: v1.6.0...v1.7.0

v1.6.0

19 Mar 15:12
fe9036a

Choose a tag to compare

Release v1.6.0

Highlights

Experimental auto-differentiation helpers

This release adds a suite of experimental helpers that let you generate AD endpoints automatically — without implementing analytical derivatives. Two new families of functions are available in tesseract_core.runtime.experimental:

Finite differences (when you have no derivative implementation at all):

from tesseract_core.runtime.experimental import (
finite_difference_jacobian,
finite_difference_jvp,
finite_difference_vjp,
)

Gradient fallbacks (when you have one AD endpoint and want others to be derived from it):

from tesseract_core.runtime.experimental import (
jvp_from_jacobian,
vjp_from_jacobian,
jacobian_from_jvp,
jacobian_from_vjp,
)

For more information, see the linked examples and API reference.

Significant performance improvements

Two fixes combine to substantially reduce latency:

  • A fixed 100ms overhead per call has been eliminated (#485).
  • Array encoding/decoding is now much faster (#522) thanks to orjson, pybase64, zero-copy serialization, and HTTP session reuse.

Note: orjson and pybase64 are now core dependencies. If you pin dependencies or install from source, make sure to include them.

Other notable changes

  • CLI alias tesseract-core: You can use this instead of tesseract, for example to avoid collision with other command line tools called tesseract (#491).
  • json+binref encoding now works in the Python SDK, not just at the runtime level (#491).
  • Pass flags to docker run via --docker-run-args for custom container configuration (#491).
  • metadata field in tesseract_config.yaml: Attach arbitrary metadata to your Tesseract image as a Docker label (#523).
  • Custom validation errors no longer break tracebacks when triggered over HTTP (#534).

What's Changed

Features

  • Add experimental finite difference functionality for auto-generated AD endpoints (#469)
  • Issue mega sprint - allow package_data outside root, cli alias tesseract-core, flags to pass arguments to docker run and tesseract runtime, json+binref support in SDK, better support for tesseract serve --network host (#491)
  • Add gradient fallback helpers (tesseract_core.runtime.experimental.vjp_from_jacobian, ...) for deriving AD endpoints from each other (#511)
  • Add optional metadata field in tesseract_config.yaml (#523)

Bug Fixes

  • Remove fixed 100ms runtime overhead for every call (#485)
  • Reduce performance overhead, especially in array encoding/decoding (#522)
  • Rendering of custom validation errors over HTTP (#534)

Documentation

  • Editing and restructuring of docs, README, and landing page (#510)
  • More restructurings and polish (#529)

Full diff: v1.5.1...v1.6.0

v1.5.1

09 Mar 12:03
36ec26b

Choose a tag to compare

Release v1.5.1

This is a hotfix that adds a missing dependency (packaging) to tesseract-core, so pip install tesseract-core now works out of the box again.

There is no new functionality in this release.

What's Changed

Bug Fixes

  • Add missing dep, test default install (no extras) + basic usage on CI (#514)

Full diff: v1.5.0...v1.5.1

v1.5.0

05 Mar 14:35
1fd863a

Choose a tag to compare

Release v1.5.0

Action required: migrate away from Tesseract(url)

The Tesseract(url) constructor is now deprecated and will be removed in a future release. Calling it now raises an explicit deprecation warning. Update your code:

# Before
t = Tesseract("http://localhost:8080")

# After
t = Tesseract.from_url("http://localhost:8080")

Highlights

Profiling and tracing

We've added two new tesseract run flags for debugging without modifying your code:

tesseract run --tracing ...    # structured logs of function inputs/outputs
tesseract run --profiling ...  # cProfile report after execution

Live log streaming

Logs from inside a running Tesseract are now streamed in real time instead of buffered until completion, useful for long-running jobs.

CLI: works automatically with tesseract run.

Python API (from_image and from_tesseract_api only — not available with from_url):

t = Tesseract.from_image("my-image", stream_logs=True)                   # streams to stderr
t = Tesseract.from_image("my-image", stream_logs=lambda msg: save(msg))  # custom handler

Things to look out for

  • Tangent/cotangent validation (#493): JVP/VJP calls now validate that tangent shapes match inputs and cotangents match the output schema. If you were passing mismatched arrays and relying on silent coercion, you'll now get an explicit error.
  • Multiprocessing fixed (#488): multiprocessing now works as expected within tesseract_api.py; local modules and tesseract_api.py are correctly importable in subprocesses.
  • /tmp permissions (#506): If your Tesseract writes to /tmp at build time (e.g., caching libraries), it will no longer fail at runtime; after runtime checks execute, we relax the permissions to /tmp and subfolders so other users can read/write there as well.

See the changelog below for the full list of changes.

What's Changed

Features

  • Deprecate Tesseract(url) constructor in favor of Tesseract.from_url (#486)
  • Add live streaming of logs (#482)
  • Validation of (co)tangents (#493)
  • Add profile and trace mode, plus debugging guide (#484)

Bug Fixes

  • Better multiprocessing support from within tesseract_api.py (#488)
  • Ensure deprecration warning is actually visible (#487)
  • Ensure $HOME is set in Tesseracts and has appropriate permissions (#490)
  • Relax permissions on /tmp inside Tesseracts after build-time check (#506)

Refactor

  • Simplify runtime dependency handling (#495)
  • Make stream_logs a constructor-level parameter in Python SDK (#509)

Documentation

  • Add Fortran heat equation example (#477)
  • Tesseract init doesn't prompt if name not provided (#501)
  • Documentation mega issue sprint (#492)

Full diff: v1.4.0...v1.5.0

v1.4.0

20 Feb 14:27
c584f7e

Choose a tag to compare

Release v1.4.0

This release brings a much-wanted test command to support testing Tesseracts 🙂 There are also improvements on how some validation errors were being displayed, and we changed the way we dynamically set /home for whatever user is running a Tesseract so that it now works in more security-hardened environments as well.

What's Changed

Features

  • Add better validation errors (#471)
  • Add new test command to tesseract run and tesseract-runtime to support regression testing (#411)

Bug Fixes

  • Use libnss_wrapper instead of addmeplease to create a home for any uid:gid specified at runtime (#476)

Full diff: v1.3.0...v1.4.0

v1.3.0

08 Jan 13:47
edddd34

Choose a tag to compare

Release v1.3.0

This release brings some incremental improvements, mostly related to MLflow integration, some performance optimizations, minor bug fixes, and quality of life improvements.

Most notably, the output of Tesseracts invoked via the Python SDK is now base64-encoded under the hood, which leads to greatly improved performance in cases where large arrays are passed as inputs or outputs.

Also, all Tesseracts now ship with the MLflow Python package (mlflow-skinny), so explicitly depending on mlflow or mlflow-skinny is not necessary anymore to use MLflow logging.

What's Changed

Features

  • (sdk) Change default Python SDK output_format to b64 for performance reasons (#422)
  • Add ability to specify mlflow tag for tesseract (#426)
  • Remove unused tesseract-dir option and fixture (#436)
  • Expose docker memory limit to CLI and Python API (#429)
  • Add mlflow as default (#428)

Bug Fixes

  • Add port to serve command in multi-helloworld readme (#421)
  • Reachability check uses mlflow username/password if provided (#416)
  • Use mlflow env variables directly for mlflow auth (#434)
  • Ensure container users always exist (#427)
  • Allow RootModels in apply schema endpoints (#440)

Documentation

  • Point SI definition to pasteurlabs technology (#413)
  • Add mlflow auth information to docs (#417)
  • Update docstring and tesseract input/output handling (#412)

Full diff: v1.2.0...v1.3.0