refereed
Multi-perspective review of research papers. Several reviewers read the paper independently, then a synthesiser combines their reports into one recommendation.
There are two panels. Both run through the same engine, so code written against one works against the other.
| Open panel | Hosted panel | |
|---|---|---|
| Reviewers | 3 (claims, method, clarity) | 7 narrow reviewers |
| Weights | Equal | Per-reviewer, calibrated |
| Calibration | None | Tuned against a corpus of ~105 papers |
| Runs on | Your machine | Quilio infrastructure |
| Model key | Yours | Included |
| Account | None | Quilio API key |
| Licence | MIT | Commercial |
Install
pip install "refereed[anthropic]"
Python 3.9 or later. The engine and the open panel have no third-party
dependencies; the anthropic extra is only needed to run the open panel
against Claude.
Open panel
Runs locally against your own model key. No account, no rate limit.
export ANTHROPIC_API_KEY=...
refereed review paper.md
refereed reviewers # list the panel, no API call
import asyncio
from refereed import anthropic_complete, review_paper
review = asyncio.run(review_paper(
open("paper.md").read(),
anthropic_complete(effort="high"),
title="Paper title",
))
review.weighted_score
[r for r in review.reports if r.ok]
review.meta["revision_list"]
Hosted panel
Seven narrow reviewers with calibrated weights and a separate synthesiser. Requires a Quilio API key: https://quilio.dev/pricing
export QUILIO_API_KEY=qk_...
refereed review paper.md --hosted
from refereed import review
r = review(open("paper.md").read(), api_key="qk_...")
r.weighted_score
r.recommendation
r.major_concerns # each tagged with the reviewer that raised it
QuotaExceeded is raised when the period's quota is spent. ReviewError
covers transport and API failures.
Scoring
weighted_score is the weight-weighted mean of reviewer scores over reviewers
that returned parseable output:
sum(weight_i * score_i) / sum(weight_i)
It is computed from the returned JSON and is reproducible from it. In the open panel the weights are equal, so this reduces to a plain mean.
Failure semantics
- A reviewer that raises, or returns output with no JSON object, is recorded
with
ok=Falseand an error string. The other reviewers still run. weighted_scoreis computed over successful reviewers only.- Unparseable output is kept in
ReviewerReport.raw, truncated to 2000 characters. - The synthesiser runs only if at least one reviewer succeeded. A failure there
sets
meta_errorand leaves the reports intact. extract_jsonaccepts a bare object, a fenced block, or an object embedded in prose. It rejects a top-level array.
Bring your own backend
Model access goes through one callable, async (system, user) -> str. Nothing
else in the open panel performs I/O.
async def complete(system: str, user: str) -> str:
return await gateway.complete(system=system, user=user)
review = await review_paper(paper, complete)
The hosted client takes an injectable transport for the same reason.
Limits
- Assessment is bounded by the model's knowledge. It does not perform a literature search, so treat any novelty claim as a prompt to go and check.
- It reads the text you supply. It cannot run experiments or inspect data it has not been given.
- Output is non-deterministic. Two runs on the same paper differ in wording and may differ in score.
- Scores are ordinal. The concerns and the revision list carry the detail.
- Output is model-generated. It is a reading aid before submission and carries no editorial standing.
Related
- citeverify: checks whether the references in a bibliography exist, against OpenAlex, Crossref and arXiv.
- corpus-lens: keywords, rhetorical fingerprints, similarity and embeddings across a whole corpus.
citeverify output can be passed to either panel with --context.
Development
pip install -e ".[dev]"
pytest
40 tests, all offline. No model key or Quilio key required; the model backend and the HTTP transport are both injected.
Licence
MIT for this package. The hosted panel is a commercial service.
Metadata
Release files for refereed 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| refereed-0.2.0.tar.gz | 18.5 kB | Without provenance | Details for refereed-0.2.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| refereed-0.2.0-py3-none-any.whl | Python 3 | none | any | Details for refereed-0.2.0-py3-none-any.whl |
Total release size: 34.6 kB
Release files / refereed-0.2.0.tar.gz
| Download URL | refereed-0.2.0.tar.gz |
|---|---|
| Size | 18.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6e37ba3b96aa4c3d0d9c19cbdfdc4ee426a21bb8d2251d4354dc22e57a0ccc43
|
|
BLAKE2b-256 checksum How to use checksums |
722e26b9addcba9e030279ba57d0da926c11e14f677af684b299de128eb11968
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.9.6
|
Release files / refereed-0.2.0-py3-none-any.whl
| Download URL | refereed-0.2.0-py3-none-any.whl |
|---|---|
| Size | 16.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f9b5205243d972793076987f01ef50fc3369a9604831e004e3af87cae825cd53
|
|
BLAKE2b-256 checksum How to use checksums |
50cbf52cfc8788c897fb960cdfabf5c78606105abf2d8587295cea9e6da28756
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.9.6
|
Security for refereed 0.2.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.