Metadata-Version: 2.5
Name: louped
Version: 0.6.0
Summary: A local workbench 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: notebooks
Requires-Dist: alembic>=1.13; extra == 'notebooks'
Requires-Dist: httpx>=0.28; extra == 'notebooks'
Requires-Dist: ipykernel>=6.29; extra == 'notebooks'
Requires-Dist: mlflow-skinny>=3.0; extra == 'notebooks'
Requires-Dist: nbconvert>=7.16; extra == 'notebooks'
Requires-Dist: nbformat>=5.10; extra == 'notebooks'
Requires-Dist: nvidia-ml-py>=12; (sys_platform != 'darwin') and extra == 'notebooks'
Requires-Dist: papermill>=2.6; extra == 'notebooks'
Requires-Dist: psutil>=5.9; extra == 'notebooks'
Requires-Dist: pypdfium2>=4.30; extra == 'notebooks'
Requires-Dist: python-docx>=1.1; extra == 'notebooks'
Requires-Dist: python-pptx>=1.0; extra == 'notebooks'
Requires-Dist: sqlalchemy>=2.0; extra == 'notebooks'
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: reports
Requires-Dist: httpx>=0.28; extra == 'reports'
Requires-Dist: kaleido>=1.0; extra == 'reports'
Requires-Dist: nbformat>=5.10; extra == 'reports'
Requires-Dist: plotly>=5.24; extra == 'reports'
Requires-Dist: pypdfium2>=4.30; extra == 'reports'
Requires-Dist: python-docx>=1.1; extra == 'reports'
Requires-Dist: python-pptx>=1.0; extra == 'reports'
Requires-Dist: vl-convert-python>=1.7; extra == 'reports'
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: httpx>=0.28; 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: ipykernel>=6.29; extra == 'server'
Requires-Dist: kaleido>=1.0; extra == 'server'
Requires-Dist: mlflow-skinny>=3.0; extra == 'server'
Requires-Dist: nbconvert>=7.16; extra == 'server'
Requires-Dist: nbformat>=5.10; extra == 'server'
Requires-Dist: nvidia-ml-py>=12; (sys_platform != 'darwin') and extra == 'server'
Requires-Dist: openai>=1.0; extra == 'server'
Requires-Dist: papermill>=2.6; extra == 'server'
Requires-Dist: plotly>=5.24; extra == 'server'
Requires-Dist: psutil>=5.9; extra == 'server'
Requires-Dist: pypdfium2>=4.30; extra == 'server'
Requires-Dist: python-docx>=1.1; extra == 'server'
Requires-Dist: python-pptx>=1.0; extra == 'server'
Requires-Dist: sqlalchemy>=2.0; extra == 'server'
Requires-Dist: uvicorn>=0.32; extra == 'server'
Requires-Dist: vl-convert-python>=1.7; extra == 'server'
Provides-Extra: sources
Requires-Dist: httpx>=0.28; extra == 'sources'
Requires-Dist: nbformat>=5.10; extra == 'sources'
Requires-Dist: pypdfium2>=4.30; extra == 'sources'
Requires-Dist: python-docx>=1.1; extra == 'sources'
Requires-Dist: python-pptx>=1.0; extra == 'sources'
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="Fifty items under three conditions, each against the reference: a re-analysis of released CAA results" 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.
   Edit a run's write-up beside its rendering. Move what you no longer need to the trash.
5. **Share and shape it.** Push runs for others to pull, or publish a read-only dashboard.
   Shift+click rows, cards or fields to ask your agent about them, or to have it change them. The
   agent points back at what it means.

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)
