Mastra is a TypeScript framework for building AI agents. Braintrust integrates with Mastra’s observability system to automatically trace agent executions, LLM calls, and tool usage.
Setup
Install Mastra with the Braintrust exporter:
# pnpm
pnpm add @mastra/core @mastra/braintrust @mastra/observability braintrust
# npm
npm install @mastra/core @mastra/braintrust @mastra/observability braintrust
Trace with Mastra
Configure the BraintrustExporter in Mastra’s observability settings:
import { Agent } from "@mastra/core/agent";
import { Mastra } from "@mastra/core/mastra";
import { Observability } from "@mastra/observability";
import { BraintrustExporter } from "@mastra/braintrust";
import { initLogger } from "braintrust";
const logger = initLogger({ projectName: "mastra-demo" });
const exporter = new BraintrustExporter({
braintrustLogger: logger,
});
const mastra = new Mastra({
agents: {
assistant: new Agent({
name: "Assistant",
instructions: "You only respond in haikus.",
model: "openai/gpt-4o-mini",
}),
},
observability: new Observability({
configs: {
braintrust: {
serviceName: "demo",
exporters: [exporter],
},
},
}),
});
async function main() {
const agent = mastra.getAgent("assistant");
const response = await agent.generate("Tell me about recursion in programming.");
console.log(response.text);
}
main();
The BraintrustExporter constructor can accept a braintrust.Span, braintrust.Experiment, or braintrust.Logger as the braintrustLogger option. This enables automatic nesting of Mastra traces within Braintrust contexts like evals or traced functions.
Evaluate with Mastra
Use Mastra agents as the task in a Braintrust Eval to build and evaluate agentic workflows:
import { Agent } from "@mastra/core/agent";
import { Mastra } from "@mastra/core/mastra";
import { Observability } from "@mastra/observability";
import { BraintrustExporter } from "@mastra/braintrust";
import { Eval, initLogger } from "braintrust";
const logger = initLogger({ projectName: "mastra-demo" });
const exporter = new BraintrustExporter({
braintrustLogger: logger,
});
const mastra = new Mastra({
agents: {
assistant: new Agent({
name: "Assistant",
instructions: "You only respond in haikus.",
model: "openai/gpt-4o-mini",
}),
},
observability: new Observability({
configs: {
braintrust: {
serviceName: "demo",
exporters: [exporter],
},
},
}),
});
Eval('mastra-demo', {
data: () => [
{ input: 'What is the capital of France?', expected: 'Paris' },
{ input: 'What is 2+2?', expected: '4' },
],
task: async (input: string) => {
const agent = mastra.getAgent('assistant');
return (await agent.generate(input)).text;
},
scores: [
(args: { output: string; expected: string }) => ({
name: 'contains_answer',
score: String(args.output).toLowerCase().includes(String(args.expected).toLowerCase()) ? 1 : 0,
}),
],
});
Resources