BLACKBOX
flight recorder for AI agents
LIVE INGEST ACTIVITY
4
RUNS VIA OTLP
12
EVENTS INGESTED
3
SERVICES SEEN
Wed, 17 Jun 2026 01:11:09 GMT
LAST INGEST
SERVICERUNSLAST SEEN
otel-anthropic-demo1Wed, 17 Jun 2026 01:11:09 GMT
otel-test-agent2Tue, 16 Jun 2026 04:09:06 GMT
smoke-test1Tue, 14 Nov 2023 22:13:20 GMT
ZERO-FRICTION INSTRUMENTATION

Any provider. Any framework.
One line to record.

BLACKBOX speaks OpenTelemetry GenAI semantic conventions natively. Point your existing OTel exporter here — no SDK changes, no code rewrites, no vendor lock-in. Every LLM call becomes a tamper-evident chain event.
INGEST ENDPOINThttps://blackbox-gold.vercel.app /v1/otel/tracesOTLP/HTTP · JSON · POST
SUPPORTED PROVIDERS
Anthropic
opentelemetry-instrumentation-anthropic
OpenAI
opentelemetry-instrumentation-openai
Gemini
opentelemetry-instrumentation-google-generativeai
LangChain
opentelemetry-instrumentation-langchain
LlamaIndex
opentelemetry-instrumentation-llamaindex
Bedrock
opentelemetry-instrumentation-bedrock
Compatible with any library that emits gen_ai.* attributes per the OpenTelemetry GenAI semantic conventions — including LangSmith, Traceloop, and any custom OTLP exporter.
HOW OTLP SPANS MAP TO BLACKBOX EVENTS
OTLP SPANBLACKBOX EVENTFIELDS LIFTED
First span in traceGENESISservice.name, model, temperature, deployment.environment
gen_ai.operation: chatREASONINGtokens_in/out, latency, cost, prompt preview
gen_ai.operation: toolTOOL_CALLtool name, input/output
gen_ai.operation: embeddingsRETRIEVALmodel, token count
Span with completion eventOUTPUTcompletion text, tokens, cost
Each OTel trace becomes one BLACKBOX run. Re-submitting the same trace is idempotent — only new spans are appended. The chain is always append-only.
SETUP — 3 LINES OF PYTHON
# pip install opentelemetry-instrumentation-anthropic opentelemetry-sdk anthropic
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import SimpleSpanProcessor, SpanExporter, SpanExportResult
from opentelemetry.instrumentation.anthropic import AnthropicInstrumentor
import json, ssl, urllib.request

# BLACKBOX accepts OTLP/HTTP JSON — ship a thin exporter that converts spans to JSON
class BlackboxExporter(SpanExporter):
    def export(self, spans):
        payload = {"resourceSpans": [{"resource": {"attributes": [
            {"key": "service.name", "value": {"stringValue": "my-agent"}}]},
            "scopeSpans": [{"spans": [{"traceId": format(s.context.trace_id,"032x"),
                "spanId": format(s.context.span_id,"016x"), "name": s.name,
                "startTimeUnixNano": str(s.start_time), "endTimeUnixNano": str(s.end_time),
                "attributes": [{"key":k,"value":{"stringValue":str(v)}}
                               for k,v in (s.attributes or {}).items()],
            } for s in spans]}]}]}
        req = urllib.request.Request("https://blackbox-gold.vercel.app
/v1/otel/traces",
            data=json.dumps(payload).encode(),
            headers={"Content-Type": "application/json"}, method="POST")
        urllib.request.urlopen(req, timeout=10)
        return SpanExportResult.SUCCESS
    def shutdown(self): pass

provider = TracerProvider()
provider.add_span_processor(SimpleSpanProcessor(BlackboxExporter()))
trace.set_tracer_provider(provider)
AnthropicInstrumentor().instrument()

# That's it. Every Anthropic call is now sealed to BLACKBOX.
# Full working example: github.com/Leclezio69/blackbox/blob/main/otel_anthropic_demo.py
SETUP — ENV VARS (NO CODE AT ALL)
# Set these env vars — no code changes required
OTEL_EXPORTER_OTLP_ENDPOINT=https://blackbox-gold.vercel.app

OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=https://blackbox-gold.vercel.app
/v1/otel/traces
OTEL_SERVICE_NAME=my-agent
OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED=true
SETUP — DOCKER COMPOSE
services:
  my-agent:
    image: my-agent:latest
    environment:
      OTEL_EXPORTER_OTLP_TRACES_ENDPOINT: https://blackbox-gold.vercel.app
/v1/otel/traces
      OTEL_SERVICE_NAME: my-agent
      OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED: "true"
WHAT AUTO-INSTRUMENTATION GIVES YOU
◉ Tamper-evident chain
Every span sealed into SHA-256 hash chain. Provable after the fact.
◉ Genesis auto-captured
Service name, model, temperature, environment — all on the record.
◉ Idempotent re-export
Safe to re-export; duplicate spans are detected by span_id.
◉ PII redaction at ingest
Configured patterns are masked before the event hits the chain.
◉ Instant leaderboard
Auto-instrumented runs appear in the performance leaderboard live.
◉ Fault detection
Verification runs on output spans the same as SDK-recorded runs.
View recorded runs →OTel-captured runs appear in the run feed with [auto] titles