@amplitude/ai 0.3.4 → 0.3.6
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/AGENTS.md +1 -1
- package/README.md +176 -172
- package/data/agent_event_catalog.json +18 -3
- package/dist/client.d.ts +1 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +1 -0
- package/dist/client.js.map +1 -1
- package/dist/core/constants.d.ts +4 -1
- package/dist/core/constants.d.ts.map +1 -1
- package/dist/core/constants.js +4 -1
- package/dist/core/constants.js.map +1 -1
- package/dist/core/privacy.d.ts +7 -1
- package/dist/core/privacy.d.ts.map +1 -1
- package/dist/core/privacy.js +79 -2
- package/dist/core/privacy.js.map +1 -1
- package/dist/core/tracking.d.ts +3 -2
- package/dist/core/tracking.d.ts.map +1 -1
- package/dist/core/tracking.js +4 -2
- package/dist/core/tracking.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.js +3 -3
- package/dist/providers/anthropic.d.ts.map +1 -1
- package/dist/providers/anthropic.js +9 -1
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/bedrock.d.ts.map +1 -1
- package/dist/providers/bedrock.js +8 -0
- package/dist/providers/bedrock.js.map +1 -1
- package/dist/providers/gemini.d.ts.map +1 -1
- package/dist/providers/gemini.js +6 -0
- package/dist/providers/gemini.js.map +1 -1
- package/dist/providers/mistral.d.ts.map +1 -1
- package/dist/providers/mistral.js +6 -0
- package/dist/providers/mistral.js.map +1 -1
- package/dist/providers/openai.d.ts +2 -1
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +24 -3
- package/dist/providers/openai.js.map +1 -1
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/llms-full.txt +1 -1
- package/llms.txt +1 -1
- package/mcp.schema.json +1 -1
- package/package.json +1 -1
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","names":["availableProviders: string[]"],"sources":["../src/client.ts"],"sourcesContent":["import { BoundAgent, type AgentOptions } from './bound-agent.js';\nimport { AIConfig } from './config.js';\nimport type { MessageLabel, SessionEnrichments } from './core/enrichments.js';\nimport type { PrivacyConfig } from './core/privacy.js';\nimport {\n trackAiMessage,\n trackEmbedding,\n trackScore,\n trackSessionEnd,\n trackSessionEnrichment,\n trackSpan,\n trackToolCall,\n trackUserMessage,\n} from './core/tracking.js';\nimport { ConfigurationError } from './exceptions.js';\nimport { patchedProviders } from './patching.js';\nimport { setDefaultPropagateContext } from './propagation.js';\nimport { isServerless } from './serverless.js';\nimport { TenantHandle } from './tenant.js';\nimport type {\n AmplitudeClientLike,\n AmplitudeEvent,\n Attachment,\n} from './types.js';\nimport { calculateCost } from './utils/costs.js';\nimport { formatDebugLine, formatDryRunLine } from './utils/debug.js';\nimport { tryRequire } from './utils/resolve-module.js';\n\nconst _MAX_SESSION_TURN_COUNTERS = 10_000;\n\n// Global set of AmplitudeAI instances for the unflushed-events exit warning.\n// Uses strong references — call shutdown() to remove an instance and allow GC.\nconst _activeInstances = new Set<AmplitudeAI>();\nlet _exitHookRegistered = false;\n\nfunction _registerExitHook(): void {\n if (_exitHookRegistered) return;\n _exitHookRegistered = true;\n\n process.on('beforeExit', () => {\n if (!isServerless()) return;\n for (const instance of _activeInstances) {\n if (instance._trackCountSinceFlush > 0) {\n console.warn(\n `⚠️ AmplitudeAI: ${instance._trackCountSinceFlush} event(s) were tracked but never flushed. In serverless environments, call \\`await ai.flush()\\` before your handler returns, or use session.run() which auto-flushes by default.`,\n );\n break; // one warning is enough\n }\n }\n });\n}\n\n/**\n * Main Amplitude AI client for tracking LLM interactions.\n *\n * Create an instance with an API key or an existing Amplitude client,\n * then use `.agent()` to create bound agents and `.session()` to\n * manage session context.\n *\n * @example\n * ```typescript\n * const ai = new AmplitudeAI({ apiKey: 'YOUR_KEY' });\n * const agent = ai.agent('my-chatbot', { userId: 'user-1' });\n * const session = agent.session();\n * await session.run(async (s) => {\n * s.trackUserMessage('Hello');\n * s.trackAiMessage('Hi there!', 'gpt-4', 'openai', 150);\n * });\n * ```\n */\nexport class AmplitudeAI {\n protected _amplitude: AmplitudeClientLike;\n protected _ownsClient: boolean;\n protected _config: AIConfig;\n protected _privacyConfig: PrivacyConfig;\n protected _sessionTurnCounters: Map<string, number> = new Map();\n /** @internal Tracks events since last flush() — used by the exit warning. */\n _trackCountSinceFlush = 0;\n\n constructor(options: {\n amplitude?: AmplitudeClientLike;\n apiKey?: string;\n config?: AIConfig;\n }) {\n if (options.amplitude != null) {\n this._amplitude = options.amplitude;\n this._ownsClient = false;\n } else if (options.apiKey != null) {\n const amplitudeNode = tryRequire('@amplitude/analytics-node') as\n | (AmplitudeClientLike & { init?: (apiKey: string) => unknown })\n | null;\n if (amplitudeNode == null || typeof amplitudeNode.init !== 'function') {\n throw new ConfigurationError(\n '@amplitude/analytics-node is required. Install it as a dependency.',\n );\n }\n amplitudeNode.init(options.apiKey);\n this._amplitude = amplitudeNode;\n this._ownsClient = true;\n } else {\n throw new ConfigurationError(\n \"Provide either an existing Amplitude instance via 'amplitude' or an API key via 'apiKey'.\",\n );\n }\n\n this._config = options.config ?? new AIConfig();\n this._privacyConfig = this._config.toPrivacyConfig();\n setDefaultPropagateContext(this._config.propagateContext);\n\n if (\n this._config.debug ||\n this._config.dryRun ||\n this._config.onEventCallback != null\n ) {\n this._installTrackHook();\n }\n\n this._installTrackCounter();\n _activeInstances.add(this);\n _registerExitHook();\n }\n\n private _installTrackCounter(): void {\n const originalTrack = this._amplitude.track.bind(this._amplitude);\n this._amplitude.track = (event: AmplitudeEvent) => {\n this._trackCountSinceFlush++;\n return originalTrack(event);\n };\n }\n\n private _installTrackHook(): void {\n const originalTrack = this._amplitude.track.bind(this._amplitude);\n const debug = this._config.debug;\n const dryRun = this._config.dryRun;\n const onEvent = this._config.onEventCallback;\n const clientWithConfig = this._amplitude as AmplitudeClientLike & {\n configuration?: { callback?: (...args: unknown[]) => void };\n };\n const existingCallback = clientWithConfig.configuration?.callback;\n let callbackHandledByTransport = false;\n\n if (onEvent != null && clientWithConfig.configuration != null) {\n clientWithConfig.configuration.callback = (...args: unknown[]) => {\n const event = args[0];\n const statusCode = typeof args[1] === 'number' ? args[1] : 0;\n const message = args[2] == null ? null : String(args[2]);\n if (typeof existingCallback === 'function') {\n try {\n existingCallback(...args);\n } catch {\n // preserve hook behavior even if customer callback throws\n }\n }\n try {\n onEvent(event, statusCode, message);\n } catch {\n // swallow callback errors to avoid disrupting tracking\n }\n };\n callbackHandledByTransport = true;\n }\n\n this._amplitude.track = (event: AmplitudeEvent) => {\n if (debug) {\n console.error(formatDebugLine(event));\n }\n if (dryRun) {\n console.error(formatDryRunLine(event));\n }\n if (!dryRun) {\n originalTrack(event);\n }\n if (onEvent != null && (!callbackHandledByTransport || dryRun)) {\n try {\n onEvent(event, dryRun ? -1 : 0, dryRun ? 'dry-run' : null);\n } catch {\n // swallow callback errors to avoid disrupting tracking\n }\n }\n };\n }\n\n get amplitude(): AmplitudeClientLike {\n return this._amplitude;\n }\n\n get config(): AIConfig {\n return this._config;\n }\n\n _nextTurnId(sessionId: string): number {\n if (\n !this._sessionTurnCounters.has(sessionId) &&\n this._sessionTurnCounters.size >= _MAX_SESSION_TURN_COUNTERS\n ) {\n const oldestKey = this._sessionTurnCounters.keys().next().value;\n if (oldestKey != null) this._sessionTurnCounters.delete(oldestKey);\n }\n\n const current = this._sessionTurnCounters.get(sessionId) ?? 0;\n const next = current + 1;\n this._sessionTurnCounters.set(sessionId, next);\n return next;\n }\n\n // ---------------------------------------------------------------\n // Message Tracking\n // ---------------------------------------------------------------\n\n trackUserMessage(opts: {\n userId: string;\n content: string;\n sessionId: string;\n traceId?: string | null;\n turnId?: number | null;\n messageId?: string | null;\n messageSource?: string | null;\n agentId?: string | null;\n parentAgentId?: string | null;\n customerOrgId?: string | null;\n agentVersion?: string | null;\n description?: string | null;\n context?: Record<string, unknown> | null;\n env?: string | null;\n isRegeneration?: boolean;\n isEdit?: boolean;\n editedMessageId?: string | null;\n attachments?: Attachment[] | null;\n labels?: MessageLabel[] | null;\n eventProperties?: Record<string, unknown> | null;\n groups?: Record<string, unknown> | null;\n }): string {\n const effectiveTurnId = opts.turnId ?? this._nextTurnId(opts.sessionId);\n return trackUserMessage({\n amplitude: this._amplitude,\n userId: opts.userId,\n messageContent: opts.content,\n sessionId: opts.sessionId,\n traceId: opts.traceId,\n turnId: effectiveTurnId,\n messageId: opts.messageId,\n messageSource: opts.messageSource ?? 'user',\n agentId: opts.agentId,\n parentAgentId: opts.parentAgentId,\n customerOrgId: opts.customerOrgId,\n agentVersion: opts.agentVersion,\n description: opts.description,\n context: opts.context,\n env: opts.env,\n isRegeneration: opts.isRegeneration,\n isEdit: opts.isEdit,\n editedMessageId: opts.editedMessageId,\n attachments: opts.attachments,\n labels: opts.labels,\n eventProperties: opts.eventProperties,\n groups: opts.groups,\n privacyConfig: this._privacyConfig,\n });\n }\n\n trackAiMessage(opts: {\n userId: string;\n content: string;\n sessionId: string;\n model: string;\n provider: string;\n latencyMs: number;\n inputTokens?: number | null;\n outputTokens?: number | null;\n reasoningTokens?: number | null;\n cacheReadTokens?: number | null;\n cacheCreationTokens?: number | null;\n totalTokens?: number | null;\n totalCostUsd?: number | null;\n finishReason?: string | null;\n toolCalls?: Array<Record<string, unknown>> | null;\n reasoningContent?: string | null;\n systemPrompt?: string | null;\n temperature?: number | null;\n maxOutputTokens?: number | null;\n topP?: number | null;\n isStreaming?: boolean | null;\n promptId?: string | null;\n wasCopied?: boolean;\n wasCached?: boolean;\n modelTier?: string | null;\n attachments?: Attachment[] | null;\n labels?: MessageLabel[] | null;\n traceId?: string | null;\n turnId?: number | null;\n messageId?: string | null;\n agentId?: string | null;\n parentAgentId?: string | null;\n customerOrgId?: string | null;\n agentVersion?: string | null;\n description?: string | null;\n context?: Record<string, unknown> | null;\n env?: string | null;\n isError?: boolean;\n errorMessage?: string | null;\n ttfbMs?: number | null;\n eventProperties?: Record<string, unknown> | null;\n groups?: Record<string, unknown> | null;\n privacyConfig?: PrivacyConfig | null;\n }): string {\n const effectiveTurnId = opts.turnId ?? this._nextTurnId(opts.sessionId);\n\n let effectiveCost = opts.totalCostUsd ?? null;\n if (\n effectiveCost == null &&\n opts.inputTokens != null &&\n opts.outputTokens != null\n ) {\n try {\n effectiveCost = calculateCost({\n modelName: opts.model,\n inputTokens: opts.inputTokens,\n outputTokens: opts.outputTokens,\n reasoningTokens: opts.reasoningTokens ?? 0,\n cacheReadInputTokens: opts.cacheReadTokens ?? 0,\n cacheCreationInputTokens: opts.cacheCreationTokens ?? 0,\n defaultProvider: opts.provider || undefined,\n });\n } catch {\n // cost calculation is best-effort\n }\n }\n\n return trackAiMessage({\n amplitude: this._amplitude,\n userId: opts.userId,\n modelName: opts.model,\n provider: opts.provider,\n responseContent: opts.content,\n latencyMs: opts.latencyMs,\n sessionId: opts.sessionId,\n traceId: opts.traceId,\n turnId: effectiveTurnId,\n messageId: opts.messageId,\n inputTokens: opts.inputTokens,\n outputTokens: opts.outputTokens,\n reasoningTokens: opts.reasoningTokens,\n cacheReadInputTokens: opts.cacheReadTokens,\n cacheCreationInputTokens: opts.cacheCreationTokens,\n totalTokens: opts.totalTokens,\n totalCostUsd: effectiveCost,\n finishReason: opts.finishReason,\n toolCalls: opts.toolCalls,\n reasoningContent: opts.reasoningContent,\n systemPrompt: opts.systemPrompt,\n temperature: opts.temperature,\n maxOutputTokens: opts.maxOutputTokens,\n topP: opts.topP,\n isStreaming: opts.isStreaming,\n promptId: opts.promptId,\n wasCopied: opts.wasCopied,\n wasCached: opts.wasCached,\n modelTier: opts.modelTier,\n attachments: opts.attachments,\n labels: opts.labels,\n agentId: opts.agentId,\n parentAgentId: opts.parentAgentId,\n customerOrgId: opts.customerOrgId,\n agentVersion: opts.agentVersion,\n description: opts.description,\n context: opts.context,\n env: opts.env,\n isError: opts.isError,\n errorMessage: opts.errorMessage,\n providerTtfbMs: opts.ttfbMs,\n eventProperties: opts.eventProperties,\n groups: opts.groups,\n privacyConfig: opts.privacyConfig ?? this._privacyConfig,\n });\n }\n\n // ---------------------------------------------------------------\n // Operation Tracking\n // ---------------------------------------------------------------\n\n trackToolCall(opts: {\n userId: string;\n toolName: string;\n latencyMs: number;\n success: boolean;\n sessionId?: string | null;\n traceId?: string | null;\n turnId?: number | null;\n invocationId?: string | null;\n input?: unknown;\n output?: unknown;\n parentMessageId?: string | null;\n agentId?: string | null;\n parentAgentId?: string | null;\n customerOrgId?: string | null;\n agentVersion?: string | null;\n description?: string | null;\n context?: Record<string, unknown> | null;\n env?: string | null;\n errorMessage?: string | null;\n eventProperties?: Record<string, unknown> | null;\n groups?: Record<string, unknown> | null;\n }): string {\n return trackToolCall({\n amplitude: this._amplitude,\n userId: opts.userId,\n toolName: opts.toolName,\n success: opts.success,\n latencyMs: opts.latencyMs,\n sessionId: opts.sessionId,\n traceId: opts.traceId,\n turnId: opts.turnId ?? undefined,\n invocationId: opts.invocationId,\n toolInput: opts.input,\n toolOutput: opts.output,\n parentMessageId: opts.parentMessageId,\n agentId: opts.agentId,\n parentAgentId: opts.parentAgentId,\n customerOrgId: opts.customerOrgId,\n agentVersion: opts.agentVersion,\n description: opts.description,\n context: opts.context,\n env: opts.env,\n errorMessage: opts.errorMessage,\n eventProperties: opts.eventProperties,\n groups: opts.groups,\n privacyConfig: this._privacyConfig,\n });\n }\n\n trackEmbedding(opts: {\n userId: string;\n model: string;\n provider: string;\n latencyMs: number;\n inputTokens?: number | null;\n dimensions?: number | null;\n totalCostUsd?: number | null;\n sessionId?: string | null;\n traceId?: string | null;\n turnId?: number | null;\n agentId?: string | null;\n parentAgentId?: string | null;\n customerOrgId?: string | null;\n agentVersion?: string | null;\n description?: string | null;\n context?: Record<string, unknown> | null;\n env?: string | null;\n eventProperties?: Record<string, unknown> | null;\n groups?: Record<string, unknown> | null;\n }): string {\n return trackEmbedding({\n amplitude: this._amplitude,\n userId: opts.userId,\n model: opts.model,\n provider: opts.provider,\n latencyMs: opts.latencyMs,\n inputTokens: opts.inputTokens,\n dimensions: opts.dimensions,\n totalCostUsd: opts.totalCostUsd,\n sessionId: opts.sessionId,\n traceId: opts.traceId,\n turnId: opts.turnId,\n agentId: opts.agentId,\n parentAgentId: opts.parentAgentId,\n customerOrgId: opts.customerOrgId,\n agentVersion: opts.agentVersion,\n description: opts.description,\n context: opts.context,\n env: opts.env,\n eventProperties: opts.eventProperties,\n groups: opts.groups,\n privacyConfig: this._privacyConfig,\n });\n }\n\n trackSpan(opts: {\n userId: string;\n spanName: string;\n traceId: string;\n latencyMs: number;\n inputState?: Record<string, unknown> | null;\n outputState?: Record<string, unknown> | null;\n parentSpanId?: string | null;\n isError?: boolean;\n errorMessage?: string | null;\n sessionId?: string | null;\n turnId?: number | null;\n agentId?: string | null;\n parentAgentId?: string | null;\n customerOrgId?: string | null;\n agentVersion?: string | null;\n description?: string | null;\n context?: Record<string, unknown> | null;\n env?: string | null;\n eventProperties?: Record<string, unknown> | null;\n groups?: Record<string, unknown> | null;\n }): string {\n return trackSpan({\n amplitude: this._amplitude,\n userId: opts.userId,\n spanName: opts.spanName,\n traceId: opts.traceId,\n latencyMs: opts.latencyMs,\n inputState: opts.inputState,\n outputState: opts.outputState,\n parentSpanId: opts.parentSpanId,\n isError: opts.isError,\n errorMessage: opts.errorMessage,\n sessionId: opts.sessionId,\n turnId: opts.turnId,\n agentId: opts.agentId,\n parentAgentId: opts.parentAgentId,\n customerOrgId: opts.customerOrgId,\n agentVersion: opts.agentVersion,\n description: opts.description,\n context: opts.context,\n env: opts.env,\n eventProperties: opts.eventProperties,\n groups: opts.groups,\n privacyConfig: this._privacyConfig,\n });\n }\n\n // ---------------------------------------------------------------\n // Session Management\n // ---------------------------------------------------------------\n\n trackSessionEnd(opts: {\n userId: string;\n sessionId: string;\n enrichments?: SessionEnrichments | null;\n traceId?: string | null;\n turnId?: number | null;\n agentId?: string | null;\n parentAgentId?: string | null;\n customerOrgId?: string | null;\n agentVersion?: string | null;\n description?: string | null;\n context?: Record<string, unknown> | null;\n env?: string | null;\n abandonmentTurn?: number | null;\n idleTimeoutMinutes?: number | null;\n eventProperties?: Record<string, unknown> | null;\n groups?: Record<string, unknown> | null;\n }): void {\n trackSessionEnd({\n amplitude: this._amplitude,\n userId: opts.userId,\n sessionId: opts.sessionId,\n enrichments: opts.enrichments,\n traceId: opts.traceId,\n turnId: opts.turnId,\n agentId: opts.agentId,\n parentAgentId: opts.parentAgentId,\n customerOrgId: opts.customerOrgId,\n agentVersion: opts.agentVersion,\n description: opts.description,\n context: opts.context,\n env: opts.env,\n abandonmentTurn: opts.abandonmentTurn,\n idleTimeoutMinutes: opts.idleTimeoutMinutes,\n eventProperties: opts.eventProperties,\n groups: opts.groups,\n privacyConfig: this._privacyConfig,\n });\n this._sessionTurnCounters.delete(opts.sessionId);\n }\n\n trackSessionEnrichment(opts: {\n userId: string;\n sessionId: string;\n enrichments: SessionEnrichments;\n traceId?: string | null;\n turnId?: number | null;\n agentId?: string | null;\n parentAgentId?: string | null;\n customerOrgId?: string | null;\n agentVersion?: string | null;\n description?: string | null;\n context?: Record<string, unknown> | null;\n env?: string | null;\n eventProperties?: Record<string, unknown> | null;\n groups?: Record<string, unknown> | null;\n }): void {\n trackSessionEnrichment({\n amplitude: this._amplitude,\n userId: opts.userId,\n sessionId: opts.sessionId,\n enrichments: opts.enrichments,\n traceId: opts.traceId,\n turnId: opts.turnId,\n agentId: opts.agentId,\n parentAgentId: opts.parentAgentId,\n customerOrgId: opts.customerOrgId,\n agentVersion: opts.agentVersion,\n description: opts.description,\n context: opts.context,\n env: opts.env,\n eventProperties: opts.eventProperties,\n groups: opts.groups,\n privacyConfig: this._privacyConfig,\n });\n }\n\n // ---------------------------------------------------------------\n // Scoring\n // ---------------------------------------------------------------\n\n score(opts: {\n userId: string;\n name: string;\n value: number;\n targetId: string;\n targetType?: string;\n source?: string;\n comment?: string | null;\n sessionId?: string | null;\n traceId?: string | null;\n turnId?: number | null;\n agentId?: string | null;\n parentAgentId?: string | null;\n customerOrgId?: string | null;\n agentVersion?: string | null;\n description?: string | null;\n context?: Record<string, unknown> | null;\n env?: string | null;\n eventProperties?: Record<string, unknown> | null;\n groups?: Record<string, unknown> | null;\n }): void {\n trackScore({\n amplitude: this._amplitude,\n userId: opts.userId,\n name: opts.name,\n value: opts.value,\n targetId: opts.targetId,\n targetType: opts.targetType,\n source: opts.source,\n comment: opts.comment,\n sessionId: opts.sessionId,\n traceId: opts.traceId,\n turnId: opts.turnId,\n agentId: opts.agentId,\n parentAgentId: opts.parentAgentId,\n customerOrgId: opts.customerOrgId,\n agentVersion: opts.agentVersion,\n description: opts.description,\n context: opts.context,\n env: opts.env,\n eventProperties: opts.eventProperties,\n groups: opts.groups,\n privacyConfig: this._privacyConfig,\n });\n }\n\n // ---------------------------------------------------------------\n // Bound Agent Factory\n // ---------------------------------------------------------------\n\n agent(agentId: string, opts: AgentOptions = {}): BoundAgent {\n return new BoundAgent(this, { agentId, ...opts });\n }\n\n // ---------------------------------------------------------------\n // Tenant Factory\n // ---------------------------------------------------------------\n\n tenant(\n customerOrgId: string,\n opts: { groups?: Record<string, unknown> | null; env?: string | null } = {},\n ): TenantHandle {\n return new TenantHandle(this, { customerOrgId, ...opts });\n }\n\n // ---------------------------------------------------------------\n // Lifecycle\n // ---------------------------------------------------------------\n\n status(): Record<string, unknown> {\n const availableProviders: string[] = [];\n for (const mod of [\n 'openai',\n '@anthropic-ai/sdk',\n '@google/generative-ai',\n '@aws-sdk/client-bedrock-runtime',\n '@mistralai/mistralai',\n ]) {\n if (tryRequire(mod) != null) {\n const name =\n mod === '@anthropic-ai/sdk'\n ? 'anthropic'\n : mod === '@google/generative-ai'\n ? 'gemini'\n : mod === '@aws-sdk/client-bedrock-runtime'\n ? 'bedrock'\n : mod === '@mistralai/mistralai'\n ? 'mistral'\n : mod;\n availableProviders.push(name);\n if (mod === 'openai') {\n availableProviders.push('azure-openai');\n }\n }\n }\n\n return {\n content_mode: this._config.contentMode,\n debug: this._config.debug,\n dry_run: this._config.dryRun,\n redact_pii: this._config.redactPii,\n providers_available: availableProviders,\n patched_providers: patchedProviders(),\n };\n }\n\n flush(): unknown {\n this._trackCountSinceFlush = 0;\n return this._amplitude.flush();\n }\n\n shutdown(): void {\n _activeInstances.delete(this);\n this._trackCountSinceFlush = 0;\n if (this._ownsClient) {\n this._amplitude.shutdown?.();\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.js","names":["availableProviders: string[]"],"sources":["../src/client.ts"],"sourcesContent":["import { BoundAgent, type AgentOptions } from './bound-agent.js';\nimport { AIConfig } from './config.js';\nimport type { MessageLabel, SessionEnrichments } from './core/enrichments.js';\nimport type { PrivacyConfig } from './core/privacy.js';\nimport {\n trackAiMessage,\n trackEmbedding,\n trackScore,\n trackSessionEnd,\n trackSessionEnrichment,\n trackSpan,\n trackToolCall,\n trackUserMessage,\n} from './core/tracking.js';\nimport { ConfigurationError } from './exceptions.js';\nimport { patchedProviders } from './patching.js';\nimport { setDefaultPropagateContext } from './propagation.js';\nimport { isServerless } from './serverless.js';\nimport { TenantHandle } from './tenant.js';\nimport type {\n AmplitudeClientLike,\n AmplitudeEvent,\n Attachment,\n} from './types.js';\nimport { calculateCost } from './utils/costs.js';\nimport { formatDebugLine, formatDryRunLine } from './utils/debug.js';\nimport { tryRequire } from './utils/resolve-module.js';\n\nconst _MAX_SESSION_TURN_COUNTERS = 10_000;\n\n// Global set of AmplitudeAI instances for the unflushed-events exit warning.\n// Uses strong references — call shutdown() to remove an instance and allow GC.\nconst _activeInstances = new Set<AmplitudeAI>();\nlet _exitHookRegistered = false;\n\nfunction _registerExitHook(): void {\n if (_exitHookRegistered) return;\n _exitHookRegistered = true;\n\n process.on('beforeExit', () => {\n if (!isServerless()) return;\n for (const instance of _activeInstances) {\n if (instance._trackCountSinceFlush > 0) {\n console.warn(\n `⚠️ AmplitudeAI: ${instance._trackCountSinceFlush} event(s) were tracked but never flushed. In serverless environments, call \\`await ai.flush()\\` before your handler returns, or use session.run() which auto-flushes by default.`,\n );\n break; // one warning is enough\n }\n }\n });\n}\n\n/**\n * Main Amplitude AI client for tracking LLM interactions.\n *\n * Create an instance with an API key or an existing Amplitude client,\n * then use `.agent()` to create bound agents and `.session()` to\n * manage session context.\n *\n * @example\n * ```typescript\n * const ai = new AmplitudeAI({ apiKey: 'YOUR_KEY' });\n * const agent = ai.agent('my-chatbot', { userId: 'user-1' });\n * const session = agent.session();\n * await session.run(async (s) => {\n * s.trackUserMessage('Hello');\n * s.trackAiMessage('Hi there!', 'gpt-4', 'openai', 150);\n * });\n * ```\n */\nexport class AmplitudeAI {\n protected _amplitude: AmplitudeClientLike;\n protected _ownsClient: boolean;\n protected _config: AIConfig;\n protected _privacyConfig: PrivacyConfig;\n protected _sessionTurnCounters: Map<string, number> = new Map();\n /** @internal Tracks events since last flush() — used by the exit warning. */\n _trackCountSinceFlush = 0;\n\n constructor(options: {\n amplitude?: AmplitudeClientLike;\n apiKey?: string;\n config?: AIConfig;\n }) {\n if (options.amplitude != null) {\n this._amplitude = options.amplitude;\n this._ownsClient = false;\n } else if (options.apiKey != null) {\n const amplitudeNode = tryRequire('@amplitude/analytics-node') as\n | (AmplitudeClientLike & { init?: (apiKey: string) => unknown })\n | null;\n if (amplitudeNode == null || typeof amplitudeNode.init !== 'function') {\n throw new ConfigurationError(\n '@amplitude/analytics-node is required. Install it as a dependency.',\n );\n }\n amplitudeNode.init(options.apiKey);\n this._amplitude = amplitudeNode;\n this._ownsClient = true;\n } else {\n throw new ConfigurationError(\n \"Provide either an existing Amplitude instance via 'amplitude' or an API key via 'apiKey'.\",\n );\n }\n\n this._config = options.config ?? new AIConfig();\n this._privacyConfig = this._config.toPrivacyConfig();\n setDefaultPropagateContext(this._config.propagateContext);\n\n if (\n this._config.debug ||\n this._config.dryRun ||\n this._config.onEventCallback != null\n ) {\n this._installTrackHook();\n }\n\n this._installTrackCounter();\n _activeInstances.add(this);\n _registerExitHook();\n }\n\n private _installTrackCounter(): void {\n const originalTrack = this._amplitude.track.bind(this._amplitude);\n this._amplitude.track = (event: AmplitudeEvent) => {\n this._trackCountSinceFlush++;\n return originalTrack(event);\n };\n }\n\n private _installTrackHook(): void {\n const originalTrack = this._amplitude.track.bind(this._amplitude);\n const debug = this._config.debug;\n const dryRun = this._config.dryRun;\n const onEvent = this._config.onEventCallback;\n const clientWithConfig = this._amplitude as AmplitudeClientLike & {\n configuration?: { callback?: (...args: unknown[]) => void };\n };\n const existingCallback = clientWithConfig.configuration?.callback;\n let callbackHandledByTransport = false;\n\n if (onEvent != null && clientWithConfig.configuration != null) {\n clientWithConfig.configuration.callback = (...args: unknown[]) => {\n const event = args[0];\n const statusCode = typeof args[1] === 'number' ? args[1] : 0;\n const message = args[2] == null ? null : String(args[2]);\n if (typeof existingCallback === 'function') {\n try {\n existingCallback(...args);\n } catch {\n // preserve hook behavior even if customer callback throws\n }\n }\n try {\n onEvent(event, statusCode, message);\n } catch {\n // swallow callback errors to avoid disrupting tracking\n }\n };\n callbackHandledByTransport = true;\n }\n\n this._amplitude.track = (event: AmplitudeEvent) => {\n if (debug) {\n console.error(formatDebugLine(event));\n }\n if (dryRun) {\n console.error(formatDryRunLine(event));\n }\n if (!dryRun) {\n originalTrack(event);\n }\n if (onEvent != null && (!callbackHandledByTransport || dryRun)) {\n try {\n onEvent(event, dryRun ? -1 : 0, dryRun ? 'dry-run' : null);\n } catch {\n // swallow callback errors to avoid disrupting tracking\n }\n }\n };\n }\n\n get amplitude(): AmplitudeClientLike {\n return this._amplitude;\n }\n\n get config(): AIConfig {\n return this._config;\n }\n\n _nextTurnId(sessionId: string): number {\n if (\n !this._sessionTurnCounters.has(sessionId) &&\n this._sessionTurnCounters.size >= _MAX_SESSION_TURN_COUNTERS\n ) {\n const oldestKey = this._sessionTurnCounters.keys().next().value;\n if (oldestKey != null) this._sessionTurnCounters.delete(oldestKey);\n }\n\n const current = this._sessionTurnCounters.get(sessionId) ?? 0;\n const next = current + 1;\n this._sessionTurnCounters.set(sessionId, next);\n return next;\n }\n\n // ---------------------------------------------------------------\n // Message Tracking\n // ---------------------------------------------------------------\n\n trackUserMessage(opts: {\n userId: string;\n content: string;\n sessionId: string;\n traceId?: string | null;\n turnId?: number | null;\n messageId?: string | null;\n messageSource?: string | null;\n agentId?: string | null;\n parentAgentId?: string | null;\n customerOrgId?: string | null;\n agentVersion?: string | null;\n description?: string | null;\n context?: Record<string, unknown> | null;\n env?: string | null;\n isRegeneration?: boolean;\n isEdit?: boolean;\n editedMessageId?: string | null;\n attachments?: Attachment[] | null;\n labels?: MessageLabel[] | null;\n eventProperties?: Record<string, unknown> | null;\n groups?: Record<string, unknown> | null;\n }): string {\n const effectiveTurnId = opts.turnId ?? this._nextTurnId(opts.sessionId);\n return trackUserMessage({\n amplitude: this._amplitude,\n userId: opts.userId,\n messageContent: opts.content,\n sessionId: opts.sessionId,\n traceId: opts.traceId,\n turnId: effectiveTurnId,\n messageId: opts.messageId,\n messageSource: opts.messageSource ?? 'user',\n agentId: opts.agentId,\n parentAgentId: opts.parentAgentId,\n customerOrgId: opts.customerOrgId,\n agentVersion: opts.agentVersion,\n description: opts.description,\n context: opts.context,\n env: opts.env,\n isRegeneration: opts.isRegeneration,\n isEdit: opts.isEdit,\n editedMessageId: opts.editedMessageId,\n attachments: opts.attachments,\n labels: opts.labels,\n eventProperties: opts.eventProperties,\n groups: opts.groups,\n privacyConfig: this._privacyConfig,\n });\n }\n\n trackAiMessage(opts: {\n userId: string;\n content: string;\n sessionId: string;\n model: string;\n provider: string;\n latencyMs: number;\n inputTokens?: number | null;\n outputTokens?: number | null;\n reasoningTokens?: number | null;\n cacheReadTokens?: number | null;\n cacheCreationTokens?: number | null;\n totalTokens?: number | null;\n totalCostUsd?: number | null;\n finishReason?: string | null;\n toolCalls?: Array<Record<string, unknown>> | null;\n reasoningContent?: string | null;\n toolDefinitions?: Array<Record<string, unknown>> | null;\n systemPrompt?: string | null;\n temperature?: number | null;\n maxOutputTokens?: number | null;\n topP?: number | null;\n isStreaming?: boolean | null;\n promptId?: string | null;\n wasCopied?: boolean;\n wasCached?: boolean;\n modelTier?: string | null;\n attachments?: Attachment[] | null;\n labels?: MessageLabel[] | null;\n traceId?: string | null;\n turnId?: number | null;\n messageId?: string | null;\n agentId?: string | null;\n parentAgentId?: string | null;\n customerOrgId?: string | null;\n agentVersion?: string | null;\n description?: string | null;\n context?: Record<string, unknown> | null;\n env?: string | null;\n isError?: boolean;\n errorMessage?: string | null;\n ttfbMs?: number | null;\n eventProperties?: Record<string, unknown> | null;\n groups?: Record<string, unknown> | null;\n privacyConfig?: PrivacyConfig | null;\n }): string {\n const effectiveTurnId = opts.turnId ?? this._nextTurnId(opts.sessionId);\n\n let effectiveCost = opts.totalCostUsd ?? null;\n if (\n effectiveCost == null &&\n opts.inputTokens != null &&\n opts.outputTokens != null\n ) {\n try {\n effectiveCost = calculateCost({\n modelName: opts.model,\n inputTokens: opts.inputTokens,\n outputTokens: opts.outputTokens,\n reasoningTokens: opts.reasoningTokens ?? 0,\n cacheReadInputTokens: opts.cacheReadTokens ?? 0,\n cacheCreationInputTokens: opts.cacheCreationTokens ?? 0,\n defaultProvider: opts.provider || undefined,\n });\n } catch {\n // cost calculation is best-effort\n }\n }\n\n return trackAiMessage({\n amplitude: this._amplitude,\n userId: opts.userId,\n modelName: opts.model,\n provider: opts.provider,\n responseContent: opts.content,\n latencyMs: opts.latencyMs,\n sessionId: opts.sessionId,\n traceId: opts.traceId,\n turnId: effectiveTurnId,\n messageId: opts.messageId,\n inputTokens: opts.inputTokens,\n outputTokens: opts.outputTokens,\n reasoningTokens: opts.reasoningTokens,\n cacheReadInputTokens: opts.cacheReadTokens,\n cacheCreationInputTokens: opts.cacheCreationTokens,\n totalTokens: opts.totalTokens,\n totalCostUsd: effectiveCost,\n finishReason: opts.finishReason,\n toolCalls: opts.toolCalls,\n reasoningContent: opts.reasoningContent,\n toolDefinitions: opts.toolDefinitions,\n systemPrompt: opts.systemPrompt,\n temperature: opts.temperature,\n maxOutputTokens: opts.maxOutputTokens,\n topP: opts.topP,\n isStreaming: opts.isStreaming,\n promptId: opts.promptId,\n wasCopied: opts.wasCopied,\n wasCached: opts.wasCached,\n modelTier: opts.modelTier,\n attachments: opts.attachments,\n labels: opts.labels,\n agentId: opts.agentId,\n parentAgentId: opts.parentAgentId,\n customerOrgId: opts.customerOrgId,\n agentVersion: opts.agentVersion,\n description: opts.description,\n context: opts.context,\n env: opts.env,\n isError: opts.isError,\n errorMessage: opts.errorMessage,\n providerTtfbMs: opts.ttfbMs,\n eventProperties: opts.eventProperties,\n groups: opts.groups,\n privacyConfig: opts.privacyConfig ?? this._privacyConfig,\n });\n }\n\n // ---------------------------------------------------------------\n // Operation Tracking\n // ---------------------------------------------------------------\n\n trackToolCall(opts: {\n userId: string;\n toolName: string;\n latencyMs: number;\n success: boolean;\n sessionId?: string | null;\n traceId?: string | null;\n turnId?: number | null;\n invocationId?: string | null;\n input?: unknown;\n output?: unknown;\n parentMessageId?: string | null;\n agentId?: string | null;\n parentAgentId?: string | null;\n customerOrgId?: string | null;\n agentVersion?: string | null;\n description?: string | null;\n context?: Record<string, unknown> | null;\n env?: string | null;\n errorMessage?: string | null;\n eventProperties?: Record<string, unknown> | null;\n groups?: Record<string, unknown> | null;\n }): string {\n return trackToolCall({\n amplitude: this._amplitude,\n userId: opts.userId,\n toolName: opts.toolName,\n success: opts.success,\n latencyMs: opts.latencyMs,\n sessionId: opts.sessionId,\n traceId: opts.traceId,\n turnId: opts.turnId ?? undefined,\n invocationId: opts.invocationId,\n toolInput: opts.input,\n toolOutput: opts.output,\n parentMessageId: opts.parentMessageId,\n agentId: opts.agentId,\n parentAgentId: opts.parentAgentId,\n customerOrgId: opts.customerOrgId,\n agentVersion: opts.agentVersion,\n description: opts.description,\n context: opts.context,\n env: opts.env,\n errorMessage: opts.errorMessage,\n eventProperties: opts.eventProperties,\n groups: opts.groups,\n privacyConfig: this._privacyConfig,\n });\n }\n\n trackEmbedding(opts: {\n userId: string;\n model: string;\n provider: string;\n latencyMs: number;\n inputTokens?: number | null;\n dimensions?: number | null;\n totalCostUsd?: number | null;\n sessionId?: string | null;\n traceId?: string | null;\n turnId?: number | null;\n agentId?: string | null;\n parentAgentId?: string | null;\n customerOrgId?: string | null;\n agentVersion?: string | null;\n description?: string | null;\n context?: Record<string, unknown> | null;\n env?: string | null;\n eventProperties?: Record<string, unknown> | null;\n groups?: Record<string, unknown> | null;\n }): string {\n return trackEmbedding({\n amplitude: this._amplitude,\n userId: opts.userId,\n model: opts.model,\n provider: opts.provider,\n latencyMs: opts.latencyMs,\n inputTokens: opts.inputTokens,\n dimensions: opts.dimensions,\n totalCostUsd: opts.totalCostUsd,\n sessionId: opts.sessionId,\n traceId: opts.traceId,\n turnId: opts.turnId,\n agentId: opts.agentId,\n parentAgentId: opts.parentAgentId,\n customerOrgId: opts.customerOrgId,\n agentVersion: opts.agentVersion,\n description: opts.description,\n context: opts.context,\n env: opts.env,\n eventProperties: opts.eventProperties,\n groups: opts.groups,\n privacyConfig: this._privacyConfig,\n });\n }\n\n trackSpan(opts: {\n userId: string;\n spanName: string;\n traceId: string;\n latencyMs: number;\n inputState?: Record<string, unknown> | null;\n outputState?: Record<string, unknown> | null;\n parentSpanId?: string | null;\n isError?: boolean;\n errorMessage?: string | null;\n sessionId?: string | null;\n turnId?: number | null;\n agentId?: string | null;\n parentAgentId?: string | null;\n customerOrgId?: string | null;\n agentVersion?: string | null;\n description?: string | null;\n context?: Record<string, unknown> | null;\n env?: string | null;\n eventProperties?: Record<string, unknown> | null;\n groups?: Record<string, unknown> | null;\n }): string {\n return trackSpan({\n amplitude: this._amplitude,\n userId: opts.userId,\n spanName: opts.spanName,\n traceId: opts.traceId,\n latencyMs: opts.latencyMs,\n inputState: opts.inputState,\n outputState: opts.outputState,\n parentSpanId: opts.parentSpanId,\n isError: opts.isError,\n errorMessage: opts.errorMessage,\n sessionId: opts.sessionId,\n turnId: opts.turnId,\n agentId: opts.agentId,\n parentAgentId: opts.parentAgentId,\n customerOrgId: opts.customerOrgId,\n agentVersion: opts.agentVersion,\n description: opts.description,\n context: opts.context,\n env: opts.env,\n eventProperties: opts.eventProperties,\n groups: opts.groups,\n privacyConfig: this._privacyConfig,\n });\n }\n\n // ---------------------------------------------------------------\n // Session Management\n // ---------------------------------------------------------------\n\n trackSessionEnd(opts: {\n userId: string;\n sessionId: string;\n enrichments?: SessionEnrichments | null;\n traceId?: string | null;\n turnId?: number | null;\n agentId?: string | null;\n parentAgentId?: string | null;\n customerOrgId?: string | null;\n agentVersion?: string | null;\n description?: string | null;\n context?: Record<string, unknown> | null;\n env?: string | null;\n abandonmentTurn?: number | null;\n idleTimeoutMinutes?: number | null;\n eventProperties?: Record<string, unknown> | null;\n groups?: Record<string, unknown> | null;\n }): void {\n trackSessionEnd({\n amplitude: this._amplitude,\n userId: opts.userId,\n sessionId: opts.sessionId,\n enrichments: opts.enrichments,\n traceId: opts.traceId,\n turnId: opts.turnId,\n agentId: opts.agentId,\n parentAgentId: opts.parentAgentId,\n customerOrgId: opts.customerOrgId,\n agentVersion: opts.agentVersion,\n description: opts.description,\n context: opts.context,\n env: opts.env,\n abandonmentTurn: opts.abandonmentTurn,\n idleTimeoutMinutes: opts.idleTimeoutMinutes,\n eventProperties: opts.eventProperties,\n groups: opts.groups,\n privacyConfig: this._privacyConfig,\n });\n this._sessionTurnCounters.delete(opts.sessionId);\n }\n\n trackSessionEnrichment(opts: {\n userId: string;\n sessionId: string;\n enrichments: SessionEnrichments;\n traceId?: string | null;\n turnId?: number | null;\n agentId?: string | null;\n parentAgentId?: string | null;\n customerOrgId?: string | null;\n agentVersion?: string | null;\n description?: string | null;\n context?: Record<string, unknown> | null;\n env?: string | null;\n eventProperties?: Record<string, unknown> | null;\n groups?: Record<string, unknown> | null;\n }): void {\n trackSessionEnrichment({\n amplitude: this._amplitude,\n userId: opts.userId,\n sessionId: opts.sessionId,\n enrichments: opts.enrichments,\n traceId: opts.traceId,\n turnId: opts.turnId,\n agentId: opts.agentId,\n parentAgentId: opts.parentAgentId,\n customerOrgId: opts.customerOrgId,\n agentVersion: opts.agentVersion,\n description: opts.description,\n context: opts.context,\n env: opts.env,\n eventProperties: opts.eventProperties,\n groups: opts.groups,\n privacyConfig: this._privacyConfig,\n });\n }\n\n // ---------------------------------------------------------------\n // Scoring\n // ---------------------------------------------------------------\n\n score(opts: {\n userId: string;\n name: string;\n value: number;\n targetId: string;\n targetType?: string;\n source?: string;\n comment?: string | null;\n sessionId?: string | null;\n traceId?: string | null;\n turnId?: number | null;\n agentId?: string | null;\n parentAgentId?: string | null;\n customerOrgId?: string | null;\n agentVersion?: string | null;\n description?: string | null;\n context?: Record<string, unknown> | null;\n env?: string | null;\n eventProperties?: Record<string, unknown> | null;\n groups?: Record<string, unknown> | null;\n }): void {\n trackScore({\n amplitude: this._amplitude,\n userId: opts.userId,\n name: opts.name,\n value: opts.value,\n targetId: opts.targetId,\n targetType: opts.targetType,\n source: opts.source,\n comment: opts.comment,\n sessionId: opts.sessionId,\n traceId: opts.traceId,\n turnId: opts.turnId,\n agentId: opts.agentId,\n parentAgentId: opts.parentAgentId,\n customerOrgId: opts.customerOrgId,\n agentVersion: opts.agentVersion,\n description: opts.description,\n context: opts.context,\n env: opts.env,\n eventProperties: opts.eventProperties,\n groups: opts.groups,\n privacyConfig: this._privacyConfig,\n });\n }\n\n // ---------------------------------------------------------------\n // Bound Agent Factory\n // ---------------------------------------------------------------\n\n agent(agentId: string, opts: AgentOptions = {}): BoundAgent {\n return new BoundAgent(this, { agentId, ...opts });\n }\n\n // ---------------------------------------------------------------\n // Tenant Factory\n // ---------------------------------------------------------------\n\n tenant(\n customerOrgId: string,\n opts: { groups?: Record<string, unknown> | null; env?: string | null } = {},\n ): TenantHandle {\n return new TenantHandle(this, { customerOrgId, ...opts });\n }\n\n // ---------------------------------------------------------------\n // Lifecycle\n // ---------------------------------------------------------------\n\n status(): Record<string, unknown> {\n const availableProviders: string[] = [];\n for (const mod of [\n 'openai',\n '@anthropic-ai/sdk',\n '@google/generative-ai',\n '@aws-sdk/client-bedrock-runtime',\n '@mistralai/mistralai',\n ]) {\n if (tryRequire(mod) != null) {\n const name =\n mod === '@anthropic-ai/sdk'\n ? 'anthropic'\n : mod === '@google/generative-ai'\n ? 'gemini'\n : mod === '@aws-sdk/client-bedrock-runtime'\n ? 'bedrock'\n : mod === '@mistralai/mistralai'\n ? 'mistral'\n : mod;\n availableProviders.push(name);\n if (mod === 'openai') {\n availableProviders.push('azure-openai');\n }\n }\n }\n\n return {\n content_mode: this._config.contentMode,\n debug: this._config.debug,\n dry_run: this._config.dryRun,\n redact_pii: this._config.redactPii,\n providers_available: availableProviders,\n patched_providers: patchedProviders(),\n };\n }\n\n flush(): unknown {\n this._trackCountSinceFlush = 0;\n return this._amplitude.flush();\n }\n\n shutdown(): void {\n _activeInstances.delete(this);\n this._trackCountSinceFlush = 0;\n if (this._ownsClient) {\n this._amplitude.shutdown?.();\n }\n }\n}\n"],"mappings":"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"}
|
package/dist/core/constants.d.ts
CHANGED
|
@@ -82,6 +82,9 @@ declare const PROP_TOTAL_ATTACHMENT_SIZE = "[Agent] Total Attachment Size Bytes"
|
|
|
82
82
|
declare const PROP_ATTACHMENTS = "[Agent] Attachments";
|
|
83
83
|
declare const PROP_MESSAGE_LABELS = "[Agent] Message Labels";
|
|
84
84
|
declare const PROP_MESSAGE_LABEL_MAP = "[Agent] Message Label Map";
|
|
85
|
+
declare const PROP_TOOL_DEFINITIONS = "[Agent] Tool Definitions";
|
|
86
|
+
declare const PROP_TOOL_DEFINITIONS_COUNT = "[Agent] Tool Definitions Count";
|
|
87
|
+
declare const PROP_TOOL_DEFINITIONS_HASH = "[Agent] Tool Definitions Hash";
|
|
85
88
|
declare const PROP_SESSION_REPLAY_ID = "[Amplitude] Session Replay ID";
|
|
86
89
|
declare const PROP_QUALITY_SCORE = "[Agent] Quality Score";
|
|
87
90
|
declare const PROP_SENTIMENT_SCORE = "[Agent] Sentiment Score";
|
|
@@ -94,5 +97,5 @@ declare const SDK_VERSION: string;
|
|
|
94
97
|
declare const SDK_RUNTIME = "node";
|
|
95
98
|
declare const MAX_SERIALIZED_LENGTH = 10000;
|
|
96
99
|
//#endregion
|
|
97
|
-
export { EVENT_AI_RESPONSE, EVENT_EMBEDDING, EVENT_SCORE, EVENT_SESSION_END, EVENT_SESSION_ENRICHMENT, EVENT_SPAN, EVENT_TOOL_CALL, EVENT_USER_MESSAGE, MAX_SERIALIZED_LENGTH, PROP_ABANDONMENT_TURN, PROP_AGENT_CHAIN, PROP_AGENT_DESCRIPTION, PROP_AGENT_ID, PROP_AGENT_VERSION, PROP_ATTACHMENTS, PROP_ATTACHMENT_COUNT, PROP_ATTACHMENT_TYPES, PROP_CACHE_CREATION_TOKENS, PROP_CACHE_READ_TOKENS, PROP_COMMENT, PROP_COMPONENT_TYPE, PROP_CONTEXT, PROP_COST_USD, PROP_CUSTOMER_ORG_ID, PROP_EDITED_MESSAGE_ID, PROP_EMBEDDING_DIMENSIONS, PROP_ENRICHMENTS, PROP_ENV, PROP_ERROR_MESSAGE, PROP_EVALUATION_SOURCE, PROP_FINISH_REASON, PROP_HAS_ATTACHMENTS, PROP_HAS_REASONING, PROP_IDLE_TIMEOUT_MINUTES, PROP_INPUT_STATE, PROP_INPUT_TOKENS, PROP_INVOCATION_ID, PROP_IS_EDIT, PROP_IS_ERROR, PROP_IS_REGENERATION, PROP_IS_STREAMING, PROP_LATENCY_MS, PROP_LOCALE, PROP_MAX_OUTPUT_TOKENS, PROP_MESSAGE_ID, PROP_MESSAGE_LABELS, PROP_MESSAGE_LABEL_MAP, PROP_MESSAGE_SOURCE, PROP_MODEL_NAME, PROP_MODEL_TIER, PROP_OUTPUT_STATE, PROP_OUTPUT_TOKENS, PROP_PARENT_AGENT_ID, PROP_PARENT_MESSAGE_ID, PROP_PARENT_SPAN_ID, PROP_PROMPT_ID, PROP_PROVIDER, PROP_QUALITY_SCORE, PROP_REASONING_CONTENT, PROP_REASONING_TOKENS, PROP_REQUEST_COMPLEXITY, PROP_ROOT_AGENT_NAME, PROP_RUNTIME, PROP_SCORE_NAME, PROP_SCORE_VALUE, PROP_SDK_VERSION, PROP_SENTIMENT_SCORE, PROP_SESSION_ID, PROP_SESSION_REPLAY_ID, PROP_SPAN_ID, PROP_SPAN_KIND, PROP_SPAN_NAME, PROP_SYSTEM_PROMPT, PROP_SYSTEM_PROMPT_LENGTH, PROP_TARGET_ID, PROP_TARGET_TYPE, PROP_TASK_FAILURE_REASON, PROP_TASK_FAILURE_TYPE, PROP_TEMPERATURE, PROP_TOOL_CALLS, PROP_TOOL_INPUT, PROP_TOOL_NAME, PROP_TOOL_OUTPUT, PROP_TOOL_SUCCESS, PROP_TOP_P, PROP_TOTAL_ATTACHMENT_SIZE, PROP_TOTAL_TOKENS, PROP_TRACE_ID, PROP_TTFB_MS, PROP_TURN_ID, PROP_WAS_CACHED, PROP_WAS_COPIED, SDK_RUNTIME, SDK_VERSION };
|
|
100
|
+
export { EVENT_AI_RESPONSE, EVENT_EMBEDDING, EVENT_SCORE, EVENT_SESSION_END, EVENT_SESSION_ENRICHMENT, EVENT_SPAN, EVENT_TOOL_CALL, EVENT_USER_MESSAGE, MAX_SERIALIZED_LENGTH, PROP_ABANDONMENT_TURN, PROP_AGENT_CHAIN, PROP_AGENT_DESCRIPTION, PROP_AGENT_ID, PROP_AGENT_VERSION, PROP_ATTACHMENTS, PROP_ATTACHMENT_COUNT, PROP_ATTACHMENT_TYPES, PROP_CACHE_CREATION_TOKENS, PROP_CACHE_READ_TOKENS, PROP_COMMENT, PROP_COMPONENT_TYPE, PROP_CONTEXT, PROP_COST_USD, PROP_CUSTOMER_ORG_ID, PROP_EDITED_MESSAGE_ID, PROP_EMBEDDING_DIMENSIONS, PROP_ENRICHMENTS, PROP_ENV, PROP_ERROR_MESSAGE, PROP_EVALUATION_SOURCE, PROP_FINISH_REASON, PROP_HAS_ATTACHMENTS, PROP_HAS_REASONING, PROP_IDLE_TIMEOUT_MINUTES, PROP_INPUT_STATE, PROP_INPUT_TOKENS, PROP_INVOCATION_ID, PROP_IS_EDIT, PROP_IS_ERROR, PROP_IS_REGENERATION, PROP_IS_STREAMING, PROP_LATENCY_MS, PROP_LOCALE, PROP_MAX_OUTPUT_TOKENS, PROP_MESSAGE_ID, PROP_MESSAGE_LABELS, PROP_MESSAGE_LABEL_MAP, PROP_MESSAGE_SOURCE, PROP_MODEL_NAME, PROP_MODEL_TIER, PROP_OUTPUT_STATE, PROP_OUTPUT_TOKENS, PROP_PARENT_AGENT_ID, PROP_PARENT_MESSAGE_ID, PROP_PARENT_SPAN_ID, PROP_PROMPT_ID, PROP_PROVIDER, PROP_QUALITY_SCORE, PROP_REASONING_CONTENT, PROP_REASONING_TOKENS, PROP_REQUEST_COMPLEXITY, PROP_ROOT_AGENT_NAME, PROP_RUNTIME, PROP_SCORE_NAME, PROP_SCORE_VALUE, PROP_SDK_VERSION, PROP_SENTIMENT_SCORE, PROP_SESSION_ID, PROP_SESSION_REPLAY_ID, PROP_SPAN_ID, PROP_SPAN_KIND, PROP_SPAN_NAME, PROP_SYSTEM_PROMPT, PROP_SYSTEM_PROMPT_LENGTH, PROP_TARGET_ID, PROP_TARGET_TYPE, PROP_TASK_FAILURE_REASON, PROP_TASK_FAILURE_TYPE, PROP_TEMPERATURE, PROP_TOOL_CALLS, PROP_TOOL_DEFINITIONS, PROP_TOOL_DEFINITIONS_COUNT, PROP_TOOL_DEFINITIONS_HASH, PROP_TOOL_INPUT, PROP_TOOL_NAME, PROP_TOOL_OUTPUT, PROP_TOOL_SUCCESS, PROP_TOP_P, PROP_TOTAL_ATTACHMENT_SIZE, PROP_TOTAL_TOKENS, PROP_TRACE_ID, PROP_TTFB_MS, PROP_TURN_ID, PROP_WAS_CACHED, PROP_WAS_COPIED, SDK_RUNTIME, SDK_VERSION };
|
|
98
101
|
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","names":[],"sources":["../../src/core/constants.ts"],"sourcesContent":[],"mappings":";cAIa,kBAAA;AAAA,cACA,iBAAA,GADkB,qBAAA;AAClB,cACA,eAAA,GADiB,mBAAA;AACjB,cACA,eAAA,GADe,mBAAA;AACf,cACA,UAAA,GADe,cAAA;AACf,cACA,iBAAA,GADU,qBAAA;AACV,cACA,wBAAA,GADiB,4BAAA;AACjB,cACA,WAAA,GADwB,eAAA;AACxB,cAGA,eAAA,GAHW,oBAAA;AAGX,cACA,aAAA,GADe,kBAAA;AACf,cACA,YAAA,GADa,iBAAA;AACb,cACA,eAAA,GADY,oBAAA;AACZ,cACA,eAAA,GADe,oBAAA;AACf,cACA,aAAA,GADe,kBAAA;AACf,cACA,eAAA,GADa,oBAAA;AACb,cACA,YAAA,GADe,iBAAA;AACf,cACA,iBAAA,GADY,sBAAA;AACZ,cACA,kBAAA,GADiB,uBAAA;AACjB,cACA,iBAAA,GADkB,sBAAA;AAClB,cACA,qBAAA,GADiB,0BAAA;AACjB,cACA,sBAAA,GADqB,2BAAA;AACrB,cACA,0BAAA,GADsB,+BAAA;AACtB,cACA,aAAA,GAD0B,kBAAA;AAC1B,cACA,aAAA,GADa,kBAAA;AACb,cACA,kBAAA,GADa,uBAAA;AACb,cACA,kBAAA,GADkB,uBAAA;AAClB,cACA,eAAA,GADkB,oBAAA;AAClB,cACA,cAAA,GADe,mBAAA;AACf,cACA,iBAAA,GADc,sBAAA;AACd,cACA,kBAAA,GADiB,uBAAA;AACjB,cACA,sBAAA,GADkB,2BAAA;AAClB,cACA,aAAA,GADsB,kBAAA;AACtB,cACA,oBAAA,GADa,yBAAA;AACb,cACA,eAAA,GADoB,oBAAA;AACpB,cACA,gBAAA,GADe,qBAAA;AACf,cACA,gBAAA,GADgB,qBAAA;AAChB,cACA,YAAA,GADgB,iBAAA;AAChB,cACA,QAAA,GADY,aAAA;AACZ,cACA,WAAA,GADQ,gBAAA;AACR,cACA,cAAA,GADW,mBAAA;AACX,cACA,mBAAA,GADc,wBAAA;AACd,cACA,oBAAA,GADmB,yBAAA;AACnB,cACA,kBAAA,GADoB,uBAAA;AACpB,cACA,sBAAA,GADkB,2BAAA;AAClB,cACA,mBAAA,GADsB,wBAAA;AACtB,cACA,YAAA,GADmB,iBAAA;AACnB,cAGA,YAAA,GAHY,iBAAA;AAGZ,cACA,cAAA,GADY,mBAAA;AACZ,cACA,mBAAA,GADc,wBAAA;AACd,cACA,gBAAA,GADmB,qBAAA;AACnB,cACA,iBAAA,GADgB,sBAAA;AAChB,cACA,yBAAA,GADiB,8BAAA;AACjB,cACA,gBAAA,GADyB,qBAAA;AACzB,cACA,eAAA,GADgB,oBAAA;AAChB,cACA,gBAAA,GADe,qBAAA;AACf,cACA,cAAA,GADgB,mBAAA;AAChB,cACA,gBAAA,GADc,qBAAA;AACd,cACA,sBAAA,GADgB,2BAAA;AAChB,cACA,YAAA,GADsB,iBAAA;AACtB,cACA,kBAAA,GADY,uBAAA;AACZ,cACA,sBAAA,GADkB,2BAAA;AAClB,cACA,yBAAA,GADsB,sCAAA;AACtB,cAGA,kBAAA,GAHyB,uBAAA;AAGzB,cACA,yBAAA,GADkB,8BAAA;AAClB,cACA,gBAAA,GADyB,qBAAA;AACzB,cACA,sBAAA,GADgB,2BAAA;AAChB,cACA,UAAA,GADsB,eAAA;AACtB,cACA,iBAAA,GADU,sBAAA;AACV,cACA,cAAA,GADiB,mBAAA;AACjB,cAGA,oBAAA,GAHc,yBAAA;AAGd,cACA,YAAA,GADoB,iBAAA;AACpB,cACA,sBAAA,GADY,2BAAA;AACZ,cACA,eAAA,GADsB,oBAAA;AACtB,cACA,qBAAA,GADe,0BAAA;AACf,cAGA,eAAA,GAHqB,oBAAA;AAGrB,cACA,eAAA,GADe,oBAAA;AACf,cACA,oBAAA,GADe,yBAAA;AACf,cACA,qBAAA,GADoB,0BAAA;AACpB,cACA,qBAAA,GADqB,0BAAA;AACrB,cACA,0BAAA,GADqB,qCAAA;AACrB,cACA,gBAAA,GAD0B,qBAAA;AAC1B,cAGA,mBAAA,GAHgB,wBAAA;AAGhB,cACA,sBAAA,GADmB,2BAAA;AACnB,cAGA,
|
|
1
|
+
{"version":3,"file":"constants.d.ts","names":[],"sources":["../../src/core/constants.ts"],"sourcesContent":[],"mappings":";cAIa,kBAAA;AAAA,cACA,iBAAA,GADkB,qBAAA;AAClB,cACA,eAAA,GADiB,mBAAA;AACjB,cACA,eAAA,GADe,mBAAA;AACf,cACA,UAAA,GADe,cAAA;AACf,cACA,iBAAA,GADU,qBAAA;AACV,cACA,wBAAA,GADiB,4BAAA;AACjB,cACA,WAAA,GADwB,eAAA;AACxB,cAGA,eAAA,GAHW,oBAAA;AAGX,cACA,aAAA,GADe,kBAAA;AACf,cACA,YAAA,GADa,iBAAA;AACb,cACA,eAAA,GADY,oBAAA;AACZ,cACA,eAAA,GADe,oBAAA;AACf,cACA,aAAA,GADe,kBAAA;AACf,cACA,eAAA,GADa,oBAAA;AACb,cACA,YAAA,GADe,iBAAA;AACf,cACA,iBAAA,GADY,sBAAA;AACZ,cACA,kBAAA,GADiB,uBAAA;AACjB,cACA,iBAAA,GADkB,sBAAA;AAClB,cACA,qBAAA,GADiB,0BAAA;AACjB,cACA,sBAAA,GADqB,2BAAA;AACrB,cACA,0BAAA,GADsB,+BAAA;AACtB,cACA,aAAA,GAD0B,kBAAA;AAC1B,cACA,aAAA,GADa,kBAAA;AACb,cACA,kBAAA,GADa,uBAAA;AACb,cACA,kBAAA,GADkB,uBAAA;AAClB,cACA,eAAA,GADkB,oBAAA;AAClB,cACA,cAAA,GADe,mBAAA;AACf,cACA,iBAAA,GADc,sBAAA;AACd,cACA,kBAAA,GADiB,uBAAA;AACjB,cACA,sBAAA,GADkB,2BAAA;AAClB,cACA,aAAA,GADsB,kBAAA;AACtB,cACA,oBAAA,GADa,yBAAA;AACb,cACA,eAAA,GADoB,oBAAA;AACpB,cACA,gBAAA,GADe,qBAAA;AACf,cACA,gBAAA,GADgB,qBAAA;AAChB,cACA,YAAA,GADgB,iBAAA;AAChB,cACA,QAAA,GADY,aAAA;AACZ,cACA,WAAA,GADQ,gBAAA;AACR,cACA,cAAA,GADW,mBAAA;AACX,cACA,mBAAA,GADc,wBAAA;AACd,cACA,oBAAA,GADmB,yBAAA;AACnB,cACA,kBAAA,GADoB,uBAAA;AACpB,cACA,sBAAA,GADkB,2BAAA;AAClB,cACA,mBAAA,GADsB,wBAAA;AACtB,cACA,YAAA,GADmB,iBAAA;AACnB,cAGA,YAAA,GAHY,iBAAA;AAGZ,cACA,cAAA,GADY,mBAAA;AACZ,cACA,mBAAA,GADc,wBAAA;AACd,cACA,gBAAA,GADmB,qBAAA;AACnB,cACA,iBAAA,GADgB,sBAAA;AAChB,cACA,yBAAA,GADiB,8BAAA;AACjB,cACA,gBAAA,GADyB,qBAAA;AACzB,cACA,eAAA,GADgB,oBAAA;AAChB,cACA,gBAAA,GADe,qBAAA;AACf,cACA,cAAA,GADgB,mBAAA;AAChB,cACA,gBAAA,GADc,qBAAA;AACd,cACA,sBAAA,GADgB,2BAAA;AAChB,cACA,YAAA,GADsB,iBAAA;AACtB,cACA,kBAAA,GADY,uBAAA;AACZ,cACA,sBAAA,GADkB,2BAAA;AAClB,cACA,yBAAA,GADsB,sCAAA;AACtB,cAGA,kBAAA,GAHyB,uBAAA;AAGzB,cACA,yBAAA,GADkB,8BAAA;AAClB,cACA,gBAAA,GADyB,qBAAA;AACzB,cACA,sBAAA,GADgB,2BAAA;AAChB,cACA,UAAA,GADsB,eAAA;AACtB,cACA,iBAAA,GADU,sBAAA;AACV,cACA,cAAA,GADiB,mBAAA;AACjB,cAGA,oBAAA,GAHc,yBAAA;AAGd,cACA,YAAA,GADoB,iBAAA;AACpB,cACA,sBAAA,GADY,2BAAA;AACZ,cACA,eAAA,GADsB,oBAAA;AACtB,cACA,qBAAA,GADe,0BAAA;AACf,cAGA,eAAA,GAHqB,oBAAA;AAGrB,cACA,eAAA,GADe,oBAAA;AACf,cACA,oBAAA,GADe,yBAAA;AACf,cACA,qBAAA,GADoB,0BAAA;AACpB,cACA,qBAAA,GADqB,0BAAA;AACrB,cACA,0BAAA,GADqB,qCAAA;AACrB,cACA,gBAAA,GAD0B,qBAAA;AAC1B,cAGA,mBAAA,GAHgB,wBAAA;AAGhB,cACA,sBAAA,GADmB,2BAAA;AACnB,cAGA,qBAAA,GAHsB,0BAAA;AAGtB,cACA,2BAAA,GADqB,gCAAA;AACrB,cACA,0BAAA,GAD2B,+BAAA;AAC3B,cAGA,sBAAA,GAH0B,+BAAA;AAG1B,cAGA,kBAAA,GAHsB,uBAAA;AAGtB,cACA,oBAAA,GADkB,yBAAA;AAClB,cACA,sBAAA,GADoB,2BAAA;AACpB,cACA,wBAAA,GADsB,6BAAA;AACtB,cACA,gBAAA,GADwB,qBAAA;AACxB,cACA,oBAAA,GADgB,yBAAA;AAChB,cACA,uBAAA,GADoB,4BAAA;AACpB,cAUA,WAVuB,EAAA,MAAA;AAUvB,cACA,WAAA,GADiC,MAAA;AACjC,cAGA,qBAAA,GAHW,KAAA"}
|
package/dist/core/constants.js
CHANGED
|
@@ -84,6 +84,9 @@ const PROP_TOTAL_ATTACHMENT_SIZE = "[Agent] Total Attachment Size Bytes";
|
|
|
84
84
|
const PROP_ATTACHMENTS = "[Agent] Attachments";
|
|
85
85
|
const PROP_MESSAGE_LABELS = "[Agent] Message Labels";
|
|
86
86
|
const PROP_MESSAGE_LABEL_MAP = "[Agent] Message Label Map";
|
|
87
|
+
const PROP_TOOL_DEFINITIONS = "[Agent] Tool Definitions";
|
|
88
|
+
const PROP_TOOL_DEFINITIONS_COUNT = "[Agent] Tool Definitions Count";
|
|
89
|
+
const PROP_TOOL_DEFINITIONS_HASH = "[Agent] Tool Definitions Hash";
|
|
87
90
|
const PROP_SESSION_REPLAY_ID = "[Amplitude] Session Replay ID";
|
|
88
91
|
const PROP_QUALITY_SCORE = "[Agent] Quality Score";
|
|
89
92
|
const PROP_SENTIMENT_SCORE = "[Agent] Sentiment Score";
|
|
@@ -103,5 +106,5 @@ const SDK_RUNTIME = "node";
|
|
|
103
106
|
const MAX_SERIALIZED_LENGTH = 1e4;
|
|
104
107
|
|
|
105
108
|
//#endregion
|
|
106
|
-
export { EVENT_AI_RESPONSE, EVENT_EMBEDDING, EVENT_SCORE, EVENT_SESSION_END, EVENT_SESSION_ENRICHMENT, EVENT_SPAN, EVENT_TOOL_CALL, EVENT_USER_MESSAGE, MAX_SERIALIZED_LENGTH, PROP_ABANDONMENT_TURN, PROP_AGENT_CHAIN, PROP_AGENT_DESCRIPTION, PROP_AGENT_ID, PROP_AGENT_VERSION, PROP_ATTACHMENTS, PROP_ATTACHMENT_COUNT, PROP_ATTACHMENT_TYPES, PROP_CACHE_CREATION_TOKENS, PROP_CACHE_READ_TOKENS, PROP_COMMENT, PROP_COMPONENT_TYPE, PROP_CONTEXT, PROP_COST_USD, PROP_CUSTOMER_ORG_ID, PROP_EDITED_MESSAGE_ID, PROP_EMBEDDING_DIMENSIONS, PROP_ENRICHMENTS, PROP_ENV, PROP_ERROR_MESSAGE, PROP_EVALUATION_SOURCE, PROP_FINISH_REASON, PROP_HAS_ATTACHMENTS, PROP_HAS_REASONING, PROP_IDLE_TIMEOUT_MINUTES, PROP_INPUT_STATE, PROP_INPUT_TOKENS, PROP_INVOCATION_ID, PROP_IS_EDIT, PROP_IS_ERROR, PROP_IS_REGENERATION, PROP_IS_STREAMING, PROP_LATENCY_MS, PROP_LOCALE, PROP_MAX_OUTPUT_TOKENS, PROP_MESSAGE_ID, PROP_MESSAGE_LABELS, PROP_MESSAGE_LABEL_MAP, PROP_MESSAGE_SOURCE, PROP_MODEL_NAME, PROP_MODEL_TIER, PROP_OUTPUT_STATE, PROP_OUTPUT_TOKENS, PROP_PARENT_AGENT_ID, PROP_PARENT_MESSAGE_ID, PROP_PARENT_SPAN_ID, PROP_PROMPT_ID, PROP_PROVIDER, PROP_QUALITY_SCORE, PROP_REASONING_CONTENT, PROP_REASONING_TOKENS, PROP_REQUEST_COMPLEXITY, PROP_ROOT_AGENT_NAME, PROP_RUNTIME, PROP_SCORE_NAME, PROP_SCORE_VALUE, PROP_SDK_VERSION, PROP_SENTIMENT_SCORE, PROP_SESSION_ID, PROP_SESSION_REPLAY_ID, PROP_SPAN_ID, PROP_SPAN_KIND, PROP_SPAN_NAME, PROP_SYSTEM_PROMPT, PROP_SYSTEM_PROMPT_LENGTH, PROP_TARGET_ID, PROP_TARGET_TYPE, PROP_TASK_FAILURE_REASON, PROP_TASK_FAILURE_TYPE, PROP_TEMPERATURE, PROP_TOOL_CALLS, PROP_TOOL_INPUT, PROP_TOOL_NAME, PROP_TOOL_OUTPUT, PROP_TOOL_SUCCESS, PROP_TOP_P, PROP_TOTAL_ATTACHMENT_SIZE, PROP_TOTAL_TOKENS, PROP_TRACE_ID, PROP_TTFB_MS, PROP_TURN_ID, PROP_WAS_CACHED, PROP_WAS_COPIED, SDK_RUNTIME, SDK_VERSION };
|
|
109
|
+
export { EVENT_AI_RESPONSE, EVENT_EMBEDDING, EVENT_SCORE, EVENT_SESSION_END, EVENT_SESSION_ENRICHMENT, EVENT_SPAN, EVENT_TOOL_CALL, EVENT_USER_MESSAGE, MAX_SERIALIZED_LENGTH, PROP_ABANDONMENT_TURN, PROP_AGENT_CHAIN, PROP_AGENT_DESCRIPTION, PROP_AGENT_ID, PROP_AGENT_VERSION, PROP_ATTACHMENTS, PROP_ATTACHMENT_COUNT, PROP_ATTACHMENT_TYPES, PROP_CACHE_CREATION_TOKENS, PROP_CACHE_READ_TOKENS, PROP_COMMENT, PROP_COMPONENT_TYPE, PROP_CONTEXT, PROP_COST_USD, PROP_CUSTOMER_ORG_ID, PROP_EDITED_MESSAGE_ID, PROP_EMBEDDING_DIMENSIONS, PROP_ENRICHMENTS, PROP_ENV, PROP_ERROR_MESSAGE, PROP_EVALUATION_SOURCE, PROP_FINISH_REASON, PROP_HAS_ATTACHMENTS, PROP_HAS_REASONING, PROP_IDLE_TIMEOUT_MINUTES, PROP_INPUT_STATE, PROP_INPUT_TOKENS, PROP_INVOCATION_ID, PROP_IS_EDIT, PROP_IS_ERROR, PROP_IS_REGENERATION, PROP_IS_STREAMING, PROP_LATENCY_MS, PROP_LOCALE, PROP_MAX_OUTPUT_TOKENS, PROP_MESSAGE_ID, PROP_MESSAGE_LABELS, PROP_MESSAGE_LABEL_MAP, PROP_MESSAGE_SOURCE, PROP_MODEL_NAME, PROP_MODEL_TIER, PROP_OUTPUT_STATE, PROP_OUTPUT_TOKENS, PROP_PARENT_AGENT_ID, PROP_PARENT_MESSAGE_ID, PROP_PARENT_SPAN_ID, PROP_PROMPT_ID, PROP_PROVIDER, PROP_QUALITY_SCORE, PROP_REASONING_CONTENT, PROP_REASONING_TOKENS, PROP_REQUEST_COMPLEXITY, PROP_ROOT_AGENT_NAME, PROP_RUNTIME, PROP_SCORE_NAME, PROP_SCORE_VALUE, PROP_SDK_VERSION, PROP_SENTIMENT_SCORE, PROP_SESSION_ID, PROP_SESSION_REPLAY_ID, PROP_SPAN_ID, PROP_SPAN_KIND, PROP_SPAN_NAME, PROP_SYSTEM_PROMPT, PROP_SYSTEM_PROMPT_LENGTH, PROP_TARGET_ID, PROP_TARGET_TYPE, PROP_TASK_FAILURE_REASON, PROP_TASK_FAILURE_TYPE, PROP_TEMPERATURE, PROP_TOOL_CALLS, PROP_TOOL_DEFINITIONS, PROP_TOOL_DEFINITIONS_COUNT, PROP_TOOL_DEFINITIONS_HASH, PROP_TOOL_INPUT, PROP_TOOL_NAME, PROP_TOOL_OUTPUT, PROP_TOOL_SUCCESS, PROP_TOP_P, PROP_TOTAL_ATTACHMENT_SIZE, PROP_TOTAL_TOKENS, PROP_TRACE_ID, PROP_TTFB_MS, PROP_TURN_ID, PROP_WAS_CACHED, PROP_WAS_COPIED, SDK_RUNTIME, SDK_VERSION };
|
|
107
110
|
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","names":["SDK_VERSION: string"],"sources":["../../src/core/constants.ts"],"sourcesContent":["// SDK metadata — version read from package.json to stay in sync\nimport { createRequire } from 'node:module';\n\n// Event type constants — must be byte-identical to Python SDK\nexport const EVENT_USER_MESSAGE = '[Agent] User Message';\nexport const EVENT_AI_RESPONSE = '[Agent] AI Response';\nexport const EVENT_TOOL_CALL = '[Agent] Tool Call';\nexport const EVENT_EMBEDDING = '[Agent] Embedding';\nexport const EVENT_SPAN = '[Agent] Span';\nexport const EVENT_SESSION_END = '[Agent] Session End';\nexport const EVENT_SESSION_ENRICHMENT = '[Agent] Session Enrichment';\nexport const EVENT_SCORE = '[Agent] Score';\n\n// Property name constants — must be byte-identical to Python SDK\nexport const PROP_SESSION_ID = '[Agent] Session ID';\nexport const PROP_TRACE_ID = '[Agent] Trace ID';\nexport const PROP_TURN_ID = '[Agent] Turn ID';\nexport const PROP_MESSAGE_ID = '[Agent] Message ID';\nexport const PROP_MODEL_NAME = '[Agent] Model Name';\nexport const PROP_PROVIDER = '[Agent] Provider';\nexport const PROP_LATENCY_MS = '[Agent] Latency Ms';\nexport const PROP_TTFB_MS = '[Agent] TTFB Ms';\nexport const PROP_INPUT_TOKENS = '[Agent] Input Tokens';\nexport const PROP_OUTPUT_TOKENS = '[Agent] Output Tokens';\nexport const PROP_TOTAL_TOKENS = '[Agent] Total Tokens';\nexport const PROP_REASONING_TOKENS = '[Agent] Reasoning Tokens';\nexport const PROP_CACHE_READ_TOKENS = '[Agent] Cache Read Tokens';\nexport const PROP_CACHE_CREATION_TOKENS = '[Agent] Cache Creation Tokens';\nexport const PROP_COST_USD = '[Agent] Cost USD';\nexport const PROP_IS_ERROR = '[Agent] Is Error';\nexport const PROP_ERROR_MESSAGE = '[Agent] Error Message';\nexport const PROP_FINISH_REASON = '[Agent] Finish Reason';\nexport const PROP_TOOL_CALLS = '[Agent] Tool Calls';\nexport const PROP_TOOL_NAME = '[Agent] Tool Name';\nexport const PROP_TOOL_SUCCESS = '[Agent] Tool Success';\nexport const PROP_INVOCATION_ID = '[Agent] Invocation ID';\nexport const PROP_PARENT_MESSAGE_ID = '[Agent] Parent Message ID';\nexport const PROP_AGENT_ID = '[Agent] Agent ID';\nexport const PROP_PARENT_AGENT_ID = '[Agent] Parent Agent ID';\nexport const PROP_TOOL_INPUT = '[Agent] Tool Input';\nexport const PROP_TOOL_OUTPUT = '[Agent] Tool Output';\nexport const PROP_SDK_VERSION = '[Agent] SDK Version';\nexport const PROP_RUNTIME = '[Agent] Runtime';\nexport const PROP_ENV = '[Agent] Env';\nexport const PROP_LOCALE = '[Agent] Locale';\nexport const PROP_SPAN_KIND = '[Agent] Span Kind';\nexport const PROP_COMPONENT_TYPE = '[Agent] Component Type';\nexport const PROP_CUSTOMER_ORG_ID = '[Agent] Customer Org ID';\nexport const PROP_AGENT_VERSION = '[Agent] Agent Version';\nexport const PROP_AGENT_DESCRIPTION = '[Agent] Agent Description';\nexport const PROP_MESSAGE_SOURCE = '[Agent] Message Source';\nexport const PROP_CONTEXT = '[Agent] Context';\n\n// v0.3.0 properties\nexport const PROP_SPAN_ID = '[Agent] Span ID';\nexport const PROP_SPAN_NAME = '[Agent] Span Name';\nexport const PROP_PARENT_SPAN_ID = '[Agent] Parent Span ID';\nexport const PROP_INPUT_STATE = '[Agent] Input State';\nexport const PROP_OUTPUT_STATE = '[Agent] Output State';\nexport const PROP_EMBEDDING_DIMENSIONS = '[Agent] Embedding Dimensions';\nexport const PROP_ENRICHMENTS = '[Agent] Enrichments';\nexport const PROP_SCORE_NAME = '[Agent] Score Name';\nexport const PROP_SCORE_VALUE = '[Agent] Score Value';\nexport const PROP_TARGET_ID = '[Agent] Target ID';\nexport const PROP_TARGET_TYPE = '[Agent] Target Type';\nexport const PROP_EVALUATION_SOURCE = '[Agent] Evaluation Source';\nexport const PROP_COMMENT = '[Agent] Comment';\nexport const PROP_HAS_REASONING = '[Agent] Has Reasoning';\nexport const PROP_REASONING_CONTENT = '[Agent] Reasoning Content';\nexport const PROP_IDLE_TIMEOUT_MINUTES = '[Agent] Session Idle Timeout Minutes';\n\n// Model configuration constants (v0.4.0)\nexport const PROP_SYSTEM_PROMPT = '[Agent] System Prompt';\nexport const PROP_SYSTEM_PROMPT_LENGTH = '[Agent] System Prompt Length';\nexport const PROP_TEMPERATURE = '[Agent] Temperature';\nexport const PROP_MAX_OUTPUT_TOKENS = '[Agent] Max Output Tokens';\nexport const PROP_TOP_P = '[Agent] Top P';\nexport const PROP_IS_STREAMING = '[Agent] Is Streaming';\nexport const PROP_PROMPT_ID = '[Agent] Prompt ID';\n\n// Implicit feedback constants (v0.5.0)\nexport const PROP_IS_REGENERATION = '[Agent] Is Regeneration';\nexport const PROP_IS_EDIT = '[Agent] Is Edit';\nexport const PROP_EDITED_MESSAGE_ID = '[Agent] Edited Message ID';\nexport const PROP_WAS_COPIED = '[Agent] Was Copied';\nexport const PROP_ABANDONMENT_TURN = '[Agent] Abandonment Turn';\n\n// Attachment constants (v0.5.0)\nexport const PROP_WAS_CACHED = '[Agent] Was Cached';\nexport const PROP_MODEL_TIER = '[Agent] Model Tier';\nexport const PROP_HAS_ATTACHMENTS = '[Agent] Has Attachments';\nexport const PROP_ATTACHMENT_TYPES = '[Agent] Attachment Types';\nexport const PROP_ATTACHMENT_COUNT = '[Agent] Attachment Count';\nexport const PROP_TOTAL_ATTACHMENT_SIZE = '[Agent] Total Attachment Size Bytes';\nexport const PROP_ATTACHMENTS = '[Agent] Attachments';\n\n// Message label constants (v0.6.0)\nexport const PROP_MESSAGE_LABELS = '[Agent] Message Labels';\nexport const PROP_MESSAGE_LABEL_MAP = '[Agent] Message Label Map';\n\n// Session replay linking (v0.7.0)\nexport const PROP_SESSION_REPLAY_ID = '[Amplitude] Session Replay ID';\n\n// Session-level enrichment property constants (v0.6.0)\nexport const PROP_QUALITY_SCORE = '[Agent] Quality Score';\nexport const PROP_SENTIMENT_SCORE = '[Agent] Sentiment Score';\nexport const PROP_TASK_FAILURE_TYPE = '[Agent] Task Failure Type';\nexport const PROP_TASK_FAILURE_REASON = '[Agent] Task Failure Reason';\nexport const PROP_AGENT_CHAIN = '[Agent] Agent Chain';\nexport const PROP_ROOT_AGENT_NAME = '[Agent] Root Agent Name';\nexport const PROP_REQUEST_COMPLEXITY = '[Agent] Request Complexity';\n\nconst _require = createRequire(import.meta.url);\nlet _sdkVersion = '0.1.0';\ntry {\n const pkg = _require('../../package.json') as { version?: string };\n if (pkg.version) _sdkVersion = pkg.version;\n} catch {\n // Fallback to hardcoded version when running outside the package\n}\nexport const SDK_VERSION: string = _sdkVersion;\nexport const SDK_RUNTIME = 'node';\n\n// Serialization limits\nexport const MAX_SERIALIZED_LENGTH = 10000;\n"],"mappings":";;;AAIA,MAAa,qBAAqB;AAClC,MAAa,oBAAoB;AACjC,MAAa,kBAAkB;AAC/B,MAAa,kBAAkB;AAC/B,MAAa,aAAa;AAC1B,MAAa,oBAAoB;AACjC,MAAa,2BAA2B;AACxC,MAAa,cAAc;AAG3B,MAAa,kBAAkB;AAC/B,MAAa,gBAAgB;AAC7B,MAAa,eAAe;AAC5B,MAAa,kBAAkB;AAC/B,MAAa,kBAAkB;AAC/B,MAAa,gBAAgB;AAC7B,MAAa,kBAAkB;AAC/B,MAAa,eAAe;AAC5B,MAAa,oBAAoB;AACjC,MAAa,qBAAqB;AAClC,MAAa,oBAAoB;AACjC,MAAa,wBAAwB;AACrC,MAAa,yBAAyB;AACtC,MAAa,6BAA6B;AAC1C,MAAa,gBAAgB;AAC7B,MAAa,gBAAgB;AAC7B,MAAa,qBAAqB;AAClC,MAAa,qBAAqB;AAClC,MAAa,kBAAkB;AAC/B,MAAa,iBAAiB;AAC9B,MAAa,oBAAoB;AACjC,MAAa,qBAAqB;AAClC,MAAa,yBAAyB;AACtC,MAAa,gBAAgB;AAC7B,MAAa,uBAAuB;AACpC,MAAa,kBAAkB;AAC/B,MAAa,mBAAmB;AAChC,MAAa,mBAAmB;AAChC,MAAa,eAAe;AAC5B,MAAa,WAAW;AACxB,MAAa,cAAc;AAC3B,MAAa,iBAAiB;AAC9B,MAAa,sBAAsB;AACnC,MAAa,uBAAuB;AACpC,MAAa,qBAAqB;AAClC,MAAa,yBAAyB;AACtC,MAAa,sBAAsB;AACnC,MAAa,eAAe;AAG5B,MAAa,eAAe;AAC5B,MAAa,iBAAiB;AAC9B,MAAa,sBAAsB;AACnC,MAAa,mBAAmB;AAChC,MAAa,oBAAoB;AACjC,MAAa,4BAA4B;AACzC,MAAa,mBAAmB;AAChC,MAAa,kBAAkB;AAC/B,MAAa,mBAAmB;AAChC,MAAa,iBAAiB;AAC9B,MAAa,mBAAmB;AAChC,MAAa,yBAAyB;AACtC,MAAa,eAAe;AAC5B,MAAa,qBAAqB;AAClC,MAAa,yBAAyB;AACtC,MAAa,4BAA4B;AAGzC,MAAa,qBAAqB;AAClC,MAAa,4BAA4B;AACzC,MAAa,mBAAmB;AAChC,MAAa,yBAAyB;AACtC,MAAa,aAAa;AAC1B,MAAa,oBAAoB;AACjC,MAAa,iBAAiB;AAG9B,MAAa,uBAAuB;AACpC,MAAa,eAAe;AAC5B,MAAa,yBAAyB;AACtC,MAAa,kBAAkB;AAC/B,MAAa,wBAAwB;AAGrC,MAAa,kBAAkB;AAC/B,MAAa,kBAAkB;AAC/B,MAAa,uBAAuB;AACpC,MAAa,wBAAwB;AACrC,MAAa,wBAAwB;AACrC,MAAa,6BAA6B;AAC1C,MAAa,mBAAmB;AAGhC,MAAa,sBAAsB;AACnC,MAAa,yBAAyB;AAGtC,MAAa,yBAAyB;AAGtC,MAAa,qBAAqB;AAClC,MAAa,uBAAuB;AACpC,MAAa,yBAAyB;AACtC,MAAa,2BAA2B;AACxC,MAAa,mBAAmB;AAChC,MAAa,uBAAuB;AACpC,MAAa,0BAA0B;AAEvC,MAAM,WAAW,cAAc,OAAO,KAAK,IAAI;AAC/C,IAAI,cAAc;AAClB,IAAI;CACF,MAAM,MAAM,SAAS,qBAAqB;AAC1C,KAAI,IAAI,QAAS,eAAc,IAAI;QAC7B;AAGR,MAAaA,cAAsB;AACnC,MAAa,cAAc;AAG3B,MAAa,wBAAwB"}
|
|
1
|
+
{"version":3,"file":"constants.js","names":["SDK_VERSION: string"],"sources":["../../src/core/constants.ts"],"sourcesContent":["// SDK metadata — version read from package.json to stay in sync\nimport { createRequire } from 'node:module';\n\n// Event type constants — must be byte-identical to Python SDK\nexport const EVENT_USER_MESSAGE = '[Agent] User Message';\nexport const EVENT_AI_RESPONSE = '[Agent] AI Response';\nexport const EVENT_TOOL_CALL = '[Agent] Tool Call';\nexport const EVENT_EMBEDDING = '[Agent] Embedding';\nexport const EVENT_SPAN = '[Agent] Span';\nexport const EVENT_SESSION_END = '[Agent] Session End';\nexport const EVENT_SESSION_ENRICHMENT = '[Agent] Session Enrichment';\nexport const EVENT_SCORE = '[Agent] Score';\n\n// Property name constants — must be byte-identical to Python SDK\nexport const PROP_SESSION_ID = '[Agent] Session ID';\nexport const PROP_TRACE_ID = '[Agent] Trace ID';\nexport const PROP_TURN_ID = '[Agent] Turn ID';\nexport const PROP_MESSAGE_ID = '[Agent] Message ID';\nexport const PROP_MODEL_NAME = '[Agent] Model Name';\nexport const PROP_PROVIDER = '[Agent] Provider';\nexport const PROP_LATENCY_MS = '[Agent] Latency Ms';\nexport const PROP_TTFB_MS = '[Agent] TTFB Ms';\nexport const PROP_INPUT_TOKENS = '[Agent] Input Tokens';\nexport const PROP_OUTPUT_TOKENS = '[Agent] Output Tokens';\nexport const PROP_TOTAL_TOKENS = '[Agent] Total Tokens';\nexport const PROP_REASONING_TOKENS = '[Agent] Reasoning Tokens';\nexport const PROP_CACHE_READ_TOKENS = '[Agent] Cache Read Tokens';\nexport const PROP_CACHE_CREATION_TOKENS = '[Agent] Cache Creation Tokens';\nexport const PROP_COST_USD = '[Agent] Cost USD';\nexport const PROP_IS_ERROR = '[Agent] Is Error';\nexport const PROP_ERROR_MESSAGE = '[Agent] Error Message';\nexport const PROP_FINISH_REASON = '[Agent] Finish Reason';\nexport const PROP_TOOL_CALLS = '[Agent] Tool Calls';\nexport const PROP_TOOL_NAME = '[Agent] Tool Name';\nexport const PROP_TOOL_SUCCESS = '[Agent] Tool Success';\nexport const PROP_INVOCATION_ID = '[Agent] Invocation ID';\nexport const PROP_PARENT_MESSAGE_ID = '[Agent] Parent Message ID';\nexport const PROP_AGENT_ID = '[Agent] Agent ID';\nexport const PROP_PARENT_AGENT_ID = '[Agent] Parent Agent ID';\nexport const PROP_TOOL_INPUT = '[Agent] Tool Input';\nexport const PROP_TOOL_OUTPUT = '[Agent] Tool Output';\nexport const PROP_SDK_VERSION = '[Agent] SDK Version';\nexport const PROP_RUNTIME = '[Agent] Runtime';\nexport const PROP_ENV = '[Agent] Env';\nexport const PROP_LOCALE = '[Agent] Locale';\nexport const PROP_SPAN_KIND = '[Agent] Span Kind';\nexport const PROP_COMPONENT_TYPE = '[Agent] Component Type';\nexport const PROP_CUSTOMER_ORG_ID = '[Agent] Customer Org ID';\nexport const PROP_AGENT_VERSION = '[Agent] Agent Version';\nexport const PROP_AGENT_DESCRIPTION = '[Agent] Agent Description';\nexport const PROP_MESSAGE_SOURCE = '[Agent] Message Source';\nexport const PROP_CONTEXT = '[Agent] Context';\n\n// v0.3.0 properties\nexport const PROP_SPAN_ID = '[Agent] Span ID';\nexport const PROP_SPAN_NAME = '[Agent] Span Name';\nexport const PROP_PARENT_SPAN_ID = '[Agent] Parent Span ID';\nexport const PROP_INPUT_STATE = '[Agent] Input State';\nexport const PROP_OUTPUT_STATE = '[Agent] Output State';\nexport const PROP_EMBEDDING_DIMENSIONS = '[Agent] Embedding Dimensions';\nexport const PROP_ENRICHMENTS = '[Agent] Enrichments';\nexport const PROP_SCORE_NAME = '[Agent] Score Name';\nexport const PROP_SCORE_VALUE = '[Agent] Score Value';\nexport const PROP_TARGET_ID = '[Agent] Target ID';\nexport const PROP_TARGET_TYPE = '[Agent] Target Type';\nexport const PROP_EVALUATION_SOURCE = '[Agent] Evaluation Source';\nexport const PROP_COMMENT = '[Agent] Comment';\nexport const PROP_HAS_REASONING = '[Agent] Has Reasoning';\nexport const PROP_REASONING_CONTENT = '[Agent] Reasoning Content';\nexport const PROP_IDLE_TIMEOUT_MINUTES = '[Agent] Session Idle Timeout Minutes';\n\n// Model configuration constants (v0.4.0)\nexport const PROP_SYSTEM_PROMPT = '[Agent] System Prompt';\nexport const PROP_SYSTEM_PROMPT_LENGTH = '[Agent] System Prompt Length';\nexport const PROP_TEMPERATURE = '[Agent] Temperature';\nexport const PROP_MAX_OUTPUT_TOKENS = '[Agent] Max Output Tokens';\nexport const PROP_TOP_P = '[Agent] Top P';\nexport const PROP_IS_STREAMING = '[Agent] Is Streaming';\nexport const PROP_PROMPT_ID = '[Agent] Prompt ID';\n\n// Implicit feedback constants (v0.5.0)\nexport const PROP_IS_REGENERATION = '[Agent] Is Regeneration';\nexport const PROP_IS_EDIT = '[Agent] Is Edit';\nexport const PROP_EDITED_MESSAGE_ID = '[Agent] Edited Message ID';\nexport const PROP_WAS_COPIED = '[Agent] Was Copied';\nexport const PROP_ABANDONMENT_TURN = '[Agent] Abandonment Turn';\n\n// Attachment constants (v0.5.0)\nexport const PROP_WAS_CACHED = '[Agent] Was Cached';\nexport const PROP_MODEL_TIER = '[Agent] Model Tier';\nexport const PROP_HAS_ATTACHMENTS = '[Agent] Has Attachments';\nexport const PROP_ATTACHMENT_TYPES = '[Agent] Attachment Types';\nexport const PROP_ATTACHMENT_COUNT = '[Agent] Attachment Count';\nexport const PROP_TOTAL_ATTACHMENT_SIZE = '[Agent] Total Attachment Size Bytes';\nexport const PROP_ATTACHMENTS = '[Agent] Attachments';\n\n// Message label constants (v0.6.0)\nexport const PROP_MESSAGE_LABELS = '[Agent] Message Labels';\nexport const PROP_MESSAGE_LABEL_MAP = '[Agent] Message Label Map';\n\n// Tool definitions (v0.8.0) — request-side tool schemas sent to the LLM\nexport const PROP_TOOL_DEFINITIONS = '[Agent] Tool Definitions';\nexport const PROP_TOOL_DEFINITIONS_COUNT = '[Agent] Tool Definitions Count';\nexport const PROP_TOOL_DEFINITIONS_HASH = '[Agent] Tool Definitions Hash';\n\n// Session replay linking (v0.7.0)\nexport const PROP_SESSION_REPLAY_ID = '[Amplitude] Session Replay ID';\n\n// Session-level enrichment property constants (v0.6.0)\nexport const PROP_QUALITY_SCORE = '[Agent] Quality Score';\nexport const PROP_SENTIMENT_SCORE = '[Agent] Sentiment Score';\nexport const PROP_TASK_FAILURE_TYPE = '[Agent] Task Failure Type';\nexport const PROP_TASK_FAILURE_REASON = '[Agent] Task Failure Reason';\nexport const PROP_AGENT_CHAIN = '[Agent] Agent Chain';\nexport const PROP_ROOT_AGENT_NAME = '[Agent] Root Agent Name';\nexport const PROP_REQUEST_COMPLEXITY = '[Agent] Request Complexity';\n\nconst _require = createRequire(import.meta.url);\nlet _sdkVersion = '0.1.0';\ntry {\n const pkg = _require('../../package.json') as { version?: string };\n if (pkg.version) _sdkVersion = pkg.version;\n} catch {\n // Fallback to hardcoded version when running outside the package\n}\nexport const SDK_VERSION: string = _sdkVersion;\nexport const SDK_RUNTIME = 'node';\n\n// Serialization limits\nexport const MAX_SERIALIZED_LENGTH = 10000;\n"],"mappings":";;;AAIA,MAAa,qBAAqB;AAClC,MAAa,oBAAoB;AACjC,MAAa,kBAAkB;AAC/B,MAAa,kBAAkB;AAC/B,MAAa,aAAa;AAC1B,MAAa,oBAAoB;AACjC,MAAa,2BAA2B;AACxC,MAAa,cAAc;AAG3B,MAAa,kBAAkB;AAC/B,MAAa,gBAAgB;AAC7B,MAAa,eAAe;AAC5B,MAAa,kBAAkB;AAC/B,MAAa,kBAAkB;AAC/B,MAAa,gBAAgB;AAC7B,MAAa,kBAAkB;AAC/B,MAAa,eAAe;AAC5B,MAAa,oBAAoB;AACjC,MAAa,qBAAqB;AAClC,MAAa,oBAAoB;AACjC,MAAa,wBAAwB;AACrC,MAAa,yBAAyB;AACtC,MAAa,6BAA6B;AAC1C,MAAa,gBAAgB;AAC7B,MAAa,gBAAgB;AAC7B,MAAa,qBAAqB;AAClC,MAAa,qBAAqB;AAClC,MAAa,kBAAkB;AAC/B,MAAa,iBAAiB;AAC9B,MAAa,oBAAoB;AACjC,MAAa,qBAAqB;AAClC,MAAa,yBAAyB;AACtC,MAAa,gBAAgB;AAC7B,MAAa,uBAAuB;AACpC,MAAa,kBAAkB;AAC/B,MAAa,mBAAmB;AAChC,MAAa,mBAAmB;AAChC,MAAa,eAAe;AAC5B,MAAa,WAAW;AACxB,MAAa,cAAc;AAC3B,MAAa,iBAAiB;AAC9B,MAAa,sBAAsB;AACnC,MAAa,uBAAuB;AACpC,MAAa,qBAAqB;AAClC,MAAa,yBAAyB;AACtC,MAAa,sBAAsB;AACnC,MAAa,eAAe;AAG5B,MAAa,eAAe;AAC5B,MAAa,iBAAiB;AAC9B,MAAa,sBAAsB;AACnC,MAAa,mBAAmB;AAChC,MAAa,oBAAoB;AACjC,MAAa,4BAA4B;AACzC,MAAa,mBAAmB;AAChC,MAAa,kBAAkB;AAC/B,MAAa,mBAAmB;AAChC,MAAa,iBAAiB;AAC9B,MAAa,mBAAmB;AAChC,MAAa,yBAAyB;AACtC,MAAa,eAAe;AAC5B,MAAa,qBAAqB;AAClC,MAAa,yBAAyB;AACtC,MAAa,4BAA4B;AAGzC,MAAa,qBAAqB;AAClC,MAAa,4BAA4B;AACzC,MAAa,mBAAmB;AAChC,MAAa,yBAAyB;AACtC,MAAa,aAAa;AAC1B,MAAa,oBAAoB;AACjC,MAAa,iBAAiB;AAG9B,MAAa,uBAAuB;AACpC,MAAa,eAAe;AAC5B,MAAa,yBAAyB;AACtC,MAAa,kBAAkB;AAC/B,MAAa,wBAAwB;AAGrC,MAAa,kBAAkB;AAC/B,MAAa,kBAAkB;AAC/B,MAAa,uBAAuB;AACpC,MAAa,wBAAwB;AACrC,MAAa,wBAAwB;AACrC,MAAa,6BAA6B;AAC1C,MAAa,mBAAmB;AAGhC,MAAa,sBAAsB;AACnC,MAAa,yBAAyB;AAGtC,MAAa,wBAAwB;AACrC,MAAa,8BAA8B;AAC3C,MAAa,6BAA6B;AAG1C,MAAa,yBAAyB;AAGtC,MAAa,qBAAqB;AAClC,MAAa,uBAAuB;AACpC,MAAa,yBAAyB;AACtC,MAAa,2BAA2B;AACxC,MAAa,mBAAmB;AAChC,MAAa,uBAAuB;AACpC,MAAa,0BAA0B;AAEvC,MAAM,WAAW,cAAc,OAAO,KAAK,IAAI;AAC/C,IAAI,cAAc;AAClB,IAAI;CACF,MAAM,MAAM,SAAS,qBAAqB;AAC1C,KAAI,IAAI,QAAS,eAAc,IAAI;QAC7B;AAGR,MAAaA,cAAsB;AACnC,MAAa,cAAc;AAG3B,MAAa,wBAAwB"}
|
package/dist/core/privacy.d.ts
CHANGED
|
@@ -24,6 +24,11 @@ declare function chunkContent(text: string): Record<string, unknown>;
|
|
|
24
24
|
declare function getTextFromLlmMessage(llmMessage: Record<string, unknown>): string;
|
|
25
25
|
declare function sanitizeAnyContent(content: unknown, privacyMode?: boolean, redactPii?: boolean): Record<string, unknown>;
|
|
26
26
|
declare function sanitizeStructuredContent(content: unknown, redactPii: boolean): unknown;
|
|
27
|
+
/**
|
|
28
|
+
* Normalize tool definitions from various provider formats into a canonical shape:
|
|
29
|
+
* `[{ name, description, parameters }]`.
|
|
30
|
+
*/
|
|
31
|
+
declare function normalizeToolDefinitions(toolDefinitions: Array<Record<string, unknown>>): Array<Record<string, unknown>>;
|
|
27
32
|
interface PrivacyConfigOptions {
|
|
28
33
|
privacyMode?: boolean;
|
|
29
34
|
redactPii?: boolean;
|
|
@@ -47,7 +52,8 @@ declare class PrivacyConfig {
|
|
|
47
52
|
sanitizeContent(content: unknown): Record<string, unknown>;
|
|
48
53
|
sanitizeSystemPrompt(systemPrompt: string | null): Record<string, unknown>;
|
|
49
54
|
sanitizeReasoningContent(reasoningContent: string | null, reasoningTokens?: number | null): Record<string, unknown>;
|
|
55
|
+
sanitizeToolDefinitions(toolDefinitions: Array<Record<string, unknown>> | null | undefined): Record<string, unknown>;
|
|
50
56
|
}
|
|
51
57
|
//#endregion
|
|
52
|
-
export { MAX_CHUNKS, MAX_CHUNK_SIZE, PrivacyConfig, PrivacyConfigOptions, REDACTED_CONTENT_PLACEHOLDER, REDACTED_IMAGE_PLACEHOLDER, chunkContent, createContentHash, getTextFromLlmMessage, isBase64DataUrl, isRawBase64, isValidUrl, redactBase64Content, redactPiiPatterns, sanitizeAnyContent, sanitizeStructuredContent };
|
|
58
|
+
export { MAX_CHUNKS, MAX_CHUNK_SIZE, PrivacyConfig, PrivacyConfigOptions, REDACTED_CONTENT_PLACEHOLDER, REDACTED_IMAGE_PLACEHOLDER, chunkContent, createContentHash, getTextFromLlmMessage, isBase64DataUrl, isRawBase64, isValidUrl, normalizeToolDefinitions, redactBase64Content, redactPiiPatterns, sanitizeAnyContent, sanitizeStructuredContent };
|
|
53
59
|
//# sourceMappingURL=privacy.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"privacy.d.ts","names":[],"sources":["../../src/core/privacy.ts"],"sourcesContent":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"privacy.d.ts","names":[],"sources":["../../src/core/privacy.ts"],"sourcesContent":[],"mappings":";cAaa,0BAAA;AAAA,cACA,4BAAA,GAD0B,oBAAA;AAC1B,cAIA,cAAA,GAJ4B,IAAA;AAI5B,cACA,UAAA,GADc,CAAA;AACd,iBAgBG,eAAA,CAhBO,IAAA,EAAA,MAAA,CAAA,EAAA,OAAA;AAgBP,iBAIA,UAAA,CAJe,IAAA,EAAA,MAAA,CAAA,EAAA,OAAA;AAIf,iBAYA,WAAA,CAZU,IAAA,EAAA,MAAA,CAAA,EAAA,OAAA;AAYV,iBAKA,iBAAA,CALW,OAAA,EAAA,OAAA,CAAA,EAAA,MAAA;AAKX,iBAMA,mBAAA,CANiB,KAAA,EAAA,OAAA,CAAA,EAAA,OAAA;AAMjB,iBAOA,iBAAA,CAPmB,IAAA,EAAA,MAAA,CAAA,EAAA,MAAA;AAOnC;AA8CA;AAIA;AAeA;AAqCA;AAkCA;;;;;;AAqEiB,iBA/JD,YAAA,CA+JqB,IAAA,EAAA,MAAA,CAAA,EA/JO,MA+JP,CAAA,MAAA,EAAA,OAAA,CAAA;AASxB,iBApKG,qBAAA,CAoKU,UAAA,EAnKZ,MAmKY,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA,EAAA,MAAA;AASH,iBA9JP,kBAAA,CA8JO,OAAA,EAAA,OAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,SAAA,CAAA,EAAA,OAAA,CAAA,EA1JpB,MA0JoB,CAAA,MAAA,EAAA,OAAA,CAAA;AAyEc,iBAlMrB,yBAAA,CAkMqB,OAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,CAAA,EAAA,OAAA;;;;;AA6EhC,iBA7OW,wBAAA,CA6OX,eAAA,EA5Oc,KA4Od,CA5OoB,MA4OpB,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA,CAAA,EA3OF,KA2OE,CA3OI,MA2OJ,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA;AAAM,UAxKM,oBAAA,CAwKN;;;;;;;;cA/JE,aAAA;;;;;;;;wBASU;;;;qCAyEc;qDAwBgB;8FAwBhD;2CA4BgB,MAAM,8CACtB"}
|
package/dist/core/privacy.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { getLogger } from "../utils/logger.js";
|
|
2
|
-
import { PROP_HAS_REASONING, PROP_REASONING_CONTENT, PROP_REASONING_TOKENS, PROP_SYSTEM_PROMPT, PROP_SYSTEM_PROMPT_LENGTH } from "./constants.js";
|
|
2
|
+
import { PROP_HAS_REASONING, PROP_REASONING_CONTENT, PROP_REASONING_TOKENS, PROP_SYSTEM_PROMPT, PROP_SYSTEM_PROMPT_LENGTH, PROP_TOOL_DEFINITIONS, PROP_TOOL_DEFINITIONS_COUNT, PROP_TOOL_DEFINITIONS_HASH } from "./constants.js";
|
|
3
3
|
import crypto from "node:crypto";
|
|
4
4
|
|
|
5
5
|
//#region src/core/privacy.ts
|
|
@@ -103,6 +103,7 @@ function sanitizeAnyContent(content, privacyMode = false, redactPii = true) {
|
|
|
103
103
|
if (typeof content === "string") textContent = content;
|
|
104
104
|
else if (typeof content === "object") textContent = extractTextFromStructuredContent(content);
|
|
105
105
|
else textContent = String(content);
|
|
106
|
+
if (textContent.length === 0) return result;
|
|
106
107
|
if (redactPii) {
|
|
107
108
|
textContent = redactPiiPatterns(textContent);
|
|
108
109
|
const redacted = redactBase64Content(textContent);
|
|
@@ -127,6 +128,62 @@ function sanitizeStructuredContent(content, redactPii) {
|
|
|
127
128
|
if (Array.isArray(content)) return content.map((item) => sanitizeStructuredContent(item, redactPii));
|
|
128
129
|
return content;
|
|
129
130
|
}
|
|
131
|
+
/**
|
|
132
|
+
* Normalize tool definitions from various provider formats into a canonical shape:
|
|
133
|
+
* `[{ name, description, parameters }]`.
|
|
134
|
+
*/
|
|
135
|
+
function normalizeToolDefinitions(toolDefinitions) {
|
|
136
|
+
const normalized = [];
|
|
137
|
+
for (const tool of toolDefinitions) {
|
|
138
|
+
if (tool == null || typeof tool !== "object") continue;
|
|
139
|
+
const fn = tool.function;
|
|
140
|
+
if (fn != null && typeof fn === "object") {
|
|
141
|
+
const f = fn;
|
|
142
|
+
normalized.push({
|
|
143
|
+
name: f.name ?? "",
|
|
144
|
+
description: f.description ?? "",
|
|
145
|
+
parameters: f.parameters ?? null
|
|
146
|
+
});
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
if ("input_schema" in tool) {
|
|
150
|
+
normalized.push({
|
|
151
|
+
name: tool.name ?? "",
|
|
152
|
+
description: tool.description ?? "",
|
|
153
|
+
parameters: tool.input_schema ?? null
|
|
154
|
+
});
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
const toolSpec = tool.toolSpec;
|
|
158
|
+
if (toolSpec != null && typeof toolSpec === "object") {
|
|
159
|
+
const ts = toolSpec;
|
|
160
|
+
normalized.push({
|
|
161
|
+
name: ts.name ?? "",
|
|
162
|
+
description: ts.description ?? "",
|
|
163
|
+
parameters: ts.inputSchema ?? null
|
|
164
|
+
});
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
const fnDecls = tool.function_declarations;
|
|
168
|
+
if (Array.isArray(fnDecls)) {
|
|
169
|
+
for (const decl of fnDecls) if (decl != null && typeof decl === "object") {
|
|
170
|
+
const d = decl;
|
|
171
|
+
normalized.push({
|
|
172
|
+
name: d.name ?? "",
|
|
173
|
+
description: d.description ?? "",
|
|
174
|
+
parameters: d.parameters ?? null
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
if ("name" in tool) normalized.push({
|
|
180
|
+
name: tool.name ?? "",
|
|
181
|
+
description: tool.description ?? "",
|
|
182
|
+
parameters: tool.parameters ?? null
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
return normalized;
|
|
186
|
+
}
|
|
130
187
|
var PrivacyConfig = class {
|
|
131
188
|
privacyMode;
|
|
132
189
|
redactPii;
|
|
@@ -228,8 +285,28 @@ var PrivacyConfig = class {
|
|
|
228
285
|
}
|
|
229
286
|
return result;
|
|
230
287
|
}
|
|
288
|
+
sanitizeToolDefinitions(toolDefinitions) {
|
|
289
|
+
if (!toolDefinitions?.length) return {};
|
|
290
|
+
const normalized = normalizeToolDefinitions(toolDefinitions);
|
|
291
|
+
const result = { [PROP_TOOL_DEFINITIONS_COUNT]: normalized.length };
|
|
292
|
+
const canonicalSorted = JSON.stringify(normalized.map((t) => {
|
|
293
|
+
const sorted = {};
|
|
294
|
+
for (const key of Object.keys(t).sort()) sorted[key] = t[key];
|
|
295
|
+
return sorted;
|
|
296
|
+
}));
|
|
297
|
+
result[PROP_TOOL_DEFINITIONS_HASH] = crypto.createHash("sha256").update(canonicalSorted).digest("hex").slice(0, 16);
|
|
298
|
+
let mode = this._contentMode;
|
|
299
|
+
if (mode == null) mode = this.privacyMode ? "metadata_only" : "full";
|
|
300
|
+
if (mode === "full") {
|
|
301
|
+
let serialized = JSON.stringify(normalized);
|
|
302
|
+
if (this.redactPii) serialized = redactPiiPatterns(serialized);
|
|
303
|
+
serialized = this._applyCustomPatterns(serialized);
|
|
304
|
+
result[PROP_TOOL_DEFINITIONS] = serialized.length > 1e4 ? serialized.slice(0, 1e4) : serialized;
|
|
305
|
+
}
|
|
306
|
+
return result;
|
|
307
|
+
}
|
|
231
308
|
};
|
|
232
309
|
|
|
233
310
|
//#endregion
|
|
234
|
-
export { MAX_CHUNKS, MAX_CHUNK_SIZE, PrivacyConfig, REDACTED_CONTENT_PLACEHOLDER, REDACTED_IMAGE_PLACEHOLDER, chunkContent, createContentHash, getTextFromLlmMessage, isBase64DataUrl, isRawBase64, isValidUrl, redactBase64Content, redactPiiPatterns, sanitizeAnyContent, sanitizeStructuredContent };
|
|
311
|
+
export { MAX_CHUNKS, MAX_CHUNK_SIZE, PrivacyConfig, REDACTED_CONTENT_PLACEHOLDER, REDACTED_IMAGE_PLACEHOLDER, chunkContent, createContentHash, getTextFromLlmMessage, isBase64DataUrl, isRawBase64, isValidUrl, normalizeToolDefinitions, redactBase64Content, redactPiiPatterns, sanitizeAnyContent, sanitizeStructuredContent };
|
|
235
312
|
//# sourceMappingURL=privacy.js.map
|
package/dist/core/privacy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"privacy.js","names":["parts: string[]","result: Record<string, unknown>","textContent: string","sanitized: Record<string, unknown>","modeStr: string | null"],"sources":["../../src/core/privacy.ts"],"sourcesContent":["import crypto from 'node:crypto';\nimport { getLogger } from '../utils/logger.js';\nimport {\n PROP_HAS_REASONING,\n PROP_REASONING_CONTENT,\n PROP_REASONING_TOKENS,\n PROP_SYSTEM_PROMPT,\n PROP_SYSTEM_PROMPT_LENGTH,\n} from './constants.js';\n\nexport const REDACTED_IMAGE_PLACEHOLDER = '[base64 image redacted]';\nexport const REDACTED_CONTENT_PLACEHOLDER = '[content redacted]';\n\n// Legacy chunking constants — kept only so getTextFromLlmMessage() can\n// still read old chunked events. New events always use { text: content }.\nexport const MAX_CHUNK_SIZE = 1024;\nexport const MAX_CHUNKS = 8;\n\nconst VALID_CONTENT_MODES = new Set([\n 'full',\n 'metadata_only',\n 'customer_enriched',\n]);\n\n// PII regex patterns\nconst EMAIL_RE = /\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}\\b/g;\nconst PHONE_RE = /\\b\\(?([0-9]{3})\\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})\\b/g;\nconst CREDIT_CARD_RE = /\\b(?:\\d{4}[-\\s]?){3}\\d{4}\\b/g;\nconst SSN_RE = /\\b\\d{3}-\\d{2}-\\d{4}\\b/g;\nconst BASE64_DATA_URL_RE = /^data:([^;]+);base64,/;\nconst RAW_BASE64_RE = /^[A-Za-z0-9+/]+=*$/;\n\nexport function isBase64DataUrl(text: string): boolean {\n return BASE64_DATA_URL_RE.test(text);\n}\n\nexport function isValidUrl(text: string): boolean {\n try {\n const result = new URL(text);\n return Boolean(result.protocol && result.hostname);\n } catch {\n // not a valid absolute URL\n }\n return (\n text.startsWith('/') || text.startsWith('./') || text.startsWith('../')\n );\n}\n\nexport function isRawBase64(text: string): boolean {\n if (isValidUrl(text)) return false;\n return text.length > 20 && RAW_BASE64_RE.test(text);\n}\n\nexport function createContentHash(content: unknown): string {\n if (content == null) return '';\n const contentStr = typeof content === 'string' ? content : String(content);\n return crypto.createHash('sha256').update(contentStr, 'utf8').digest('hex');\n}\n\nexport function redactBase64Content(value: unknown): unknown {\n if (typeof value !== 'string') return value;\n if (isBase64DataUrl(value)) return REDACTED_IMAGE_PLACEHOLDER;\n if (isRawBase64(value)) return REDACTED_IMAGE_PLACEHOLDER;\n return value;\n}\n\nexport function redactPiiPatterns(text: string): string {\n let result = text;\n result = result.replace(EMAIL_RE, '[email]');\n result = result.replace(PHONE_RE, '[phone]');\n result = result.replace(CREDIT_CARD_RE, '[credit_card]');\n result = result.replace(SSN_RE, '[ssn]');\n return result;\n}\n\nfunction extractTextFromStructuredContent(content: unknown): string {\n if (content == null) return '';\n if (typeof content === 'string') return content;\n\n if (typeof content === 'object' && !Array.isArray(content)) {\n const dict = content as Record<string, unknown>;\n for (const field of ['content', 'text', 'message']) {\n if (field in dict) return extractTextFromStructuredContent(dict[field]);\n }\n return String(content);\n }\n\n if (Array.isArray(content)) {\n const parts: string[] = [];\n for (const item of content) {\n if (typeof item === 'string') parts.push(item);\n else if (typeof item === 'object')\n parts.push(extractTextFromStructuredContent(item));\n else parts.push(String(item));\n }\n return parts.join('');\n }\n\n return String(content);\n}\n\n/**\n * Return the `$llm_message` payload for the given text.\n *\n * Content is stored as `{ text: content }` at full length — the Node SDK\n * does not truncate string properties, and Nova already whitelists\n * `$llm_message` server-side.\n *\n * Previous versions split long content into `c0`..`c7` chunks. That format\n * is still readable via {@link getTextFromLlmMessage} for backward\n * compatibility, but is no longer produced.\n */\nexport function chunkContent(text: string): Record<string, unknown> {\n return { text };\n}\n\nexport function getTextFromLlmMessage(\n llmMessage: Record<string, unknown>,\n): string {\n if ('text' in llmMessage) return String(llmMessage.text);\n const n = llmMessage.n;\n if (typeof n === 'number' && n > 0) {\n const parts: string[] = [];\n for (let i = 0; i < n; i++) {\n parts.push(String(llmMessage[`c${i}`] ?? ''));\n }\n return parts.join('');\n }\n return '';\n}\n\nexport function sanitizeAnyContent(\n content: unknown,\n privacyMode = false,\n redactPii = true,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n if (content == null) return result;\n\n let textContent: string;\n if (typeof content === 'string') {\n textContent = content;\n } else if (typeof content === 'object') {\n textContent = extractTextFromStructuredContent(content);\n } else {\n textContent = String(content);\n }\n\n if (redactPii) {\n textContent = redactPiiPatterns(textContent);\n const redacted = redactBase64Content(textContent);\n if (typeof redacted === 'string') textContent = redacted;\n }\n\n if (privacyMode) {\n result.content_hash = createContentHash(textContent);\n } else {\n result.$llm_message = chunkContent(textContent);\n }\n\n return result;\n}\n\nexport function sanitizeStructuredContent(\n content: unknown,\n redactPii: boolean,\n): unknown {\n if (typeof content === 'string') {\n let text = content;\n if (redactPii) text = redactPiiPatterns(text);\n return redactBase64Content(text);\n }\n\n if (\n content != null &&\n typeof content === 'object' &&\n !Array.isArray(content)\n ) {\n const dict = content as Record<string, unknown>;\n const sanitized: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(dict)) {\n sanitized[key] = sanitizeStructuredContent(value, redactPii);\n }\n return sanitized;\n }\n\n if (Array.isArray(content)) {\n return content.map((item) => sanitizeStructuredContent(item, redactPii));\n }\n\n return content;\n}\n\nexport interface PrivacyConfigOptions {\n privacyMode?: boolean;\n redactPii?: boolean;\n customRedactionPatterns?: string[];\n contentMode?: string | null;\n validate?: boolean;\n debug?: boolean;\n}\n\nexport class PrivacyConfig {\n readonly privacyMode: boolean;\n readonly redactPii: boolean;\n readonly validate: boolean;\n readonly debug: boolean;\n readonly customPatterns: string[];\n private readonly _compiledCustomPatterns: RegExp[];\n private readonly _contentMode: string | null;\n\n constructor(options: PrivacyConfigOptions = {}) {\n this.privacyMode = options.privacyMode ?? false;\n this.redactPii = options.redactPii ?? false;\n this.validate = options.validate ?? false;\n this.debug = options.debug ?? false;\n this.customPatterns = options.customRedactionPatterns ?? [];\n this._compiledCustomPatterns = [];\n\n for (const pattern of this.customPatterns) {\n try {\n this._compiledCustomPatterns.push(new RegExp(pattern, 'g'));\n } catch (e) {\n getLogger().warn(\n `Invalid custom redaction regex \"${pattern}\": ${e instanceof Error ? e.message : String(e)}`,\n );\n }\n }\n\n let modeStr: string | null = null;\n if (options.contentMode != null) {\n modeStr = String(options.contentMode);\n if (!VALID_CONTENT_MODES.has(modeStr)) {\n throw new Error(\n `Invalid content_mode \"${options.contentMode}\". ` +\n `Must be one of: ${[...VALID_CONTENT_MODES].sort().join(', ')}`,\n );\n }\n }\n this._contentMode = modeStr;\n }\n\n get contentMode(): string | null {\n return this._contentMode;\n }\n\n private _applyCustomPatterns(text: string): string {\n if (!this._compiledCustomPatterns.length || typeof text !== 'string') {\n return text;\n }\n let result = text;\n for (const pattern of this._compiledCustomPatterns) {\n try {\n result = result.replace(pattern, '[REDACTED]');\n } catch (e) {\n getLogger().warn(\n `Invalid custom redaction regex \"${pattern.source}\": ${e instanceof Error ? e.message : String(e)}`,\n );\n }\n }\n return result;\n }\n\n private _applyCustomPatternsToLlmMessage(\n llmMessage: Record<string, unknown>,\n ): void {\n if ('text' in llmMessage) {\n llmMessage.text = this._applyCustomPatterns(String(llmMessage.text));\n return;\n }\n\n const n = llmMessage.n;\n if (typeof n === 'number' && n > 0) {\n for (let i = 0; i < n; i++) {\n const key = `c${i}`;\n if (key in llmMessage) {\n llmMessage[key] = this._applyCustomPatterns(\n String(llmMessage[key] ?? ''),\n );\n }\n }\n }\n }\n\n sanitizeContent(content: unknown): Record<string, unknown> {\n if (this._contentMode == null) {\n if (this.privacyMode) return {};\n const result = sanitizeAnyContent(content, false, this.redactPii);\n if (this.customPatterns.length && '$llm_message' in result) {\n const msg = result.$llm_message as Record<string, unknown>;\n this._applyCustomPatternsToLlmMessage(msg);\n }\n return result;\n }\n\n if (this._contentMode === 'full') {\n const result = sanitizeAnyContent(content, false, this.redactPii);\n if (this.customPatterns.length && '$llm_message' in result) {\n const msg = result.$llm_message as Record<string, unknown>;\n this._applyCustomPatternsToLlmMessage(msg);\n }\n return result;\n }\n\n // metadata_only, customer_enriched → no content\n return {};\n }\n\n sanitizeSystemPrompt(systemPrompt: string | null): Record<string, unknown> {\n if (!systemPrompt) return {};\n\n const result: Record<string, unknown> = {\n [PROP_SYSTEM_PROMPT_LENGTH]: systemPrompt.length,\n };\n\n let mode = this._contentMode;\n if (mode == null) mode = this.privacyMode ? 'metadata_only' : 'full';\n\n if (mode === 'full') {\n let sanitized = systemPrompt;\n if (this.redactPii) sanitized = redactPiiPatterns(sanitized);\n sanitized = this._applyCustomPatterns(sanitized);\n result[PROP_SYSTEM_PROMPT] =\n sanitized.length > 10000 ? sanitized.slice(0, 10000) : sanitized;\n }\n\n return result;\n }\n\n sanitizeReasoningContent(\n reasoningContent: string | null,\n reasoningTokens?: number | null,\n ): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n const hasReasoning =\n Boolean(reasoningContent) ||\n (reasoningTokens != null && reasoningTokens > 0);\n if (!hasReasoning && reasoningTokens == null) return result;\n\n if (hasReasoning) result[PROP_HAS_REASONING] = true;\n if (reasoningTokens != null)\n result[PROP_REASONING_TOKENS] = reasoningTokens;\n if (!hasReasoning || reasoningContent == null) return result;\n\n let mode = this._contentMode;\n if (mode == null) mode = this.privacyMode ? 'metadata_only' : 'full';\n\n if (mode === 'full') {\n let sanitized = reasoningContent;\n if (this.redactPii) sanitized = redactPiiPatterns(sanitized);\n sanitized = this._applyCustomPatterns(sanitized);\n result[PROP_REASONING_CONTENT] =\n sanitized.length > 10000 ? sanitized.slice(0, 10000) : sanitized;\n }\n\n return result;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"privacy.js","names":["parts: string[]","result: Record<string, unknown>","textContent: string","sanitized: Record<string, unknown>","normalized: Array<Record<string, unknown>>","modeStr: string | null","sorted: Record<string, unknown>"],"sources":["../../src/core/privacy.ts"],"sourcesContent":["import crypto from 'node:crypto';\nimport { getLogger } from '../utils/logger.js';\nimport {\n PROP_HAS_REASONING,\n PROP_REASONING_CONTENT,\n PROP_REASONING_TOKENS,\n PROP_SYSTEM_PROMPT,\n PROP_SYSTEM_PROMPT_LENGTH,\n PROP_TOOL_DEFINITIONS,\n PROP_TOOL_DEFINITIONS_COUNT,\n PROP_TOOL_DEFINITIONS_HASH,\n} from './constants.js';\n\nexport const REDACTED_IMAGE_PLACEHOLDER = '[base64 image redacted]';\nexport const REDACTED_CONTENT_PLACEHOLDER = '[content redacted]';\n\n// Legacy chunking constants — kept only so getTextFromLlmMessage() can\n// still read old chunked events. New events always use { text: content }.\nexport const MAX_CHUNK_SIZE = 1024;\nexport const MAX_CHUNKS = 8;\n\nconst VALID_CONTENT_MODES = new Set([\n 'full',\n 'metadata_only',\n 'customer_enriched',\n]);\n\n// PII regex patterns\nconst EMAIL_RE = /\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}\\b/g;\nconst PHONE_RE = /\\b\\(?([0-9]{3})\\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})\\b/g;\nconst CREDIT_CARD_RE = /\\b(?:\\d{4}[-\\s]?){3}\\d{4}\\b/g;\nconst SSN_RE = /\\b\\d{3}-\\d{2}-\\d{4}\\b/g;\nconst BASE64_DATA_URL_RE = /^data:([^;]+);base64,/;\nconst RAW_BASE64_RE = /^[A-Za-z0-9+/]+=*$/;\n\nexport function isBase64DataUrl(text: string): boolean {\n return BASE64_DATA_URL_RE.test(text);\n}\n\nexport function isValidUrl(text: string): boolean {\n try {\n const result = new URL(text);\n return Boolean(result.protocol && result.hostname);\n } catch {\n // not a valid absolute URL\n }\n return (\n text.startsWith('/') || text.startsWith('./') || text.startsWith('../')\n );\n}\n\nexport function isRawBase64(text: string): boolean {\n if (isValidUrl(text)) return false;\n return text.length > 20 && RAW_BASE64_RE.test(text);\n}\n\nexport function createContentHash(content: unknown): string {\n if (content == null) return '';\n const contentStr = typeof content === 'string' ? content : String(content);\n return crypto.createHash('sha256').update(contentStr, 'utf8').digest('hex');\n}\n\nexport function redactBase64Content(value: unknown): unknown {\n if (typeof value !== 'string') return value;\n if (isBase64DataUrl(value)) return REDACTED_IMAGE_PLACEHOLDER;\n if (isRawBase64(value)) return REDACTED_IMAGE_PLACEHOLDER;\n return value;\n}\n\nexport function redactPiiPatterns(text: string): string {\n let result = text;\n result = result.replace(EMAIL_RE, '[email]');\n result = result.replace(PHONE_RE, '[phone]');\n result = result.replace(CREDIT_CARD_RE, '[credit_card]');\n result = result.replace(SSN_RE, '[ssn]');\n return result;\n}\n\nfunction extractTextFromStructuredContent(content: unknown): string {\n if (content == null) return '';\n if (typeof content === 'string') return content;\n\n if (typeof content === 'object' && !Array.isArray(content)) {\n const dict = content as Record<string, unknown>;\n for (const field of ['content', 'text', 'message']) {\n if (field in dict) return extractTextFromStructuredContent(dict[field]);\n }\n return String(content);\n }\n\n if (Array.isArray(content)) {\n const parts: string[] = [];\n for (const item of content) {\n if (typeof item === 'string') parts.push(item);\n else if (typeof item === 'object')\n parts.push(extractTextFromStructuredContent(item));\n else parts.push(String(item));\n }\n return parts.join('');\n }\n\n return String(content);\n}\n\n/**\n * Return the `$llm_message` payload for the given text.\n *\n * Content is stored as `{ text: content }` at full length — the Node SDK\n * does not truncate string properties, and Nova already whitelists\n * `$llm_message` server-side.\n *\n * Previous versions split long content into `c0`..`c7` chunks. That format\n * is still readable via {@link getTextFromLlmMessage} for backward\n * compatibility, but is no longer produced.\n */\nexport function chunkContent(text: string): Record<string, unknown> {\n return { text };\n}\n\nexport function getTextFromLlmMessage(\n llmMessage: Record<string, unknown>,\n): string {\n if ('text' in llmMessage) return String(llmMessage.text);\n const n = llmMessage.n;\n if (typeof n === 'number' && n > 0) {\n const parts: string[] = [];\n for (let i = 0; i < n; i++) {\n parts.push(String(llmMessage[`c${i}`] ?? ''));\n }\n return parts.join('');\n }\n return '';\n}\n\nexport function sanitizeAnyContent(\n content: unknown,\n privacyMode = false,\n redactPii = true,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n if (content == null) return result;\n\n let textContent: string;\n if (typeof content === 'string') {\n textContent = content;\n } else if (typeof content === 'object') {\n textContent = extractTextFromStructuredContent(content);\n } else {\n textContent = String(content);\n }\n\n // Tool-call-only LLM responses have content=null which the provider\n // coerces to ''. Emitting $llm_message with an empty string causes\n // the response to appear as \"missing text\" in the thread view.\n if (textContent.length === 0) return result;\n\n if (redactPii) {\n textContent = redactPiiPatterns(textContent);\n const redacted = redactBase64Content(textContent);\n if (typeof redacted === 'string') textContent = redacted;\n }\n\n if (privacyMode) {\n result.content_hash = createContentHash(textContent);\n } else {\n result.$llm_message = chunkContent(textContent);\n }\n\n return result;\n}\n\nexport function sanitizeStructuredContent(\n content: unknown,\n redactPii: boolean,\n): unknown {\n if (typeof content === 'string') {\n let text = content;\n if (redactPii) text = redactPiiPatterns(text);\n return redactBase64Content(text);\n }\n\n if (\n content != null &&\n typeof content === 'object' &&\n !Array.isArray(content)\n ) {\n const dict = content as Record<string, unknown>;\n const sanitized: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(dict)) {\n sanitized[key] = sanitizeStructuredContent(value, redactPii);\n }\n return sanitized;\n }\n\n if (Array.isArray(content)) {\n return content.map((item) => sanitizeStructuredContent(item, redactPii));\n }\n\n return content;\n}\n\n/**\n * Normalize tool definitions from various provider formats into a canonical shape:\n * `[{ name, description, parameters }]`.\n */\nexport function normalizeToolDefinitions(\n toolDefinitions: Array<Record<string, unknown>>,\n): Array<Record<string, unknown>> {\n const normalized: Array<Record<string, unknown>> = [];\n for (const tool of toolDefinitions) {\n if (tool == null || typeof tool !== 'object') continue;\n\n // OpenAI Chat format: { type: \"function\", function: { name, description, parameters } }\n const fn = tool.function;\n if (fn != null && typeof fn === 'object') {\n const f = fn as Record<string, unknown>;\n normalized.push({\n name: f.name ?? '',\n description: f.description ?? '',\n parameters: f.parameters ?? null,\n });\n continue;\n }\n\n // Anthropic format: { name, description, input_schema }\n if ('input_schema' in tool) {\n normalized.push({\n name: tool.name ?? '',\n description: tool.description ?? '',\n parameters: tool.input_schema ?? null,\n });\n continue;\n }\n\n // Bedrock format: { toolSpec: { name, description, inputSchema } }\n const toolSpec = tool.toolSpec;\n if (toolSpec != null && typeof toolSpec === 'object') {\n const ts = toolSpec as Record<string, unknown>;\n normalized.push({\n name: ts.name ?? '',\n description: ts.description ?? '',\n parameters: ts.inputSchema ?? null,\n });\n continue;\n }\n\n // Gemini format: { function_declarations: [{ name, description, parameters }] }\n const fnDecls = tool.function_declarations;\n if (Array.isArray(fnDecls)) {\n for (const decl of fnDecls) {\n if (decl != null && typeof decl === 'object') {\n const d = decl as Record<string, unknown>;\n normalized.push({\n name: d.name ?? '',\n description: d.description ?? '',\n parameters: d.parameters ?? null,\n });\n }\n }\n continue;\n }\n\n // Generic / OpenAI Responses format: { name, description, parameters }\n if ('name' in tool) {\n normalized.push({\n name: tool.name ?? '',\n description: tool.description ?? '',\n parameters: tool.parameters ?? null,\n });\n }\n }\n return normalized;\n}\n\nexport interface PrivacyConfigOptions {\n privacyMode?: boolean;\n redactPii?: boolean;\n customRedactionPatterns?: string[];\n contentMode?: string | null;\n validate?: boolean;\n debug?: boolean;\n}\n\nexport class PrivacyConfig {\n readonly privacyMode: boolean;\n readonly redactPii: boolean;\n readonly validate: boolean;\n readonly debug: boolean;\n readonly customPatterns: string[];\n private readonly _compiledCustomPatterns: RegExp[];\n private readonly _contentMode: string | null;\n\n constructor(options: PrivacyConfigOptions = {}) {\n this.privacyMode = options.privacyMode ?? false;\n this.redactPii = options.redactPii ?? false;\n this.validate = options.validate ?? false;\n this.debug = options.debug ?? false;\n this.customPatterns = options.customRedactionPatterns ?? [];\n this._compiledCustomPatterns = [];\n\n for (const pattern of this.customPatterns) {\n try {\n this._compiledCustomPatterns.push(new RegExp(pattern, 'g'));\n } catch (e) {\n getLogger().warn(\n `Invalid custom redaction regex \"${pattern}\": ${e instanceof Error ? e.message : String(e)}`,\n );\n }\n }\n\n let modeStr: string | null = null;\n if (options.contentMode != null) {\n modeStr = String(options.contentMode);\n if (!VALID_CONTENT_MODES.has(modeStr)) {\n throw new Error(\n `Invalid content_mode \"${options.contentMode}\". ` +\n `Must be one of: ${[...VALID_CONTENT_MODES].sort().join(', ')}`,\n );\n }\n }\n this._contentMode = modeStr;\n }\n\n get contentMode(): string | null {\n return this._contentMode;\n }\n\n private _applyCustomPatterns(text: string): string {\n if (!this._compiledCustomPatterns.length || typeof text !== 'string') {\n return text;\n }\n let result = text;\n for (const pattern of this._compiledCustomPatterns) {\n try {\n result = result.replace(pattern, '[REDACTED]');\n } catch (e) {\n getLogger().warn(\n `Invalid custom redaction regex \"${pattern.source}\": ${e instanceof Error ? e.message : String(e)}`,\n );\n }\n }\n return result;\n }\n\n private _applyCustomPatternsToLlmMessage(\n llmMessage: Record<string, unknown>,\n ): void {\n if ('text' in llmMessage) {\n llmMessage.text = this._applyCustomPatterns(String(llmMessage.text));\n return;\n }\n\n const n = llmMessage.n;\n if (typeof n === 'number' && n > 0) {\n for (let i = 0; i < n; i++) {\n const key = `c${i}`;\n if (key in llmMessage) {\n llmMessage[key] = this._applyCustomPatterns(\n String(llmMessage[key] ?? ''),\n );\n }\n }\n }\n }\n\n sanitizeContent(content: unknown): Record<string, unknown> {\n if (this._contentMode == null) {\n if (this.privacyMode) return {};\n const result = sanitizeAnyContent(content, false, this.redactPii);\n if (this.customPatterns.length && '$llm_message' in result) {\n const msg = result.$llm_message as Record<string, unknown>;\n this._applyCustomPatternsToLlmMessage(msg);\n }\n return result;\n }\n\n if (this._contentMode === 'full') {\n const result = sanitizeAnyContent(content, false, this.redactPii);\n if (this.customPatterns.length && '$llm_message' in result) {\n const msg = result.$llm_message as Record<string, unknown>;\n this._applyCustomPatternsToLlmMessage(msg);\n }\n return result;\n }\n\n // metadata_only, customer_enriched → no content\n return {};\n }\n\n sanitizeSystemPrompt(systemPrompt: string | null): Record<string, unknown> {\n if (!systemPrompt) return {};\n\n const result: Record<string, unknown> = {\n [PROP_SYSTEM_PROMPT_LENGTH]: systemPrompt.length,\n };\n\n let mode = this._contentMode;\n if (mode == null) mode = this.privacyMode ? 'metadata_only' : 'full';\n\n if (mode === 'full') {\n let sanitized = systemPrompt;\n if (this.redactPii) sanitized = redactPiiPatterns(sanitized);\n sanitized = this._applyCustomPatterns(sanitized);\n result[PROP_SYSTEM_PROMPT] =\n sanitized.length > 10000 ? sanitized.slice(0, 10000) : sanitized;\n }\n\n return result;\n }\n\n sanitizeReasoningContent(\n reasoningContent: string | null,\n reasoningTokens?: number | null,\n ): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n const hasReasoning =\n Boolean(reasoningContent) ||\n (reasoningTokens != null && reasoningTokens > 0);\n if (!hasReasoning && reasoningTokens == null) return result;\n\n if (hasReasoning) result[PROP_HAS_REASONING] = true;\n if (reasoningTokens != null)\n result[PROP_REASONING_TOKENS] = reasoningTokens;\n if (!hasReasoning || reasoningContent == null) return result;\n\n let mode = this._contentMode;\n if (mode == null) mode = this.privacyMode ? 'metadata_only' : 'full';\n\n if (mode === 'full') {\n let sanitized = reasoningContent;\n if (this.redactPii) sanitized = redactPiiPatterns(sanitized);\n sanitized = this._applyCustomPatterns(sanitized);\n result[PROP_REASONING_CONTENT] =\n sanitized.length > 10000 ? sanitized.slice(0, 10000) : sanitized;\n }\n\n return result;\n }\n\n sanitizeToolDefinitions(\n toolDefinitions: Array<Record<string, unknown>> | null | undefined,\n ): Record<string, unknown> {\n if (!toolDefinitions?.length) return {};\n\n const normalized = normalizeToolDefinitions(toolDefinitions);\n const result: Record<string, unknown> = {\n [PROP_TOOL_DEFINITIONS_COUNT]: normalized.length,\n };\n\n const canonicalSorted = JSON.stringify(\n normalized.map((t) => {\n const sorted: Record<string, unknown> = {};\n for (const key of Object.keys(t).sort()) sorted[key] = t[key];\n return sorted;\n }),\n );\n result[PROP_TOOL_DEFINITIONS_HASH] = crypto\n .createHash('sha256')\n .update(canonicalSorted)\n .digest('hex')\n .slice(0, 16);\n\n let mode = this._contentMode;\n if (mode == null) mode = this.privacyMode ? 'metadata_only' : 'full';\n\n if (mode === 'full') {\n let serialized = JSON.stringify(normalized);\n if (this.redactPii) serialized = redactPiiPatterns(serialized);\n serialized = this._applyCustomPatterns(serialized);\n result[PROP_TOOL_DEFINITIONS] =\n serialized.length > 10000 ? serialized.slice(0, 10000) : serialized;\n }\n\n return result;\n }\n}\n"],"mappings":"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"}
|
package/dist/core/tracking.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { PrivacyConfig } from "./privacy.js";
|
|
2
2
|
import { MessageLabel, SessionEnrichments } from "./enrichments.js";
|
|
3
3
|
import { AmplitudeLike, Attachment, ToolCallShape } from "../types.js";
|
|
4
|
-
import { EVENT_AI_RESPONSE, EVENT_EMBEDDING, EVENT_SCORE, EVENT_SESSION_END, EVENT_SESSION_ENRICHMENT, EVENT_SPAN, EVENT_TOOL_CALL, EVENT_USER_MESSAGE, MAX_SERIALIZED_LENGTH, PROP_ABANDONMENT_TURN, PROP_AGENT_CHAIN, PROP_AGENT_DESCRIPTION, PROP_AGENT_ID, PROP_AGENT_VERSION, PROP_ATTACHMENTS, PROP_ATTACHMENT_COUNT, PROP_ATTACHMENT_TYPES, PROP_CACHE_CREATION_TOKENS, PROP_CACHE_READ_TOKENS, PROP_COMMENT, PROP_COMPONENT_TYPE, PROP_CONTEXT, PROP_COST_USD, PROP_CUSTOMER_ORG_ID, PROP_EDITED_MESSAGE_ID, PROP_EMBEDDING_DIMENSIONS, PROP_ENRICHMENTS, PROP_ENV, PROP_ERROR_MESSAGE, PROP_EVALUATION_SOURCE, PROP_FINISH_REASON, PROP_HAS_ATTACHMENTS, PROP_HAS_REASONING, PROP_IDLE_TIMEOUT_MINUTES, PROP_INPUT_STATE, PROP_INPUT_TOKENS, PROP_INVOCATION_ID, PROP_IS_EDIT, PROP_IS_ERROR, PROP_IS_REGENERATION, PROP_IS_STREAMING, PROP_LATENCY_MS, PROP_LOCALE, PROP_MAX_OUTPUT_TOKENS, PROP_MESSAGE_ID, PROP_MESSAGE_LABELS, PROP_MESSAGE_LABEL_MAP, PROP_MESSAGE_SOURCE, PROP_MODEL_NAME, PROP_MODEL_TIER, PROP_OUTPUT_STATE, PROP_OUTPUT_TOKENS, PROP_PARENT_AGENT_ID, PROP_PARENT_MESSAGE_ID, PROP_PARENT_SPAN_ID, PROP_PROMPT_ID, PROP_PROVIDER, PROP_QUALITY_SCORE, PROP_REASONING_CONTENT, PROP_REASONING_TOKENS, PROP_REQUEST_COMPLEXITY, PROP_ROOT_AGENT_NAME, PROP_RUNTIME, PROP_SCORE_NAME, PROP_SCORE_VALUE, PROP_SDK_VERSION, PROP_SENTIMENT_SCORE, PROP_SESSION_ID, PROP_SESSION_REPLAY_ID, PROP_SPAN_ID, PROP_SPAN_KIND, PROP_SPAN_NAME, PROP_SYSTEM_PROMPT, PROP_SYSTEM_PROMPT_LENGTH, PROP_TARGET_ID, PROP_TARGET_TYPE, PROP_TASK_FAILURE_REASON, PROP_TASK_FAILURE_TYPE, PROP_TEMPERATURE, PROP_TOOL_CALLS, PROP_TOOL_INPUT, PROP_TOOL_NAME, PROP_TOOL_OUTPUT, PROP_TOOL_SUCCESS, PROP_TOP_P, PROP_TOTAL_ATTACHMENT_SIZE, PROP_TOTAL_TOKENS, PROP_TRACE_ID, PROP_TTFB_MS, PROP_TURN_ID, PROP_WAS_CACHED, PROP_WAS_COPIED, SDK_RUNTIME, SDK_VERSION } from "./constants.js";
|
|
4
|
+
import { EVENT_AI_RESPONSE, EVENT_EMBEDDING, EVENT_SCORE, EVENT_SESSION_END, EVENT_SESSION_ENRICHMENT, EVENT_SPAN, EVENT_TOOL_CALL, EVENT_USER_MESSAGE, MAX_SERIALIZED_LENGTH, PROP_ABANDONMENT_TURN, PROP_AGENT_CHAIN, PROP_AGENT_DESCRIPTION, PROP_AGENT_ID, PROP_AGENT_VERSION, PROP_ATTACHMENTS, PROP_ATTACHMENT_COUNT, PROP_ATTACHMENT_TYPES, PROP_CACHE_CREATION_TOKENS, PROP_CACHE_READ_TOKENS, PROP_COMMENT, PROP_COMPONENT_TYPE, PROP_CONTEXT, PROP_COST_USD, PROP_CUSTOMER_ORG_ID, PROP_EDITED_MESSAGE_ID, PROP_EMBEDDING_DIMENSIONS, PROP_ENRICHMENTS, PROP_ENV, PROP_ERROR_MESSAGE, PROP_EVALUATION_SOURCE, PROP_FINISH_REASON, PROP_HAS_ATTACHMENTS, PROP_HAS_REASONING, PROP_IDLE_TIMEOUT_MINUTES, PROP_INPUT_STATE, PROP_INPUT_TOKENS, PROP_INVOCATION_ID, PROP_IS_EDIT, PROP_IS_ERROR, PROP_IS_REGENERATION, PROP_IS_STREAMING, PROP_LATENCY_MS, PROP_LOCALE, PROP_MAX_OUTPUT_TOKENS, PROP_MESSAGE_ID, PROP_MESSAGE_LABELS, PROP_MESSAGE_LABEL_MAP, PROP_MESSAGE_SOURCE, PROP_MODEL_NAME, PROP_MODEL_TIER, PROP_OUTPUT_STATE, PROP_OUTPUT_TOKENS, PROP_PARENT_AGENT_ID, PROP_PARENT_MESSAGE_ID, PROP_PARENT_SPAN_ID, PROP_PROMPT_ID, PROP_PROVIDER, PROP_QUALITY_SCORE, PROP_REASONING_CONTENT, PROP_REASONING_TOKENS, PROP_REQUEST_COMPLEXITY, PROP_ROOT_AGENT_NAME, PROP_RUNTIME, PROP_SCORE_NAME, PROP_SCORE_VALUE, PROP_SDK_VERSION, PROP_SENTIMENT_SCORE, PROP_SESSION_ID, PROP_SESSION_REPLAY_ID, PROP_SPAN_ID, PROP_SPAN_KIND, PROP_SPAN_NAME, PROP_SYSTEM_PROMPT, PROP_SYSTEM_PROMPT_LENGTH, PROP_TARGET_ID, PROP_TARGET_TYPE, PROP_TASK_FAILURE_REASON, PROP_TASK_FAILURE_TYPE, PROP_TEMPERATURE, PROP_TOOL_CALLS, PROP_TOOL_DEFINITIONS, PROP_TOOL_DEFINITIONS_COUNT, PROP_TOOL_DEFINITIONS_HASH, PROP_TOOL_INPUT, PROP_TOOL_NAME, PROP_TOOL_OUTPUT, PROP_TOOL_SUCCESS, PROP_TOP_P, PROP_TOTAL_ATTACHMENT_SIZE, PROP_TOTAL_TOKENS, PROP_TRACE_ID, PROP_TTFB_MS, PROP_TURN_ID, PROP_WAS_CACHED, PROP_WAS_COPIED, SDK_RUNTIME, SDK_VERSION } from "./constants.js";
|
|
5
5
|
|
|
6
6
|
//#region src/core/tracking.d.ts
|
|
7
7
|
declare function serializeToJsonString(value: unknown, maxLength?: number): string;
|
|
@@ -59,6 +59,7 @@ interface TrackAiMessageOptions {
|
|
|
59
59
|
finishReason?: string | null;
|
|
60
60
|
toolCalls?: Array<ToolCallShape | Record<string, unknown>> | null;
|
|
61
61
|
reasoningContent?: string | null;
|
|
62
|
+
toolDefinitions?: Array<Record<string, unknown>> | null;
|
|
62
63
|
systemPrompt?: string | null;
|
|
63
64
|
temperature?: number | null;
|
|
64
65
|
maxOutputTokens?: number | null;
|
|
@@ -248,5 +249,5 @@ interface TrackScoreOptions {
|
|
|
248
249
|
}
|
|
249
250
|
declare function trackScore(opts: TrackScoreOptions): void;
|
|
250
251
|
//#endregion
|
|
251
|
-
export { EVENT_AI_RESPONSE, EVENT_EMBEDDING, EVENT_SCORE, EVENT_SESSION_END, EVENT_SESSION_ENRICHMENT, EVENT_SPAN, EVENT_TOOL_CALL, EVENT_USER_MESSAGE, MAX_SERIALIZED_LENGTH, PROP_ABANDONMENT_TURN, PROP_AGENT_CHAIN, PROP_AGENT_DESCRIPTION, PROP_AGENT_ID, PROP_AGENT_VERSION, PROP_ATTACHMENTS, PROP_ATTACHMENT_COUNT, PROP_ATTACHMENT_TYPES, PROP_CACHE_CREATION_TOKENS, PROP_CACHE_READ_TOKENS, PROP_COMMENT, PROP_COMPONENT_TYPE, PROP_CONTEXT, PROP_COST_USD, PROP_CUSTOMER_ORG_ID, PROP_EDITED_MESSAGE_ID, PROP_EMBEDDING_DIMENSIONS, PROP_ENRICHMENTS, PROP_ENV, PROP_ERROR_MESSAGE, PROP_EVALUATION_SOURCE, PROP_FINISH_REASON, PROP_HAS_ATTACHMENTS, PROP_HAS_REASONING, PROP_IDLE_TIMEOUT_MINUTES, PROP_INPUT_STATE, PROP_INPUT_TOKENS, PROP_INVOCATION_ID, PROP_IS_EDIT, PROP_IS_ERROR, PROP_IS_REGENERATION, PROP_IS_STREAMING, PROP_LATENCY_MS, PROP_LOCALE, PROP_MAX_OUTPUT_TOKENS, PROP_MESSAGE_ID, PROP_MESSAGE_LABELS, PROP_MESSAGE_LABEL_MAP, PROP_MESSAGE_SOURCE, PROP_MODEL_NAME, PROP_MODEL_TIER, PROP_OUTPUT_STATE, PROP_OUTPUT_TOKENS, PROP_PARENT_AGENT_ID, PROP_PARENT_MESSAGE_ID, PROP_PARENT_SPAN_ID, PROP_PROMPT_ID, PROP_PROVIDER, PROP_QUALITY_SCORE, PROP_REASONING_CONTENT, PROP_REASONING_TOKENS, PROP_REQUEST_COMPLEXITY, PROP_ROOT_AGENT_NAME, PROP_RUNTIME, PROP_SCORE_NAME, PROP_SCORE_VALUE, PROP_SDK_VERSION, PROP_SENTIMENT_SCORE, PROP_SESSION_ID, PROP_SESSION_REPLAY_ID, PROP_SPAN_ID, PROP_SPAN_KIND, PROP_SPAN_NAME, PROP_SYSTEM_PROMPT, PROP_SYSTEM_PROMPT_LENGTH, PROP_TARGET_ID, PROP_TARGET_TYPE, PROP_TASK_FAILURE_REASON, PROP_TASK_FAILURE_TYPE, PROP_TEMPERATURE, PROP_TOOL_CALLS, PROP_TOOL_INPUT, PROP_TOOL_NAME, PROP_TOOL_OUTPUT, PROP_TOOL_SUCCESS, PROP_TOP_P, PROP_TOTAL_ATTACHMENT_SIZE, PROP_TOTAL_TOKENS, PROP_TRACE_ID, PROP_TTFB_MS, PROP_TURN_ID, PROP_WAS_CACHED, PROP_WAS_COPIED, SDK_RUNTIME, SDK_VERSION, TrackAiMessageOptions, TrackConversationOptions, TrackEmbeddingOptions, TrackScoreOptions, TrackSessionEndOptions, TrackSessionEnrichmentOptions, TrackSpanOptions, TrackToolCallOptions, TrackUserMessageOptions, serializeToJsonString, trackAiMessage, trackConversation, trackEmbedding, trackScore, trackSessionEnd, trackSessionEnrichment, trackSpan, trackToolCall, trackUserMessage };
|
|
252
|
+
export { EVENT_AI_RESPONSE, EVENT_EMBEDDING, EVENT_SCORE, EVENT_SESSION_END, EVENT_SESSION_ENRICHMENT, EVENT_SPAN, EVENT_TOOL_CALL, EVENT_USER_MESSAGE, MAX_SERIALIZED_LENGTH, PROP_ABANDONMENT_TURN, PROP_AGENT_CHAIN, PROP_AGENT_DESCRIPTION, PROP_AGENT_ID, PROP_AGENT_VERSION, PROP_ATTACHMENTS, PROP_ATTACHMENT_COUNT, PROP_ATTACHMENT_TYPES, PROP_CACHE_CREATION_TOKENS, PROP_CACHE_READ_TOKENS, PROP_COMMENT, PROP_COMPONENT_TYPE, PROP_CONTEXT, PROP_COST_USD, PROP_CUSTOMER_ORG_ID, PROP_EDITED_MESSAGE_ID, PROP_EMBEDDING_DIMENSIONS, PROP_ENRICHMENTS, PROP_ENV, PROP_ERROR_MESSAGE, PROP_EVALUATION_SOURCE, PROP_FINISH_REASON, PROP_HAS_ATTACHMENTS, PROP_HAS_REASONING, PROP_IDLE_TIMEOUT_MINUTES, PROP_INPUT_STATE, PROP_INPUT_TOKENS, PROP_INVOCATION_ID, PROP_IS_EDIT, PROP_IS_ERROR, PROP_IS_REGENERATION, PROP_IS_STREAMING, PROP_LATENCY_MS, PROP_LOCALE, PROP_MAX_OUTPUT_TOKENS, PROP_MESSAGE_ID, PROP_MESSAGE_LABELS, PROP_MESSAGE_LABEL_MAP, PROP_MESSAGE_SOURCE, PROP_MODEL_NAME, PROP_MODEL_TIER, PROP_OUTPUT_STATE, PROP_OUTPUT_TOKENS, PROP_PARENT_AGENT_ID, PROP_PARENT_MESSAGE_ID, PROP_PARENT_SPAN_ID, PROP_PROMPT_ID, PROP_PROVIDER, PROP_QUALITY_SCORE, PROP_REASONING_CONTENT, PROP_REASONING_TOKENS, PROP_REQUEST_COMPLEXITY, PROP_ROOT_AGENT_NAME, PROP_RUNTIME, PROP_SCORE_NAME, PROP_SCORE_VALUE, PROP_SDK_VERSION, PROP_SENTIMENT_SCORE, PROP_SESSION_ID, PROP_SESSION_REPLAY_ID, PROP_SPAN_ID, PROP_SPAN_KIND, PROP_SPAN_NAME, PROP_SYSTEM_PROMPT, PROP_SYSTEM_PROMPT_LENGTH, PROP_TARGET_ID, PROP_TARGET_TYPE, PROP_TASK_FAILURE_REASON, PROP_TASK_FAILURE_TYPE, PROP_TEMPERATURE, PROP_TOOL_CALLS, PROP_TOOL_DEFINITIONS, PROP_TOOL_DEFINITIONS_COUNT, PROP_TOOL_DEFINITIONS_HASH, PROP_TOOL_INPUT, PROP_TOOL_NAME, PROP_TOOL_OUTPUT, PROP_TOOL_SUCCESS, PROP_TOP_P, PROP_TOTAL_ATTACHMENT_SIZE, PROP_TOTAL_TOKENS, PROP_TRACE_ID, PROP_TTFB_MS, PROP_TURN_ID, PROP_WAS_CACHED, PROP_WAS_COPIED, SDK_RUNTIME, SDK_VERSION, TrackAiMessageOptions, TrackConversationOptions, TrackEmbeddingOptions, TrackScoreOptions, TrackSessionEndOptions, TrackSessionEnrichmentOptions, TrackSpanOptions, TrackToolCallOptions, TrackUserMessageOptions, serializeToJsonString, trackAiMessage, trackConversation, trackEmbedding, trackScore, trackSessionEnd, trackSessionEnrichment, trackSpan, trackToolCall, trackUserMessage };
|
|
252
253
|
//# sourceMappingURL=tracking.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracking.d.ts","names":[],"sources":["../../src/core/tracking.ts"],"sourcesContent":[],"mappings":";;;;;;iBA6HgB,qBAAA;UA8BC,uBAAA;EA9BD,SAAA,EA+BH,aA/BwB;EA8BpB,MAAA,EAAA,MAAA;EACJ,cAAA,EAAA,MAAA;EAeD,SAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAII,OAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAEL,MAAA,CAAA,EAAA,MAAA;EACS,SAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EACD,cAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EACR,GAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EACO,MAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAAa,OAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAGf,aAAA,CAAA,EAAA,MAAgB,GAAA,IAAA;EA0Ff,aAAA,CAAA,EAAA,MAAA,GAAqB,IAAA;EACzB,YAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAsBO,WAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAAgB,OAAA,CAAA,EA9HxB,MA8HwB,CAAA,MAAA,EAAA,OAAA,CAAA,GAAA,IAAA;EAAtB,cAAA,CAAA,EAAA,OAAA;
|
|
1
|
+
{"version":3,"file":"tracking.d.ts","names":[],"sources":["../../src/core/tracking.ts"],"sourcesContent":[],"mappings":";;;;;;iBA6HgB,qBAAA;UA8BC,uBAAA;EA9BD,SAAA,EA+BH,aA/BwB;EA8BpB,MAAA,EAAA,MAAA;EACJ,cAAA,EAAA,MAAA;EAeD,SAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAII,OAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAEL,MAAA,CAAA,EAAA,MAAA;EACS,SAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EACD,cAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EACR,GAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EACO,MAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAAa,OAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAGf,aAAA,CAAA,EAAA,MAAgB,GAAA,IAAA;EA0Ff,aAAA,CAAA,EAAA,MAAA,GAAqB,IAAA;EACzB,YAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAsBO,WAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAAgB,OAAA,CAAA,EA9HxB,MA8HwB,CAAA,MAAA,EAAA,OAAA,CAAA,GAAA,IAAA;EAAtB,cAAA,CAAA,EAAA,OAAA;EAEY,MAAA,CAAA,EAAA,OAAA;EAAN,eAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAUJ,WAAA,CAAA,EAtIA,UAsIA,EAAA,GAAA,IAAA;EACL,aAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAQC,MAAA,CAAA,EA7ID,YA6IC,EAAA,GAAA,IAAA;EAEQ,eAAA,CAAA,EA9IA,MA8IA,CAAA,MAAA,EAAA,OAAA,CAAA,GAAA,IAAA;EACD,cAAA,CAAA,EA9IA,MA8IA,CAAA,MAAA,EAAA,OAAA,CAAA,GAAA,IAAA;EACR,MAAA,CAAA,EA9IA,MA8IA,CAAA,MAAA,EAAA,OAAA,CAAA,GAAA,IAAA;EACO,aAAA,CAAA,EA9IA,aA8IA,GAAA,IAAA;;AAGF,iBA9IA,gBAAA,CA8IqB,IAAA,EA9IE,uBA8ImB,CAAA,EAAA,MAAA;AAmJzC,UAvMA,qBAAA,CAuMoB;EACxB,SAAA,EAvMA,aAuMA;EAkBD,MAAA,EAAA,MAAA;EAKQ,SAAA,EAAA,MAAA;EACD,QAAA,EAAA,MAAA;EACR,eAAA,EAAA,MAAA;EACO,SAAA,EAAA,MAAA;EAAa,SAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAGf,OAAA,CAAA,EAAA,MAAa,GAAA,IAAA;EAiFZ,MAAA,CAAA,EAAA,MAAA;EACJ,SAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAEK,cAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAAN,WAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAQA,YAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAEQ,WAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EACD,eAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EACR,oBAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EACO,wBAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAAa,YAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAGf,cAAA,CAAA,EAAA,MAAiB,GAAA,IAAA;EAgEhB,OAAA,CAAA,EAAA,OAAA;EACJ,YAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAgBD,YAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAEQ,SAAA,CAAA,EArYN,KAqYM,CArYA,aAqYA,GArYgB,MAqYhB,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA,GAAA,IAAA;EACT,gBAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EACO,eAAA,CAAA,EArYE,KAqYF,CArYQ,MAqYR,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA,GAAA,IAAA;EAAa,YAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAGf,WAAA,CAAA,EAAA,MAAc,GAAA,IAAA;EA8Db,eAAA,CAAA,EAAA,MAAgB,GAAA,IAAA;EACpB,IAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAKE,WAAA,CAAA,EAAA,OAAA,GAAA,IAAA;EACC,QAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAWJ,SAAA,CAAA,EAAA,OAAA;EAEQ,SAAA,CAAA,EAAA,OAAA;EACT,SAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EACO,WAAA,CAAA,EAldF,UAkdE,EAAA,GAAA,IAAA;EAAa,MAAA,CAAA,EAjdpB,YAidoB,EAAA,GAAA,IAAA;EAGf,GAAA,CAAA,EAAA,MAAS,GAAA,IAAA;EAwER,MAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EACJ,OAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAGG,aAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAQJ,aAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAIQ,YAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EACT,WAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EACO,OAAA,CAAA,EAtiBN,MAsiBM,CAAA,MAAA,EAAA,OAAA,CAAA,GAAA,IAAA;EAAa,QAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAGf,eAAA,CAAA,EAviBI,MAuiBW,CAAA,MAAO,EAAA,OAAA,CAAA,GAAA,IAAA;EA8DrB,cAAA,CAAA,EApmBE,MAomBF,CAAA,MAAA,EAA6B,OAAA,CAAA,GAAA,IAAA;EACjC,MAAA,CAAA,EApmBF,MAomBE,CAAA,MAAA,EAAA,OAAA,CAAA,GAAA,IAAA;EAGE,aAAA,CAAA,EAtmBG,aAsmBH,GAAA,IAAA;;AAUK,iBA7mBJ,cAAA,CA6mBI,IAAA,EA7mBiB,qBA6mBjB,CAAA,EAAA,MAAA;AACT,UA3dM,oBAAA,CA2dN;EACO,SAAA,EA3dL,aA2dK;EAAa,MAAA,EAAA,MAAA;EAGf,QAAA,EAAA,MAAA;EA0DC,OAAA,EAAA,OAAA;EACJ,SAAA,EAAA,MAAA;EAgBD,SAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAEQ,OAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EACT,MAAA,CAAA,EAAA,MAAA;EACO,SAAA,CAAA,EAAA,OAAA;EAAa,UAAA,CAAA,EAAA,OAAA;EAGf,YAAA,CAAU,EAAA,MAAA,GAAA,IAAO;;;;;;;;YA9hBrB;;;;;oBAKQ;mBACD;WACR;kBACO;;iBAGF,aAAA,OAAoB;UAiFnB,wBAAA;aACJ;;YAED,MAAM;;;;;;;;YAQN;;oBAEQ;mBACD;WACR;kBACO;;iBAGF,iBAAA,OAAwB;UAgEvB,qBAAA;aACJ;;;;;;;;;;;;;;;;YAgBD;;oBAEQ;WACT;kBACO;;iBAGF,cAAA,OAAqB;UA8DpB,gBAAA;aACJ;;;;;eAKE;gBACC;;;;;;;;;;;YAWJ;;oBAEQ;WACT;kBACO;;iBAGF,SAAA,OAAgB;UAwEf,sBAAA;aACJ;;;gBAGG;;;;;;;;YAQJ;;;;oBAIQ;WACT;kBACO;;iBAGF,eAAA,OAAsB;UA8DrB,6BAAA;aACJ;;;eAGE;;;;;;;;YAQH;;oBAEQ;WACT;kBACO;;iBAGF,sBAAA,OACR;UAyDS,iBAAA;aACJ;;;;;;;;;;;;;;;;YAgBD;;oBAEQ;WACT;kBACO;;iBAGF,UAAA,OAAiB"}
|