@mastra/braintrust 1.0.0-beta.1 → 1.0.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @mastra/braintrust
2
2
 
3
+ ## 1.0.0-beta.2
4
+
5
+ ### Minor Changes
6
+
7
+ - Adds trace tagging support to the BrainTrust and Langfuse tracing exporters. ([#10765](https://github.com/mastra-ai/mastra/pull/10765))
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies [[`ac0d2f4`](https://github.com/mastra-ai/mastra/commit/ac0d2f4ff8831f72c1c66c2be809706d17f65789), [`1a0d3fc`](https://github.com/mastra-ai/mastra/commit/1a0d3fc811482c9c376cdf79ee615c23bae9b2d6), [`85a628b`](https://github.com/mastra-ai/mastra/commit/85a628b1224a8f64cd82ea7f033774bf22df7a7e), [`c237233`](https://github.com/mastra-ai/mastra/commit/c23723399ccedf7f5744b3f40997b79246bfbe64), [`15f9e21`](https://github.com/mastra-ai/mastra/commit/15f9e216177201ea6e3f6d0bfb063fcc0953444f), [`ff94dea`](https://github.com/mastra-ai/mastra/commit/ff94dea935f4e34545c63bcb6c29804732698809), [`5b2ff46`](https://github.com/mastra-ai/mastra/commit/5b2ff4651df70c146523a7fca773f8eb0a2272f8), [`db41688`](https://github.com/mastra-ai/mastra/commit/db4168806d007417e2e60b4f68656dca4e5f40c9), [`103586c`](https://github.com/mastra-ai/mastra/commit/103586cb23ebcd2466c7f68a71674d37cc10e263), [`5ca599d`](https://github.com/mastra-ai/mastra/commit/5ca599d0bb59a1595f19f58473fcd67cc71cef58), [`bff1145`](https://github.com/mastra-ai/mastra/commit/bff114556b3cbadad9b2768488708f8ad0e91475), [`5c8ca24`](https://github.com/mastra-ai/mastra/commit/5c8ca247094e0cc2cdbd7137822fb47241f86e77), [`e191844`](https://github.com/mastra-ai/mastra/commit/e1918444ca3f80e82feef1dad506cd4ec6e2875f), [`22553f1`](https://github.com/mastra-ai/mastra/commit/22553f11c63ee5e966a9c034a349822249584691), [`7237163`](https://github.com/mastra-ai/mastra/commit/72371635dbf96a87df4b073cc48fc655afbdce3d), [`2500740`](https://github.com/mastra-ai/mastra/commit/2500740ea23da067d6e50ec71c625ab3ce275e64), [`873ecbb`](https://github.com/mastra-ai/mastra/commit/873ecbb517586aa17d2f1e99283755b3ebb2863f), [`4f9bbe5`](https://github.com/mastra-ai/mastra/commit/4f9bbe5968f42c86f4930b8193de3c3c17e5bd36), [`02e51fe`](https://github.com/mastra-ai/mastra/commit/02e51feddb3d4155cfbcc42624fd0d0970d032c0), [`8f3fa3a`](https://github.com/mastra-ai/mastra/commit/8f3fa3a652bb77da092f913ec51ae46e3a7e27dc), [`cd29ad2`](https://github.com/mastra-ai/mastra/commit/cd29ad23a255534e8191f249593849ed29160886), [`bdf4d8c`](https://github.com/mastra-ai/mastra/commit/bdf4d8cdc656d8a2c21d81834bfa3bfa70f56c16), [`854e3da`](https://github.com/mastra-ai/mastra/commit/854e3dad5daac17a91a20986399d3a51f54bf68b), [`ce18d38`](https://github.com/mastra-ai/mastra/commit/ce18d38678c65870350d123955014a8432075fd9), [`cccf9c8`](https://github.com/mastra-ai/mastra/commit/cccf9c8b2d2dfc1a5e63919395b83d78c89682a0), [`61a5705`](https://github.com/mastra-ai/mastra/commit/61a570551278b6743e64243b3ce7d73de915ca8a), [`db70a48`](https://github.com/mastra-ai/mastra/commit/db70a48aeeeeb8e5f92007e8ede52c364ce15287), [`f0fdc14`](https://github.com/mastra-ai/mastra/commit/f0fdc14ee233d619266b3d2bbdeea7d25cfc6d13), [`db18bc9`](https://github.com/mastra-ai/mastra/commit/db18bc9c3825e2c1a0ad9a183cc9935f6691bfa1), [`9b37b56`](https://github.com/mastra-ai/mastra/commit/9b37b565e1f2a76c24f728945cc740c2b09be9da), [`41a23c3`](https://github.com/mastra-ai/mastra/commit/41a23c32f9877d71810f37e24930515df2ff7a0f), [`5d171ad`](https://github.com/mastra-ai/mastra/commit/5d171ad9ef340387276b77c2bb3e83e83332d729), [`f03ae60`](https://github.com/mastra-ai/mastra/commit/f03ae60500fe350c9d828621006cdafe1975fdd8), [`d1e74a0`](https://github.com/mastra-ai/mastra/commit/d1e74a0a293866dece31022047f5dbab65a304d0), [`39e7869`](https://github.com/mastra-ai/mastra/commit/39e7869bc7d0ee391077ce291474d8a84eedccff), [`5761926`](https://github.com/mastra-ai/mastra/commit/57619260c4a2cdd598763abbacd90de594c6bc76), [`c900fdd`](https://github.com/mastra-ai/mastra/commit/c900fdd504c41348efdffb205cfe80d48c38fa33), [`604a79f`](https://github.com/mastra-ai/mastra/commit/604a79fecf276e26a54a3fe01bb94e65315d2e0e), [`887f0b4`](https://github.com/mastra-ai/mastra/commit/887f0b4746cdbd7cb7d6b17ac9f82aeb58037ea5), [`2562143`](https://github.com/mastra-ai/mastra/commit/256214336b4faa78646c9c1776612393790d8784), [`ef11a61`](https://github.com/mastra-ai/mastra/commit/ef11a61920fa0ed08a5b7ceedd192875af119749)]:
12
+ - @mastra/core@1.0.0-beta.6
13
+ - @mastra/observability@1.0.0-beta.2
14
+
3
15
  ## 1.0.0-beta.1
4
16
 
5
17
  ### Patch Changes
package/dist/index.cjs CHANGED
@@ -124,7 +124,8 @@ var BraintrustExporter = class extends observability.BaseExporter {
124
124
  braintrustSpan.log({
125
125
  metadata: {
126
126
  [MASTRA_TRACE_ID_METADATA_KEY]: span.traceId
127
- }
127
+ },
128
+ ...span.isRootSpan && span.tags?.length ? { tags: span.tags } : {}
128
129
  });
129
130
  spanData.spans.set(span.id, braintrustSpan);
130
131
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/metrics.ts","../src/tracing.ts"],"names":["SpanType","BaseExporter","initLogger","currentSpan","omitKeys"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ModelGenerationAttributes } from '@mastra/core/observability';\n/**\n * BraintrustUsageMetrics\n *\n * Canonical metric keys expected by Braintrust for LLM usage accounting.\n * These map various provider/SDK-specific usage fields to a common schema.\n * - prompt_tokens: input-side tokens (aka inputTokens/promptTokens)\n * - completion_tokens: output-side tokens (aka outputTokens/completionTokens)\n * - tokens: total tokens (provided or derived)\n * - completion_reasoning_tokens: reasoning tokens, when available\n * - prompt_cached_tokens: tokens served from cache (provider-specific)\n * - prompt_cache_creation_tokens: tokens used to create cache (provider-specific)\n */\nexport interface BraintrustUsageMetrics {\n prompt_tokens?: number;\n completion_tokens?: number;\n tokens?: number;\n completion_reasoning_tokens?: number;\n prompt_cached_tokens?: number;\n prompt_cache_creation_tokens?: number;\n [key: string]: number | undefined;\n}\n\nexport function normalizeUsageMetrics(modelAttr: ModelGenerationAttributes): BraintrustUsageMetrics {\n const metrics: BraintrustUsageMetrics = {};\n\n if (modelAttr.usage?.inputTokens !== undefined) {\n metrics.prompt_tokens = modelAttr.usage?.inputTokens;\n } else if (modelAttr.usage?.promptTokens !== undefined) {\n metrics.prompt_tokens = modelAttr.usage?.promptTokens;\n }\n\n if (modelAttr.usage?.outputTokens !== undefined) {\n metrics.completion_tokens = modelAttr.usage?.outputTokens;\n } else if (modelAttr.usage?.completionTokens !== undefined) {\n metrics.completion_tokens = modelAttr.usage?.completionTokens;\n }\n\n if (modelAttr.usage?.totalTokens !== undefined) {\n metrics.tokens = modelAttr.usage?.totalTokens;\n }\n if (modelAttr.usage?.reasoningTokens !== undefined) {\n metrics.completion_reasoning_tokens = modelAttr.usage?.reasoningTokens;\n }\n if (modelAttr.usage?.promptCacheHitTokens !== undefined) {\n metrics.prompt_cached_tokens = modelAttr.usage?.promptCacheHitTokens;\n }\n if (modelAttr.usage?.promptCacheMissTokens !== undefined) {\n metrics.prompt_cache_creation_tokens = modelAttr.usage?.promptCacheMissTokens;\n }\n\n return metrics;\n}\n","/**\n * Braintrust Exporter for Mastra Observability\n *\n * This exporter sends observability data to Braintrust.\n * Root spans become top-level Braintrust spans (no trace wrapper).\n * Events are handled as zero-duration spans with matching start/end times.\n */\n\nimport type { TracingEvent, AnyExportedSpan, ModelGenerationAttributes } from '@mastra/core/observability';\nimport { SpanType } from '@mastra/core/observability';\nimport { omitKeys } from '@mastra/core/utils';\nimport { BaseExporter } from '@mastra/observability';\nimport type { BaseExporterConfig } from '@mastra/observability';\nimport { initLogger, currentSpan } from 'braintrust';\nimport type { Span, Logger } from 'braintrust';\nimport { normalizeUsageMetrics } from './metrics';\n\nconst MASTRA_TRACE_ID_METADATA_KEY = 'mastra-trace-id';\n\nexport interface BraintrustExporterConfig extends BaseExporterConfig {\n /**\n * Optional Braintrust logger instance.\n * When provided, enables integration with Braintrust contexts such as:\n * - Evals: Agent traces nest inside eval task spans\n * - logger.traced(): Agent traces nest inside traced spans\n * - Parent spans: Auto-detects and attaches to external Braintrust spans\n */\n braintrustLogger?: Logger<true>;\n\n /** Braintrust API key. Required if logger is not provided. */\n apiKey?: string;\n /** Optional custom endpoint */\n endpoint?: string;\n /** Braintrust project name (default: 'mastra-tracing') */\n projectName?: string;\n /** Support tuning parameters */\n tuningParameters?: Record<string, any>;\n}\n\ntype SpanData = {\n logger: Logger<true> | Span; // Braintrust logger (for root spans) or external span\n spans: Map<string, Span>; // Maps span.id to Braintrust span\n activeIds: Set<string>; // Tracks started (non-event) spans not yet ended, including root\n isExternal: boolean; // True if logger is an external span from logger.traced() or Eval()\n};\n\n// Default span type for all spans\nconst DEFAULT_SPAN_TYPE = 'task';\n\n// Exceptions to the default mapping\nconst SPAN_TYPE_EXCEPTIONS: Partial<Record<SpanType, string>> = {\n [SpanType.MODEL_GENERATION]: 'llm',\n [SpanType.MODEL_CHUNK]: 'llm',\n [SpanType.TOOL_CALL]: 'tool',\n [SpanType.MCP_TOOL_CALL]: 'tool',\n [SpanType.WORKFLOW_CONDITIONAL_EVAL]: 'function',\n [SpanType.WORKFLOW_WAIT_EVENT]: 'function',\n};\n\n// Mapping function - returns valid Braintrust span types\nfunction mapSpanType(spanType: SpanType): 'llm' | 'score' | 'function' | 'eval' | 'task' | 'tool' {\n return (SPAN_TYPE_EXCEPTIONS[spanType] as any) ?? DEFAULT_SPAN_TYPE;\n}\n\nexport class BraintrustExporter extends BaseExporter {\n name = 'braintrust';\n private traceMap = new Map<string, SpanData>();\n private config: BraintrustExporterConfig;\n\n // Flags and logger for context-aware mode\n private useProvidedLogger: boolean;\n private providedLogger?: Logger<true>;\n\n constructor(config: BraintrustExporterConfig) {\n super(config);\n\n if (config.braintrustLogger) {\n // Use provided logger - enables Braintrust context integration\n this.useProvidedLogger = true;\n this.providedLogger = config.braintrustLogger;\n this.config = config;\n } else {\n // Validate apiKey for creating loggers per trace\n if (!config.apiKey) {\n this.setDisabled(`Missing required credentials (apiKey: ${!!config.apiKey})`);\n this.config = null as any;\n this.useProvidedLogger = false;\n return;\n }\n this.useProvidedLogger = false;\n this.config = config;\n }\n }\n\n protected async _exportTracingEvent(event: TracingEvent): Promise<void> {\n if (event.exportedSpan.isEvent) {\n await this.handleEventSpan(event.exportedSpan);\n return;\n }\n\n switch (event.type) {\n case 'span_started':\n await this.handleSpanStarted(event.exportedSpan);\n break;\n case 'span_updated':\n await this.handleSpanUpdateOrEnd(event.exportedSpan, false);\n break;\n case 'span_ended':\n await this.handleSpanUpdateOrEnd(event.exportedSpan, true);\n break;\n }\n }\n\n private async handleSpanStarted(span: AnyExportedSpan): Promise<void> {\n if (span.isRootSpan) {\n if (this.useProvidedLogger) {\n // Use provided logger, detect external Braintrust spans\n await this.initLoggerOrUseContext(span);\n } else {\n // Create new logger per trace\n await this.initLoggerPerTrace(span);\n }\n }\n\n const method = 'handleSpanStarted';\n const spanData = this.getSpanData({ span, method });\n if (!spanData) {\n return;\n }\n\n // Refcount: track active non-event spans (including root)\n if (!span.isEvent) {\n spanData.activeIds.add(span.id);\n }\n\n const braintrustParent = this.getBraintrustParent({ spanData, span, method });\n if (!braintrustParent) {\n return;\n }\n\n const payload = this.buildSpanPayload(span);\n\n // When attaching to an external parent (eval/logger span), don't pass Mastra's internal\n // parentSpanIds. Let Braintrust auto-handle the parent-child relationship.\n const shouldOmitParentIds = spanData.isExternal && !span.parentSpanId;\n\n const braintrustSpan = braintrustParent.startSpan({\n spanId: span.id,\n name: span.name,\n type: mapSpanType(span.type),\n ...(shouldOmitParentIds\n ? {}\n : {\n parentSpanIds: span.parentSpanId\n ? { spanId: span.parentSpanId, rootSpanId: span.traceId }\n : { spanId: span.traceId, rootSpanId: span.traceId },\n }),\n ...payload,\n });\n\n // Include the Mastra trace ID in the span metadata for correlation\n braintrustSpan.log({\n metadata: {\n [MASTRA_TRACE_ID_METADATA_KEY]: span.traceId,\n },\n });\n\n spanData.spans.set(span.id, braintrustSpan);\n }\n\n private async handleSpanUpdateOrEnd(span: AnyExportedSpan, isEnd: boolean): Promise<void> {\n const method = isEnd ? 'handleSpanEnd' : 'handleSpanUpdate';\n\n const spanData = this.getSpanData({ span, method });\n if (!spanData) {\n return;\n }\n\n const braintrustSpan = spanData.spans.get(span.id);\n if (!braintrustSpan) {\n this.logger.warn('Braintrust exporter: No Braintrust span found for span update/end', {\n traceId: span.traceId,\n spanId: span.id,\n spanName: span.name,\n spanType: span.type,\n isRootSpan: span.isRootSpan,\n parentSpanId: span.parentSpanId,\n method,\n });\n return;\n }\n\n braintrustSpan.log(this.buildSpanPayload(span));\n\n if (isEnd) {\n // End the span with the correct endTime (convert milliseconds to seconds)\n if (span.endTime) {\n braintrustSpan.end({ endTime: span.endTime.getTime() / 1000 });\n } else {\n braintrustSpan.end();\n }\n\n // Refcount: mark this span as ended\n if (!span.isEvent) {\n spanData.activeIds.delete(span.id);\n }\n\n // If no more active spans remain for this trace, clean up the trace entry\n // Don't clean up if using external spans (they're managed by Braintrust)\n if (spanData.activeIds.size === 0 && !spanData.isExternal) {\n this.traceMap.delete(span.traceId);\n }\n }\n }\n\n private async handleEventSpan(span: AnyExportedSpan): Promise<void> {\n if (span.isRootSpan) {\n this.logger.debug('Braintrust exporter: Creating logger for event', {\n traceId: span.traceId,\n spanId: span.id,\n spanName: span.name,\n method: 'handleEventSpan',\n });\n\n if (this.useProvidedLogger) {\n // Use provided logger, detect external Braintrust spans\n await this.initLoggerOrUseContext(span);\n } else {\n // Create new logger per trace\n await this.initLoggerPerTrace(span);\n }\n }\n\n const method = 'handleEventSpan';\n const spanData = this.getSpanData({ span, method });\n if (!spanData) {\n return;\n }\n\n const braintrustParent = this.getBraintrustParent({ spanData, span, method });\n if (!braintrustParent) {\n return;\n }\n\n const payload = this.buildSpanPayload(span);\n\n // Create zero-duration span for event (convert milliseconds to seconds)\n const braintrustSpan = braintrustParent.startSpan({\n spanId: span.id,\n name: span.name,\n type: mapSpanType(span.type),\n parentSpanIds: span.parentSpanId\n ? { spanId: span.parentSpanId, rootSpanId: span.traceId }\n : { spanId: span.traceId, rootSpanId: span.traceId },\n startTime: span.startTime.getTime() / 1000,\n ...payload,\n });\n\n braintrustSpan.end({ endTime: span.startTime.getTime() / 1000 });\n }\n\n /**\n * Creates a new logger per trace using config credentials\n */\n private async initLoggerPerTrace(span: AnyExportedSpan): Promise<void> {\n const logger = await initLogger({\n projectName: this.config.projectName ?? 'mastra-tracing',\n apiKey: this.config.apiKey,\n appUrl: this.config.endpoint,\n ...this.config.tuningParameters,\n });\n\n this.traceMap.set(span.traceId, {\n logger,\n spans: new Map(),\n activeIds: new Set(),\n isExternal: false,\n });\n }\n\n /**\n * Uses provided logger and detects external Braintrust spans.\n * If a Braintrust span is detected (from logger.traced() or Eval()), attaches to it.\n * Otherwise, uses the provided logger instance.\n */\n private async initLoggerOrUseContext(span: AnyExportedSpan): Promise<void> {\n // Try to find a Braintrust span to attach to:\n // 1. Auto-detect from Braintrust's current span (logger.traced(), Eval(), etc.)\n // 2. Fall back to the configured logger\n const braintrustSpan = currentSpan();\n\n // Check if it's a valid span (not the NOOP_SPAN)\n if (braintrustSpan && braintrustSpan.id) {\n // External span detected - attach Mastra traces to it\n this.traceMap.set(span.traceId, {\n logger: braintrustSpan,\n spans: new Map(),\n activeIds: new Set(),\n isExternal: true,\n });\n } else {\n // No external span - use provided logger\n this.traceMap.set(span.traceId, {\n logger: this.providedLogger!,\n spans: new Map(),\n activeIds: new Set(),\n isExternal: false,\n });\n }\n }\n\n private getSpanData(options: { span: AnyExportedSpan; method: string }): SpanData | undefined {\n const { span, method } = options;\n if (this.traceMap.has(span.traceId)) {\n return this.traceMap.get(span.traceId);\n }\n\n this.logger.warn('Braintrust exporter: No span data found for span', {\n traceId: span.traceId,\n spanId: span.id,\n spanName: span.name,\n spanType: span.type,\n isRootSpan: span.isRootSpan,\n parentSpanId: span.parentSpanId,\n method,\n });\n }\n\n private getBraintrustParent(options: {\n spanData: SpanData;\n span: AnyExportedSpan;\n method: string;\n }): Logger<true> | Span | undefined {\n const { spanData, span, method } = options;\n\n const parentId = span.parentSpanId;\n if (!parentId) {\n return spanData.logger;\n }\n\n if (spanData.spans.has(parentId)) {\n return spanData.spans.get(parentId);\n }\n\n // If the parent exists but is the root span (not represented as a Braintrust\n // span because we use the logger as the root), attach to the logger so the\n // span is not orphaned. We need to check if parentSpanId exists but the\n // parent span is not in our spans map (indicating it's the root span).\n if (parentId && !spanData.spans.has(parentId)) {\n // This means the parent exists but isn't tracked as a Braintrust span,\n // which happens when the parent is the root span (we use logger as root)\n return spanData.logger;\n }\n\n this.logger.warn('Braintrust exporter: No parent data found for span', {\n traceId: span.traceId,\n spanId: span.id,\n spanName: span.name,\n spanType: span.type,\n isRootSpan: span.isRootSpan,\n parentSpanId: span.parentSpanId,\n method,\n });\n }\n\n private buildSpanPayload(span: AnyExportedSpan): Record<string, any> {\n const payload: Record<string, any> = {};\n\n // Core span data\n if (span.input !== undefined) {\n payload.input = span.input;\n }\n\n if (span.output !== undefined) {\n payload.output = span.output;\n }\n\n // Initialize metrics and metadata objects\n payload.metrics = {};\n payload.metadata = {\n spanType: span.type,\n ...span.metadata,\n };\n\n const attributes = (span.attributes ?? {}) as Record<string, any>;\n\n if (span.type === SpanType.MODEL_GENERATION) {\n const modelAttr = attributes as ModelGenerationAttributes;\n\n // Model goes to metadata\n if (modelAttr.model !== undefined) {\n payload.metadata.model = modelAttr.model;\n }\n\n // Provider goes to metadata (if provided by attributes)\n if (modelAttr.provider !== undefined) {\n payload.metadata.provider = modelAttr.provider;\n }\n\n // Usage/token info goes to metrics\n payload.metrics = normalizeUsageMetrics(modelAttr);\n\n // Model parameters go to metadata\n if (modelAttr.parameters !== undefined) {\n payload.metadata.modelParameters = modelAttr.parameters;\n }\n\n // Other LLM attributes go to metadata\n const otherAttributes = omitKeys(attributes, ['model', 'usage', 'parameters']);\n payload.metadata = {\n ...payload.metadata,\n ...otherAttributes,\n };\n } else {\n // For non-LLM spans, put all attributes in metadata\n payload.metadata = {\n ...payload.metadata,\n ...attributes,\n };\n }\n\n // Handle errors\n if (span.errorInfo) {\n payload.error = span.errorInfo.message;\n payload.metadata.errorDetails = span.errorInfo;\n }\n\n // Clean up empty metrics object\n if (Object.keys(payload.metrics).length === 0) {\n delete payload.metrics;\n }\n\n return payload;\n }\n\n async shutdown(): Promise<void> {\n if (!this.config) {\n return;\n }\n\n // End all active spans\n for (const [_traceId, spanData] of this.traceMap) {\n for (const [_spanId, span] of spanData.spans) {\n span.end();\n }\n // Loggers don't have an explicit shutdown method\n }\n this.traceMap.clear();\n await super.shutdown();\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/metrics.ts","../src/tracing.ts"],"names":["SpanType","BaseExporter","initLogger","currentSpan","omitKeys"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ModelGenerationAttributes } from '@mastra/core/observability';\n/**\n * BraintrustUsageMetrics\n *\n * Canonical metric keys expected by Braintrust for LLM usage accounting.\n * These map various provider/SDK-specific usage fields to a common schema.\n * - prompt_tokens: input-side tokens (aka inputTokens/promptTokens)\n * - completion_tokens: output-side tokens (aka outputTokens/completionTokens)\n * - tokens: total tokens (provided or derived)\n * - completion_reasoning_tokens: reasoning tokens, when available\n * - prompt_cached_tokens: tokens served from cache (provider-specific)\n * - prompt_cache_creation_tokens: tokens used to create cache (provider-specific)\n */\nexport interface BraintrustUsageMetrics {\n prompt_tokens?: number;\n completion_tokens?: number;\n tokens?: number;\n completion_reasoning_tokens?: number;\n prompt_cached_tokens?: number;\n prompt_cache_creation_tokens?: number;\n [key: string]: number | undefined;\n}\n\nexport function normalizeUsageMetrics(modelAttr: ModelGenerationAttributes): BraintrustUsageMetrics {\n const metrics: BraintrustUsageMetrics = {};\n\n if (modelAttr.usage?.inputTokens !== undefined) {\n metrics.prompt_tokens = modelAttr.usage?.inputTokens;\n } else if (modelAttr.usage?.promptTokens !== undefined) {\n metrics.prompt_tokens = modelAttr.usage?.promptTokens;\n }\n\n if (modelAttr.usage?.outputTokens !== undefined) {\n metrics.completion_tokens = modelAttr.usage?.outputTokens;\n } else if (modelAttr.usage?.completionTokens !== undefined) {\n metrics.completion_tokens = modelAttr.usage?.completionTokens;\n }\n\n if (modelAttr.usage?.totalTokens !== undefined) {\n metrics.tokens = modelAttr.usage?.totalTokens;\n }\n if (modelAttr.usage?.reasoningTokens !== undefined) {\n metrics.completion_reasoning_tokens = modelAttr.usage?.reasoningTokens;\n }\n if (modelAttr.usage?.promptCacheHitTokens !== undefined) {\n metrics.prompt_cached_tokens = modelAttr.usage?.promptCacheHitTokens;\n }\n if (modelAttr.usage?.promptCacheMissTokens !== undefined) {\n metrics.prompt_cache_creation_tokens = modelAttr.usage?.promptCacheMissTokens;\n }\n\n return metrics;\n}\n","/**\n * Braintrust Exporter for Mastra Observability\n *\n * This exporter sends observability data to Braintrust.\n * Root spans become top-level Braintrust spans (no trace wrapper).\n * Events are handled as zero-duration spans with matching start/end times.\n */\n\nimport type { TracingEvent, AnyExportedSpan, ModelGenerationAttributes } from '@mastra/core/observability';\nimport { SpanType } from '@mastra/core/observability';\nimport { omitKeys } from '@mastra/core/utils';\nimport { BaseExporter } from '@mastra/observability';\nimport type { BaseExporterConfig } from '@mastra/observability';\nimport { initLogger, currentSpan } from 'braintrust';\nimport type { Span, Logger } from 'braintrust';\nimport { normalizeUsageMetrics } from './metrics';\n\nconst MASTRA_TRACE_ID_METADATA_KEY = 'mastra-trace-id';\n\nexport interface BraintrustExporterConfig extends BaseExporterConfig {\n /**\n * Optional Braintrust logger instance.\n * When provided, enables integration with Braintrust contexts such as:\n * - Evals: Agent traces nest inside eval task spans\n * - logger.traced(): Agent traces nest inside traced spans\n * - Parent spans: Auto-detects and attaches to external Braintrust spans\n */\n braintrustLogger?: Logger<true>;\n\n /** Braintrust API key. Required if logger is not provided. */\n apiKey?: string;\n /** Optional custom endpoint */\n endpoint?: string;\n /** Braintrust project name (default: 'mastra-tracing') */\n projectName?: string;\n /** Support tuning parameters */\n tuningParameters?: Record<string, any>;\n}\n\ntype SpanData = {\n logger: Logger<true> | Span; // Braintrust logger (for root spans) or external span\n spans: Map<string, Span>; // Maps span.id to Braintrust span\n activeIds: Set<string>; // Tracks started (non-event) spans not yet ended, including root\n isExternal: boolean; // True if logger is an external span from logger.traced() or Eval()\n};\n\n// Default span type for all spans\nconst DEFAULT_SPAN_TYPE = 'task';\n\n// Exceptions to the default mapping\nconst SPAN_TYPE_EXCEPTIONS: Partial<Record<SpanType, string>> = {\n [SpanType.MODEL_GENERATION]: 'llm',\n [SpanType.MODEL_CHUNK]: 'llm',\n [SpanType.TOOL_CALL]: 'tool',\n [SpanType.MCP_TOOL_CALL]: 'tool',\n [SpanType.WORKFLOW_CONDITIONAL_EVAL]: 'function',\n [SpanType.WORKFLOW_WAIT_EVENT]: 'function',\n};\n\n// Mapping function - returns valid Braintrust span types\nfunction mapSpanType(spanType: SpanType): 'llm' | 'score' | 'function' | 'eval' | 'task' | 'tool' {\n return (SPAN_TYPE_EXCEPTIONS[spanType] as any) ?? DEFAULT_SPAN_TYPE;\n}\n\nexport class BraintrustExporter extends BaseExporter {\n name = 'braintrust';\n private traceMap = new Map<string, SpanData>();\n private config: BraintrustExporterConfig;\n\n // Flags and logger for context-aware mode\n private useProvidedLogger: boolean;\n private providedLogger?: Logger<true>;\n\n constructor(config: BraintrustExporterConfig) {\n super(config);\n\n if (config.braintrustLogger) {\n // Use provided logger - enables Braintrust context integration\n this.useProvidedLogger = true;\n this.providedLogger = config.braintrustLogger;\n this.config = config;\n } else {\n // Validate apiKey for creating loggers per trace\n if (!config.apiKey) {\n this.setDisabled(`Missing required credentials (apiKey: ${!!config.apiKey})`);\n this.config = null as any;\n this.useProvidedLogger = false;\n return;\n }\n this.useProvidedLogger = false;\n this.config = config;\n }\n }\n\n protected async _exportTracingEvent(event: TracingEvent): Promise<void> {\n if (event.exportedSpan.isEvent) {\n await this.handleEventSpan(event.exportedSpan);\n return;\n }\n\n switch (event.type) {\n case 'span_started':\n await this.handleSpanStarted(event.exportedSpan);\n break;\n case 'span_updated':\n await this.handleSpanUpdateOrEnd(event.exportedSpan, false);\n break;\n case 'span_ended':\n await this.handleSpanUpdateOrEnd(event.exportedSpan, true);\n break;\n }\n }\n\n private async handleSpanStarted(span: AnyExportedSpan): Promise<void> {\n if (span.isRootSpan) {\n if (this.useProvidedLogger) {\n // Use provided logger, detect external Braintrust spans\n await this.initLoggerOrUseContext(span);\n } else {\n // Create new logger per trace\n await this.initLoggerPerTrace(span);\n }\n }\n\n const method = 'handleSpanStarted';\n const spanData = this.getSpanData({ span, method });\n if (!spanData) {\n return;\n }\n\n // Refcount: track active non-event spans (including root)\n if (!span.isEvent) {\n spanData.activeIds.add(span.id);\n }\n\n const braintrustParent = this.getBraintrustParent({ spanData, span, method });\n if (!braintrustParent) {\n return;\n }\n\n const payload = this.buildSpanPayload(span);\n\n // When attaching to an external parent (eval/logger span), don't pass Mastra's internal\n // parentSpanIds. Let Braintrust auto-handle the parent-child relationship.\n const shouldOmitParentIds = spanData.isExternal && !span.parentSpanId;\n\n const braintrustSpan = braintrustParent.startSpan({\n spanId: span.id,\n name: span.name,\n type: mapSpanType(span.type),\n ...(shouldOmitParentIds\n ? {}\n : {\n parentSpanIds: span.parentSpanId\n ? { spanId: span.parentSpanId, rootSpanId: span.traceId }\n : { spanId: span.traceId, rootSpanId: span.traceId },\n }),\n ...payload,\n });\n\n // Include the Mastra trace ID in the span metadata for correlation\n // Also include tags if present (only for root spans)\n braintrustSpan.log({\n metadata: {\n [MASTRA_TRACE_ID_METADATA_KEY]: span.traceId,\n },\n ...(span.isRootSpan && span.tags?.length ? { tags: span.tags } : {}),\n });\n\n spanData.spans.set(span.id, braintrustSpan);\n }\n\n private async handleSpanUpdateOrEnd(span: AnyExportedSpan, isEnd: boolean): Promise<void> {\n const method = isEnd ? 'handleSpanEnd' : 'handleSpanUpdate';\n\n const spanData = this.getSpanData({ span, method });\n if (!spanData) {\n return;\n }\n\n const braintrustSpan = spanData.spans.get(span.id);\n if (!braintrustSpan) {\n this.logger.warn('Braintrust exporter: No Braintrust span found for span update/end', {\n traceId: span.traceId,\n spanId: span.id,\n spanName: span.name,\n spanType: span.type,\n isRootSpan: span.isRootSpan,\n parentSpanId: span.parentSpanId,\n method,\n });\n return;\n }\n\n braintrustSpan.log(this.buildSpanPayload(span));\n\n if (isEnd) {\n // End the span with the correct endTime (convert milliseconds to seconds)\n if (span.endTime) {\n braintrustSpan.end({ endTime: span.endTime.getTime() / 1000 });\n } else {\n braintrustSpan.end();\n }\n\n // Refcount: mark this span as ended\n if (!span.isEvent) {\n spanData.activeIds.delete(span.id);\n }\n\n // If no more active spans remain for this trace, clean up the trace entry\n // Don't clean up if using external spans (they're managed by Braintrust)\n if (spanData.activeIds.size === 0 && !spanData.isExternal) {\n this.traceMap.delete(span.traceId);\n }\n }\n }\n\n private async handleEventSpan(span: AnyExportedSpan): Promise<void> {\n if (span.isRootSpan) {\n this.logger.debug('Braintrust exporter: Creating logger for event', {\n traceId: span.traceId,\n spanId: span.id,\n spanName: span.name,\n method: 'handleEventSpan',\n });\n\n if (this.useProvidedLogger) {\n // Use provided logger, detect external Braintrust spans\n await this.initLoggerOrUseContext(span);\n } else {\n // Create new logger per trace\n await this.initLoggerPerTrace(span);\n }\n }\n\n const method = 'handleEventSpan';\n const spanData = this.getSpanData({ span, method });\n if (!spanData) {\n return;\n }\n\n const braintrustParent = this.getBraintrustParent({ spanData, span, method });\n if (!braintrustParent) {\n return;\n }\n\n const payload = this.buildSpanPayload(span);\n\n // Create zero-duration span for event (convert milliseconds to seconds)\n const braintrustSpan = braintrustParent.startSpan({\n spanId: span.id,\n name: span.name,\n type: mapSpanType(span.type),\n parentSpanIds: span.parentSpanId\n ? { spanId: span.parentSpanId, rootSpanId: span.traceId }\n : { spanId: span.traceId, rootSpanId: span.traceId },\n startTime: span.startTime.getTime() / 1000,\n ...payload,\n });\n\n braintrustSpan.end({ endTime: span.startTime.getTime() / 1000 });\n }\n\n /**\n * Creates a new logger per trace using config credentials\n */\n private async initLoggerPerTrace(span: AnyExportedSpan): Promise<void> {\n const logger = await initLogger({\n projectName: this.config.projectName ?? 'mastra-tracing',\n apiKey: this.config.apiKey,\n appUrl: this.config.endpoint,\n ...this.config.tuningParameters,\n });\n\n this.traceMap.set(span.traceId, {\n logger,\n spans: new Map(),\n activeIds: new Set(),\n isExternal: false,\n });\n }\n\n /**\n * Uses provided logger and detects external Braintrust spans.\n * If a Braintrust span is detected (from logger.traced() or Eval()), attaches to it.\n * Otherwise, uses the provided logger instance.\n */\n private async initLoggerOrUseContext(span: AnyExportedSpan): Promise<void> {\n // Try to find a Braintrust span to attach to:\n // 1. Auto-detect from Braintrust's current span (logger.traced(), Eval(), etc.)\n // 2. Fall back to the configured logger\n const braintrustSpan = currentSpan();\n\n // Check if it's a valid span (not the NOOP_SPAN)\n if (braintrustSpan && braintrustSpan.id) {\n // External span detected - attach Mastra traces to it\n this.traceMap.set(span.traceId, {\n logger: braintrustSpan,\n spans: new Map(),\n activeIds: new Set(),\n isExternal: true,\n });\n } else {\n // No external span - use provided logger\n this.traceMap.set(span.traceId, {\n logger: this.providedLogger!,\n spans: new Map(),\n activeIds: new Set(),\n isExternal: false,\n });\n }\n }\n\n private getSpanData(options: { span: AnyExportedSpan; method: string }): SpanData | undefined {\n const { span, method } = options;\n if (this.traceMap.has(span.traceId)) {\n return this.traceMap.get(span.traceId);\n }\n\n this.logger.warn('Braintrust exporter: No span data found for span', {\n traceId: span.traceId,\n spanId: span.id,\n spanName: span.name,\n spanType: span.type,\n isRootSpan: span.isRootSpan,\n parentSpanId: span.parentSpanId,\n method,\n });\n }\n\n private getBraintrustParent(options: {\n spanData: SpanData;\n span: AnyExportedSpan;\n method: string;\n }): Logger<true> | Span | undefined {\n const { spanData, span, method } = options;\n\n const parentId = span.parentSpanId;\n if (!parentId) {\n return spanData.logger;\n }\n\n if (spanData.spans.has(parentId)) {\n return spanData.spans.get(parentId);\n }\n\n // If the parent exists but is the root span (not represented as a Braintrust\n // span because we use the logger as the root), attach to the logger so the\n // span is not orphaned. We need to check if parentSpanId exists but the\n // parent span is not in our spans map (indicating it's the root span).\n if (parentId && !spanData.spans.has(parentId)) {\n // This means the parent exists but isn't tracked as a Braintrust span,\n // which happens when the parent is the root span (we use logger as root)\n return spanData.logger;\n }\n\n this.logger.warn('Braintrust exporter: No parent data found for span', {\n traceId: span.traceId,\n spanId: span.id,\n spanName: span.name,\n spanType: span.type,\n isRootSpan: span.isRootSpan,\n parentSpanId: span.parentSpanId,\n method,\n });\n }\n\n private buildSpanPayload(span: AnyExportedSpan): Record<string, any> {\n const payload: Record<string, any> = {};\n\n // Core span data\n if (span.input !== undefined) {\n payload.input = span.input;\n }\n\n if (span.output !== undefined) {\n payload.output = span.output;\n }\n\n // Initialize metrics and metadata objects\n payload.metrics = {};\n payload.metadata = {\n spanType: span.type,\n ...span.metadata,\n };\n\n const attributes = (span.attributes ?? {}) as Record<string, any>;\n\n if (span.type === SpanType.MODEL_GENERATION) {\n const modelAttr = attributes as ModelGenerationAttributes;\n\n // Model goes to metadata\n if (modelAttr.model !== undefined) {\n payload.metadata.model = modelAttr.model;\n }\n\n // Provider goes to metadata (if provided by attributes)\n if (modelAttr.provider !== undefined) {\n payload.metadata.provider = modelAttr.provider;\n }\n\n // Usage/token info goes to metrics\n payload.metrics = normalizeUsageMetrics(modelAttr);\n\n // Model parameters go to metadata\n if (modelAttr.parameters !== undefined) {\n payload.metadata.modelParameters = modelAttr.parameters;\n }\n\n // Other LLM attributes go to metadata\n const otherAttributes = omitKeys(attributes, ['model', 'usage', 'parameters']);\n payload.metadata = {\n ...payload.metadata,\n ...otherAttributes,\n };\n } else {\n // For non-LLM spans, put all attributes in metadata\n payload.metadata = {\n ...payload.metadata,\n ...attributes,\n };\n }\n\n // Handle errors\n if (span.errorInfo) {\n payload.error = span.errorInfo.message;\n payload.metadata.errorDetails = span.errorInfo;\n }\n\n // Clean up empty metrics object\n if (Object.keys(payload.metrics).length === 0) {\n delete payload.metrics;\n }\n\n return payload;\n }\n\n async shutdown(): Promise<void> {\n if (!this.config) {\n return;\n }\n\n // End all active spans\n for (const [_traceId, spanData] of this.traceMap) {\n for (const [_spanId, span] of spanData.spans) {\n span.end();\n }\n // Loggers don't have an explicit shutdown method\n }\n this.traceMap.clear();\n await super.shutdown();\n }\n}\n"]}
package/dist/index.js CHANGED
@@ -122,7 +122,8 @@ var BraintrustExporter = class extends BaseExporter {
122
122
  braintrustSpan.log({
123
123
  metadata: {
124
124
  [MASTRA_TRACE_ID_METADATA_KEY]: span.traceId
125
- }
125
+ },
126
+ ...span.isRootSpan && span.tags?.length ? { tags: span.tags } : {}
126
127
  });
127
128
  spanData.spans.set(span.id, braintrustSpan);
128
129
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/metrics.ts","../src/tracing.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { ModelGenerationAttributes } from '@mastra/core/observability';\n/**\n * BraintrustUsageMetrics\n *\n * Canonical metric keys expected by Braintrust for LLM usage accounting.\n * These map various provider/SDK-specific usage fields to a common schema.\n * - prompt_tokens: input-side tokens (aka inputTokens/promptTokens)\n * - completion_tokens: output-side tokens (aka outputTokens/completionTokens)\n * - tokens: total tokens (provided or derived)\n * - completion_reasoning_tokens: reasoning tokens, when available\n * - prompt_cached_tokens: tokens served from cache (provider-specific)\n * - prompt_cache_creation_tokens: tokens used to create cache (provider-specific)\n */\nexport interface BraintrustUsageMetrics {\n prompt_tokens?: number;\n completion_tokens?: number;\n tokens?: number;\n completion_reasoning_tokens?: number;\n prompt_cached_tokens?: number;\n prompt_cache_creation_tokens?: number;\n [key: string]: number | undefined;\n}\n\nexport function normalizeUsageMetrics(modelAttr: ModelGenerationAttributes): BraintrustUsageMetrics {\n const metrics: BraintrustUsageMetrics = {};\n\n if (modelAttr.usage?.inputTokens !== undefined) {\n metrics.prompt_tokens = modelAttr.usage?.inputTokens;\n } else if (modelAttr.usage?.promptTokens !== undefined) {\n metrics.prompt_tokens = modelAttr.usage?.promptTokens;\n }\n\n if (modelAttr.usage?.outputTokens !== undefined) {\n metrics.completion_tokens = modelAttr.usage?.outputTokens;\n } else if (modelAttr.usage?.completionTokens !== undefined) {\n metrics.completion_tokens = modelAttr.usage?.completionTokens;\n }\n\n if (modelAttr.usage?.totalTokens !== undefined) {\n metrics.tokens = modelAttr.usage?.totalTokens;\n }\n if (modelAttr.usage?.reasoningTokens !== undefined) {\n metrics.completion_reasoning_tokens = modelAttr.usage?.reasoningTokens;\n }\n if (modelAttr.usage?.promptCacheHitTokens !== undefined) {\n metrics.prompt_cached_tokens = modelAttr.usage?.promptCacheHitTokens;\n }\n if (modelAttr.usage?.promptCacheMissTokens !== undefined) {\n metrics.prompt_cache_creation_tokens = modelAttr.usage?.promptCacheMissTokens;\n }\n\n return metrics;\n}\n","/**\n * Braintrust Exporter for Mastra Observability\n *\n * This exporter sends observability data to Braintrust.\n * Root spans become top-level Braintrust spans (no trace wrapper).\n * Events are handled as zero-duration spans with matching start/end times.\n */\n\nimport type { TracingEvent, AnyExportedSpan, ModelGenerationAttributes } from '@mastra/core/observability';\nimport { SpanType } from '@mastra/core/observability';\nimport { omitKeys } from '@mastra/core/utils';\nimport { BaseExporter } from '@mastra/observability';\nimport type { BaseExporterConfig } from '@mastra/observability';\nimport { initLogger, currentSpan } from 'braintrust';\nimport type { Span, Logger } from 'braintrust';\nimport { normalizeUsageMetrics } from './metrics';\n\nconst MASTRA_TRACE_ID_METADATA_KEY = 'mastra-trace-id';\n\nexport interface BraintrustExporterConfig extends BaseExporterConfig {\n /**\n * Optional Braintrust logger instance.\n * When provided, enables integration with Braintrust contexts such as:\n * - Evals: Agent traces nest inside eval task spans\n * - logger.traced(): Agent traces nest inside traced spans\n * - Parent spans: Auto-detects and attaches to external Braintrust spans\n */\n braintrustLogger?: Logger<true>;\n\n /** Braintrust API key. Required if logger is not provided. */\n apiKey?: string;\n /** Optional custom endpoint */\n endpoint?: string;\n /** Braintrust project name (default: 'mastra-tracing') */\n projectName?: string;\n /** Support tuning parameters */\n tuningParameters?: Record<string, any>;\n}\n\ntype SpanData = {\n logger: Logger<true> | Span; // Braintrust logger (for root spans) or external span\n spans: Map<string, Span>; // Maps span.id to Braintrust span\n activeIds: Set<string>; // Tracks started (non-event) spans not yet ended, including root\n isExternal: boolean; // True if logger is an external span from logger.traced() or Eval()\n};\n\n// Default span type for all spans\nconst DEFAULT_SPAN_TYPE = 'task';\n\n// Exceptions to the default mapping\nconst SPAN_TYPE_EXCEPTIONS: Partial<Record<SpanType, string>> = {\n [SpanType.MODEL_GENERATION]: 'llm',\n [SpanType.MODEL_CHUNK]: 'llm',\n [SpanType.TOOL_CALL]: 'tool',\n [SpanType.MCP_TOOL_CALL]: 'tool',\n [SpanType.WORKFLOW_CONDITIONAL_EVAL]: 'function',\n [SpanType.WORKFLOW_WAIT_EVENT]: 'function',\n};\n\n// Mapping function - returns valid Braintrust span types\nfunction mapSpanType(spanType: SpanType): 'llm' | 'score' | 'function' | 'eval' | 'task' | 'tool' {\n return (SPAN_TYPE_EXCEPTIONS[spanType] as any) ?? DEFAULT_SPAN_TYPE;\n}\n\nexport class BraintrustExporter extends BaseExporter {\n name = 'braintrust';\n private traceMap = new Map<string, SpanData>();\n private config: BraintrustExporterConfig;\n\n // Flags and logger for context-aware mode\n private useProvidedLogger: boolean;\n private providedLogger?: Logger<true>;\n\n constructor(config: BraintrustExporterConfig) {\n super(config);\n\n if (config.braintrustLogger) {\n // Use provided logger - enables Braintrust context integration\n this.useProvidedLogger = true;\n this.providedLogger = config.braintrustLogger;\n this.config = config;\n } else {\n // Validate apiKey for creating loggers per trace\n if (!config.apiKey) {\n this.setDisabled(`Missing required credentials (apiKey: ${!!config.apiKey})`);\n this.config = null as any;\n this.useProvidedLogger = false;\n return;\n }\n this.useProvidedLogger = false;\n this.config = config;\n }\n }\n\n protected async _exportTracingEvent(event: TracingEvent): Promise<void> {\n if (event.exportedSpan.isEvent) {\n await this.handleEventSpan(event.exportedSpan);\n return;\n }\n\n switch (event.type) {\n case 'span_started':\n await this.handleSpanStarted(event.exportedSpan);\n break;\n case 'span_updated':\n await this.handleSpanUpdateOrEnd(event.exportedSpan, false);\n break;\n case 'span_ended':\n await this.handleSpanUpdateOrEnd(event.exportedSpan, true);\n break;\n }\n }\n\n private async handleSpanStarted(span: AnyExportedSpan): Promise<void> {\n if (span.isRootSpan) {\n if (this.useProvidedLogger) {\n // Use provided logger, detect external Braintrust spans\n await this.initLoggerOrUseContext(span);\n } else {\n // Create new logger per trace\n await this.initLoggerPerTrace(span);\n }\n }\n\n const method = 'handleSpanStarted';\n const spanData = this.getSpanData({ span, method });\n if (!spanData) {\n return;\n }\n\n // Refcount: track active non-event spans (including root)\n if (!span.isEvent) {\n spanData.activeIds.add(span.id);\n }\n\n const braintrustParent = this.getBraintrustParent({ spanData, span, method });\n if (!braintrustParent) {\n return;\n }\n\n const payload = this.buildSpanPayload(span);\n\n // When attaching to an external parent (eval/logger span), don't pass Mastra's internal\n // parentSpanIds. Let Braintrust auto-handle the parent-child relationship.\n const shouldOmitParentIds = spanData.isExternal && !span.parentSpanId;\n\n const braintrustSpan = braintrustParent.startSpan({\n spanId: span.id,\n name: span.name,\n type: mapSpanType(span.type),\n ...(shouldOmitParentIds\n ? {}\n : {\n parentSpanIds: span.parentSpanId\n ? { spanId: span.parentSpanId, rootSpanId: span.traceId }\n : { spanId: span.traceId, rootSpanId: span.traceId },\n }),\n ...payload,\n });\n\n // Include the Mastra trace ID in the span metadata for correlation\n braintrustSpan.log({\n metadata: {\n [MASTRA_TRACE_ID_METADATA_KEY]: span.traceId,\n },\n });\n\n spanData.spans.set(span.id, braintrustSpan);\n }\n\n private async handleSpanUpdateOrEnd(span: AnyExportedSpan, isEnd: boolean): Promise<void> {\n const method = isEnd ? 'handleSpanEnd' : 'handleSpanUpdate';\n\n const spanData = this.getSpanData({ span, method });\n if (!spanData) {\n return;\n }\n\n const braintrustSpan = spanData.spans.get(span.id);\n if (!braintrustSpan) {\n this.logger.warn('Braintrust exporter: No Braintrust span found for span update/end', {\n traceId: span.traceId,\n spanId: span.id,\n spanName: span.name,\n spanType: span.type,\n isRootSpan: span.isRootSpan,\n parentSpanId: span.parentSpanId,\n method,\n });\n return;\n }\n\n braintrustSpan.log(this.buildSpanPayload(span));\n\n if (isEnd) {\n // End the span with the correct endTime (convert milliseconds to seconds)\n if (span.endTime) {\n braintrustSpan.end({ endTime: span.endTime.getTime() / 1000 });\n } else {\n braintrustSpan.end();\n }\n\n // Refcount: mark this span as ended\n if (!span.isEvent) {\n spanData.activeIds.delete(span.id);\n }\n\n // If no more active spans remain for this trace, clean up the trace entry\n // Don't clean up if using external spans (they're managed by Braintrust)\n if (spanData.activeIds.size === 0 && !spanData.isExternal) {\n this.traceMap.delete(span.traceId);\n }\n }\n }\n\n private async handleEventSpan(span: AnyExportedSpan): Promise<void> {\n if (span.isRootSpan) {\n this.logger.debug('Braintrust exporter: Creating logger for event', {\n traceId: span.traceId,\n spanId: span.id,\n spanName: span.name,\n method: 'handleEventSpan',\n });\n\n if (this.useProvidedLogger) {\n // Use provided logger, detect external Braintrust spans\n await this.initLoggerOrUseContext(span);\n } else {\n // Create new logger per trace\n await this.initLoggerPerTrace(span);\n }\n }\n\n const method = 'handleEventSpan';\n const spanData = this.getSpanData({ span, method });\n if (!spanData) {\n return;\n }\n\n const braintrustParent = this.getBraintrustParent({ spanData, span, method });\n if (!braintrustParent) {\n return;\n }\n\n const payload = this.buildSpanPayload(span);\n\n // Create zero-duration span for event (convert milliseconds to seconds)\n const braintrustSpan = braintrustParent.startSpan({\n spanId: span.id,\n name: span.name,\n type: mapSpanType(span.type),\n parentSpanIds: span.parentSpanId\n ? { spanId: span.parentSpanId, rootSpanId: span.traceId }\n : { spanId: span.traceId, rootSpanId: span.traceId },\n startTime: span.startTime.getTime() / 1000,\n ...payload,\n });\n\n braintrustSpan.end({ endTime: span.startTime.getTime() / 1000 });\n }\n\n /**\n * Creates a new logger per trace using config credentials\n */\n private async initLoggerPerTrace(span: AnyExportedSpan): Promise<void> {\n const logger = await initLogger({\n projectName: this.config.projectName ?? 'mastra-tracing',\n apiKey: this.config.apiKey,\n appUrl: this.config.endpoint,\n ...this.config.tuningParameters,\n });\n\n this.traceMap.set(span.traceId, {\n logger,\n spans: new Map(),\n activeIds: new Set(),\n isExternal: false,\n });\n }\n\n /**\n * Uses provided logger and detects external Braintrust spans.\n * If a Braintrust span is detected (from logger.traced() or Eval()), attaches to it.\n * Otherwise, uses the provided logger instance.\n */\n private async initLoggerOrUseContext(span: AnyExportedSpan): Promise<void> {\n // Try to find a Braintrust span to attach to:\n // 1. Auto-detect from Braintrust's current span (logger.traced(), Eval(), etc.)\n // 2. Fall back to the configured logger\n const braintrustSpan = currentSpan();\n\n // Check if it's a valid span (not the NOOP_SPAN)\n if (braintrustSpan && braintrustSpan.id) {\n // External span detected - attach Mastra traces to it\n this.traceMap.set(span.traceId, {\n logger: braintrustSpan,\n spans: new Map(),\n activeIds: new Set(),\n isExternal: true,\n });\n } else {\n // No external span - use provided logger\n this.traceMap.set(span.traceId, {\n logger: this.providedLogger!,\n spans: new Map(),\n activeIds: new Set(),\n isExternal: false,\n });\n }\n }\n\n private getSpanData(options: { span: AnyExportedSpan; method: string }): SpanData | undefined {\n const { span, method } = options;\n if (this.traceMap.has(span.traceId)) {\n return this.traceMap.get(span.traceId);\n }\n\n this.logger.warn('Braintrust exporter: No span data found for span', {\n traceId: span.traceId,\n spanId: span.id,\n spanName: span.name,\n spanType: span.type,\n isRootSpan: span.isRootSpan,\n parentSpanId: span.parentSpanId,\n method,\n });\n }\n\n private getBraintrustParent(options: {\n spanData: SpanData;\n span: AnyExportedSpan;\n method: string;\n }): Logger<true> | Span | undefined {\n const { spanData, span, method } = options;\n\n const parentId = span.parentSpanId;\n if (!parentId) {\n return spanData.logger;\n }\n\n if (spanData.spans.has(parentId)) {\n return spanData.spans.get(parentId);\n }\n\n // If the parent exists but is the root span (not represented as a Braintrust\n // span because we use the logger as the root), attach to the logger so the\n // span is not orphaned. We need to check if parentSpanId exists but the\n // parent span is not in our spans map (indicating it's the root span).\n if (parentId && !spanData.spans.has(parentId)) {\n // This means the parent exists but isn't tracked as a Braintrust span,\n // which happens when the parent is the root span (we use logger as root)\n return spanData.logger;\n }\n\n this.logger.warn('Braintrust exporter: No parent data found for span', {\n traceId: span.traceId,\n spanId: span.id,\n spanName: span.name,\n spanType: span.type,\n isRootSpan: span.isRootSpan,\n parentSpanId: span.parentSpanId,\n method,\n });\n }\n\n private buildSpanPayload(span: AnyExportedSpan): Record<string, any> {\n const payload: Record<string, any> = {};\n\n // Core span data\n if (span.input !== undefined) {\n payload.input = span.input;\n }\n\n if (span.output !== undefined) {\n payload.output = span.output;\n }\n\n // Initialize metrics and metadata objects\n payload.metrics = {};\n payload.metadata = {\n spanType: span.type,\n ...span.metadata,\n };\n\n const attributes = (span.attributes ?? {}) as Record<string, any>;\n\n if (span.type === SpanType.MODEL_GENERATION) {\n const modelAttr = attributes as ModelGenerationAttributes;\n\n // Model goes to metadata\n if (modelAttr.model !== undefined) {\n payload.metadata.model = modelAttr.model;\n }\n\n // Provider goes to metadata (if provided by attributes)\n if (modelAttr.provider !== undefined) {\n payload.metadata.provider = modelAttr.provider;\n }\n\n // Usage/token info goes to metrics\n payload.metrics = normalizeUsageMetrics(modelAttr);\n\n // Model parameters go to metadata\n if (modelAttr.parameters !== undefined) {\n payload.metadata.modelParameters = modelAttr.parameters;\n }\n\n // Other LLM attributes go to metadata\n const otherAttributes = omitKeys(attributes, ['model', 'usage', 'parameters']);\n payload.metadata = {\n ...payload.metadata,\n ...otherAttributes,\n };\n } else {\n // For non-LLM spans, put all attributes in metadata\n payload.metadata = {\n ...payload.metadata,\n ...attributes,\n };\n }\n\n // Handle errors\n if (span.errorInfo) {\n payload.error = span.errorInfo.message;\n payload.metadata.errorDetails = span.errorInfo;\n }\n\n // Clean up empty metrics object\n if (Object.keys(payload.metrics).length === 0) {\n delete payload.metrics;\n }\n\n return payload;\n }\n\n async shutdown(): Promise<void> {\n if (!this.config) {\n return;\n }\n\n // End all active spans\n for (const [_traceId, spanData] of this.traceMap) {\n for (const [_spanId, span] of spanData.spans) {\n span.end();\n }\n // Loggers don't have an explicit shutdown method\n }\n this.traceMap.clear();\n await super.shutdown();\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/metrics.ts","../src/tracing.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { ModelGenerationAttributes } from '@mastra/core/observability';\n/**\n * BraintrustUsageMetrics\n *\n * Canonical metric keys expected by Braintrust for LLM usage accounting.\n * These map various provider/SDK-specific usage fields to a common schema.\n * - prompt_tokens: input-side tokens (aka inputTokens/promptTokens)\n * - completion_tokens: output-side tokens (aka outputTokens/completionTokens)\n * - tokens: total tokens (provided or derived)\n * - completion_reasoning_tokens: reasoning tokens, when available\n * - prompt_cached_tokens: tokens served from cache (provider-specific)\n * - prompt_cache_creation_tokens: tokens used to create cache (provider-specific)\n */\nexport interface BraintrustUsageMetrics {\n prompt_tokens?: number;\n completion_tokens?: number;\n tokens?: number;\n completion_reasoning_tokens?: number;\n prompt_cached_tokens?: number;\n prompt_cache_creation_tokens?: number;\n [key: string]: number | undefined;\n}\n\nexport function normalizeUsageMetrics(modelAttr: ModelGenerationAttributes): BraintrustUsageMetrics {\n const metrics: BraintrustUsageMetrics = {};\n\n if (modelAttr.usage?.inputTokens !== undefined) {\n metrics.prompt_tokens = modelAttr.usage?.inputTokens;\n } else if (modelAttr.usage?.promptTokens !== undefined) {\n metrics.prompt_tokens = modelAttr.usage?.promptTokens;\n }\n\n if (modelAttr.usage?.outputTokens !== undefined) {\n metrics.completion_tokens = modelAttr.usage?.outputTokens;\n } else if (modelAttr.usage?.completionTokens !== undefined) {\n metrics.completion_tokens = modelAttr.usage?.completionTokens;\n }\n\n if (modelAttr.usage?.totalTokens !== undefined) {\n metrics.tokens = modelAttr.usage?.totalTokens;\n }\n if (modelAttr.usage?.reasoningTokens !== undefined) {\n metrics.completion_reasoning_tokens = modelAttr.usage?.reasoningTokens;\n }\n if (modelAttr.usage?.promptCacheHitTokens !== undefined) {\n metrics.prompt_cached_tokens = modelAttr.usage?.promptCacheHitTokens;\n }\n if (modelAttr.usage?.promptCacheMissTokens !== undefined) {\n metrics.prompt_cache_creation_tokens = modelAttr.usage?.promptCacheMissTokens;\n }\n\n return metrics;\n}\n","/**\n * Braintrust Exporter for Mastra Observability\n *\n * This exporter sends observability data to Braintrust.\n * Root spans become top-level Braintrust spans (no trace wrapper).\n * Events are handled as zero-duration spans with matching start/end times.\n */\n\nimport type { TracingEvent, AnyExportedSpan, ModelGenerationAttributes } from '@mastra/core/observability';\nimport { SpanType } from '@mastra/core/observability';\nimport { omitKeys } from '@mastra/core/utils';\nimport { BaseExporter } from '@mastra/observability';\nimport type { BaseExporterConfig } from '@mastra/observability';\nimport { initLogger, currentSpan } from 'braintrust';\nimport type { Span, Logger } from 'braintrust';\nimport { normalizeUsageMetrics } from './metrics';\n\nconst MASTRA_TRACE_ID_METADATA_KEY = 'mastra-trace-id';\n\nexport interface BraintrustExporterConfig extends BaseExporterConfig {\n /**\n * Optional Braintrust logger instance.\n * When provided, enables integration with Braintrust contexts such as:\n * - Evals: Agent traces nest inside eval task spans\n * - logger.traced(): Agent traces nest inside traced spans\n * - Parent spans: Auto-detects and attaches to external Braintrust spans\n */\n braintrustLogger?: Logger<true>;\n\n /** Braintrust API key. Required if logger is not provided. */\n apiKey?: string;\n /** Optional custom endpoint */\n endpoint?: string;\n /** Braintrust project name (default: 'mastra-tracing') */\n projectName?: string;\n /** Support tuning parameters */\n tuningParameters?: Record<string, any>;\n}\n\ntype SpanData = {\n logger: Logger<true> | Span; // Braintrust logger (for root spans) or external span\n spans: Map<string, Span>; // Maps span.id to Braintrust span\n activeIds: Set<string>; // Tracks started (non-event) spans not yet ended, including root\n isExternal: boolean; // True if logger is an external span from logger.traced() or Eval()\n};\n\n// Default span type for all spans\nconst DEFAULT_SPAN_TYPE = 'task';\n\n// Exceptions to the default mapping\nconst SPAN_TYPE_EXCEPTIONS: Partial<Record<SpanType, string>> = {\n [SpanType.MODEL_GENERATION]: 'llm',\n [SpanType.MODEL_CHUNK]: 'llm',\n [SpanType.TOOL_CALL]: 'tool',\n [SpanType.MCP_TOOL_CALL]: 'tool',\n [SpanType.WORKFLOW_CONDITIONAL_EVAL]: 'function',\n [SpanType.WORKFLOW_WAIT_EVENT]: 'function',\n};\n\n// Mapping function - returns valid Braintrust span types\nfunction mapSpanType(spanType: SpanType): 'llm' | 'score' | 'function' | 'eval' | 'task' | 'tool' {\n return (SPAN_TYPE_EXCEPTIONS[spanType] as any) ?? DEFAULT_SPAN_TYPE;\n}\n\nexport class BraintrustExporter extends BaseExporter {\n name = 'braintrust';\n private traceMap = new Map<string, SpanData>();\n private config: BraintrustExporterConfig;\n\n // Flags and logger for context-aware mode\n private useProvidedLogger: boolean;\n private providedLogger?: Logger<true>;\n\n constructor(config: BraintrustExporterConfig) {\n super(config);\n\n if (config.braintrustLogger) {\n // Use provided logger - enables Braintrust context integration\n this.useProvidedLogger = true;\n this.providedLogger = config.braintrustLogger;\n this.config = config;\n } else {\n // Validate apiKey for creating loggers per trace\n if (!config.apiKey) {\n this.setDisabled(`Missing required credentials (apiKey: ${!!config.apiKey})`);\n this.config = null as any;\n this.useProvidedLogger = false;\n return;\n }\n this.useProvidedLogger = false;\n this.config = config;\n }\n }\n\n protected async _exportTracingEvent(event: TracingEvent): Promise<void> {\n if (event.exportedSpan.isEvent) {\n await this.handleEventSpan(event.exportedSpan);\n return;\n }\n\n switch (event.type) {\n case 'span_started':\n await this.handleSpanStarted(event.exportedSpan);\n break;\n case 'span_updated':\n await this.handleSpanUpdateOrEnd(event.exportedSpan, false);\n break;\n case 'span_ended':\n await this.handleSpanUpdateOrEnd(event.exportedSpan, true);\n break;\n }\n }\n\n private async handleSpanStarted(span: AnyExportedSpan): Promise<void> {\n if (span.isRootSpan) {\n if (this.useProvidedLogger) {\n // Use provided logger, detect external Braintrust spans\n await this.initLoggerOrUseContext(span);\n } else {\n // Create new logger per trace\n await this.initLoggerPerTrace(span);\n }\n }\n\n const method = 'handleSpanStarted';\n const spanData = this.getSpanData({ span, method });\n if (!spanData) {\n return;\n }\n\n // Refcount: track active non-event spans (including root)\n if (!span.isEvent) {\n spanData.activeIds.add(span.id);\n }\n\n const braintrustParent = this.getBraintrustParent({ spanData, span, method });\n if (!braintrustParent) {\n return;\n }\n\n const payload = this.buildSpanPayload(span);\n\n // When attaching to an external parent (eval/logger span), don't pass Mastra's internal\n // parentSpanIds. Let Braintrust auto-handle the parent-child relationship.\n const shouldOmitParentIds = spanData.isExternal && !span.parentSpanId;\n\n const braintrustSpan = braintrustParent.startSpan({\n spanId: span.id,\n name: span.name,\n type: mapSpanType(span.type),\n ...(shouldOmitParentIds\n ? {}\n : {\n parentSpanIds: span.parentSpanId\n ? { spanId: span.parentSpanId, rootSpanId: span.traceId }\n : { spanId: span.traceId, rootSpanId: span.traceId },\n }),\n ...payload,\n });\n\n // Include the Mastra trace ID in the span metadata for correlation\n // Also include tags if present (only for root spans)\n braintrustSpan.log({\n metadata: {\n [MASTRA_TRACE_ID_METADATA_KEY]: span.traceId,\n },\n ...(span.isRootSpan && span.tags?.length ? { tags: span.tags } : {}),\n });\n\n spanData.spans.set(span.id, braintrustSpan);\n }\n\n private async handleSpanUpdateOrEnd(span: AnyExportedSpan, isEnd: boolean): Promise<void> {\n const method = isEnd ? 'handleSpanEnd' : 'handleSpanUpdate';\n\n const spanData = this.getSpanData({ span, method });\n if (!spanData) {\n return;\n }\n\n const braintrustSpan = spanData.spans.get(span.id);\n if (!braintrustSpan) {\n this.logger.warn('Braintrust exporter: No Braintrust span found for span update/end', {\n traceId: span.traceId,\n spanId: span.id,\n spanName: span.name,\n spanType: span.type,\n isRootSpan: span.isRootSpan,\n parentSpanId: span.parentSpanId,\n method,\n });\n return;\n }\n\n braintrustSpan.log(this.buildSpanPayload(span));\n\n if (isEnd) {\n // End the span with the correct endTime (convert milliseconds to seconds)\n if (span.endTime) {\n braintrustSpan.end({ endTime: span.endTime.getTime() / 1000 });\n } else {\n braintrustSpan.end();\n }\n\n // Refcount: mark this span as ended\n if (!span.isEvent) {\n spanData.activeIds.delete(span.id);\n }\n\n // If no more active spans remain for this trace, clean up the trace entry\n // Don't clean up if using external spans (they're managed by Braintrust)\n if (spanData.activeIds.size === 0 && !spanData.isExternal) {\n this.traceMap.delete(span.traceId);\n }\n }\n }\n\n private async handleEventSpan(span: AnyExportedSpan): Promise<void> {\n if (span.isRootSpan) {\n this.logger.debug('Braintrust exporter: Creating logger for event', {\n traceId: span.traceId,\n spanId: span.id,\n spanName: span.name,\n method: 'handleEventSpan',\n });\n\n if (this.useProvidedLogger) {\n // Use provided logger, detect external Braintrust spans\n await this.initLoggerOrUseContext(span);\n } else {\n // Create new logger per trace\n await this.initLoggerPerTrace(span);\n }\n }\n\n const method = 'handleEventSpan';\n const spanData = this.getSpanData({ span, method });\n if (!spanData) {\n return;\n }\n\n const braintrustParent = this.getBraintrustParent({ spanData, span, method });\n if (!braintrustParent) {\n return;\n }\n\n const payload = this.buildSpanPayload(span);\n\n // Create zero-duration span for event (convert milliseconds to seconds)\n const braintrustSpan = braintrustParent.startSpan({\n spanId: span.id,\n name: span.name,\n type: mapSpanType(span.type),\n parentSpanIds: span.parentSpanId\n ? { spanId: span.parentSpanId, rootSpanId: span.traceId }\n : { spanId: span.traceId, rootSpanId: span.traceId },\n startTime: span.startTime.getTime() / 1000,\n ...payload,\n });\n\n braintrustSpan.end({ endTime: span.startTime.getTime() / 1000 });\n }\n\n /**\n * Creates a new logger per trace using config credentials\n */\n private async initLoggerPerTrace(span: AnyExportedSpan): Promise<void> {\n const logger = await initLogger({\n projectName: this.config.projectName ?? 'mastra-tracing',\n apiKey: this.config.apiKey,\n appUrl: this.config.endpoint,\n ...this.config.tuningParameters,\n });\n\n this.traceMap.set(span.traceId, {\n logger,\n spans: new Map(),\n activeIds: new Set(),\n isExternal: false,\n });\n }\n\n /**\n * Uses provided logger and detects external Braintrust spans.\n * If a Braintrust span is detected (from logger.traced() or Eval()), attaches to it.\n * Otherwise, uses the provided logger instance.\n */\n private async initLoggerOrUseContext(span: AnyExportedSpan): Promise<void> {\n // Try to find a Braintrust span to attach to:\n // 1. Auto-detect from Braintrust's current span (logger.traced(), Eval(), etc.)\n // 2. Fall back to the configured logger\n const braintrustSpan = currentSpan();\n\n // Check if it's a valid span (not the NOOP_SPAN)\n if (braintrustSpan && braintrustSpan.id) {\n // External span detected - attach Mastra traces to it\n this.traceMap.set(span.traceId, {\n logger: braintrustSpan,\n spans: new Map(),\n activeIds: new Set(),\n isExternal: true,\n });\n } else {\n // No external span - use provided logger\n this.traceMap.set(span.traceId, {\n logger: this.providedLogger!,\n spans: new Map(),\n activeIds: new Set(),\n isExternal: false,\n });\n }\n }\n\n private getSpanData(options: { span: AnyExportedSpan; method: string }): SpanData | undefined {\n const { span, method } = options;\n if (this.traceMap.has(span.traceId)) {\n return this.traceMap.get(span.traceId);\n }\n\n this.logger.warn('Braintrust exporter: No span data found for span', {\n traceId: span.traceId,\n spanId: span.id,\n spanName: span.name,\n spanType: span.type,\n isRootSpan: span.isRootSpan,\n parentSpanId: span.parentSpanId,\n method,\n });\n }\n\n private getBraintrustParent(options: {\n spanData: SpanData;\n span: AnyExportedSpan;\n method: string;\n }): Logger<true> | Span | undefined {\n const { spanData, span, method } = options;\n\n const parentId = span.parentSpanId;\n if (!parentId) {\n return spanData.logger;\n }\n\n if (spanData.spans.has(parentId)) {\n return spanData.spans.get(parentId);\n }\n\n // If the parent exists but is the root span (not represented as a Braintrust\n // span because we use the logger as the root), attach to the logger so the\n // span is not orphaned. We need to check if parentSpanId exists but the\n // parent span is not in our spans map (indicating it's the root span).\n if (parentId && !spanData.spans.has(parentId)) {\n // This means the parent exists but isn't tracked as a Braintrust span,\n // which happens when the parent is the root span (we use logger as root)\n return spanData.logger;\n }\n\n this.logger.warn('Braintrust exporter: No parent data found for span', {\n traceId: span.traceId,\n spanId: span.id,\n spanName: span.name,\n spanType: span.type,\n isRootSpan: span.isRootSpan,\n parentSpanId: span.parentSpanId,\n method,\n });\n }\n\n private buildSpanPayload(span: AnyExportedSpan): Record<string, any> {\n const payload: Record<string, any> = {};\n\n // Core span data\n if (span.input !== undefined) {\n payload.input = span.input;\n }\n\n if (span.output !== undefined) {\n payload.output = span.output;\n }\n\n // Initialize metrics and metadata objects\n payload.metrics = {};\n payload.metadata = {\n spanType: span.type,\n ...span.metadata,\n };\n\n const attributes = (span.attributes ?? {}) as Record<string, any>;\n\n if (span.type === SpanType.MODEL_GENERATION) {\n const modelAttr = attributes as ModelGenerationAttributes;\n\n // Model goes to metadata\n if (modelAttr.model !== undefined) {\n payload.metadata.model = modelAttr.model;\n }\n\n // Provider goes to metadata (if provided by attributes)\n if (modelAttr.provider !== undefined) {\n payload.metadata.provider = modelAttr.provider;\n }\n\n // Usage/token info goes to metrics\n payload.metrics = normalizeUsageMetrics(modelAttr);\n\n // Model parameters go to metadata\n if (modelAttr.parameters !== undefined) {\n payload.metadata.modelParameters = modelAttr.parameters;\n }\n\n // Other LLM attributes go to metadata\n const otherAttributes = omitKeys(attributes, ['model', 'usage', 'parameters']);\n payload.metadata = {\n ...payload.metadata,\n ...otherAttributes,\n };\n } else {\n // For non-LLM spans, put all attributes in metadata\n payload.metadata = {\n ...payload.metadata,\n ...attributes,\n };\n }\n\n // Handle errors\n if (span.errorInfo) {\n payload.error = span.errorInfo.message;\n payload.metadata.errorDetails = span.errorInfo;\n }\n\n // Clean up empty metrics object\n if (Object.keys(payload.metrics).length === 0) {\n delete payload.metrics;\n }\n\n return payload;\n }\n\n async shutdown(): Promise<void> {\n if (!this.config) {\n return;\n }\n\n // End all active spans\n for (const [_traceId, spanData] of this.traceMap) {\n for (const [_spanId, span] of spanData.spans) {\n span.end();\n }\n // Loggers don't have an explicit shutdown method\n }\n this.traceMap.clear();\n await super.shutdown();\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"tracing.d.ts","sourceRoot":"","sources":["../src/tracing.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAA8C,MAAM,4BAA4B,CAAC;AAG3G,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,OAAO,KAAK,EAAQ,MAAM,EAAE,MAAM,YAAY,CAAC;AAK/C,MAAM,WAAW,wBAAyB,SAAQ,kBAAkB;IAClE;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAEhC,8DAA8D;IAC9D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0DAA0D;IAC1D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gCAAgC;IAChC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CACxC;AA2BD,qBAAa,kBAAmB,SAAQ,YAAY;IAClD,IAAI,SAAgB;IACpB,OAAO,CAAC,QAAQ,CAA+B;IAC/C,OAAO,CAAC,MAAM,CAA2B;IAGzC,OAAO,CAAC,iBAAiB,CAAU;IACnC,OAAO,CAAC,cAAc,CAAC,CAAe;gBAE1B,MAAM,EAAE,wBAAwB;cAqB5B,mBAAmB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;YAmBzD,iBAAiB;YAyDjB,qBAAqB;YA6CrB,eAAe;IA8C7B;;OAEG;YACW,kBAAkB;IAgBhC;;;;OAIG;YACW,sBAAsB;IA0BpC,OAAO,CAAC,WAAW;IAiBnB,OAAO,CAAC,mBAAmB;IAqC3B,OAAO,CAAC,gBAAgB;IAsElB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAehC"}
1
+ {"version":3,"file":"tracing.d.ts","sourceRoot":"","sources":["../src/tracing.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAA8C,MAAM,4BAA4B,CAAC;AAG3G,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,OAAO,KAAK,EAAQ,MAAM,EAAE,MAAM,YAAY,CAAC;AAK/C,MAAM,WAAW,wBAAyB,SAAQ,kBAAkB;IAClE;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAEhC,8DAA8D;IAC9D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0DAA0D;IAC1D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gCAAgC;IAChC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CACxC;AA2BD,qBAAa,kBAAmB,SAAQ,YAAY;IAClD,IAAI,SAAgB;IACpB,OAAO,CAAC,QAAQ,CAA+B;IAC/C,OAAO,CAAC,MAAM,CAA2B;IAGzC,OAAO,CAAC,iBAAiB,CAAU;IACnC,OAAO,CAAC,cAAc,CAAC,CAAe;gBAE1B,MAAM,EAAE,wBAAwB;cAqB5B,mBAAmB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;YAmBzD,iBAAiB;YA2DjB,qBAAqB;YA6CrB,eAAe;IA8C7B;;OAEG;YACW,kBAAkB;IAgBhC;;;;OAIG;YACW,sBAAsB;IA0BpC,OAAO,CAAC,WAAW;IAiBnB,OAAO,CAAC,mBAAmB;IAqC3B,OAAO,CAAC,gBAAgB;IAsElB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAehC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mastra/braintrust",
3
- "version": "1.0.0-beta.1",
3
+ "version": "1.0.0-beta.2",
4
4
  "description": "Braintrust observability provider for Mastra - includes tracing and future observability features",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -25,20 +25,20 @@
25
25
  "license": "Apache-2.0",
26
26
  "dependencies": {
27
27
  "braintrust": "^0.4.9",
28
- "@mastra/observability": "1.0.0-beta.1"
28
+ "@mastra/observability": "1.0.0-beta.2"
29
29
  },
30
30
  "devDependencies": {
31
31
  "@microsoft/api-extractor": "^7.52.8",
32
32
  "@types/node": "22.13.17",
33
- "@vitest/coverage-v8": "4.0.8",
34
- "@vitest/ui": "4.0.8",
33
+ "@vitest/coverage-v8": "4.0.12",
34
+ "@vitest/ui": "4.0.12",
35
35
  "eslint": "^9.37.0",
36
36
  "tsup": "^8.5.0",
37
37
  "typescript": "^5.8.3",
38
- "vitest": "^4.0.8",
39
- "@internal/types-builder": "0.0.28",
38
+ "vitest": "4.0.12",
40
39
  "@internal/lint": "0.0.53",
41
- "@mastra/core": "1.0.0-beta.3"
40
+ "@internal/types-builder": "0.0.28",
41
+ "@mastra/core": "1.0.0-beta.6"
42
42
  },
43
43
  "peerDependencies": {
44
44
  "@mastra/core": ">=1.0.0-0 <2.0.0-0"