Skip to main content

synth-optimizers

A shared optimizer platform for AI applications — starting with open-source GEPA on a language-agnostic task contract.

PyPI · Task contract · Cookbooks · Hosted jobs

synth-optimizers provides a shared Rust optimizer core for running search algorithms against any task exposed through the public optimizer HTTP task contract.

  • Shared platform core — reusable Rust machinery for container I/O, workspaces, cache profiles, budgets, telemetry, failure handling, and replayable evidence.
  • Algorithm layerGEPA is the first public optimizer; future algorithms can plug into the same platform contract.
  • GEPA runs today — configure GEPA with TOML or GepaConfig; it proposes prompt changes, rolls them out, scores them, keeps a Pareto frontier, and emits inspectable run evidence.

Supported algorithms

Algorithm Status In this repo Paper & docs
GEPA — reflective prompt evolution Supported rust/crates/synth_gepa/ (Rust engine + service), src/synth_optimizers/gepa.py (Python API), skills/gepa/SKILL.md (agent runbook) Paper · gepa-ai docs · bundled HTML via gepa console
GELO — Go-Explore in prompt space (hosted) Hosted submit src/synth_optimizers/gelo.py, skills/gelo/SKILL.md, GELO_HOSTED_SDK_CLI_SPEC.md Bundled HTML via gelo consolesrc/synth_optimizers/docs/gelo/
SFT — supervised fine-tuning (hosted) Hosted submit HostedOptimizerClient.submit_sft() / submit_sft() Executed by the private Optimizers-beta runtime; the public client uses the shared hosted run API.

The shared synth_optimizer_platform crate is the substrate for optimizer implementations; GEPA is the first public local algorithm; GELO and SFT are hosted-only in the public package and run on Synth hosted optimizer infrastructure. Hosted GEPA, GELO, and SFT submission is covered in docs/hosted-optimizers.md.

Hosted SFT control plane

SFT is served by synth-optimizers; Optimizers-beta is an internal training executor, not a Workshop-facing API. For local QA, start beta with its executor token and then start the public façade:

# In the Optimizers-beta checkout:
OPTIMIZERS_BETA_SERVICE_TOKEN=local-dev-token \
  cargo run --bin optimizers-beta -- serve --bind 127.0.0.1:8879

# In this checkout:
export SYNTH_OPTIMIZERS_BETA_URL=http://127.0.0.1:8879
export OPTIMIZERS_BETA_SERVICE_TOKEN=local-dev-token  # held only by the façade
export SYNTH_OPTIMIZERS_SFT_SERVICE_TOKEN=local-qa-token  # Workshop / CLI callers
synth-optimizers sft service --db .sft/service.sqlite --bind 127.0.0.1:8878

Submit, inspect, and cancel only through the façade:

synth-optimizers sft validate --config sft.toml
synth-optimizers sft submit --config sft.toml --follow
synth-optimizers sft watch RUN_ID --events
synth-optimizers sft cancel RUN_ID

The façade keeps executor-only workspace paths and service credentials private. Its artifact proxy is available at /v1/runs/RUN_ID/artifacts/{manifest,events}.

Future hosted-algorithm compatibility

MAPO, OHCO, Online Reflexion, and MARL prompt-optimization identifiers are retained in future_algorithms.py so clients can parse hosted catalogs and historical runs. They are not supported public optimizer algorithms: they carry no local executor, cookbook, or release commitment. New public algorithms graduate into the table above only after their public API contract, replay semantics, and end-to-end evidence are ready.

Install

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

Install uv for local development and editable installs.

Local development

Sync the repo and install the local Python/Rust extension in editable mode:

cd optimizers
uv sync --group dev
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, GepaTaskPools, 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"]),
            task_pools=GepaTaskPools(
                pareto=["train:0"],
                minibatch=["train:0"],
                reflection=["train:0", "train:1"],
                heldout=["test:100"],
            ),
            program=None,
            objectives=None,
            policy=None,
        )
    ).execute()

print(result.best_candidate)
print("cost: unknown" if result.cost_usd is None else 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.4, gpt-5.3-codex, gpt-5.3-codex-spark, gpt-5.5, gpt-5.6-luna, gpt-5.6-sol, and gpt-5.6-terra; proposer usage is $0, policy rollouts still bill normally.
  • Nano-Codex proposer harness — explicit [proposer.nano_codex] opt-in keeps one ChatGPT-authenticated app-server session warm across compatible GEPA generations, caches static task/program context by content digest, records monotonic JSONL events and typed turn receipts, and can replay receipts with zero live model or tool calls. See dev_examples/nano_codex_gepa/.
  • 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 directprovider = "deepseek" with backend = "deepseek_chat" runs the proposer through DeepSeek Chat Completions; OpenRouter DeepSeek slugs remain supported through provider = "openrouter".
  • 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

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.13.tar.gz (799.2 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.13-cp311-abi3-macosx_11_0_arm64.whl (6.9 MB view details)

Uploaded CPython 3.11+macOS 11.0+ ARM64

File details

Details for the file synth_optimizers-0.2.13.tar.gz.

File metadata

  • Download URL: synth_optimizers-0.2.13.tar.gz
  • Upload date:
  • Size: 799.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for synth_optimizers-0.2.13.tar.gz
Algorithm Hash digest
SHA256 b1e40d07d03bc84295a8fc7f2087a8a4c53e2df4ba20e9fadc22735cbcd5801a
MD5 6f107a6682d8249469fa4bbe07899f50
BLAKE2b-256 9cc41f0ae596baf7cfacee89ee137abb5a6d46f4e8790ea8a7552c618159bb61

See more details on using hashes here.

Provenance

The following attestation bundles were made for synth_optimizers-0.2.13.tar.gz:

Publisher: publish-pypi.yml on synth-laboratories/optimizers

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file synth_optimizers-0.2.13-cp311-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for synth_optimizers-0.2.13-cp311-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 51c020ffbb6e48335514aa273a9e1df5c015194c99cfe9dcf9e41774fe39af20
MD5 af1dd6cef1314cb873fbf27fa919e32d
BLAKE2b-256 ea56a942da1bf57d567bb0a575e08e84aeb08295de23834d2c2fca12185f3b3d

See more details on using hashes here.

Provenance

The following attestation bundles were made for synth_optimizers-0.2.13-cp311-abi3-macosx_11_0_arm64.whl:

Publisher: publish-pypi.yml on synth-laboratories/optimizers

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page