Releases: pasteurlabs/tesseract-core
v1.9.0
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 servenow supports a--skip-health-checkflag (also available asskip_health_checkinTesseract.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/healthmanually. (#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) clickis now an explicit dependency, fixing potential import errors with newer versions oftyper. (#610)
What's Changed
Features
- Add
env:section totesseract_config.yamlto allow setting environment variables in built Tesseracts (#591) - Add
timeoutparameter to Python API functions (#597) - Add
tesseract serve --skip-health-checkargument (#596) - Add
Tesseract.container_infoto 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
clickto base install dependencies (#610)
Documentation
Testing
- Rewrite stale-keepalive retry test without real socket dependence (#611)
Full diff: v1.8.2...v1.9.0
v1.8.2
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
Release v1.8.1
This is a bug fix release addressing two issues related to file path handling.
OutputPathwithchdir: Fixed a bug where usingchdirin combination withOutputPathwould fail (#578). If you were working around this, you can now use them together as expected.OutputFileReferencevalidation: Fixed broken validation forOutputFileReference(#581). Validation now works correctly again, although the type is still deprecated.
What's Changed
Bug Fixes
Documentation
- Move unclickable GH links to example subpages (#570)
Full diff: v1.8.0...v1.8.1
v1.8.0
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, OutputPathNo 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
Bug Fixes
- Support Python 3.14 (#388)
Documentation
- Add matlab example (#560)
Full diff: v1.7.0...v1.8.0
v1.7.0
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-netSee 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
infoordebug: no change in behavior. - At
warning: logs are re-emitted at warning severity only on error. - At
errororcritical: 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.infoinstead of printing directly to stderr (#536)
Documentation
- Add performance guide (#508)
- Document how to use
tesseract serve --networkparameter (#530) - Update rocket fin example to recent versions of Tesseract (#541)
Full diff: v1.6.0...v1.7.0
v1.6.0
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 oftesseract, for example to avoid collision with other command line tools calledtesseract(#491). json+binrefencoding now works in the Python SDK, not just at the runtime level (#491).- Pass flags to
docker runvia--docker-run-argsfor custom container configuration (#491). metadatafield intesseract_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 todocker runandtesseract runtime,json+binrefsupport in SDK, better support fortesseract 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
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
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 executionLive 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 handlerThings 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):
multiprocessingnow works as expected withintesseract_api.py; local modules andtesseract_api.pyare correctly importable in subprocesses. /tmppermissions (#506): If your Tesseract writes to/tmpat build time (e.g., caching libraries), it will no longer fail at runtime; after runtime checks execute, we relax the permissions to/tmpand 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 ofTesseract.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
/tmpinside Tesseracts after build-time check (#506)
Refactor
- Simplify runtime dependency handling (#495)
- Make
stream_logsa 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
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
testcommand totesseract runandtesseract-runtimeto 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
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_formatto 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