Skip to main content
GEPA (Genetic Evolution of Prompt Architectures) optimizes prompts through evolutionary search with LLM-guided mutations.

1. Install the SDK

pip install synth-ai

2. Setup Credentials

synth-ai setup
This stores your SYNTH_API_KEY and ENVIRONMENT_API_KEY under ~/.synth_ai (and loads them into the current process environment). To run models, add an inference provider key in the web app (for example, OpenAI) at https://usesynth.ai/keys.

3. Run GEPA

Run a minimal Banking77 optimization from a single script:
python - <<'PY'
import os
import tomllib
from synth_ai import SynthClient

client = SynthClient(api_key=os.environ["SYNTH_API_KEY"])

with open("train_cfg.toml", "rb") as fh:
    cfg = tomllib.load(fh)

job = client.optimization.offline.create(
    kind="gepa_offline",
    system_name="banking77-quickstart",
    config_mode="FULL",
    config=cfg,
    auto_start=True,
)

print("job_id=", job.job_id)
print("status=", job.status())
PY
This submits the canonical v1 offline GEPA job.

Minimal Config

[prompt_learning]
algorithm = "gepa"
container_url = "http://127.0.0.1:8114"
container_id = "banking77"

[prompt_learning.initial_prompt]
id = "banking77"
name = "Banking77 Classification"

[[prompt_learning.initial_prompt.messages]]
role = "system"
pattern = "Classify the banking intent. {instructions}"
order = 0

[prompt_learning.gepa]
env_name = "banking77"

[prompt_learning.gepa.rollout]
budget = 100          # Total evaluations
max_concurrent = 20

[prompt_learning.gepa.evaluation]
seeds = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
validation_seeds = [10, 11, 12, 13, 14]

[prompt_learning.gepa.population]
initial_size = 10
num_generations = 5
children_per_generation = 3

Key Parameters

ParameterPurpose
rollout.budgetTotal prompt evaluations (cost control)
population.num_generationsEvolution iterations
evaluation.seedsTraining dataset indices
evaluation.validation_seedsHeld-out validation indices

Get Results

import os
from synth_ai import SynthClient

def run_and_get_results():
    client = SynthClient(api_key=os.environ["SYNTH_API_KEY"])
    # Reattach to an existing offline job
    job = client.optimization.offline.get(
        job_id="offline_job_id_here"
    )

    print(job.status())
    print(job.events(limit=50))
    print(job.artifacts())

Ready to get started?