Skip to main content

Reference Python client for the rrxiv protocol.

Project description

rrxiv-python

Reference Python implementation of the rrxiv protocol — parser, client SDK, FastAPI reference server, conformance test suite, and CLI.

Status: v0.1 — on PyPI (pip install rrxiv) and running in production at api.rrxiv.com.

Installation

Install from PyPI (the quotes on the extras are required so the shell doesn't try to glob the brackets):

# Library + parser only
pip install rrxiv

# Author CLI (login + submit): adds keyring credential storage
pip install "rrxiv[cli]"

# Agent identity (Ed25519 request signing, RFC 9421)
pip install "rrxiv[agent]"

# Reference server (FastAPI, uvicorn, ed25519 signatures, sentry, etc.)
pip install "rrxiv[server]"

Extras compose — an author who also runs an agent wants rrxiv[cli,agent].

Or with uv:

uv add "rrxiv[server]"

Quick tour

Parse a paper

rrxiv parse paper/main.tex --output paper.cir.json
rrxiv validate paper.cir.json

Produces a Canonical Intermediate Representation — paper metadata + claims + annotations + claim-graph edges, validated against the JSON Schema in random-walks/rrxiv.

Diff two CIRs locally

rrxiv diff before.cir.json after.cir.json            # human-readable summary
rrxiv diff before.cir.json after.cir.json -f json    # structured output

Semantic diff between two CIR documents: added/removed/changed claims, edge and citation deltas, annotation deltas, and top-level field changes (environment-specific fields like submitted_at are ignored). Useful for checking what a revision actually changes before submitting it. This is purely local — distinct from the server-side RevisionDiff that an instance computes when you submit a revision with rrxiv submit --revision-of <prior_paper_id> (or query GET /papers/{id}/diff?from=<prior>).

Run a local instance

# Memory store (lost on exit) — fastest path to play with the API
rrxiv serve --dev-mode

# Persistent SQLite store with a seed corpus
rrxiv serve \
  --store sqlite:////tmp/rrxiv.db \
  --seed-dir ./seed \
  --port 8765

http://127.0.0.1:8765/api/v0/docs then shows the full OpenAPI; /api/v0/papers lists the seeded corpus.

Bulk-load a corpus

# First boot: seed a fresh DB from a directory of *.cir.json + *.pdf
# + *.source.tar.gz triples
rrxiv seed-store --from ./seed --store sqlite:////data/rrxiv.db

# When claim ids change between releases, --reset wipes the corpus tables
# before re-seeding so no orphan rows linger (dev-only: also drops any
# externally submitted papers + all annotations)
rrxiv seed-store --from ./seed --store sqlite:////data/rrxiv.db --reset

# On a LIVE instance, --preserve-community refreshes only the seed papers
# and keeps every externally submitted paper + all annotations
rrxiv seed-store --from ./seed --store sqlite:////data/rrxiv.db --preserve-community

seed-store also stamps paper.source.uri / paper.source.rendered_pdf_uri with the canonical /api/v0/papers/{id}/{source,pdf} endpoints so the web client can resolve them.

Package layout

  • rrxiv.models — Pydantic v2 models generated from the JSON Schemas (Paper, Claim, Annotation, Citation, CIR, plus enums).
  • rrxiv.parser.tex → CIR. Recognises the rrxiv.cls \claim / \evidence / \dependson markup.
  • rrxiv.client — async + sync HTTP client + retry policy + signature middleware.
  • rrxiv.server — FastAPI app factory + 8 routers (auth, papers, claims, annotations, snapshots, search, submissions, sources). Pluggable Store (memory / sqlite / future Postgres).
  • rrxiv.testinglive_server pytest fixture for running the server against real HTTP.
  • rrxiv.cli — Typer CLI:
    • Authoring: parse, validate, diff, submit, snapshot, doctor.
    • Auth: login (ORCID / agent / anonymous flows, keychain persistence).
    • Ops: serve, seed-store.
    • Read: version, papers {list,get,versions}, claims {list,get,top}, search — added in Sprint 19 so the CLI is a first-class read client, not write-only.
    • Annotations: annotation {validate,post,list,retract,replicate,comment,post-batch}post-batch hits POST /annotations/bulk (up to 100 per request, single rate-limit unit).
  • tests/ — 400+ unit tests + the live cross-conformance test (test_server_cross.py) that runs the protocol-level test suite against the in-process server.

Development

uv sync --all-extras
uv run pytest               # 400+ passed, ~4 skipped
uv run ruff check .
uv run mypy src/

Reference server in production

The Fly.io deployment that powers api.rrxiv.com lives in a separate private repo, rrxiv-instance — it pins a specific rrxiv-python commit, layers on the production Dockerfile + Fly config, and bakes the canonical 9-paper seed corpus into the image. The split is intentional: rrxiv-python stays a library anyone can fork to spin up their own instance; the canonical instance's operational concerns (CORS allowlist, ORCID redirect URIs, Sentry DSNs) belong to the overlay.

If you want to run your own rrxiv instance, fork that repo's structure — don't depend on its config.

Schema sync

Schemas live canonically in random-walks/rrxiv. We vendor them under src/rrxiv/_schemas/ and regenerate Pydantic models from them.

When the canonical schemas change (a new field, a tightened enum, a new schema file), run:

./scripts/sync_schemas.sh                 # default: ../rrxiv/schema   (workspace pattern)
./scripts/sync_schemas.sh /path/to/schema # explicit path

./scripts/regen_models.sh                 # regenerate src/rrxiv/models/_generated/

sync_schemas.sh writes src/rrxiv/_schemas_manifest.txt with the source path, git SHA, branch, and timestamp so you always know which version of the protocol the vendored schemas correspond to.

regen_models.sh uses datamodel-code-generator (a dev dep, declared in pyproject.toml) to emit one Pydantic v2 module per schema into src/rrxiv/models/_generated/. The hand-written src/rrxiv/models/__init__.py re-exports the public surface so from rrxiv.models import Paper, Claim, CIR, ... keeps working when the generator output rearranges itself.

The cross-test in tests/test_models.py loads every fixture from ../rrxiv/tests/schemas/fixtures/ and checks that pydantic agrees with ajv on each. If the two diverge (a fixture passes ajv but fails pydantic, or vice versa), CI fails — that catches both codegen bugs and silent schema drift.

License

MIT (code) — see LICENSE. The protocol spec + schemas in random-walks/rrxiv are CC-BY-4.0.

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

rrxiv-0.2.2.tar.gz (721.2 kB view details)

Uploaded Source

Built Distribution

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

rrxiv-0.2.2-py3-none-any.whl (310.1 kB view details)

Uploaded Python 3

File details

Details for the file rrxiv-0.2.2.tar.gz.

File metadata

  • Download URL: rrxiv-0.2.2.tar.gz
  • Upload date:
  • Size: 721.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for rrxiv-0.2.2.tar.gz
Algorithm Hash digest
SHA256 19c03f23e85d1aa76f37a9b0f1072499c1a4e92e5e68c5436d9b7fab250598f5
MD5 d44985e06adb751223e8f94c265aa62f
BLAKE2b-256 928c0ab02684802df2d5bb60fe3bf5e98e90393eb6e2a80f04709138295b0909

See more details on using hashes here.

Provenance

The following attestation bundles were made for rrxiv-0.2.2.tar.gz:

Publisher: release.yml on random-walks/rrxiv-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rrxiv-0.2.2-py3-none-any.whl.

File metadata

  • Download URL: rrxiv-0.2.2-py3-none-any.whl
  • Upload date:
  • Size: 310.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for rrxiv-0.2.2-py3-none-any.whl
Algorithm Hash digest
SHA256 2e4026bf5e942178e036d7832961350730d27b50b3e6b3dace517061970865c3
MD5 e031db4c5b47f1beb85426c6f306e4ce
BLAKE2b-256 b7834ad5b58d3706554cbc4d9496d45311385fa8358278c9aaf6b7cd37cfbb12

See more details on using hashes here.

Provenance

The following attestation bundles were made for rrxiv-0.2.2-py3-none-any.whl:

Publisher: release.yml on random-walks/rrxiv-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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