Skip to main content

fitz-sage

Fully local governed RAG for code, documents, and tables.

No LLM API key or GPU required.

Python 3.10+ PyPI version License: MIT Version Coverage

Benchmarks • EvidencePack • Why fitz-sage? • Retrieval Intelligence • Governance • Limitations • Documentation • GitHub



Q: "Who won the 2024 FIFA World Cup?"
(There was no World Cup in 2024.)
❌ Uncalibrated RAG systems
A: "Germany won the 2024 FIFA World Cup,
    defeating Argentina 1-0 in the final."
🛡️ fitz-sage
A: "I don't have enough information
    to answer this question."
    Related topics in the knowledge base:
      - FIFA tournament history
      - 2022 World Cup coverage
    To answer this, consider adding:
      - Documents covering 2024 FIFA events.

→ fitz-sage returns governed evidence, explains insufficiency, and shows what source coverage is missing.


Where to start 🚀

pip install fitz-sage

# From a docs folder, --source is optional.
fitz retrieve "What is our refund policy?" --source ./docs

The result is an EvidencePack: relevant source units, provenance, a governance verdict, and the signals needed to decide what your application should do next.


About

fitz-sage is a retrieval engine for local knowledge bases. It indexes code, documents, and tables into typed source units, retrieves the units relevant to a question, reranks them, and returns a governed EvidencePack that downstream software can inspect, display, store, or pass to a synthesizer.

⭐ The retrieval architecture is KRAG (Knowledge Routing Augmented Generation). Code is parsed as symbols, documents as sections, and tables as SQLite-backed data. Queries are routed across those typed surfaces with retrieval strategies that match the source structure.

⭐ Governance is enforced by pyrrho in local CPU forward passes. fitz-sage starts with the first three ranked sources and adds two only while pyrrho returns INSUFFICIENT.

Yan Fitzner — (LinkedIn, GitHub, HuggingFace).

fitz-sage honest_rag


Why fitz-sage?

EvidencePack as the contract 🧾

Every query returns ranked source evidence, provenance, governance reasons, and retrieval metadata. Use it directly in APIs, CLIs, dashboards, agents, or pass it to an LLM for answer generation with explicit governance metadata.

Asymmetric indexing 🗂️ → KRAG (Knowledge Routing Augmented Generation)

Source files become typed retrieval units: code symbols, document sections, and tables. Each unit type keeps the structure needed to retrieve it well.

Query-ready indexing 🐆 → Searchable Index

point() parses and stores supported files before returning. Retrieval can start immediately afterward while the background worker adds optional entity and hierarchy metadata.

Keyword expansion from your corpus 🧩 → Semantic Query Expansion

Each collection learns its own abbreviations, explicit aliases, identifier forms, and related terms. fitz-sage keeps the literal query and adds only source-backed terms to BM25 recall—without an LLM or global synonym list.

Pyrrho-governed retrieval 🧭 → Pyrrho docs

fitz-sage combines deterministic query shape with pyrrho PRE obligations before retrieval, then pyrrho judges the selected evidence after reranking. The retrieval profile, reasons, and missing-evidence signals travel with the EvidencePack, so callers know whether to answer, show conflict, retrieve more, or ask for more source material.

Queries that actually work 📊

Exact identifiers, temporal scopes, comparisons, aggregation requests, code lookups, table questions, and broad overview queries all flow through retrieval intelligence built into the engine.

Tabular data that is actually searchable 📈 → Unified Storage

Native CSV/TSV rows live in SQLite with schema detection, row-value BM25, and deterministic row grounding. Optional configured chat tiers can generate SQL for one retrieved table. Embedded document tables remain section text.

Fully local execution possible 🏠

SQLite storage, corpus-derived semantic expansion, ONNX reranking, and ONNX pyrrho governance all run locally. Optional synthesis can use any local or cloud OpenAI-compatible endpoint.


Traditional documents, source code, and tables have different structure. FitzKRAG preserves that structure during indexing and retrieval.


Retrieval Unit Extracted From How It Works
Symbols 🖌️ Python, TypeScript/JavaScript, Go, Java AST/tree-sitter strategies extract addressable names, ranges, references, and file import edges.
Sections 📑 PDF, DOCX, PPTX, Markdown, text, config, markup Parsed source text becomes sections with headings, ranges, and parent/child context; summaries are optional background metadata.
Tables 📅 Configured delimited files (.csv, .tsv by default) Native SQLite rows with schema lookup, row-value BM25, deterministic grounding, and optional generated SQL.


