gepa runs GEPA where a number of rollouts are done before a teacher LLM reflects on the results to propose a better Task.system_prompt without any gradient based training. It runs against native v1 tasksets.
GEPA reuses the same taskset / harness / client / sampling config as eval, so the .toml config remains very similar:
uv run gepa @ config.toml --dry-run. To run GEPA, use uv run gepa @ config.toml. CLI arguments overwrite toml arguments when both are present.
Common config values
model/-m— model for the rollouts under optimization (default:deepseek/deepseek-v4-flash, same as eval)reflection_model/reflection_client— model/endpoint that proposes new prompts (default: reusemodel/client)num_train/num_val— train tasks for reflection minibatches and held-out val tasks for the pareto frontier (defaults: 100 / 50)max_total_rollouts— total rollouts the run may spend (default: 500)max_concurrent/-c— caps how many rollouts are in flight at once (default: 128)
Output
Results go underoutputs/<taskset>--<model>--<harness>/<uuid>/, matching eval. The best system prompt is printed when the run finishes.
Limitations
Tasksets — GEPA optimizesTask.system_prompt, so the taskset must provide one. Tasksets that bake instructions into the user prompt instead (e.g. gsm8k-v1) are not supported out of the box.
Harnesses — any eval harness works. With APPENDS_SYSTEM_PROMPT, the optimized prompt is used as a system message but otherwise is folded into the user prompt.