Skip to main content

Run a panel of seven independent AI referees over a research paper, then synthesise their reports into one recommendation.

Project description

refereed

Run a panel of seven independent AI referees over a research paper, then synthesise their reports into one recommendation.

pip install "refereed[anthropic]"
refereed review paper.md
My paper
==========================================================
  ✓  Correctness reviewer             7/10  minor_revisions
        major: Lemma 2 assumes independence that Section 3 does not establish
  ✦  Novelty reviewer                 6/10  major_revisions
  ⚙  Methodology reviewer             7/10  minor_revisions
  ❖  Citations reviewer               8/10  accept
  ↻  Reproducibility reviewer         5/10  major_revisions
        major: No code or data released; results cannot be checked
  ✎  Writing & clarity reviewer       8/10  accept
  ⚔  Adversarial (Reviewer 2)         5/10  major_revisions

  weighted score: 6.53/10
  recommendation: major_revisions

  Revisions requested:
    1. State the independence assumption in Lemma 2 explicitly.
    2. Release the experiment code, or specify conditions precisely enough to rerun.

Why seven reviewers

A single "review this paper" prompt produces a diffuse answer that hedges across every dimension at once. Seven narrow reviewers each have to commit to a position, and the disagreements between them carry information a single pass throws away. The synthesiser reads all seven and reports where they converged and where they split.

Reviewer Remit Weight
Correctness Claims, internal logic, the dependency graph of the argument 1.0
Novelty What is genuinely new against the surrounding literature 0.9
Methodology Baselines, controls, ablations, definitions, honest limitations 1.0
Citations Whether the bibliography does real work; pairs with citeverify 0.7
Reproducibility What an independent researcher would need to verify the claims 0.9
Writing Structure, hedging balance, jargon, clarity for the intended reader 0.6
Adversarial The strongest hostile reading, stated concretely 1.0

Weights reflect what is fixable. Correctness, methodology and the adversarial reading bear on whether the work is right. Prose can be rewritten, so writing carries least.

The weighted score is computed locally from the reviewer scores. The synthesiser does not supply it. It is reproducible from the JSON output and cannot drift with the model's mood. The synthesiser's own score is kept alongside it.

Usage

CLI

refereed review paper.md                          # full panel
refereed review paper.md --json review.json       # machine-readable output
refereed review paper.md --only correctness,adversarial
refereed review paper.md --effort medium          # cheaper bulk pass
refereed review paper.md --context cites.json     # feed in citeverify output
refereed review paper.md --strict minor_revisions # exit 1 if below that bar
refereed reviewers                                # list the panel, no API call

Python

import asyncio
from refereed import review_paper, anthropic_complete

review = asyncio.run(review_paper(
    open("paper.md").read(),
    anthropic_complete(effort="high"),
    title="My paper",
))

print(review.weighted_score)
for r in review.reports:
    if r.ok:
        print(r.name, r.data["score"], r.data["recommendation"])

Failure behaviour

A panel is useful even when part of it fails, so failures are recorded rather than raised:

  • A reviewer that errors or returns unparseable output is marked failed; the other six still report, and the failure is visible in the output.
  • The weighted score is computed from the reviewers that succeeded.
  • A failed synthesis leaves the seven reports intact.

The raw text of an unparseable response is kept so you can see what happened.

Bring your own backend

Model access goes through a single injectable callable. Nothing else in the package touches the network:

async def my_complete(system: str, user: str) -> str:
    return await my_gateway.complete(system=system, user=user)

review = await review_paper(paper, my_complete)

Point it at an internal gateway, a different provider, or a recorded fixture. The entire test suite runs through this seam, so it is a supported path.

Model

Defaults to Claude Opus 4.8 with adaptive thinking, so the model decides how much to reason per reviewer instead of working to a fixed token budget. --effort controls depth and therefore most of the cost: high by default because reviewing is intelligence-sensitive, medium for cheap bulk passes.

The core package is stdlib-only. The Anthropic SDK is an extra, needed only for live reviews, so the panel definitions, prompt construction and parsing can be imported and tested without it.

Limits, and what this is not

This is a reading aid. It does not replace referees, and its output must never be presented as though it had been through peer review.

  • It reads what you give it. It cannot check a claim against an experiment it cannot run, or verify data it cannot see.
  • Novelty assessment is bounded by the model's knowledge. It will miss recent or obscure prior art. Treat a novelty claim as a prompt to go and search.
  • Scores are ordinal at best. Use the concerns and the revision list; treat the number as a sort key.
  • Runs cost money and are non-deterministic. Two runs on the same paper will differ in wording and may differ in score.

Use it to find what you would have missed on your own reread, before a human referee finds it.

Provenance

Developed while reviewing a corpus of roughly 105 papers, and paired with citeverify for the citations reviewer. Extracted from tooling that had to work at that scale.

Development

pip install -e ".[dev]"
pytest        # 27 tests, all offline. No API key required.

Licence

MIT.

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.1.0.tar.gz (16.8 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.1.0-py3-none-any.whl (14.5 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for refereed-0.1.0.tar.gz
Algorithm Hash digest
SHA256 ceee1a26ba273f537b6a22b89663994669d51f065dbfc72da48033340b24c225
MD5 54efbe0d5063e215cea726e88783d01a
BLAKE2b-256 9620a253fcc079fe5b10330b9cd238c40ebbfa189b5097c263380083e3190bdb

See more details on using hashes here.

File details

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

File metadata

  • Download URL: refereed-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 14.5 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.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 63ee70fa9e08089d8bad78550537a6d4da581a9e8f7882d559e9f750255f793e
MD5 91f6f41f4308fd7e8e631e7de3398b18
BLAKE2b-256 c607165abb3acd64f3cb4deb81feedd4e82411af5840830953668e0ecf63ce2c

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