Skip to main content

Multi-perspective review of research papers. Open panel runs on your own model key; a calibrated panel is available as a hosted service.

Project description

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=False and an error string. The other reviewers still run.
  • weighted_score is 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_error and leaves the reports intact.
  • extract_json accepts 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.

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

refereed-0.2.0.tar.gz (18.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

refereed-0.2.0-py3-none-any.whl (16.1 kB view details)

Uploaded Python 3

File details

Details for the file refereed-0.2.0.tar.gz.

File metadata

  • Download URL: refereed-0.2.0.tar.gz
  • Upload date:
  • Size: 18.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.6

File hashes

Hashes for refereed-0.2.0.tar.gz
Algorithm Hash digest
SHA256 6e37ba3b96aa4c3d0d9c19cbdfdc4ee426a21bb8d2251d4354dc22e57a0ccc43
MD5 502934d327382571bfab8fbcd323cf5e
BLAKE2b-256 722e26b9addcba9e030279ba57d0da926c11e14f677af684b299de128eb11968

See more details on using hashes here.

File details

Details for the file refereed-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: refereed-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 16.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.6

File hashes

Hashes for refereed-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 f9b5205243d972793076987f01ef50fc3369a9604831e004e3af87cae825cd53
MD5 2a788c3c6546807def42f2f47e6e839a
BLAKE2b-256 50cbf52cfc8788c897fb960cdfabf5c78606105abf2d8587295cea9e6da28756

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page