Skip to main content

Context infrastructure for AI applications

Project description

Fabra

Context Records for LLM incidents.

Capture what the model saw as a durable artifact you can replay, verify, and diff.
record -> replay -> diff

PyPI version License Python Version


When An LLM Incident Happens

  • Support shares a screenshot.
  • Engineering tries to reconstruct prompts, retrieval, features, and runtime state.
  • Nobody can answer, precisely and repeatably: what did it see, what changed, why did it answer that way?

Fabra's unit of evidence is a context_id (UUID or ctx_<UUID>). Paste it into the ticket, then:

fabra context show <context_id>
fabra context verify <context_id>
fabra context diff <context_id_A> <context_id_B>

Quickstart (No Keys, No Docker)

pip install fabra-ai
fabra demo

fabra demo starts a local server, makes a test request, and prints a working context_id plus the next commands to run.

By default, Context Records are stored durably in DuckDB at ~/.fabra/fabra.duckdb (override with FABRA_DUCKDB_PATH).

Requirements

  • Python >= 3.9
  • pip (or uv, optional)
  • curl (used in quickstart verification commands)
  • Optional:
    • Node.js (only for fabra ui)
    • Docker (only for Docker-based examples / local production stack)

Help and diagnostics:

fabra --help
fabra context --help
fabra doctor

Already using LangChain or calling OpenAI directly? Add receipts without changing your app architecture:

  • docs/exporters-and-adapters.md (LangChain-style callbacks, OpenAI wrapper, logs/OTEL)

What A Context Record Is

A Context Record is a durable artifact for an AI request: assembled content plus lineage (features, retrieval, freshness decisions), and optional integrity metadata.

Create a context_id locally using the shipped example:

fabra serve examples/demo_context.py

In another terminal:

curl -fsS -X POST http://127.0.0.1:8000/v1/context/chat_context \
  -H "Content-Type: application/json" \
  -d '{"user_id":"u1","query":"test"}'

Core workflow (from a context_id):

fabra context show <context_id>
fabra context verify <context_id>
fabra context diff <context_id_A> <context_id_B>
fabra context export <context_id> --bundle -o incident_bundle.zip

incident_bundle.zip includes the exported record (<context_id>.json) plus manifest.json with stored vs computed hashes.

Drop-In Receipts (No Keys)

If you already build prompts but don’t use @context yet, emit a verifiable receipt:

from fabra.receipts import ReceiptRecorder
from fabra.exporters.logging import emit_context_id_json

prompt = "system: ...\nuser: ..."
recorder = ReceiptRecorder()
receipt = recorder.record_sync(
    context_function="my_llm_call",
    content=prompt,
    inputs={"model": "gpt-4.1-mini"},
)
emit_context_id_json(receipt.context_id, source="my-service", ticket="INC-1234")

Two Entry Points

ML Engineers (Features)

Define features in Python and serve them over HTTP.

from fabra import FeatureStore, entity, feature
from datetime import timedelta

store = FeatureStore()

@entity(store)
class User:
    user_id: str

@feature(entity=User, refresh=timedelta(hours=1))
def purchase_count(user_id: str) -> int:
    # Replace with a real DB call
    return 47
fabra serve features.py   # or: fabra serve examples/demo_features.py
curl localhost:8000/features/purchase_count?entity_id=u123
# {"value": 47, "freshness_ms": 0, "served_from": "online"}

AI Engineers (Context)

Assemble prompts with features + retrieval, with lineage and budgets.

from fabra import FeatureStore
from fabra.context import context, ContextItem

store = FeatureStore()

@context(store, max_tokens=4000, freshness_sla="5m")
async def build_prompt(user_id: str, query: str) -> list[ContextItem]:
    # Replace with your feature calls and retriever / RAG call
    tier = "premium"
    docs = "..."
    return [
        ContextItem(content=f"User tier: {tier}", priority=1),
        ContextItem(content=docs, priority=2),
    ]

ctx = await build_prompt("user_123", "question")
print(ctx.id)
print(ctx.lineage)

CLI (Most Used)

fabra demo                          # start demo + print a context_id
fabra context show <id>             # inspect a record (or best-effort legacy view)
fabra context verify <id>           # verify CRS-001 hashes (fails if unavailable)
fabra context diff <a> <b>          # compare two contexts
fabra context export <id>           # export json/yaml
fabra context export <id> --bundle  # zip bundle for incident/audit
fabra doctor                        # local diagnostics
fabra serve <file.py>               # run server for examples/your code
fabra deploy fly|cloudrun|ecs        # generate deployment config
fabra ui <file.py>                  # local UI (requires Node.js)

Note: fabra ui requires Node.js. If you’re running from source, install UI deps with cd src/fabra/ui-next && npm install.


What Fabra Is / Isn’t

Fabra is infrastructure for inference-time evidence (Context Records) and serving (features/context).

Fabra is not:

  • an agent framework
  • a monitoring dashboard
  • a no-code builder

See docs/quickstart.md, docs/context-record-spec.md, and docs/comparisons.md for details.


Try in Browser · Quickstart · Docs

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

fabra_ai-2.2.0.tar.gz (841.9 kB view details)

Uploaded Source

Built Distribution

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

fabra_ai-2.2.0-py3-none-any.whl (215.7 kB view details)

Uploaded Python 3

File details

Details for the file fabra_ai-2.2.0.tar.gz.

File metadata

  • Download URL: fabra_ai-2.2.0.tar.gz
  • Upload date:
  • Size: 841.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for fabra_ai-2.2.0.tar.gz
Algorithm Hash digest
SHA256 2378efdcf956d68e7370f1fd54badfc56ce06d4da682107f860466d85972d888
MD5 1f9da5a55a8a8a54f7771b209903444b
BLAKE2b-256 ca7e204743eae4baa4e35cf98705f64caa73316be55067eb2ccf950afd86a7db

See more details on using hashes here.

Provenance

The following attestation bundles were made for fabra_ai-2.2.0.tar.gz:

Publisher: release.yml on davidahmann/fabra

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

File details

Details for the file fabra_ai-2.2.0-py3-none-any.whl.

File metadata

  • Download URL: fabra_ai-2.2.0-py3-none-any.whl
  • Upload date:
  • Size: 215.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for fabra_ai-2.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 a29ddc1a7a7008d10288241bdf7e4f5c132cc6d4e5ca111915b26e2315987f66
MD5 113f41538d163053a5e7129353f20580
BLAKE2b-256 e1c67ea758b61ff8f82bf710eab117700c71e0a950cebf6c5396f001cee50617

See more details on using hashes here.

Provenance

The following attestation bundles were made for fabra_ai-2.2.0-py3-none-any.whl:

Publisher: release.yml on davidahmann/fabra

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