AI-powered autonomous ML research framework — agent runs experiments against frozen evaluation contracts on your existing pipelines.
Project description
🥋 Dojo — An AI-powered autonomous ML research framework.
Run controlled, reproducible ML experiments on your existing pipelines and build a memory of what actually works.
What is Dojo?
You define a domain — a research area pointing at your data with a fixed evaluation contract. An AI agent runs experiments inside that contract: writing training code, calling frozen load_data and evaluate tools, logging metrics, and recording findings as durable knowledge atoms.
The agent owns the training code. The framework owns evaluation. That separation is what makes the metrics trustworthy run-over-run, and what makes it safe to leave the agent unsupervised.
What's a domain?
A domain is a frozen research contract: one load_data + one evaluate + one workspace. Many experiments live inside it.
- Create a new domain when the data source, target variable, or evaluation metric changes.
- Don't create a new domain when you want to try a new model, hyperparameter, or feature — that's an experiment, and experiments are the agent's job.
⚠️ Proof of Concept — under active development. Single-tenant, local-first, open source. Today only
RegressionTaskis supported; more task types are coming once regression is solid.
Quickstart — recommended path
The recommended way to onboard a real project is the dojo-onboard Claude Code skill. It reads your code, asks a few targeted questions about the data + evaluation, writes PROGRAM.md + SETUP.md from the conversation, and drives the framework to generate + verify + freeze the contract.
uv tool install dojoml # one-time
dojo skill install dojo-onboard # one-time, requires Claude Code
cd path/to/your/python/project
claude # in Claude Code, run: /dojo-onboard
dojo run # after the skill finishes
Prerequisites:
- Python 3.11+
- Claude Code installed (for the skill path)
- The
claudeCLI logged in — Dojo shells out to it for agent runs (noANTHROPIC_API_KEYneeded) - (Optional) Docker, if you want experiments to run inside a containerised sandbox — see Run experiments inside Docker
Fallback — dojo onboard (no Claude Code)
If you don't have Claude Code, the built-in Typer wizard does the same setup interactively:
uv tool install dojoml
cd path/to/your/python/project
dojo onboard # interactive prompts
dojo run
For scripted / CI use, dojo onboard --non-interactive --name my-project writes default PROGRAM.md + SETUP.md templates and stops; edit the files, then run dojo domain setup.
Try a preset (tire-kicker)
To see Dojo work end-to-end on a canned dataset with no existing project:
mkdir housing && cd housing
dojo onboard --preset california_housing
dojo run --max-turns 30
Configuration
.dojo/config.yaml in your project root:
agent:
backend: claude # "stub" (no LLM, deterministic) or "claude"
tracking:
backend: file # "file" or "mlflow"
Env-var overrides use double underscore for nested fields: DOJO_AGENT__BACKEND=stub, DOJO_TRACKING__BACKEND=mlflow.
Run experiments inside Docker
By default, the agent's experiment scripts run in a host subprocess (LocalSandbox). For runaway training jobs that might OOM your laptop, opt into the containerised sandbox so each script runs inside an ephemeral docker run with --memory and --cpus limits — an OOM kills the container, not the host.
# .dojo/config.yaml
sandbox:
backend: docker # default "local"
image: python:3.11-slim # default — matches Dojo's minimum supported Python
memory_limit: 8g # optional; passed to `docker --memory`
cpu_limit: "4" # optional; passed to `docker --cpus`
network: bridge # default — set "none" for strict isolation
Or via env vars: DOJO_SANDBOX__BACKEND=docker DOJO_SANDBOX__MEMORY_LIMIT=8g.
When docker is selected, dojo domain setup builds a sibling .venv-docker/ next to your host .venv/ from your pyproject.toml or requirements.txt, so macOS users don't have to manage a Linux-compatible venv by hand. First setup pulls the image + installs deps (can take minutes); subsequent runs are instant. Add .venv-docker/ to your .gitignore. Delete the directory and re-run dojo domain setup to force a rebuild after dep changes.
Caveats: python:3.11-slim doesn't ship build tools — if your deps need native compilation (e.g. psycopg2 from source), point sandbox.image at a beefier image or one you've baked the deps into. OOMKilled (exit 137) and exec format error (exit 126) responses are tagged with a [dojo] marker in stderr explaining the fix.
Pointers
- CLAUDE.md — architecture, directory map, conventions, recipes.
- docs/ARTIFACTS.md — per-run artifacts and how tracking forwards them.
- docs/HTTP_API.md — HTTP API surface (also discoverable at
/docswhendojo startis running). - docs/MASTER_PLAN.md — vision and design.
- docs/RELEASING.md — release flow.
Development
Clone, then:
just dev # install backend (uv sync) + frontend (npm install)
just test # pytest -v
just lint # ruff check + format check
Full server + web UI dev loop: just run-stub (or just run-claude). Backend at http://localhost:8000, frontend at http://localhost:5173. The React frontend is not bundled in the PyPI release yet — run it from a checkout.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file dojoml-0.0.23.tar.gz.
File metadata
- Download URL: dojoml-0.0.23.tar.gz
- Upload date:
- Size: 122.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c669e116fba12c40c99b7bfcb02675875ab7434ddcbe3d08ffff47324db81603
|
|
| MD5 |
6aed797977d6292e777ce6d5d10ecd8a
|
|
| BLAKE2b-256 |
f32a9b5215f03802c717014b9de746594c1b165c85bfffcfdaafb9d2829408d6
|
Provenance
The following attestation bundles were made for dojoml-0.0.23.tar.gz:
Publisher:
release.yml on Garsdal/Dojo
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
dojoml-0.0.23.tar.gz -
Subject digest:
c669e116fba12c40c99b7bfcb02675875ab7434ddcbe3d08ffff47324db81603 - Sigstore transparency entry: 1537031550
- Sigstore integration time:
-
Permalink:
Garsdal/Dojo@5b912755a272d23a788c232abef28b3948feec51 -
Branch / Tag:
refs/tags/v0.0.23 - Owner: https://github.com/Garsdal
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@5b912755a272d23a788c232abef28b3948feec51 -
Trigger Event:
push
-
Statement type:
File details
Details for the file dojoml-0.0.23-py3-none-any.whl.
File metadata
- Download URL: dojoml-0.0.23-py3-none-any.whl
- Upload date:
- Size: 168.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
144897b7c444a8e39e2c7b0aa713abc76dd1bd07acf454917f921ea1a3fe4d2f
|
|
| MD5 |
8b57fe95346fa5bb57f008a2d36b5311
|
|
| BLAKE2b-256 |
cd61a45e049cc0cdcd078acf0bb6ed2611ad52cb48396bf96ca2414fbb95f192
|
Provenance
The following attestation bundles were made for dojoml-0.0.23-py3-none-any.whl:
Publisher:
release.yml on Garsdal/Dojo
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
dojoml-0.0.23-py3-none-any.whl -
Subject digest:
144897b7c444a8e39e2c7b0aa713abc76dd1bd07acf454917f921ea1a3fe4d2f - Sigstore transparency entry: 1537031651
- Sigstore integration time:
-
Permalink:
Garsdal/Dojo@5b912755a272d23a788c232abef28b3948feec51 -
Branch / Tag:
refs/tags/v0.0.23 - Owner: https://github.com/Garsdal
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@5b912755a272d23a788c232abef28b3948feec51 -
Trigger Event:
push
-
Statement type: