Metadata-Version: 2.5
Name: louped
Version: 0.2.0
Summary: A local testbed for research on LLM behavior and efficiency: experiments, evals, interventions, training and interpretability in one app
Project-URL: Homepage, https://louped.vercel.app
Project-URL: Documentation, https://louped.vercel.app/docs
Author: ashworks1706
License-Expression: Apache-2.0
License-File: LICENSE
Keywords: evals,inference,interpretability,llm,mcp,research,sycophancy
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Science/Research
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
Requires-Python: >=3.12
Requires-Dist: pydantic>=2.10
Requires-Dist: tyro>=0.9
Provides-Extra: agent
Requires-Dist: httpx>=0.28; extra == 'agent'
Requires-Dist: mcp>=2.3; extra == 'agent'
Provides-Extra: data
Requires-Dist: httpx>=0.28; extra == 'data'
Requires-Dist: pyyaml>=6; extra == 'data'
Requires-Dist: rich>=14; extra == 'data'
Provides-Extra: evals
Requires-Dist: inspect-ai<0.4,>=0.3.271; extra == 'evals'
Requires-Dist: inspect-evals>=0.22; extra == 'evals'
Requires-Dist: openai>=1.0; extra == 'evals'
Provides-Extra: interp
Requires-Dist: nnsight>=0.4; extra == 'interp'
Requires-Dist: safetensors>=0.4; extra == 'interp'
Requires-Dist: scikit-learn>=1.5; extra == 'interp'
Requires-Dist: torch>=2.5; extra == 'interp'
Requires-Dist: transformers>=5; extra == 'interp'
Provides-Extra: rag
Requires-Dist: bm25s>=0.2; extra == 'rag'
Requires-Dist: nnsight>=0.4; extra == 'rag'
Requires-Dist: safetensors>=0.4; extra == 'rag'
Requires-Dist: scikit-learn>=1.5; extra == 'rag'
Requires-Dist: sentence-transformers>=5; extra == 'rag'
Requires-Dist: torch>=2.5; extra == 'rag'
Requires-Dist: transformers>=5; extra == 'rag'
Provides-Extra: rl
Requires-Dist: alembic>=1.13; extra == 'rl'
Requires-Dist: bitsandbytes>=0.46.1; (sys_platform != 'darwin') and extra == 'rl'
Requires-Dist: datasets>=4; extra == 'rl'
Requires-Dist: httpx>=0.28; extra == 'rl'
Requires-Dist: math-verify>=0.9; extra == 'rl'
Requires-Dist: mlflow-skinny>=3.0; extra == 'rl'
Requires-Dist: nnsight>=0.4; extra == 'rl'
Requires-Dist: nvidia-ml-py>=12; (sys_platform != 'darwin') and extra == 'rl'
Requires-Dist: peft>=0.17; extra == 'rl'
Requires-Dist: psutil>=5.9; extra == 'rl'
Requires-Dist: pyyaml>=6; extra == 'rl'
Requires-Dist: reasoning-gym>=0.1.25; extra == 'rl'
Requires-Dist: rich>=14; extra == 'rl'
Requires-Dist: safetensors>=0.4; extra == 'rl'
Requires-Dist: scikit-learn>=1.5; extra == 'rl'
Requires-Dist: sqlalchemy>=2.0; extra == 'rl'
Requires-Dist: torch>=2.5; extra == 'rl'
Requires-Dist: transformers>=5; extra == 'rl'
Requires-Dist: trl>=1.14; extra == 'rl'
Provides-Extra: sae
Requires-Dist: nnsight>=0.4; extra == 'sae'
Requires-Dist: sae-lens>=6; extra == 'sae'
Requires-Dist: safetensors>=0.4; extra == 'sae'
Requires-Dist: scikit-learn>=1.5; extra == 'sae'
Requires-Dist: torch>=2.5; extra == 'sae'
Requires-Dist: transformers>=5; extra == 'sae'
Provides-Extra: server
Requires-Dist: alembic>=1.13; extra == 'server'
Requires-Dist: fastapi>=0.115; extra == 'server'
Requires-Dist: fsspec>=2024.6; extra == 'server'
Requires-Dist: huggingface-hub>=1.33; extra == 'server'
Requires-Dist: inspect-ai<0.4,>=0.3.271; extra == 'server'
Requires-Dist: inspect-evals>=0.22; extra == 'server'
Requires-Dist: mlflow-skinny>=3.0; extra == 'server'
Requires-Dist: nvidia-ml-py>=12; (sys_platform != 'darwin') and extra == 'server'
Requires-Dist: openai>=1.0; extra == 'server'
Requires-Dist: psutil>=5.9; extra == 'server'
Requires-Dist: sqlalchemy>=2.0; extra == 'server'
Requires-Dist: uvicorn>=0.32; extra == 'server'
Provides-Extra: sync
Requires-Dist: alembic>=1.13; extra == 'sync'
Requires-Dist: fsspec>=2024.6; extra == 'sync'
Requires-Dist: huggingface-hub>=1.33; extra == 'sync'
Requires-Dist: inspect-ai<0.4,>=0.3.271; extra == 'sync'
Requires-Dist: inspect-evals>=0.22; extra == 'sync'
Requires-Dist: mlflow-skinny>=3.0; extra == 'sync'
Requires-Dist: nvidia-ml-py>=12; (sys_platform != 'darwin') and extra == 'sync'
Requires-Dist: openai>=1.0; extra == 'sync'
Requires-Dist: psutil>=5.9; extra == 'sync'
Requires-Dist: sqlalchemy>=2.0; extra == 'sync'
Provides-Extra: tracking
Requires-Dist: alembic>=1.13; extra == 'tracking'
Requires-Dist: mlflow-skinny>=3.0; extra == 'tracking'
Requires-Dist: nvidia-ml-py>=12; (sys_platform != 'darwin') and extra == 'tracking'
Requires-Dist: psutil>=5.9; extra == 'tracking'
Requires-Dist: sqlalchemy>=2.0; extra == 'tracking'
Provides-Extra: train
Requires-Dist: alembic>=1.13; extra == 'train'
Requires-Dist: bitsandbytes>=0.46.1; (sys_platform != 'darwin') and extra == 'train'
Requires-Dist: datasets>=4; extra == 'train'
Requires-Dist: httpx>=0.28; extra == 'train'
Requires-Dist: mlflow-skinny>=3.0; extra == 'train'
Requires-Dist: nnsight>=0.4; extra == 'train'
Requires-Dist: nvidia-ml-py>=12; (sys_platform != 'darwin') and extra == 'train'
Requires-Dist: peft>=0.17; extra == 'train'
Requires-Dist: psutil>=5.9; extra == 'train'
Requires-Dist: pyyaml>=6; extra == 'train'
Requires-Dist: rich>=14; extra == 'train'
Requires-Dist: safetensors>=0.4; extra == 'train'
Requires-Dist: scikit-learn>=1.5; extra == 'train'
Requires-Dist: sqlalchemy>=2.0; extra == 'train'
Requires-Dist: torch>=2.5; extra == 'train'
Requires-Dist: transformers>=5; extra == 'train'
Requires-Dist: trl>=1.14; extra == 'train'
Description-Content-Type: text/markdown

