synth-containers
The task contract for Synth optimizers and evals — wrap any task as a small HTTP service that optimizers can target without touching your code.
PyPI · Optimizers · Cookbooks
A Synth container is a small HTTP service around a task. It owns the dataset, the
scoring/verifier logic, the mutable prompt or policy fields, and the policy-model
credential boundary. An optimizer like
synth-optimizers GEPA sees one URL
and a typed rollout contract — it never imports your task package or reads private
evaluator state. The same contract works whether the task is a classifier, a coding
agent, or a live game environment, and in Python, Rust, or TypeScript.
Install
pip install synth-containers
# or
uv add synth-containers
Tested pair: synth-optimizers==0.2.22 pins and is tested against
synth-containers==0.4.3; both are published on PyPI.
Development
git clone https://github.com/synth-laboratories/containers.git
cd containers
uv sync --group dev
uv run --group dev pytest tests
The contract
| Route | Method | Purpose |
|---|---|---|
/metadata |
GET | contract version + capabilities |
/program |
GET | mutable prompt fields + seed candidate |
/dataset |
GET | split names + row counts |
/dataset/rows |
POST | rows for a requested seed list |
/rollout |
POST | run a candidate on a row → reward + usage |
/health |
GET | liveness |
The Python SDK also provides Container, Container.serve(),
ContainerHandle, ContainerConnection, and ContainerRunner (url, command,
in-process app, or local image_id). CLI: synth-containers serve and
synth-containers up.
Runnable local example (no provider credentials)
After pip install synth-containers, save this as smoke.py and run
python smoke.py. It starts a loopback-only server, scores a deterministic
exact-match task, prints reward: 1.0, and shuts the server down. This is an
SDK/HTTP smoke test, not a model-quality evaluation.
from datetime import datetime, timezone
import httpx
from synth_containers import Container
container = Container("local-exact-match", default_submission_mode="sync")
@container.rollout
def rollout(payload):
now = datetime.now(timezone.utc).isoformat()
reward = float(payload["answer"] == payload["expected"])
return {
"rollout_id": payload["rollout_id"],
"status": "completed", "success_status": "success",
"created_at": now, "updated_at": now,
"summary": {"reward": reward},
}
with container.serve() as running:
with httpx.Client(timeout=10, trust_env=False) as client:
response = client.post(running.url + "/rollouts", json={
"rollout_id": "smoke-1", "answer": "hello", "expected": "hello",
})
response.raise_for_status()
result = response.json()
assert result["status"] == "completed"
assert result["summary"]["reward"] == 1.0
print("reward:", result["summary"]["reward"])
See the cookbooks for complete containers: Banking77, HotpotQA, MiniGrid, TBLite, and Crafter.
Links
- Optimizers — GEPA on this contract
- Cookbooks — runnable containers
- Agent skill — drop into a coding agent to build and debug containers
- Contract OpenAPI
- Immutable live policy revisions — install multiple harness variants and pin each rollout explicitly
License
MIT
Metadata
Release files for synth-containers 0.4.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| synth_containers-0.4.4.tar.gz | 1.1 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| synth_containers-0.4.4-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 2.0 MB
Release files / synth_containers-0.4.4.tar.gz
| Download URL | synth_containers-0.4.4.tar.gz |
|---|---|
| Size | 1.1 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
61892d8ad17225795ae0929cdac232ef226ab64b2febf274f421b3accb98b629
|
|
BLAKE2b-256 checksum How to use checksums |
10f0a9112cb5f84b7f1ddd3e285834e274c185a5e9f80a5a179012b44fb19d9a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.33 {"installer":{"name":"uv","version":"0.11.33","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / synth_containers-0.4.4-py3-none-any.whl
| Download URL | synth_containers-0.4.4-py3-none-any.whl |
|---|---|
| Size | 951.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
fb226fa105f057078217d9058bdee622ee08e6792c199c9cba47364d7742c909
|
|
BLAKE2b-256 checksum How to use checksums |
81619bb2a85f75d4970da57cd58ac9d601cde2dfe2dc430ba4317c7c779ae252
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.33 {"installer":{"name":"uv","version":"0.11.33","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|