Bento’sDocumentation Index
Fetch the complete documentation index at: https://docs.bentolabs.ai/llms.txt
Use this file to discover all available pages before exploring further.
bento.track_ai was modeled on Raindrop’s, so most call shapes survive the port unchanged. The two real differences: Bento requires provider= on every call, and Bento’s native integration ships for Google ADK only — but you can preserve Raindrop’s auto-capture story for OpenAI / Anthropic / Bedrock by swapping to OpenInference instrumentors.
Migrate with an AI coding tool
Install the Bento docs skill so your AI coding tool has full context.
The three paths
Pick the smoothest applicable one and fall through. Most migrations end up using B for the bulk and C for the handful of bespoke decorators.| Path | When | Effort |
|---|---|---|
| A — Google ADK integration | ADK is in use | 3 lines at startup |
| B — Auto-capture with OpenInference | Raindrop’s auto_instrument=True captured OpenAI / Anthropic / Bedrock for you | Drop the Raindrop init, register one instrumentor |
| C — Manual translation | @raindrop.interaction / @raindrop.tool / @raindrop.task, bare track_ai calls | Per-call-site rename, add provider= |
Path A: Google ADK integration
If your app runs Google ADK agents, this captures every model call, tool call, and agent step automatically.Path B: Auto-capture with OpenInference
Raindrop’sauto_instrument=True (powered by Traceloop) wrapped OpenAI / Anthropic / Bedrock automatically. Bento preserves the same UX with OpenInference instrumentors registered against a BentoLabsSpanProcessor. Your call sites stay untouched — every LLM call is captured at the SDK level.
raindrop.init(...) and the auto_instrument=True flag. Your existing OpenAI call sites are captured by the instrumentor:
openinference-instrumentation-* and register it the same way.
Full reference: OTel transport.
Path C: Manual translation
For bespoke decorators, manualtrack_ai calls, and identity helpers, translate per the tables.
Setup
| Raindrop | Bento |
|---|---|
pip install raindrop-ai | pip install bentolabs-sdk |
RAINDROP_WRITE_KEY | BENTOLABS_API_KEY |
import raindrop.analytics as raindrop | import bentolabs_sdk as bento |
raindrop.init(api_key=...) | bento.init(api_key=...) |
raindrop.init(auto_instrument=True, instruments={...}) | Use Path B instead |
raindrop.flush() / raindrop.shutdown() | bento.flush() / bento.shutdown() |
Tracking
| Raindrop | Bento |
|---|---|
raindrop.track_ai(...) | bento.track_ai(...) — add provider= |
raindrop.begin(...) | bento.begin(...) |
interaction.track_tool(...) | with interaction.tool_span(...) as ts: |
Decorators
| Raindrop | Bento |
|---|---|
@raindrop.interaction("X") | @bento.interaction(event="X") |
@raindrop.tool("X") | @bento.tool(name="X") |
@raindrop.task("X") / task_span(...) | @bento.tool / tool_span(...) — no separate “task” kind |
What’s gone
| Raindrop | Where it goes |
|---|---|
raindrop.identify(user_id, traits) | Move traits to properties= or init-time tags |
raindrop.track_signal(...) | bento.track_ai(event="feedback", properties={...}) |
raindrop.set_redact_pii(True) | Scrub at the app boundary |
Attachment(...) / add_attachments(...) | Fold metadata into properties=; no binary support |
Watch out for
provider=is required. Raindrop infers it via Traceloop; Bento does not. Bedrock model IDs needprovider="aws_bedrock", not"anthropic".identify()data is lost. No user-profile store in Bento. Port traits to per-callproperties=or init-timetags.- OTel context. Bento detaches from any outer OTel context; Raindrop participates in it. Agent runs become standalone traces.
Side-by-side
Raindrop
Bento
See also
Configuration
init(), identity getters, env vars.Tracking events
The
bento.track_ai reference.