@sentry/core 10.45.0 → 10.47.0
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/build/cjs/api.js +1 -0
- package/build/cjs/api.js.map +1 -1
- package/build/cjs/asyncContext/stackStrategy.js +6 -11
- package/build/cjs/asyncContext/stackStrategy.js.map +1 -1
- package/build/cjs/currentScopes.js +33 -0
- package/build/cjs/currentScopes.js.map +1 -1
- package/build/cjs/index.js +6 -0
- package/build/cjs/index.js.map +1 -1
- package/build/cjs/integrations/supabase.js +1 -1
- package/build/cjs/integrations/supabase.js.map +1 -1
- package/build/cjs/tracing/ai/gen-ai-attributes.js +0 -14
- package/build/cjs/tracing/ai/gen-ai-attributes.js.map +1 -1
- package/build/cjs/tracing/ai/messageTruncation.js +57 -39
- package/build/cjs/tracing/ai/messageTruncation.js.map +1 -1
- package/build/cjs/tracing/ai/utils.js +81 -35
- package/build/cjs/tracing/ai/utils.js.map +1 -1
- package/build/cjs/tracing/anthropic-ai/constants.js +10 -10
- package/build/cjs/tracing/anthropic-ai/constants.js.map +1 -1
- package/build/cjs/tracing/anthropic-ai/index.js +53 -28
- package/build/cjs/tracing/anthropic-ai/index.js.map +1 -1
- package/build/cjs/tracing/anthropic-ai/utils.js +0 -9
- package/build/cjs/tracing/anthropic-ai/utils.js.map +1 -1
- package/build/cjs/tracing/google-genai/constants.js +10 -8
- package/build/cjs/tracing/google-genai/constants.js.map +1 -1
- package/build/cjs/tracing/google-genai/index.js +44 -16
- package/build/cjs/tracing/google-genai/index.js.map +1 -1
- package/build/cjs/tracing/google-genai/utils.js +0 -25
- package/build/cjs/tracing/google-genai/utils.js.map +1 -1
- package/build/cjs/tracing/openai/constants.js +7 -7
- package/build/cjs/tracing/openai/constants.js.map +1 -1
- package/build/cjs/tracing/openai/index.js +22 -83
- package/build/cjs/tracing/openai/index.js.map +1 -1
- package/build/cjs/tracing/openai/utils.js +0 -47
- package/build/cjs/tracing/openai/utils.js.map +1 -1
- package/build/cjs/tracing/trace.js +5 -0
- package/build/cjs/tracing/trace.js.map +1 -1
- package/build/cjs/tracing/vercel-ai/index.js +9 -1
- package/build/cjs/tracing/vercel-ai/index.js.map +1 -1
- package/build/cjs/utils/chain-and-copy-promiselike.js +57 -0
- package/build/cjs/utils/chain-and-copy-promiselike.js.map +1 -0
- package/build/cjs/utils/handleCallbackErrors.js +15 -11
- package/build/cjs/utils/handleCallbackErrors.js.map +1 -1
- package/build/cjs/utils/traceData.js +11 -0
- package/build/cjs/utils/traceData.js.map +1 -1
- package/build/cjs/utils/version.js +1 -1
- package/build/esm/api.js +1 -1
- package/build/esm/api.js.map +1 -1
- package/build/esm/asyncContext/stackStrategy.js +6 -11
- package/build/esm/asyncContext/stackStrategy.js.map +1 -1
- package/build/esm/currentScopes.js +31 -1
- package/build/esm/currentScopes.js.map +1 -1
- package/build/esm/index.js +3 -2
- package/build/esm/index.js.map +1 -1
- package/build/esm/integrations/supabase.js +1 -1
- package/build/esm/integrations/supabase.js.map +1 -1
- package/build/esm/package.json +1 -1
- package/build/esm/tracing/ai/gen-ai-attributes.js +1 -14
- package/build/esm/tracing/ai/gen-ai-attributes.js.map +1 -1
- package/build/esm/tracing/ai/messageTruncation.js +57 -39
- package/build/esm/tracing/ai/messageTruncation.js.map +1 -1
- package/build/esm/tracing/ai/utils.js +81 -34
- package/build/esm/tracing/ai/utils.js.map +1 -1
- package/build/esm/tracing/anthropic-ai/constants.js +10 -10
- package/build/esm/tracing/anthropic-ai/constants.js.map +1 -1
- package/build/esm/tracing/anthropic-ai/index.js +56 -31
- package/build/esm/tracing/anthropic-ai/index.js.map +1 -1
- package/build/esm/tracing/anthropic-ai/utils.js +1 -9
- package/build/esm/tracing/anthropic-ai/utils.js.map +1 -1
- package/build/esm/tracing/google-genai/constants.js +10 -8
- package/build/esm/tracing/google-genai/constants.js.map +1 -1
- package/build/esm/tracing/google-genai/index.js +48 -20
- package/build/esm/tracing/google-genai/index.js.map +1 -1
- package/build/esm/tracing/google-genai/utils.js +1 -24
- package/build/esm/tracing/google-genai/utils.js.map +1 -1
- package/build/esm/tracing/openai/constants.js +7 -7
- package/build/esm/tracing/openai/constants.js.map +1 -1
- package/build/esm/tracing/openai/index.js +23 -84
- package/build/esm/tracing/openai/index.js.map +1 -1
- package/build/esm/tracing/openai/utils.js +2 -45
- package/build/esm/tracing/openai/utils.js.map +1 -1
- package/build/esm/tracing/trace.js +5 -0
- package/build/esm/tracing/trace.js.map +1 -1
- package/build/esm/tracing/vercel-ai/index.js +9 -1
- package/build/esm/tracing/vercel-ai/index.js.map +1 -1
- package/build/esm/utils/chain-and-copy-promiselike.js +55 -0
- package/build/esm/utils/chain-and-copy-promiselike.js.map +1 -0
- package/build/esm/utils/handleCallbackErrors.js +15 -11
- package/build/esm/utils/handleCallbackErrors.js.map +1 -1
- package/build/esm/utils/traceData.js +12 -1
- package/build/esm/utils/traceData.js.map +1 -1
- package/build/esm/utils/version.js +1 -1
- package/build/types/api.d.ts +1 -0
- package/build/types/api.d.ts.map +1 -1
- package/build/types/asyncContext/stackStrategy.d.ts.map +1 -1
- package/build/types/asyncContext/types.d.ts +3 -1
- package/build/types/asyncContext/types.d.ts.map +1 -1
- package/build/types/currentScopes.d.ts +20 -0
- package/build/types/currentScopes.d.ts.map +1 -1
- package/build/types/index.d.ts +3 -2
- package/build/types/index.d.ts.map +1 -1
- package/build/types/tracing/ai/gen-ai-attributes.d.ts +0 -8
- package/build/types/tracing/ai/gen-ai-attributes.d.ts.map +1 -1
- package/build/types/tracing/ai/messageTruncation.d.ts.map +1 -1
- package/build/types/tracing/ai/utils.d.ts +24 -9
- package/build/types/tracing/ai/utils.d.ts.map +1 -1
- package/build/types/tracing/anthropic-ai/constants.d.ts +24 -1
- package/build/types/tracing/anthropic-ai/constants.d.ts.map +1 -1
- package/build/types/tracing/anthropic-ai/index.d.ts.map +1 -1
- package/build/types/tracing/anthropic-ai/types.d.ts +5 -2
- package/build/types/tracing/anthropic-ai/types.d.ts.map +1 -1
- package/build/types/tracing/anthropic-ai/utils.d.ts +1 -5
- package/build/types/tracing/anthropic-ai/utils.d.ts.map +1 -1
- package/build/types/tracing/google-genai/constants.d.ts +22 -1
- package/build/types/tracing/google-genai/constants.d.ts.map +1 -1
- package/build/types/tracing/google-genai/index.d.ts.map +1 -1
- package/build/types/tracing/google-genai/types.d.ts +6 -2
- package/build/types/tracing/google-genai/types.d.ts.map +1 -1
- package/build/types/tracing/google-genai/utils.d.ts +0 -9
- package/build/types/tracing/google-genai/utils.d.ts.map +1 -1
- package/build/types/tracing/openai/constants.d.ts +14 -1
- package/build/types/tracing/openai/constants.d.ts.map +1 -1
- package/build/types/tracing/openai/index.d.ts.map +1 -1
- package/build/types/tracing/openai/types.d.ts +5 -2
- package/build/types/tracing/openai/types.d.ts.map +1 -1
- package/build/types/tracing/openai/utils.d.ts +1 -19
- package/build/types/tracing/openai/utils.d.ts.map +1 -1
- package/build/types/tracing/trace.d.ts.map +1 -1
- package/build/types/tracing/vercel-ai/index.d.ts.map +1 -1
- package/build/types/utils/chain-and-copy-promiselike.d.ts +6 -0
- package/build/types/utils/chain-and-copy-promiselike.d.ts.map +1 -0
- package/build/types/utils/handleCallbackErrors.d.ts.map +1 -1
- package/build/types/utils/traceData.d.ts +4 -0
- package/build/types/utils/traceData.d.ts.map +1 -1
- package/build/types-ts3.8/api.d.ts +1 -0
- package/build/types-ts3.8/asyncContext/types.d.ts +3 -1
- package/build/types-ts3.8/currentScopes.d.ts +20 -0
- package/build/types-ts3.8/index.d.ts +3 -2
- package/build/types-ts3.8/tracing/ai/gen-ai-attributes.d.ts +0 -8
- package/build/types-ts3.8/tracing/ai/utils.d.ts +24 -9
- package/build/types-ts3.8/tracing/anthropic-ai/constants.d.ts +24 -9
- package/build/types-ts3.8/tracing/anthropic-ai/types.d.ts +5 -2
- package/build/types-ts3.8/tracing/anthropic-ai/utils.d.ts +1 -5
- package/build/types-ts3.8/tracing/google-genai/constants.d.ts +22 -7
- package/build/types-ts3.8/tracing/google-genai/types.d.ts +6 -2
- package/build/types-ts3.8/tracing/google-genai/utils.d.ts +0 -9
- package/build/types-ts3.8/tracing/openai/constants.d.ts +14 -6
- package/build/types-ts3.8/tracing/openai/types.d.ts +5 -2
- package/build/types-ts3.8/tracing/openai/utils.d.ts +1 -19
- package/build/types-ts3.8/utils/chain-and-copy-promiselike.d.ts +6 -0
- package/build/types-ts3.8/utils/traceData.d.ts +4 -0
- package/package.json +1 -1
package/build/esm/index.js
CHANGED
|
@@ -12,14 +12,14 @@ export { logSpanEnd, logSpanStart } from './tracing/logSpans.js';
|
|
|
12
12
|
export { GEN_AI_CONVERSATION_ID_ATTRIBUTE, SEMANTIC_ATTRIBUTE_CACHE_HIT, SEMANTIC_ATTRIBUTE_CACHE_ITEM_SIZE, SEMANTIC_ATTRIBUTE_CACHE_KEY, SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME, SEMANTIC_ATTRIBUTE_HTTP_REQUEST_METHOD, SEMANTIC_ATTRIBUTE_PROFILE_ID, SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME, SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON, SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_UNIT, SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_VALUE, SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, SEMANTIC_ATTRIBUTE_SENTRY_PREVIOUS_TRACE_SAMPLE_RATE, SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE, SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, SEMANTIC_ATTRIBUTE_URL_FULL, SEMANTIC_LINK_ATTRIBUTE_LINK_TYPE } from './semanticAttributes.js';
|
|
13
13
|
export { createEventEnvelope, createSessionEnvelope, createSpanEnvelope } from './envelope.js';
|
|
14
14
|
export { addEventProcessor, captureCheckIn, captureEvent, captureException, captureMessage, captureSession, close, endSession, flush, isEnabled, isInitialized, lastEventId, setContext, setConversationId, setExtra, setExtras, setTag, setTags, setUser, startSession, withMonitor } from './exports.js';
|
|
15
|
-
export { getClient, getCurrentScope, getGlobalScope, getIsolationScope, getTraceContextFromScope, withIsolationScope, withScope } from './currentScopes.js';
|
|
15
|
+
export { getClient, getCurrentScope, getExternalPropagationContext, getGlobalScope, getIsolationScope, getTraceContextFromScope, hasExternalPropagationContext, registerExternalPropagationContext, withIsolationScope, withScope } from './currentScopes.js';
|
|
16
16
|
export { getDefaultCurrentScope, getDefaultIsolationScope } from './defaultScopes.js';
|
|
17
17
|
export { setAsyncContextStrategy } from './asyncContext/index.js';
|
|
18
18
|
export { getGlobalSingleton, getMainCarrier } from './carrier.js';
|
|
19
19
|
export { closeSession, makeSession, updateSession } from './session.js';
|
|
20
20
|
export { Scope } from './scope.js';
|
|
21
21
|
export { notifyEventProcessors } from './eventProcessors.js';
|
|
22
|
-
export { getEnvelopeEndpointWithUrlEncodedAuth, getReportDialogEndpoint } from './api.js';
|
|
22
|
+
export { SENTRY_API_VERSION, getEnvelopeEndpointWithUrlEncodedAuth, getReportDialogEndpoint } from './api.js';
|
|
23
23
|
export { Client } from './client.js';
|
|
24
24
|
export { ServerRuntimeClient } from './server-runtime-client.js';
|
|
25
25
|
export { initAndBind, setCurrentClient } from './sdk.js';
|
|
@@ -139,4 +139,5 @@ export { getDebugImagesForResources, getFilenameToDebugIdMap } from './utils/deb
|
|
|
139
139
|
export { getFilenameToMetadataMap } from './metadata.js';
|
|
140
140
|
export { escapeStringForRegex } from './vendor/escapeStringForRegex.js';
|
|
141
141
|
export { safeDateNow as _INTERNAL_safeDateNow, safeMathRandom as _INTERNAL_safeMathRandom, withRandomSafeContext as _INTERNAL_withRandomSafeContext } from './utils/randomSafeContext.js';
|
|
142
|
+
export { safeUnref as _INTERNAL_safeUnref } from './utils/timer.js';
|
|
142
143
|
//# sourceMappingURL=index.js.map
|
package/build/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"supabase.js","sources":["../../../src/integrations/supabase.ts"],"sourcesContent":["// Based on Kamil Ogórek's work on:\n// https://github.com/supabase-community/sentry-integration-js\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable max-lines */\nimport { addBreadcrumb } from '../breadcrumbs';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { captureException } from '../exports';\nimport { defineIntegration } from '../integration';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '../semanticAttributes';\nimport { setHttpStatus, SPAN_STATUS_ERROR, SPAN_STATUS_OK, startSpan } from '../tracing';\nimport type { IntegrationFn } from '../types-hoist/integration';\nimport { debug } from '../utils/debug-logger';\nimport { isPlainObject } from '../utils/is';\nimport { addExceptionMechanism } from '../utils/misc';\n\nconst AUTH_OPERATIONS_TO_INSTRUMENT = [\n 'reauthenticate',\n 'signInAnonymously',\n 'signInWithOAuth',\n 'signInWithIdToken',\n 'signInWithOtp',\n 'signInWithPassword',\n 'signInWithSSO',\n 'signOut',\n 'signUp',\n 'verifyOtp',\n];\n\nconst AUTH_ADMIN_OPERATIONS_TO_INSTRUMENT = [\n 'createUser',\n 'deleteUser',\n 'listUsers',\n 'getUserById',\n 'updateUserById',\n 'inviteUserByEmail',\n];\n\nexport const FILTER_MAPPINGS = {\n eq: 'eq',\n neq: 'neq',\n gt: 'gt',\n gte: 'gte',\n lt: 'lt',\n lte: 'lte',\n like: 'like',\n 'like(all)': 'likeAllOf',\n 'like(any)': 'likeAnyOf',\n ilike: 'ilike',\n 'ilike(all)': 'ilikeAllOf',\n 'ilike(any)': 'ilikeAnyOf',\n is: 'is',\n in: 'in',\n cs: 'contains',\n cd: 'containedBy',\n sr: 'rangeGt',\n nxl: 'rangeGte',\n sl: 'rangeLt',\n nxr: 'rangeLte',\n adj: 'rangeAdjacent',\n ov: 'overlaps',\n fts: '',\n plfts: 'plain',\n phfts: 'phrase',\n wfts: 'websearch',\n not: 'not',\n};\n\nexport const DB_OPERATIONS_TO_INSTRUMENT = ['select', 'insert', 'upsert', 'update', 'delete'];\n\ntype AuthOperationFn = (...args: unknown[]) => Promise<unknown>;\ntype AuthOperationName = (typeof AUTH_OPERATIONS_TO_INSTRUMENT)[number];\ntype AuthAdminOperationName = (typeof AUTH_ADMIN_OPERATIONS_TO_INSTRUMENT)[number];\ntype PostgRESTQueryOperationFn = (...args: unknown[]) => PostgRESTFilterBuilder;\n\nexport interface SupabaseClientInstance {\n auth: {\n admin: Record<AuthAdminOperationName, AuthOperationFn>;\n } & Record<AuthOperationName, AuthOperationFn>;\n}\n\nexport interface PostgRESTQueryBuilder {\n [key: string]: PostgRESTQueryOperationFn;\n}\n\nexport interface PostgRESTFilterBuilder {\n method: string;\n headers: Record<string, string>;\n url: URL;\n schema: string;\n body: any;\n}\n\nexport interface SupabaseResponse {\n status?: number;\n error?: {\n message: string;\n code?: string;\n details?: unknown;\n };\n}\n\nexport interface SupabaseError extends Error {\n code?: string;\n details?: unknown;\n}\n\nexport interface SupabaseBreadcrumb {\n type: string;\n category: string;\n message: string;\n data?: {\n query?: string[];\n body?: Record<string, unknown>;\n };\n}\n\nexport interface SupabaseClientConstructor {\n prototype: {\n from: (table: string) => PostgRESTQueryBuilder;\n };\n}\n\nexport interface PostgRESTProtoThenable {\n then: <T>(\n onfulfilled?: ((value: T) => T | PromiseLike<T>) | null,\n onrejected?: ((reason: any) => T | PromiseLike<T>) | null,\n ) => Promise<T>;\n}\n\ntype SentryInstrumented<T> = T & {\n __SENTRY_INSTRUMENTED__?: boolean;\n};\n\nfunction markAsInstrumented<T>(fn: T): void {\n try {\n (fn as SentryInstrumented<T>).__SENTRY_INSTRUMENTED__ = true;\n } catch {\n // ignore errors here\n }\n}\n\nfunction isInstrumented<T>(fn: T): boolean | undefined {\n try {\n return (fn as SentryInstrumented<T>).__SENTRY_INSTRUMENTED__;\n } catch {\n return false;\n }\n}\n\n/**\n * Extracts the database operation type from the HTTP method and headers\n * @param method - The HTTP method of the request\n * @param headers - The request headers\n * @returns The database operation type ('select', 'insert', 'upsert', 'update', or 'delete')\n */\nexport function extractOperation(method: string, headers: Record<string, string> = {}): string {\n switch (method) {\n case 'GET': {\n return 'select';\n }\n case 'POST': {\n if (headers['Prefer']?.includes('resolution=')) {\n return 'upsert';\n } else {\n return 'insert';\n }\n }\n case 'PATCH': {\n return 'update';\n }\n case 'DELETE': {\n return 'delete';\n }\n default: {\n return '<unknown-op>';\n }\n }\n}\n\n/**\n * Translates Supabase filter parameters into readable method names for tracing\n * @param key - The filter key from the URL search parameters\n * @param query - The filter value from the URL search parameters\n * @returns A string representation of the filter as a method call\n */\nexport function translateFiltersIntoMethods(key: string, query: string): string {\n if (query === '' || query === '*') {\n return 'select(*)';\n }\n\n if (key === 'select') {\n return `select(${query})`;\n }\n\n if (key === 'or' || key.endsWith('.or')) {\n return `${key}${query}`;\n }\n\n const [filter, ...value] = query.split('.');\n\n let method;\n // Handle optional `configPart` of the filter\n if (filter?.startsWith('fts')) {\n method = 'textSearch';\n } else if (filter?.startsWith('plfts')) {\n method = 'textSearch[plain]';\n } else if (filter?.startsWith('phfts')) {\n method = 'textSearch[phrase]';\n } else if (filter?.startsWith('wfts')) {\n method = 'textSearch[websearch]';\n } else {\n method = (filter && FILTER_MAPPINGS[filter as keyof typeof FILTER_MAPPINGS]) || 'filter';\n }\n\n return `${method}(${key}, ${value.join('.')})`;\n}\n\nfunction instrumentAuthOperation(operation: AuthOperationFn, isAdmin = false): AuthOperationFn {\n return new Proxy(operation, {\n apply(target, thisArg, argumentsList) {\n return startSpan(\n {\n name: `auth ${isAdmin ? '(admin) ' : ''}${operation.name}`,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.db.supabase',\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'db',\n 'db.system': 'postgresql',\n 'db.operation': `auth.${isAdmin ? 'admin.' : ''}${operation.name}`,\n },\n },\n span => {\n return Reflect.apply(target, thisArg, argumentsList)\n .then((res: unknown) => {\n if (res && typeof res === 'object' && 'error' in res && res.error) {\n span.setStatus({ code: SPAN_STATUS_ERROR });\n\n captureException(res.error, {\n mechanism: {\n handled: false,\n type: 'auto.db.supabase.auth',\n },\n });\n } else {\n span.setStatus({ code: SPAN_STATUS_OK });\n }\n\n span.end();\n return res;\n })\n .catch((err: unknown) => {\n span.setStatus({ code: SPAN_STATUS_ERROR });\n span.end();\n\n captureException(err, {\n mechanism: {\n handled: false,\n type: 'auto.db.supabase.auth',\n },\n });\n\n throw err;\n })\n .then(...argumentsList);\n },\n );\n },\n });\n}\n\nfunction instrumentSupabaseAuthClient(supabaseClientInstance: SupabaseClientInstance): void {\n const auth = supabaseClientInstance.auth;\n\n if (!auth || isInstrumented(supabaseClientInstance.auth)) {\n return;\n }\n\n for (const operation of AUTH_OPERATIONS_TO_INSTRUMENT) {\n const authOperation = auth[operation];\n\n if (!authOperation) {\n continue;\n }\n\n if (typeof supabaseClientInstance.auth[operation] === 'function') {\n supabaseClientInstance.auth[operation] = instrumentAuthOperation(authOperation);\n }\n }\n\n for (const operation of AUTH_ADMIN_OPERATIONS_TO_INSTRUMENT) {\n const authOperation = auth.admin[operation];\n\n if (!authOperation) {\n continue;\n }\n\n if (typeof supabaseClientInstance.auth.admin[operation] === 'function') {\n supabaseClientInstance.auth.admin[operation] = instrumentAuthOperation(authOperation, true);\n }\n }\n\n markAsInstrumented(supabaseClientInstance.auth);\n}\n\nfunction instrumentSupabaseClientConstructor(SupabaseClient: unknown): void {\n if (isInstrumented((SupabaseClient as SupabaseClientConstructor).prototype.from)) {\n return;\n }\n\n (SupabaseClient as SupabaseClientConstructor).prototype.from = new Proxy(\n (SupabaseClient as SupabaseClientConstructor).prototype.from,\n {\n apply(target, thisArg, argumentsList) {\n const rv = Reflect.apply(target, thisArg, argumentsList);\n const PostgRESTQueryBuilder = (rv as PostgRESTQueryBuilder).constructor;\n\n instrumentPostgRESTQueryBuilder(PostgRESTQueryBuilder as unknown as new () => PostgRESTQueryBuilder);\n\n return rv;\n },\n },\n );\n\n markAsInstrumented((SupabaseClient as SupabaseClientConstructor).prototype.from);\n}\n\nfunction instrumentPostgRESTFilterBuilder(PostgRESTFilterBuilder: PostgRESTFilterBuilder['constructor']): void {\n if (isInstrumented((PostgRESTFilterBuilder.prototype as unknown as PostgRESTProtoThenable).then)) {\n return;\n }\n\n (PostgRESTFilterBuilder.prototype as unknown as PostgRESTProtoThenable).then = new Proxy(\n (PostgRESTFilterBuilder.prototype as unknown as PostgRESTProtoThenable).then,\n {\n apply(target, thisArg, argumentsList) {\n const operations = DB_OPERATIONS_TO_INSTRUMENT;\n const typedThis = thisArg as PostgRESTFilterBuilder;\n const operation = extractOperation(typedThis.method, typedThis.headers);\n\n if (!operations.includes(operation)) {\n return Reflect.apply(target, thisArg, argumentsList);\n }\n\n if (!typedThis?.url?.pathname || typeof typedThis.url.pathname !== 'string') {\n return Reflect.apply(target, thisArg, argumentsList);\n }\n\n const pathParts = typedThis.url.pathname.split('/');\n const table = pathParts.length > 0 ? pathParts[pathParts.length - 1] : '';\n\n const queryItems: string[] = [];\n for (const [key, value] of typedThis.url.searchParams.entries()) {\n // It's possible to have multiple entries for the same key, eg. `id=eq.7&id=eq.3`,\n // so we need to use array instead of object to collect them.\n queryItems.push(translateFiltersIntoMethods(key, value));\n }\n const body: Record<string, unknown> = Object.create(null);\n if (isPlainObject(typedThis.body)) {\n for (const [key, value] of Object.entries(typedThis.body)) {\n body[key] = value;\n }\n }\n\n // Adding operation to the beginning of the description if it's not a `select` operation\n // For example, it can be an `insert` or `update` operation but the query can be `select(...)`\n // For `select` operations, we don't need repeat it in the description\n const description = `${operation === 'select' ? '' : `${operation}${body ? '(...) ' : ''}`}${queryItems.join(\n ' ',\n )} from(${table})`;\n\n const attributes: Record<string, any> = {\n 'db.table': table,\n 'db.schema': typedThis.schema,\n 'db.url': typedThis.url.origin,\n 'db.sdk': typedThis.headers['X-Client-Info'],\n 'db.system': 'postgresql',\n 'db.operation': operation,\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.db.supabase',\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'db',\n };\n\n if (queryItems.length) {\n attributes['db.query'] = queryItems;\n }\n\n if (Object.keys(body).length) {\n attributes['db.body'] = body;\n }\n\n return startSpan(\n {\n name: description,\n attributes,\n },\n span => {\n return (Reflect.apply(target, thisArg, []) as Promise<SupabaseResponse>)\n .then(\n (res: SupabaseResponse) => {\n if (span) {\n if (res && typeof res === 'object' && 'status' in res) {\n setHttpStatus(span, res.status || 500);\n }\n span.end();\n }\n\n if (res.error) {\n const err = new Error(res.error.message) as SupabaseError;\n if (res.error.code) {\n err.code = res.error.code;\n }\n if (res.error.details) {\n err.details = res.error.details;\n }\n\n const supabaseContext: Record<string, any> = {};\n if (queryItems.length) {\n supabaseContext.query = queryItems;\n }\n if (Object.keys(body).length) {\n supabaseContext.body = body;\n }\n\n captureException(err, scope => {\n scope.addEventProcessor(e => {\n addExceptionMechanism(e, {\n handled: false,\n type: 'auto.db.supabase.postgres',\n });\n\n return e;\n });\n\n scope.setContext('supabase', supabaseContext);\n\n return scope;\n });\n }\n\n const breadcrumb: SupabaseBreadcrumb = {\n type: 'supabase',\n category: `db.${operation}`,\n message: description,\n };\n\n const data: Record<string, unknown> = {};\n\n if (queryItems.length) {\n data.query = queryItems;\n }\n\n if (Object.keys(body).length) {\n data.body = body;\n }\n\n if (Object.keys(data).length) {\n breadcrumb.data = data;\n }\n\n addBreadcrumb(breadcrumb);\n\n return res;\n },\n (err: Error) => {\n // TODO: shouldn't we capture this error?\n if (span) {\n setHttpStatus(span, 500);\n span.end();\n }\n throw err;\n },\n )\n .then(...argumentsList);\n },\n );\n },\n },\n );\n\n markAsInstrumented((PostgRESTFilterBuilder.prototype as unknown as PostgRESTProtoThenable).then);\n}\n\nfunction instrumentPostgRESTQueryBuilder(PostgRESTQueryBuilder: new () => PostgRESTQueryBuilder): void {\n // We need to wrap _all_ operations despite them sharing the same `PostgRESTFilterBuilder`\n // constructor, as we don't know which method will be called first, and we don't want to miss any calls.\n for (const operation of DB_OPERATIONS_TO_INSTRUMENT) {\n if (isInstrumented((PostgRESTQueryBuilder.prototype as Record<string, any>)[operation])) {\n continue;\n }\n\n type PostgRESTOperation = keyof Pick<PostgRESTQueryBuilder, 'select' | 'insert' | 'upsert' | 'update' | 'delete'>;\n (PostgRESTQueryBuilder.prototype as Record<string, any>)[operation as PostgRESTOperation] = new Proxy(\n (PostgRESTQueryBuilder.prototype as Record<string, any>)[operation as PostgRESTOperation],\n {\n apply(target, thisArg, argumentsList) {\n const rv = Reflect.apply(target, thisArg, argumentsList);\n const PostgRESTFilterBuilder = (rv as PostgRESTFilterBuilder).constructor;\n\n DEBUG_BUILD && debug.log(`Instrumenting ${operation} operation's PostgRESTFilterBuilder`);\n\n instrumentPostgRESTFilterBuilder(PostgRESTFilterBuilder);\n\n return rv;\n },\n },\n );\n\n markAsInstrumented((PostgRESTQueryBuilder.prototype as Record<string, any>)[operation]);\n }\n}\n\nexport const instrumentSupabaseClient = (supabaseClient: unknown): void => {\n if (!supabaseClient) {\n DEBUG_BUILD && debug.warn('Supabase integration was not installed because no Supabase client was provided.');\n return;\n }\n const SupabaseClientConstructor =\n supabaseClient.constructor === Function ? supabaseClient : supabaseClient.constructor;\n\n instrumentSupabaseClientConstructor(SupabaseClientConstructor);\n instrumentSupabaseAuthClient(supabaseClient as SupabaseClientInstance);\n};\n\nconst INTEGRATION_NAME = 'Supabase';\n\nconst _supabaseIntegration = ((supabaseClient: unknown) => {\n return {\n setupOnce() {\n instrumentSupabaseClient(supabaseClient);\n },\n name: INTEGRATION_NAME,\n };\n}) satisfies IntegrationFn;\n\nexport const supabaseIntegration = defineIntegration((options: { supabaseClient: any }) => {\n return _supabaseIntegration(options.supabaseClient);\n}) satisfies IntegrationFn;\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"supabase.js","sources":["../../../src/integrations/supabase.ts"],"sourcesContent":["// Based on Kamil Ogórek's work on:\n// https://github.com/supabase-community/sentry-integration-js\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable max-lines */\nimport { addBreadcrumb } from '../breadcrumbs';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { captureException } from '../exports';\nimport { defineIntegration } from '../integration';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '../semanticAttributes';\nimport { setHttpStatus, SPAN_STATUS_ERROR, SPAN_STATUS_OK, startSpan } from '../tracing';\nimport type { IntegrationFn } from '../types-hoist/integration';\nimport { debug } from '../utils/debug-logger';\nimport { isPlainObject } from '../utils/is';\nimport { addExceptionMechanism } from '../utils/misc';\n\nconst AUTH_OPERATIONS_TO_INSTRUMENT = [\n 'reauthenticate',\n 'signInAnonymously',\n 'signInWithOAuth',\n 'signInWithIdToken',\n 'signInWithOtp',\n 'signInWithPassword',\n 'signInWithSSO',\n 'signOut',\n 'signUp',\n 'verifyOtp',\n];\n\nconst AUTH_ADMIN_OPERATIONS_TO_INSTRUMENT = [\n 'createUser',\n 'deleteUser',\n 'listUsers',\n 'getUserById',\n 'updateUserById',\n 'inviteUserByEmail',\n];\n\nexport const FILTER_MAPPINGS = {\n eq: 'eq',\n neq: 'neq',\n gt: 'gt',\n gte: 'gte',\n lt: 'lt',\n lte: 'lte',\n like: 'like',\n 'like(all)': 'likeAllOf',\n 'like(any)': 'likeAnyOf',\n ilike: 'ilike',\n 'ilike(all)': 'ilikeAllOf',\n 'ilike(any)': 'ilikeAnyOf',\n is: 'is',\n in: 'in',\n cs: 'contains',\n cd: 'containedBy',\n sr: 'rangeGt',\n nxl: 'rangeGte',\n sl: 'rangeLt',\n nxr: 'rangeLte',\n adj: 'rangeAdjacent',\n ov: 'overlaps',\n fts: '',\n plfts: 'plain',\n phfts: 'phrase',\n wfts: 'websearch',\n not: 'not',\n};\n\nexport const DB_OPERATIONS_TO_INSTRUMENT = ['select', 'insert', 'upsert', 'update', 'delete'];\n\ntype AuthOperationFn = (...args: unknown[]) => Promise<unknown>;\ntype AuthOperationName = (typeof AUTH_OPERATIONS_TO_INSTRUMENT)[number];\ntype AuthAdminOperationName = (typeof AUTH_ADMIN_OPERATIONS_TO_INSTRUMENT)[number];\ntype PostgRESTQueryOperationFn = (...args: unknown[]) => PostgRESTFilterBuilder;\n\nexport interface SupabaseClientInstance {\n auth: {\n admin: Record<AuthAdminOperationName, AuthOperationFn>;\n } & Record<AuthOperationName, AuthOperationFn>;\n}\n\nexport interface PostgRESTQueryBuilder {\n [key: string]: PostgRESTQueryOperationFn;\n}\n\nexport interface PostgRESTFilterBuilder {\n method: string;\n headers: Record<string, string>;\n url: URL;\n schema: string;\n body: any;\n}\n\nexport interface SupabaseResponse {\n status?: number;\n error?: {\n message: string;\n code?: string;\n details?: unknown;\n };\n}\n\nexport interface SupabaseError extends Error {\n code?: string;\n details?: unknown;\n}\n\nexport interface SupabaseBreadcrumb {\n type: string;\n category: string;\n message: string;\n data?: {\n query?: string[];\n body?: Record<string, unknown>;\n };\n}\n\nexport interface SupabaseClientConstructor {\n prototype: {\n from: (table: string) => PostgRESTQueryBuilder;\n };\n}\n\nexport interface PostgRESTProtoThenable {\n then: <T>(\n onfulfilled?: ((value: T) => T | PromiseLike<T>) | null,\n onrejected?: ((reason: any) => T | PromiseLike<T>) | null,\n ) => Promise<T>;\n}\n\ntype SentryInstrumented<T> = T & {\n __SENTRY_INSTRUMENTED__?: boolean;\n};\n\nfunction markAsInstrumented<T>(fn: T): void {\n try {\n (fn as SentryInstrumented<T>).__SENTRY_INSTRUMENTED__ = true;\n } catch {\n // ignore errors here\n }\n}\n\nfunction isInstrumented<T>(fn: T): boolean | undefined {\n try {\n return (fn as SentryInstrumented<T>).__SENTRY_INSTRUMENTED__;\n } catch {\n return false;\n }\n}\n\n/**\n * Extracts the database operation type from the HTTP method and headers\n * @param method - The HTTP method of the request\n * @param headers - The request headers\n * @returns The database operation type ('select', 'insert', 'upsert', 'update', or 'delete')\n */\nexport function extractOperation(method: string, headers: Record<string, string> = {}): string {\n switch (method) {\n case 'GET': {\n return 'select';\n }\n case 'POST': {\n if (headers['Prefer']?.includes('resolution=')) {\n return 'upsert';\n } else {\n return 'insert';\n }\n }\n case 'PATCH': {\n return 'update';\n }\n case 'DELETE': {\n return 'delete';\n }\n default: {\n return '<unknown-op>';\n }\n }\n}\n\n/**\n * Translates Supabase filter parameters into readable method names for tracing\n * @param key - The filter key from the URL search parameters\n * @param query - The filter value from the URL search parameters\n * @returns A string representation of the filter as a method call\n */\nexport function translateFiltersIntoMethods(key: string, query: string): string {\n if (query === '' || query === '*') {\n return 'select(*)';\n }\n\n if (key === 'select') {\n return `select(${query})`;\n }\n\n if (key === 'or' || key.endsWith('.or')) {\n return `${key}${query}`;\n }\n\n const [filter, ...value] = query.split('.');\n\n let method;\n // Handle optional `configPart` of the filter\n if (filter?.startsWith('fts')) {\n method = 'textSearch';\n } else if (filter?.startsWith('plfts')) {\n method = 'textSearch[plain]';\n } else if (filter?.startsWith('phfts')) {\n method = 'textSearch[phrase]';\n } else if (filter?.startsWith('wfts')) {\n method = 'textSearch[websearch]';\n } else {\n method = (filter && FILTER_MAPPINGS[filter as keyof typeof FILTER_MAPPINGS]) || 'filter';\n }\n\n return `${method}(${key}, ${value.join('.')})`;\n}\n\nfunction instrumentAuthOperation(operation: AuthOperationFn, isAdmin = false): AuthOperationFn {\n return new Proxy(operation, {\n apply(target, thisArg, argumentsList) {\n return startSpan(\n {\n name: `auth ${isAdmin ? '(admin) ' : ''}${operation.name}`,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.db.supabase',\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'db',\n 'db.system': 'postgresql',\n 'db.operation': `auth.${isAdmin ? 'admin.' : ''}${operation.name}`,\n },\n },\n span => {\n return Reflect.apply(target, thisArg, argumentsList)\n .then((res: unknown) => {\n if (res && typeof res === 'object' && 'error' in res && res.error) {\n span.setStatus({ code: SPAN_STATUS_ERROR });\n\n captureException(res.error, {\n mechanism: {\n handled: false,\n type: 'auto.db.supabase.auth',\n },\n });\n } else {\n span.setStatus({ code: SPAN_STATUS_OK });\n }\n\n span.end();\n return res;\n })\n .catch((err: unknown) => {\n span.setStatus({ code: SPAN_STATUS_ERROR });\n span.end();\n\n captureException(err, {\n mechanism: {\n handled: false,\n type: 'auto.db.supabase.auth',\n },\n });\n\n throw err;\n })\n .then(...argumentsList);\n },\n );\n },\n });\n}\n\nfunction instrumentSupabaseAuthClient(supabaseClientInstance: SupabaseClientInstance): void {\n const auth = supabaseClientInstance.auth;\n\n if (!auth || isInstrumented(supabaseClientInstance.auth)) {\n return;\n }\n\n for (const operation of AUTH_OPERATIONS_TO_INSTRUMENT) {\n const authOperation = auth[operation];\n\n if (!authOperation) {\n continue;\n }\n\n if (typeof supabaseClientInstance.auth[operation] === 'function') {\n supabaseClientInstance.auth[operation] = instrumentAuthOperation(authOperation);\n }\n }\n\n for (const operation of AUTH_ADMIN_OPERATIONS_TO_INSTRUMENT) {\n const authOperation = auth.admin[operation];\n\n if (!authOperation) {\n continue;\n }\n\n if (typeof supabaseClientInstance.auth.admin[operation] === 'function') {\n supabaseClientInstance.auth.admin[operation] = instrumentAuthOperation(authOperation, true);\n }\n }\n\n markAsInstrumented(supabaseClientInstance.auth);\n}\n\nfunction instrumentSupabaseClientConstructor(SupabaseClient: unknown): void {\n if (isInstrumented((SupabaseClient as SupabaseClientConstructor).prototype.from)) {\n return;\n }\n\n (SupabaseClient as SupabaseClientConstructor).prototype.from = new Proxy(\n (SupabaseClient as SupabaseClientConstructor).prototype.from,\n {\n apply(target, thisArg, argumentsList) {\n const rv = Reflect.apply(target, thisArg, argumentsList);\n const PostgRESTQueryBuilder = (rv as PostgRESTQueryBuilder).constructor;\n\n instrumentPostgRESTQueryBuilder(PostgRESTQueryBuilder as unknown as new () => PostgRESTQueryBuilder);\n\n return rv;\n },\n },\n );\n\n markAsInstrumented((SupabaseClient as SupabaseClientConstructor).prototype.from);\n}\n\nfunction instrumentPostgRESTFilterBuilder(PostgRESTFilterBuilder: PostgRESTFilterBuilder['constructor']): void {\n if (isInstrumented((PostgRESTFilterBuilder.prototype as unknown as PostgRESTProtoThenable).then)) {\n return;\n }\n\n (PostgRESTFilterBuilder.prototype as unknown as PostgRESTProtoThenable).then = new Proxy(\n (PostgRESTFilterBuilder.prototype as unknown as PostgRESTProtoThenable).then,\n {\n apply(target, thisArg, argumentsList) {\n const operations = DB_OPERATIONS_TO_INSTRUMENT;\n const typedThis = thisArg as PostgRESTFilterBuilder;\n const operation = extractOperation(typedThis.method, typedThis.headers);\n\n if (!operations.includes(operation)) {\n return Reflect.apply(target, thisArg, argumentsList);\n }\n\n if (!typedThis?.url?.pathname || typeof typedThis.url.pathname !== 'string') {\n return Reflect.apply(target, thisArg, argumentsList);\n }\n\n const pathParts = typedThis.url.pathname.split('/');\n const table = pathParts.length > 0 ? pathParts[pathParts.length - 1] : '';\n\n const queryItems: string[] = [];\n for (const [key, value] of typedThis.url.searchParams.entries()) {\n // It's possible to have multiple entries for the same key, eg. `id=eq.7&id=eq.3`,\n // so we need to use array instead of object to collect them.\n queryItems.push(translateFiltersIntoMethods(key, value));\n }\n const body: Record<string, unknown> = Object.create(null);\n if (isPlainObject(typedThis.body)) {\n for (const [key, value] of Object.entries(typedThis.body)) {\n body[key] = value;\n }\n }\n\n // Adding operation to the beginning of the description if it's not a `select` operation\n // For example, it can be an `insert` or `update` operation but the query can be `select(...)`\n // For `select` operations, we don't need repeat it in the description\n const description = `${operation === 'select' ? '' : `${operation}${body ? '(...) ' : ''}`}${queryItems.join(\n ' ',\n )} from(${table})`;\n\n const attributes: Record<string, any> = {\n 'db.table': table,\n 'db.schema': typedThis.schema,\n 'db.url': typedThis.url.origin,\n 'db.sdk': typedThis.headers['X-Client-Info'],\n 'db.system': 'postgresql',\n 'db.operation': operation,\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.db.supabase',\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'db',\n };\n\n if (queryItems.length) {\n attributes['db.query'] = queryItems;\n }\n\n if (Object.keys(body).length) {\n attributes['db.body'] = body;\n }\n\n return startSpan(\n {\n name: description,\n attributes,\n },\n span => {\n return (Reflect.apply(target, thisArg, []) as Promise<SupabaseResponse>)\n .then(\n (res: SupabaseResponse) => {\n if (span) {\n if (res && typeof res === 'object' && 'status' in res) {\n setHttpStatus(span, res.status || 500);\n }\n span.end();\n }\n\n if (res?.error) {\n const err = new Error(res.error.message) as SupabaseError;\n if (res.error.code) {\n err.code = res.error.code;\n }\n if (res.error.details) {\n err.details = res.error.details;\n }\n\n const supabaseContext: Record<string, any> = {};\n if (queryItems.length) {\n supabaseContext.query = queryItems;\n }\n if (Object.keys(body).length) {\n supabaseContext.body = body;\n }\n\n captureException(err, scope => {\n scope.addEventProcessor(e => {\n addExceptionMechanism(e, {\n handled: false,\n type: 'auto.db.supabase.postgres',\n });\n\n return e;\n });\n\n scope.setContext('supabase', supabaseContext);\n\n return scope;\n });\n }\n\n const breadcrumb: SupabaseBreadcrumb = {\n type: 'supabase',\n category: `db.${operation}`,\n message: description,\n };\n\n const data: Record<string, unknown> = {};\n\n if (queryItems.length) {\n data.query = queryItems;\n }\n\n if (Object.keys(body).length) {\n data.body = body;\n }\n\n if (Object.keys(data).length) {\n breadcrumb.data = data;\n }\n\n addBreadcrumb(breadcrumb);\n\n return res;\n },\n (err: Error) => {\n // TODO: shouldn't we capture this error?\n if (span) {\n setHttpStatus(span, 500);\n span.end();\n }\n throw err;\n },\n )\n .then(...argumentsList);\n },\n );\n },\n },\n );\n\n markAsInstrumented((PostgRESTFilterBuilder.prototype as unknown as PostgRESTProtoThenable).then);\n}\n\nfunction instrumentPostgRESTQueryBuilder(PostgRESTQueryBuilder: new () => PostgRESTQueryBuilder): void {\n // We need to wrap _all_ operations despite them sharing the same `PostgRESTFilterBuilder`\n // constructor, as we don't know which method will be called first, and we don't want to miss any calls.\n for (const operation of DB_OPERATIONS_TO_INSTRUMENT) {\n if (isInstrumented((PostgRESTQueryBuilder.prototype as Record<string, any>)[operation])) {\n continue;\n }\n\n type PostgRESTOperation = keyof Pick<PostgRESTQueryBuilder, 'select' | 'insert' | 'upsert' | 'update' | 'delete'>;\n (PostgRESTQueryBuilder.prototype as Record<string, any>)[operation as PostgRESTOperation] = new Proxy(\n (PostgRESTQueryBuilder.prototype as Record<string, any>)[operation as PostgRESTOperation],\n {\n apply(target, thisArg, argumentsList) {\n const rv = Reflect.apply(target, thisArg, argumentsList);\n const PostgRESTFilterBuilder = (rv as PostgRESTFilterBuilder).constructor;\n\n DEBUG_BUILD && debug.log(`Instrumenting ${operation} operation's PostgRESTFilterBuilder`);\n\n instrumentPostgRESTFilterBuilder(PostgRESTFilterBuilder);\n\n return rv;\n },\n },\n );\n\n markAsInstrumented((PostgRESTQueryBuilder.prototype as Record<string, any>)[operation]);\n }\n}\n\nexport const instrumentSupabaseClient = (supabaseClient: unknown): void => {\n if (!supabaseClient) {\n DEBUG_BUILD && debug.warn('Supabase integration was not installed because no Supabase client was provided.');\n return;\n }\n const SupabaseClientConstructor =\n supabaseClient.constructor === Function ? supabaseClient : supabaseClient.constructor;\n\n instrumentSupabaseClientConstructor(SupabaseClientConstructor);\n instrumentSupabaseAuthClient(supabaseClient as SupabaseClientInstance);\n};\n\nconst INTEGRATION_NAME = 'Supabase';\n\nconst _supabaseIntegration = ((supabaseClient: unknown) => {\n return {\n setupOnce() {\n instrumentSupabaseClient(supabaseClient);\n },\n name: INTEGRATION_NAME,\n };\n}) satisfies IntegrationFn;\n\nexport const supabaseIntegration = defineIntegration((options: { supabaseClient: any }) => {\n return _supabaseIntegration(options.supabaseClient);\n}) satisfies IntegrationFn;\n"],"names":[],"mappings":"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"}
|
package/build/esm/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"type":"module","version":"10.
|
|
1
|
+
{"type":"module","version":"10.47.0","sideEffects":false}
|
|
@@ -307,19 +307,6 @@ const OPENAI_USAGE_COMPLETION_TOKENS_ATTRIBUTE = 'openai.usage.completion_tokens
|
|
|
307
307
|
*/
|
|
308
308
|
const OPENAI_USAGE_PROMPT_TOKENS_ATTRIBUTE = 'openai.usage.prompt_tokens';
|
|
309
309
|
|
|
310
|
-
// =============================================================================
|
|
311
|
-
// OPENAI OPERATIONS
|
|
312
|
-
// =============================================================================
|
|
313
|
-
|
|
314
|
-
/**
|
|
315
|
-
* OpenAI API operations following OpenTelemetry semantic conventions
|
|
316
|
-
* @see https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-spans/#llm-request-spans
|
|
317
|
-
*/
|
|
318
|
-
const OPENAI_OPERATIONS = {
|
|
319
|
-
CHAT: 'chat',
|
|
320
|
-
EMBEDDINGS: 'embeddings',
|
|
321
|
-
} ;
|
|
322
|
-
|
|
323
310
|
// =============================================================================
|
|
324
311
|
// ANTHROPIC AI OPERATIONS
|
|
325
312
|
// =============================================================================
|
|
@@ -329,5 +316,5 @@ const OPENAI_OPERATIONS = {
|
|
|
329
316
|
*/
|
|
330
317
|
const ANTHROPIC_AI_RESPONSE_TIMESTAMP_ATTRIBUTE = 'anthropic.response.timestamp';
|
|
331
318
|
|
|
332
|
-
export { ANTHROPIC_AI_RESPONSE_TIMESTAMP_ATTRIBUTE, GEN_AI_AGENT_NAME_ATTRIBUTE, GEN_AI_CONVERSATION_ID_ATTRIBUTE, GEN_AI_EMBEDDINGS_INPUT_ATTRIBUTE, GEN_AI_EMBED_DO_EMBED_OPERATION_ATTRIBUTE, GEN_AI_EMBED_MANY_DO_EMBED_OPERATION_ATTRIBUTE, GEN_AI_EXECUTE_TOOL_OPERATION_ATTRIBUTE, GEN_AI_GENERATE_OBJECT_DO_GENERATE_OPERATION_ATTRIBUTE, GEN_AI_GENERATE_TEXT_DO_GENERATE_OPERATION_ATTRIBUTE, GEN_AI_INPUT_MESSAGES_ATTRIBUTE, GEN_AI_INPUT_MESSAGES_ORIGINAL_LENGTH_ATTRIBUTE, GEN_AI_INVOKE_AGENT_OPERATION_ATTRIBUTE, GEN_AI_OPERATION_NAME_ATTRIBUTE, GEN_AI_OUTPUT_MESSAGES_ATTRIBUTE, GEN_AI_PIPELINE_NAME_ATTRIBUTE, GEN_AI_PROMPT_ATTRIBUTE, GEN_AI_REQUEST_AVAILABLE_TOOLS_ATTRIBUTE, GEN_AI_REQUEST_DIMENSIONS_ATTRIBUTE, GEN_AI_REQUEST_ENCODING_FORMAT_ATTRIBUTE, GEN_AI_REQUEST_FREQUENCY_PENALTY_ATTRIBUTE, GEN_AI_REQUEST_MAX_TOKENS_ATTRIBUTE, GEN_AI_REQUEST_MODEL_ATTRIBUTE, GEN_AI_REQUEST_PRESENCE_PENALTY_ATTRIBUTE, GEN_AI_REQUEST_STREAM_ATTRIBUTE, GEN_AI_REQUEST_TEMPERATURE_ATTRIBUTE, GEN_AI_REQUEST_TOP_K_ATTRIBUTE, GEN_AI_REQUEST_TOP_P_ATTRIBUTE, GEN_AI_RERANK_DO_RERANK_OPERATION_ATTRIBUTE, GEN_AI_RESPONSE_FINISH_REASONS_ATTRIBUTE, GEN_AI_RESPONSE_ID_ATTRIBUTE, GEN_AI_RESPONSE_MODEL_ATTRIBUTE, GEN_AI_RESPONSE_STOP_REASON_ATTRIBUTE, GEN_AI_RESPONSE_STREAMING_ATTRIBUTE, GEN_AI_RESPONSE_TEXT_ATTRIBUTE, GEN_AI_RESPONSE_TOOL_CALLS_ATTRIBUTE, GEN_AI_STREAM_OBJECT_DO_STREAM_OPERATION_ATTRIBUTE, GEN_AI_STREAM_TEXT_DO_STREAM_OPERATION_ATTRIBUTE, GEN_AI_SYSTEM_ATTRIBUTE, GEN_AI_SYSTEM_INSTRUCTIONS_ATTRIBUTE, GEN_AI_TOOL_CALL_ID_ATTRIBUTE, GEN_AI_TOOL_DESCRIPTION_ATTRIBUTE, GEN_AI_TOOL_INPUT_ATTRIBUTE, GEN_AI_TOOL_NAME_ATTRIBUTE, GEN_AI_TOOL_OUTPUT_ATTRIBUTE, GEN_AI_TOOL_TYPE_ATTRIBUTE, GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS_ATTRIBUTE, GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS_ATTRIBUTE, GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE, GEN_AI_USAGE_INPUT_TOKENS_CACHED_ATTRIBUTE, GEN_AI_USAGE_INPUT_TOKENS_CACHE_WRITE_ATTRIBUTE, GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE, GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE,
|
|
319
|
+
export { ANTHROPIC_AI_RESPONSE_TIMESTAMP_ATTRIBUTE, GEN_AI_AGENT_NAME_ATTRIBUTE, GEN_AI_CONVERSATION_ID_ATTRIBUTE, GEN_AI_EMBEDDINGS_INPUT_ATTRIBUTE, GEN_AI_EMBED_DO_EMBED_OPERATION_ATTRIBUTE, GEN_AI_EMBED_MANY_DO_EMBED_OPERATION_ATTRIBUTE, GEN_AI_EXECUTE_TOOL_OPERATION_ATTRIBUTE, GEN_AI_GENERATE_OBJECT_DO_GENERATE_OPERATION_ATTRIBUTE, GEN_AI_GENERATE_TEXT_DO_GENERATE_OPERATION_ATTRIBUTE, GEN_AI_INPUT_MESSAGES_ATTRIBUTE, GEN_AI_INPUT_MESSAGES_ORIGINAL_LENGTH_ATTRIBUTE, GEN_AI_INVOKE_AGENT_OPERATION_ATTRIBUTE, GEN_AI_OPERATION_NAME_ATTRIBUTE, GEN_AI_OUTPUT_MESSAGES_ATTRIBUTE, GEN_AI_PIPELINE_NAME_ATTRIBUTE, GEN_AI_PROMPT_ATTRIBUTE, GEN_AI_REQUEST_AVAILABLE_TOOLS_ATTRIBUTE, GEN_AI_REQUEST_DIMENSIONS_ATTRIBUTE, GEN_AI_REQUEST_ENCODING_FORMAT_ATTRIBUTE, GEN_AI_REQUEST_FREQUENCY_PENALTY_ATTRIBUTE, GEN_AI_REQUEST_MAX_TOKENS_ATTRIBUTE, GEN_AI_REQUEST_MODEL_ATTRIBUTE, GEN_AI_REQUEST_PRESENCE_PENALTY_ATTRIBUTE, GEN_AI_REQUEST_STREAM_ATTRIBUTE, GEN_AI_REQUEST_TEMPERATURE_ATTRIBUTE, GEN_AI_REQUEST_TOP_K_ATTRIBUTE, GEN_AI_REQUEST_TOP_P_ATTRIBUTE, GEN_AI_RERANK_DO_RERANK_OPERATION_ATTRIBUTE, GEN_AI_RESPONSE_FINISH_REASONS_ATTRIBUTE, GEN_AI_RESPONSE_ID_ATTRIBUTE, GEN_AI_RESPONSE_MODEL_ATTRIBUTE, GEN_AI_RESPONSE_STOP_REASON_ATTRIBUTE, GEN_AI_RESPONSE_STREAMING_ATTRIBUTE, GEN_AI_RESPONSE_TEXT_ATTRIBUTE, GEN_AI_RESPONSE_TOOL_CALLS_ATTRIBUTE, GEN_AI_STREAM_OBJECT_DO_STREAM_OPERATION_ATTRIBUTE, GEN_AI_STREAM_TEXT_DO_STREAM_OPERATION_ATTRIBUTE, GEN_AI_SYSTEM_ATTRIBUTE, GEN_AI_SYSTEM_INSTRUCTIONS_ATTRIBUTE, GEN_AI_TOOL_CALL_ID_ATTRIBUTE, GEN_AI_TOOL_DESCRIPTION_ATTRIBUTE, GEN_AI_TOOL_INPUT_ATTRIBUTE, GEN_AI_TOOL_NAME_ATTRIBUTE, GEN_AI_TOOL_OUTPUT_ATTRIBUTE, GEN_AI_TOOL_TYPE_ATTRIBUTE, GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS_ATTRIBUTE, GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS_ATTRIBUTE, GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE, GEN_AI_USAGE_INPUT_TOKENS_CACHED_ATTRIBUTE, GEN_AI_USAGE_INPUT_TOKENS_CACHE_WRITE_ATTRIBUTE, GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE, GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE, OPENAI_RESPONSE_ID_ATTRIBUTE, OPENAI_RESPONSE_MODEL_ATTRIBUTE, OPENAI_RESPONSE_TIMESTAMP_ATTRIBUTE, OPENAI_USAGE_COMPLETION_TOKENS_ATTRIBUTE, OPENAI_USAGE_PROMPT_TOKENS_ATTRIBUTE };
|
|
333
320
|
//# sourceMappingURL=gen-ai-attributes.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gen-ai-attributes.js","sources":["../../../../src/tracing/ai/gen-ai-attributes.ts"],"sourcesContent":["/**\n * OpenAI Integration Telemetry Attributes\n * Based on OpenTelemetry Semantic Conventions for Generative AI\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/\n */\n\n// =============================================================================\n// OPENTELEMETRY SEMANTIC CONVENTIONS FOR GENAI\n// =============================================================================\n\n/**\n * The input messages sent to the model\n */\nexport const GEN_AI_PROMPT_ATTRIBUTE = 'gen_ai.prompt';\n\n/**\n * The Generative AI system being used\n * For OpenAI, this should always be \"openai\"\n */\nexport const GEN_AI_SYSTEM_ATTRIBUTE = 'gen_ai.system';\n\n/**\n * The name of the model as requested\n * Examples: \"gpt-4\", \"gpt-3.5-turbo\"\n */\nexport const GEN_AI_REQUEST_MODEL_ATTRIBUTE = 'gen_ai.request.model';\n\n/**\n * Whether streaming was enabled for the request\n */\nexport const GEN_AI_REQUEST_STREAM_ATTRIBUTE = 'gen_ai.request.stream';\n\n/**\n * The temperature setting for the model request\n */\nexport const GEN_AI_REQUEST_TEMPERATURE_ATTRIBUTE = 'gen_ai.request.temperature';\n\n/**\n * The maximum number of tokens requested\n */\nexport const GEN_AI_REQUEST_MAX_TOKENS_ATTRIBUTE = 'gen_ai.request.max_tokens';\n\n/**\n * The frequency penalty setting for the model request\n */\nexport const GEN_AI_REQUEST_FREQUENCY_PENALTY_ATTRIBUTE = 'gen_ai.request.frequency_penalty';\n\n/**\n * The presence penalty setting for the model request\n */\nexport const GEN_AI_REQUEST_PRESENCE_PENALTY_ATTRIBUTE = 'gen_ai.request.presence_penalty';\n\n/**\n * The top_p (nucleus sampling) setting for the model request\n */\nexport const GEN_AI_REQUEST_TOP_P_ATTRIBUTE = 'gen_ai.request.top_p';\n\n/**\n * The top_k setting for the model request\n */\nexport const GEN_AI_REQUEST_TOP_K_ATTRIBUTE = 'gen_ai.request.top_k';\n\n/**\n * Stop sequences for the model request\n */\nexport const GEN_AI_REQUEST_STOP_SEQUENCES_ATTRIBUTE = 'gen_ai.request.stop_sequences';\n\n/**\n * The encoding format for the model request\n */\nexport const GEN_AI_REQUEST_ENCODING_FORMAT_ATTRIBUTE = 'gen_ai.request.encoding_format';\n\n/**\n * The dimensions for the model request\n */\nexport const GEN_AI_REQUEST_DIMENSIONS_ATTRIBUTE = 'gen_ai.request.dimensions';\n\n/**\n * Array of reasons why the model stopped generating tokens\n */\nexport const GEN_AI_RESPONSE_FINISH_REASONS_ATTRIBUTE = 'gen_ai.response.finish_reasons';\n\n/**\n * The name of the model that generated the response\n */\nexport const GEN_AI_RESPONSE_MODEL_ATTRIBUTE = 'gen_ai.response.model';\n\n/**\n * The unique identifier for the response\n */\nexport const GEN_AI_RESPONSE_ID_ATTRIBUTE = 'gen_ai.response.id';\n\n/**\n * The reason why the model stopped generating tokens\n */\nexport const GEN_AI_RESPONSE_STOP_REASON_ATTRIBUTE = 'gen_ai.response.stop_reason';\n\n/**\n * The number of tokens used in the prompt\n */\nexport const GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE = 'gen_ai.usage.input_tokens';\n\n/**\n * The number of tokens used in the response\n */\nexport const GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE = 'gen_ai.usage.output_tokens';\n\n/**\n * The total number of tokens used (input + output)\n */\nexport const GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE = 'gen_ai.usage.total_tokens';\n\n/**\n * The operation name\n */\nexport const GEN_AI_OPERATION_NAME_ATTRIBUTE = 'gen_ai.operation.name';\n\n/**\n * Original length of messages array, used to indicate truncations had occured\n */\nexport const GEN_AI_INPUT_MESSAGES_ORIGINAL_LENGTH_ATTRIBUTE = 'sentry.sdk_meta.gen_ai.input.messages.original_length';\n\n/**\n * The prompt messages\n * Only recorded when recordInputs is enabled\n */\nexport const GEN_AI_INPUT_MESSAGES_ATTRIBUTE = 'gen_ai.input.messages';\n\n/**\n * The model's response messages including text and tool calls\n * Only recorded when recordOutputs is enabled\n * Format: stringified array of message objects with role, parts, and finish_reason\n * @see https://opentelemetry.io/docs/specs/semconv/registry/attributes/gen-ai/#gen-ai-output-messages\n */\nexport const GEN_AI_OUTPUT_MESSAGES_ATTRIBUTE = 'gen_ai.output.messages';\n\n/**\n * The system instructions extracted from system messages\n * Only recorded when recordInputs is enabled\n * According to OpenTelemetry spec: https://opentelemetry.io/docs/specs/semconv/registry/attributes/gen-ai/#gen-ai-system-instructions\n */\nexport const GEN_AI_SYSTEM_INSTRUCTIONS_ATTRIBUTE = 'gen_ai.system_instructions';\n\n/**\n * The response text\n * Only recorded when recordOutputs is enabled\n */\nexport const GEN_AI_RESPONSE_TEXT_ATTRIBUTE = 'gen_ai.response.text';\n\n/**\n * The available tools from incoming request\n * Only recorded when recordInputs is enabled\n */\nexport const GEN_AI_REQUEST_AVAILABLE_TOOLS_ATTRIBUTE = 'gen_ai.request.available_tools';\n\n/**\n * Whether the response is a streaming response\n */\nexport const GEN_AI_RESPONSE_STREAMING_ATTRIBUTE = 'gen_ai.response.streaming';\n\n/**\n * The tool calls from the response\n * Only recorded when recordOutputs is enabled\n */\nexport const GEN_AI_RESPONSE_TOOL_CALLS_ATTRIBUTE = 'gen_ai.response.tool_calls';\n\n/**\n * The agent name\n */\nexport const GEN_AI_AGENT_NAME_ATTRIBUTE = 'gen_ai.agent.name';\n\n/**\n * The pipeline name\n */\nexport const GEN_AI_PIPELINE_NAME_ATTRIBUTE = 'gen_ai.pipeline.name';\n\n/**\n * The conversation ID for linking messages across API calls\n * For OpenAI Assistants API: thread_id\n * For LangGraph: configurable.thread_id\n */\nexport const GEN_AI_CONVERSATION_ID_ATTRIBUTE = 'gen_ai.conversation.id';\n\n/**\n * The number of cache creation input tokens used\n */\nexport const GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS_ATTRIBUTE = 'gen_ai.usage.cache_creation_input_tokens';\n\n/**\n * The number of cache read input tokens used\n */\nexport const GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS_ATTRIBUTE = 'gen_ai.usage.cache_read_input_tokens';\n\n/**\n * The number of cache write input tokens used\n */\nexport const GEN_AI_USAGE_INPUT_TOKENS_CACHE_WRITE_ATTRIBUTE = 'gen_ai.usage.input_tokens.cache_write';\n\n/**\n * The number of cached input tokens that were used\n */\nexport const GEN_AI_USAGE_INPUT_TOKENS_CACHED_ATTRIBUTE = 'gen_ai.usage.input_tokens.cached';\n\n/**\n * The span operation name for invoking an agent\n */\nexport const GEN_AI_INVOKE_AGENT_OPERATION_ATTRIBUTE = 'gen_ai.invoke_agent';\n\n/**\n * The span operation name for generating text\n */\nexport const GEN_AI_GENERATE_TEXT_DO_GENERATE_OPERATION_ATTRIBUTE = 'gen_ai.generate_text';\n\n/**\n * The span operation name for streaming text\n */\nexport const GEN_AI_STREAM_TEXT_DO_STREAM_OPERATION_ATTRIBUTE = 'gen_ai.stream_text';\n\n/**\n * The span operation name for generating object\n */\nexport const GEN_AI_GENERATE_OBJECT_DO_GENERATE_OPERATION_ATTRIBUTE = 'gen_ai.generate_object';\n\n/**\n * The span operation name for streaming object\n */\nexport const GEN_AI_STREAM_OBJECT_DO_STREAM_OPERATION_ATTRIBUTE = 'gen_ai.stream_object';\n\n/**\n * The embeddings input\n * Only recorded when recordInputs is enabled\n */\nexport const GEN_AI_EMBEDDINGS_INPUT_ATTRIBUTE = 'gen_ai.embeddings.input';\n\n/**\n * The span operation name for embedding\n */\nexport const GEN_AI_EMBED_DO_EMBED_OPERATION_ATTRIBUTE = 'gen_ai.embeddings';\n\n/**\n * The span operation name for embedding many\n */\nexport const GEN_AI_EMBED_MANY_DO_EMBED_OPERATION_ATTRIBUTE = 'gen_ai.embeddings';\n\n/**\n * The span operation name for reranking\n */\nexport const GEN_AI_RERANK_DO_RERANK_OPERATION_ATTRIBUTE = 'gen_ai.rerank';\n\n/**\n * The span operation name for executing a tool\n */\nexport const GEN_AI_EXECUTE_TOOL_OPERATION_ATTRIBUTE = 'gen_ai.execute_tool';\n\n/**\n * The tool name for tool call spans\n */\nexport const GEN_AI_TOOL_NAME_ATTRIBUTE = 'gen_ai.tool.name';\n\n/**\n * The tool call ID\n */\nexport const GEN_AI_TOOL_CALL_ID_ATTRIBUTE = 'gen_ai.tool.call.id';\n\n/**\n * The tool type (e.g., 'function')\n */\nexport const GEN_AI_TOOL_TYPE_ATTRIBUTE = 'gen_ai.tool.type';\n\n/**\n * The tool input/arguments\n */\nexport const GEN_AI_TOOL_INPUT_ATTRIBUTE = 'gen_ai.tool.input';\n\n/**\n * The tool output/result\n */\nexport const GEN_AI_TOOL_OUTPUT_ATTRIBUTE = 'gen_ai.tool.output';\n\n/**\n * The description of the tool being used\n * @see https://opentelemetry.io/docs/specs/semconv/registry/attributes/gen-ai/#gen-ai-tool-description\n */\nexport const GEN_AI_TOOL_DESCRIPTION_ATTRIBUTE = 'gen_ai.tool.description';\n\n// =============================================================================\n// OPENAI-SPECIFIC ATTRIBUTES\n// =============================================================================\n\n/**\n * The response ID from OpenAI\n */\nexport const OPENAI_RESPONSE_ID_ATTRIBUTE = 'openai.response.id';\n\n/**\n * The response model from OpenAI\n */\nexport const OPENAI_RESPONSE_MODEL_ATTRIBUTE = 'openai.response.model';\n\n/**\n * The response timestamp from OpenAI (ISO string)\n */\nexport const OPENAI_RESPONSE_TIMESTAMP_ATTRIBUTE = 'openai.response.timestamp';\n\n/**\n * The number of completion tokens used\n */\nexport const OPENAI_USAGE_COMPLETION_TOKENS_ATTRIBUTE = 'openai.usage.completion_tokens';\n\n/**\n * The number of prompt tokens used\n */\nexport const OPENAI_USAGE_PROMPT_TOKENS_ATTRIBUTE = 'openai.usage.prompt_tokens';\n\n// =============================================================================\n// OPENAI OPERATIONS\n// =============================================================================\n\n/**\n * OpenAI API operations following OpenTelemetry semantic conventions\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-spans/#llm-request-spans\n */\nexport const OPENAI_OPERATIONS = {\n CHAT: 'chat',\n EMBEDDINGS: 'embeddings',\n} as const;\n\n// =============================================================================\n// ANTHROPIC AI OPERATIONS\n// =============================================================================\n\n/**\n * The response timestamp from Anthropic AI (ISO string)\n */\nexport const ANTHROPIC_AI_RESPONSE_TIMESTAMP_ATTRIBUTE = 'anthropic.response.timestamp';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"gen-ai-attributes.js","sources":["../../../../src/tracing/ai/gen-ai-attributes.ts"],"sourcesContent":["/**\n * OpenAI Integration Telemetry Attributes\n * Based on OpenTelemetry Semantic Conventions for Generative AI\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/\n */\n\n// =============================================================================\n// OPENTELEMETRY SEMANTIC CONVENTIONS FOR GENAI\n// =============================================================================\n\n/**\n * The input messages sent to the model\n */\nexport const GEN_AI_PROMPT_ATTRIBUTE = 'gen_ai.prompt';\n\n/**\n * The Generative AI system being used\n * For OpenAI, this should always be \"openai\"\n */\nexport const GEN_AI_SYSTEM_ATTRIBUTE = 'gen_ai.system';\n\n/**\n * The name of the model as requested\n * Examples: \"gpt-4\", \"gpt-3.5-turbo\"\n */\nexport const GEN_AI_REQUEST_MODEL_ATTRIBUTE = 'gen_ai.request.model';\n\n/**\n * Whether streaming was enabled for the request\n */\nexport const GEN_AI_REQUEST_STREAM_ATTRIBUTE = 'gen_ai.request.stream';\n\n/**\n * The temperature setting for the model request\n */\nexport const GEN_AI_REQUEST_TEMPERATURE_ATTRIBUTE = 'gen_ai.request.temperature';\n\n/**\n * The maximum number of tokens requested\n */\nexport const GEN_AI_REQUEST_MAX_TOKENS_ATTRIBUTE = 'gen_ai.request.max_tokens';\n\n/**\n * The frequency penalty setting for the model request\n */\nexport const GEN_AI_REQUEST_FREQUENCY_PENALTY_ATTRIBUTE = 'gen_ai.request.frequency_penalty';\n\n/**\n * The presence penalty setting for the model request\n */\nexport const GEN_AI_REQUEST_PRESENCE_PENALTY_ATTRIBUTE = 'gen_ai.request.presence_penalty';\n\n/**\n * The top_p (nucleus sampling) setting for the model request\n */\nexport const GEN_AI_REQUEST_TOP_P_ATTRIBUTE = 'gen_ai.request.top_p';\n\n/**\n * The top_k setting for the model request\n */\nexport const GEN_AI_REQUEST_TOP_K_ATTRIBUTE = 'gen_ai.request.top_k';\n\n/**\n * Stop sequences for the model request\n */\nexport const GEN_AI_REQUEST_STOP_SEQUENCES_ATTRIBUTE = 'gen_ai.request.stop_sequences';\n\n/**\n * The encoding format for the model request\n */\nexport const GEN_AI_REQUEST_ENCODING_FORMAT_ATTRIBUTE = 'gen_ai.request.encoding_format';\n\n/**\n * The dimensions for the model request\n */\nexport const GEN_AI_REQUEST_DIMENSIONS_ATTRIBUTE = 'gen_ai.request.dimensions';\n\n/**\n * Array of reasons why the model stopped generating tokens\n */\nexport const GEN_AI_RESPONSE_FINISH_REASONS_ATTRIBUTE = 'gen_ai.response.finish_reasons';\n\n/**\n * The name of the model that generated the response\n */\nexport const GEN_AI_RESPONSE_MODEL_ATTRIBUTE = 'gen_ai.response.model';\n\n/**\n * The unique identifier for the response\n */\nexport const GEN_AI_RESPONSE_ID_ATTRIBUTE = 'gen_ai.response.id';\n\n/**\n * The reason why the model stopped generating tokens\n */\nexport const GEN_AI_RESPONSE_STOP_REASON_ATTRIBUTE = 'gen_ai.response.stop_reason';\n\n/**\n * The number of tokens used in the prompt\n */\nexport const GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE = 'gen_ai.usage.input_tokens';\n\n/**\n * The number of tokens used in the response\n */\nexport const GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE = 'gen_ai.usage.output_tokens';\n\n/**\n * The total number of tokens used (input + output)\n */\nexport const GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE = 'gen_ai.usage.total_tokens';\n\n/**\n * The operation name\n */\nexport const GEN_AI_OPERATION_NAME_ATTRIBUTE = 'gen_ai.operation.name';\n\n/**\n * Original length of messages array, used to indicate truncations had occured\n */\nexport const GEN_AI_INPUT_MESSAGES_ORIGINAL_LENGTH_ATTRIBUTE = 'sentry.sdk_meta.gen_ai.input.messages.original_length';\n\n/**\n * The prompt messages\n * Only recorded when recordInputs is enabled\n */\nexport const GEN_AI_INPUT_MESSAGES_ATTRIBUTE = 'gen_ai.input.messages';\n\n/**\n * The model's response messages including text and tool calls\n * Only recorded when recordOutputs is enabled\n * Format: stringified array of message objects with role, parts, and finish_reason\n * @see https://opentelemetry.io/docs/specs/semconv/registry/attributes/gen-ai/#gen-ai-output-messages\n */\nexport const GEN_AI_OUTPUT_MESSAGES_ATTRIBUTE = 'gen_ai.output.messages';\n\n/**\n * The system instructions extracted from system messages\n * Only recorded when recordInputs is enabled\n * According to OpenTelemetry spec: https://opentelemetry.io/docs/specs/semconv/registry/attributes/gen-ai/#gen-ai-system-instructions\n */\nexport const GEN_AI_SYSTEM_INSTRUCTIONS_ATTRIBUTE = 'gen_ai.system_instructions';\n\n/**\n * The response text\n * Only recorded when recordOutputs is enabled\n */\nexport const GEN_AI_RESPONSE_TEXT_ATTRIBUTE = 'gen_ai.response.text';\n\n/**\n * The available tools from incoming request\n * Only recorded when recordInputs is enabled\n */\nexport const GEN_AI_REQUEST_AVAILABLE_TOOLS_ATTRIBUTE = 'gen_ai.request.available_tools';\n\n/**\n * Whether the response is a streaming response\n */\nexport const GEN_AI_RESPONSE_STREAMING_ATTRIBUTE = 'gen_ai.response.streaming';\n\n/**\n * The tool calls from the response\n * Only recorded when recordOutputs is enabled\n */\nexport const GEN_AI_RESPONSE_TOOL_CALLS_ATTRIBUTE = 'gen_ai.response.tool_calls';\n\n/**\n * The agent name\n */\nexport const GEN_AI_AGENT_NAME_ATTRIBUTE = 'gen_ai.agent.name';\n\n/**\n * The pipeline name\n */\nexport const GEN_AI_PIPELINE_NAME_ATTRIBUTE = 'gen_ai.pipeline.name';\n\n/**\n * The conversation ID for linking messages across API calls\n * For OpenAI Assistants API: thread_id\n * For LangGraph: configurable.thread_id\n */\nexport const GEN_AI_CONVERSATION_ID_ATTRIBUTE = 'gen_ai.conversation.id';\n\n/**\n * The number of cache creation input tokens used\n */\nexport const GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS_ATTRIBUTE = 'gen_ai.usage.cache_creation_input_tokens';\n\n/**\n * The number of cache read input tokens used\n */\nexport const GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS_ATTRIBUTE = 'gen_ai.usage.cache_read_input_tokens';\n\n/**\n * The number of cache write input tokens used\n */\nexport const GEN_AI_USAGE_INPUT_TOKENS_CACHE_WRITE_ATTRIBUTE = 'gen_ai.usage.input_tokens.cache_write';\n\n/**\n * The number of cached input tokens that were used\n */\nexport const GEN_AI_USAGE_INPUT_TOKENS_CACHED_ATTRIBUTE = 'gen_ai.usage.input_tokens.cached';\n\n/**\n * The span operation name for invoking an agent\n */\nexport const GEN_AI_INVOKE_AGENT_OPERATION_ATTRIBUTE = 'gen_ai.invoke_agent';\n\n/**\n * The span operation name for generating text\n */\nexport const GEN_AI_GENERATE_TEXT_DO_GENERATE_OPERATION_ATTRIBUTE = 'gen_ai.generate_text';\n\n/**\n * The span operation name for streaming text\n */\nexport const GEN_AI_STREAM_TEXT_DO_STREAM_OPERATION_ATTRIBUTE = 'gen_ai.stream_text';\n\n/**\n * The span operation name for generating object\n */\nexport const GEN_AI_GENERATE_OBJECT_DO_GENERATE_OPERATION_ATTRIBUTE = 'gen_ai.generate_object';\n\n/**\n * The span operation name for streaming object\n */\nexport const GEN_AI_STREAM_OBJECT_DO_STREAM_OPERATION_ATTRIBUTE = 'gen_ai.stream_object';\n\n/**\n * The embeddings input\n * Only recorded when recordInputs is enabled\n */\nexport const GEN_AI_EMBEDDINGS_INPUT_ATTRIBUTE = 'gen_ai.embeddings.input';\n\n/**\n * The span operation name for embedding\n */\nexport const GEN_AI_EMBED_DO_EMBED_OPERATION_ATTRIBUTE = 'gen_ai.embeddings';\n\n/**\n * The span operation name for embedding many\n */\nexport const GEN_AI_EMBED_MANY_DO_EMBED_OPERATION_ATTRIBUTE = 'gen_ai.embeddings';\n\n/**\n * The span operation name for reranking\n */\nexport const GEN_AI_RERANK_DO_RERANK_OPERATION_ATTRIBUTE = 'gen_ai.rerank';\n\n/**\n * The span operation name for executing a tool\n */\nexport const GEN_AI_EXECUTE_TOOL_OPERATION_ATTRIBUTE = 'gen_ai.execute_tool';\n\n/**\n * The tool name for tool call spans\n */\nexport const GEN_AI_TOOL_NAME_ATTRIBUTE = 'gen_ai.tool.name';\n\n/**\n * The tool call ID\n */\nexport const GEN_AI_TOOL_CALL_ID_ATTRIBUTE = 'gen_ai.tool.call.id';\n\n/**\n * The tool type (e.g., 'function')\n */\nexport const GEN_AI_TOOL_TYPE_ATTRIBUTE = 'gen_ai.tool.type';\n\n/**\n * The tool input/arguments\n */\nexport const GEN_AI_TOOL_INPUT_ATTRIBUTE = 'gen_ai.tool.input';\n\n/**\n * The tool output/result\n */\nexport const GEN_AI_TOOL_OUTPUT_ATTRIBUTE = 'gen_ai.tool.output';\n\n/**\n * The description of the tool being used\n * @see https://opentelemetry.io/docs/specs/semconv/registry/attributes/gen-ai/#gen-ai-tool-description\n */\nexport const GEN_AI_TOOL_DESCRIPTION_ATTRIBUTE = 'gen_ai.tool.description';\n\n// =============================================================================\n// OPENAI-SPECIFIC ATTRIBUTES\n// =============================================================================\n\n/**\n * The response ID from OpenAI\n */\nexport const OPENAI_RESPONSE_ID_ATTRIBUTE = 'openai.response.id';\n\n/**\n * The response model from OpenAI\n */\nexport const OPENAI_RESPONSE_MODEL_ATTRIBUTE = 'openai.response.model';\n\n/**\n * The response timestamp from OpenAI (ISO string)\n */\nexport const OPENAI_RESPONSE_TIMESTAMP_ATTRIBUTE = 'openai.response.timestamp';\n\n/**\n * The number of completion tokens used\n */\nexport const OPENAI_USAGE_COMPLETION_TOKENS_ATTRIBUTE = 'openai.usage.completion_tokens';\n\n/**\n * The number of prompt tokens used\n */\nexport const OPENAI_USAGE_PROMPT_TOKENS_ATTRIBUTE = 'openai.usage.prompt_tokens';\n\n// =============================================================================\n// ANTHROPIC AI OPERATIONS\n// =============================================================================\n\n/**\n * The response timestamp from Anthropic AI (ISO string)\n */\nexport const ANTHROPIC_AI_RESPONSE_TIMESTAMP_ATTRIBUTE = 'anthropic.response.timestamp';\n"],"names":[],"mappings":"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"}
|
|
@@ -58,31 +58,33 @@ function truncateTextByBytes(text, maxBytes) {
|
|
|
58
58
|
}
|
|
59
59
|
|
|
60
60
|
/**
|
|
61
|
-
* Extract text content from a
|
|
62
|
-
*
|
|
61
|
+
* Extract text content from a message item.
|
|
62
|
+
* Handles plain strings and objects with a text property.
|
|
63
63
|
*
|
|
64
64
|
* @returns The text content
|
|
65
65
|
*/
|
|
66
|
-
function
|
|
67
|
-
if (typeof
|
|
68
|
-
return
|
|
66
|
+
function getItemText(item) {
|
|
67
|
+
if (typeof item === 'string') {
|
|
68
|
+
return item;
|
|
69
|
+
}
|
|
70
|
+
if ('text' in item && typeof item.text === 'string') {
|
|
71
|
+
return item.text;
|
|
69
72
|
}
|
|
70
|
-
if ('text' in part) return part.text;
|
|
71
73
|
return '';
|
|
72
74
|
}
|
|
73
75
|
|
|
74
76
|
/**
|
|
75
|
-
* Create a new
|
|
77
|
+
* Create a new item with updated text content while preserving the original structure.
|
|
76
78
|
*
|
|
77
|
-
* @param
|
|
79
|
+
* @param item - Original item (string or object)
|
|
78
80
|
* @param text - New text content
|
|
79
|
-
* @returns New
|
|
81
|
+
* @returns New item with updated text
|
|
80
82
|
*/
|
|
81
|
-
function
|
|
82
|
-
if (typeof
|
|
83
|
+
function withItemText(item, text) {
|
|
84
|
+
if (typeof item === 'string') {
|
|
83
85
|
return text;
|
|
84
86
|
}
|
|
85
|
-
return { ...
|
|
87
|
+
return { ...item, text };
|
|
86
88
|
}
|
|
87
89
|
|
|
88
90
|
/**
|
|
@@ -139,56 +141,77 @@ function truncateContentMessage(message, maxBytes) {
|
|
|
139
141
|
}
|
|
140
142
|
|
|
141
143
|
/**
|
|
142
|
-
*
|
|
143
|
-
*
|
|
144
|
+
* Extracts the array items and their key from an array-based message.
|
|
145
|
+
* Returns `null` key if neither `parts` nor `content` is a valid array.
|
|
146
|
+
*/
|
|
147
|
+
function getArrayItems(message)
|
|
148
|
+
|
|
149
|
+
{
|
|
150
|
+
if ('parts' in message && Array.isArray(message.parts)) {
|
|
151
|
+
return { key: 'parts', items: message.parts };
|
|
152
|
+
}
|
|
153
|
+
if ('content' in message && Array.isArray(message.content)) {
|
|
154
|
+
return { key: 'content', items: message.content };
|
|
155
|
+
}
|
|
156
|
+
return { key: null, items: [] };
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Truncate a message with an array-based format.
|
|
161
|
+
* Handles both `parts: [...]` (Google GenAI) and `content: [...]` (OpenAI/Anthropic multimodal).
|
|
162
|
+
* Keeps as many complete items as possible, only truncating the first item if needed.
|
|
144
163
|
*
|
|
145
|
-
* @param message - Message with parts array
|
|
164
|
+
* @param message - Message with parts or content array
|
|
146
165
|
* @param maxBytes - Maximum byte limit
|
|
147
166
|
* @returns Array with truncated message, or empty array if it doesn't fit
|
|
148
167
|
*/
|
|
149
|
-
function
|
|
150
|
-
const {
|
|
168
|
+
function truncateArrayMessage(message, maxBytes) {
|
|
169
|
+
const { key, items } = getArrayItems(message);
|
|
170
|
+
|
|
171
|
+
if (key === null || items.length === 0) {
|
|
172
|
+
return [];
|
|
173
|
+
}
|
|
151
174
|
|
|
152
|
-
// Calculate overhead by creating empty text
|
|
153
|
-
const
|
|
154
|
-
const overhead = jsonBytes({ ...message,
|
|
175
|
+
// Calculate overhead by creating empty text items
|
|
176
|
+
const emptyItems = items.map(item => withItemText(item, ''));
|
|
177
|
+
const overhead = jsonBytes({ ...message, [key]: emptyItems });
|
|
155
178
|
let remainingBytes = maxBytes - overhead;
|
|
156
179
|
|
|
157
180
|
if (remainingBytes <= 0) {
|
|
158
181
|
return [];
|
|
159
182
|
}
|
|
160
183
|
|
|
161
|
-
// Include
|
|
162
|
-
const
|
|
184
|
+
// Include items until we run out of space
|
|
185
|
+
const includedItems = [];
|
|
163
186
|
|
|
164
|
-
for (const
|
|
165
|
-
const text =
|
|
187
|
+
for (const item of items) {
|
|
188
|
+
const text = getItemText(item);
|
|
166
189
|
const textSize = utf8Bytes(text);
|
|
167
190
|
|
|
168
191
|
if (textSize <= remainingBytes) {
|
|
169
|
-
//
|
|
170
|
-
|
|
192
|
+
// Item fits: include it as-is
|
|
193
|
+
includedItems.push(item);
|
|
171
194
|
remainingBytes -= textSize;
|
|
172
|
-
} else if (
|
|
173
|
-
// First
|
|
195
|
+
} else if (includedItems.length === 0) {
|
|
196
|
+
// First item doesn't fit: truncate it
|
|
174
197
|
const truncated = truncateTextByBytes(text, remainingBytes);
|
|
175
198
|
if (truncated) {
|
|
176
|
-
|
|
199
|
+
includedItems.push(withItemText(item, truncated));
|
|
177
200
|
}
|
|
178
201
|
break;
|
|
179
202
|
} else {
|
|
180
|
-
// Subsequent
|
|
203
|
+
// Subsequent item doesn't fit: stop here
|
|
181
204
|
break;
|
|
182
205
|
}
|
|
183
206
|
}
|
|
184
207
|
|
|
185
208
|
/* c8 ignore start
|
|
186
209
|
* for type safety only, algorithm guarantees SOME text included */
|
|
187
|
-
if (
|
|
210
|
+
if (includedItems.length <= 0) {
|
|
188
211
|
return [];
|
|
189
212
|
} else {
|
|
190
213
|
/* c8 ignore stop */
|
|
191
|
-
return [{ ...message,
|
|
214
|
+
return [{ ...message, [key]: includedItems }];
|
|
192
215
|
}
|
|
193
216
|
}
|
|
194
217
|
|
|
@@ -221,13 +244,8 @@ function truncateSingleMessage(message, maxBytes) {
|
|
|
221
244
|
return truncateContentMessage(message, maxBytes);
|
|
222
245
|
}
|
|
223
246
|
|
|
224
|
-
if (isContentArrayMessage(message)) {
|
|
225
|
-
|
|
226
|
-
return [message];
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
if (isPartsMessage(message)) {
|
|
230
|
-
return truncatePartsMessage(message, maxBytes);
|
|
247
|
+
if (isContentArrayMessage(message) || isPartsMessage(message)) {
|
|
248
|
+
return truncateArrayMessage(message, maxBytes);
|
|
231
249
|
}
|
|
232
250
|
|
|
233
251
|
// Unknown message format: cannot truncate safely
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messageTruncation.js","sources":["../../../../src/tracing/ai/messageTruncation.ts"],"sourcesContent":["import { isContentMedia, stripInlineMediaFromSingleMessage } from './mediaStripping';\n\n/**\n * Default maximum size in bytes for GenAI messages.\n * Messages exceeding this limit will be truncated.\n */\nexport const DEFAULT_GEN_AI_MESSAGES_BYTE_LIMIT = 20000;\n\n/**\n * Message format used by OpenAI and Anthropic APIs.\n */\ntype ContentMessage = {\n [key: string]: unknown;\n content: string;\n};\n\n/**\n * Message format used by OpenAI and Anthropic APIs for media.\n */\ntype ContentArrayMessage = {\n [key: string]: unknown;\n content: {\n [key: string]: unknown;\n type: string;\n }[];\n};\n\n/**\n * Message format used by Google GenAI API.\n * Parts can be strings or objects with a text property.\n */\ntype PartsMessage = {\n [key: string]: unknown;\n parts: Array<TextPart | MediaPart>;\n};\n\n/**\n * A part in a Google GenAI message that contains text.\n */\ntype TextPart = string | { text: string };\n\n/**\n * A part in a Google GenAI that contains media.\n */\ntype MediaPart = {\n type: string;\n content: string;\n};\n\n/**\n * Calculate the UTF-8 byte length of a string.\n */\nconst utf8Bytes = (text: string): number => {\n return new TextEncoder().encode(text).length;\n};\n\n/**\n * Calculate the UTF-8 byte length of a value's JSON representation.\n */\nconst jsonBytes = (value: unknown): number => {\n return utf8Bytes(JSON.stringify(value));\n};\n\n/**\n * Truncate a string to fit within maxBytes (inclusive) when encoded as UTF-8.\n * Uses binary search for efficiency with multi-byte characters.\n *\n * @param text - The string to truncate\n * @param maxBytes - Maximum byte length (inclusive, UTF-8 encoded)\n * @returns Truncated string whose UTF-8 byte length is at most maxBytes\n */\nfunction truncateTextByBytes(text: string, maxBytes: number): string {\n if (utf8Bytes(text) <= maxBytes) {\n return text;\n }\n\n let low = 0;\n let high = text.length;\n let bestFit = '';\n\n while (low <= high) {\n const mid = Math.floor((low + high) / 2);\n const candidate = text.slice(0, mid);\n const byteSize = utf8Bytes(candidate);\n\n if (byteSize <= maxBytes) {\n bestFit = candidate;\n low = mid + 1;\n } else {\n high = mid - 1;\n }\n }\n\n return bestFit;\n}\n\n/**\n * Extract text content from a Google GenAI message part.\n * Parts are either plain strings or objects with a text property.\n *\n * @returns The text content\n */\nfunction getPartText(part: TextPart | MediaPart): string {\n if (typeof part === 'string') {\n return part;\n }\n if ('text' in part) return part.text;\n return '';\n}\n\n/**\n * Create a new part with updated text content while preserving the original structure.\n *\n * @param part - Original part (string or object)\n * @param text - New text content\n * @returns New part with updated text\n */\nfunction withPartText(part: TextPart | MediaPart, text: string): TextPart {\n if (typeof part === 'string') {\n return text;\n }\n return { ...part, text };\n}\n\n/**\n * Check if a message has the OpenAI/Anthropic content format.\n */\nfunction isContentMessage(message: unknown): message is ContentMessage {\n return (\n message !== null &&\n typeof message === 'object' &&\n 'content' in message &&\n typeof (message as ContentMessage).content === 'string'\n );\n}\n\n/**\n * Check if a message has the OpenAI/Anthropic content array format.\n */\nfunction isContentArrayMessage(message: unknown): message is ContentArrayMessage {\n return message !== null && typeof message === 'object' && 'content' in message && Array.isArray(message.content);\n}\n\n/**\n * Check if a message has the Google GenAI parts format.\n */\nfunction isPartsMessage(message: unknown): message is PartsMessage {\n return (\n message !== null &&\n typeof message === 'object' &&\n 'parts' in message &&\n Array.isArray((message as PartsMessage).parts) &&\n (message as PartsMessage).parts.length > 0\n );\n}\n\n/**\n * Truncate a message with `content: string` format (OpenAI/Anthropic).\n *\n * @param message - Message with content property\n * @param maxBytes - Maximum byte limit\n * @returns Array with truncated message, or empty array if it doesn't fit\n */\nfunction truncateContentMessage(message: ContentMessage, maxBytes: number): unknown[] {\n // Calculate overhead (message structure without content)\n const emptyMessage = { ...message, content: '' };\n const overhead = jsonBytes(emptyMessage);\n const availableForContent = maxBytes - overhead;\n\n if (availableForContent <= 0) {\n return [];\n }\n\n const truncatedContent = truncateTextByBytes(message.content, availableForContent);\n return [{ ...message, content: truncatedContent }];\n}\n\n/**\n * Truncate a message with `parts: [...]` format (Google GenAI).\n * Keeps as many complete parts as possible, only truncating the first part if needed.\n *\n * @param message - Message with parts array\n * @param maxBytes - Maximum byte limit\n * @returns Array with truncated message, or empty array if it doesn't fit\n */\nfunction truncatePartsMessage(message: PartsMessage, maxBytes: number): unknown[] {\n const { parts } = message;\n\n // Calculate overhead by creating empty text parts\n const emptyParts = parts.map(part => withPartText(part, ''));\n const overhead = jsonBytes({ ...message, parts: emptyParts });\n let remainingBytes = maxBytes - overhead;\n\n if (remainingBytes <= 0) {\n return [];\n }\n\n // Include parts until we run out of space\n const includedParts: (TextPart | MediaPart)[] = [];\n\n for (const part of parts) {\n const text = getPartText(part);\n const textSize = utf8Bytes(text);\n\n if (textSize <= remainingBytes) {\n // Part fits: include it as-is\n includedParts.push(part);\n remainingBytes -= textSize;\n } else if (includedParts.length === 0) {\n // First part doesn't fit: truncate it\n const truncated = truncateTextByBytes(text, remainingBytes);\n if (truncated) {\n includedParts.push(withPartText(part, truncated));\n }\n break;\n } else {\n // Subsequent part doesn't fit: stop here\n break;\n }\n }\n\n /* c8 ignore start\n * for type safety only, algorithm guarantees SOME text included */\n if (includedParts.length <= 0) {\n return [];\n } else {\n /* c8 ignore stop */\n return [{ ...message, parts: includedParts }];\n }\n}\n\n/**\n * Truncate a single message to fit within maxBytes.\n *\n * Supports three message formats:\n * - OpenAI/Anthropic: `{ ..., content: string }`\n * - Vercel AI/OpenAI multimodal: `{ ..., content: Array<{type, text?, ...}> }`\n * - Google GenAI: `{ ..., parts: Array<string | {text: string} | non-text> }`\n *\n * @param message - The message to truncate\n * @param maxBytes - Maximum byte limit for the message\n * @returns Array containing the truncated message, or empty array if truncation fails\n */\nfunction truncateSingleMessage(message: unknown, maxBytes: number): unknown[] {\n if (!message) return [];\n\n // Handle plain strings (e.g., embeddings input)\n if (typeof message === 'string') {\n const truncated = truncateTextByBytes(message, maxBytes);\n return truncated ? [truncated] : [];\n }\n\n if (typeof message !== 'object') {\n return [];\n }\n\n if (isContentMessage(message)) {\n return truncateContentMessage(message, maxBytes);\n }\n\n if (isContentArrayMessage(message)) {\n // Content array messages are returned as-is without truncation\n return [message];\n }\n\n if (isPartsMessage(message)) {\n return truncatePartsMessage(message, maxBytes);\n }\n\n // Unknown message format: cannot truncate safely\n return [];\n}\n\n/**\n * Strip the inline media from message arrays.\n *\n * This returns a stripped message. We do NOT want to mutate the data in place,\n * because of course we still want the actual API/client to handle the media.\n */\nfunction stripInlineMediaFromMessages(messages: unknown[]): unknown[] {\n const stripped = messages.map(message => {\n let newMessage: Record<string, unknown> | undefined = undefined;\n if (!!message && typeof message === 'object') {\n if (isContentArrayMessage(message)) {\n newMessage = {\n ...message,\n content: stripInlineMediaFromMessages(message.content),\n };\n } else if ('content' in message && isContentMedia(message.content)) {\n newMessage = {\n ...message,\n content: stripInlineMediaFromSingleMessage(message.content),\n };\n }\n if (isPartsMessage(message)) {\n newMessage = {\n // might have to strip content AND parts\n ...(newMessage ?? message),\n parts: stripInlineMediaFromMessages(message.parts),\n };\n }\n if (isContentMedia(newMessage)) {\n newMessage = stripInlineMediaFromSingleMessage(newMessage);\n } else if (isContentMedia(message)) {\n newMessage = stripInlineMediaFromSingleMessage(message);\n }\n }\n return newMessage ?? message;\n });\n return stripped;\n}\n\n/**\n * Truncate an array of messages to fit within a byte limit.\n *\n * Strategy:\n * - Always keeps only the last (newest) message\n * - Strips inline media from the message\n * - Truncates the message content if it exceeds the byte limit\n *\n * @param messages - Array of messages to truncate\n * @param maxBytes - Maximum total byte limit for the message\n * @returns Array containing only the last message (possibly truncated)\n *\n * @example\n * ```ts\n * const messages = [msg1, msg2, msg3, msg4]; // newest is msg4\n * const truncated = truncateMessagesByBytes(messages, 10000);\n * // Returns [msg4] (truncated if needed)\n * ```\n */\nfunction truncateMessagesByBytes(messages: unknown[], maxBytes: number): unknown[] {\n // Early return for empty or invalid input\n if (!Array.isArray(messages) || messages.length === 0) {\n return messages;\n }\n\n // The result is always a single-element array that callers wrap with\n // JSON.stringify([message]), so subtract the 2-byte array wrapper (\"[\" and \"]\")\n // to ensure the final serialized value stays under the limit.\n const effectiveMaxBytes = maxBytes - 2;\n\n // Always keep only the last message\n const lastMessage = messages[messages.length - 1];\n\n // Strip inline media from the single message\n const stripped = stripInlineMediaFromMessages([lastMessage]);\n const strippedMessage = stripped[0];\n\n // Check if it fits\n const messageBytes = jsonBytes(strippedMessage);\n if (messageBytes <= effectiveMaxBytes) {\n return stripped;\n }\n\n // Truncate the single message if needed\n return truncateSingleMessage(strippedMessage, effectiveMaxBytes);\n}\n\n/**\n * Truncate GenAI messages using the default byte limit.\n *\n * Convenience wrapper around `truncateMessagesByBytes` with the default limit.\n *\n * @param messages - Array of messages to truncate\n * @returns Truncated array of messages\n */\nexport function truncateGenAiMessages(messages: unknown[]): unknown[] {\n return truncateMessagesByBytes(messages, DEFAULT_GEN_AI_MESSAGES_BYTE_LIMIT);\n}\n\n/**\n * Truncate GenAI string input using the default byte limit.\n *\n * @param input - The string to truncate\n * @returns Truncated string\n */\nexport function truncateGenAiStringInput(input: string): string {\n return truncateTextByBytes(input, DEFAULT_GEN_AI_MESSAGES_BYTE_LIMIT);\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"messageTruncation.js","sources":["../../../../src/tracing/ai/messageTruncation.ts"],"sourcesContent":["import { isContentMedia, stripInlineMediaFromSingleMessage } from './mediaStripping';\n\n/**\n * Default maximum size in bytes for GenAI messages.\n * Messages exceeding this limit will be truncated.\n */\nexport const DEFAULT_GEN_AI_MESSAGES_BYTE_LIMIT = 20000;\n\n/**\n * Message format used by OpenAI and Anthropic APIs.\n */\ntype ContentMessage = {\n [key: string]: unknown;\n content: string;\n};\n\n/**\n * One block inside OpenAI / Anthropic `content: [...]` arrays (text, image_url, etc.).\n */\ntype ContentArrayBlock = {\n [key: string]: unknown;\n type: string;\n};\n\n/**\n * Message format used by OpenAI and Anthropic APIs for media.\n */\ntype ContentArrayMessage = {\n [key: string]: unknown;\n content: ContentArrayBlock[];\n};\n\n/**\n * Message format used by Google GenAI API.\n * Parts can be strings or objects with a text property.\n */\ntype PartsMessage = {\n [key: string]: unknown;\n parts: Array<TextPart | MediaPart>;\n};\n\n/**\n * A part in a Google GenAI message that contains text.\n */\ntype TextPart = string | { text: string };\n\n/**\n * A part in a Google GenAI that contains media.\n */\ntype MediaPart = {\n type: string;\n content: string;\n};\n\n/**\n * One element of an array-based message: OpenAI/Anthropic `content[]` or Google `parts`.\n */\ntype ArrayMessageItem = TextPart | MediaPart | ContentArrayBlock;\n\n/**\n * Calculate the UTF-8 byte length of a string.\n */\nconst utf8Bytes = (text: string): number => {\n return new TextEncoder().encode(text).length;\n};\n\n/**\n * Calculate the UTF-8 byte length of a value's JSON representation.\n */\nconst jsonBytes = (value: unknown): number => {\n return utf8Bytes(JSON.stringify(value));\n};\n\n/**\n * Truncate a string to fit within maxBytes (inclusive) when encoded as UTF-8.\n * Uses binary search for efficiency with multi-byte characters.\n *\n * @param text - The string to truncate\n * @param maxBytes - Maximum byte length (inclusive, UTF-8 encoded)\n * @returns Truncated string whose UTF-8 byte length is at most maxBytes\n */\nfunction truncateTextByBytes(text: string, maxBytes: number): string {\n if (utf8Bytes(text) <= maxBytes) {\n return text;\n }\n\n let low = 0;\n let high = text.length;\n let bestFit = '';\n\n while (low <= high) {\n const mid = Math.floor((low + high) / 2);\n const candidate = text.slice(0, mid);\n const byteSize = utf8Bytes(candidate);\n\n if (byteSize <= maxBytes) {\n bestFit = candidate;\n low = mid + 1;\n } else {\n high = mid - 1;\n }\n }\n\n return bestFit;\n}\n\n/**\n * Extract text content from a message item.\n * Handles plain strings and objects with a text property.\n *\n * @returns The text content\n */\nfunction getItemText(item: ArrayMessageItem): string {\n if (typeof item === 'string') {\n return item;\n }\n if ('text' in item && typeof item.text === 'string') {\n return item.text;\n }\n return '';\n}\n\n/**\n * Create a new item with updated text content while preserving the original structure.\n *\n * @param item - Original item (string or object)\n * @param text - New text content\n * @returns New item with updated text\n */\nfunction withItemText(item: ArrayMessageItem, text: string): ArrayMessageItem {\n if (typeof item === 'string') {\n return text;\n }\n return { ...item, text };\n}\n\n/**\n * Check if a message has the OpenAI/Anthropic content format.\n */\nfunction isContentMessage(message: unknown): message is ContentMessage {\n return (\n message !== null &&\n typeof message === 'object' &&\n 'content' in message &&\n typeof (message as ContentMessage).content === 'string'\n );\n}\n\n/**\n * Check if a message has the OpenAI/Anthropic content array format.\n */\nfunction isContentArrayMessage(message: unknown): message is ContentArrayMessage {\n return message !== null && typeof message === 'object' && 'content' in message && Array.isArray(message.content);\n}\n\n/**\n * Check if a message has the Google GenAI parts format.\n */\nfunction isPartsMessage(message: unknown): message is PartsMessage {\n return (\n message !== null &&\n typeof message === 'object' &&\n 'parts' in message &&\n Array.isArray((message as PartsMessage).parts) &&\n (message as PartsMessage).parts.length > 0\n );\n}\n\n/**\n * Truncate a message with `content: string` format (OpenAI/Anthropic).\n *\n * @param message - Message with content property\n * @param maxBytes - Maximum byte limit\n * @returns Array with truncated message, or empty array if it doesn't fit\n */\nfunction truncateContentMessage(message: ContentMessage, maxBytes: number): unknown[] {\n // Calculate overhead (message structure without content)\n const emptyMessage = { ...message, content: '' };\n const overhead = jsonBytes(emptyMessage);\n const availableForContent = maxBytes - overhead;\n\n if (availableForContent <= 0) {\n return [];\n }\n\n const truncatedContent = truncateTextByBytes(message.content, availableForContent);\n return [{ ...message, content: truncatedContent }];\n}\n\n/**\n * Extracts the array items and their key from an array-based message.\n * Returns `null` key if neither `parts` nor `content` is a valid array.\n */\nfunction getArrayItems(message: PartsMessage | ContentArrayMessage): {\n key: 'parts' | 'content' | null;\n items: ArrayMessageItem[];\n} {\n if ('parts' in message && Array.isArray(message.parts)) {\n return { key: 'parts', items: message.parts };\n }\n if ('content' in message && Array.isArray(message.content)) {\n return { key: 'content', items: message.content };\n }\n return { key: null, items: [] };\n}\n\n/**\n * Truncate a message with an array-based format.\n * Handles both `parts: [...]` (Google GenAI) and `content: [...]` (OpenAI/Anthropic multimodal).\n * Keeps as many complete items as possible, only truncating the first item if needed.\n *\n * @param message - Message with parts or content array\n * @param maxBytes - Maximum byte limit\n * @returns Array with truncated message, or empty array if it doesn't fit\n */\nfunction truncateArrayMessage(message: PartsMessage | ContentArrayMessage, maxBytes: number): unknown[] {\n const { key, items } = getArrayItems(message);\n\n if (key === null || items.length === 0) {\n return [];\n }\n\n // Calculate overhead by creating empty text items\n const emptyItems = items.map(item => withItemText(item, ''));\n const overhead = jsonBytes({ ...message, [key]: emptyItems });\n let remainingBytes = maxBytes - overhead;\n\n if (remainingBytes <= 0) {\n return [];\n }\n\n // Include items until we run out of space\n const includedItems: ArrayMessageItem[] = [];\n\n for (const item of items) {\n const text = getItemText(item);\n const textSize = utf8Bytes(text);\n\n if (textSize <= remainingBytes) {\n // Item fits: include it as-is\n includedItems.push(item);\n remainingBytes -= textSize;\n } else if (includedItems.length === 0) {\n // First item doesn't fit: truncate it\n const truncated = truncateTextByBytes(text, remainingBytes);\n if (truncated) {\n includedItems.push(withItemText(item, truncated));\n }\n break;\n } else {\n // Subsequent item doesn't fit: stop here\n break;\n }\n }\n\n /* c8 ignore start\n * for type safety only, algorithm guarantees SOME text included */\n if (includedItems.length <= 0) {\n return [];\n } else {\n /* c8 ignore stop */\n return [{ ...message, [key]: includedItems }];\n }\n}\n\n/**\n * Truncate a single message to fit within maxBytes.\n *\n * Supports three message formats:\n * - OpenAI/Anthropic: `{ ..., content: string }`\n * - Vercel AI/OpenAI multimodal: `{ ..., content: Array<{type, text?, ...}> }`\n * - Google GenAI: `{ ..., parts: Array<string | {text: string} | non-text> }`\n *\n * @param message - The message to truncate\n * @param maxBytes - Maximum byte limit for the message\n * @returns Array containing the truncated message, or empty array if truncation fails\n */\nfunction truncateSingleMessage(message: unknown, maxBytes: number): unknown[] {\n if (!message) return [];\n\n // Handle plain strings (e.g., embeddings input)\n if (typeof message === 'string') {\n const truncated = truncateTextByBytes(message, maxBytes);\n return truncated ? [truncated] : [];\n }\n\n if (typeof message !== 'object') {\n return [];\n }\n\n if (isContentMessage(message)) {\n return truncateContentMessage(message, maxBytes);\n }\n\n if (isContentArrayMessage(message) || isPartsMessage(message)) {\n return truncateArrayMessage(message, maxBytes);\n }\n\n // Unknown message format: cannot truncate safely\n return [];\n}\n\n/**\n * Strip the inline media from message arrays.\n *\n * This returns a stripped message. We do NOT want to mutate the data in place,\n * because of course we still want the actual API/client to handle the media.\n */\nfunction stripInlineMediaFromMessages(messages: unknown[]): unknown[] {\n const stripped = messages.map(message => {\n let newMessage: Record<string, unknown> | undefined = undefined;\n if (!!message && typeof message === 'object') {\n if (isContentArrayMessage(message)) {\n newMessage = {\n ...message,\n content: stripInlineMediaFromMessages(message.content),\n };\n } else if ('content' in message && isContentMedia(message.content)) {\n newMessage = {\n ...message,\n content: stripInlineMediaFromSingleMessage(message.content),\n };\n }\n if (isPartsMessage(message)) {\n newMessage = {\n // might have to strip content AND parts\n ...(newMessage ?? message),\n parts: stripInlineMediaFromMessages(message.parts),\n };\n }\n if (isContentMedia(newMessage)) {\n newMessage = stripInlineMediaFromSingleMessage(newMessage);\n } else if (isContentMedia(message)) {\n newMessage = stripInlineMediaFromSingleMessage(message);\n }\n }\n return newMessage ?? message;\n });\n return stripped;\n}\n\n/**\n * Truncate an array of messages to fit within a byte limit.\n *\n * Strategy:\n * - Always keeps only the last (newest) message\n * - Strips inline media from the message\n * - Truncates the message content if it exceeds the byte limit\n *\n * @param messages - Array of messages to truncate\n * @param maxBytes - Maximum total byte limit for the message\n * @returns Array containing only the last message (possibly truncated)\n *\n * @example\n * ```ts\n * const messages = [msg1, msg2, msg3, msg4]; // newest is msg4\n * const truncated = truncateMessagesByBytes(messages, 10000);\n * // Returns [msg4] (truncated if needed)\n * ```\n */\nfunction truncateMessagesByBytes(messages: unknown[], maxBytes: number): unknown[] {\n // Early return for empty or invalid input\n if (!Array.isArray(messages) || messages.length === 0) {\n return messages;\n }\n\n // The result is always a single-element array that callers wrap with\n // JSON.stringify([message]), so subtract the 2-byte array wrapper (\"[\" and \"]\")\n // to ensure the final serialized value stays under the limit.\n const effectiveMaxBytes = maxBytes - 2;\n\n // Always keep only the last message\n const lastMessage = messages[messages.length - 1];\n\n // Strip inline media from the single message\n const stripped = stripInlineMediaFromMessages([lastMessage]);\n const strippedMessage = stripped[0];\n\n // Check if it fits\n const messageBytes = jsonBytes(strippedMessage);\n if (messageBytes <= effectiveMaxBytes) {\n return stripped;\n }\n\n // Truncate the single message if needed\n return truncateSingleMessage(strippedMessage, effectiveMaxBytes);\n}\n\n/**\n * Truncate GenAI messages using the default byte limit.\n *\n * Convenience wrapper around `truncateMessagesByBytes` with the default limit.\n *\n * @param messages - Array of messages to truncate\n * @returns Truncated array of messages\n */\nexport function truncateGenAiMessages(messages: unknown[]): unknown[] {\n return truncateMessagesByBytes(messages, DEFAULT_GEN_AI_MESSAGES_BYTE_LIMIT);\n}\n\n/**\n * Truncate GenAI string input using the default byte limit.\n *\n * @param input - The string to truncate\n * @returns Truncated string\n */\nexport function truncateGenAiStringInput(input: string): string {\n return truncateTextByBytes(input, DEFAULT_GEN_AI_MESSAGES_BYTE_LIMIT);\n}\n"],"names":[],"mappings":"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"}
|