docker compose up.Open-source LLM observability
Know exactly what your AI feature just did.
Anvil traces every AI request span by span — each retrieval, prompt, and model call with the tokens and dollars it burned. Ten lines of SDK. Self-hosted. MIT.
docker compose up · no caps, no nags, no data leaving your network
Everything a production AI feature needs to explain itself.
Waterfall tracing
The full execution tree of every AI request — nested spans, latency proportions, and the slowest span highlighted so you look there first.
Cost per request
Token counts and dollar cost on every model call, rolled up per trace. Know which feature burns the budget before the invoice does.
Kill-safe SDKs
Python and TypeScript. If Anvil goes down, your app doesn't: traces buffer client-side and the backlog drains itself on reconnect.
Search & filters
Free-text search over prompts and outputs, plus filters on status, model, and your own metadata. Errors are one click away.
Self-hosted & MIT
docker compose up gives you the whole platform on your own hardware. No caps, no nags, and your prompts never leave your network.
Evals & monitors
Promote real traces into datasets, score them with graders and LLM judges, gate CI on regressions, and catch drift in live traffic.
Instrumentation is a decorator, not a migration.
Wrap the function that serves your AI feature. Nested calls — the retriever, the prompt build, the model — become spans on their own. LangChain apps get a callback handler instead.
from anvil_sdk import Anvil, observe
anvil = Anvil(api_key="ak_...")
@observe(anvil, name="answer_question")
def answer(q: str) -> str:
docs = retriever.search(q) # retrieval span
return llm.invoke(prompt(docs)) # llm span, tokens + costYour next incident is already traced.
Spin up Anvil beside your app tonight and read tomorrow's weird answer span by span.