OpenEvolve: an evolutionary coding agent that treats your LLM as a mutation operator
Open-source implementation of AlphaEvolve
At a glance
- What is it?
- OpenEvolve wraps an LLM in a MAP-Elites loop so candidate programs compete on a scored evaluator. Here is how the pipeline is put together, how to run it, and where it stops being the right tool.
- Who is it for?
- Adopt OpenEvolve when you already have a deterministic evaluator that scores a candidate program with a number, and when the search space is one file the LLM can rewrite. Do not adopt it when correctness depends on human judgement, when you have no scoring harness, or when a single careful prompt would settle the question.
- Can I use it commercially?
- Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 1 day ago.
- What is it written in?
- Mainly Python, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 29, 2026, and from our analysis. They are not legal advice.
Editorial analysis
The problem OpenEvolve solves, and the people it is aimed at
Most LLM coding workflows are single-shot. You describe a function, the model writes it, you read it and decide whether to keep it. That works when you can tell good output from bad by reading. It breaks down when the objective is a number you can only obtain by running the code: latency of a kernel, tour length in a routing problem, error of a regression fit.
OpenEvolve turns that situation into a search loop. The repository describes itself as an "Open-source implementation of AlphaEvolve", and the README frames the pitch as turning LLMs into "autonomous code optimizers". The intended user is an engineer or researcher who has a program, a scoring function, and a willingness to let a model propose hundreds of variants. The bundled examples point at the same audience: circle packing, TSP tour minimization, symbolic regression, GPU kernel optimization, sorting algorithms in Rust, R regression, and a handful of benchmark suites.
What it is not is a general code assistant. There is no chat interface in the repository layout and no editor integration. The unit of work is a program file plus an evaluator file plus a config file, which is a narrower and more honest scope than the marketing language suggests.
MAP-Elites islands, LLM ensembles and the artifact side-channel
The README names four mechanisms, and they are worth separating because they fail differently. The first is quality-diversity evolution built on MAP-Elites: instead of keeping only the best program, the system maintains a population spread across feature dimensions. The second is an island architecture, meaning several populations evolve separately so that one strong early candidate does not crowd out everything else.
The third is an LLM ensemble. The README describes "multiple models with intelligent fallback strategies", so a single run can route generation across providers and fall back when one is unavailable. The fourth is what the README calls an "Artifact Side-Channel": evaluation errors are fed back into later generations rather than being discarded. That last one is the most interesting design choice, because it means a crashing candidate is still useful information to the loop.
Reproducibility is handled by seeding every component, with a default seed of 42, and by hash-based isolation between components. The README claims deterministic evolution and exact reproduction across machines. That claim is testable and worth testing yourself, since any nondeterminism in your evaluator or in a remote model provider will break it regardless of what OpenEvolve seeds.
Installing OpenEvolve and running a first evolution
The README gives a pip install as the entry point. The package requires Python 3.10 or newer according to pyproject.toml, and the runtime dependencies are openai, pyyaml, numpy, tqdm, flask and dacite. There is also a Dockerfile based on python:3.12-slim if you prefer a container.
pip install openevolve
export OPENAI_API_KEY="your-gemini-api-key"The environment variable name is not a typo in this article. The README explicitly notes that the bundled example uses Google Gemini by default and that you still export the key as OPENAI_API_KEY. Any OpenAI-compatible provider can be substituted by editing the config.
The first run uses the function minimization example that ships in the repository:
python openevolve-run.py examples/function_minimization/initial_program.py \
examples/function_minimization/evaluator.py \
--config examples/function_minimization/config.yaml \
--iterations 50Three positional paths go in: the program to evolve, the evaluator that scores it, and a YAML config. The run should print progress as generations advance and end with the best program found. Installing the package also registers a console script named openevolve-run, so the same entry point is available without the .py suffix.
If you would rather not manage files at all, the README shows a library path with run_evolution for inline source strings and evolve_function for evolving a Python callable directly against a list of test cases. Both are imported from the openevolve package.
The evaluator is the whole game, and it is also the weak point
OpenEvolve cannot tell whether a program is correct. It only knows what your evaluator reports. That single dependency determines whether the loop produces something useful or something that games the metric.
A scoring function that rewards speed without checking output correctness will be satisfied by a program that returns immediately. A scoring function that checks correctness on ten fixed inputs will be satisfied by a program that hardcodes those ten answers. Neither failure is exotic; both are the ordinary outcome of optimizing against a thin signal. The README's own examples pair each target with an evaluator, and the quality of those evaluators is doing more work than the evolutionary machinery.
There is a second, quieter limitation. The README states that the example config uses Gemini by default and that other providers require editing config.yaml. Changing provider means changing model names, base URLs and possibly prompt formatting, and the README does not document what happens to a partially completed run when you switch mid-experiment. If you need to compare two providers, plan on two separate runs with the same seed rather than one run that swaps models.
Finally, cost. Fifty iterations is the README's own first example. Real runs in the examples gallery are described in terms of hundreds of generations, and each generation is at least one model call. Nothing in the repository caps spend, so the budget is your responsibility.
OpenEvolve compared with AlphaEvolve, and with just prompting the model
The obvious comparison is with AlphaEvolve itself. The repository describes OpenEvolve as an open-source implementation of it, which places the difference in access rather than in method: AlphaEvolve is a DeepMind system described in a paper, while OpenEvolve is code you install from PyPI under Apache-2.0 and run against your own evaluator. Whether the two produce comparable results on the same problem is not something the README establishes, and the README's achievement table cites the repository's own examples rather than an independent comparison.
The more useful comparison is with a plain prompting loop. If you write a script that asks a model to improve a function, runs the evaluator, and keeps the best version, you have the skeleton of what OpenEvolve does. The difference is what sits on top: MAP-Elites keeps diversity instead of collapsing to one lineage, islands slow premature convergence, the ensemble adds provider fallback, and the artifact side-channel turns crashes into signal. Whether that extra machinery beats a simple hill-climb depends on how rugged your objective is. For a smooth objective with one obvious direction, the simple loop wins on setup time. For a problem with many local optima, the diversity mechanisms are the reason to use this project at all.
Licence, maintenance and the cost of keeping a fork alive
OpenEvolve is licensed Apache-2.0, which permits commercial use and modification provided you preserve the licence and notices, and it includes an explicit patent grant. That is a permissive arrangement, but it is not legal advice and your counsel should review anything you ship.
The last push to the default branch was on 2026-07-18, and the most recent tagged release, v0.3.2, carries the same date. Releases v0.3.0 and v0.3.1 landed earlier the same month, so the project saw three tagged releases in roughly two weeks before going quiet. The repository is not archived. Read the version history before pinning: a project that moves that fast in a short window can also change config schema between minor versions, and the README does not publish a migration guide or a deprecation policy.
Upgrade cost is mostly your config. Because provider settings, model lists and evaluation parameters live in YAML that you write, a version bump can require re-checking every key. The pyproject.toml pins minimum versions rather than exact ones for openai, numpy and the rest, so a fresh install can pull a newer client library than the one a run was validated against. Pin your own environment if you need a result to be reproducible months later.
Editorial conclusion
Adopt OpenEvolve when you already have a deterministic evaluator that scores a candidate program with a number, and when the search space is one file the LLM can rewrite. Do not adopt it when correctness depends on human judgement, when you have no scoring harness, or when a single careful prompt would settle the question. Before committing, verify three things in your own checkout: that your evaluator returns the score key the config expects, that your provider's credentials work through the OpenAI-compatible path the README describes, and that the default seed of 42 reproduces the same best program on two runs. The library entry points in openevolve, run_evolution and evolve_function, are the fastest way to check the last of those.
Frequently asked questions
What is OpenEvolve?
It is an open-source Python implementation of AlphaEvolve that runs an evolutionary loop over candidate programs, using LLMs to propose changes and an evaluator you supply to score them. The README describes the core as MAP-Elites quality-diversity evolution combined with an island architecture and an LLM ensemble.
How do you use OpenEvolve on your own program?
You provide three things: the program file to evolve, an evaluator that returns a score, and a YAML config. The README's first example runs openevolve-run.py with those paths and an --iterations flag, or you can call run_evolution and evolve_function from the openevolve package for inline code.
What is AlphaEvolve used for, and how does OpenEvolve relate to it?
AlphaEvolve is the DeepMind system that OpenEvolve implements in open source. The repository applies the same idea to problems such as circle packing, TSP tour minimization, GPU kernel optimization and symbolic regression, each with its own evaluator in the examples directory.
Are evolutionary algorithms still used?
OpenEvolve is itself a current example of the approach: it uses MAP-Elites quality-diversity evolution and an island architecture to search over programs rather than parameters. The repository's examples apply it to circle packing, sorting algorithms and GPU kernels.
Can I create my own algorithm with OpenEvolve?
The README frames the tool as discovering new algorithms rather than only tuning existing ones, and the examples gallery includes adaptive sorting algorithms and Metal shader kernels. In practice you start from an initial program and an evaluator you write, and the loop proposes the variants.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/algorithmicsuperintelligence-openevolve)