Skip to main content
Firebase Genkit is Google’s open-source framework for building AI-powered applications. Braintrust traces calls to genkit.Generate, genkit.GenerateText, and genkit.GenerateStream.
This guide covers manual instrumentation. For quicker setup, use auto-instrumentation.

Setup

Install the Braintrust Genkit integration:
go get github.com/braintrustdata/braintrust-sdk-go/trace/contrib/genkit

Trace with Firebase Genkit

This example uses explicit middleware, not auto-instrumentation. Create the middleware once and pass it via ai.WithMiddleware(...) on each Genkit call you want to trace.
package main

import (
	"context"
	"fmt"
	"log"
	"os"

	"github.com/firebase/genkit/go/ai"
	"github.com/firebase/genkit/go/genkit"
	"github.com/firebase/genkit/go/plugins/googlegenai"
	"go.opentelemetry.io/otel"
	"go.opentelemetry.io/otel/sdk/trace"

	"github.com/braintrustdata/braintrust-sdk-go"
	tracegenkit "github.com/braintrustdata/braintrust-sdk-go/trace/contrib/genkit"
)

func main() {
	tp := trace.NewTracerProvider()
	defer tp.Shutdown(context.Background())
	otel.SetTracerProvider(tp)

	bt, err := braintrust.New(tp,
		braintrust.WithProject("my-genkit-project"),
		braintrust.WithAPIKey(os.Getenv("BRAINTRUST_API_KEY")),
	)
	if err != nil {
		log.Fatal(err)
	}

	ctx := context.Background()
	g := genkit.Init(ctx,
		genkit.WithPlugins(&googlegenai.GoogleAI{
			APIKey: os.Getenv("GOOGLE_API_KEY"),
		}),
		genkit.WithDefaultModel("googleai/gemini-2.5-flash"),
	)

	tracer := otel.Tracer("genkit-example")
	ctx, span := tracer.Start(ctx, "genkit-call")
	defer span.End()

	mw := tracegenkit.NewMiddleware()
	resp, err := genkit.Generate(ctx, g,
		ai.WithPrompt("What is the capital of France?"),
		ai.WithMiddleware(mw),
	)
	if err != nil {
		log.Fatal(err)
	}

	fmt.Printf("Response: %s\n", resp.Text())
	fmt.Printf("View trace: %s\n", bt.Permalink(span))
}

Streaming

Pass the same middleware to genkit.GenerateStream:
#skip-compile
stream, err := genkit.GenerateStream(ctx, g,
	ai.WithPrompt("Tell me a story"),
	ai.WithMiddleware(mw),
)
if err != nil {
	log.Fatal(err)
}
_ = stream

Resources