To set up Braintrust as an OpenTelemetry backend, you’ll need to route the traces to Braintrust’s OpenTelemetry endpoint, set your API key, and specify a parent project or experiment. Braintrust supports common patterns from OpenLLLMetry.

For more information, see the Braintrust documentation.

To export OTel traces from Traceloop OpenLLMetry to Braintrust, set the following environment variables:

TRACELOOP_BASE_URL=https://api.braintrust.dev/otel
TRACELOOP_HEADERS="Authorization=Bearer%20<Your API Key>, x-bt-parent=project_id:<Your Project ID>"

Note: When setting the bearer token, make sure to URL encode the space between “Bearer” and your API key using %20. For example:

# Incorrect format
TRACELOOP_HEADERS="Authorization=Bearer sk-RiPodT20anlA1d3ki4T5I0V24WHXFuwvlPivUUoUGOnczOVI, x-bt-parent=project_id:<Your Project ID>"

# Correct format
TRACELOOP_HEADERS="Authorization=Bearer%20sk-RiPodT20anlA1d3ki4T5I0V24WHXFuwvlPivUUoUGOnczOVI, x-bt-parent=project_id:<Your Project ID>"

Important: The project ID is not the same as your project name. To find your project ID:

  1. Navigate to your project configuration page at: https://www.braintrust.dev/app/ORG_NAME/p/PROJECT_NAME/configuration
  2. Scroll to the bottom of the page
  3. Look for the “Copy Project ID” button to get the correct ID for the x-bt-parent header

Traces will then appear under the Braintrust project or experiment provided in the x-bt-parent header.

from openai import OpenAI
from traceloop.sdk import Traceloop
from traceloop.sdk.decorators import workflow
 
Traceloop.init(disable_batch=True)
client = OpenAI()
 
 
@workflow(name="story")
def run_story_stream(client):
    completion = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[{"role": "user", "content": "Tell me a short story about LLM evals."}],
    )
    return completion.choices[0].message.content
 
 
print(run_story_stream(client))