The fastest way to collect human preference data for LLMs
Project description
feedloop
The fastest way to collect human preference data for LLMs.
feedloop is a free developer tool that lets you collect human feedback on LLM outputs — directly from your Python code, with zero configuration. Submit pairs of model responses, review them in a local browser UI, and export a fine-tuning dataset in minutes.
Features
- Zero setup —
pip install feedloopand you're running - Local-first — everything runs on your machine, no cloud account needed
- Non-blocking SDK —
feedloop.compare()returns immediately, your script keeps running - Built-in review UI — side-by-side browser interface with keyboard shortcuts
- DPO-ready export — outputs standard
{"prompt", "chosen", "rejected"}JSONL - Uncertainty filtering — skip low-uncertainty comparisons automatically, focus human attention where it matters
- Training script included — generates a ready-to-run TRL DPO fine-tuning script from your data
- Session scoping — each run is isolated; data persists across sessions in SQLite
- Model agnostic — works with OpenAI, Anthropic, Hugging Face, Ollama, or any LLM
Use Cases
- Model comparison — compare GPT-4o vs Claude, or two versions of your own model
- Fine-tuning data collection — build a DPO preference dataset without a labelling platform
- Evaluation loops — quickly understand where your model falls short by seeing what humans prefer
- Active learning — use uncertainty scores to only review the comparisons that matter most
- Iterative improvement — collect feedback → fine-tune → re-run → repeat
Installation
pip install feedloop
Requires Python 3.10+. No other dependencies or accounts needed.
Quick Start
import feedloop
# Start the server (opens browser automatically)
feedloop.start()
# Submit pairs of outputs for review
feedloop.compare(
prompt="Explain recursion to a 10-year-old.",
outputs=[
"Recursion is when a function calls itself...",
"Imagine you're looking for a book in a library...",
],
metadata={"model_a": "gpt-4o-mini", "model_b": "gpt-4o"},
)
# Rate in the browser, then export
feedloop.export("preferences.jsonl")
A browser tab opens at http://localhost:7856. Pick the better response with a click or keyboard shortcut (1, 2, or S to skip). When you're done, export to a DPO-ready JSONL file.
Uncertainty-Based Filtering
Only review comparisons where your model is unsure — skip the easy ones automatically:
feedloop.start(uncertainty_threshold=0.6)
feedloop.compare(
prompt="...",
outputs=[response_a, response_b],
uncertainty=0.85, # above threshold → sent to human
)
feedloop.compare(
prompt="...",
outputs=[response_a, response_b],
uncertainty=0.3, # below threshold → auto-skipped
)
Exported Data Format
{"prompt": "Explain recursion...", "chosen": "Imagine you're looking for a book...", "rejected": "Recursion is when a function calls itself..."}
Compatible with TRL DPOTrainer, OpenRLHF, and any custom pipeline that accepts preference pairs.
Documentation
Full guide, API reference, and examples: turingspark.com/tools/feedloop
Project details
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 feedloop-1.5.1.tar.gz.
File metadata
- Download URL: feedloop-1.5.1.tar.gz
- Upload date:
- Size: 157.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
88040b1e0998a44dc2c1a1b63d74c7a4e1799b45ed7a4684365474525be308ed
|
|
| MD5 |
973c3bd89b5b443dd6b016e8a7d67600
|
|
| BLAKE2b-256 |
4f0b5f166581868a5b74ab8663399e45cc4276a6ae77dd895a536a2455e79ec5
|
Provenance
The following attestation bundles were made for feedloop-1.5.1.tar.gz:
Publisher:
release.yml on turing-spark/feedloop
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
feedloop-1.5.1.tar.gz -
Subject digest:
88040b1e0998a44dc2c1a1b63d74c7a4e1799b45ed7a4684365474525be308ed - Sigstore transparency entry: 1188858919
- Sigstore integration time:
-
Permalink:
turing-spark/feedloop@4cf9b4500216e3ffd6d1ab373800aeb5785e01e2 -
Branch / Tag:
refs/tags/v1.5.1 - Owner: https://github.com/turing-spark
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@4cf9b4500216e3ffd6d1ab373800aeb5785e01e2 -
Trigger Event:
push
-
Statement type:
File details
Details for the file feedloop-1.5.1-py3-none-any.whl.
File metadata
- Download URL: feedloop-1.5.1-py3-none-any.whl
- Upload date:
- Size: 116.3 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 |
9cab21690f5854da0d24bce1bd19ca13ca31859cb016fffc3f2d6fab4088afb0
|
|
| MD5 |
c605ad3e76c55f0a54c2ea021eff7c5f
|
|
| BLAKE2b-256 |
fe78117b6b09ebe89aa1aa24041406949150ac5b152f642e56ff99538dbc6d26
|
Provenance
The following attestation bundles were made for feedloop-1.5.1-py3-none-any.whl:
Publisher:
release.yml on turing-spark/feedloop
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
feedloop-1.5.1-py3-none-any.whl -
Subject digest:
9cab21690f5854da0d24bce1bd19ca13ca31859cb016fffc3f2d6fab4088afb0 - Sigstore transparency entry: 1188858942
- Sigstore integration time:
-
Permalink:
turing-spark/feedloop@4cf9b4500216e3ffd6d1ab373800aeb5785e01e2 -
Branch / Tag:
refs/tags/v1.5.1 - Owner: https://github.com/turing-spark
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@4cf9b4500216e3ffd6d1ab373800aeb5785e01e2 -
Trigger Event:
push
-
Statement type: