Observed since 21 Oct, 10:09 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
AI-powered fact extraction and citation mapping for documents (PDF, Word, web, text)
AI-powered fact extraction and citation mapping for documents — PDF, Word, web pages, and plain text.
Built on FastAPI + Anthropic Claude. Extracts verbatim-quoted facts from documents, maps each quote back to its exact character offset, and optionally assigns PDF page numbers.
pip install ai-citer
Requires Python 3.11+ and a PostgreSQL database.
Set environment variables (or create a .env file):
ANTHROPIC_API_KEY=sk-ant-...
DATABASE_URL=postgresql://user:pass@localhost/ai_citer
ai-citer serve # starts on :3001
ai-citer serve --port 8080 --reload
Or with uvicorn directly:
uvicorn ai_citer.main:app --port 3001
from fastapi import FastAPI
from ai_citer import documents_router
app = FastAPI()
app.include_router(documents_router, prefix="/ai-citer")
Note: the router reads
app.state.pool(asyncpg pool) andapp.state.anthropic_clientfrom the FastAPI app state. Use the lifespan fromai_citer.mainas a reference, or set them up yourself.
import anthropic
import asyncio
from ai_citer import (
create_pool, init_db,
extract_facts, map_citations, assign_page_numbers,
parse_pdf, parse_word, parse_web, parse_text,
)
async def main():
pool = await create_pool("postgresql://localhost/mydb")
await init_db(pool)
client = anthropic.AsyncAnthropic(api_key="sk-ant-...")
# Parse a PDF
with open("report.pdf", "rb") as f:
content = parse_pdf(f.read())
# Extract facts
extraction, usage = await extract_facts(client, content.rawText)
# Map quotes back to character offsets
facts = map_citations(content.rawText, extraction.facts)
print(facts[0].citations[0].charOffset) # exact position in raw text
print(f"Cost: ${usage.costUsd:.4f}")
asyncio.run(main())
When running as a server, the following endpoints are available under /api/documents:
| Method | Path | Description |
|---|---|---|
GET | / | List all documents |
POST | / | Upload a file (multipart/form-data) or URL (url form field) |
GET | /:id | Get a document (includes pdfData for PDFs) |
POST | /:id/extract | Run fact extraction (optional { "prompt": "..." } body) |
GET | /:id/facts | Get all accumulated facts for a document |
POST | /:id/chat | Chat with a document ({ "message": "...", "history": [] }) |
ai-citer ships an MCP server that exposes extraction tools to AI assistants (Claude Desktop, etc.):
ai-citer mcp
Tools: upload_document_url, extract_facts, get_facts, list_documents.
| Variable | Required | Default | Description |
|---|---|---|---|
ANTHROPIC_API_KEY | Yes | — | Anthropic API key |
DATABASE_URL | Yes | — | PostgreSQL connection string |
git clone https://github.com/czawora/ai-citer
cd ai-citer/server
pip install -e ".[dev]"
pytest
Download counts and popularity will appear here as the collector receives them.
| Version | Published | Direct dependencies | Open version |
|---|---|---|---|
| 1.0.4 | 20 Feb 2026 | 18 |
This describes our collected data; it is not a security assessment.
Observed since 21 Oct, 10:09 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:64207db608fc0f29c0e4ce2e7fb90ea5835ad20152bf5af4fd20e0af974c5eb1