Retrieval Intelligence

Retrieval Docs • Three-Stage Strategy • Retrieval Pipeline • Evidence Signals

fitz-sage runs retrieval as a typed, governed pipeline:


Stage What happens
0. User Query ❓ User asks:
"What are the company policies?"
1. Broad Recall 🔎 Finds candidate evidence:
Doc B, Doc C, Doc E, Doc H, Doc L
2. Rerank 🎯 Reorders by relevance:
Doc E, Doc B, Doc H, Doc L, Doc C
3. Sufficiency Check 🛡️ Adds evidence until the user query is sufficiently supported:
User query + Doc E → ❌
User query + Doc E + Doc B → ❌
User query + Doc E + Doc B + Doc H → ✅
4. Synthesis (optional) 💡 Verified evidence can be passed to an LLM:
LLM(User query, Doc E, Doc B, Doc H)

The query-ready path is keyword-first: exact query terms, collection-derived semantic terms, and BM25. Enriched collections can additionally use hierarchy summaries, entity links, and broader context expansion.

Built-in intelligence handles the edge cases that break simple search:


Feature Query What fitz-sage Uses
✅ epistemic-honesty "What was our Q4 revenue?" pyrrho verdict and insufficient-evidence reasons
✅ keyword-vocabulary "Find TC_1000" Literal identifier search
✅ sparse-search "error code E_AUTH_401" SQLite FTS5 + native bm25()
✅ hierarchical-rag "What are the design principles?" Hierarchical summaries when enrichment has produced them
✅ multi-query [User pastes 500-char test report] "What failed and why?" Multi-query decomposition
✅ comparison-queries "Compare React vs Vue performance" Multi-entity retrieval coverage
✅ entity-graph "What else mentions AuthService?" Entity links for enriched source files
✅ temporal-queries "What changed between Q1 and Q2?" Temporal scope detection
✅ aggregation-queries "List all the test cases that failed" Exhaustive/list query handling
✅ freshness-authority "What's the latest status on feature X?" Content-grounded temporal scope; no filesystem-age scoring
✅ semantic-keywords "What does SLA require?" Collection-local SQLite term graph; literal query retained
✅ reranking "What's the battery warranty?" ONNX cross-encoder reranker

Fitz-Sage does not rewrite conversational or ambiguous queries. Rewrite those queries before submitting them when the question depends on context that is not present in the query itself. See Limitations.


📦 Benchmarks

Full Benchmark Report • Reproduce the Benchmarks • Production Readiness • Measured Limitations

Benchmarks start with source files and report retrieval, delivery, ingestion, and latency separately.

Area Scale Current measurement
Production retrieval and delivery 192 required contracts 189/192 compiled; 175/192 delivered
Production capability 252 cases 249/252 (98.8%); gate passed
Query-shape recognition 60 cases 60/60
Intentional limitations 52 evidence-asserted cases 51/52 compiled; 48/52 delivered
Frozen ArguAna term-graph ablation 8,674 documents, 120 queries literal 0.4413; graph 0.4413; reranker 0.4562; full 0.4563 final / 0.3357 delivered nDCG@10
Production query latency 252 queries 1.19s mean; 0.77s p50; 3.35s p95
Term-graph query overhead 120 ArguAna queries 0.05–0.07s internal mean
Historical broad BEIR (pre-term-graph) 66,454 documents, 1,271 queries 0.4239 delivered nDCG@10
Historical EnterpriseRAG-Bench (pre-term-graph) 511,961 documents, 328 holdout queries 0.5780 delivered nDCG@10
Local source indexing 18 core / 93 mixed files 60.8 / 51.6 files/s
NapierOne scale ingestion 5,005 real files 4,994 indexed at 7.27 files/s; recovery passed
SciFact query latency 60 matched queries 7.43s mean; 6.77s p50; 12.56s p95
Enterprise warm query probes 511,961-file index 13.092s and 19.889s

nDCG@10 measures ranking quality in the first ten results; it is not an accuracy percentage. Full methodology, component results, timings, and interpretation are in the benchmark report.


