From 1d68cbcb521e37b9db290f94b4bbcd89fd2c97c7 Mon Sep 17 00:00:00 2001 From: Andrew Kent Date: Thu, 28 May 2026 11:28:51 -0600 Subject: [PATCH] refactor examples into separate subprojects --- CONTRIBUTING.md | 2 +- README.md | 8 +- .../anthropic-instrumentation/build.gradle | 18 ++ .../AnthropicInstrumentationExample.java | 0 examples/build.gradle | 222 +++--------------- examples/classifiers/build.gradle | 7 + .../examples/ClassifiersExample.java | 0 examples/custom-open-telemetry/build.gradle | 11 + .../examples/CustomOpenTelemetryExample.java | 0 examples/experiment/build.gradle | 18 ++ .../examples/ExperimentExample.java | 0 examples/gemini-instrumentation/build.gradle | 18 ++ .../GeminiInstrumentationExample.java | 0 examples/langchain-ai-services/build.gradle | 19 ++ .../examples/LangchainAIServicesExample.java | 0 examples/langchain-simple/build.gradle | 19 ++ .../examples/LangchainSimpleExample.java | 0 examples/openai-instrumentation/build.gradle | 18 ++ .../OpenAIInstrumentationExample.java | 0 examples/prompt-fetching/build.gradle | 18 ++ .../examples/PromptFetchingExample.java | 0 examples/remote-eval-with-params/build.gradle | 18 ++ .../examples/RemoteEvalWithParamsExample.java | 0 examples/remote-eval/build.gradle | 18 ++ .../examples/RemoteEvalExample.java | 0 examples/scala/SimpleExample.scala | 104 -------- examples/simple-open-telemetry/build.gradle | 7 + .../examples/SimpleOpenTelemetryExample.java | 0 examples/spring-ai/build.gradle | 36 +++ .../braintrust/examples/SpringAIExample.java | 0 examples/trace-scoring/build.gradle | 18 ++ .../examples/TraceScoringExample.java | 0 settings.gradle | 14 ++ 33 files changed, 295 insertions(+), 298 deletions(-) create mode 100644 examples/anthropic-instrumentation/build.gradle rename examples/{ => anthropic-instrumentation}/src/main/java/dev/braintrust/examples/AnthropicInstrumentationExample.java (100%) create mode 100644 examples/classifiers/build.gradle rename examples/{ => classifiers}/src/main/java/dev/braintrust/examples/ClassifiersExample.java (100%) create mode 100644 examples/custom-open-telemetry/build.gradle rename examples/{ => custom-open-telemetry}/src/main/java/dev/braintrust/examples/CustomOpenTelemetryExample.java (100%) create mode 100644 examples/experiment/build.gradle rename examples/{ => experiment}/src/main/java/dev/braintrust/examples/ExperimentExample.java (100%) create mode 100644 examples/gemini-instrumentation/build.gradle rename examples/{ => gemini-instrumentation}/src/main/java/dev/braintrust/examples/GeminiInstrumentationExample.java (100%) create mode 100644 examples/langchain-ai-services/build.gradle rename examples/{ => langchain-ai-services}/src/main/java/dev/braintrust/examples/LangchainAIServicesExample.java (100%) create mode 100644 examples/langchain-simple/build.gradle rename examples/{ => langchain-simple}/src/main/java/dev/braintrust/examples/LangchainSimpleExample.java (100%) create mode 100644 examples/openai-instrumentation/build.gradle rename examples/{ => openai-instrumentation}/src/main/java/dev/braintrust/examples/OpenAIInstrumentationExample.java (100%) create mode 100644 examples/prompt-fetching/build.gradle rename examples/{ => prompt-fetching}/src/main/java/dev/braintrust/examples/PromptFetchingExample.java (100%) create mode 100644 examples/remote-eval-with-params/build.gradle rename examples/{ => remote-eval-with-params}/src/main/java/dev/braintrust/examples/RemoteEvalWithParamsExample.java (100%) create mode 100644 examples/remote-eval/build.gradle rename examples/{ => remote-eval}/src/main/java/dev/braintrust/examples/RemoteEvalExample.java (100%) delete mode 100644 examples/scala/SimpleExample.scala create mode 100644 examples/simple-open-telemetry/build.gradle rename examples/{ => simple-open-telemetry}/src/main/java/dev/braintrust/examples/SimpleOpenTelemetryExample.java (100%) create mode 100644 examples/spring-ai/build.gradle rename examples/{ => spring-ai}/src/main/java/dev/braintrust/examples/SpringAIExample.java (100%) create mode 100644 examples/trace-scoring/build.gradle rename examples/{ => trace-scoring}/src/main/java/dev/braintrust/examples/TraceScoringExample.java (100%) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d5ab8016..00cc656d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -67,5 +67,5 @@ To send Braintrust otel data to the local collector: ``` # assumes you have BRAINTRUST_API_KEY and OPENAI_API_KEY exported -export BRAINTRUST_API_URL="http://localhost:4318" ; export BRAINTRUST_TRACES_PATH="/v1/traces"; export BRAINTRUST_LOGS_PATH="/v1/logs" ; ./gradlew :examples:runOpenAIInstrumentation +export BRAINTRUST_API_URL="http://localhost:4318" ; export BRAINTRUST_TRACES_PATH="/v1/traces"; export BRAINTRUST_LOGS_PATH="/v1/logs" ; ./gradlew :examples:openai-instrumentation:run ``` diff --git a/README.md b/README.md index 8577d6a7..d5675d47 100644 --- a/README.md +++ b/README.md @@ -105,7 +105,7 @@ A list of supported instrumentation can be found [here](./braintrust-sdk/instrum ## Running Examples -Example source code can be found [here](./examples/src/main/java/dev/braintrust/examples) +Example source code can be found [here](./examples). Each example is its own Gradle subproject under `examples/` with its own `:run` target. ```bash export BRAINTRUST_API_KEY="your-braintrust-api-key" @@ -115,9 +115,9 @@ export ANTHROPIC_API_KEY="your-anthropic-api-key" # to run anthropic examples brew install openjdk@17 # macOS sudo apt install openjdk-17-jdk # ubuntu # to run a specific example -./gradlew :examples:runSimpleOpenTelemetry -# to see all examples -./gradlew :examples:tasks --group="Braintrust SDK Examples" +./gradlew :examples:simple-open-telemetry:run +# to list every example subproject +./gradlew projects ``` ## Logging diff --git a/examples/anthropic-instrumentation/build.gradle b/examples/anthropic-instrumentation/build.gradle new file mode 100644 index 00000000..51b613d1 --- /dev/null +++ b/examples/anthropic-instrumentation/build.gradle @@ -0,0 +1,18 @@ +application { + mainClass = 'dev.braintrust.examples.AnthropicInstrumentationExample' +} + +dependencies { + implementation project(':braintrust-sdk:instrumentation:anthropic_2_2_0') + implementation "com.anthropic:anthropic-java:2.8.1" +} + +run { + description = 'Run the Anthropic instrumentation example. NOTE: this requires ANTHROPIC_API_KEY to be exported and will make a small call to anthropic, using your tokens' + debugOptions { + enabled = true + port = 5566 + server = true + suspend = false + } +} diff --git a/examples/src/main/java/dev/braintrust/examples/AnthropicInstrumentationExample.java b/examples/anthropic-instrumentation/src/main/java/dev/braintrust/examples/AnthropicInstrumentationExample.java similarity index 100% rename from examples/src/main/java/dev/braintrust/examples/AnthropicInstrumentationExample.java rename to examples/anthropic-instrumentation/src/main/java/dev/braintrust/examples/AnthropicInstrumentationExample.java diff --git a/examples/build.gradle b/examples/build.gradle index fa732452..0eb99c9e 100644 --- a/examples/build.gradle +++ b/examples/build.gradle @@ -1,201 +1,45 @@ -plugins { - id 'java' - id 'application' -} - -java { - toolchain { - languageVersion = JavaLanguageVersion.of(17) - vendor = JvmVendorSpec.ADOPTIUM // eclipse JVM - } - withJavadocJar() - withSourcesJar() -} - -repositories { - mavenCentral() -} - -def braintrustLogLevel = System.getenv('BRAINTRUST_LOG_LEVEL') ?: 'info' - -dependencies { - implementation project(':braintrust-sdk') - implementation project(':braintrust-sdk:instrumentation:openai_2_15_0') - implementation project(':braintrust-sdk:instrumentation:anthropic_2_2_0') - implementation project(':braintrust-sdk:instrumentation:genai_1_18_0') - implementation project(':braintrust-sdk:instrumentation:langchain_1_8_0') - implementation project(':braintrust-sdk:instrumentation:springai_1_0_0') - implementation project(':braintrust-sdk:instrumentation:aws_bedrock_2_30_0') - runtimeOnly "org.slf4j:slf4j-simple:${slf4jVersion}" - // To run otel examples - implementation "io.opentelemetry:opentelemetry-exporter-otlp:${otelVersion}" - // to run OAI instrumentation examples - implementation 'com.openai:openai-java:2.8.1' - // to run anthropic examples - implementation "com.anthropic:anthropic-java:2.8.1" - // to run gemini examples - implementation 'com.google.genai:google-genai:1.20.0' - // spring ai examples - implementation 'org.springframework.ai:spring-ai-anthropic:1.1.0' - implementation 'org.springframework.ai:spring-ai-bedrock-converse:1.1.0' - implementation 'org.springframework.ai:spring-ai-google-genai:1.1.0' - implementation 'org.springframework.ai:spring-ai-openai:1.1.0' - // spring-ai-openai requires spring-webflux (WebClient) at runtime - implementation 'org.springframework:spring-webflux:6.2.3' - // spring boot for SpringAIExample (exclude logback, use slf4j-simple like other examples) - implementation('org.springframework.boot:spring-boot-starter:3.4.1') { - exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging' - } - // to run langchain4j examples - implementation 'dev.langchain4j:langchain4j:1.9.1' - implementation 'dev.langchain4j:langchain4j-open-ai:1.9.1' - -} - -application { - mainClass = 'dev.braintrust.examples.SimpleOpenTelemetryExample' -} - -task runSimpleOpenTelemetry(type: JavaExec) { - group = 'Braintrust SDK Examples' - description = 'Run the simple OpenTelemetry example' - classpath = sourceSets.main.runtimeClasspath - mainClass = 'dev.braintrust.examples.SimpleOpenTelemetryExample' - systemProperty 'org.slf4j.simpleLogger.log.dev.braintrust', braintrustLogLevel -} - -task runCustomOpenTelemetry(type: JavaExec) { - group = 'Braintrust SDK Examples' - description = 'Run the custom OpenTelemetry example' - classpath = sourceSets.main.runtimeClasspath - mainClass = 'dev.braintrust.examples.CustomOpenTelemetryExample' - systemProperty 'org.slf4j.simpleLogger.log.dev.braintrust', braintrustLogLevel -} +// Shared convention for all example subprojects. +// +// Each example lives in its own subproject under examples/ and applies the +// 'application' plugin so it can be launched with: +// +// ./gradlew :examples::run +// +// List every example via: +// +// ./gradlew projects +// +// Per-example build.gradle files only declare their mainClass, extra +// dependencies, and (optionally) a description / debugOptions block on the +// inherited 'run' task. -task runOpenAIInstrumentation(type: JavaExec) { - group = 'Braintrust SDK Examples' - description = 'Run the OpenAI instrumentation example. NOTE: this requires OPENAI_API_KEY to be exported and will make a small call to openai, using your tokens' - classpath = sourceSets.main.runtimeClasspath - mainClass = 'dev.braintrust.examples.OpenAIInstrumentationExample' - systemProperty 'org.slf4j.simpleLogger.log.dev.braintrust', braintrustLogLevel - debugOptions { - enabled = true - port = 5566 - server = true - suspend = false - } -} +subprojects { + apply plugin: 'java' + apply plugin: 'application' -task runExperiment(type: JavaExec) { - group = 'Braintrust SDK Examples' - description = 'Run the experiment example' - classpath = sourceSets.main.runtimeClasspath - mainClass = 'dev.braintrust.examples.ExperimentExample' - systemProperty 'org.slf4j.simpleLogger.log.dev.braintrust', braintrustLogLevel - debugOptions { - enabled = true - port = 5566 - server = true - suspend = false - } -} + group = rootProject.group + version = rootProject.version -task runAnthropicInstrumentation(type: JavaExec) { - group = 'Braintrust SDK Examples' - description = 'Run the Anthropic instrumentation example. NOTE: this requires ANTHROPIC_API_KEY to be exported and will make a small call to anthropic, using your tokens' - classpath = sourceSets.main.runtimeClasspath - mainClass = 'dev.braintrust.examples.AnthropicInstrumentationExample' - systemProperty 'org.slf4j.simpleLogger.log.dev.braintrust', braintrustLogLevel - debugOptions { - enabled = true - port = 5566 - server = true - suspend = false + java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + vendor = JvmVendorSpec.ADOPTIUM // eclipse JVM + } } -} - -task runPromptFetching(type: JavaExec) { - group = 'Braintrust SDK Examples' - description = 'Run the prompt fetching example' - classpath = sourceSets.main.runtimeClasspath - mainClass = 'dev.braintrust.examples.PromptFetchingExample' - systemProperty 'org.slf4j.simpleLogger.log.dev.braintrust', braintrustLogLevel - debugOptions { - enabled = true - port = 5566 - server = true - suspend = false + repositories { + mavenCentral() } -} -task runGeminiInstrumentation(type: JavaExec) { - group = 'Braintrust SDK Examples' - description = 'Run the Gemini instrumentation example. NOTE: this requires GOOGLE_API_KEY or GEMINI_API_KEY to be exported and will make a small call to google, using your tokens' - classpath = sourceSets.main.runtimeClasspath - mainClass = 'dev.braintrust.examples.GeminiInstrumentationExample' - systemProperty 'org.slf4j.simpleLogger.log.dev.braintrust', braintrustLogLevel - debugOptions { - enabled = true - port = 5566 - server = true - suspend = false - } -} + def braintrustLogLevel = System.getenv('BRAINTRUST_LOG_LEVEL') ?: 'info' -task runSpringAI(type: JavaExec) { - group = 'Braintrust SDK Examples' - description = 'Run the Spring Boot + Spring AI example' - classpath = sourceSets.main.runtimeClasspath - mainClass = 'dev.braintrust.examples.SpringAIExample' - systemProperty 'org.slf4j.simpleLogger.log.dev.braintrust', braintrustLogLevel - - debugOptions { - enabled = true - port = 5566 - server = true - suspend = false - } -} - -task runRemoteEval(type: JavaExec) { - group = 'Braintrust SDK Examples' - description = 'Run the remote eval example' - classpath = sourceSets.main.runtimeClasspath - mainClass = 'dev.braintrust.examples.RemoteEvalExample' - systemProperty 'org.slf4j.simpleLogger.log.dev.braintrust', braintrustLogLevel - debugOptions { - enabled = true - port = 5566 - server = true - suspend = false + dependencies { + implementation project(':braintrust-sdk') + runtimeOnly "org.slf4j:slf4j-simple:${slf4jVersion}" } -} - -task runLangchainSimple(type: JavaExec) { - group = 'Braintrust SDK Examples' - description = 'Run the LangChain4j instrumentation example. NOTE: this requires OPENAI_API_KEY to be exported and will make a small call to openai, using your tokens' - classpath = sourceSets.main.runtimeClasspath - mainClass = 'dev.braintrust.examples.LangchainSimpleExample' - systemProperty 'org.slf4j.simpleLogger.log.dev.braintrust', braintrustLogLevel - debugOptions { - enabled = true - port = 5566 - server = true - suspend = false - } -} -task runLangchainAIServices(type: JavaExec) { - group = 'Braintrust SDK Examples' - description = 'Run the LangChain4j AI Services example. NOTE: this requires OPENAI_API_KEY to be exported and will make a small call to openai, using your tokens' - classpath = sourceSets.main.runtimeClasspath - mainClass = 'dev.braintrust.examples.LangchainAIServicesExample' - systemProperty 'org.slf4j.simpleLogger.log.dev.braintrust', braintrustLogLevel - debugOptions { - enabled = true - port = 5566 - server = true - suspend = false + tasks.named('run') { + group = 'Braintrust SDK Examples' + systemProperty 'org.slf4j.simpleLogger.log.dev.braintrust', braintrustLogLevel } } diff --git a/examples/classifiers/build.gradle b/examples/classifiers/build.gradle new file mode 100644 index 00000000..5832a43a --- /dev/null +++ b/examples/classifiers/build.gradle @@ -0,0 +1,7 @@ +application { + mainClass = 'dev.braintrust.examples.ClassifiersExample' +} + +run { + description = 'Run the classifiers example' +} diff --git a/examples/src/main/java/dev/braintrust/examples/ClassifiersExample.java b/examples/classifiers/src/main/java/dev/braintrust/examples/ClassifiersExample.java similarity index 100% rename from examples/src/main/java/dev/braintrust/examples/ClassifiersExample.java rename to examples/classifiers/src/main/java/dev/braintrust/examples/ClassifiersExample.java diff --git a/examples/custom-open-telemetry/build.gradle b/examples/custom-open-telemetry/build.gradle new file mode 100644 index 00000000..c3718fec --- /dev/null +++ b/examples/custom-open-telemetry/build.gradle @@ -0,0 +1,11 @@ +application { + mainClass = 'dev.braintrust.examples.CustomOpenTelemetryExample' +} + +dependencies { + implementation "io.opentelemetry:opentelemetry-exporter-otlp:${otelVersion}" +} + +run { + description = 'Run the custom OpenTelemetry example' +} diff --git a/examples/src/main/java/dev/braintrust/examples/CustomOpenTelemetryExample.java b/examples/custom-open-telemetry/src/main/java/dev/braintrust/examples/CustomOpenTelemetryExample.java similarity index 100% rename from examples/src/main/java/dev/braintrust/examples/CustomOpenTelemetryExample.java rename to examples/custom-open-telemetry/src/main/java/dev/braintrust/examples/CustomOpenTelemetryExample.java diff --git a/examples/experiment/build.gradle b/examples/experiment/build.gradle new file mode 100644 index 00000000..3c4bc772 --- /dev/null +++ b/examples/experiment/build.gradle @@ -0,0 +1,18 @@ +application { + mainClass = 'dev.braintrust.examples.ExperimentExample' +} + +dependencies { + implementation project(':braintrust-sdk:instrumentation:openai_2_15_0') + implementation 'com.openai:openai-java:2.8.1' +} + +run { + description = 'Run the experiment example' + debugOptions { + enabled = true + port = 5566 + server = true + suspend = false + } +} diff --git a/examples/src/main/java/dev/braintrust/examples/ExperimentExample.java b/examples/experiment/src/main/java/dev/braintrust/examples/ExperimentExample.java similarity index 100% rename from examples/src/main/java/dev/braintrust/examples/ExperimentExample.java rename to examples/experiment/src/main/java/dev/braintrust/examples/ExperimentExample.java diff --git a/examples/gemini-instrumentation/build.gradle b/examples/gemini-instrumentation/build.gradle new file mode 100644 index 00000000..40db8768 --- /dev/null +++ b/examples/gemini-instrumentation/build.gradle @@ -0,0 +1,18 @@ +application { + mainClass = 'dev.braintrust.examples.GeminiInstrumentationExample' +} + +dependencies { + implementation project(':braintrust-sdk:instrumentation:genai_1_18_0') + implementation 'com.google.genai:google-genai:1.20.0' +} + +run { + description = 'Run the Gemini instrumentation example. NOTE: this requires GOOGLE_API_KEY or GEMINI_API_KEY to be exported and will make a small call to google, using your tokens' + debugOptions { + enabled = true + port = 5566 + server = true + suspend = false + } +} diff --git a/examples/src/main/java/dev/braintrust/examples/GeminiInstrumentationExample.java b/examples/gemini-instrumentation/src/main/java/dev/braintrust/examples/GeminiInstrumentationExample.java similarity index 100% rename from examples/src/main/java/dev/braintrust/examples/GeminiInstrumentationExample.java rename to examples/gemini-instrumentation/src/main/java/dev/braintrust/examples/GeminiInstrumentationExample.java diff --git a/examples/langchain-ai-services/build.gradle b/examples/langchain-ai-services/build.gradle new file mode 100644 index 00000000..b47a8bb9 --- /dev/null +++ b/examples/langchain-ai-services/build.gradle @@ -0,0 +1,19 @@ +application { + mainClass = 'dev.braintrust.examples.LangchainAIServicesExample' +} + +dependencies { + implementation project(':braintrust-sdk:instrumentation:langchain_1_8_0') + implementation 'dev.langchain4j:langchain4j:1.9.1' + implementation 'dev.langchain4j:langchain4j-open-ai:1.9.1' +} + +run { + description = 'Run the LangChain4j AI Services example. NOTE: this requires OPENAI_API_KEY to be exported and will make a small call to openai, using your tokens' + debugOptions { + enabled = true + port = 5566 + server = true + suspend = false + } +} diff --git a/examples/src/main/java/dev/braintrust/examples/LangchainAIServicesExample.java b/examples/langchain-ai-services/src/main/java/dev/braintrust/examples/LangchainAIServicesExample.java similarity index 100% rename from examples/src/main/java/dev/braintrust/examples/LangchainAIServicesExample.java rename to examples/langchain-ai-services/src/main/java/dev/braintrust/examples/LangchainAIServicesExample.java diff --git a/examples/langchain-simple/build.gradle b/examples/langchain-simple/build.gradle new file mode 100644 index 00000000..70b214a2 --- /dev/null +++ b/examples/langchain-simple/build.gradle @@ -0,0 +1,19 @@ +application { + mainClass = 'dev.braintrust.examples.LangchainSimpleExample' +} + +dependencies { + implementation project(':braintrust-sdk:instrumentation:langchain_1_8_0') + implementation 'dev.langchain4j:langchain4j:1.9.1' + implementation 'dev.langchain4j:langchain4j-open-ai:1.9.1' +} + +run { + description = 'Run the LangChain4j instrumentation example. NOTE: this requires OPENAI_API_KEY to be exported and will make a small call to openai, using your tokens' + debugOptions { + enabled = true + port = 5566 + server = true + suspend = false + } +} diff --git a/examples/src/main/java/dev/braintrust/examples/LangchainSimpleExample.java b/examples/langchain-simple/src/main/java/dev/braintrust/examples/LangchainSimpleExample.java similarity index 100% rename from examples/src/main/java/dev/braintrust/examples/LangchainSimpleExample.java rename to examples/langchain-simple/src/main/java/dev/braintrust/examples/LangchainSimpleExample.java diff --git a/examples/openai-instrumentation/build.gradle b/examples/openai-instrumentation/build.gradle new file mode 100644 index 00000000..01faa3c5 --- /dev/null +++ b/examples/openai-instrumentation/build.gradle @@ -0,0 +1,18 @@ +application { + mainClass = 'dev.braintrust.examples.OpenAIInstrumentationExample' +} + +dependencies { + implementation project(':braintrust-sdk:instrumentation:openai_2_15_0') + implementation 'com.openai:openai-java:2.8.1' +} + +run { + description = 'Run the OpenAI instrumentation example. NOTE: this requires OPENAI_API_KEY to be exported and will make a small call to openai, using your tokens' + debugOptions { + enabled = true + port = 5566 + server = true + suspend = false + } +} diff --git a/examples/src/main/java/dev/braintrust/examples/OpenAIInstrumentationExample.java b/examples/openai-instrumentation/src/main/java/dev/braintrust/examples/OpenAIInstrumentationExample.java similarity index 100% rename from examples/src/main/java/dev/braintrust/examples/OpenAIInstrumentationExample.java rename to examples/openai-instrumentation/src/main/java/dev/braintrust/examples/OpenAIInstrumentationExample.java diff --git a/examples/prompt-fetching/build.gradle b/examples/prompt-fetching/build.gradle new file mode 100644 index 00000000..ae2c9bde --- /dev/null +++ b/examples/prompt-fetching/build.gradle @@ -0,0 +1,18 @@ +application { + mainClass = 'dev.braintrust.examples.PromptFetchingExample' +} + +dependencies { + implementation project(':braintrust-sdk:instrumentation:openai_2_15_0') + implementation 'com.openai:openai-java:2.8.1' +} + +run { + description = 'Run the prompt fetching example' + debugOptions { + enabled = true + port = 5566 + server = true + suspend = false + } +} diff --git a/examples/src/main/java/dev/braintrust/examples/PromptFetchingExample.java b/examples/prompt-fetching/src/main/java/dev/braintrust/examples/PromptFetchingExample.java similarity index 100% rename from examples/src/main/java/dev/braintrust/examples/PromptFetchingExample.java rename to examples/prompt-fetching/src/main/java/dev/braintrust/examples/PromptFetchingExample.java diff --git a/examples/remote-eval-with-params/build.gradle b/examples/remote-eval-with-params/build.gradle new file mode 100644 index 00000000..99c3a56a --- /dev/null +++ b/examples/remote-eval-with-params/build.gradle @@ -0,0 +1,18 @@ +application { + mainClass = 'dev.braintrust.examples.RemoteEvalWithParamsExample' +} + +dependencies { + implementation project(':braintrust-sdk:instrumentation:openai_2_15_0') + implementation 'com.openai:openai-java:2.8.1' +} + +run { + description = 'Run the remote eval example with parameter overrides' + debugOptions { + enabled = true + port = 5566 + server = true + suspend = false + } +} diff --git a/examples/src/main/java/dev/braintrust/examples/RemoteEvalWithParamsExample.java b/examples/remote-eval-with-params/src/main/java/dev/braintrust/examples/RemoteEvalWithParamsExample.java similarity index 100% rename from examples/src/main/java/dev/braintrust/examples/RemoteEvalWithParamsExample.java rename to examples/remote-eval-with-params/src/main/java/dev/braintrust/examples/RemoteEvalWithParamsExample.java diff --git a/examples/remote-eval/build.gradle b/examples/remote-eval/build.gradle new file mode 100644 index 00000000..c0143733 --- /dev/null +++ b/examples/remote-eval/build.gradle @@ -0,0 +1,18 @@ +application { + mainClass = 'dev.braintrust.examples.RemoteEvalExample' +} + +dependencies { + implementation project(':braintrust-sdk:instrumentation:openai_2_15_0') + implementation 'com.openai:openai-java:2.8.1' +} + +run { + description = 'Run the remote eval example' + debugOptions { + enabled = true + port = 5566 + server = true + suspend = false + } +} diff --git a/examples/src/main/java/dev/braintrust/examples/RemoteEvalExample.java b/examples/remote-eval/src/main/java/dev/braintrust/examples/RemoteEvalExample.java similarity index 100% rename from examples/src/main/java/dev/braintrust/examples/RemoteEvalExample.java rename to examples/remote-eval/src/main/java/dev/braintrust/examples/RemoteEvalExample.java diff --git a/examples/scala/SimpleExample.scala b/examples/scala/SimpleExample.scala deleted file mode 100644 index ed32eea4..00000000 --- a/examples/scala/SimpleExample.scala +++ /dev/null @@ -1,104 +0,0 @@ -package dev.braintrust.examples.scala - -import dev.braintrust.scala._ -import scala.concurrent.ExecutionContext.Implicits.global -import scala.concurrent.Future -import scala.util.{Success, Failure} - -object SimpleExample extends App { - - // Initialize Braintrust - val otel = BraintrustTracing.quickstart { config => - config - .withServiceName("scala-example") - .withDebug(true) - } - - implicit val tracer = BraintrustTracing.getTracer(otel) - - // Example 1: Simple synchronous span - println("=== Example 1: Synchronous Span ===") - tracer.span("process-data") { span => - span.setAttribute("data.size", 100) - - // Simulate some work - Thread.sleep(100) - - span.addScore("accuracy", 0.95) - span.addUsage(150, 50, 0.003) - - println("Processed data successfully") - } - - // Example 2: Async operation - println("\n=== Example 2: Async Operation ===") - val futureResult = tracer.spanAsync("async-api-call") { span => - Future { - span.setAttribute("api.endpoint", "/v1/generate") - - // Simulate API call - Thread.sleep(200) - - if (math.random() > 0.1) { - span.addScore("success", 1.0) - "API call successful" - } else { - throw new Exception("Random API failure") - } - } - } - - futureResult.onComplete { - case Success(result) => - println(s"Async result: $result") - case Failure(error) => - println(s"Async error: ${error.getMessage}") - } - - // Example 3: Nested spans - println("\n=== Example 3: Nested Spans ===") - tracer.span("parent-operation") { parentSpan => - parentSpan.setAttribute("operation.type", "batch") - - val results = (1 to 3).map { i => - tracer.span(s"child-operation-$i") { childSpan => - childSpan.setAttribute("item.id", i) - Thread.sleep(50) - i * 2 - } - } - - parentSpan.setAttribute("results.sum", results.sum) - println(s"Batch results: ${results.mkString(", ")}") - } - - // Example 4: Error handling - println("\n=== Example 4: Error Handling ===") - val errorResult = tracer.spanAsync("error-prone-operation") { span => - Future { - span.setAttribute("retry.attempt", 1) - - try { - if (math.random() < 0.5) { - throw new RuntimeException("Simulated error") - } - "Success" - } catch { - case e: Exception => - span.recordException(e) - span.setStatus(io.opentelemetry.api.trace.StatusCode.ERROR) - throw e - } - } - }.recover { - case e: Exception => - println(s"Handled error: ${e.getMessage}") - "Recovered from error" - } - - // Wait for async operations - Thread.sleep(1000) - - println("\n=== Examples Complete ===") - println("Check your Braintrust dashboard for traces!") -} \ No newline at end of file diff --git a/examples/simple-open-telemetry/build.gradle b/examples/simple-open-telemetry/build.gradle new file mode 100644 index 00000000..545b15ce --- /dev/null +++ b/examples/simple-open-telemetry/build.gradle @@ -0,0 +1,7 @@ +application { + mainClass = 'dev.braintrust.examples.SimpleOpenTelemetryExample' +} + +run { + description = 'Run the simple OpenTelemetry example' +} diff --git a/examples/src/main/java/dev/braintrust/examples/SimpleOpenTelemetryExample.java b/examples/simple-open-telemetry/src/main/java/dev/braintrust/examples/SimpleOpenTelemetryExample.java similarity index 100% rename from examples/src/main/java/dev/braintrust/examples/SimpleOpenTelemetryExample.java rename to examples/simple-open-telemetry/src/main/java/dev/braintrust/examples/SimpleOpenTelemetryExample.java diff --git a/examples/spring-ai/build.gradle b/examples/spring-ai/build.gradle new file mode 100644 index 00000000..cec1e938 --- /dev/null +++ b/examples/spring-ai/build.gradle @@ -0,0 +1,36 @@ +application { + mainClass = 'dev.braintrust.examples.SpringAIExample' +} + +dependencies { + implementation project(':braintrust-sdk:instrumentation:springai_1_0_0') + implementation project(':braintrust-sdk:instrumentation:aws_bedrock_2_30_0') + implementation project(':braintrust-sdk:instrumentation:genai_1_18_0') + + // spring ai + implementation 'org.springframework.ai:spring-ai-anthropic:1.1.0' + implementation 'org.springframework.ai:spring-ai-bedrock-converse:1.1.0' + implementation 'org.springframework.ai:spring-ai-google-genai:1.1.0' + implementation 'org.springframework.ai:spring-ai-openai:1.1.0' + + // spring-ai-openai requires spring-webflux (WebClient) at runtime + implementation 'org.springframework:spring-webflux:6.2.3' + + // spring boot (exclude logback, use slf4j-simple like other examples) + implementation('org.springframework.boot:spring-boot-starter:3.4.1') { + exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging' + } + + // google genai client + implementation 'com.google.genai:google-genai:1.20.0' +} + +run { + description = 'Run the Spring Boot + Spring AI example' + debugOptions { + enabled = true + port = 5566 + server = true + suspend = false + } +} diff --git a/examples/src/main/java/dev/braintrust/examples/SpringAIExample.java b/examples/spring-ai/src/main/java/dev/braintrust/examples/SpringAIExample.java similarity index 100% rename from examples/src/main/java/dev/braintrust/examples/SpringAIExample.java rename to examples/spring-ai/src/main/java/dev/braintrust/examples/SpringAIExample.java diff --git a/examples/trace-scoring/build.gradle b/examples/trace-scoring/build.gradle new file mode 100644 index 00000000..f0885ac6 --- /dev/null +++ b/examples/trace-scoring/build.gradle @@ -0,0 +1,18 @@ +application { + mainClass = 'dev.braintrust.examples.TraceScoringExample' +} + +dependencies { + implementation project(':braintrust-sdk:instrumentation:openai_2_15_0') + implementation 'com.openai:openai-java:2.8.1' +} + +run { + description = 'Run the trace scoring example' + debugOptions { + enabled = true + port = 5566 + server = true + suspend = false + } +} diff --git a/examples/src/main/java/dev/braintrust/examples/TraceScoringExample.java b/examples/trace-scoring/src/main/java/dev/braintrust/examples/TraceScoringExample.java similarity index 100% rename from examples/src/main/java/dev/braintrust/examples/TraceScoringExample.java rename to examples/trace-scoring/src/main/java/dev/braintrust/examples/TraceScoringExample.java diff --git a/settings.gradle b/settings.gradle index 436211e6..6377d417 100644 --- a/settings.gradle +++ b/settings.gradle @@ -7,6 +7,20 @@ rootProject.name = 'braintrust-sdk-java' include 'braintrust-sdk' include 'test-harness' include 'examples' +include 'examples:simple-open-telemetry' +include 'examples:custom-open-telemetry' +include 'examples:openai-instrumentation' +include 'examples:anthropic-instrumentation' +include 'examples:gemini-instrumentation' +include 'examples:langchain-simple' +include 'examples:langchain-ai-services' +include 'examples:spring-ai' +include 'examples:experiment' +include 'examples:prompt-fetching' +include 'examples:remote-eval' +include 'examples:remote-eval-with-params' +include 'examples:trace-scoring' +include 'examples:classifiers' include 'braintrust-java-agent' include 'braintrust-java-agent:bootstrap' include 'braintrust-java-agent:internal'