Bento is an OpenTelemetry collector. If your agent framework already emits OpenTelemetry traces, point its exporter at one endpoint with one auth header and the traces land in Bento. In TypeScript you can do this with no Bento package at all.Documentation Index
Fetch the complete documentation index at: https://docs.bentolabs.ai/llms.txt
Use this file to discover all available pages before exploring further.
The endpoint
Every OpenTelemetry exporter needs two settings. Send to${BENTOLABS_BASE_URL}/v1/traces (the default base URL is https://api.bentolabs.ai), and add the header Authorization: Bearer bl_pk_... carrying your BENTOLABS_API_KEY.
Bento reads the standard gen_ai.* and openinference.* span attributes, so traces from these frameworks fill the same dashboard columns described in Attributes. Nothing about your spans is Bento-specific.
TypeScript / JavaScript, no Bento SDK
JavaScript’s OpenTelemetry exporters can emit JSON, so you can send traces to Bento without installing any Bento package.Vercel AI SDK
Wire a JSON OTLP exporter once, then turn on telemetry per call. Use@vercel/otel’s OTLPHttpJsonTraceExporter, which sends JSON as the name says:
gen_ai.* attributes (model, token counts, finish reasons) on its LLM spans, so the model, cost, and token columns fill in. Prompt and response text live under ai.*. To populate the input and output columns too, add the @arizeai/openinference-vercel span processor to the same setup.
Mastra
Use Mastra’sOtelExporter with a custom provider and protocol: "http/json", which gives Bento the JSON it needs:
Python, with the Bento span processor
Python’s OpenTelemetry exporters send protobuf, which Bento doesn’t accept, so Python has no no-SDK path. Install the Bento SDK and use its JSON span processor (BentoLabsSpanProcessor) together with your framework’s OpenInference instrumentor. Your call sites stay untouched.
openinference-instrumentation-llama-index, -openai-agents, -crewai, -anthropic, and so on. The processor reads BENTOLABS_API_KEY and BENTOLABS_BASE_URL from the environment. See OTel transport for the processor details and Attributes for how attributes map to columns.
This holds even for frameworks that emit OpenTelemetry natively, like Pydantic AI via Agent.instrument_all(). They still need a JSON exporter, so attach BentoLabsSpanProcessor rather than a stock OTLP exporter.
Which framework do I use?
| Framework | Language | How to send to Bento |
|---|---|---|
| Vercel AI SDK | TypeScript | @vercel/otel OTLPHttpJsonTraceExporter, no Bento SDK |
| Mastra | TypeScript | OtelExporter with protocol: "http/json", no Bento SDK |
| LangChain / LangGraph | Python | OpenInference instrumentor + BentoLabsSpanProcessor |
| LlamaIndex | Python | OpenInference instrumentor + BentoLabsSpanProcessor |
| Pydantic AI | Python | Agent.instrument_all() + BentoLabsSpanProcessor |
| OpenAI Agents SDK | Python | OpenInference instrumentor + BentoLabsSpanProcessor (its built-in tracing is not OTLP) |
| CrewAI | Python | OpenInference instrumentor + BentoLabsSpanProcessor |
bentolabs-sdk[adk] integration instead. It captures every call automatically.
Verify
A trace arriving is not the same as the dashboard filling in. After wiring the exporter, run one real flow, open platform.bentolabs.ai, and confirm the row has all six columns:provider, model, input, output, user_id, convo_id.
- If
input/outputare empty, the framework emits metadata but not content. Add its OpenInference instrumentor (Python) or the@arizeai/openinference-vercelprocessor (Vercel) on the same exporter. user_idandconvo_idcome from thegen_ai.user.idandgen_ai.conversation.idspan attributes. With no Bento SDK, set them through your framework (a run attribute, a span processor, or OTLP resource attributes).
See also
Attributes
How
gen_ai.* / openinference.* attributes map to dashboard columns.OTel transport
The
BentoLabsSpanProcessor and BentoLabsTraceExporter details.Quickstart
Install the SDK and send your first trace.
Migrate an existing stack
Move from Langfuse or Raindrop to Bento.