📦 EvidencePack → Full Contract

Evidence Pack Contract • Evidence Signals

EvidencePack is the output contract of fitz-sage.

It gives you the relevant sources and the governance signals around them. You can show it directly, pass it to a model, trigger a workflow from it, or store it as an audit artifact.

The source items are the evidence. The signals around them explain how fitz-sage searched before retrieval and what pyrrho judged after retrieval.

Pre-retrieval 🔎

Before retrieval, fitz-sage builds a search plan from deterministic query analysis, the collection term graph, and explicit query clauses.

Signal What it means Why it matters
query_type / analysis_type Narrow lookup, comparison, temporal, aggregation, broad overview, or general query shape. Sets recall breadth and evidence coverage.
keywords Evidence-backed collection expansions and literal deterministic query terms. Adds collection-specific lexical candidates without embeddings.
strategy_weights Relative weight for code, section, and table retrieval. Makes the first pass search the right evidence surfaces.
top_k / top_read How much candidate evidence fitz-sage should collect and read. Keeps narrow lookups fast while giving broad or comparative questions enough coverage.
rerank_candidates How many recalled candidates the cross-encoder scores. Bounds neural CPU cost without shrinking the BM25 recall pool used by evidence rescue.

Post-retrieval 🛡️

After retrieval, reranking, closure, and compilation, fitz-sage sends pyrrho the first three ranked items. An exact INSUFFICIENT verdict adds the next two; SUFFICIENT or DISPUTED stops immediately. These signals tell you whether the result is usable.

Signal What it means What you can do with it
mode Mechanical fitz-sage mapping of pyrrho's SUFFICIENT, DISPUTED, or INSUFFICIENT verdict. Gate generated answers, UI display, automation, or human review.
reasons Plain-language explanation for the verdict. Show users why fitz-sage judged evidence sufficient, disputed, or insufficient.
evidence_verdict Verdict: SUFFICIENT, DISPUTED, or INSUFFICIENT. Inspect the evidence judgment.
failure_mode Reason when evidence is insufficient or disputed. Explain why the evidence cannot safely support a clean answer.
retrieval_intents Evidence intent metadata such as lookup, temporal resolution, comparison, or broad coverage. Decide whether another retrieval pass should focus on coverage, time, lookup, or comparison.
evidence_kinds Evidence-surface metadata such as text, table, code, config, logs, or document layout. Decide which evidence surface is missing or should be emphasized.

This is why fitz-sage is useful as infrastructure: the package returns source evidence plus enough judgment to decide the next action.

Retrieval execution records

When an EvidencePack is not enough to diagnose a result, RetrievalRun records the actual query plan, term origins, candidate stages, compiled ranking, evaluated evidence prefixes, exact pyrrho outputs, and runtime fingerprints from the same execution.

fitz retrieve "Which test failed?" -c reports --trace run.json
fitz explain run.json

Trace exports redact source bodies by default. Content-bearing traces are an explicit opt-in and enable pyrrho-only replay over frozen evidence. See Retrieval Execution Records.


📦 Governance — Pyrrho → Feature Docs

Feature docs • pyrrho on Hugging Face • fitz-gov on Hugging Face

pyrrho is the local governance model behind fitz-sage. Its default CPU-local ONNX ModernBERT model yafitzdev/pyrrho-v2-nano-g1 is pinned to an immutable Hub revision and cached by fitz-sage through the standard Hugging Face cache.


  Query
    │
    ▼
  RetrievalProfile → broad recall → rerank
    │
    ▼
  Ranked evidence prefix (first 3)
    │
    ▼
  Pyrrho authoritative decision
    ├── SUFFICIENT / DISPUTED ───────────────────────→ EvidencePack
    ├── INSUFFICIENT + exhausted ────────────────────→ EvidencePack
    └── INSUFFICIENT + evidence remains → add next 2 ──┐
                ▲                                      │
                └──────────────────────────────────────┘

Signal Purpose
evidence_verdict Evidence judgment: SUFFICIENT, DISPUTED, or INSUFFICIENT.
failure_mode Reason when evidence is insufficient or disputed.
retrieval_intents Evidence intent metadata, such as lookup, temporal resolution, comparison, or broad coverage.
evidence_kinds Evidence-surface metadata, such as text, table, code, config, logs, or document layout.

