Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions examples/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,13 @@ require (
github.com/aws/aws-sdk-go-v2/service/bedrockruntime v1.50.4
github.com/braintrustdata/braintrust-sdk-go v0.14.0
github.com/braintrustdata/braintrust-sdk-go/trace/contrib/anthropic v0.14.0
github.com/braintrustdata/braintrust-sdk-go/trace/contrib/cloudflare v0.0.0
github.com/braintrustdata/braintrust-sdk-go/trace/contrib/cloudwego/eino v0.14.0
github.com/braintrustdata/braintrust-sdk-go/trace/contrib/genai v0.14.0
github.com/braintrustdata/braintrust-sdk-go/trace/contrib/genkit v0.14.0
github.com/braintrustdata/braintrust-sdk-go/trace/contrib/github.com/sashabaranov/go-openai v0.14.0
github.com/braintrustdata/braintrust-sdk-go/trace/contrib/openai v0.14.0
github.com/cloudflare/cloudflare-go/v7 v7.10.0
github.com/cloudwego/eino v0.8.4
github.com/cloudwego/eino-ext/components/embedding/openai v0.0.0-20260416081055-0ebab92e14f2
github.com/cloudwego/eino-ext/components/model/claude v0.1.15
Expand Down Expand Up @@ -126,5 +128,6 @@ require (

replace (
github.com/braintrustdata/braintrust-sdk-go/trace/contrib/adk => ../trace/contrib/adk
github.com/braintrustdata/braintrust-sdk-go/trace/contrib/cloudflare => ../trace/contrib/cloudflare
github.com/braintrustdata/braintrust-sdk-go/trace/contrib/langchaingo => ../trace/contrib/langchaingo
)
18 changes: 18 additions & 0 deletions examples/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,22 @@ github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPn
github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg=
github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA=
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4=
github.com/braintrustdata/braintrust-sdk-go v0.14.0 h1:jp21fvq/EdJSO20L0O+1xF/Wugznask9hxNWP8cFcKQ=
github.com/braintrustdata/braintrust-sdk-go v0.14.0/go.mod h1:bUtVPn0Se5f1MpSZH42Z2+z+9A0ulfVBKH8mSD5u2E4=
github.com/braintrustdata/braintrust-sdk-go/trace/contrib/anthropic v0.14.0 h1:6wAOFAcqL0xeODJAbivQNs7tIm4E0rA3QK8SerMJvOA=
github.com/braintrustdata/braintrust-sdk-go/trace/contrib/anthropic v0.14.0/go.mod h1:tLX9sOq4HxhmKVktOYYwV7MAW1dLCr1luI3XpStkV9I=
github.com/braintrustdata/braintrust-sdk-go/trace/contrib/bedrockruntime v0.14.0 h1:VmZh8TI2bfdj0ss5UyuRoQqHH6U/nwK4IX1AZtm1Bb8=
github.com/braintrustdata/braintrust-sdk-go/trace/contrib/bedrockruntime v0.14.0/go.mod h1:lZynBt5jIHD1hdkNAXBToeUc8yhU1DhJI5Yttrf0arU=
github.com/braintrustdata/braintrust-sdk-go/trace/contrib/cloudwego/eino v0.14.0 h1:U+dRiVwyeI83XyCg+WaAdgqWKdme2f/FFZfN66kdKng=
github.com/braintrustdata/braintrust-sdk-go/trace/contrib/cloudwego/eino v0.14.0/go.mod h1:e+1NZDc/vWfOCDaGyBZH2PXYP/9i7wcd8LZPzRJA7DE=
github.com/braintrustdata/braintrust-sdk-go/trace/contrib/genai v0.14.0 h1:NAuuUPJHrel+Y4mjpRFmaUmf94N6HXNigOvX5x4t3WU=
github.com/braintrustdata/braintrust-sdk-go/trace/contrib/genai v0.14.0/go.mod h1:vzFs9UcvPZsaUGjojObfLALhPAcO5OeEEZ1d77PoS78=
github.com/braintrustdata/braintrust-sdk-go/trace/contrib/genkit v0.14.0 h1:KV1OJGwlHdd9nvxZtwean6dy3b9SBYRJ6xrFuHNBdZY=
github.com/braintrustdata/braintrust-sdk-go/trace/contrib/genkit v0.14.0/go.mod h1:gAl+1Totg7ZJyDXGLEvjNlF5CRz6M7fhPNuxgrd9A24=
github.com/braintrustdata/braintrust-sdk-go/trace/contrib/github.com/sashabaranov/go-openai v0.14.0 h1:RCQdGHgMjdPeMvQQ92zJG2QKjyUhlWB03OwT4Hovv8s=
github.com/braintrustdata/braintrust-sdk-go/trace/contrib/github.com/sashabaranov/go-openai v0.14.0/go.mod h1:79wEPPEHqPk4s3BIrv1zBTTUQvMPBfXG9Hq3h3PDy+I=
github.com/braintrustdata/braintrust-sdk-go/trace/contrib/openai v0.14.0 h1:01Qs5E5SOlnXFL+teGaA4NJFar/kll1OetDgo2Vr3bk=
github.com/braintrustdata/braintrust-sdk-go/trace/contrib/openai v0.14.0/go.mod h1:rHPahcb1pNX4hWT0m2fVoFiX+JKCfEQ7+PU0F0M3Qgo=
github.com/buger/jsonparser v1.1.2 h1:frqHqw7otoVbk5M8LlE/L7HTnIq2v9RX6EJ48i9AxJk=
github.com/buger/jsonparser v1.1.2/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
github.com/bugsnag/bugsnag-go v1.4.0/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8=
Expand All @@ -60,6 +76,8 @@ github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F9
github.com/certifi/gocertifi v0.0.0-20190105021004-abcd57078448/go.mod h1:GJKEexRPVJrBSOjoqN5VNOIKJ5Q3RViH6eu3puDRwx4=
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/cloudflare/cloudflare-go/v7 v7.10.0 h1:QcrgXKr2m7uTkT+ykMKOcUzIcdemIkl4PrdKUgOYSSg=
github.com/cloudflare/cloudflare-go/v7 v7.10.0/go.mod h1:9zcoIAtu6cmcoPszCNISvqYMXs8wObtVGXE1qGFMrNU=
github.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M=
github.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU=
github.com/cloudwego/eino v0.8.4 h1:aFKJK82MmPR6dm5y5J7IXivYSvh4HkcXwf18j6vyhmk=
Expand Down
121 changes: 121 additions & 0 deletions examples/internal/cloudflare/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
// Cloudflare Workers AI - text generation and text embeddings with tracing
package main

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

cf "github.com/cloudflare/cloudflare-go/v7"
"github.com/cloudflare/cloudflare-go/v7/ai"
"github.com/cloudflare/cloudflare-go/v7/option"
"github.com/cloudflare/cloudflare-go/v7/shared"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/sdk/trace"

"github.com/braintrustdata/braintrust-sdk-go"
tracecloudflare "github.com/braintrustdata/braintrust-sdk-go/trace/contrib/cloudflare"
)

var tracer = otel.Tracer("cloudflare-examples")

const chatModel = "@cf/meta/llama-3.1-8b-instruct-fast"
const embeddingModel = "@cf/baai/bge-base-en-v1.5"
const classificationModel = "@cf/huggingface/distilbert-sst-2-int8"

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

bt, err := braintrust.New(tp,
braintrust.WithProject("go-sdk-examples"),
braintrust.WithBlockingLogin(true),
)
if err != nil {
log.Fatal(err)
}

client := cf.NewClient(
option.WithAPIToken(os.Getenv("CLOUDFLARE_API_TOKEN")),
option.WithMiddleware(tracecloudflare.NewMiddleware()),
)
accountID := os.Getenv("CLOUDFLARE_ACCOUNT_ID")

ctx, rootSpan := tracer.Start(context.Background(), "examples/internal/cloudflare/main.go")
defer rootSpan.End()

chatResp, err := client.AI.Run(ctx, chatModel, ai.AIRunParams{
AccountID: cf.F(accountID),
Body: ai.AIRunParamsBodyTextGeneration{
Messages: cf.F([]ai.AIRunParamsBodyTextGenerationMessage{
{
Role: cf.F("user"),
Content: cf.F[ai.AIRunParamsBodyTextGenerationMessagesContentUnion](shared.UnionString("Say hello")),
},
}),
},
})
if err != nil {
log.Fatalf("Text generation: %v", err)
}
fmt.Printf("Text generation -> %+v\n", *chatResp)

toolResp, err := client.AI.Run(ctx, chatModel, ai.AIRunParams{
AccountID: cf.F(accountID),
Body: ai.AIRunParamsBodyTextGeneration{
Messages: cf.F([]ai.AIRunParamsBodyTextGenerationMessage{
{
Role: cf.F("user"),
Content: cf.F[ai.AIRunParamsBodyTextGenerationMessagesContentUnion](shared.UnionString("What's the weather in Paris?")),
},
}),
Tools: cf.F([]ai.AIRunParamsBodyTextGenerationToolUnion{
ai.AIRunParamsBodyTextGenerationTool{
Type: cf.F("function"),
Name: cf.F("get_weather"),
Description: cf.F("Get the current weather for a location"),
Parameters: cf.F[any](map[string]any{
"type": "object",
"properties": map[string]any{
"location": map[string]any{"type": "string"},
},
"required": []string{"location"},
}),
},
}),
},
})
if err != nil {
log.Fatalf("Text generation with tools: %v", err)
}
fmt.Printf("Text generation with tools -> %+v\n", *toolResp)

// Text and multimodal embeddings return the identical {data, shape}
// response shape, so both are covered by the same tracer code path;
// see trace/contrib/cloudflare/airun.go's tagEmbeddings.
embedResp, err := client.AI.Run(ctx, embeddingModel, ai.AIRunParams{
AccountID: cf.F(accountID),
Body: ai.AIRunParamsBodyTextEmbeddings{
Text: cf.F[ai.AIRunParamsBodyTextEmbeddingsTextUnion](shared.UnionString("hello world")),
},
})
if err != nil {
log.Fatalf("Text embeddings: %v", err)
}
fmt.Printf("Text embeddings -> %+v\n", *embedResp)

classifyResp, err := client.AI.Run(ctx, classificationModel, ai.AIRunParams{
AccountID: cf.F(accountID),
Body: ai.AIRunParamsBodyTextClassification{
Text: cf.F("I love this product"),
},
})
if err != nil {
log.Fatalf("Text classification: %v", err)
}
fmt.Printf("Text classification -> %+v\n", *classifyResp)

fmt.Printf("View trace: %s\n", bt.Permalink(rootSpan))
}
1 change: 1 addition & 0 deletions go.work
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ use (
./trace/contrib/all
./trace/contrib/anthropic
./trace/contrib/bedrockruntime
./trace/contrib/cloudflare
./trace/contrib/cloudwego/eino
./trace/contrib/genai
./trace/contrib/genkit
Expand Down
7 changes: 4 additions & 3 deletions internal/genorchestrion/genorchestrion_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ func TestGenerate(t *testing.T) {
"sashabaranov-newclientwithconfig-wrap",
"genai-newclient-wrap",
"langchaingo-openai-newllm-callback",
"cloudflare-newclient-middleware",
}

for _, expected := range expectedAspects {
Expand Down Expand Up @@ -75,10 +76,10 @@ func TestGenerateExcludesAllDirectory(t *testing.T) {
t.Fatalf("Failed to parse generated YAML: %v", err)
}

// Count aspects - should be exactly 20 (one per provider, plus openai-v2, 4 for adk, 6 for genkit, 1 for cloudwego/eino, 1 for bedrockruntime, and 2 for a2a)
// Count aspects - should be exactly 21 (one per provider, plus openai-v2, 4 for adk, 6 for genkit, 1 for cloudwego/eino, 1 for bedrockruntime, 2 for a2a, and 1 for cloudflare)
// If it's more, we might be including duplicates from all/
if len(result.Aspects) != 20 {
t.Errorf("expected 20 aspects, got %d", len(result.Aspects))
if len(result.Aspects) != 21 {
t.Errorf("expected 21 aspects, got %d", len(result.Aspects))
}
}

Expand Down
1 change: 1 addition & 0 deletions scripts/nested_modules.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ trace/contrib/a2a
trace/contrib/adk
trace/contrib/anthropic
trace/contrib/bedrockruntime
trace/contrib/cloudflare
trace/contrib/cloudwego/eino
trace/contrib/genai
trace/contrib/genkit
Expand Down
4 changes: 4 additions & 0 deletions trace/contrib/all/all.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
// - github.com/braintrustdata/braintrust-sdk-go/trace/contrib/cloudwego/eino (CloudWeGo Eino)
// - github.com/braintrustdata/braintrust-sdk-go/trace/contrib/langchaingo (LangChainGo)
// - github.com/braintrustdata/braintrust-sdk-go/trace/contrib/a2a (A2A protocol)
// - github.com/braintrustdata/braintrust-sdk-go/trace/contrib/cloudflare (Cloudflare Workers AI)
package all

import (
Expand Down Expand Up @@ -58,4 +59,7 @@ import (

// LangChainGo (github.com/tmc/langchaingo)
_ "github.com/braintrustdata/braintrust-sdk-go/trace/contrib/langchaingo"

// Cloudflare Workers AI (github.com/cloudflare/cloudflare-go/v7)
_ "github.com/braintrustdata/braintrust-sdk-go/trace/contrib/cloudflare"
)
3 changes: 3 additions & 0 deletions trace/contrib/all/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ require (
github.com/braintrustdata/braintrust-sdk-go/trace/contrib/adk v0.14.0
github.com/braintrustdata/braintrust-sdk-go/trace/contrib/anthropic v0.14.0
github.com/braintrustdata/braintrust-sdk-go/trace/contrib/bedrockruntime v0.14.0
github.com/braintrustdata/braintrust-sdk-go/trace/contrib/cloudflare v0.0.0
github.com/braintrustdata/braintrust-sdk-go/trace/contrib/cloudwego/eino v0.14.0
github.com/braintrustdata/braintrust-sdk-go/trace/contrib/genai v0.14.0
github.com/braintrustdata/braintrust-sdk-go/trace/contrib/genkit v0.14.0
Expand Down Expand Up @@ -36,6 +37,7 @@ require (
github.com/bytedance/sonic v1.15.0 // indirect
github.com/bytedance/sonic/loader v0.5.0 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/cloudflare/cloudflare-go/v7 v7.10.0 // indirect
github.com/cloudwego/base64x v0.1.6 // indirect
github.com/cloudwego/eino v0.8.4 // indirect
github.com/dlclark/regexp2 v1.10.0 // indirect
Expand Down Expand Up @@ -113,6 +115,7 @@ replace (
github.com/braintrustdata/braintrust-sdk-go/trace/contrib/adk => ../adk
github.com/braintrustdata/braintrust-sdk-go/trace/contrib/anthropic => ../anthropic
github.com/braintrustdata/braintrust-sdk-go/trace/contrib/bedrockruntime => ../bedrockruntime
github.com/braintrustdata/braintrust-sdk-go/trace/contrib/cloudflare => ../cloudflare
github.com/braintrustdata/braintrust-sdk-go/trace/contrib/cloudwego/eino => ../cloudwego/eino
github.com/braintrustdata/braintrust-sdk-go/trace/contrib/genai => ../genai
github.com/braintrustdata/braintrust-sdk-go/trace/contrib/genkit => ../genkit
Expand Down
2 changes: 2 additions & 0 deletions trace/contrib/all/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,8 @@ github.com/bytedance/sonic/loader v0.5.0/go.mod h1:AR4NYCk5DdzZizZ5djGqQ92eEhCCc
github.com/certifi/gocertifi v0.0.0-20190105021004-abcd57078448/go.mod h1:GJKEexRPVJrBSOjoqN5VNOIKJ5Q3RViH6eu3puDRwx4=
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/cloudflare/cloudflare-go/v7 v7.10.0 h1:QcrgXKr2m7uTkT+ykMKOcUzIcdemIkl4PrdKUgOYSSg=
github.com/cloudflare/cloudflare-go/v7 v7.10.0/go.mod h1:9zcoIAtu6cmcoPszCNISvqYMXs8wObtVGXE1qGFMrNU=
github.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M=
github.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU=
github.com/cloudwego/eino v0.8.4 h1:aFKJK82MmPR6dm5y5J7IXivYSvh4HkcXwf18j6vyhmk=
Expand Down
11 changes: 11 additions & 0 deletions trace/contrib/all/orchestrion.yml
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,17 @@ aspects:
{{- end }}{{ end }}
return bedrockruntime.NewFromConfig({{ $cfg }}, __opts...)
}()
- id: cloudflare-newclient-middleware
join-point:
function-call: github.com/cloudflare/cloudflare-go/v7.NewClient
advice:
- append-args:
type: github.com/cloudflare/cloudflare-go/v7/option.RequestOption
values:
- imports:
bt: github.com/braintrustdata/braintrust-sdk-go/trace/contrib/cloudflare
option: github.com/cloudflare/cloudflare-go/v7/option
template: option.WithMiddleware(bt.NewMiddleware())
- id: cloudwego-eino-append-global-handler
join-point:
function-call: github.com/cloudwego/eino/callbacks.AppendGlobalHandlers
Expand Down
Loading