{"version":3,"file":"index.cjs","names":["SpanType","TrackingExporter","#runIdCacheMaxEntries","#client","Client","#langsmithRunIdBySpanId","#getLangsmithRunId","RunTree","#rememberLangsmithRunId"],"sources":["../src/metrics.ts","../src/tracing.ts","../src/helpers.ts"],"sourcesContent":["import type { UsageStats } from '@mastra/core/observability';\n\n/**\n * LangSmithUsageMetrics\n *\n * Canonical metric keys expected by LangSmith for LLM usage accounting.\n * See: https://docs.langchain.com/langsmith/log-llm-trace#provide-token-and-cost-information\n */\nexport interface LangSmithUsageMetrics {\n  input_tokens?: number;\n  output_tokens?: number;\n  total_tokens?: number;\n  input_token_details?: {\n    [key: string]: number;\n  };\n  output_token_details?: {\n    [key: string]: number;\n  };\n}\n\n/**\n * Formats UsageStats to LangSmith's expected metric format.\n */\nexport function formatUsageMetrics(usage?: UsageStats): LangSmithUsageMetrics {\n  const metrics: LangSmithUsageMetrics = {};\n\n  if (usage?.inputTokens !== undefined) {\n    metrics.input_tokens = usage.inputTokens;\n  }\n\n  if (usage?.outputTokens !== undefined) {\n    metrics.output_tokens = usage.outputTokens;\n  }\n\n  // Compute total if we have both\n  if (metrics.input_tokens !== undefined && metrics.output_tokens !== undefined) {\n    metrics.total_tokens = metrics.input_tokens + metrics.output_tokens;\n  }\n\n  if (usage?.outputDetails?.reasoning !== undefined) {\n    metrics.output_token_details = {\n      ...(metrics.output_token_details ?? {}),\n      reasoning_tokens: usage.outputDetails.reasoning,\n    };\n  }\n\n  if (usage?.inputDetails?.cacheRead !== undefined) {\n    metrics.input_token_details = {\n      ...(metrics.input_token_details ?? {}),\n      cache_read: usage.inputDetails.cacheRead,\n    };\n  }\n\n  if (usage?.inputDetails?.cacheWrite !== undefined) {\n    metrics.input_token_details = {\n      ...(metrics.input_token_details ?? {}),\n      cache_write: usage.inputDetails.cacheWrite,\n    };\n  }\n\n  if (usage?.inputDetails?.cacheWrite5m !== undefined) {\n    metrics.input_token_details = {\n      ...(metrics.input_token_details ?? {}),\n      cache_creation_5m: usage.inputDetails.cacheWrite5m,\n    };\n  }\n\n  if (usage?.inputDetails?.cacheWrite1h !== undefined) {\n    metrics.input_token_details = {\n      ...(metrics.input_token_details ?? {}),\n      cache_creation_1h: usage.inputDetails.cacheWrite1h,\n    };\n  }\n\n  if (usage?.inputDetails?.audio !== undefined) {\n    metrics.input_token_details = {\n      ...(metrics.input_token_details ?? {}),\n      audio: usage.inputDetails.audio,\n    };\n  }\n\n  if (usage?.outputDetails?.audio !== undefined) {\n    metrics.output_token_details = {\n      ...(metrics.output_token_details ?? {}),\n      audio: usage.outputDetails.audio,\n    };\n  }\n\n  return metrics;\n}\n","/**\n * LangSmith Exporter for Mastra Tracing\n *\n * This exporter sends observability data to LangSmith\n * Root spans become top-level LangSmith RunTrees (no trace wrapper).\n * Events are handled as zero-duration RunTrees with matching start/end times.\n */\n\nimport type { AnyExportedSpan, ModelGenerationAttributes, ScoreEvent, SpanErrorInfo } from '@mastra/core/observability';\nimport { SpanType } from '@mastra/core/observability';\nimport { omitKeys } from '@mastra/core/utils';\nimport { TrackingExporter } from '@mastra/observability';\nimport type { TraceData, TrackingExporterConfig } from '@mastra/observability';\nimport type { ClientConfig, RunTreeConfig } from 'langsmith';\nimport { Client, RunTree } from 'langsmith';\nimport type { KVMap } from 'langsmith/schemas';\nimport type { LangSmithMetadataInput } from './helpers';\nimport { formatUsageMetrics } from './metrics';\n\nexport interface LangSmithExporterConfig extends ClientConfig, TrackingExporterConfig {\n  /** LangSmith client instance */\n  client?: Client;\n  /**\n   * The name of the LangSmith project to send traces to.\n   * Overrides the LANGCHAIN_PROJECT environment variable.\n   * If neither is set, traces are sent to the \"default\" project.\n   */\n  projectName?: string;\n  /**\n   * Maximum number of `spanId → langsmithRunId` mappings to retain for resolving\n   * `onScoreEvent` lookups. Older entries are evicted in LRU order when the cap\n   * is exceeded so long-running processes do not grow unbounded.\n   * Defaults to 10000.\n   */\n  runIdCacheMaxEntries?: number;\n}\n\nconst DEFAULT_RUN_ID_CACHE_MAX_ENTRIES = 10_000;\n\ntype LangSmithRoot = undefined;\ntype LangSmithSpan = RunTree;\ntype LangSmithEvent = RunTree;\ntype LangSmithMetadata = LangSmithMetadataInput;\ntype LangSmithTraceData = TraceData<LangSmithRoot, LangSmithSpan, LangSmithEvent, LangSmithMetadata>;\n\n// Default span type for all spans\nconst DEFAULT_SPAN_TYPE = 'chain';\n\n// Exceptions to the default mapping\nconst SPAN_TYPE_EXCEPTIONS: Partial<Record<SpanType, 'llm' | 'tool' | 'chain'>> = {\n  [SpanType.MODEL_GENERATION]: 'llm',\n  [SpanType.TOOL_CALL]: 'tool',\n  [SpanType.MCP_TOOL_CALL]: 'tool',\n  [SpanType.PROVIDER_TOOL_CALL]: 'tool',\n  [SpanType.WORKFLOW_CONDITIONAL_EVAL]: 'chain',\n  [SpanType.WORKFLOW_WAIT_EVENT]: 'chain',\n};\n\n// Mapping function - returns valid LangSmith span types\nfunction mapSpanType(spanType: SpanType): 'llm' | 'tool' | 'chain' {\n  return SPAN_TYPE_EXCEPTIONS[spanType] ?? DEFAULT_SPAN_TYPE;\n}\n\nfunction isKVMap(value: unknown): value is KVMap {\n  return value != null && typeof value === 'object' && !Array.isArray(value) && !(value instanceof Date);\n}\n\nexport class LangSmithExporter extends TrackingExporter<\n  LangSmithRoot,\n  LangSmithSpan,\n  LangSmithEvent,\n  LangSmithMetadata,\n  LangSmithExporterConfig\n> {\n  override name = 'langsmith';\n  #client: Client | undefined;\n\n  /**\n   * Maps Mastra `span.id` to the runId LangSmith allocated when the corresponding\n   * RunTree was created. LangSmith's `createFeedback` requires the LangSmith runId,\n   * not the Mastra span id, so scores submitted via `onScoreEvent` look up the\n   * LangSmith runId here before calling the API.\n   *\n   * Bounded LRU keyed by Mastra span id — entries are evicted oldest-first when\n   * size exceeds `#runIdCacheMaxEntries` so the cache cannot grow without bound.\n   */\n  #langsmithRunIdBySpanId = new Map<string, string>();\n  #runIdCacheMaxEntries: number;\n\n  constructor(config: LangSmithExporterConfig = {}) {\n    // Resolve env vars BEFORE calling super (config is readonly in base class)\n    const apiKey = config.apiKey ?? process.env.LANGSMITH_API_KEY;\n\n    super({\n      ...config,\n      apiKey,\n    });\n\n    this.#runIdCacheMaxEntries = Math.max(1, config.runIdCacheMaxEntries ?? DEFAULT_RUN_ID_CACHE_MAX_ENTRIES);\n\n    if (!apiKey) {\n      this.setDisabled(`Missing required credentials (apiKey: ${!!apiKey})`);\n      return;\n    }\n\n    this.#client = config.client ?? new Client(this.config);\n  }\n\n  /** Look up the LangSmith runId for a Mastra span id, refreshing its LRU position on hit. */\n  #getLangsmithRunId(spanId: string): string | undefined {\n    const runId = this.#langsmithRunIdBySpanId.get(spanId);\n    if (runId === undefined) return undefined;\n    // Re-insert to mark as most-recently-used (Map preserves insertion order).\n    this.#langsmithRunIdBySpanId.delete(spanId);\n    this.#langsmithRunIdBySpanId.set(spanId, runId);\n    return runId;\n  }\n\n  /** Remember the LangSmith runId for a Mastra span id, evicting oldest entries when full. */\n  #rememberLangsmithRunId(spanId: string, runId: string): void {\n    if (this.#langsmithRunIdBySpanId.has(spanId)) {\n      this.#langsmithRunIdBySpanId.delete(spanId);\n    }\n    this.#langsmithRunIdBySpanId.set(spanId, runId);\n    while (this.#langsmithRunIdBySpanId.size > this.#runIdCacheMaxEntries) {\n      const oldest = this.#langsmithRunIdBySpanId.keys().next().value;\n      if (oldest === undefined) break;\n      this.#langsmithRunIdBySpanId.delete(oldest);\n    }\n  }\n\n  /**\n   * Flush pending trace batches to LangSmith.\n   * The LangSmith Client internally batches API calls; this ensures\n   * all queued runs are sent before the process exits or the flush\n   * caller continues.\n   */\n  protected override async _flush(): Promise<void> {\n    if (this.#client) {\n      await this.#client.awaitPendingTraceBatches();\n    }\n  }\n\n  protected override async _postShutdown(): Promise<void> {\n    this.#langsmithRunIdBySpanId.clear();\n  }\n\n  async onScoreEvent(event: ScoreEvent): Promise<void> {\n    if (!this.#client) return;\n\n    const { score } = event;\n    if (!score.spanId) {\n      this.logger.warn('LangSmith exporter: dropping score with no spanId; trace-level scoring is not yet supported', {\n        scorerId: score.scorerId,\n      });\n      return;\n    }\n\n    const langsmithRunId = this.#getLangsmithRunId(score.spanId);\n    if (!langsmithRunId) {\n      this.logger.warn(\n        'LangSmith exporter: dropping score for a span that was not previously emitted to LangSmith ' +\n          '(span_started must be processed before submitting a score for it)',\n        {\n          traceId: score.traceId,\n          spanId: score.spanId,\n          scorerId: score.scorerId,\n        },\n      );\n      return;\n    }\n\n    const key = score.scorerName ?? score.scorerId;\n\n    try {\n      await this.#client.createFeedback(langsmithRunId, key, {\n        score: score.score,\n        ...(score.reason ? { comment: score.reason } : {}),\n        feedbackId: score.scoreId,\n        ...(score.scoreTraceId ? { sourceRunId: score.scoreTraceId } : {}),\n        sourceInfo: {\n          // User-supplied metadata is spread first so the authoritative reserved\n          // fields below cannot be overwritten by `scorerId` / `scoreSource` keys\n          // a caller may have set inside metadata.\n          ...(score.metadata ?? {}),\n          scorerId: score.scorerId,\n          ...(score.scoreSource ? { scoreSource: score.scoreSource } : {}),\n        },\n      });\n    } catch (err) {\n      this.logger.error('LangSmith exporter: Failed to submit feedback', {\n        error: err,\n        traceId: score.traceId,\n        spanId: score.spanId,\n        scorerId: score.scorerId,\n      });\n    }\n  }\n\n  protected override skipBuildRootTask = true;\n  protected override async _buildRoot(_args: {\n    span: AnyExportedSpan;\n    traceData: LangSmithTraceData;\n  }): Promise<LangSmithRoot | undefined> {\n    throw new Error('Method not implemented.');\n  }\n\n  protected override async _buildSpan(args: {\n    span: AnyExportedSpan;\n    traceData: LangSmithTraceData;\n  }): Promise<LangSmithSpan | undefined> {\n    const { span, traceData } = args;\n\n    const parent = span.isRootSpan ? undefined : traceData.getParent(args);\n\n    if (!span.isRootSpan && !parent) {\n      // parent doesn't exist and not creating rootSpan, return early data\n      return;\n    }\n\n    const payload = {\n      name: span.name,\n      ...this.buildRunTreePayload(span, traceData, true),\n    };\n\n    const langSmithSpan = span.isRootSpan ? new RunTree(payload) : parent!.createChild(payload);\n\n    if (langSmithSpan.id) {\n      this.#rememberLangsmithRunId(span.id, langSmithSpan.id);\n    }\n\n    await langSmithSpan.postRun();\n    return langSmithSpan;\n  }\n\n  protected override async _buildEvent(args: {\n    span: AnyExportedSpan;\n    traceData: LangSmithTraceData;\n  }): Promise<LangSmithEvent | undefined> {\n    const langSmithSpan = await this._buildSpan(args);\n\n    if (!langSmithSpan) {\n      // parent doesn't exist and not creating rootSpan, return early data\n      return;\n    }\n\n    // use start-time as end-time to make an event span.\n    await langSmithSpan.end({ endTime: args.span.startTime.getTime() });\n    await langSmithSpan.patchRun();\n    return langSmithSpan;\n  }\n\n  protected override async _updateSpan(args: { span: AnyExportedSpan; traceData: LangSmithTraceData }): Promise<void> {\n    await this.handleSpanUpdateOrEnd({ ...args, isEnd: false });\n  }\n\n  protected override async _finishSpan(args: { span: AnyExportedSpan; traceData: LangSmithTraceData }): Promise<void> {\n    await this.handleSpanUpdateOrEnd({ ...args, isEnd: true });\n  }\n\n  protected override async _abortSpan(args: {\n    span: LangSmithSpan;\n    traceData: LangSmithTraceData;\n    reason: SpanErrorInfo;\n  }): Promise<void> {\n    const { span, reason } = args;\n    span.error = reason.message;\n    span.metadata = {\n      ...span.metadata,\n      errorDetails: reason,\n    };\n    await span.end();\n    await span.patchRun();\n  }\n\n  private async handleSpanUpdateOrEnd(args: {\n    span: AnyExportedSpan;\n    traceData: LangSmithTraceData;\n    isEnd: boolean;\n  }): Promise<void> {\n    const { span, traceData, isEnd } = args;\n\n    const langSmithSpan = traceData.getSpan({ spanId: span.id });\n    if (!langSmithSpan) {\n      //update occurred before span start, return early data\n      return;\n    }\n\n    const updatePayload = this.buildRunTreePayload(span, traceData);\n\n    langSmithSpan.metadata = {\n      ...langSmithSpan.metadata,\n      ...updatePayload.metadata,\n    };\n    if (updatePayload.inputs != null) {\n      langSmithSpan.inputs = updatePayload.inputs;\n    }\n    if (updatePayload.outputs != null) {\n      langSmithSpan.outputs = updatePayload.outputs;\n    }\n    if (updatePayload.error != null) {\n      langSmithSpan.error = updatePayload.error;\n    }\n\n    // Add new_token event for TTFT tracking on MODEL_GENERATION spans\n    if (span.type === SpanType.MODEL_GENERATION) {\n      const modelAttr = (span.attributes ?? {}) as ModelGenerationAttributes;\n      if (modelAttr.completionStartTime !== undefined) {\n        langSmithSpan.addEvent({\n          name: 'new_token',\n          time: modelAttr.completionStartTime.toISOString(),\n        });\n      }\n    }\n\n    if (isEnd) {\n      // End the span with the correct endTime\n      if (span.endTime) {\n        await langSmithSpan.end({ endTime: span.endTime.getTime() });\n      } else {\n        await langSmithSpan.end();\n      }\n    }\n    await langSmithSpan.patchRun();\n  }\n\n  /**\n   * Find LangSmith vendor metadata by walking up the span hierarchy and merging.\n   * Metadata is merged from ancestors with child values taking precedence over parent values.\n   *\n   * TODO(2.0): Extract shared `findVendorMetadata()` to base TrackingExporter class\n   * and reuse here and in LangfuseExporter.findLangfusePrompt()\n   */\n  private findLangsmithMetadata(\n    traceData: LangSmithTraceData,\n    span: AnyExportedSpan,\n  ): LangSmithMetadataInput | undefined {\n    // Collect metadata from all ancestors (current span first, then parents)\n    const metadataChain: LangSmithMetadataInput[] = [];\n    let currentSpanId: string | undefined = span.id;\n\n    while (currentSpanId) {\n      const providerMetadata = traceData.getMetadata({ spanId: currentSpanId });\n      if (providerMetadata) {\n        metadataChain.push(providerMetadata);\n      }\n      currentSpanId = traceData.getParentId({ spanId: currentSpanId });\n    }\n\n    if (metadataChain.length === 0) {\n      return undefined;\n    }\n\n    // Merge from ancestors to current span (parent values first, child values override)\n    const merged: LangSmithMetadataInput = {};\n    for (let i = metadataChain.length - 1; i >= 0; i--) {\n      const meta = metadataChain[i]!;\n      if (meta.projectName !== undefined) merged.projectName = meta.projectName;\n      if (meta.sessionId !== undefined) merged.sessionId = meta.sessionId;\n      if (meta.sessionName !== undefined) merged.sessionName = meta.sessionName;\n    }\n\n    this.logger.debug(`${this.name}: merged vendor metadata from hierarchy`, {\n      traceId: span.traceId,\n      spanId: span.id,\n      metadataKeys: Object.keys(merged),\n      ancestorCount: metadataChain.length,\n    });\n\n    return merged;\n  }\n\n  private buildRunTreePayload(\n    span: AnyExportedSpan,\n    traceData: LangSmithTraceData,\n    isNew = false,\n  ): Partial<RunTreeConfig> {\n    // Extract vendor metadata from span hierarchy\n    const vendorMetadata = this.findLangsmithMetadata(traceData, span);\n\n    // Build metadata, omitting the langsmith vendor key\n    const spanMetadata = span.metadata ? omitKeys(span.metadata, ['langsmith']) : {};\n\n    const payload: Partial<RunTreeConfig> & { metadata: KVMap } = {\n      client: this.#client,\n      metadata: {\n        mastra_span_type: span.type,\n        ...spanMetadata,\n      },\n    };\n\n    if (isNew) {\n      payload.run_type = mapSpanType(span.type);\n      payload.start_time = span.startTime.getTime();\n    }\n\n    // Add project name - vendor metadata takes precedence over config\n    const projectName = vendorMetadata?.projectName ?? this.config.projectName;\n    if (projectName) {\n      payload.project_name = projectName;\n    }\n\n    // Add session info to metadata if provided via vendor metadata\n    if (vendorMetadata?.sessionId) {\n      payload.metadata.session_id = vendorMetadata.sessionId;\n    }\n    if (vendorMetadata?.sessionName) {\n      payload.metadata.session_name = vendorMetadata.sessionName;\n    }\n\n    // Add tags for root spans\n    if (span.isRootSpan && span.tags?.length) {\n      payload.tags = span.tags;\n    }\n\n    // Core span data\n    if (span.input !== undefined) {\n      payload.inputs = isKVMap(span.input) ? span.input : { input: span.input };\n    }\n\n    if (span.output !== undefined) {\n      payload.outputs = isKVMap(span.output) ? span.output : { output: span.output };\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      // See: https://docs.langchain.com/langsmith/log-llm-trace\n      if (modelAttr.model !== undefined) {\n        // Note - this should map to a model name recognized by LangSmith\n        // eg “gpt-4o-mini”, “claude-3-opus-20240307”, etc.\n        payload.metadata.ls_model_name = modelAttr.model;\n      }\n\n      // Provider goes to metadata (if provided by attributes)\n      if (modelAttr.provider !== undefined) {\n        // Note - this should map to a provider name recognized by\n        // LangSmith eg “openai”, “anthropic”, etc.\n        payload.metadata.ls_provider = modelAttr.provider;\n      }\n\n      // Usage/token info goes to metrics\n      payload.metadata.usage_metadata = formatUsageMetrics(modelAttr.usage);\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', 'provider', 'usage', 'parameters', 'completionStartTime']);\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    return payload;\n  }\n}\n","/**\n * LangSmith Tracing Options Helpers\n *\n * These helpers integrate with the `buildTracingOptions` pattern from\n * `@mastra/observability` to add LangSmith-specific tracing features.\n *\n * @example\n * ```typescript\n * import { buildTracingOptions } from '@mastra/observability';\n * import { withLangsmithMetadata } from '@mastra/langsmith';\n *\n * const agent = new Agent({\n *   defaultGenerateOptions: {\n *     tracingOptions: buildTracingOptions(\n *       withLangsmithMetadata({ projectName: 'my-project' })\n *     ),\n *   },\n * });\n * ```\n */\n\nimport type { TracingOptionsUpdater } from '@mastra/observability';\n\n/**\n * LangSmith vendor metadata that can be passed via span metadata.\n * These fields are extracted by the LangSmith exporter and used\n * to override default configuration on a per-span basis.\n */\nexport interface LangSmithMetadataInput {\n  /**\n   * Override the project name for this span and its children.\n   * This allows dynamically routing traces to different LangSmith projects.\n   */\n  projectName?: string;\n  /**\n   * Session ID for grouping related traces in LangSmith.\n   */\n  sessionId?: string;\n  /**\n   * Session name for display in LangSmith.\n   */\n  sessionName?: string;\n}\n\n/**\n * Adds LangSmith metadata to the tracing options.\n *\n * The metadata is added under `metadata.langsmith` and allows you to:\n * - Route traces to different LangSmith projects via `projectName`\n * - Group traces by session via `sessionId` and `sessionName`\n *\n * @param metadata - The LangSmith metadata to add\n * @returns A TracingOptionsUpdater function for use with `buildTracingOptions`\n *\n * @example\n * ```typescript\n * import { buildTracingOptions } from '@mastra/observability';\n * import { withLangsmithMetadata } from '@mastra/langsmith';\n *\n * // Route traces to a specific project\n * const tracingOptions = buildTracingOptions(\n *   withLangsmithMetadata({ projectName: 'customer-support' }),\n * );\n *\n * // Or set multiple fields\n * const tracingOptions = buildTracingOptions(\n *   withLangsmithMetadata({\n *     projectName: 'my-project',\n *     sessionId: 'session-123',\n *   }),\n * );\n *\n * // Use in agent config\n * const agent = new Agent({\n *   name: 'support-agent',\n *   model: openai('gpt-4o'),\n *   defaultGenerateOptions: {\n *     tracingOptions: buildTracingOptions(\n *       withLangsmithMetadata({ projectName: 'support-traces' })\n *     ),\n *   },\n * });\n * ```\n */\nexport function withLangsmithMetadata(metadata: LangSmithMetadataInput): TracingOptionsUpdater {\n  return opts => ({\n    ...opts,\n    metadata: {\n      ...opts.metadata,\n      langsmith: {\n        ...(opts.metadata?.langsmith as Record<string, unknown>),\n        ...metadata,\n      },\n    },\n  });\n}\n"],"mappings":"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"}