Migrating from Raindrop to BentoLabs is a manual port. Function shapes are similar but not identical. Read this table once and translate mechanically.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.
Translation table
| Raindrop | BentoLabs |
|---|---|
import raindrop.analytics as raindrop | import bentolabs_sdk.analytics as bento |
raindrop.init(write_key) | bento.init(api_key=...) (or set BENTOLABS_API_KEY) |
raindrop.track_ai(user_id=, event=, input=, output=, model=, convo_id=) | bento.track_ai(event=, user_id=, input=, output=, model=, provider=, convo_id=) |
interaction = raindrop.begin(...) / interaction.finish(...) | interaction = bento.begin(...) / interaction.finish(...) |
| (no equivalent) | with bento.begin(...) as interaction: context-manager form |
@raindrop.interaction() | @bento.interaction() (also accepts @bento.interaction no-parens) |
@raindrop.tool() | @bento.tool() (also accepts @bento.tool no-parens) |
raindrop.identify(user_id, traits) | Removed. BentoLabs does not store user profiles. Delete these calls. |
raindrop.track_signal(...) | Removed. Not yet implemented in BentoLabs. Delete or stub. |
raindrop.flush() | bento.flush() |
The one new kwarg
Addprovider="..." on every track_ai call. Raindrop infers provider from model name; BentoLabs does not.
openai, anthropic, google, aws_bedrock, azure_openai, cohere, mistral.
Behavior differences
No identify() / user profiles
No identify() / user profiles
BentoLabs stores
user_id as a pass-through string only. There is no equivalent of raindrop.identify(user_id, traits). If you relied on Raindrop’s profile data for filtering or aggregation, attach those traits as properties=... on each track_ai call instead.track_ai is a root span by default
track_ai is a root span by default
Both SDKs ship spans to a backend, but BentoLabs detaches
track_ai calls from any outer OTel context so they don’t accidentally get parented to a customer’s FastAPI/Django span. Open a trajectory with bento.begin(...) if you want subsequent track_ai calls to nest under it.properties type fidelity
properties type fidelity
BentoLabs preserves int / float / bool / str types in
properties so the dashboard can filter experiment_id > 100. Dicts and mixed arrays fall back to JSON-string. See Properties.LIFO trajectory finish
LIFO trajectory finish
BentoLabs enforces reverse-open-order finish on nested trajectories. Out-of-order
interaction.finish() raises RuntimeError. The context-manager form (with bento.begin(...) as i:) guarantees correct nesting.Setup checklist
Delete identify() and track_signal() calls
They have no BentoLabs equivalent. Remove them or stub if you still need a no-op.
Verify in your dashboard
Run one end-to-end flow and confirm the trace appears in platform.bentolabs.ai with the right user, conversation, model, and provider tags.