fitz-sage passes every ranked prefix to pyrrho unchanged. Its managed ONNX adapter applies the model's fixed input and head-decoding contract, maps the resulting verdict into AnswerMode, and returns the stopping prefix plus the exact serialized decisions with the EvidencePack. Applications can answer, retry, show conflict, or request more source material.


The model adapter fails closed on known contract violations 🛡️

fitz-sage's managed pyrrho adapter checks the model artifact, label order, ONNX width, token limits, graph parity, and verdict/failure compatibility before or during inference. These checks reduce unsafe failure modes; they are not a substitute for clean-data evaluation or threshold calibration.

No LLM on the governance path ⏱️

pyrrho is a local encoder forward pass. Governance does not require an external chat model.


📦 Limitations → Full Measured Contract

fitz-sage targets reasonably clean, supported documents. The complete contract and case-level evidence are in docs/LIMITATIONS.md.

Boundary Current behavior Responsibility
Query rewriting Conversational, ambiguous, or context-dependent questions must be rewritten before submission user
Private vocabulary Corpus-stated aliases are learned; undocumented mappings are not inferred user
Raw logs and scans Logs need compression; scans need an OCR/vision parser user
Long or unrelated requests Query scope, retrieval budgets, and evidence sufficiency interact user + fitz-sage + pyrrho
Governance context pyrrho currently accepts up to 2,048 tokens pyrrho
Identifier forms Observed identifiers gain mechanical forms such as AuthService ↔ Auth Service fitz-sage
Multi-document ranking Weaker than single-document ranking on the enterprise holdout fitz-sage
Extreme file counts Public re-pointing still walks and hashes every source file fitz-sage

📦 Quick Start

governance: pyrrho uses the accepted immutable default. Advanced users may instead configure pyrrho/<absolute-local-path> or an explicitly pinned pyrrho/<owner/repo@40-character-commit>.

CLI

pip install fitz-sage

fitz retrieve "Your question here" --source ./docs

fitz-sage creates a local retrieval config on first run:

  1. SQLite storage and a collection-local term graph.
  2. Managed local models for reranking and pyrrho governance.
  3. Optional configured providers for enrichment and generated features.

For generated prose from the governed evidence:

fitz answer "..." --endpoint http://localhost:8080/v1 \
                --synthesizer endpoint/gpt-oss-20b
fitz answer "..." --endpoint https://api.together.xyz/v1 \
                --synthesizer endpoint/meta-llama-3.1-70b \
                --api-key-env TOGETHER_API_KEY

Python SDK

import fitz_sage

pack = fitz_sage.evidence("Where is pyrrho governance implemented?", source="./fitz_sage")

print(pack.mode)
for item in pack.items:
   print(item.file_path, item.address_location)

The SDK provides:

  • Module-level evidence() matching fitz retrieve
  • Module-level answer() for generated prose from evidence
  • Local config creation
  • Full provenance tracking
  • Governance metadata

For advanced use with multiple collections:

from fitz_sage import fitz

physics = fitz(collection="physics")
pack = physics.evidence("Explain entanglement", source="./physics_papers")

Fully Local (Managed ONNX)

pip install fitz-sage

fitz retrieve "Your question here" --source ./docs

With the default retrieval-only config, reranking, governance, query-time expansion, and optional background enrichment run locally, so fitz retrieve does not send data to an endpoint. Explicitly configured synthesis, background enrichment, or vision parsing can send source content to that endpoint.

Optional synthesis can use vLLM, LM Studio, Ollama in /v1/ mode, TabbyAPI, OpenAI, Together, Groq, Fireworks, OpenRouter, or any endpoint that speaks the OpenAI HTTP protocol.


📦 Real-World Usage

fitz-sage is a retrieval foundation. It manages indexing, search, reranking, pyrrho integration, and provenance so products can build on source evidence.


Chatbot Backend 🤖

Connect fitz to Slack, Discord, Teams, or your own UI. The bot can show source-backed evidence, ask for more documents when pyrrho marks evidence insufficient, or call fitz answer for generated prose.

Example: A support bot retrieves policy sections, shows links to the relevant docs, and only synthesizes when the evidence verdict is sufficient.


