endless-learning
Generate your own RL training tasks — and verify they are worth training on.
endless-learning builds a concept graph by exploring the web, mines
verifiable tasks from it, and gates every task through execution: a task ships
only if something can actually check the answer. Two kinds of task are live —
deep-search questions grounded in a frozen document corpus, and executable
coding instances mined from real repositories.
It is an open reproduction of the knowledge-graph task synthesis described in the Kimi K3 technical report (arXiv 2607.24653).
Scope: this is the data engine — graph, mining, verification, and versioned datasets that ship with their reward functions and environments. There is no training loop; trainers own the rollout loop.
What you can do with it
| Grow a concept graph | Agents explore outward from a seed pack, expanding a deduplicated concept DAG. Three packs ship with the package; bring your own as a TOML file. |
| Mine deep-search questions | Questions grounded in a content-addressed corpus, gated V1–V5: grounded, unique, non-trivial, solvable, stable. |
| Mine executable coding tasks | SWE-bench-shaped instances from real repos, validated by running the tests: the oracle must fail on the broken state and pass on the fixed one. |
| Re-verify offline | Every dataset re-checks with no network and no model calls, against pinned images and hashed documents. |
| Export to trainers | verifiers tasksets, chorus TaskRecord registries, and Harbor task directories — each checked against the consumer's own code. |
Install
pip install 'endless-learning[all]'
Python 3.11+. Extras, if you would rather pick: [anthropic] [openai]
[litellm] [ddg] [mcp] [hub] [semantic] [verifiers].
Docker is required for the coding domain only. Everything else runs locally.
Quickstart
Nothing here downloads a prebuilt graph — the package is the engine, and every artifact is produced by your run, in your workspace.
mkdir my-graph && cd my-graph
endless init # endless.toml + .endless/
endless kg expand --seeds knowledge --budget-nodes 0 # plant a seed pack, no keys needed
endless kg stats
Seeding is local. Growing the graph calls a model and a search backend, so
set the credentials your endless.toml roles name, then raise the budget:
export ANTHROPIC_API_KEY=... # or whichever provider endless.toml selects
endless kg expand --budget-nodes 50 # agents explore outward from the seeds
Deep-search questions
Sample the graph, write questions against retrieved documents, and keep only what survives the gate. The corpus is content-addressed, so a question that passes today re-verifies tomorrow against the same bytes.
endless synth run --n 20 --workers 6 # sample → write → gate → tasks.jsonl
endless dataset verify # offline: no network, no model calls
endless dataset export-verifiers # verifiers-v1 taskset package
Coding tasks
Onboard a repository into a pinned image with a flake-screened test ledger, then mine instances from its history. Every instance is validated by execution against two states of the repo before it is allowed to exist.
endless coding select --n 10 # graph concepts → candidate repos
endless coding onboard --repo <url> # pinned image + test ledger
endless coding mine --since 2024-01-01 # mine instances → dual-state validation
endless coding verify-instances # replay every instance from its images
Three families are built, differing in what the model is asked to do:
| family | the job | where instances come from |
|---|---|---|
code-bugfix |
fix the code | a commit that touches source and tests together |
code-testgen |
write the test | inverts a bugfix instance — your test must fail before the fix and pass after |
code-evolution |
implement the change | a merged pull request, scoped so the task is a coherent unit of work |
endless coding mine-testgen # invert released bug fixes
endless coding mine-evolution # mine merged pull requests
Export to whichever harness you train against:
endless coding export-chorus # chorus TaskRecord registry
endless coding export-harbor # Harbor task directories
endless coding publish-images --registry <prefix> # retag; push only with --push
endless coding export-tree # one file per instance, for a git-backed corpus
What ships, and what does not
Datasets are outputs of your run, and are not distributed here. A
search-QA record cites document hashes; a coding instance names a pinned
image. Without the corpus and the images neither re-verifies, so shipping the
JSONL alone would be shipping a claim with its evidence removed. endless dataset verify re-verifies against your corpus, built by your runs.
What to expect
Measured results, including the ones that did not go our way — worth reading before you plan around this:
- Difficulty is expensive to measure and noisy. Per-task pass rate is ±0.24 at 5 rollouts, exactly binomial. Aggregate over 30+ tasks; never read a single task's label.
- The graph does not make tasks hard. Four independent levers each improved a question's shape and left the mean pass rate at 0.88. What the graph is actually for is coverage and checkable grounding.
- Onboarding is mechanical, and bounded. Roughly 83% success on curated mainstream Python, near 0% on the long tail the graph selects.
- A task's statement is the binding constraint, not its difficulty. In one 80-episode run every instance scored 0.000, not because the work was hard but because the statements under-specified what the tests check. Re-deriving each statement from what the pull request actually merged moved one instance from a flat 0.167 to a mean of 0.938.
- Offline re-verification holds. 25/25 on the search set, 8/9 on coding — the miss being a real catch, an oracle whose verdict depended on set ordering.
Docs
Design notes, decisions and measured results live in docs/ as a
numbered series — start at docs/000-overview.md.
Metadata
Release files for endless-learning 0.0.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| endless_learning-0.0.2.tar.gz | 501.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| endless_learning-0.0.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 784.7 kB
Release files / endless_learning-0.0.2.tar.gz
| Download URL | endless_learning-0.0.2.tar.gz |
|---|---|
| Size | 501.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
3da6f15556613538bca5777a2e2ac8568cb91c8d9dcdc3346324e4d98e9d526d
|
|
BLAKE2b-256 checksum How to use checksums |
a456a47054e8fad6b8af01569f801fb81afa32cb5436a7bce2300abc93ce250a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 20, 2026.
Transparency logRelease files / endless_learning-0.0.2-py3-none-any.whl
| Download URL | endless_learning-0.0.2-py3-none-any.whl |
|---|---|
| Size | 282.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
62e26d20188f8efc2dd694eb028d34cb7e4716bcbb41b2e28c480c38eca54f90
|
|
BLAKE2b-256 checksum How to use checksums |
498708d5371fb3a229312bdf9edfb55c567becb8b792824172b61f221f4d36e3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 20, 2026.
Transparency log