{"version":3,"file":"utils.js","sources":["../../../../src/tracing/ai/utils.ts"],"sourcesContent":["/**\n * Shared utils for AI integrations (OpenAI, Anthropic, Verce.AI, etc.)\n */\nimport { captureException } from '../../exports';\nimport { getClient } from '../../currentScopes';\nimport { hasSpanStreamingEnabled } from '../spans/hasSpanStreamingEnabled';\nimport type { Span } from '../../types-hoist/span';\nimport { isThenable } from '../../utils/is';\nimport {\n  GEN_AI_RESPONSE_FINISH_REASONS_ATTRIBUTE,\n  GEN_AI_RESPONSE_ID_ATTRIBUTE,\n  GEN_AI_RESPONSE_MODEL_ATTRIBUTE,\n  GEN_AI_RESPONSE_STREAMING_ATTRIBUTE,\n  GEN_AI_RESPONSE_TEXT_ATTRIBUTE,\n  GEN_AI_RESPONSE_TOOL_CALLS_ATTRIBUTE,\n  GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE,\n  GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE,\n  GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE,\n} from './gen-ai-attributes';\nimport { truncateGenAiMessages, truncateGenAiStringInput } from './messageTruncation';\n\nexport interface AIRecordingOptions {\n  recordInputs?: boolean;\n  recordOutputs?: boolean;\n}\n\n/**\n * A method registry entry describes a single instrumented method:\n * which gen_ai operation it maps to and whether it is intrinsically streaming.\n */\nexport interface InstrumentedMethodEntry {\n  /** Operation name (e.g. 'chat', 'embeddings', 'generate_content'). Omit for factory methods that only need result proxying. */\n  operation?: string;\n  /** True if the method itself is always streaming (not param-based) */\n  streaming?: boolean;\n  /** When set, the method's return value is re-proxied with this as the base path */\n  proxyResultPath?: string;\n}\n\n/**\n * Maps method paths to their registry entries.\n * Used by proxy-based AI client instrumentations to determine which methods\n * to instrument, what operation name to use, and whether they stream.\n */\nexport type InstrumentedMethodRegistry = Record<string, InstrumentedMethodEntry>;\n\n/**\n * Resolves AI recording options by falling back to the client's `sendDefaultPii` setting.\n * Precedence: explicit option > sendDefaultPii > false\n */\nexport function resolveAIRecordingOptions<T extends AIRecordingOptions>(options?: T): T & Required<AIRecordingOptions> {\n  const sendDefaultPii = Boolean(getClient()?.getOptions().sendDefaultPii);\n  return {\n    ...options,\n    recordInputs: options?.recordInputs ?? sendDefaultPii,\n    recordOutputs: options?.recordOutputs ?? sendDefaultPii,\n  } as T & Required<AIRecordingOptions>;\n}\n\n/**\n * Resolves whether truncation should be enabled.\n * If the user explicitly set `enableTruncation`, that value is used.\n * Otherwise, truncation is disabled when span streaming is active.\n */\nexport function shouldEnableTruncation(enableTruncation: boolean | undefined): boolean {\n  const client = getClient();\n  return enableTruncation ?? !(client && hasSpanStreamingEnabled(client));\n}\n\n/**\n * Build method path from current traversal\n */\nexport function buildMethodPath(currentPath: string, prop: string): string {\n  return currentPath ? `${currentPath}.${prop}` : prop;\n}\n\n/**\n * Set token usage attributes\n * @param span - The span to add attributes to\n * @param promptTokens - The number of prompt tokens\n * @param completionTokens - The number of completion tokens\n * @param cachedInputTokens - The number of cached input tokens\n * @param cachedOutputTokens - The number of cached output tokens\n */\nexport function setTokenUsageAttributes(\n  span: Span,\n  promptTokens?: number,\n  completionTokens?: number,\n  cachedInputTokens?: number,\n  cachedOutputTokens?: number,\n): void {\n  if (promptTokens !== undefined) {\n    span.setAttributes({\n      [GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE]: promptTokens,\n    });\n  }\n  if (completionTokens !== undefined) {\n    span.setAttributes({\n      [GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE]: completionTokens,\n    });\n  }\n  if (\n    promptTokens !== undefined ||\n    completionTokens !== undefined ||\n    cachedInputTokens !== undefined ||\n    cachedOutputTokens !== undefined\n  ) {\n    /**\n     * Total input tokens in a request is the summation of `input_tokens`,\n     * `cache_creation_input_tokens`, and `cache_read_input_tokens`.\n     */\n    const totalTokens =\n      (promptTokens ?? 0) + (completionTokens ?? 0) + (cachedInputTokens ?? 0) + (cachedOutputTokens ?? 0);\n\n    span.setAttributes({\n      [GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE]: totalTokens,\n    });\n  }\n}\n\nexport interface StreamResponseState {\n  responseId?: string;\n  responseModel?: string;\n  finishReasons: string[];\n  responseTexts: string[];\n  toolCalls: unknown[];\n  promptTokens?: number;\n  completionTokens?: number;\n  totalTokens?: number;\n  cacheCreationInputTokens?: number;\n  cacheReadInputTokens?: number;\n}\n\n/**\n * Ends a streaming span by setting all accumulated response attributes and ending the span.\n * Shared across OpenAI, Anthropic, and Google GenAI streaming implementations.\n */\nexport function endStreamSpan(span: Span, state: StreamResponseState, recordOutputs: boolean): void {\n  if (!span.isRecording()) {\n    return;\n  }\n\n  const attrs: Record<string, string | number | boolean> = {\n    [GEN_AI_RESPONSE_STREAMING_ATTRIBUTE]: true,\n  };\n\n  if (state.responseId) attrs[GEN_AI_RESPONSE_ID_ATTRIBUTE] = state.responseId;\n  if (state.responseModel) attrs[GEN_AI_RESPONSE_MODEL_ATTRIBUTE] = state.responseModel;\n\n  if (state.promptTokens !== undefined) attrs[GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE] = state.promptTokens;\n  if (state.completionTokens !== undefined) attrs[GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE] = state.completionTokens;\n\n  // Use explicit total if provided (OpenAI, Google), otherwise compute from cache tokens (Anthropic)\n  if (state.totalTokens !== undefined) {\n    attrs[GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE] = state.totalTokens;\n  } else if (\n    state.promptTokens !== undefined ||\n    state.completionTokens !== undefined ||\n    state.cacheCreationInputTokens !== undefined ||\n    state.cacheReadInputTokens !== undefined\n  ) {\n    attrs[GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE] =\n      (state.promptTokens ?? 0) +\n      (state.completionTokens ?? 0) +\n      (state.cacheCreationInputTokens ?? 0) +\n      (state.cacheReadInputTokens ?? 0);\n  }\n\n  if (state.finishReasons.length) {\n    attrs[GEN_AI_RESPONSE_FINISH_REASONS_ATTRIBUTE] = JSON.stringify(state.finishReasons);\n  }\n  if (recordOutputs && state.responseTexts.length) {\n    attrs[GEN_AI_RESPONSE_TEXT_ATTRIBUTE] = state.responseTexts.join('');\n  }\n  if (recordOutputs && state.toolCalls.length) {\n    attrs[GEN_AI_RESPONSE_TOOL_CALLS_ATTRIBUTE] = JSON.stringify(state.toolCalls);\n  }\n\n  span.setAttributes(attrs);\n  span.end();\n}\n\n/**\n * Serialize a value to a JSON string without truncation.\n * Strings are returned as-is, arrays and objects are JSON-stringified.\n */\nexport function getJsonString<T>(value: T | T[]): string {\n  if (typeof value === 'string') {\n    return value;\n  }\n  return JSON.stringify(value);\n}\n\n/**\n * Get the truncated JSON string for a string or array of strings.\n *\n * @param value - The string or array of strings to truncate\n * @returns The truncated JSON string\n */\nexport function getTruncatedJsonString<T>(value: T | T[]): string {\n  if (typeof value === 'string') {\n    // Some values are already JSON strings, so we don't need to duplicate the JSON parsing\n    return truncateGenAiStringInput(value);\n  }\n  if (Array.isArray(value)) {\n    // truncateGenAiMessages returns an array of strings, so we need to stringify it\n    const truncatedMessages = truncateGenAiMessages(value);\n    return JSON.stringify(truncatedMessages);\n  }\n  // value is an object, so we need to stringify it\n  return JSON.stringify(value);\n}\n\n/**\n * Extract system instructions from messages array.\n * Finds the first system message and formats it according to OpenTelemetry semantic conventions.\n *\n * @param messages - Array of messages to extract system instructions from\n * @returns systemInstructions (JSON string) and filteredMessages (without system message)\n */\nexport function extractSystemInstructions(messages: unknown[] | unknown): {\n  systemInstructions: string | undefined;\n  filteredMessages: unknown[] | unknown;\n} {\n  if (!Array.isArray(messages)) {\n    return { systemInstructions: undefined, filteredMessages: messages };\n  }\n\n  const systemMessageIndex = messages.findIndex(\n    msg => msg && typeof msg === 'object' && 'role' in msg && (msg as { role: string }).role === 'system',\n  );\n\n  if (systemMessageIndex === -1) {\n    return { systemInstructions: undefined, filteredMessages: messages };\n  }\n\n  const systemMessage = messages[systemMessageIndex] as { role: string; content?: string | unknown };\n  const systemContent =\n    typeof systemMessage.content === 'string'\n      ? systemMessage.content\n      : systemMessage.content !== undefined\n        ? JSON.stringify(systemMessage.content)\n        : undefined;\n\n  if (!systemContent) {\n    return { systemInstructions: undefined, filteredMessages: messages };\n  }\n\n  const systemInstructions = JSON.stringify([{ type: 'text', content: systemContent }]);\n  const filteredMessages = [...messages.slice(0, systemMessageIndex), ...messages.slice(systemMessageIndex + 1)];\n\n  return { systemInstructions, filteredMessages };\n}\n\n/**\n * Creates a wrapped version of .withResponse() that replaces the data field\n * with the instrumented result while preserving metadata (response, request_id).\n */\nasync function createWithResponseWrapper<T>(\n  originalWithResponse: Promise<unknown>,\n  instrumentedPromise: Promise<T>,\n  mechanismType: string,\n): Promise<unknown> {\n  // Attach catch handler to originalWithResponse immediately to prevent unhandled rejection\n  // If instrumentedPromise rejects first, we still need this handled\n  const safeOriginalWithResponse = originalWithResponse.catch(error => {\n    captureException(error, {\n      mechanism: {\n        handled: false,\n        type: mechanismType,\n      },\n    });\n    throw error;\n  });\n\n  const instrumentedResult = await instrumentedPromise;\n  const originalWrapper = await safeOriginalWithResponse;\n\n  // Combine instrumented result with original metadata\n  if (originalWrapper && typeof originalWrapper === 'object' && 'data' in originalWrapper) {\n    return {\n      ...originalWrapper,\n      data: instrumentedResult,\n    };\n  }\n  return instrumentedResult;\n}\n\n/**\n * Wraps a promise-like object to preserve additional methods (like .withResponse())\n * that AI SDK clients (OpenAI, Anthropic) attach to their APIPromise return values.\n *\n * Standard Promise methods (.then, .catch, .finally) are routed to the instrumented\n * promise to preserve Sentry's span instrumentation, while custom SDK methods are\n * forwarded to the original promise to maintain the SDK's API surface.\n */\nexport function wrapPromiseWithMethods<R>(\n  originalPromiseLike: Promise<R>,\n  instrumentedPromise: Promise<R>,\n  mechanismType: string,\n): Promise<R> {\n  // If the original result is not thenable, return the instrumented promise\n  if (!isThenable(originalPromiseLike)) {\n    return instrumentedPromise;\n  }\n\n  // Create a proxy that forwards Promise methods to instrumentedPromise\n  // and preserves additional methods from the original result\n  return new Proxy(originalPromiseLike, {\n    get(target: object, prop: string | symbol): unknown {\n      // For standard Promise methods (.then, .catch, .finally, Symbol.toStringTag),\n      // use instrumentedPromise to preserve Sentry instrumentation.\n      // For custom methods (like .withResponse()), use the original target.\n      const useInstrumentedPromise = prop in Promise.prototype || prop === Symbol.toStringTag;\n      const source = useInstrumentedPromise ? instrumentedPromise : target;\n\n      const value = Reflect.get(source, prop) as unknown;\n\n      // Special handling for .withResponse() to preserve instrumentation\n      // .withResponse() returns { data: T, response: Response, request_id: string }\n      if (prop === 'withResponse' && typeof value === 'function') {\n        return function wrappedWithResponse(this: unknown): unknown {\n          const originalWithResponse = (value as (...args: unknown[]) => unknown).call(target);\n          return createWithResponseWrapper(originalWithResponse, instrumentedPromise, mechanismType);\n        };\n      }\n\n      return typeof value === 'function' ? value.bind(source) : value;\n    },\n  }) as Promise<R>;\n}\n"],"names":["getClient","hasSpanStreamingEnabled","GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE","GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE","GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE","GEN_AI_RESPONSE_STREAMING_ATTRIBUTE","GEN_AI_RESPONSE_ID_ATTRIBUTE","GEN_AI_RESPONSE_MODEL_ATTRIBUTE","GEN_AI_RESPONSE_FINISH_REASONS_ATTRIBUTE","GEN_AI_RESPONSE_TEXT_ATTRIBUTE","GEN_AI_RESPONSE_TOOL_CALLS_ATTRIBUTE","truncateGenAiStringInput","truncateGenAiMessages","captureException","isThenable"],"mappings":"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"}