Stop Debugging AI Decisions You Can't Reproduce
When your AI gives a bad answer, you need to know: What did it see? What got dropped? Fabra turns "the AI was wrong" into a fixable ticket.
pip install fabra-ai🔄
Replay Any Decision
See exactly what your AI knew at any point in time. Reproduce incidents in seconds.
📋Shareable Tickets
Turn 'it was wrong' into a Context Record you can share, diff, and fix.
🚀Ship Confidently
Debug regressions before they hit production. Know what changed between decisions.
🔍Explain Dropped Items
Know exactly what got cut due to token limits — and why.
⚡30-Second Setup
pip install, no Kubernetes. DuckDB locally, Postgres in production.
🛡️Prove What Happened
Cryptographic integrity. When compliance asks, you have the answer.
30-Second Quickstart
features.py
from fabra.core import FeatureStore, entity, feature
from fabra.context import context, ContextItem
from fabra.retrieval import retriever
store = FeatureStore()
@entity(store)
class User:
user_id: str
@feature(entity=User, refresh="daily")
def user_tier(user_id: str) -> str:
return "premium" if hash(user_id) % 2 == 0 else "free"
@retriever(index="docs", top_k=3)
async def find_docs(query: str):
pass # Automatic vector search
@context(store, max_tokens=4000)
async def build_prompt(user_id: str, query: str):
tier = await store.get_feature("user_tier", user_id)
docs = await find_docs(query)
return [
ContextItem(content=f"User is {tier}.", priority=0),
ContextItem(content=str(docs), priority=1),
]$ fabra serve features.pyWhy Fabra?
| Without Fabra | With Fabra | |
|---|---|---|
| Can you prove what happened? | Logs, maybe | Full Context Record |
| Can you replay a decision? | No | Yes, built-in |
| Why did it miss something? | Unknown | Dropped items logged |
| Incident resolution | Hours of guesswork | Minutes with replay |
Ready to stop guessing?
From pip install to replayable AI decisions in 30 seconds.
Read the Quickstart Guide