Hosted demo — data is shared and may be reset. Want your own? Clone the repo and run 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

anvil.local/traces/8f3a1c92
answer_questionok1.84 s · $0.0041 · 1.9k tok

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

coming

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.

app.pypython
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 + cost

Your next incident is already traced.

Spin up Anvil beside your app tonight and read tomorrow's weird answer span by span.