<p align="center"><img src="https://louped.vercel.app/wordmark.svg" alt="louped" height="48"></p>
<p align="center">A local workbench for research on LLM behavior and efficiency.</p>

<p align="center">
  <a href="https://louped.vercel.app">Website</a> •
  <a href="https://louped.vercel.app/docs">Docs</a>
</p>

Keep your research questions about language models in a project. Each question is an experiment
with a README (the question and the test) and a script that runs it. Your coding agent writes and
runs them; you read the results item by item in louped's app. Everything runs on your machine or
your cluster, with open-weight models.

<picture>
  <source media="(prefers-color-scheme: dark)" srcset="https://louped.vercel.app/demo/items-dark.png">
  <img alt="Sixteen questions under three conditions: what pushback and evidence did to each answer" src="https://louped.vercel.app/demo/items-light.png">
</picture>

## Start

```sh
pip install 'louped[server,tracking,interp,agent]'
louped init my-research && cd my-research
louped serve
```

Open http://127.0.0.1:8000 and launch the example experiment.

## How it works

1. **Make a project** with `louped init`. It also connects your coding agent.
2. **Ask a question.** Your agent (Claude Code, Codex, Cursor) writes the experiment.
3. **Run it** on your machine, or send it to a Slurm cluster; with a remote set, the job pushes
   its results and `louped pull` brings them in.
4. **Read the results**: every item under every condition, what changed, and out of how many.

Already have results? `louped view <folder>` opens them read-only.

See the [docs](https://louped.vercel.app/docs) for writing experiments, changing models, using
your agent and running on a cluster.

## Develop

You need [just](https://just.systems), [uv](https://docs.astral.sh/uv) and Node 22 with pnpm.

```sh
just bootstrap     # install everything and the git hooks
just check         # lint, types, tests, and the app and site builds
just serve         # the app on :8000
```

## License

[Apache 2.0](LICENSE)
