Atom of Thoughts: a Markov formulation of LLM reasoning, and what the repo actually ships
[NeurIPS 2025] Atom of Thoughts for Markov LLM Test-Time Scaling
At a glance
- What is it?
- The repository implements the NeurIPS 2025 paper's two-phase decomposition and contraction loop, plus a plugin mode that emits contracted questions for other test-time scaling methods. The code is small, prompt-driven and API-bound, and the README is honest about how little of the harness is described.
- Who is it for?
- Adopt it if you are reproducing the paper's math, gsm8k, bbh, mmlu, hotpotqa or longbench numbers, or if you want contracted questions to feed into a separate test-time scaling method through plugin mode. Do not adopt it if you need offline inference, a documented evaluation harness, or a supported library API, since the README documents only a CLI, an apikey.py file and task-specific prompts.
- Can I use it commercially?
- Yes. MIT 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 167 days 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 15, 2026, and from our analysis. They are not legal advice.
DEEP OPEN-SOURCE ANALYSIS
The problem AoT is aimed at: reasoning traces that keep dragging their history along
Test-time scaling methods spend extra compute per question, usually by sampling more paths, extending chains, or searching over partial solutions. The Atom of Thoughts paper argues that a large share of that compute goes into reprocessing historical context rather than into the current step. The repository's framing of the fix is that a solution should be represented as a composition of atomic questions rather than as one long trace. The README states the goal directly: the approach "transforms the reasoning process into a Markov process with atomic states", where each state is a self-contained question and the transition is a rewrite of that question. The audience is narrow. This is a research implementation for people reproducing a NeurIPS 2025 result or building on the atomic-state idea, not a library you import into a production assistant. The README lists no package name, no install command and no importable module, which is consistent with that reading.
Decomposition into a dependency DAG, then contraction into the next atomic state
The mechanism has two phases per step. First, the current question is decomposed into a temporary dependency-based directed acyclic graph. Second, the subquestions in that graph are contracted to form a new atomic question state. That new state becomes the input to the next step, which is what makes the sequence Markovian in the paper's sense: the transition depends on the current atomic question, not on the full accumulated trace. Because the intermediate DAG is described as temporary, the graph is scaffolding for the rewrite rather than an artifact the user inspects or edits. The README does not specify the prompt templates, the contraction rule, or how the DAG is serialized for the model, so the exact text of those steps has to come from the paper or the code. What the README does commit to is the interface: the same codebase covers math, multi-choice and multi-hop QA, with task-specific prompts as the only differentiator.
Two modes, two different products: atom for answers, plugin for contracted questions
The --mode flag selects between atom and plugin. In atom mode the pipeline runs end to end and produces answers, which the README calls the main experiment. In plugin mode the pipeline stops early and emits a contracted dataset: rewritten questions intended to be fed into another reasoning framework. The README makes a strong claim about that output, that contracted questions "maintain answer equivalence with the original questions while eliminating unnecessary historical information". Treat that as the load-bearing assumption of plugin mode. If equivalence fails on your data, the downstream method is answering a different question and its scores are not comparable to the original benchmark. The README offers no verification procedure for equivalence, no sample of a contracted question, and no script that checks the property. That is the biggest documentation gap in the repository, and it sits under the feature most likely to be reused by other projects.
Getting a run started: apikey.py, main.py and six datasets
Setup is a file you write by hand. Create apikey.py in the project root with a url variable pointing at an OpenAI-compatible endpoint and an api_key list. The README notes that you can add multiple keys to improve concurrency, which tells you the evaluation loop issues parallel requests. The quick start command is python main.py --dataset math --start 0 --end 10 --model gpt-4o-mini. The dataset flag accepts math, gsm8k, bbh, mmlu, hotpotqa or longbench. --start and --end slice the example range, so 0 to 10 means the first ten examples. --model takes a model name as a string, and the README does not document how that string is resolved to a provider or whether the url variable is always used. There is no requirements.txt, no pinned dependency list and no container definition in the material provided. Expect to resolve the Python environment yourself before the first command runs.
Where this breaks: no offline path, thin harness documentation, and a moving target
Every run depends on a remote endpoint. There is no local-model path described, and apikey.py assumes an HTTP API with keys. If your constraint is on-premise inference or a fixed budget, this repository as documented does not serve you. The evaluation harness is also opaque: the README does not say how answers are extracted from model output, how they are compared to references, or what the scoring function is per dataset. That matters because reasoning benchmarks are sensitive to answer parsing, and a reimplementation that parses differently can move numbers by more than the method does. The last push date is 2026-04-01 and no releases were retrieved, so there is no tagged version to pin against. You are tracking main. The paper is the specification; the repository is one implementation of it, and the README does not claim they are in sync.
How it differs from sampling-and-voting test-time scaling
Self-consistency and similar methods sample many full reasoning paths and take the majority answer. Compute scales with the number of samples, and each sample carries the whole history of the problem. AoT's difference is structural rather than statistical: it rewrites the question between steps, so the state passed forward is shorter and the branching happens over atomic questions instead of over complete traces. The two are not mutually exclusive, and the README positions AoT as a plugin for exactly this class of method, generating contracted questions that a sampler then consumes. The trade-off is that AoT adds a decomposition and contraction step whose quality is not measured by the README. A sampler with a bad contraction step will confidently answer the wrong question. That failure mode does not exist in plain self-consistency, which is why the equivalence claim in plugin mode deserves independent checking before you build a pipeline on top of it.
Maintenance, licence and what to pin
The licence is MIT, which permits commercial use and modification provided the copyright notice and permission notice are retained. That is a statement about the licence text, not legal advice; if you redistribute the code inside a product, have your own counsel read the terms. The repository has no releases, so version pinning has to happen at the commit level: record the SHA you cloned, because main can move under you. Maintenance cost is dominated by the API surface, not the code. Model names change, endpoints change, and the README's --model flag passes a string whose resolution is undocumented, so a run that worked last month can fail without any commit in this repository. Budget for reading the code before you trust a number it prints.
Editorial conclusion
Adopt it if you are reproducing the paper's math, gsm8k, bbh, mmlu, hotpotqa or longbench numbers, or if you want contracted questions to feed into a separate test-time scaling method through plugin mode. Do not adopt it if you need offline inference, a documented evaluation harness, or a supported library API, since the README documents only a CLI, an apikey.py file and task-specific prompts. Before trusting a run, verify how the model name in --model is mapped to a provider, how the task prompts are selected per dataset, and whether the answer-equivalence claim that plugin mode makes for contracted questions holds on your own data.
Community notes