Internal Knowledge Base 📖

Point fitz at your wiki, policies, runbooks, and repos. Employees ask natural-language questions and get source units with provenance.

Example: New hires ask "How do I request PTO?" and receive the exact policy section plus the governance verdict.


Continuous Intelligence & Alerting (Watchdog) 🐶

Run scheduled queries over changing folders, logs, reports, or exports. Trigger alerts when the evidence pack contains sufficient sources, disputes, or missing-coverage signals.

Example: A nightly job asks "Were there failed logins from unusual locations?" and sends the evidence pack to the on-call channel.


Web Knowledge Base 🌎

Scrape web pages to disk, point fitz at the folder, and query the resulting corpus with provenance.

Example: A research workflow scrapes reports, stores them locally, and asks comparative or temporal questions across the collected source set.


Codebase Search 🐍 → Code Symbol Extraction • KRAG

Code retrieval:

Tree-sitter parses your codebase into symbols with qualified names, references, and import graphs. Function and class lookup is address-based, and dependency questions can use graph expansion.

Example: A team asks "Where is user authentication handled?" and receives specific functions, files, and symbol addresses rather than generic file snippets.


📦 Architecture → Full Architecture Guide
┌─────────────────────────────────────────────────────────────────┐
│                         fitz-sage                               │
├─────────────────────────────────────────────────────────────────┤
│  User Interfaces                                                │
│  CLI: retrieve | explain | replay | answer | collections | serve│
│  SDK: fitz_sage.evidence(source=...)                            │
│  API: /answer | /evidence | /chat | /collections | /health      │
├─────────────────────────────────────────────────────────────────┤
│  Engine                                                         │
│  FitzKRAG: typed retrieval over code, documents, and tables     │
├─────────────────────────────────────────────────────────────────┤
│  Evidence Contract                                              │
│  EvidencePack: items | mode | reasons | timings | metadata      │
├─────────────────────────────────────────────────────────────────┤
│  Pyrrho                                                         │
│  evidence verdict | failure mode | evidence metadata            │
├─────────────────────────────────────────────────────────────────┤
│  Local CPU Models                                               │
│  ONNX reranker | SQLite semantic term graph | Pyrrho           │
├─────────────────────────────────────────────────────────────────┤
│  Storage                                                        │
│  SQLite + FTS5, one .db per collection                          │
├─────────────────────────────────────────────────────────────────┤
│  Optional OpenAI-Compatible Endpoint                            │
│  answer synthesis | background enrichment | vision              │
└─────────────────────────────────────────────────────────────────┘

📦 CLI Reference → Full CLI Guide
fitz retrieve "question" --source ./docs     # Return governed evidence
fitz retrieve "question"                     # Use current folder or existing collection
fitz retrieve "question" --format json    # Evidence with script-friendly controls
fitz answer "question" --synthesizer ...  # Generated prose from evidence
fitz collections                          # List and delete knowledge collections
fitz serve                                # Start REST API server

Config: .fitz/config.yaml in the current workspace - auto-created on first run. Edit it for optional synthesis, vision, or custom model/provider choices.


📦 Python SDK Reference → Full SDK Guide

Simple usage (module-level, matches CLI):

import fitz_sage

pack = fitz_sage.evidence("What is the refund policy?", source="./docs")
print(pack.mode)

Advanced usage (multiple collections):

from fitz_sage import fitz

# Create separate instances for different collections
physics = fitz(collection="physics")
legal = fitz(collection="legal")

# Retrieve evidence from each collection
physics_pack = physics.evidence("Explain entanglement", source="./physics_papers")
legal_pack = legal.evidence("What are the payment terms?", source="./contracts")

Working with evidence:

pack = fitz_sage.evidence("Where is pyrrho governance implemented?", source="./fitz_sage")

print(pack.mode)  # runtime AnswerMode: SUFFICIENT, DISPUTED, or INSUFFICIENT
print(pack.reasons)

for item in pack.items:
    print(item.file_path, item.address_location, item.line_range)

📦 REST API Reference → Full API Guide

Start the server:

pip install fitz-sage[api]

# Initialize the workspace and collection once
fitz retrieve "What is indexed?" --source ./docs

