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 — running in production at api.rrxiv.com. Not yet on PyPI; install from the git ref.

Installation

Not yet on PyPI — install from the git ref (the quotes are required so the shell doesn't try to glob the extras brackets):

# Library + parser only
pip install "rrxiv @ git+https://github.com/random-walks/rrxiv-python.git"

# Author CLI (login + submit): adds keyring credential storage
pip install "rrxiv[cli] @ git+https://github.com/random-walks/rrxiv-python.git"

# Agent identity (Ed25519 request signing, RFC 9421)
pip install "rrxiv[agent] @ git+https://github.com/random-walks/rrxiv-python.git"

# Reference server (FastAPI, uvicorn, ed25519 signatures, sentry, etc.)
pip install "rrxiv[server] @ git+https://github.com/random-walks/rrxiv-python.git"

Extras compose — an author who also runs an agent wants rrxiv[cli,agent]. Pin a specific commit or branch by appending @<ref> (e.g. .git@main).

Or with uv:

uv add "rrxiv[server] @ git+https://github.com/random-walks/rrxiv-python.git"

Once the package is published to PyPI this shortens to pip install rrxiv (or pip install "rrxiv[cli]", pip install "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.

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

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for rrxiv-0.1.0.tar.gz
Algorithm Hash digest
SHA256 2403149ff9f605a21b6c10f3795540130ddf0c8e074cae97375eb60dc097dee0
MD5 69566c3505b4e261949cc0522c4c83fb
BLAKE2b-256 b1faebb50d7d1094d5c93a64f9628df157c0c75b084b5efd2637f86b2f34b26a

See more details on using hashes here.

Provenance

The following attestation bundles were made for rrxiv-0.1.0.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.1.0-py3-none-any.whl.

File metadata

  • Download URL: rrxiv-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 305.5 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.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 5b5eeed5757033d44084bb7bdb5ae1557d44a90bd79f48385097167377d495c7
MD5 6505497a7d5d012a4ab70666dd84c149
BLAKE2b-256 0928e8fbdaf5fb185aca87db704dcb596f804b6e37b86c635ef329f9e3c158b9

See more details on using hashes here.

Provenance

The following attestation bundles were made for rrxiv-0.1.0-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