Skip to main content

Public Synth optimizer tooling with a Rust GEPA core.

Project description

synth-optimizers

Prompt-program optimizers for production agents — open-source GEPA on a language-agnostic task contract.

PyPI · Containers · Cookbooks

synth-optimizers runs GEPA — reflective prompt evolution — against any task exposed through the synth-containers HTTP contract. Point it at a container and a TOML config; it proposes prompt changes, rolls them out, scores them, keeps a Pareto frontier, and returns a deployable candidate with replayable evidence.

  • Container boundary — the optimizer only speaks HTTP. It never imports your task code or sees your model credentials.
  • Inspectable runs — every candidate carries its prompt diff, per-seed scores, rollout traces, cache profile, and usage.
  • Rust core, thin Python — the GEPA state machine is Rust (PyO3); configure runs with GepaConfig or TOML.

Install

pip install synth-optimizers
# or
uv add synth-optimizers

Latest daily dev build:

pip install --pre \
  synth-containers==0.2.0.dev202605312141 \
  synth-optimizers==0.2.0.dev202605312141

uv add --prerelease allow \
  synth-containers==0.2.0.dev202605312141 \
  synth-optimizers==0.2.0.dev202605312141

Install uv for local development and editable installs.

Local development

Pair this repo with synth-containers at matching dev versions, then sync and install editable:

cd optimizers
uv sync --group dev
uv pip install -e ../containers
uv pip install -e .
uv run maturin develop --manifest-path rust/crates/synth_optimizers_py/Cargo.toml

Quickstart

A run is defined by TOML (or GepaConfig): which container to talk to, which prompt modules to optimize, and how to score them.

[container]
url = "http://127.0.0.1:8765"
command = ["uv", "run", "python", "banking77_container/synth_service_app.py", "--port", "8765"]

[candidate]
target_modules = ["stage2_system"]

[seed_candidate]
stage2_system = "Classify the query into exactly one Banking77 intent. Return only the label."

[dataset]
train_seeds = [0, 1, 2, 3, 4, 5, 6, 7]
heldout_seeds = [100, 101, 102, 103]
from synth_containers import Container
from synth_optimizers import GepaConfig, GepaRun, OptimizerRun, TasksetSelection

container = Container("my-task")

with container.serve() as handle:
    result = OptimizerRun(
        GepaConfig(
            container=handle.connection(),
            taskset=TasksetSelection(train_ids=["train:0", "train:1"], heldout_ids=["test:100"]),
            program=None,
            objectives=None,
            policy=None,
        )
    ).execute()

print(result.best_candidate)
print(f"cost: ${result.cost_usd:.2f}")

Or load TOML directly: GepaRun.from_toml("gepa.toml").execute().

CLI:

synth-optimizers gepa run --config gepa.toml
synth-optimizers gepa service --db service.sqlite
synth-optimizers events compare --left a.jsonl --right b.jsonl

Runnable task examples: GEPA cookbooks (Banking77, HotpotQA, MiniGrid, TBLite, Crafter).

Authentication and models

Policy models run inside your task container; the reflective proposer runs Codex on the host (or in Docker). Rollout requests never carry proposer keys.

Default OpenAI API key setup:

export OPENAI_API_KEY="sk-..."
export SYNTH_OPTIMIZERS_TERMINAL=1   # optional: live usage in the terminal
[policy]
provider = "openai"
model = "gpt-4.1-nano"
api_key_env = "OPENAI_API_KEY"

[proposer]
backend = "codex_app_server"
runtime_substrate = "local"
provider = "openai"
auth_mode = "api_key"
api_key_env = "OPENAI_API_KEY"
copy_host_auth = false
model = "gpt-5.4-nano"
sandbox_mode = "workspace-write"
approval_policy = "never"
timeout_seconds = 900

OpenRouter proposer (provider = "openrouter", api_key_env = "OPENROUTER_API_KEY") — policy can stay on OpenAI. See skills/gepa/SKILL.md for full TOML.

Features

  • OpenAI API key proposer — run-local Codex home; does not use your host ~/.codex login.
  • OpenRouter proposer — provider-aware Codex config and base URL; OpenRouter works for policy rollouts too.
  • ChatGPT subscription proposerauth_mode = "chatgpt" with required codex_home (OAuth via Codex CLI or opencode-openai-codex-auth); models include gpt-5.4-mini, gpt-5.3-codex, gpt-5.3-codex-spark, gpt-5.5; proposer usage is $0, policy rollouts still bill normally.
  • Live usageSYNTH_OPTIMIZERS_TERMINAL=1 prints running token and cost splits (usage total=… policy=… proposer=…).
  • Docker proposerruntime_substrate = "docker" with [proposer.docker].image; workspaces stage under ~/.cache/synth-gepa-docker-workspaces/, sync back, then cleanup; image: docker/codex-gepa-proposer/Dockerfile.
  • Gemini and other policy providers — supported on the policy side via [policy].provider, base_url, and container env keys; proposer stays Codex.
  • DeepSeek direct — not supported through Codex (/responses mismatch); use an OpenRouter DeepSeek slug instead.
  • Preflight validation — missing keys, missing codex_home/auth.json, or disallowed ChatGPT models fail before rollouts start.

Agent docs: skills/gepa/SKILL.md.

Links

License

Apache-2.0

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

synth_optimizers-0.2.0.dev202605312141.tar.gz (312.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

synth_optimizers-0.2.0.dev202605312141-cp311-abi3-macosx_11_0_arm64.whl (5.5 MB view details)

Uploaded CPython 3.11+macOS 11.0+ ARM64

File details

Details for the file synth_optimizers-0.2.0.dev202605312141.tar.gz.

File metadata

File hashes

Hashes for synth_optimizers-0.2.0.dev202605312141.tar.gz
Algorithm Hash digest
SHA256 779aa9178fedc70e37383947cd06b4732dc7c160bdb2e36513425aebb5ba299b
MD5 cbb23c35d5ef7b2ff99140519956115f
BLAKE2b-256 61f286ede568210fe25cd19ed7083b415898793f588f4c14cc3db0ce79c1109c

See more details on using hashes here.

File details

Details for the file synth_optimizers-0.2.0.dev202605312141-cp311-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for synth_optimizers-0.2.0.dev202605312141-cp311-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 df8926f6eae7c489b65ff5416cc25a967a9b6818afa052efff18c6749d3fcc57
MD5 0b20a32a9b1e5acf8357d48a7d536d50
BLAKE2b-256 bc7156aa22de5f7626eba29272a5e15b6b04ac9fb3d4af51a456f9d48d2d5351

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page