A lightweight framework for managing AI research experiments with Claude Code
Project description
ox
A lightweight framework for managing AI research experiments with Claude Code at the heart of the workflow.
Like a good ox: strong work ethic, no tangles. Think of it as a yak that went to finishing school.
Install
uv add oxen-team
Quick Start
# Create a project
ox init my-research
cd my-research
uv sync
# Create a study
ox new study "learning rate schedules"
# Create an experiment
ox new experiment learning-rate-schedules "cosine-baseline" --tag lr --tag cosine
# Check what a script accepts
ox config-schema src/my_research/scripts/train.py
# Run it
ox run src/my_research/scripts/train.py \
--config studies/learning-rate-schedules/experiments/cosine-baseline/config.yaml \
--experiment cosine-baseline
# Query results
ox ls --study learning-rate-schedules
ox query "status = 'completed' ORDER BY updated_at DESC"
ox show cosine-baseline
How It Works
Write a training script with two conventions:
from pydantic import BaseModel
from ox import Tracker
class Config(BaseModel):
lr: float = 1e-3
batch_size: int = 32
epochs: int = 10
def main(config: Config, tracker: Tracker) -> None:
for epoch in range(config.epochs):
loss = train_epoch(model, config)
tracker.log({"loss": loss, "epoch": epoch}, step=epoch)
No argparse. No decorators. No registration. The Config class is your argument spec — ox generates CLI flags from the Pydantic model automatically.
Philosophy
- Get out of the agent's way. Claude Code is the orchestrator. Ox provides composable primitives.
- Convention over configuration. A
Configclass and amainfunction. That's it. - Everything in the repo. Experiments, configs, notes — all in version control.
- Framework-agnostic. Use PyTorch, JAX, whatever. Ox handles config and tracking.
- Skills over scaffolding. Complex workflows are Claude Code skills, not framework code.
Project Structure
After ox init, you get:
my-research/
├── CLAUDE.md # Master prompt for Claude Code
├── .claude/skills/ # Claude skill files (yours to customize)
├── ox.yaml # Project config
├── studies/ # Research studies and experiments
├── src/my_research/scripts/ # Training entrypoints
└── .ox/metrics/ # Local tracker output (gitignored)
CLI Commands
| Command | Description |
|---|---|
ox init <name> |
Scaffold a new project |
ox new study <name> |
Create a study |
ox new experiment <study> <name> |
Create an experiment |
ox run <script> [--config PATH] [--experiment ID] |
Run a training script |
ox ls [--study S] [--status S] [--tag T] |
List experiments |
ox query <expression> |
SQL query over experiments |
ox show <id> |
Show experiment details |
ox status |
Show running experiments |
ox config-schema <script> |
Print config JSON schema |
Tracker
Metrics are logged via the Tracker interface:
tracker.log({"loss": 0.5, "acc": 0.9}, step=10)
Backends:
- local (default) — JSONL files in
.ox/metrics/ - wandb — Weights & Biases (
uv add 'oxen-team[wandb]')
Configure in ox.yaml:
tracker:
backend: local
output_dir: .ox/metrics
License
MIT
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 oxen_team-0.1.1.tar.gz.
File metadata
- Download URL: oxen_team-0.1.1.tar.gz
- Upload date:
- Size: 64.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cf0b43a17a332b4b3a52ebda19d321bba5fc50691d2ee7693fd98e119f058cbf
|
|
| MD5 |
472561033f0fdc41b755f2a262e610b0
|
|
| BLAKE2b-256 |
9ae3b7e3af9c6b64e10e88d3de82f565e57a19e991a944fae62c8477b208693d
|
Provenance
The following attestation bundles were made for oxen_team-0.1.1.tar.gz:
Publisher:
publish.yml on tdfirth/ox
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
oxen_team-0.1.1.tar.gz -
Subject digest:
cf0b43a17a332b4b3a52ebda19d321bba5fc50691d2ee7693fd98e119f058cbf - Sigstore transparency entry: 928416817
- Sigstore integration time:
-
Permalink:
tdfirth/ox@011a6f365ae4d0598155b259b577a74a7f05c741 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/tdfirth
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@011a6f365ae4d0598155b259b577a74a7f05c741 -
Trigger Event:
release
-
Statement type:
File details
Details for the file oxen_team-0.1.1-py3-none-any.whl.
File metadata
- Download URL: oxen_team-0.1.1-py3-none-any.whl
- Upload date:
- Size: 29.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
80464a3de5cd76d26e1200918da461f5810ab8d50f1c1bc55d9be7c20c68e3df
|
|
| MD5 |
a3118b6f12c1ab7128998cc139246f05
|
|
| BLAKE2b-256 |
aadb6e6b7412671affcc36bd68fa5fb44155d7bbedac988b4336228d8d3c0e9b
|
Provenance
The following attestation bundles were made for oxen_team-0.1.1-py3-none-any.whl:
Publisher:
publish.yml on tdfirth/ox
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
oxen_team-0.1.1-py3-none-any.whl -
Subject digest:
80464a3de5cd76d26e1200918da461f5810ab8d50f1c1bc55d9be7c20c68e3df - Sigstore transparency entry: 928416819
- Sigstore integration time:
-
Permalink:
tdfirth/ox@011a6f365ae4d0598155b259b577a74a7f05c741 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/tdfirth
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@011a6f365ae4d0598155b259b577a74a7f05c741 -
Trigger Event:
release
-
Statement type: