Atom of Thoughts is three dependencies and one config file
[NeurIPS 2025] Atom of Thoughts for Markov LLM Test-Time Scaling
At a glance
- What is it?
- This repository is the official implementation of a NeurIPS 2025 paper on test-time scaling for reasoning models. It is a script rather than a package: two Python files, an experiment directory, a three-line requirements file, and no packaging at all.
- Who is it for?
- Atom of Thoughts suits someone reproducing or extending the paper's results, who wants to read roughly two hundred lines of orchestration rather than install a framework. It does not suit a production integration, since there is no package to install, no test suite, and no released artefact.
- 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?
- Activity is slowing. The repository last received commits 6 months 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 October 12, 2026, and from our analysis. They are not legal advice.
Editorial analysis
The requirements file starts with a line pip cannot install
The dependency file has three lines and one of them is wrong for the tool the readme implies. It lists a Python version, an HTTP client for the model provider, and a progress bar library. The first line is written as a version equals a version, which is the conda specification syntax, not the requirement syntax a plain install reads. So a contributor who follows the standard path and installs from that file will hit a parse error on line one, and the fix is to install the two real dependencies by hand or to correct the line. That is a small thing, but it is the first thing anyone who clones the repository will touch, and it says something about the state of the repository: the version pin belongs in a version file, not in a requirements list.
API keys go in a Python file at the project root
The configuration section is three sentences long and has one interesting decision in it. Before running anything you create a Python file in the project root holding two things: the endpoint URL and a list of API keys. The key is a list rather than a single string, and the comment explains why, namely that several keys can be added to improve concurrency. That is a throughput choice made at the configuration layer rather than in the client, which tells you the framework is built around parallel sampling across a reason tree and expects to saturate a provider's rate limit. The downside is that credentials live in a Python module rather than in the environment, so the file has to be ignored by version control and the ignore list is the only thing standing between a key and a commit.
The badge points at a different repository owner
The header carries a badge linking to a repository under a different account from the one hosting it, and the news section credits a social post rather than a commit. Neither is unusual in a paper implementation that was forked, renamed, or mirrored, but together they mean the commit history in this repository is not the whole story. The readme is explicit that this is an official implementation rather than a mirror, and it cites the arXiv paper and the proceedings entry with the full author list, so provenance is documented even where the links are not internally consistent. The last commit is dated 1 April 2026 and there are no releases, which means there is no tagged artefact to compare against and no published version to install. For a research repository that is defensible. For anyone who wants a fixed point to cite, it is not.
Two state transitions are the whole mechanism
The idea is that a question can be decomposed into atomic questions and that the resulting subquestions can be contracted back into a single new question, repeated as a Markov process over atomic states. Each transition has two phases. The first decomposes the current question into a temporary dependency graph, which is explicitly directed and acyclic, so the dependencies among subquestions are ordered rather than a bag. The second contracts that graph's subquestions into one new atomic state. The claim attached to this is that it improves reasoning while reducing wasted computation, because the historical trace is folded into the next state instead of being carried forward. The graph is described as temporary, which is the honest part: it exists to order a decomposition and is discarded once the contraction is done.
Plugin mode turns the framework into a dataset generator
The second mode is the more interesting one for reuse. In the main mode the framework is the reasoner and you measure it against a dataset slice. In plugin mode it stops being the reasoner and becomes a preprocessing step: it reads questions, contracts them, and writes out a contracted dataset that another reasoning framework can then consume. The claim is that a contracted question stays answer-equivalent to the original while carrying none of the surrounding history, which is exactly what you want if you are comparing two test-time scaling methods on the same footing. So the repository can be used as an evaluation harness, as a data preparation tool, or as both. The cost is that contracted data is a one-way door: the discarded history is what the contraction removed, and nothing in the readme describes recovering it.
Six datasets, one codebase, and an undocumented default
The command surface is deliberately small. A dataset flag takes one of six values covering grade-school maths, a harder maths set, a broad benchmark of hard reasoning tasks, multiple-choice questions, multi-hop question answering, and a long-context benchmark. Two flags bound the slice of examples to evaluate, one names the model, and one chooses the mode:
python main.py --dataset math --start 0 --end 10 --model gpt-4o-miniThe quick-start example uses four of those five and omits the mode flag, which means the default is never stated. It is a small gap, but a reader copying the example will not know whether they are running the main experiment or generating a dataset until they look at the output. The general-reasoning claim is that all six run through the same codebase with only the prompt changing per task, which is the design point: the framework is task-agnostic and the task lives in the prompt.
Two Python files, one experiment directory, no packaging
The tree is short enough to read in full: a licence, a readme, an ignore file, an image directory, an experiment directory, two Python modules, and the dependency file. There is no packaging metadata, so nothing here is installable and nothing declares a console entry point; the entry is a script invoked with an interpreter. There is also no test directory and no documentation directory beyond the readme, which is consistent with a paper artefact rather than a maintained library. The two modules are the ones that matter, since one is the entry point and the other is presumably the model client, and the experiment directory is where the per-dataset work lives. For a reader reproducing a result that is exactly the right amount of code to have, and for anyone planning to depend on it there is nothing to depend on.
Editorial conclusion
Atom of Thoughts suits someone reproducing or extending the paper's results, who wants to read roughly two hundred lines of orchestration rather than install a framework. It does not suit a production integration, since there is no package to install, no test suite, and no released artefact. Before running it, create the key file the readme asks for and keep it out of version control, fix the dependency file's first line so a plain package install works, and pass the mode flag explicitly rather than relying on an unstated default.
Frequently asked questions
What is Atom of Thoughts?
It is a reasoning framework that represents a solution as a composition of atomic questions, turning reasoning into a Markov process. Each transition decomposes the current question into a temporary directed acyclic graph of subquestions and then contracts them into a new atomic state.
How do I run Atom of Thoughts?
Create a key file in the project root holding the endpoint URL and a list of API keys, then invoke the entry script with a dataset, a start and end index, and a model name. A mode flag selects the main experiment or the plugin mode that generates a contracted dataset.
Which datasets does Atom of Thoughts support?
Six: two maths sets, a benchmark of hard reasoning tasks, multiple-choice questions, multi-hop question answering, and a long-context benchmark. The readme claims the same codebase handles all of them, with only the task prompt changing.
What is plugin mode in Atom of Thoughts?
It makes the framework a preprocessing step rather than the reasoner. Contraction produces a dataset of rewritten questions that another reasoning framework can consume, keeping answer equivalence with the originals while dropping the surrounding history.
Is Atom of Thoughts available as a package?
No. There is no packaging metadata in the repository, so there is nothing to install; the entry point is a script run with an interpreter. There are also no releases and no test suite, and the last commit is dated 1 April 2026.
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/qixucen-atom)