Repository navigation
Highlights
- Mixed evolution modes (#580, thanks @SUPR1M3):
full_rewrite_probabilitymakes a share of diff-based iterations ask for a full rewrite instead. The mode used is recorded on each program and in the evolution trace. Default0.0. - AlphaEvolve interoperability (#519, #520, #522, #526, #527, #529, #532, #534, #535, #540, #541): opt-in adapters run Google's AlphaEvolve examples and evaluators locally, and export limited settings and Python bundles the other way.
- Competitive evolution (#505): alternating competitive evolution with phase checkpoints.
- Codex app-server provider (#512): use a ChatGPT subscription as the LLM backend, with no API key.
- Per-island setup: per-island system messages (#496) and per-island initial programs (#547).
- Runs that generate nothing now fail (#545): if no iteration produces a candidate,
OpenEvolve.runraisesEvolutionFailedErrorand the CLI exits with code 1, rather than presenting the seed as the evolved result. - Rewritten README (#580): shorter, and it now leads with research using OpenEvolve. Detailed guides moved to
docs/.
New options
--evaluator-argsforwards keyword arguments toevaluate()(#506)logger_prefixand--logger-prefixtell parallel runs apart in the logs (#507)checkpoint_on_improvementsaves a checkpoint when a new best is found (#461)evolution_trace.include_failureslogs failed iterations, including timeouts and crashes, to<trace name>_failures.jsonl(#580)metadata["llm_model"]records which model generated each program (#580)
Bug fixes
Evolution and database
- Novelty-rejected programs are dropped from the database (#528)
- Island migrants are chosen before any are moved (#524)
- New island maps are initialized when resuming checkpoints (#530)
- Checkpoint feature statistics are retained during construction (#510)
- Inspiration sampling fills the available slots in small islands and bounds neighbors per feature dimension (#508, #509)
- Early stopping honors patience with a zero convergence threshold and skips failed evaluations in the plateau count (#566, #502)
- Explicit zero iteration budgets are honored (#531)
- Very large finite metrics no longer overflow fallback fitness averages (#583)
LLM and workers
- Model sampling and request seeds vary per iteration in workers, so runs stay reproducible and parallel iterations don't repeat the same response (#559, #582)
- Ensemble weights are validated and safely normalized, zero primary-model weights are preserved, and zero-weight judges are skipped (#570, #533, #567)
- CLI backends: Claude Code gets the prompt over stdin and failed responses are rejected, text pipes use UTF-8, and the Codex process stops before its pipes close (#497, #576, #577, #578)
- Requests use
AsyncOpenAIrather than a sync client in an executor (#513) - Custom clients no longer need a model field (#568)
- All top-level config fields reach worker processes (#517), the worker event loop is preserved (#556), and callable evaluators work in subprocess workers (#423)
Parsing and evaluation
- Only whole lines count as SEARCH/REPLACE markers (#546)
- Full-rewrite code fences handle CRLF, whitespace after the language, literal languages and language-tag fallback (#491, #523, #544)
- Java declarations are recognized before generic imports (#560)
- Boolean flags survive cascade evaluation, invalid LLM judge metrics are ignored, and partial judge ensembles keep valid feedback (#572, #573, #511)
- Embedding vector shapes are preserved after provider failures (#571)
- Top-program metrics in prompts use a neutral label (#539)
Evolution trace and visualizer
- Children whose parent left the archive are still traced (#581)
- Trace payloads are snapshotted, and JSON export metadata can be reused (#579, #575)
- HDF5 metadata lists round-trip, and strings that look like JSON stay strings (#580)
- The visualizer normalizes checkpoint paths before discovery (#525)
Example evaluators
- Evaluators no longer trust values reported by the candidate program (#518, #563)
- Non-finite and invalid inputs are rejected across the math and packing evaluators (#551, #552, #553, #555, #564, #565)
- The circle packing target is configurable through the environment, and the recorded best result is updated to 2.635977 (#501, #500)
Performance
- Fewer per-iteration values are recomputed in the controller path (#477)
Behaviour changes to note
- A run where no iteration produces a candidate now raises
EvolutionFailedError, and the CLI exits with code 1 (#545). - The invalid
llm.modelconfig key is rejected with an actionable error (#503). Configobjects built in code now have their evolution-mode settings validated when passed toOpenEvolve(#580).
Full changelog: v0.4.0...v0.4.1