# What changed in gepa

> 46 changes in gepa 0.1 from its official release notes, upgrade guides and advisories: 5 breaking, 25 new APIs and options. Each one cited. Sources checked 2026-10-26. HTML: https://unstale.sh/pypi/gepa/

To see which of these apply to a repository, run `npx @unstale/cli init` in it.

## gepa 0.1

### Breaking changes

- The experimental parameter is removed; use sampling_strategy such as SameParentSampling or PxNSampling instead. (0.1.4) — [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.4)
- Using it with a reflection_strategy that does not expose total_cost now raises instead of silently never stopping. (0.1.4) — [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.4)
- Combining it with adapter.propose_new_texts or custom_candidate_proposer now raises ValueError instead of silently ignoring the conflicting configuration. (0.1.4) — [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.4)
- The litellm floor is raised to at least 1.83 when installing gepa[full] to address Dependabot alerts. (0.1.2) — [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.2)
- Now defaults to True, retaining best outputs on the result object; pass False to restore the old behavior and reduce memory use for large validation sets. (0.1.2) — [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.3), [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.2)

### New APIs and options

- Adds an optional adapter seam for batching multi-proposal evaluations; adapters implementing only evaluate() continue to use sequential fallback. (0.1.4) — [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.4)
- Lets optimize_anything evaluate all pending candidate-example pairs in one external call, with caching, warm-start injection, exception policy, and standard output packaging. (0.1.4) — [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.4)
- Accepts a custom ReflectionLM implementation in optimize or ReflectionConfig to control the reflection step. (0.1.4) — [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.4)
- A protocol for custom reflection implementations, allowing developers to control reflective mutation calls and implement stateful reflectors. (0.1.4) — [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.4)
- Adds a diagnostics metadata channel for multi-call reflectors that flows through callbacks, trackers, and proposal metadata. (0.1.4) — [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.4)
- Acceptance criteria may implement this hook to provide custom rejection messages. (0.1.4) — [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.4)
- Chooses the parent and minibatch tasks for multi-proposal iterations; available strategies include SingleMutationSampling, SameParentSampling, IndependentSampling, and PxNSampling. (0.1.4) — [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.4)
- Chooses which proposal improvements enter the pool, with built-in strategies for all, best, or top-k improvements. (0.1.4) — [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.4)
- Adds a tracker metric for the score after subsampling. (0.1.4) — [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.4)
- Adds a tracker metric for the score before subsampling. (0.1.4) — [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.4)
- Adds a pluggable acceptance criterion, with strict_improvement and improvement_or_equal choices or a custom AcceptanceCriterion. (0.1.3) — [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.3)
- Optimize LangChain/LangGraph applications directly with gepa.optimize; install the langchain extra. (0.1.3) — [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.3)
- Adds strict_improvement and improvement_or_equal as selectable acceptance criteria. (0.1.2) — [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.2)
- Allows passing a custom acceptance criterion for reflective mutation. (0.1.2) — [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.2)
- Adds logprob-aware scoring and reflection for classification tasks. (0.1.2) — [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.3), [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.2)
- Experimental option for generating and evaluating multiple candidate proposals per optimize_anything iteration; the interface is expected to change. (0.1.2) — [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.3), [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.2)
- Adds adapter_state so adapters can persist state across checkpoint and resume. (0.1.2) — [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.3), [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.2)
- Exposes trainset_loader for datasets that change during optimization. (0.1.2) — [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.3), [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.2)
- Optimize LangChain/LangGraph applications directly with gepa.optimize; install the gepa[langchain] extra. (0.1.2) — [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.2)
- Adds a budget knob for controlling reflection cost. (0.1.2) — [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.3), [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.2)
- Logs into an already-active MLflow run without GEPA managing its lifecycle. (0.1.2) — [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.3), [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.2)
- The callback exposes reflection LM prompts and outputs. (0.1.2) — [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.2)
- The unified LM layer adds first-class handling of reasoning models as reflection LMs. (0.1.2) — [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.3), [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.2)
- Passes provider-specific parameters to the reflection model. (0.1.2) — [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.3), [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.2)
- Logs into an already-active WandB run without GEPA managing its lifecycle. (0.1.2) — [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.3), [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.2)

### Behavior and default changes

- Stop conditions are checked between iterations, so multi-proposal strategies can exceed max_metric_calls by up to one iteration's evaluations. (0.1.4) — [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.4)
- Becomes optional when batch_evaluator is provided; evaluations, including refiner steps, route through the batch function. (0.1.4) — [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.4)
- Entries now include per-task ids and before/after scores, task count, accepted program indices, and stable proposal ids while preserving legacy keys. (0.1.4) — [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.4)
- Fires per evaluation stage with self-consistent deltas; aggregate metric_calls_delta rather than counting events. (0.1.4) — [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.4)
- Merge proposals now fire GEPACallback events. (0.1.4) — [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.4)
- Selection strategies now receive all evaluated proposals and the acceptance criterion; custom strategies may surface proposals rejected by that criterion. (0.1.4) — [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.4)
- Run directories written by v0.1.1 are migrated automatically on load; state written by v0.1.2 is not designed to load in v0.1.1. (0.1.3) — [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.3)
- Reflection prompts and outputs are logged to a proposals table for run archaeology. (0.1.2) — [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.3), [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.2)
- Run directories written by v0.1.1 are migrated automatically on load; v0.1.2 state is not designed to load in v0.1.1. (0.1.2) — [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.2)

### Fixes and other changes

- Criteria are evaluated exactly once per proposal, with results memoized so stateful or stochastic criteria behave correctly. (0.1.4) — [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.4)
- Identical child candidates within an iteration are deduplicated before valset evaluation. (0.1.4) — [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.4)
- Now fires for every unselected proposal with a reason identifying acceptance failure, selection drop, or duplication. (0.1.4) — [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.4)
- No longer hides batch_complete from wrapped callables that provide it, preventing batched reflection from being silently downgraded. (0.1.4) — [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.4)
- Fixes a crash when outputs=None and a reflection_lm type mismatch. (0.1.2) — [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.3), [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.2)
- The callback protocol now works in optimize_anything runs, as well as gepa.optimize runs. (0.1.2) — [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.3), [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.2)
- Refiner evaluator calls are now counted toward the metric-call budget. (0.1.2) — [release notes](https://github.com/gepa-ai/gepa/releases/tag/v0.1.2)