fitz serve                    # localhost:8000
fitz serve -p 3000            # custom port
$env:FITZ_API_KEY = "replace-with-a-random-secret"
fitz serve --host 0.0.0.0     # remote access requires the API key

Interactive docs: Visit http://localhost:8000/docs for Swagger UI.


Endpoints:

Method Endpoint Description
POST /answer Return an optional synthesized answer
POST /evidence Return governed evidence without synthesis
POST /chat Return generated prose from retrieved evidence
GET /collections List all collections
GET /collections/{name} Get collection stats
POST /collections/{name}/documents Build/update the searchable source index
GET /collections/{name}/status Inspect source-index and enrichment status
DELETE /collections/{name} Delete a collection
GET /health Health check

Example request:

/answer and /chat require a configured synthesizer. /evidence does not.

curl -X POST http://localhost:8000/answer \
  -H "Content-Type: application/json" \
  -d '{"question": "What is the refund policy?", "collection": "default"}'

📦 FAQ / Troubleshooting

fitz command not found after install

Your Python Scripts directory is not on PATH. Use python -m fitz_sage.cli.cli, or add the Scripts directory to PATH.

PDF/DOCX/PPTX files are being skipped

The base install reads embedded text from these formats. Image-only files need an OCR-capable parser. parser: glm_ocr expects a local Ollama glm-ocr model; install fitz-sage[docs] only when you explicitly select a Docling parser.

"Connection refused at localhost:8080" error

This applies to optional endpoint-backed synthesis or vision parsing. fitz retrieve "..." returns evidence without an endpoint server. For generated prose: fitz answer "..." --synthesizer openai/gpt-4o.

"Model not found" error

The model name in your config does not match what your server has loaded. Check /v1/models on your server: curl http://localhost:8080/v1/models. Then update synthesizer in .fitz/config.yaml.

First query is slow

First run initializes storage, downloads managed local models if needed, and builds the query-ready index. Later queries reuse the collection.

How do I change my LLM endpoint or model?

Edit .fitz/config.yaml:

synthesizer: endpoint/gpt-oss-20b
chat_base_url: http://localhost:8080/v1

Or override at the CLI:

fitz answer "..." --endpoint http://localhost:8080/v1 --synthesizer endpoint/gpt-oss-20b

How do I use a cloud provider?

Either use the openai preset:

synthesizer: openai/gpt-4o
# OPENAI_API_KEY in env

Or any OpenAI-compatible cloud via the endpoint provider:

synthesizer: endpoint/meta-llama-3.1-70b
chat_base_url: https://api.together.xyz/v1
chat_api_key_env: TOGETHER_API_KEY

See docs/features/platform/openai-compatible-endpoint.md.

How do I reset everything?

Delete the .fitz/ directory in your project root. Next run will initialize a fresh workspace.


License

MIT


Documentation:

Metadata

Release files for fitz-sage 0.16.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for fitz-sage 0.16.2
File Size Uploaded
fitz_sage-0.16.2.tar.gz 336.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for fitz-sage 0.16.2
File Interpreter ABI Platform
fitz_sage-0.16.2-py3-none-any.whl Python 3 none any Details

Total release size: 734.1 kB

Release files / fitz_sage-0.16.2.tar.gz

Download URL fitz_sage-0.16.2.tar.gz
Size 336.4 kB
Tags Source
SHA-256 checksum
How to use checksums
c9510d04bbb9dd867a21bee95cb9244d1d6574926eed29741e62eb5c8ee05321
BLAKE2b-256 checksum
How to use checksums
15f4747580267ff0917c0188c4ad3908e5e008093618c1d1521685cda4f3b8ff
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 21, 2026.

Transparency log

Release files / fitz_sage-0.16.2-py3-none-any.whl

Download URL fitz_sage-0.16.2-py3-none-any.whl
Size 397.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
a9c53420fe99c953496c8c10a2812433a3b0f5dc311af091e87b322269c30ebb
BLAKE2b-256 checksum
How to use checksums
11c26bcc9219e2e43d49e211650c4248bc39abf52dcbcd1fed69e4b34a41a333
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 21, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.16.2 This release

2 release files

0.16.1

2 release files

0.14.0

2 release files

0.13.0

2 release files

0.12.0

2 release files

0.11.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page