@amplitude/ai 0.1.2 → 0.2.1
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 +3 -1
- package/README.md +44 -15
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +2 -1
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/integrations/anthropic-tools.js +2 -1
- package/dist/integrations/anthropic-tools.js.map +1 -1
- package/dist/integrations/langchain.d.ts.map +1 -1
- package/dist/integrations/langchain.js +35 -5
- package/dist/integrations/langchain.js.map +1 -1
- package/dist/integrations/llamaindex.d.ts.map +1 -1
- package/dist/integrations/llamaindex.js +27 -4
- package/dist/integrations/llamaindex.js.map +1 -1
- package/dist/integrations/openai-agents.js +5 -1
- package/dist/integrations/openai-agents.js.map +1 -1
- package/dist/integrations/opentelemetry.d.ts.map +1 -1
- package/dist/integrations/opentelemetry.js +2 -1
- package/dist/integrations/opentelemetry.js.map +1 -1
- package/dist/mcp/patterns.d.ts.map +1 -1
- package/dist/mcp/patterns.js +6 -0
- package/dist/mcp/patterns.js.map +1 -1
- package/dist/mcp/validate-file.js +1 -1
- package/dist/mcp/validate-file.js.map +1 -1
- package/dist/patching.d.ts.map +1 -1
- package/dist/patching.js +7 -1
- package/dist/patching.js.map +1 -1
- package/dist/providers/anthropic.d.ts.map +1 -1
- package/dist/providers/anthropic.js +7 -2
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/bedrock.d.ts.map +1 -1
- package/dist/providers/bedrock.js +4 -2
- package/dist/providers/bedrock.js.map +1 -1
- package/dist/providers/gemini.d.ts.map +1 -1
- package/dist/providers/gemini.js +4 -2
- package/dist/providers/gemini.js.map +1 -1
- package/dist/providers/mistral.d.ts.map +1 -1
- package/dist/providers/mistral.js +4 -2
- package/dist/providers/mistral.js.map +1 -1
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +14 -4
- package/dist/providers/openai.js.map +1 -1
- package/dist/session.d.ts +23 -0
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +44 -1
- package/dist/session.js.map +1 -1
- package/dist/utils/costs.d.ts +46 -5
- package/dist/utils/costs.d.ts.map +1 -1
- package/dist/utils/costs.js +119 -26
- package/dist/utils/costs.js.map +1 -1
- package/dist/utils/providers.d.ts +6 -1
- package/dist/utils/providers.d.ts.map +1 -1
- package/dist/utils/providers.js +9 -3
- package/dist/utils/providers.js.map +1 -1
- package/llms-full.txt +17 -1
- package/llms.txt +1 -1
- package/mcp.schema.json +1 -1
- package/package.json +1 -1
package/dist/patching.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"patching.js","names":["_activePatches: PatchRecord[]","patched: string[]","providers: Array<{\n fn: (opts: { amplitudeAI: AmplitudeAI; module?: unknown }) => void;\n available: boolean;\n name: string;\n moduleKey: string;\n }>","toRemove: number[]","inputTokens: number | undefined","outputTokens: number | undefined","totalTokens: number | undefined","errorMessage: string | undefined","patchedExportKey: string | null","current: unknown"],"sources":["../src/patching.ts"],"sourcesContent":["/**\n * Monkey-patching for zero-code instrumentation.\n *\n * Port of Python's patch_openai, patch_anthropic, etc.\n * These wrap the provider SDK's methods with tracking instrumentation.\n */\n\nimport type { AmplitudeAI } from './client.js';\nimport { getActiveContext } from './context.js';\nimport {\n _AnthropicModule,\n ANTHROPIC_AVAILABLE,\n} from './providers/anthropic.js';\nimport { _BedrockModule, BEDROCK_AVAILABLE } from './providers/bedrock.js';\nimport { _GeminiModule, GEMINI_AVAILABLE } from './providers/gemini.js';\nimport { _MistralModule, MISTRAL_AVAILABLE } from './providers/mistral.js';\nimport { _OpenAIModule, OPENAI_AVAILABLE } from './providers/openai.js';\n\ntype PatchRecord = {\n module: unknown;\n method: string;\n original: unknown;\n provider: string;\n};\n\nclass PatchOwnershipError extends Error {}\n\nconst _activePatches: PatchRecord[] = [];\nconst _patchedProviders = new Set<string>();\nconst _providerOwners = new Map<string, AmplitudeAI>();\n\nexport function patchedProviders(): string[] {\n return [..._patchedProviders];\n}\n\nfunction _isMethodPatched(\n target: Record<string, unknown>,\n methodName: string,\n): boolean {\n const method = target[methodName] as Record<string, unknown> | undefined;\n return method?.__amplitudePatched === true;\n}\n\nfunction _patchMethod(\n target: Record<string, unknown>,\n methodName: string,\n wrapper: (\n original: (...args: unknown[]) => unknown,\n ...args: unknown[]\n ) => unknown,\n providerName: string,\n): void {\n const original = target[methodName];\n if (typeof original !== 'function') return;\n if (_isMethodPatched(target, methodName)) return;\n\n const patched = function (this: unknown, ...args: unknown[]) {\n return wrapper(original.bind(this), ...args);\n };\n (patched as unknown as Record<string, unknown>).__amplitudePatched = true;\n target[methodName] = patched;\n\n _activePatches.push({\n module: target,\n method: methodName,\n original,\n provider: providerName,\n });\n _patchedProviders.add(providerName);\n}\n\nfunction _assertPatchOwner(providerName: string, ai: AmplitudeAI): void {\n const existingOwner = _providerOwners.get(providerName);\n if (existingOwner == null) {\n _providerOwners.set(providerName, ai);\n return;\n }\n if (existingOwner !== ai) {\n throw new PatchOwnershipError(\n `Provider \"${providerName}\" is already patched by another AmplitudeAI instance. Call unpatch() before patching with a different instance.`,\n );\n }\n}\n\nexport function patchOpenAI(options: {\n amplitudeAI: AmplitudeAI;\n trackCompletions?: boolean;\n module?: unknown;\n}): void {\n const { amplitudeAI } = options;\n const mod =\n (options.module as Record<string, unknown> | null) ?? _OpenAIModule;\n\n if (mod == null) {\n throw new Error(\n 'openai package is not installed. Install it with: npm install openai — or pass the module via the modules option.',\n );\n }\n _assertPatchOwner('openai', amplitudeAI);\n\n if (_patchOpenAIClass(mod.OpenAI, mod, 'OpenAI', amplitudeAI, 'openai')) {\n _patchedProviders.add('openai');\n }\n}\n\nexport function patchAnthropic(options: {\n amplitudeAI: AmplitudeAI;\n module?: unknown;\n}): void {\n const { amplitudeAI } = options;\n const mod =\n (options.module as Record<string, unknown> | null) ?? _AnthropicModule;\n\n if (mod == null) {\n throw new Error(\n '@anthropic-ai/sdk package is not installed. Install it with: npm install @anthropic-ai/sdk — or pass the module via the modules option.',\n );\n }\n _assertPatchOwner('anthropic', amplitudeAI);\n\n const AnthropicClass = mod.Anthropic as\n | { prototype: Record<string, unknown> }\n | undefined;\n if (!AnthropicClass?.prototype) return;\n\n let didPatch = false;\n const messagesProto = _getNestedPrototype(AnthropicClass, ['messages']);\n if (messagesProto) {\n const target = messagesProto as Record<string, unknown>;\n _patchMethod(\n target,\n 'create',\n _makeCompletionWrapper(amplitudeAI, 'anthropic'),\n 'anthropic',\n );\n _patchMethod(\n target,\n 'stream',\n _makeAnthropicStreamWrapper(amplitudeAI),\n 'anthropic',\n );\n didPatch =\n _isMethodPatched(target, 'create') || _isMethodPatched(target, 'stream');\n }\n\n if (didPatch) {\n _patchedProviders.add('anthropic');\n }\n}\n\nexport function patchAzureOpenAI(options: {\n amplitudeAI: AmplitudeAI;\n module?: unknown;\n}): void {\n const { amplitudeAI } = options;\n const mod =\n (options.module as Record<string, unknown> | null) ?? _OpenAIModule;\n if (mod == null) {\n throw new Error(\n 'openai package is not installed. Install it with: npm install openai — or pass the module via the modules option.',\n );\n }\n _assertPatchOwner('azure-openai', amplitudeAI);\n if (\n _patchOpenAIClass(\n mod.AzureOpenAI,\n mod,\n 'AzureOpenAI',\n amplitudeAI,\n 'azure-openai',\n )\n ) {\n _patchedProviders.add('azure-openai');\n }\n}\n\nexport function patchGemini(options: {\n amplitudeAI: AmplitudeAI;\n module?: unknown;\n}): void {\n const { amplitudeAI } = options;\n const mod =\n (options.module as Record<string, unknown> | null) ?? _GeminiModule;\n\n if (mod == null) {\n throw new Error(\n '@google/generative-ai is not installed. Install it with: npm install @google/generative-ai — or pass the module via the modules option.',\n );\n }\n _assertPatchOwner('gemini', amplitudeAI);\n\n const GeminiClass = mod.GoogleGenerativeAI as\n | { prototype: Record<string, unknown> }\n | undefined;\n if (!GeminiClass?.prototype) return;\n const proto = GeminiClass.prototype as Record<string, unknown>;\n _patchMethod(\n proto,\n 'getGenerativeModel',\n (original, ...args) => {\n const modelObj = original(...args);\n if (modelObj == null || typeof modelObj !== 'object') return modelObj;\n const model = modelObj as Record<string, unknown>;\n if (\n typeof model.generateContent === 'function' &&\n !(\n (model.generateContent as unknown as Record<string, unknown>)\n .__amplitudePatched === true\n )\n ) {\n _patchMethod(\n model,\n 'generateContent',\n (innerOriginal, ...innerArgs) => {\n const startTime = performance.now();\n const result = innerOriginal(...innerArgs);\n if (result instanceof Promise) {\n return result\n .then((response) => {\n _trackGeminiResponse(amplitudeAI, response, startTime);\n return response;\n })\n .catch((err) => {\n _trackCompletionError(\n amplitudeAI,\n err,\n startTime,\n innerArgs[0],\n 'gemini',\n );\n throw err;\n });\n }\n return result;\n },\n 'gemini',\n );\n }\n if (\n typeof model.generateContentStream === 'function' &&\n !(\n (model.generateContentStream as unknown as Record<string, unknown>)\n .__amplitudePatched === true\n )\n ) {\n _patchMethod(\n model,\n 'generateContentStream',\n (innerOriginal, ...innerArgs) => {\n const startTime = performance.now();\n const result = innerOriginal(...innerArgs);\n if (result instanceof Promise) {\n return result\n .then((response) => {\n const streamResp = response as Record<string, unknown>;\n const stream = streamResp.stream;\n if (_isAsyncIterable(stream)) {\n return {\n ...streamResp,\n stream: _wrapPatchedStream(\n amplitudeAI,\n stream as AsyncIterable<unknown>,\n startTime,\n innerArgs[0],\n 'gemini',\n ),\n };\n }\n return response;\n })\n .catch((err) => {\n _trackCompletionError(\n amplitudeAI,\n err,\n startTime,\n innerArgs[0],\n 'gemini',\n );\n throw err;\n });\n }\n return result;\n },\n 'gemini',\n );\n }\n return modelObj;\n },\n 'gemini',\n );\n\n if (_isMethodPatched(proto, 'getGenerativeModel')) {\n _patchedProviders.add('gemini');\n }\n}\n\nexport function patchMistral(options: {\n amplitudeAI: AmplitudeAI;\n module?: unknown;\n}): void {\n const { amplitudeAI } = options;\n const mod =\n (options.module as Record<string, unknown> | null) ?? _MistralModule;\n\n if (mod == null) {\n throw new Error(\n '@mistralai/mistralai is not installed. Install it with: npm install @mistralai/mistralai — or pass the module via the modules option.',\n );\n }\n _assertPatchOwner('mistral', amplitudeAI);\n\n const MistralClass = (mod.Mistral ?? mod.MistralClient ?? mod.default) as\n | { prototype: Record<string, unknown> }\n | undefined;\n if (!MistralClass?.prototype) return;\n\n const chatProto = _getNestedPrototype(MistralClass, ['chat']);\n let didPatch = false;\n if (chatProto) {\n const target = chatProto as Record<string, unknown>;\n _patchMethod(\n target,\n 'complete',\n _makeCompletionWrapper(amplitudeAI, 'mistral'),\n 'mistral',\n );\n _patchMethod(\n target,\n 'stream',\n _makeCompletionWrapper(amplitudeAI, 'mistral'),\n 'mistral',\n );\n didPatch =\n _isMethodPatched(target, 'complete') ||\n _isMethodPatched(target, 'stream');\n }\n\n if (didPatch) {\n _patchedProviders.add('mistral');\n }\n}\n\nexport function patchBedrock(options: {\n amplitudeAI: AmplitudeAI;\n module?: unknown;\n}): void {\n const { amplitudeAI } = options;\n const mod =\n (options.module as Record<string, unknown> | null) ?? _BedrockModule;\n\n if (mod == null) {\n throw new Error(\n '@aws-sdk/client-bedrock-runtime is not installed. Install it with: npm install @aws-sdk/client-bedrock-runtime — or pass the module via the modules option.',\n );\n }\n _assertPatchOwner('bedrock', amplitudeAI);\n\n const ClientClass = mod.BedrockRuntimeClient as\n | { prototype: Record<string, unknown> }\n | undefined;\n if (!ClientClass?.prototype) return;\n\n _patchMethod(\n ClientClass.prototype as Record<string, unknown>,\n 'send',\n (original, ...args) => {\n const command = args[0] as Record<string, unknown> | undefined;\n const commandName = String(command?.constructor?.name ?? '');\n const shouldTrack =\n commandName.includes('ConverseCommand') ||\n commandName.includes('ConverseStreamCommand');\n const startTime = performance.now();\n const result = original(...args);\n if (result instanceof Promise) {\n return result\n .then((response) => {\n if (!shouldTrack) {\n return response;\n }\n if (commandName.includes('ConverseStreamCommand')) {\n const streamResp = response as Record<string, unknown>;\n const stream = streamResp.stream;\n if (_isAsyncIterable(stream)) {\n return {\n ...streamResp,\n stream: _wrapPatchedBedrockStream(\n amplitudeAI,\n stream as AsyncIterable<unknown>,\n startTime,\n args[0],\n ),\n };\n }\n } else {\n _trackBedrockResponse(amplitudeAI, response, startTime, args[0]);\n }\n return response;\n })\n .catch((err) => {\n if (shouldTrack) {\n _trackCompletionError(\n amplitudeAI,\n err,\n startTime,\n args[0],\n 'bedrock',\n );\n }\n throw err;\n });\n }\n return result;\n },\n 'bedrock',\n );\n\n if (\n _isMethodPatched(ClientClass.prototype as Record<string, unknown>, 'send')\n ) {\n _patchedProviders.add('bedrock');\n }\n}\n\n/**\n * Auto-detects installed provider SDKs and patches each supported surface.\n *\n * Returns the list of provider names that were successfully patched.\n * Ownership conflicts (same provider patched by a different `AmplitudeAI` instance)\n * throw immediately to prevent ambiguous instrumentation state.\n *\n * In bundler environments where `tryRequire` cannot resolve modules, pass them\n * explicitly via `modules`:\n * ```ts\n * import OpenAI from 'openai';\n * import Anthropic from '@anthropic-ai/sdk';\n * patch({ amplitudeAI: ai, modules: { openai: OpenAI, anthropic: Anthropic } });\n * ```\n */\nexport function patch(options: {\n amplitudeAI: AmplitudeAI;\n modules?: Record<string, unknown>;\n}): string[] {\n const patched: string[] = [];\n const mods = options.modules ?? {};\n const providers: Array<{\n fn: (opts: { amplitudeAI: AmplitudeAI; module?: unknown }) => void;\n available: boolean;\n name: string;\n moduleKey: string;\n }> = [\n {\n fn: patchOpenAI,\n available: OPENAI_AVAILABLE || mods.openai != null,\n name: 'openai',\n moduleKey: 'openai',\n },\n {\n fn: patchAzureOpenAI,\n available: OPENAI_AVAILABLE || mods.openai != null,\n name: 'azure-openai',\n moduleKey: 'openai',\n },\n {\n fn: patchAnthropic,\n available: ANTHROPIC_AVAILABLE || mods.anthropic != null,\n name: 'anthropic',\n moduleKey: 'anthropic',\n },\n {\n fn: patchGemini,\n available: GEMINI_AVAILABLE || mods.gemini != null,\n name: 'gemini',\n moduleKey: 'gemini',\n },\n {\n fn: patchMistral,\n available: MISTRAL_AVAILABLE || mods.mistral != null,\n name: 'mistral',\n moduleKey: 'mistral',\n },\n {\n fn: patchBedrock,\n available: BEDROCK_AVAILABLE || mods.bedrock != null,\n name: 'bedrock',\n moduleKey: 'bedrock',\n },\n ];\n for (const { fn, available, name, moduleKey } of providers) {\n if (!available) continue;\n try {\n fn({ amplitudeAI: options.amplitudeAI, module: mods[moduleKey] });\n if (_patchedProviders.has(name)) {\n patched.push(name);\n }\n } catch (error) {\n if (error instanceof PatchOwnershipError) {\n throw error;\n }\n // provider setup failed\n }\n }\n return patched;\n}\n\nexport function unpatch(): void {\n for (const record of _activePatches.reverse()) {\n const target = record.module as Record<string, unknown>;\n target[record.method] = record.original;\n }\n _activePatches.length = 0;\n _patchedProviders.clear();\n _providerOwners.clear();\n}\n\nexport function unpatchOpenAI(): void {\n _unpatchByProvider('openai');\n}\n\nexport function unpatchAnthropic(): void {\n _unpatchByProvider('anthropic');\n}\n\nexport function unpatchGemini(): void {\n _unpatchByProvider('gemini');\n}\n\nexport function unpatchMistral(): void {\n _unpatchByProvider('mistral');\n}\n\nexport function unpatchBedrock(): void {\n _unpatchByProvider('bedrock');\n}\n\nexport function unpatchAzureOpenAI(): void {\n _unpatchByProvider('azure-openai');\n}\n\nfunction _unpatchByProvider(providerName: string): void {\n const toRemove: number[] = [];\n for (let i = _activePatches.length - 1; i >= 0; i--) {\n const record = _activePatches[i];\n if (record == null) continue;\n if (\n (record as unknown as { provider?: string }).provider === providerName\n ) {\n const target = record.module as Record<string, unknown>;\n target[record.method] = record.original;\n toRemove.push(i);\n }\n }\n for (const idx of toRemove) {\n _activePatches.splice(idx, 1);\n }\n _patchedProviders.delete(providerName);\n _providerOwners.delete(providerName);\n}\n\n// ---------------------------------------------------------------\n// Shared wrapper factory for completion-style endpoints\n// ---------------------------------------------------------------\n\nfunction _makeCompletionWrapper(\n amplitudeAI: AmplitudeAI,\n providerName: string,\n): (original: (...args: unknown[]) => unknown, ...args: unknown[]) => unknown {\n return (original, ...args) => {\n const startTime = performance.now();\n const result = original(...args);\n if (result instanceof Promise) {\n return result\n .then((response) => {\n if (_isAsyncIterable(response)) {\n if (providerName === 'anthropic') {\n return _wrapPatchedAnthropicStream(\n amplitudeAI,\n response as AsyncIterable<unknown>,\n startTime,\n args[0],\n );\n }\n return _wrapPatchedStream(\n amplitudeAI,\n response as AsyncIterable<unknown>,\n startTime,\n args[0],\n providerName,\n );\n }\n if (providerName === 'anthropic') {\n _trackAnthropicResponse(amplitudeAI, response, startTime, args[0]);\n } else {\n _trackCompletionResponse(\n amplitudeAI,\n response,\n startTime,\n args[0],\n providerName,\n );\n }\n return response;\n })\n .catch((err) => {\n _trackCompletionError(\n amplitudeAI,\n err,\n startTime,\n args[0],\n providerName,\n );\n throw err;\n });\n }\n return result;\n };\n}\n\nfunction _makeAnthropicStreamWrapper(\n amplitudeAI: AmplitudeAI,\n): (original: (...args: unknown[]) => unknown, ...args: unknown[]) => unknown {\n return (original, ...args) => {\n const startTime = performance.now();\n const result = original(...args);\n if (!(result instanceof Promise)) return result;\n return result\n .then((response) => {\n if (_isAsyncIterable(response)) {\n return _wrapPatchedAnthropicStream(\n amplitudeAI,\n response as AsyncIterable<unknown>,\n startTime,\n args[0],\n );\n }\n const respObj = response as Record<string, unknown>;\n const stream = respObj.stream;\n if (_isAsyncIterable(stream)) {\n return {\n ...respObj,\n stream: _wrapPatchedAnthropicStream(\n amplitudeAI,\n stream as AsyncIterable<unknown>,\n startTime,\n args[0],\n ),\n };\n }\n return response;\n })\n .catch((err) => {\n _trackCompletionError(\n amplitudeAI,\n err,\n startTime,\n args[0],\n 'anthropic',\n );\n throw err;\n });\n };\n}\n\nfunction _isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return (\n value != null &&\n typeof (value as Record<symbol, unknown>)[Symbol.asyncIterator] ===\n 'function'\n );\n}\n\nasync function* _wrapPatchedStream(\n ai: AmplitudeAI,\n stream: AsyncIterable<unknown>,\n startTime: number,\n requestOpts: unknown,\n providerName: string,\n): AsyncGenerator<unknown> {\n if (providerName === 'gemini') {\n yield* _wrapPatchedGeminiStream(ai, stream, startTime, requestOpts);\n return;\n }\n const ctx = getActiveContext();\n if (ctx == null) {\n yield* stream;\n return;\n }\n\n let content = '';\n let model = 'unknown';\n let finishReason = '';\n let inputTokens: number | undefined;\n let outputTokens: number | undefined;\n let totalTokens: number | undefined;\n let isError = false;\n let errorMessage: string | undefined;\n\n try {\n for await (const chunk of stream) {\n const c = chunk as Record<string, unknown>;\n const choices = c.choices as Array<Record<string, unknown>> | undefined;\n const delta = choices?.[0]?.delta as Record<string, unknown> | undefined;\n if (delta?.content != null) content += String(delta.content);\n if (c.model != null) model = String(c.model);\n if (choices?.[0]?.finish_reason != null)\n finishReason = String(choices[0].finish_reason);\n const usage = c.usage as Record<string, number> | undefined;\n if (usage != null) {\n inputTokens = usage.prompt_tokens;\n outputTokens = usage.completion_tokens;\n totalTokens = usage.total_tokens;\n }\n yield chunk;\n }\n } catch (error) {\n isError = true;\n errorMessage = error instanceof Error ? error.message : String(error);\n throw error;\n } finally {\n const latencyMs = performance.now() - startTime;\n ai.trackAiMessage({\n userId: ctx.userId ?? 'unknown',\n content,\n sessionId: ctx.sessionId,\n model,\n provider: providerName,\n latencyMs,\n traceId: ctx.traceId,\n inputTokens,\n outputTokens,\n totalTokens,\n finishReason,\n agentId: ctx.agentId,\n env: ctx.env,\n isStreaming: true,\n isError,\n errorMessage,\n ..._contextExtras(ctx),\n });\n }\n}\n\nasync function* _wrapPatchedAnthropicStream(\n ai: AmplitudeAI,\n stream: AsyncIterable<unknown>,\n startTime: number,\n requestOpts: unknown,\n): AsyncGenerator<unknown> {\n const ctx = getActiveContext();\n if (ctx == null) {\n yield* stream;\n return;\n }\n const req = requestOpts as Record<string, unknown> | undefined;\n let content = '';\n let model = String(req?.model ?? 'unknown');\n let finishReason = '';\n let inputTokens: number | undefined;\n let outputTokens: number | undefined;\n let isError = false;\n let errorMessage: string | undefined;\n try {\n for await (const chunk of stream) {\n const c = chunk as Record<string, unknown>;\n if (c.type === 'message_start') {\n const message = c.message as Record<string, unknown> | undefined;\n if (typeof message?.model === 'string') model = message.model;\n const usage = message?.usage as Record<string, unknown> | undefined;\n if (typeof usage?.input_tokens === 'number') {\n inputTokens = usage.input_tokens;\n }\n }\n if (c.type === 'content_block_delta') {\n const delta = c.delta as Record<string, unknown> | undefined;\n if (typeof delta?.text === 'string') content += delta.text;\n }\n if (c.type === 'message_delta') {\n const delta = c.delta as Record<string, unknown> | undefined;\n if (typeof delta?.stop_reason === 'string') {\n finishReason = delta.stop_reason;\n } else if (typeof c.stop_reason === 'string') {\n // Backward-compatible fallback for alternate SDK payload shapes.\n finishReason = c.stop_reason;\n }\n const usage = c.usage as Record<string, unknown> | undefined;\n if (typeof usage?.output_tokens === 'number') {\n outputTokens = usage.output_tokens;\n }\n }\n if (c.type === 'message_stop') {\n const usage = c.usage as Record<string, unknown> | undefined;\n if (typeof usage?.output_tokens === 'number')\n outputTokens = usage.output_tokens;\n }\n yield chunk;\n }\n } catch (error) {\n isError = true;\n errorMessage = error instanceof Error ? error.message : String(error);\n throw error;\n } finally {\n const latencyMs = performance.now() - startTime;\n ai.trackAiMessage({\n userId: ctx.userId ?? 'unknown',\n content,\n sessionId: ctx.sessionId,\n model,\n provider: 'anthropic',\n latencyMs,\n traceId: ctx.traceId,\n inputTokens,\n outputTokens,\n finishReason,\n agentId: ctx.agentId,\n env: ctx.env,\n isStreaming: true,\n isError,\n errorMessage,\n ..._contextExtras(ctx),\n });\n }\n}\n\nasync function* _wrapPatchedGeminiStream(\n ai: AmplitudeAI,\n stream: AsyncIterable<unknown>,\n startTime: number,\n _requestOpts: unknown,\n): AsyncGenerator<unknown> {\n const ctx = getActiveContext();\n if (ctx == null) {\n yield* stream;\n return;\n }\n let content = '';\n const model = 'gemini';\n let finishReason = '';\n let inputTokens: number | undefined;\n let outputTokens: number | undefined;\n let totalTokens: number | undefined;\n let isError = false;\n let errorMessage: string | undefined;\n try {\n for await (const chunk of stream) {\n const c = chunk as Record<string, unknown>;\n const respObj = (c.response ?? c) as Record<string, unknown>;\n const textFn = respObj.text;\n if (typeof textFn === 'function') content += String(textFn());\n const usage = respObj.usageMetadata as\n | Record<string, unknown>\n | undefined;\n if (typeof usage?.promptTokenCount === 'number') {\n inputTokens = usage.promptTokenCount;\n }\n if (typeof usage?.candidatesTokenCount === 'number') {\n outputTokens = usage.candidatesTokenCount;\n }\n if (typeof usage?.totalTokenCount === 'number') {\n totalTokens = usage.totalTokenCount;\n }\n const candidates = respObj.candidates as\n | Array<Record<string, unknown>>\n | undefined;\n if (typeof candidates?.[0]?.finishReason === 'string') {\n finishReason = candidates[0].finishReason;\n }\n yield chunk;\n }\n } catch (error) {\n isError = true;\n errorMessage = error instanceof Error ? error.message : String(error);\n throw error;\n } finally {\n ai.trackAiMessage({\n userId: ctx.userId ?? 'unknown',\n content,\n sessionId: ctx.sessionId,\n model,\n provider: 'gemini',\n latencyMs: performance.now() - startTime,\n traceId: ctx.traceId,\n inputTokens,\n outputTokens,\n totalTokens,\n finishReason,\n agentId: ctx.agentId,\n env: ctx.env,\n isStreaming: true,\n isError,\n errorMessage,\n ..._contextExtras(ctx),\n });\n }\n}\n\nasync function* _wrapPatchedBedrockStream(\n ai: AmplitudeAI,\n stream: AsyncIterable<unknown>,\n startTime: number,\n requestOpts: unknown,\n): AsyncGenerator<unknown> {\n const ctx = getActiveContext();\n if (ctx == null) {\n yield* stream;\n return;\n }\n const opts = requestOpts as Record<string, unknown> | undefined;\n let model = String(opts?.modelId ?? 'unknown');\n let content = '';\n let finishReason = '';\n let inputTokens: number | undefined;\n let outputTokens: number | undefined;\n let totalTokens: number | undefined;\n let isError = false;\n let errorMessage: string | undefined;\n try {\n for await (const rawEvent of stream) {\n const event = rawEvent as Record<string, unknown>;\n const delta = (\n event.contentBlockDelta as Record<string, unknown> | undefined\n )?.delta as Record<string, unknown> | undefined;\n if (typeof delta?.text === 'string') content += delta.text;\n const messageStart = event.messageStart as\n | Record<string, unknown>\n | undefined;\n if (typeof messageStart?.model === 'string') model = messageStart.model;\n const messageStop = event.messageStop as\n | Record<string, unknown>\n | undefined;\n if (typeof messageStop?.stopReason === 'string') {\n finishReason = messageStop.stopReason;\n }\n const usage = (event.metadata as Record<string, unknown> | undefined)\n ?.usage as Record<string, unknown> | undefined;\n if (typeof usage?.inputTokens === 'number')\n inputTokens = usage.inputTokens;\n if (typeof usage?.outputTokens === 'number')\n outputTokens = usage.outputTokens;\n if (typeof usage?.totalTokens === 'number')\n totalTokens = usage.totalTokens;\n yield rawEvent;\n }\n } catch (error) {\n isError = true;\n errorMessage = error instanceof Error ? error.message : String(error);\n throw error;\n } finally {\n ai.trackAiMessage({\n userId: ctx.userId ?? 'unknown',\n content,\n sessionId: ctx.sessionId,\n model,\n provider: 'bedrock',\n latencyMs: performance.now() - startTime,\n traceId: ctx.traceId,\n inputTokens,\n outputTokens,\n totalTokens,\n finishReason,\n agentId: ctx.agentId,\n env: ctx.env,\n isStreaming: true,\n isError,\n errorMessage,\n ..._contextExtras(ctx),\n });\n }\n}\n\n// ---------------------------------------------------------------\n// Constructor patching for SDKs with lazy getters (e.g., OpenAI v5+)\n// ---------------------------------------------------------------\n\nfunction _patchConstructor(\n cls: { prototype: Record<string, unknown> },\n moduleExports: Record<string, unknown>,\n exportKey: string,\n amplitudeAI: AmplitudeAI,\n providerName: string,\n): void {\n if (\n (moduleExports[exportKey] as Record<string, unknown> | undefined)\n ?.__amplitudeCtorPatched === true\n ) {\n return;\n }\n const originalCtor = cls as unknown as new (...args: unknown[]) => unknown;\n const handler: ProxyHandler<typeof originalCtor> = {\n construct(target, args, newTarget) {\n const instance = Reflect.construct(target, args, newTarget) as Record<\n string,\n unknown\n >;\n _patchInstanceCompletions(instance, amplitudeAI, providerName);\n return instance;\n },\n };\n const proxy = new Proxy(originalCtor, handler);\n (proxy as unknown as Record<string, unknown>).__amplitudeCtorPatched = true;\n\n const mod = moduleExports;\n let patchedExportKey: string | null = null;\n if (mod[exportKey] === originalCtor) {\n mod[exportKey] = proxy;\n patchedExportKey = exportKey;\n } else {\n for (const key of Object.keys(mod)) {\n if (mod[key] === originalCtor) {\n mod[key] = proxy;\n patchedExportKey = key;\n }\n }\n }\n if (patchedExportKey != null) {\n _activePatches.push({\n module: mod,\n method: patchedExportKey,\n original: originalCtor,\n provider: providerName,\n });\n }\n}\n\nfunction _patchOpenAIClass(\n maybeClass: unknown,\n moduleExports: Record<string, unknown>,\n exportKey: string,\n amplitudeAI: AmplitudeAI,\n providerName: string,\n): boolean {\n const OpenAIClass = maybeClass as\n | { prototype: Record<string, unknown> }\n | undefined;\n if (!OpenAIClass?.prototype) return false;\n\n const completionsProto = _getNestedPrototype(OpenAIClass, [\n 'chat',\n 'completions',\n ]);\n if (completionsProto) {\n const target = completionsProto as Record<string, unknown>;\n _patchMethod(\n target,\n 'create',\n _makeCompletionWrapper(amplitudeAI, providerName),\n providerName,\n );\n _patchMethod(\n target,\n 'parse',\n _makeCompletionWrapper(amplitudeAI, providerName),\n providerName,\n );\n } else {\n _patchConstructor(\n OpenAIClass,\n moduleExports,\n exportKey,\n amplitudeAI,\n providerName,\n );\n }\n\n const responsesProto = _getNestedPrototype(OpenAIClass, ['responses']);\n if (responsesProto) {\n const target = responsesProto as Record<string, unknown>;\n _patchMethod(\n target,\n 'create',\n _makeResponsesWrapper(amplitudeAI, providerName),\n providerName,\n );\n _patchMethod(\n target,\n 'stream',\n _makeResponsesWrapper(amplitudeAI, providerName),\n providerName,\n );\n }\n return true;\n}\n\nfunction _patchInstanceCompletions(\n instance: Record<string, unknown>,\n amplitudeAI: AmplitudeAI,\n providerName: string,\n): void {\n try {\n const chat = instance.chat as Record<string, unknown> | undefined;\n const completions = chat?.completions as\n | Record<string, unknown>\n | undefined;\n if (completions && typeof completions.create === 'function') {\n const original = completions.create.bind(completions);\n completions.create = (...args: unknown[]) =>\n _makeCompletionWrapper(amplitudeAI, providerName)(original, ...args);\n }\n if (completions && typeof completions.parse === 'function') {\n const originalParse = completions.parse.bind(completions);\n completions.parse = (...args: unknown[]) =>\n _makeCompletionWrapper(amplitudeAI, providerName)(\n originalParse,\n ...args,\n );\n }\n\n const responses = instance.responses as Record<string, unknown> | undefined;\n if (responses && typeof responses.create === 'function') {\n const originalResponses = responses.create.bind(responses);\n responses.create = (...args: unknown[]) =>\n _makeResponsesWrapper(amplitudeAI, providerName)(\n originalResponses,\n ...args,\n );\n }\n if (responses && typeof responses.stream === 'function') {\n const originalResponsesStream = responses.stream.bind(responses);\n responses.stream = (...args: unknown[]) =>\n _makeResponsesWrapper(amplitudeAI, providerName)(\n originalResponsesStream,\n ...args,\n );\n }\n } catch {\n // Instance structure doesn't match expectations — skip silently\n }\n}\n\nfunction _makeResponsesWrapper(\n amplitudeAI: AmplitudeAI,\n providerName: string,\n): (original: (...args: unknown[]) => unknown, ...args: unknown[]) => unknown {\n return (original, ...args) => {\n const startTime = performance.now();\n const result = original(...args);\n if (result instanceof Promise) {\n return result\n .then((response) => {\n if (_isAsyncIterable(response)) {\n return _wrapPatchedResponsesStream(\n amplitudeAI,\n response as AsyncIterable<unknown>,\n startTime,\n args[0],\n providerName,\n );\n }\n _trackResponsesResponse(\n amplitudeAI,\n response,\n startTime,\n args[0],\n providerName,\n );\n return response;\n })\n .catch((err) => {\n _trackCompletionError(\n amplitudeAI,\n err,\n startTime,\n args[0],\n providerName,\n );\n throw err;\n });\n }\n return result;\n };\n}\n\n// ---------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------\n\nfunction _getNestedPrototype(\n cls: { prototype: Record<string, unknown> },\n path: string[],\n): unknown {\n let current: unknown = cls.prototype;\n for (const key of path) {\n if (current == null || typeof current !== 'object') return null;\n const obj = current as Record<string, unknown>;\n if (typeof obj[key] === 'object' && obj[key] != null) {\n current = obj[key];\n } else {\n return null;\n }\n }\n return current;\n}\n\nfunction _trackCompletionResponse(\n ai: AmplitudeAI,\n response: unknown,\n startTime: number,\n _requestOpts: unknown,\n providerName: string,\n): void {\n if (response == null || typeof response !== 'object') return;\n\n const ctx = getActiveContext();\n if (ctx == null) return;\n\n const resp = response as Record<string, unknown>;\n const usage = resp.usage as Record<string, number> | undefined;\n const choices = resp.choices as Array<Record<string, unknown>> | undefined;\n const choice = choices?.[0];\n const message = choice?.message as Record<string, unknown> | undefined;\n\n const latencyMs = performance.now() - startTime;\n\n ai.trackAiMessage({\n userId: ctx.userId ?? 'unknown',\n content: String(message?.content ?? ''),\n sessionId: ctx.sessionId,\n model: String(resp.model ?? 'unknown'),\n provider: providerName,\n latencyMs,\n traceId: ctx.traceId,\n inputTokens: usage?.prompt_tokens,\n outputTokens: usage?.completion_tokens,\n totalTokens: usage?.total_tokens,\n finishReason: String(choice?.finish_reason ?? ''),\n agentId: ctx.agentId,\n env: ctx.env,\n ..._contextExtras(ctx),\n });\n}\n\nfunction _trackAnthropicResponse(\n ai: AmplitudeAI,\n response: unknown,\n startTime: number,\n _requestOpts: unknown,\n): void {\n if (response == null || typeof response !== 'object') return;\n\n const ctx = getActiveContext();\n if (ctx == null) return;\n\n const resp = response as Record<string, unknown>;\n const usage = resp.usage as Record<string, number> | undefined;\n const content = resp.content as Array<Record<string, unknown>> | undefined;\n const textBlock = content?.find((b) => b.type === 'text');\n\n const latencyMs = performance.now() - startTime;\n\n ai.trackAiMessage({\n userId: ctx.userId ?? 'unknown',\n content: String(textBlock?.text ?? ''),\n sessionId: ctx.sessionId,\n model: String(resp.model ?? 'unknown'),\n provider: 'anthropic',\n latencyMs,\n traceId: ctx.traceId,\n inputTokens: usage?.input_tokens,\n outputTokens: usage?.output_tokens,\n finishReason: String(resp.stop_reason ?? ''),\n agentId: ctx.agentId,\n env: ctx.env,\n ..._contextExtras(ctx),\n });\n}\n\nfunction _trackCompletionError(\n ai: AmplitudeAI,\n error: unknown,\n startTime: number,\n requestOpts: unknown,\n providerName: string,\n): void {\n const ctx = getActiveContext();\n if (ctx == null) return;\n\n const opts = requestOpts as Record<string, unknown> | undefined;\n const latencyMs = performance.now() - startTime;\n\n ai.trackAiMessage({\n userId: ctx.userId ?? 'unknown',\n content: '',\n sessionId: ctx.sessionId,\n model: String(opts?.model ?? opts?.modelId ?? 'unknown'),\n provider: providerName,\n latencyMs,\n traceId: ctx.traceId,\n isError: true,\n errorMessage: error instanceof Error ? error.message : String(error),\n agentId: ctx.agentId,\n env: ctx.env,\n ..._contextExtras(ctx),\n });\n}\n\nfunction _trackGeminiResponse(\n ai: AmplitudeAI,\n response: unknown,\n startTime: number,\n): void {\n if (response == null || typeof response !== 'object') return;\n\n const ctx = getActiveContext();\n if (ctx == null) return;\n\n const resp = response as Record<string, unknown>;\n const respObj = (resp.response ?? resp) as Record<string, unknown>;\n const text = typeof respObj.text === 'function' ? String(respObj.text()) : '';\n const usage = respObj.usageMetadata as Record<string, number> | undefined;\n\n const latencyMs = performance.now() - startTime;\n\n ai.trackAiMessage({\n userId: ctx.userId ?? 'unknown',\n content: text,\n sessionId: ctx.sessionId,\n model: 'gemini',\n provider: 'gemini',\n latencyMs,\n traceId: ctx.traceId,\n inputTokens: usage?.promptTokenCount,\n outputTokens: usage?.candidatesTokenCount,\n totalTokens: usage?.totalTokenCount,\n agentId: ctx.agentId,\n env: ctx.env,\n ..._contextExtras(ctx),\n });\n}\n\nfunction _trackBedrockResponse(\n ai: AmplitudeAI,\n response: unknown,\n startTime: number,\n requestOpts: unknown,\n): void {\n if (response == null || typeof response !== 'object') return;\n\n const ctx = getActiveContext();\n if (ctx == null) return;\n\n const resp = response as Record<string, unknown>;\n const output = resp.output as Record<string, unknown> | undefined;\n const message = output?.message as Record<string, unknown> | undefined;\n const content = message?.content as\n | Array<Record<string, unknown>>\n | undefined;\n const textBlock = content?.find((b) => b.text != null);\n const usage = resp.usage as Record<string, number> | undefined;\n const opts = requestOpts as Record<string, unknown> | undefined;\n\n const latencyMs = performance.now() - startTime;\n\n ai.trackAiMessage({\n userId: ctx.userId ?? 'unknown',\n content: String(textBlock?.text ?? ''),\n sessionId: ctx.sessionId,\n model: String(opts?.modelId ?? 'unknown'),\n provider: 'bedrock',\n latencyMs,\n traceId: ctx.traceId,\n inputTokens: usage?.inputTokens,\n outputTokens: usage?.outputTokens,\n totalTokens: usage?.totalTokens,\n finishReason: String(resp.stopReason ?? ''),\n agentId: ctx.agentId,\n env: ctx.env,\n ..._contextExtras(ctx),\n });\n}\n\nfunction _trackResponsesResponse(\n ai: AmplitudeAI,\n response: unknown,\n startTime: number,\n requestOpts: unknown,\n providerName: string,\n): void {\n if (response == null || typeof response !== 'object') return;\n const ctx = getActiveContext();\n if (ctx == null) return;\n\n const resp = response as Record<string, unknown>;\n const usage = resp.usage as Record<string, unknown> | undefined;\n const outputText =\n typeof resp.output_text === 'string'\n ? resp.output_text\n : _extractResponsesText(resp.output);\n const opts = requestOpts as Record<string, unknown> | undefined;\n\n ai.trackAiMessage({\n userId: ctx.userId ?? 'unknown',\n content: outputText,\n sessionId: ctx.sessionId,\n model: String(resp.model ?? opts?.model ?? 'unknown'),\n provider: providerName,\n latencyMs: performance.now() - startTime,\n traceId: ctx.traceId,\n inputTokens:\n typeof usage?.input_tokens === 'number'\n ? (usage.input_tokens as number)\n : undefined,\n outputTokens:\n typeof usage?.output_tokens === 'number'\n ? (usage.output_tokens as number)\n : undefined,\n totalTokens:\n typeof usage?.total_tokens === 'number'\n ? (usage.total_tokens as number)\n : undefined,\n reasoningTokens:\n typeof (\n usage?.output_tokens_details as Record<string, unknown> | undefined\n )?.reasoning_tokens === 'number'\n ? ((usage?.output_tokens_details as Record<string, unknown>)\n .reasoning_tokens as number)\n : undefined,\n finishReason: _extractResponsesFinishReason(resp),\n agentId: ctx.agentId,\n env: ctx.env,\n ..._contextExtras(ctx),\n });\n}\n\nasync function* _wrapPatchedResponsesStream(\n ai: AmplitudeAI,\n stream: AsyncIterable<unknown>,\n startTime: number,\n requestOpts: unknown,\n providerName: string,\n): AsyncGenerator<unknown> {\n const ctx = getActiveContext();\n if (ctx == null) {\n yield* stream;\n return;\n }\n const opts = requestOpts as Record<string, unknown> | undefined;\n const model = String(opts?.model ?? 'unknown');\n let content = '';\n let finishReason = '';\n let inputTokens: number | undefined;\n let outputTokens: number | undefined;\n let totalTokens: number | undefined;\n let isError = false;\n let errorMessage: string | undefined;\n\n try {\n for await (const event of stream) {\n const e = event as Record<string, unknown>;\n const type = e.type as string | undefined;\n if (type === 'response.output_text.delta') {\n const delta = e.delta;\n if (typeof delta === 'string') content += delta;\n } else if (type === 'response.completed') {\n const response = e.response as Record<string, unknown> | undefined;\n const usage = response?.usage as Record<string, unknown> | undefined;\n const outputText = response?.output_text;\n if (typeof outputText === 'string' && outputText.length > 0) {\n content = outputText;\n }\n if (typeof usage?.input_tokens === 'number')\n inputTokens = usage.input_tokens;\n if (typeof usage?.output_tokens === 'number')\n outputTokens = usage.output_tokens;\n if (typeof usage?.total_tokens === 'number')\n totalTokens = usage.total_tokens;\n const status = response?.status;\n if (typeof status === 'string') finishReason = status;\n }\n yield event;\n }\n } catch (error) {\n isError = true;\n errorMessage = error instanceof Error ? error.message : String(error);\n throw error;\n } finally {\n ai.trackAiMessage({\n userId: ctx.userId ?? 'unknown',\n content,\n sessionId: ctx.sessionId,\n model,\n provider: providerName,\n latencyMs: performance.now() - startTime,\n traceId: ctx.traceId,\n inputTokens,\n outputTokens,\n totalTokens,\n finishReason,\n agentId: ctx.agentId,\n env: ctx.env,\n isStreaming: true,\n isError,\n errorMessage,\n ..._contextExtras(ctx),\n });\n }\n}\n\nfunction _extractResponsesText(output: unknown): string {\n if (!Array.isArray(output)) return '';\n let text = '';\n for (const item of output) {\n if (item == null || typeof item !== 'object') continue;\n const content = (item as Record<string, unknown>).content;\n if (!Array.isArray(content)) continue;\n for (const part of content) {\n if (part == null || typeof part !== 'object') continue;\n const partText = (part as Record<string, unknown>).text;\n if (typeof partText === 'string') text += partText;\n }\n }\n return text;\n}\n\nfunction _extractResponsesFinishReason(\n response: Record<string, unknown>,\n): string | undefined {\n if (typeof response.status === 'string' && response.status.length > 0) {\n return response.status;\n }\n const output = response.output;\n if (!Array.isArray(output) || output.length === 0) return undefined;\n const first = output[0] as Record<string, unknown> | undefined;\n return typeof first?.status === 'string' ? first.status : undefined;\n}\n\nfunction _contextExtras(ctx: {\n parentAgentId?: string | null;\n customerOrgId?: string | null;\n agentVersion?: string | null;\n context?: Record<string, unknown> | null;\n groups?: Record<string, unknown> | null;\n}): Record<string, unknown> {\n return {\n parentAgentId: ctx.parentAgentId ?? undefined,\n customerOrgId: ctx.customerOrgId ?? undefined,\n agentVersion: ctx.agentVersion ?? undefined,\n context: ctx.context ?? undefined,\n groups: ctx.groups ?? undefined,\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"patching.js","names":["_activePatches: PatchRecord[]","patched: string[]","providers: Array<{\n fn: (opts: { amplitudeAI: AmplitudeAI; module?: unknown }) => void;\n available: boolean;\n name: string;\n moduleKey: string;\n }>","toRemove: number[]","inputTokens: number | undefined","outputTokens: number | undefined","totalTokens: number | undefined","errorMessage: string | undefined","patchedExportKey: string | null","current: unknown","extras: Record<string, unknown>","ep: Record<string, unknown>"],"sources":["../src/patching.ts"],"sourcesContent":["/**\n * Monkey-patching for zero-code instrumentation.\n *\n * Port of Python's patch_openai, patch_anthropic, etc.\n * These wrap the provider SDK's methods with tracking instrumentation.\n */\n\nimport type { AmplitudeAI } from './client.js';\nimport { getActiveContext } from './context.js';\nimport {\n PROP_IDLE_TIMEOUT_MINUTES,\n PROP_SESSION_REPLAY_ID,\n} from './core/constants.js';\nimport {\n _AnthropicModule,\n ANTHROPIC_AVAILABLE,\n} from './providers/anthropic.js';\nimport { _BedrockModule, BEDROCK_AVAILABLE } from './providers/bedrock.js';\nimport { _GeminiModule, GEMINI_AVAILABLE } from './providers/gemini.js';\nimport { _MistralModule, MISTRAL_AVAILABLE } from './providers/mistral.js';\nimport { _OpenAIModule, OPENAI_AVAILABLE } from './providers/openai.js';\n\ntype PatchRecord = {\n module: unknown;\n method: string;\n original: unknown;\n provider: string;\n};\n\nclass PatchOwnershipError extends Error {}\n\nconst _activePatches: PatchRecord[] = [];\nconst _patchedProviders = new Set<string>();\nconst _providerOwners = new Map<string, AmplitudeAI>();\n\nexport function patchedProviders(): string[] {\n return [..._patchedProviders];\n}\n\nfunction _isMethodPatched(\n target: Record<string, unknown>,\n methodName: string,\n): boolean {\n const method = target[methodName] as Record<string, unknown> | undefined;\n return method?.__amplitudePatched === true;\n}\n\nfunction _patchMethod(\n target: Record<string, unknown>,\n methodName: string,\n wrapper: (\n original: (...args: unknown[]) => unknown,\n ...args: unknown[]\n ) => unknown,\n providerName: string,\n): void {\n const original = target[methodName];\n if (typeof original !== 'function') return;\n if (_isMethodPatched(target, methodName)) return;\n\n const patched = function (this: unknown, ...args: unknown[]) {\n return wrapper(original.bind(this), ...args);\n };\n (patched as unknown as Record<string, unknown>).__amplitudePatched = true;\n target[methodName] = patched;\n\n _activePatches.push({\n module: target,\n method: methodName,\n original,\n provider: providerName,\n });\n _patchedProviders.add(providerName);\n}\n\nfunction _assertPatchOwner(providerName: string, ai: AmplitudeAI): void {\n const existingOwner = _providerOwners.get(providerName);\n if (existingOwner == null) {\n _providerOwners.set(providerName, ai);\n return;\n }\n if (existingOwner !== ai) {\n throw new PatchOwnershipError(\n `Provider \"${providerName}\" is already patched by another AmplitudeAI instance. Call unpatch() before patching with a different instance.`,\n );\n }\n}\n\nexport function patchOpenAI(options: {\n amplitudeAI: AmplitudeAI;\n trackCompletions?: boolean;\n module?: unknown;\n}): void {\n const { amplitudeAI } = options;\n const mod =\n (options.module as Record<string, unknown> | null) ?? _OpenAIModule;\n\n if (mod == null) {\n throw new Error(\n 'openai package is not installed. Install it with: npm install openai — or pass the module via the modules option.',\n );\n }\n _assertPatchOwner('openai', amplitudeAI);\n\n if (_patchOpenAIClass(mod.OpenAI, mod, 'OpenAI', amplitudeAI, 'openai')) {\n _patchedProviders.add('openai');\n }\n}\n\nexport function patchAnthropic(options: {\n amplitudeAI: AmplitudeAI;\n module?: unknown;\n}): void {\n const { amplitudeAI } = options;\n const mod =\n (options.module as Record<string, unknown> | null) ?? _AnthropicModule;\n\n if (mod == null) {\n throw new Error(\n '@anthropic-ai/sdk package is not installed. Install it with: npm install @anthropic-ai/sdk — or pass the module via the modules option.',\n );\n }\n _assertPatchOwner('anthropic', amplitudeAI);\n\n const AnthropicClass = mod.Anthropic as\n | { prototype: Record<string, unknown> }\n | undefined;\n if (!AnthropicClass?.prototype) return;\n\n let didPatch = false;\n const messagesProto = _getNestedPrototype(AnthropicClass, ['messages']);\n if (messagesProto) {\n const target = messagesProto as Record<string, unknown>;\n _patchMethod(\n target,\n 'create',\n _makeCompletionWrapper(amplitudeAI, 'anthropic'),\n 'anthropic',\n );\n _patchMethod(\n target,\n 'stream',\n _makeAnthropicStreamWrapper(amplitudeAI),\n 'anthropic',\n );\n didPatch =\n _isMethodPatched(target, 'create') || _isMethodPatched(target, 'stream');\n }\n\n if (didPatch) {\n _patchedProviders.add('anthropic');\n }\n}\n\nexport function patchAzureOpenAI(options: {\n amplitudeAI: AmplitudeAI;\n module?: unknown;\n}): void {\n const { amplitudeAI } = options;\n const mod =\n (options.module as Record<string, unknown> | null) ?? _OpenAIModule;\n if (mod == null) {\n throw new Error(\n 'openai package is not installed. Install it with: npm install openai — or pass the module via the modules option.',\n );\n }\n _assertPatchOwner('azure-openai', amplitudeAI);\n if (\n _patchOpenAIClass(\n mod.AzureOpenAI,\n mod,\n 'AzureOpenAI',\n amplitudeAI,\n 'azure-openai',\n )\n ) {\n _patchedProviders.add('azure-openai');\n }\n}\n\nexport function patchGemini(options: {\n amplitudeAI: AmplitudeAI;\n module?: unknown;\n}): void {\n const { amplitudeAI } = options;\n const mod =\n (options.module as Record<string, unknown> | null) ?? _GeminiModule;\n\n if (mod == null) {\n throw new Error(\n '@google/generative-ai is not installed. Install it with: npm install @google/generative-ai — or pass the module via the modules option.',\n );\n }\n _assertPatchOwner('gemini', amplitudeAI);\n\n const GeminiClass = mod.GoogleGenerativeAI as\n | { prototype: Record<string, unknown> }\n | undefined;\n if (!GeminiClass?.prototype) return;\n const proto = GeminiClass.prototype as Record<string, unknown>;\n _patchMethod(\n proto,\n 'getGenerativeModel',\n (original, ...args) => {\n const modelObj = original(...args);\n if (modelObj == null || typeof modelObj !== 'object') return modelObj;\n const model = modelObj as Record<string, unknown>;\n if (\n typeof model.generateContent === 'function' &&\n !(\n (model.generateContent as unknown as Record<string, unknown>)\n .__amplitudePatched === true\n )\n ) {\n _patchMethod(\n model,\n 'generateContent',\n (innerOriginal, ...innerArgs) => {\n const startTime = performance.now();\n const result = innerOriginal(...innerArgs);\n if (result instanceof Promise) {\n return result\n .then((response) => {\n _trackGeminiResponse(amplitudeAI, response, startTime);\n return response;\n })\n .catch((err) => {\n _trackCompletionError(\n amplitudeAI,\n err,\n startTime,\n innerArgs[0],\n 'gemini',\n );\n throw err;\n });\n }\n return result;\n },\n 'gemini',\n );\n }\n if (\n typeof model.generateContentStream === 'function' &&\n !(\n (model.generateContentStream as unknown as Record<string, unknown>)\n .__amplitudePatched === true\n )\n ) {\n _patchMethod(\n model,\n 'generateContentStream',\n (innerOriginal, ...innerArgs) => {\n const startTime = performance.now();\n const result = innerOriginal(...innerArgs);\n if (result instanceof Promise) {\n return result\n .then((response) => {\n const streamResp = response as Record<string, unknown>;\n const stream = streamResp.stream;\n if (_isAsyncIterable(stream)) {\n return {\n ...streamResp,\n stream: _wrapPatchedStream(\n amplitudeAI,\n stream as AsyncIterable<unknown>,\n startTime,\n innerArgs[0],\n 'gemini',\n ),\n };\n }\n return response;\n })\n .catch((err) => {\n _trackCompletionError(\n amplitudeAI,\n err,\n startTime,\n innerArgs[0],\n 'gemini',\n );\n throw err;\n });\n }\n return result;\n },\n 'gemini',\n );\n }\n return modelObj;\n },\n 'gemini',\n );\n\n if (_isMethodPatched(proto, 'getGenerativeModel')) {\n _patchedProviders.add('gemini');\n }\n}\n\nexport function patchMistral(options: {\n amplitudeAI: AmplitudeAI;\n module?: unknown;\n}): void {\n const { amplitudeAI } = options;\n const mod =\n (options.module as Record<string, unknown> | null) ?? _MistralModule;\n\n if (mod == null) {\n throw new Error(\n '@mistralai/mistralai is not installed. Install it with: npm install @mistralai/mistralai — or pass the module via the modules option.',\n );\n }\n _assertPatchOwner('mistral', amplitudeAI);\n\n const MistralClass = (mod.Mistral ?? mod.MistralClient ?? mod.default) as\n | { prototype: Record<string, unknown> }\n | undefined;\n if (!MistralClass?.prototype) return;\n\n const chatProto = _getNestedPrototype(MistralClass, ['chat']);\n let didPatch = false;\n if (chatProto) {\n const target = chatProto as Record<string, unknown>;\n _patchMethod(\n target,\n 'complete',\n _makeCompletionWrapper(amplitudeAI, 'mistral'),\n 'mistral',\n );\n _patchMethod(\n target,\n 'stream',\n _makeCompletionWrapper(amplitudeAI, 'mistral'),\n 'mistral',\n );\n didPatch =\n _isMethodPatched(target, 'complete') ||\n _isMethodPatched(target, 'stream');\n }\n\n if (didPatch) {\n _patchedProviders.add('mistral');\n }\n}\n\nexport function patchBedrock(options: {\n amplitudeAI: AmplitudeAI;\n module?: unknown;\n}): void {\n const { amplitudeAI } = options;\n const mod =\n (options.module as Record<string, unknown> | null) ?? _BedrockModule;\n\n if (mod == null) {\n throw new Error(\n '@aws-sdk/client-bedrock-runtime is not installed. Install it with: npm install @aws-sdk/client-bedrock-runtime — or pass the module via the modules option.',\n );\n }\n _assertPatchOwner('bedrock', amplitudeAI);\n\n const ClientClass = mod.BedrockRuntimeClient as\n | { prototype: Record<string, unknown> }\n | undefined;\n if (!ClientClass?.prototype) return;\n\n _patchMethod(\n ClientClass.prototype as Record<string, unknown>,\n 'send',\n (original, ...args) => {\n const command = args[0] as Record<string, unknown> | undefined;\n const commandName = String(command?.constructor?.name ?? '');\n const shouldTrack =\n commandName.includes('ConverseCommand') ||\n commandName.includes('ConverseStreamCommand');\n const startTime = performance.now();\n const result = original(...args);\n if (result instanceof Promise) {\n return result\n .then((response) => {\n if (!shouldTrack) {\n return response;\n }\n if (commandName.includes('ConverseStreamCommand')) {\n const streamResp = response as Record<string, unknown>;\n const stream = streamResp.stream;\n if (_isAsyncIterable(stream)) {\n return {\n ...streamResp,\n stream: _wrapPatchedBedrockStream(\n amplitudeAI,\n stream as AsyncIterable<unknown>,\n startTime,\n args[0],\n ),\n };\n }\n } else {\n _trackBedrockResponse(amplitudeAI, response, startTime, args[0]);\n }\n return response;\n })\n .catch((err) => {\n if (shouldTrack) {\n _trackCompletionError(\n amplitudeAI,\n err,\n startTime,\n args[0],\n 'bedrock',\n );\n }\n throw err;\n });\n }\n return result;\n },\n 'bedrock',\n );\n\n if (\n _isMethodPatched(ClientClass.prototype as Record<string, unknown>, 'send')\n ) {\n _patchedProviders.add('bedrock');\n }\n}\n\n/**\n * Auto-detects installed provider SDKs and patches each supported surface.\n *\n * Returns the list of provider names that were successfully patched.\n * Ownership conflicts (same provider patched by a different `AmplitudeAI` instance)\n * throw immediately to prevent ambiguous instrumentation state.\n *\n * In bundler environments where `tryRequire` cannot resolve modules, pass them\n * explicitly via `modules`:\n * ```ts\n * import OpenAI from 'openai';\n * import Anthropic from '@anthropic-ai/sdk';\n * patch({ amplitudeAI: ai, modules: { openai: OpenAI, anthropic: Anthropic } });\n * ```\n */\nexport function patch(options: {\n amplitudeAI: AmplitudeAI;\n modules?: Record<string, unknown>;\n}): string[] {\n const patched: string[] = [];\n const mods = options.modules ?? {};\n const providers: Array<{\n fn: (opts: { amplitudeAI: AmplitudeAI; module?: unknown }) => void;\n available: boolean;\n name: string;\n moduleKey: string;\n }> = [\n {\n fn: patchOpenAI,\n available: OPENAI_AVAILABLE || mods.openai != null,\n name: 'openai',\n moduleKey: 'openai',\n },\n {\n fn: patchAzureOpenAI,\n available: OPENAI_AVAILABLE || mods.openai != null,\n name: 'azure-openai',\n moduleKey: 'openai',\n },\n {\n fn: patchAnthropic,\n available: ANTHROPIC_AVAILABLE || mods.anthropic != null,\n name: 'anthropic',\n moduleKey: 'anthropic',\n },\n {\n fn: patchGemini,\n available: GEMINI_AVAILABLE || mods.gemini != null,\n name: 'gemini',\n moduleKey: 'gemini',\n },\n {\n fn: patchMistral,\n available: MISTRAL_AVAILABLE || mods.mistral != null,\n name: 'mistral',\n moduleKey: 'mistral',\n },\n {\n fn: patchBedrock,\n available: BEDROCK_AVAILABLE || mods.bedrock != null,\n name: 'bedrock',\n moduleKey: 'bedrock',\n },\n ];\n for (const { fn, available, name, moduleKey } of providers) {\n if (!available) continue;\n try {\n fn({ amplitudeAI: options.amplitudeAI, module: mods[moduleKey] });\n if (_patchedProviders.has(name)) {\n patched.push(name);\n }\n } catch (error) {\n if (error instanceof PatchOwnershipError) {\n throw error;\n }\n // provider setup failed\n }\n }\n return patched;\n}\n\nexport function unpatch(): void {\n for (const record of _activePatches.reverse()) {\n const target = record.module as Record<string, unknown>;\n target[record.method] = record.original;\n }\n _activePatches.length = 0;\n _patchedProviders.clear();\n _providerOwners.clear();\n}\n\nexport function unpatchOpenAI(): void {\n _unpatchByProvider('openai');\n}\n\nexport function unpatchAnthropic(): void {\n _unpatchByProvider('anthropic');\n}\n\nexport function unpatchGemini(): void {\n _unpatchByProvider('gemini');\n}\n\nexport function unpatchMistral(): void {\n _unpatchByProvider('mistral');\n}\n\nexport function unpatchBedrock(): void {\n _unpatchByProvider('bedrock');\n}\n\nexport function unpatchAzureOpenAI(): void {\n _unpatchByProvider('azure-openai');\n}\n\nfunction _unpatchByProvider(providerName: string): void {\n const toRemove: number[] = [];\n for (let i = _activePatches.length - 1; i >= 0; i--) {\n const record = _activePatches[i];\n if (record == null) continue;\n if (\n (record as unknown as { provider?: string }).provider === providerName\n ) {\n const target = record.module as Record<string, unknown>;\n target[record.method] = record.original;\n toRemove.push(i);\n }\n }\n for (const idx of toRemove) {\n _activePatches.splice(idx, 1);\n }\n _patchedProviders.delete(providerName);\n _providerOwners.delete(providerName);\n}\n\n// ---------------------------------------------------------------\n// Shared wrapper factory for completion-style endpoints\n// ---------------------------------------------------------------\n\nfunction _makeCompletionWrapper(\n amplitudeAI: AmplitudeAI,\n providerName: string,\n): (original: (...args: unknown[]) => unknown, ...args: unknown[]) => unknown {\n return (original, ...args) => {\n const startTime = performance.now();\n const result = original(...args);\n if (result instanceof Promise) {\n return result\n .then((response) => {\n if (_isAsyncIterable(response)) {\n if (providerName === 'anthropic') {\n return _wrapPatchedAnthropicStream(\n amplitudeAI,\n response as AsyncIterable<unknown>,\n startTime,\n args[0],\n );\n }\n return _wrapPatchedStream(\n amplitudeAI,\n response as AsyncIterable<unknown>,\n startTime,\n args[0],\n providerName,\n );\n }\n if (providerName === 'anthropic') {\n _trackAnthropicResponse(amplitudeAI, response, startTime, args[0]);\n } else {\n _trackCompletionResponse(\n amplitudeAI,\n response,\n startTime,\n args[0],\n providerName,\n );\n }\n return response;\n })\n .catch((err) => {\n _trackCompletionError(\n amplitudeAI,\n err,\n startTime,\n args[0],\n providerName,\n );\n throw err;\n });\n }\n return result;\n };\n}\n\nfunction _makeAnthropicStreamWrapper(\n amplitudeAI: AmplitudeAI,\n): (original: (...args: unknown[]) => unknown, ...args: unknown[]) => unknown {\n return (original, ...args) => {\n const startTime = performance.now();\n const result = original(...args);\n if (!(result instanceof Promise)) return result;\n return result\n .then((response) => {\n if (_isAsyncIterable(response)) {\n return _wrapPatchedAnthropicStream(\n amplitudeAI,\n response as AsyncIterable<unknown>,\n startTime,\n args[0],\n );\n }\n const respObj = response as Record<string, unknown>;\n const stream = respObj.stream;\n if (_isAsyncIterable(stream)) {\n return {\n ...respObj,\n stream: _wrapPatchedAnthropicStream(\n amplitudeAI,\n stream as AsyncIterable<unknown>,\n startTime,\n args[0],\n ),\n };\n }\n return response;\n })\n .catch((err) => {\n _trackCompletionError(\n amplitudeAI,\n err,\n startTime,\n args[0],\n 'anthropic',\n );\n throw err;\n });\n };\n}\n\nfunction _isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return (\n value != null &&\n typeof (value as Record<symbol, unknown>)[Symbol.asyncIterator] ===\n 'function'\n );\n}\n\nasync function* _wrapPatchedStream(\n ai: AmplitudeAI,\n stream: AsyncIterable<unknown>,\n startTime: number,\n requestOpts: unknown,\n providerName: string,\n): AsyncGenerator<unknown> {\n if (providerName === 'gemini') {\n yield* _wrapPatchedGeminiStream(ai, stream, startTime, requestOpts);\n return;\n }\n const ctx = getActiveContext();\n if (ctx == null) {\n yield* stream;\n return;\n }\n\n let content = '';\n let model = 'unknown';\n let finishReason = '';\n let inputTokens: number | undefined;\n let outputTokens: number | undefined;\n let totalTokens: number | undefined;\n let isError = false;\n let errorMessage: string | undefined;\n\n try {\n for await (const chunk of stream) {\n const c = chunk as Record<string, unknown>;\n const choices = c.choices as Array<Record<string, unknown>> | undefined;\n const delta = choices?.[0]?.delta as Record<string, unknown> | undefined;\n if (delta?.content != null) content += String(delta.content);\n if (c.model != null) model = String(c.model);\n if (choices?.[0]?.finish_reason != null)\n finishReason = String(choices[0].finish_reason);\n const usage = c.usage as Record<string, number> | undefined;\n if (usage != null) {\n inputTokens = usage.prompt_tokens;\n outputTokens = usage.completion_tokens;\n totalTokens = usage.total_tokens;\n }\n yield chunk;\n }\n } catch (error) {\n isError = true;\n errorMessage = error instanceof Error ? error.message : String(error);\n throw error;\n } finally {\n const latencyMs = performance.now() - startTime;\n ai.trackAiMessage({\n userId: ctx.userId ?? 'unknown',\n content,\n sessionId: ctx.sessionId,\n model,\n provider: providerName,\n latencyMs,\n traceId: ctx.traceId,\n inputTokens,\n outputTokens,\n totalTokens,\n finishReason,\n agentId: ctx.agentId,\n env: ctx.env,\n isStreaming: true,\n isError,\n errorMessage,\n ..._contextExtras(ctx),\n });\n }\n}\n\nasync function* _wrapPatchedAnthropicStream(\n ai: AmplitudeAI,\n stream: AsyncIterable<unknown>,\n startTime: number,\n requestOpts: unknown,\n): AsyncGenerator<unknown> {\n const ctx = getActiveContext();\n if (ctx == null) {\n yield* stream;\n return;\n }\n const req = requestOpts as Record<string, unknown> | undefined;\n let content = '';\n let model = String(req?.model ?? 'unknown');\n let finishReason = '';\n let inputTokens: number | undefined;\n let outputTokens: number | undefined;\n let isError = false;\n let errorMessage: string | undefined;\n try {\n for await (const chunk of stream) {\n const c = chunk as Record<string, unknown>;\n if (c.type === 'message_start') {\n const message = c.message as Record<string, unknown> | undefined;\n if (typeof message?.model === 'string') model = message.model;\n const usage = message?.usage as Record<string, unknown> | undefined;\n if (typeof usage?.input_tokens === 'number') {\n inputTokens = usage.input_tokens;\n }\n }\n if (c.type === 'content_block_delta') {\n const delta = c.delta as Record<string, unknown> | undefined;\n if (typeof delta?.text === 'string') content += delta.text;\n }\n if (c.type === 'message_delta') {\n const delta = c.delta as Record<string, unknown> | undefined;\n if (typeof delta?.stop_reason === 'string') {\n finishReason = delta.stop_reason;\n } else if (typeof c.stop_reason === 'string') {\n // Backward-compatible fallback for alternate SDK payload shapes.\n finishReason = c.stop_reason;\n }\n const usage = c.usage as Record<string, unknown> | undefined;\n if (typeof usage?.output_tokens === 'number') {\n outputTokens = usage.output_tokens;\n }\n }\n if (c.type === 'message_stop') {\n const usage = c.usage as Record<string, unknown> | undefined;\n if (typeof usage?.output_tokens === 'number')\n outputTokens = usage.output_tokens;\n }\n yield chunk;\n }\n } catch (error) {\n isError = true;\n errorMessage = error instanceof Error ? error.message : String(error);\n throw error;\n } finally {\n const latencyMs = performance.now() - startTime;\n ai.trackAiMessage({\n userId: ctx.userId ?? 'unknown',\n content,\n sessionId: ctx.sessionId,\n model,\n provider: 'anthropic',\n latencyMs,\n traceId: ctx.traceId,\n inputTokens,\n outputTokens,\n finishReason,\n agentId: ctx.agentId,\n env: ctx.env,\n isStreaming: true,\n isError,\n errorMessage,\n ..._contextExtras(ctx),\n });\n }\n}\n\nasync function* _wrapPatchedGeminiStream(\n ai: AmplitudeAI,\n stream: AsyncIterable<unknown>,\n startTime: number,\n _requestOpts: unknown,\n): AsyncGenerator<unknown> {\n const ctx = getActiveContext();\n if (ctx == null) {\n yield* stream;\n return;\n }\n let content = '';\n const model = 'gemini';\n let finishReason = '';\n let inputTokens: number | undefined;\n let outputTokens: number | undefined;\n let totalTokens: number | undefined;\n let isError = false;\n let errorMessage: string | undefined;\n try {\n for await (const chunk of stream) {\n const c = chunk as Record<string, unknown>;\n const respObj = (c.response ?? c) as Record<string, unknown>;\n const textFn = respObj.text;\n if (typeof textFn === 'function') content += String(textFn());\n const usage = respObj.usageMetadata as\n | Record<string, unknown>\n | undefined;\n if (typeof usage?.promptTokenCount === 'number') {\n inputTokens = usage.promptTokenCount;\n }\n if (typeof usage?.candidatesTokenCount === 'number') {\n outputTokens = usage.candidatesTokenCount;\n }\n if (typeof usage?.totalTokenCount === 'number') {\n totalTokens = usage.totalTokenCount;\n }\n const candidates = respObj.candidates as\n | Array<Record<string, unknown>>\n | undefined;\n if (typeof candidates?.[0]?.finishReason === 'string') {\n finishReason = candidates[0].finishReason;\n }\n yield chunk;\n }\n } catch (error) {\n isError = true;\n errorMessage = error instanceof Error ? error.message : String(error);\n throw error;\n } finally {\n ai.trackAiMessage({\n userId: ctx.userId ?? 'unknown',\n content,\n sessionId: ctx.sessionId,\n model,\n provider: 'gemini',\n latencyMs: performance.now() - startTime,\n traceId: ctx.traceId,\n inputTokens,\n outputTokens,\n totalTokens,\n finishReason,\n agentId: ctx.agentId,\n env: ctx.env,\n isStreaming: true,\n isError,\n errorMessage,\n ..._contextExtras(ctx),\n });\n }\n}\n\nasync function* _wrapPatchedBedrockStream(\n ai: AmplitudeAI,\n stream: AsyncIterable<unknown>,\n startTime: number,\n requestOpts: unknown,\n): AsyncGenerator<unknown> {\n const ctx = getActiveContext();\n if (ctx == null) {\n yield* stream;\n return;\n }\n const opts = requestOpts as Record<string, unknown> | undefined;\n let model = String(opts?.modelId ?? 'unknown');\n let content = '';\n let finishReason = '';\n let inputTokens: number | undefined;\n let outputTokens: number | undefined;\n let totalTokens: number | undefined;\n let isError = false;\n let errorMessage: string | undefined;\n try {\n for await (const rawEvent of stream) {\n const event = rawEvent as Record<string, unknown>;\n const delta = (\n event.contentBlockDelta as Record<string, unknown> | undefined\n )?.delta as Record<string, unknown> | undefined;\n if (typeof delta?.text === 'string') content += delta.text;\n const messageStart = event.messageStart as\n | Record<string, unknown>\n | undefined;\n if (typeof messageStart?.model === 'string') model = messageStart.model;\n const messageStop = event.messageStop as\n | Record<string, unknown>\n | undefined;\n if (typeof messageStop?.stopReason === 'string') {\n finishReason = messageStop.stopReason;\n }\n const usage = (event.metadata as Record<string, unknown> | undefined)\n ?.usage as Record<string, unknown> | undefined;\n if (typeof usage?.inputTokens === 'number')\n inputTokens = usage.inputTokens;\n if (typeof usage?.outputTokens === 'number')\n outputTokens = usage.outputTokens;\n if (typeof usage?.totalTokens === 'number')\n totalTokens = usage.totalTokens;\n yield rawEvent;\n }\n } catch (error) {\n isError = true;\n errorMessage = error instanceof Error ? error.message : String(error);\n throw error;\n } finally {\n ai.trackAiMessage({\n userId: ctx.userId ?? 'unknown',\n content,\n sessionId: ctx.sessionId,\n model,\n provider: 'bedrock',\n latencyMs: performance.now() - startTime,\n traceId: ctx.traceId,\n inputTokens,\n outputTokens,\n totalTokens,\n finishReason,\n agentId: ctx.agentId,\n env: ctx.env,\n isStreaming: true,\n isError,\n errorMessage,\n ..._contextExtras(ctx),\n });\n }\n}\n\n// ---------------------------------------------------------------\n// Constructor patching for SDKs with lazy getters (e.g., OpenAI v5+)\n// ---------------------------------------------------------------\n\nfunction _patchConstructor(\n cls: { prototype: Record<string, unknown> },\n moduleExports: Record<string, unknown>,\n exportKey: string,\n amplitudeAI: AmplitudeAI,\n providerName: string,\n): void {\n if (\n (moduleExports[exportKey] as Record<string, unknown> | undefined)\n ?.__amplitudeCtorPatched === true\n ) {\n return;\n }\n const originalCtor = cls as unknown as new (...args: unknown[]) => unknown;\n const handler: ProxyHandler<typeof originalCtor> = {\n construct(target, args, newTarget) {\n const instance = Reflect.construct(target, args, newTarget) as Record<\n string,\n unknown\n >;\n _patchInstanceCompletions(instance, amplitudeAI, providerName);\n return instance;\n },\n };\n const proxy = new Proxy(originalCtor, handler);\n (proxy as unknown as Record<string, unknown>).__amplitudeCtorPatched = true;\n\n const mod = moduleExports;\n let patchedExportKey: string | null = null;\n if (mod[exportKey] === originalCtor) {\n mod[exportKey] = proxy;\n patchedExportKey = exportKey;\n } else {\n for (const key of Object.keys(mod)) {\n if (mod[key] === originalCtor) {\n mod[key] = proxy;\n patchedExportKey = key;\n }\n }\n }\n if (patchedExportKey != null) {\n _activePatches.push({\n module: mod,\n method: patchedExportKey,\n original: originalCtor,\n provider: providerName,\n });\n }\n}\n\nfunction _patchOpenAIClass(\n maybeClass: unknown,\n moduleExports: Record<string, unknown>,\n exportKey: string,\n amplitudeAI: AmplitudeAI,\n providerName: string,\n): boolean {\n const OpenAIClass = maybeClass as\n | { prototype: Record<string, unknown> }\n | undefined;\n if (!OpenAIClass?.prototype) return false;\n\n const completionsProto = _getNestedPrototype(OpenAIClass, [\n 'chat',\n 'completions',\n ]);\n if (completionsProto) {\n const target = completionsProto as Record<string, unknown>;\n _patchMethod(\n target,\n 'create',\n _makeCompletionWrapper(amplitudeAI, providerName),\n providerName,\n );\n _patchMethod(\n target,\n 'parse',\n _makeCompletionWrapper(amplitudeAI, providerName),\n providerName,\n );\n } else {\n _patchConstructor(\n OpenAIClass,\n moduleExports,\n exportKey,\n amplitudeAI,\n providerName,\n );\n }\n\n const responsesProto = _getNestedPrototype(OpenAIClass, ['responses']);\n if (responsesProto) {\n const target = responsesProto as Record<string, unknown>;\n _patchMethod(\n target,\n 'create',\n _makeResponsesWrapper(amplitudeAI, providerName),\n providerName,\n );\n _patchMethod(\n target,\n 'stream',\n _makeResponsesWrapper(amplitudeAI, providerName),\n providerName,\n );\n }\n return true;\n}\n\nfunction _patchInstanceCompletions(\n instance: Record<string, unknown>,\n amplitudeAI: AmplitudeAI,\n providerName: string,\n): void {\n try {\n const chat = instance.chat as Record<string, unknown> | undefined;\n const completions = chat?.completions as\n | Record<string, unknown>\n | undefined;\n if (completions && typeof completions.create === 'function') {\n const original = completions.create.bind(completions);\n completions.create = (...args: unknown[]) =>\n _makeCompletionWrapper(amplitudeAI, providerName)(original, ...args);\n }\n if (completions && typeof completions.parse === 'function') {\n const originalParse = completions.parse.bind(completions);\n completions.parse = (...args: unknown[]) =>\n _makeCompletionWrapper(amplitudeAI, providerName)(\n originalParse,\n ...args,\n );\n }\n\n const responses = instance.responses as Record<string, unknown> | undefined;\n if (responses && typeof responses.create === 'function') {\n const originalResponses = responses.create.bind(responses);\n responses.create = (...args: unknown[]) =>\n _makeResponsesWrapper(amplitudeAI, providerName)(\n originalResponses,\n ...args,\n );\n }\n if (responses && typeof responses.stream === 'function') {\n const originalResponsesStream = responses.stream.bind(responses);\n responses.stream = (...args: unknown[]) =>\n _makeResponsesWrapper(amplitudeAI, providerName)(\n originalResponsesStream,\n ...args,\n );\n }\n } catch {\n // Instance structure doesn't match expectations — skip silently\n }\n}\n\nfunction _makeResponsesWrapper(\n amplitudeAI: AmplitudeAI,\n providerName: string,\n): (original: (...args: unknown[]) => unknown, ...args: unknown[]) => unknown {\n return (original, ...args) => {\n const startTime = performance.now();\n const result = original(...args);\n if (result instanceof Promise) {\n return result\n .then((response) => {\n if (_isAsyncIterable(response)) {\n return _wrapPatchedResponsesStream(\n amplitudeAI,\n response as AsyncIterable<unknown>,\n startTime,\n args[0],\n providerName,\n );\n }\n _trackResponsesResponse(\n amplitudeAI,\n response,\n startTime,\n args[0],\n providerName,\n );\n return response;\n })\n .catch((err) => {\n _trackCompletionError(\n amplitudeAI,\n err,\n startTime,\n args[0],\n providerName,\n );\n throw err;\n });\n }\n return result;\n };\n}\n\n// ---------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------\n\nfunction _getNestedPrototype(\n cls: { prototype: Record<string, unknown> },\n path: string[],\n): unknown {\n let current: unknown = cls.prototype;\n for (const key of path) {\n if (current == null || typeof current !== 'object') return null;\n const obj = current as Record<string, unknown>;\n if (typeof obj[key] === 'object' && obj[key] != null) {\n current = obj[key];\n } else {\n return null;\n }\n }\n return current;\n}\n\nfunction _trackCompletionResponse(\n ai: AmplitudeAI,\n response: unknown,\n startTime: number,\n _requestOpts: unknown,\n providerName: string,\n): void {\n if (response == null || typeof response !== 'object') return;\n\n const ctx = getActiveContext();\n if (ctx == null) return;\n\n const resp = response as Record<string, unknown>;\n const usage = resp.usage as Record<string, number> | undefined;\n const choices = resp.choices as Array<Record<string, unknown>> | undefined;\n const choice = choices?.[0];\n const message = choice?.message as Record<string, unknown> | undefined;\n\n const latencyMs = performance.now() - startTime;\n\n ai.trackAiMessage({\n userId: ctx.userId ?? 'unknown',\n content: String(message?.content ?? ''),\n sessionId: ctx.sessionId,\n model: String(resp.model ?? 'unknown'),\n provider: providerName,\n latencyMs,\n traceId: ctx.traceId,\n inputTokens: usage?.prompt_tokens,\n outputTokens: usage?.completion_tokens,\n totalTokens: usage?.total_tokens,\n finishReason: String(choice?.finish_reason ?? ''),\n agentId: ctx.agentId,\n env: ctx.env,\n ..._contextExtras(ctx),\n });\n}\n\nfunction _trackAnthropicResponse(\n ai: AmplitudeAI,\n response: unknown,\n startTime: number,\n _requestOpts: unknown,\n): void {\n if (response == null || typeof response !== 'object') return;\n\n const ctx = getActiveContext();\n if (ctx == null) return;\n\n const resp = response as Record<string, unknown>;\n const usage = resp.usage as Record<string, number> | undefined;\n const content = resp.content as Array<Record<string, unknown>> | undefined;\n const textBlock = content?.find((b) => b.type === 'text');\n\n const latencyMs = performance.now() - startTime;\n\n ai.trackAiMessage({\n userId: ctx.userId ?? 'unknown',\n content: String(textBlock?.text ?? ''),\n sessionId: ctx.sessionId,\n model: String(resp.model ?? 'unknown'),\n provider: 'anthropic',\n latencyMs,\n traceId: ctx.traceId,\n inputTokens: usage?.input_tokens,\n outputTokens: usage?.output_tokens,\n finishReason: String(resp.stop_reason ?? ''),\n agentId: ctx.agentId,\n env: ctx.env,\n ..._contextExtras(ctx),\n });\n}\n\nfunction _trackCompletionError(\n ai: AmplitudeAI,\n error: unknown,\n startTime: number,\n requestOpts: unknown,\n providerName: string,\n): void {\n const ctx = getActiveContext();\n if (ctx == null) return;\n\n const opts = requestOpts as Record<string, unknown> | undefined;\n const latencyMs = performance.now() - startTime;\n\n ai.trackAiMessage({\n userId: ctx.userId ?? 'unknown',\n content: '',\n sessionId: ctx.sessionId,\n model: String(opts?.model ?? opts?.modelId ?? 'unknown'),\n provider: providerName,\n latencyMs,\n traceId: ctx.traceId,\n isError: true,\n errorMessage: error instanceof Error ? error.message : String(error),\n agentId: ctx.agentId,\n env: ctx.env,\n ..._contextExtras(ctx),\n });\n}\n\nfunction _trackGeminiResponse(\n ai: AmplitudeAI,\n response: unknown,\n startTime: number,\n): void {\n if (response == null || typeof response !== 'object') return;\n\n const ctx = getActiveContext();\n if (ctx == null) return;\n\n const resp = response as Record<string, unknown>;\n const respObj = (resp.response ?? resp) as Record<string, unknown>;\n const text = typeof respObj.text === 'function' ? String(respObj.text()) : '';\n const usage = respObj.usageMetadata as Record<string, number> | undefined;\n\n const latencyMs = performance.now() - startTime;\n\n ai.trackAiMessage({\n userId: ctx.userId ?? 'unknown',\n content: text,\n sessionId: ctx.sessionId,\n model: 'gemini',\n provider: 'gemini',\n latencyMs,\n traceId: ctx.traceId,\n inputTokens: usage?.promptTokenCount,\n outputTokens: usage?.candidatesTokenCount,\n totalTokens: usage?.totalTokenCount,\n agentId: ctx.agentId,\n env: ctx.env,\n ..._contextExtras(ctx),\n });\n}\n\nfunction _trackBedrockResponse(\n ai: AmplitudeAI,\n response: unknown,\n startTime: number,\n requestOpts: unknown,\n): void {\n if (response == null || typeof response !== 'object') return;\n\n const ctx = getActiveContext();\n if (ctx == null) return;\n\n const resp = response as Record<string, unknown>;\n const output = resp.output as Record<string, unknown> | undefined;\n const message = output?.message as Record<string, unknown> | undefined;\n const content = message?.content as\n | Array<Record<string, unknown>>\n | undefined;\n const textBlock = content?.find((b) => b.text != null);\n const usage = resp.usage as Record<string, number> | undefined;\n const opts = requestOpts as Record<string, unknown> | undefined;\n\n const latencyMs = performance.now() - startTime;\n\n ai.trackAiMessage({\n userId: ctx.userId ?? 'unknown',\n content: String(textBlock?.text ?? ''),\n sessionId: ctx.sessionId,\n model: String(opts?.modelId ?? 'unknown'),\n provider: 'bedrock',\n latencyMs,\n traceId: ctx.traceId,\n inputTokens: usage?.inputTokens,\n outputTokens: usage?.outputTokens,\n totalTokens: usage?.totalTokens,\n finishReason: String(resp.stopReason ?? ''),\n agentId: ctx.agentId,\n env: ctx.env,\n ..._contextExtras(ctx),\n });\n}\n\nfunction _trackResponsesResponse(\n ai: AmplitudeAI,\n response: unknown,\n startTime: number,\n requestOpts: unknown,\n providerName: string,\n): void {\n if (response == null || typeof response !== 'object') return;\n const ctx = getActiveContext();\n if (ctx == null) return;\n\n const resp = response as Record<string, unknown>;\n const usage = resp.usage as Record<string, unknown> | undefined;\n const outputText =\n typeof resp.output_text === 'string'\n ? resp.output_text\n : _extractResponsesText(resp.output);\n const opts = requestOpts as Record<string, unknown> | undefined;\n\n ai.trackAiMessage({\n userId: ctx.userId ?? 'unknown',\n content: outputText,\n sessionId: ctx.sessionId,\n model: String(resp.model ?? opts?.model ?? 'unknown'),\n provider: providerName,\n latencyMs: performance.now() - startTime,\n traceId: ctx.traceId,\n inputTokens:\n typeof usage?.input_tokens === 'number'\n ? (usage.input_tokens as number)\n : undefined,\n outputTokens:\n typeof usage?.output_tokens === 'number'\n ? (usage.output_tokens as number)\n : undefined,\n totalTokens:\n typeof usage?.total_tokens === 'number'\n ? (usage.total_tokens as number)\n : undefined,\n reasoningTokens:\n typeof (\n usage?.output_tokens_details as Record<string, unknown> | undefined\n )?.reasoning_tokens === 'number'\n ? ((usage?.output_tokens_details as Record<string, unknown>)\n .reasoning_tokens as number)\n : undefined,\n finishReason: _extractResponsesFinishReason(resp),\n agentId: ctx.agentId,\n env: ctx.env,\n ..._contextExtras(ctx),\n });\n}\n\nasync function* _wrapPatchedResponsesStream(\n ai: AmplitudeAI,\n stream: AsyncIterable<unknown>,\n startTime: number,\n requestOpts: unknown,\n providerName: string,\n): AsyncGenerator<unknown> {\n const ctx = getActiveContext();\n if (ctx == null) {\n yield* stream;\n return;\n }\n const opts = requestOpts as Record<string, unknown> | undefined;\n const model = String(opts?.model ?? 'unknown');\n let content = '';\n let finishReason = '';\n let inputTokens: number | undefined;\n let outputTokens: number | undefined;\n let totalTokens: number | undefined;\n let isError = false;\n let errorMessage: string | undefined;\n\n try {\n for await (const event of stream) {\n const e = event as Record<string, unknown>;\n const type = e.type as string | undefined;\n if (type === 'response.output_text.delta') {\n const delta = e.delta;\n if (typeof delta === 'string') content += delta;\n } else if (type === 'response.completed') {\n const response = e.response as Record<string, unknown> | undefined;\n const usage = response?.usage as Record<string, unknown> | undefined;\n const outputText = response?.output_text;\n if (typeof outputText === 'string' && outputText.length > 0) {\n content = outputText;\n }\n if (typeof usage?.input_tokens === 'number')\n inputTokens = usage.input_tokens;\n if (typeof usage?.output_tokens === 'number')\n outputTokens = usage.output_tokens;\n if (typeof usage?.total_tokens === 'number')\n totalTokens = usage.total_tokens;\n const status = response?.status;\n if (typeof status === 'string') finishReason = status;\n }\n yield event;\n }\n } catch (error) {\n isError = true;\n errorMessage = error instanceof Error ? error.message : String(error);\n throw error;\n } finally {\n ai.trackAiMessage({\n userId: ctx.userId ?? 'unknown',\n content,\n sessionId: ctx.sessionId,\n model,\n provider: providerName,\n latencyMs: performance.now() - startTime,\n traceId: ctx.traceId,\n inputTokens,\n outputTokens,\n totalTokens,\n finishReason,\n agentId: ctx.agentId,\n env: ctx.env,\n isStreaming: true,\n isError,\n errorMessage,\n ..._contextExtras(ctx),\n });\n }\n}\n\nfunction _extractResponsesText(output: unknown): string {\n if (!Array.isArray(output)) return '';\n let text = '';\n for (const item of output) {\n if (item == null || typeof item !== 'object') continue;\n const content = (item as Record<string, unknown>).content;\n if (!Array.isArray(content)) continue;\n for (const part of content) {\n if (part == null || typeof part !== 'object') continue;\n const partText = (part as Record<string, unknown>).text;\n if (typeof partText === 'string') text += partText;\n }\n }\n return text;\n}\n\nfunction _extractResponsesFinishReason(\n response: Record<string, unknown>,\n): string | undefined {\n if (typeof response.status === 'string' && response.status.length > 0) {\n return response.status;\n }\n const output = response.output;\n if (!Array.isArray(output) || output.length === 0) return undefined;\n const first = output[0] as Record<string, unknown> | undefined;\n return typeof first?.status === 'string' ? first.status : undefined;\n}\n\nfunction _contextExtras(ctx: {\n parentAgentId?: string | null;\n customerOrgId?: string | null;\n agentVersion?: string | null;\n context?: Record<string, unknown> | null;\n groups?: Record<string, unknown> | null;\n idleTimeoutMinutes?: number | null;\n deviceId?: string | null;\n browserSessionId?: string | null;\n}): Record<string, unknown> {\n const extras: Record<string, unknown> = {\n parentAgentId: ctx.parentAgentId ?? undefined,\n customerOrgId: ctx.customerOrgId ?? undefined,\n agentVersion: ctx.agentVersion ?? undefined,\n context: ctx.context ?? undefined,\n groups: ctx.groups ?? undefined,\n };\n\n const ep: Record<string, unknown> = {};\n if (ctx.idleTimeoutMinutes != null) {\n ep[PROP_IDLE_TIMEOUT_MINUTES] = ctx.idleTimeoutMinutes;\n }\n if (ctx.deviceId && ctx.browserSessionId) {\n ep[PROP_SESSION_REPLAY_ID] = `${ctx.deviceId}/${ctx.browserSessionId}`;\n }\n if (Object.keys(ep).length > 0) {\n extras.eventProperties = ep;\n }\n\n return extras;\n}\n"],"mappings":";;;;;;;;;AA6BA,IAAM,sBAAN,cAAkC,MAAM;AAExC,MAAMA,iBAAgC,EAAE;AACxC,MAAM,oCAAoB,IAAI,KAAa;AAC3C,MAAM,kCAAkB,IAAI,KAA0B;AAEtD,SAAgB,mBAA6B;AAC3C,QAAO,CAAC,GAAG,kBAAkB;;AAG/B,SAAS,iBACP,QACA,YACS;AAET,QADe,OAAO,aACP,uBAAuB;;AAGxC,SAAS,aACP,QACA,YACA,SAIA,cACM;CACN,MAAM,WAAW,OAAO;AACxB,KAAI,OAAO,aAAa,WAAY;AACpC,KAAI,iBAAiB,QAAQ,WAAW,CAAE;CAE1C,MAAM,UAAU,SAAyB,GAAG,MAAiB;AAC3D,SAAO,QAAQ,SAAS,KAAK,KAAK,EAAE,GAAG,KAAK;;AAE9C,CAAC,QAA+C,qBAAqB;AACrE,QAAO,cAAc;AAErB,gBAAe,KAAK;EAClB,QAAQ;EACR,QAAQ;EACR;EACA,UAAU;EACX,CAAC;AACF,mBAAkB,IAAI,aAAa;;AAGrC,SAAS,kBAAkB,cAAsB,IAAuB;CACtE,MAAM,gBAAgB,gBAAgB,IAAI,aAAa;AACvD,KAAI,iBAAiB,MAAM;AACzB,kBAAgB,IAAI,cAAc,GAAG;AACrC;;AAEF,KAAI,kBAAkB,GACpB,OAAM,IAAI,oBACR,aAAa,aAAa,iHAC3B;;AAIL,SAAgB,YAAY,SAInB;CACP,MAAM,EAAE,gBAAgB;CACxB,MAAM,MACH,QAAQ,UAA6C;AAExD,KAAI,OAAO,KACT,OAAM,IAAI,MACR,oHACD;AAEH,mBAAkB,UAAU,YAAY;AAExC,KAAI,kBAAkB,IAAI,QAAQ,KAAK,UAAU,aAAa,SAAS,CACrE,mBAAkB,IAAI,SAAS;;AAInC,SAAgB,eAAe,SAGtB;CACP,MAAM,EAAE,gBAAgB;CACxB,MAAM,MACH,QAAQ,UAA6C;AAExD,KAAI,OAAO,KACT,OAAM,IAAI,MACR,0IACD;AAEH,mBAAkB,aAAa,YAAY;CAE3C,MAAM,iBAAiB,IAAI;AAG3B,KAAI,CAAC,gBAAgB,UAAW;CAEhC,IAAI,WAAW;CACf,MAAM,gBAAgB,oBAAoB,gBAAgB,CAAC,WAAW,CAAC;AACvE,KAAI,eAAe;EACjB,MAAM,SAAS;AACf,eACE,QACA,UACA,uBAAuB,aAAa,YAAY,EAChD,YACD;AACD,eACE,QACA,UACA,4BAA4B,YAAY,EACxC,YACD;AACD,aACE,iBAAiB,QAAQ,SAAS,IAAI,iBAAiB,QAAQ,SAAS;;AAG5E,KAAI,SACF,mBAAkB,IAAI,YAAY;;AAItC,SAAgB,iBAAiB,SAGxB;CACP,MAAM,EAAE,gBAAgB;CACxB,MAAM,MACH,QAAQ,UAA6C;AACxD,KAAI,OAAO,KACT,OAAM,IAAI,MACR,oHACD;AAEH,mBAAkB,gBAAgB,YAAY;AAC9C,KACE,kBACE,IAAI,aACJ,KACA,eACA,aACA,eACD,CAED,mBAAkB,IAAI,eAAe;;AAIzC,SAAgB,YAAY,SAGnB;CACP,MAAM,EAAE,gBAAgB;CACxB,MAAM,MACH,QAAQ,UAA6C;AAExD,KAAI,OAAO,KACT,OAAM,IAAI,MACR,0IACD;AAEH,mBAAkB,UAAU,YAAY;CAExC,MAAM,cAAc,IAAI;AAGxB,KAAI,CAAC,aAAa,UAAW;CAC7B,MAAM,QAAQ,YAAY;AAC1B,cACE,OACA,uBACC,UAAU,GAAG,SAAS;EACrB,MAAM,WAAW,SAAS,GAAG,KAAK;AAClC,MAAI,YAAY,QAAQ,OAAO,aAAa,SAAU,QAAO;EAC7D,MAAM,QAAQ;AACd,MACE,OAAO,MAAM,oBAAoB,cACjC,EACG,MAAM,gBACJ,uBAAuB,MAG5B,cACE,OACA,oBACC,eAAe,GAAG,cAAc;GAC/B,MAAM,YAAY,YAAY,KAAK;GACnC,MAAM,SAAS,cAAc,GAAG,UAAU;AAC1C,OAAI,kBAAkB,QACpB,QAAO,OACJ,MAAM,aAAa;AAClB,yBAAqB,aAAa,UAAU,UAAU;AACtD,WAAO;KACP,CACD,OAAO,QAAQ;AACd,0BACE,aACA,KACA,WACA,UAAU,IACV,SACD;AACD,UAAM;KACN;AAEN,UAAO;KAET,SACD;AAEH,MACE,OAAO,MAAM,0BAA0B,cACvC,EACG,MAAM,sBACJ,uBAAuB,MAG5B,cACE,OACA,0BACC,eAAe,GAAG,cAAc;GAC/B,MAAM,YAAY,YAAY,KAAK;GACnC,MAAM,SAAS,cAAc,GAAG,UAAU;AAC1C,OAAI,kBAAkB,QACpB,QAAO,OACJ,MAAM,aAAa;IAClB,MAAM,aAAa;IACnB,MAAM,SAAS,WAAW;AAC1B,QAAI,iBAAiB,OAAO,CAC1B,QAAO;KACL,GAAG;KACH,QAAQ,mBACN,aACA,QACA,WACA,UAAU,IACV,SACD;KACF;AAEH,WAAO;KACP,CACD,OAAO,QAAQ;AACd,0BACE,aACA,KACA,WACA,UAAU,IACV,SACD;AACD,UAAM;KACN;AAEN,UAAO;KAET,SACD;AAEH,SAAO;IAET,SACD;AAED,KAAI,iBAAiB,OAAO,qBAAqB,CAC/C,mBAAkB,IAAI,SAAS;;AAInC,SAAgB,aAAa,SAGpB;CACP,MAAM,EAAE,gBAAgB;CACxB,MAAM,MACH,QAAQ,UAA6C;AAExD,KAAI,OAAO,KACT,OAAM,IAAI,MACR,wIACD;AAEH,mBAAkB,WAAW,YAAY;CAEzC,MAAM,eAAgB,IAAI,WAAW,IAAI,iBAAiB,IAAI;AAG9D,KAAI,CAAC,cAAc,UAAW;CAE9B,MAAM,YAAY,oBAAoB,cAAc,CAAC,OAAO,CAAC;CAC7D,IAAI,WAAW;AACf,KAAI,WAAW;EACb,MAAM,SAAS;AACf,eACE,QACA,YACA,uBAAuB,aAAa,UAAU,EAC9C,UACD;AACD,eACE,QACA,UACA,uBAAuB,aAAa,UAAU,EAC9C,UACD;AACD,aACE,iBAAiB,QAAQ,WAAW,IACpC,iBAAiB,QAAQ,SAAS;;AAGtC,KAAI,SACF,mBAAkB,IAAI,UAAU;;AAIpC,SAAgB,aAAa,SAGpB;CACP,MAAM,EAAE,gBAAgB;CACxB,MAAM,MACH,QAAQ,UAA6C;AAExD,KAAI,OAAO,KACT,OAAM,IAAI,MACR,8JACD;AAEH,mBAAkB,WAAW,YAAY;CAEzC,MAAM,cAAc,IAAI;AAGxB,KAAI,CAAC,aAAa,UAAW;AAE7B,cACE,YAAY,WACZ,SACC,UAAU,GAAG,SAAS;EACrB,MAAM,UAAU,KAAK;EACrB,MAAM,cAAc,OAAO,SAAS,aAAa,QAAQ,GAAG;EAC5D,MAAM,cACJ,YAAY,SAAS,kBAAkB,IACvC,YAAY,SAAS,wBAAwB;EAC/C,MAAM,YAAY,YAAY,KAAK;EACnC,MAAM,SAAS,SAAS,GAAG,KAAK;AAChC,MAAI,kBAAkB,QACpB,QAAO,OACJ,MAAM,aAAa;AAClB,OAAI,CAAC,YACH,QAAO;AAET,OAAI,YAAY,SAAS,wBAAwB,EAAE;IACjD,MAAM,aAAa;IACnB,MAAM,SAAS,WAAW;AAC1B,QAAI,iBAAiB,OAAO,CAC1B,QAAO;KACL,GAAG;KACH,QAAQ,0BACN,aACA,QACA,WACA,KAAK,GACN;KACF;SAGH,uBAAsB,aAAa,UAAU,WAAW,KAAK,GAAG;AAElE,UAAO;IACP,CACD,OAAO,QAAQ;AACd,OAAI,YACF,uBACE,aACA,KACA,WACA,KAAK,IACL,UACD;AAEH,SAAM;IACN;AAEN,SAAO;IAET,UACD;AAED,KACE,iBAAiB,YAAY,WAAsC,OAAO,CAE1E,mBAAkB,IAAI,UAAU;;;;;;;;;;;;;;;;;AAmBpC,SAAgB,MAAM,SAGT;CACX,MAAMC,UAAoB,EAAE;CAC5B,MAAM,OAAO,QAAQ,WAAW,EAAE;CAClC,MAAMC,YAKD;EACH;GACE,IAAI;GACJ,WAAW,oBAAoB,KAAK,UAAU;GAC9C,MAAM;GACN,WAAW;GACZ;EACD;GACE,IAAI;GACJ,WAAW,oBAAoB,KAAK,UAAU;GAC9C,MAAM;GACN,WAAW;GACZ;EACD;GACE,IAAI;GACJ,WAAW,uBAAuB,KAAK,aAAa;GACpD,MAAM;GACN,WAAW;GACZ;EACD;GACE,IAAI;GACJ,WAAW,oBAAoB,KAAK,UAAU;GAC9C,MAAM;GACN,WAAW;GACZ;EACD;GACE,IAAI;GACJ,WAAW,qBAAqB,KAAK,WAAW;GAChD,MAAM;GACN,WAAW;GACZ;EACD;GACE,IAAI;GACJ,WAAW,qBAAqB,KAAK,WAAW;GAChD,MAAM;GACN,WAAW;GACZ;EACF;AACD,MAAK,MAAM,EAAE,IAAI,WAAW,MAAM,eAAe,WAAW;AAC1D,MAAI,CAAC,UAAW;AAChB,MAAI;AACF,MAAG;IAAE,aAAa,QAAQ;IAAa,QAAQ,KAAK;IAAY,CAAC;AACjE,OAAI,kBAAkB,IAAI,KAAK,CAC7B,SAAQ,KAAK,KAAK;WAEb,OAAO;AACd,OAAI,iBAAiB,oBACnB,OAAM;;;AAKZ,QAAO;;AAGT,SAAgB,UAAgB;AAC9B,MAAK,MAAM,UAAU,eAAe,SAAS,EAAE;EAC7C,MAAM,SAAS,OAAO;AACtB,SAAO,OAAO,UAAU,OAAO;;AAEjC,gBAAe,SAAS;AACxB,mBAAkB,OAAO;AACzB,iBAAgB,OAAO;;AAGzB,SAAgB,gBAAsB;AACpC,oBAAmB,SAAS;;AAG9B,SAAgB,mBAAyB;AACvC,oBAAmB,YAAY;;AAGjC,SAAgB,gBAAsB;AACpC,oBAAmB,SAAS;;AAG9B,SAAgB,iBAAuB;AACrC,oBAAmB,UAAU;;AAG/B,SAAgB,iBAAuB;AACrC,oBAAmB,UAAU;;AAG/B,SAAgB,qBAA2B;AACzC,oBAAmB,eAAe;;AAGpC,SAAS,mBAAmB,cAA4B;CACtD,MAAMC,WAAqB,EAAE;AAC7B,MAAK,IAAI,IAAI,eAAe,SAAS,GAAG,KAAK,GAAG,KAAK;EACnD,MAAM,SAAS,eAAe;AAC9B,MAAI,UAAU,KAAM;AACpB,MACG,OAA4C,aAAa,cAC1D;GACA,MAAM,SAAS,OAAO;AACtB,UAAO,OAAO,UAAU,OAAO;AAC/B,YAAS,KAAK,EAAE;;;AAGpB,MAAK,MAAM,OAAO,SAChB,gBAAe,OAAO,KAAK,EAAE;AAE/B,mBAAkB,OAAO,aAAa;AACtC,iBAAgB,OAAO,aAAa;;AAOtC,SAAS,uBACP,aACA,cAC4E;AAC5E,SAAQ,UAAU,GAAG,SAAS;EAC5B,MAAM,YAAY,YAAY,KAAK;EACnC,MAAM,SAAS,SAAS,GAAG,KAAK;AAChC,MAAI,kBAAkB,QACpB,QAAO,OACJ,MAAM,aAAa;AAClB,OAAI,iBAAiB,SAAS,EAAE;AAC9B,QAAI,iBAAiB,YACnB,QAAO,4BACL,aACA,UACA,WACA,KAAK,GACN;AAEH,WAAO,mBACL,aACA,UACA,WACA,KAAK,IACL,aACD;;AAEH,OAAI,iBAAiB,YACnB,yBAAwB,aAAa,UAAU,WAAW,KAAK,GAAG;OAElE,0BACE,aACA,UACA,WACA,KAAK,IACL,aACD;AAEH,UAAO;IACP,CACD,OAAO,QAAQ;AACd,yBACE,aACA,KACA,WACA,KAAK,IACL,aACD;AACD,SAAM;IACN;AAEN,SAAO;;;AAIX,SAAS,4BACP,aAC4E;AAC5E,SAAQ,UAAU,GAAG,SAAS;EAC5B,MAAM,YAAY,YAAY,KAAK;EACnC,MAAM,SAAS,SAAS,GAAG,KAAK;AAChC,MAAI,EAAE,kBAAkB,SAAU,QAAO;AACzC,SAAO,OACJ,MAAM,aAAa;AAClB,OAAI,iBAAiB,SAAS,CAC5B,QAAO,4BACL,aACA,UACA,WACA,KAAK,GACN;GAEH,MAAM,UAAU;GAChB,MAAM,SAAS,QAAQ;AACvB,OAAI,iBAAiB,OAAO,CAC1B,QAAO;IACL,GAAG;IACH,QAAQ,4BACN,aACA,QACA,WACA,KAAK,GACN;IACF;AAEH,UAAO;IACP,CACD,OAAO,QAAQ;AACd,yBACE,aACA,KACA,WACA,KAAK,IACL,YACD;AACD,SAAM;IACN;;;AAIR,SAAS,iBAAiB,OAAiD;AACzE,QACE,SAAS,QACT,OAAQ,MAAkC,OAAO,mBAC/C;;AAIN,gBAAgB,mBACd,IACA,QACA,WACA,aACA,cACyB;AACzB,KAAI,iBAAiB,UAAU;AAC7B,SAAO,yBAAyB,IAAI,QAAQ,WAAW,YAAY;AACnE;;CAEF,MAAM,MAAM,kBAAkB;AAC9B,KAAI,OAAO,MAAM;AACf,SAAO;AACP;;CAGF,IAAI,UAAU;CACd,IAAI,QAAQ;CACZ,IAAI,eAAe;CACnB,IAAIC;CACJ,IAAIC;CACJ,IAAIC;CACJ,IAAI,UAAU;CACd,IAAIC;AAEJ,KAAI;AACF,aAAW,MAAM,SAAS,QAAQ;GAChC,MAAM,IAAI;GACV,MAAM,UAAU,EAAE;GAClB,MAAM,QAAQ,UAAU,IAAI;AAC5B,OAAI,OAAO,WAAW,KAAM,YAAW,OAAO,MAAM,QAAQ;AAC5D,OAAI,EAAE,SAAS,KAAM,SAAQ,OAAO,EAAE,MAAM;AAC5C,OAAI,UAAU,IAAI,iBAAiB,KACjC,gBAAe,OAAO,QAAQ,GAAG,cAAc;GACjD,MAAM,QAAQ,EAAE;AAChB,OAAI,SAAS,MAAM;AACjB,kBAAc,MAAM;AACpB,mBAAe,MAAM;AACrB,kBAAc,MAAM;;AAEtB,SAAM;;UAED,OAAO;AACd,YAAU;AACV,iBAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AACrE,QAAM;WACE;EACR,MAAM,YAAY,YAAY,KAAK,GAAG;AACtC,KAAG,eAAe;GAChB,QAAQ,IAAI,UAAU;GACtB;GACA,WAAW,IAAI;GACf;GACA,UAAU;GACV;GACA,SAAS,IAAI;GACb;GACA;GACA;GACA;GACA,SAAS,IAAI;GACb,KAAK,IAAI;GACT,aAAa;GACb;GACA;GACA,GAAG,eAAe,IAAI;GACvB,CAAC;;;AAIN,gBAAgB,4BACd,IACA,QACA,WACA,aACyB;CACzB,MAAM,MAAM,kBAAkB;AAC9B,KAAI,OAAO,MAAM;AACf,SAAO;AACP;;CAEF,MAAM,MAAM;CACZ,IAAI,UAAU;CACd,IAAI,QAAQ,OAAO,KAAK,SAAS,UAAU;CAC3C,IAAI,eAAe;CACnB,IAAIH;CACJ,IAAIC;CACJ,IAAI,UAAU;CACd,IAAIE;AACJ,KAAI;AACF,aAAW,MAAM,SAAS,QAAQ;GAChC,MAAM,IAAI;AACV,OAAI,EAAE,SAAS,iBAAiB;IAC9B,MAAM,UAAU,EAAE;AAClB,QAAI,OAAO,SAAS,UAAU,SAAU,SAAQ,QAAQ;IACxD,MAAM,QAAQ,SAAS;AACvB,QAAI,OAAO,OAAO,iBAAiB,SACjC,eAAc,MAAM;;AAGxB,OAAI,EAAE,SAAS,uBAAuB;IACpC,MAAM,QAAQ,EAAE;AAChB,QAAI,OAAO,OAAO,SAAS,SAAU,YAAW,MAAM;;AAExD,OAAI,EAAE,SAAS,iBAAiB;IAC9B,MAAM,QAAQ,EAAE;AAChB,QAAI,OAAO,OAAO,gBAAgB,SAChC,gBAAe,MAAM;aACZ,OAAO,EAAE,gBAAgB,SAElC,gBAAe,EAAE;IAEnB,MAAM,QAAQ,EAAE;AAChB,QAAI,OAAO,OAAO,kBAAkB,SAClC,gBAAe,MAAM;;AAGzB,OAAI,EAAE,SAAS,gBAAgB;IAC7B,MAAM,QAAQ,EAAE;AAChB,QAAI,OAAO,OAAO,kBAAkB,SAClC,gBAAe,MAAM;;AAEzB,SAAM;;UAED,OAAO;AACd,YAAU;AACV,iBAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AACrE,QAAM;WACE;EACR,MAAM,YAAY,YAAY,KAAK,GAAG;AACtC,KAAG,eAAe;GAChB,QAAQ,IAAI,UAAU;GACtB;GACA,WAAW,IAAI;GACf;GACA,UAAU;GACV;GACA,SAAS,IAAI;GACb;GACA;GACA;GACA,SAAS,IAAI;GACb,KAAK,IAAI;GACT,aAAa;GACb;GACA;GACA,GAAG,eAAe,IAAI;GACvB,CAAC;;;AAIN,gBAAgB,yBACd,IACA,QACA,WACA,cACyB;CACzB,MAAM,MAAM,kBAAkB;AAC9B,KAAI,OAAO,MAAM;AACf,SAAO;AACP;;CAEF,IAAI,UAAU;CACd,MAAM,QAAQ;CACd,IAAI,eAAe;CACnB,IAAIH;CACJ,IAAIC;CACJ,IAAIC;CACJ,IAAI,UAAU;CACd,IAAIC;AACJ,KAAI;AACF,aAAW,MAAM,SAAS,QAAQ;GAChC,MAAM,IAAI;GACV,MAAM,UAAW,EAAE,YAAY;GAC/B,MAAM,SAAS,QAAQ;AACvB,OAAI,OAAO,WAAW,WAAY,YAAW,OAAO,QAAQ,CAAC;GAC7D,MAAM,QAAQ,QAAQ;AAGtB,OAAI,OAAO,OAAO,qBAAqB,SACrC,eAAc,MAAM;AAEtB,OAAI,OAAO,OAAO,yBAAyB,SACzC,gBAAe,MAAM;AAEvB,OAAI,OAAO,OAAO,oBAAoB,SACpC,eAAc,MAAM;GAEtB,MAAM,aAAa,QAAQ;AAG3B,OAAI,OAAO,aAAa,IAAI,iBAAiB,SAC3C,gBAAe,WAAW,GAAG;AAE/B,SAAM;;UAED,OAAO;AACd,YAAU;AACV,iBAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AACrE,QAAM;WACE;AACR,KAAG,eAAe;GAChB,QAAQ,IAAI,UAAU;GACtB;GACA,WAAW,IAAI;GACf;GACA,UAAU;GACV,WAAW,YAAY,KAAK,GAAG;GAC/B,SAAS,IAAI;GACb;GACA;GACA;GACA;GACA,SAAS,IAAI;GACb,KAAK,IAAI;GACT,aAAa;GACb;GACA;GACA,GAAG,eAAe,IAAI;GACvB,CAAC;;;AAIN,gBAAgB,0BACd,IACA,QACA,WACA,aACyB;CACzB,MAAM,MAAM,kBAAkB;AAC9B,KAAI,OAAO,MAAM;AACf,SAAO;AACP;;CAEF,MAAM,OAAO;CACb,IAAI,QAAQ,OAAO,MAAM,WAAW,UAAU;CAC9C,IAAI,UAAU;CACd,IAAI,eAAe;CACnB,IAAIH;CACJ,IAAIC;CACJ,IAAIC;CACJ,IAAI,UAAU;CACd,IAAIC;AACJ,KAAI;AACF,aAAW,MAAM,YAAY,QAAQ;GACnC,MAAM,QAAQ;GACd,MAAM,QACJ,MAAM,mBACL;AACH,OAAI,OAAO,OAAO,SAAS,SAAU,YAAW,MAAM;GACtD,MAAM,eAAe,MAAM;AAG3B,OAAI,OAAO,cAAc,UAAU,SAAU,SAAQ,aAAa;GAClE,MAAM,cAAc,MAAM;AAG1B,OAAI,OAAO,aAAa,eAAe,SACrC,gBAAe,YAAY;GAE7B,MAAM,QAAS,MAAM,UACjB;AACJ,OAAI,OAAO,OAAO,gBAAgB,SAChC,eAAc,MAAM;AACtB,OAAI,OAAO,OAAO,iBAAiB,SACjC,gBAAe,MAAM;AACvB,OAAI,OAAO,OAAO,gBAAgB,SAChC,eAAc,MAAM;AACtB,SAAM;;UAED,OAAO;AACd,YAAU;AACV,iBAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AACrE,QAAM;WACE;AACR,KAAG,eAAe;GAChB,QAAQ,IAAI,UAAU;GACtB;GACA,WAAW,IAAI;GACf;GACA,UAAU;GACV,WAAW,YAAY,KAAK,GAAG;GAC/B,SAAS,IAAI;GACb;GACA;GACA;GACA;GACA,SAAS,IAAI;GACb,KAAK,IAAI;GACT,aAAa;GACb;GACA;GACA,GAAG,eAAe,IAAI;GACvB,CAAC;;;AAQN,SAAS,kBACP,KACA,eACA,WACA,aACA,cACM;AACN,KACG,cAAc,YACX,2BAA2B,KAE/B;CAEF,MAAM,eAAe;CAWrB,MAAM,QAAQ,IAAI,MAAM,cAV2B,EACjD,UAAU,QAAQ,MAAM,WAAW;EACjC,MAAM,WAAW,QAAQ,UAAU,QAAQ,MAAM,UAAU;AAI3D,4BAA0B,UAAU,aAAa,aAAa;AAC9D,SAAO;IAEV,CAC6C;AAC9C,CAAC,MAA6C,yBAAyB;CAEvE,MAAM,MAAM;CACZ,IAAIC,mBAAkC;AACtC,KAAI,IAAI,eAAe,cAAc;AACnC,MAAI,aAAa;AACjB,qBAAmB;OAEnB,MAAK,MAAM,OAAO,OAAO,KAAK,IAAI,CAChC,KAAI,IAAI,SAAS,cAAc;AAC7B,MAAI,OAAO;AACX,qBAAmB;;AAIzB,KAAI,oBAAoB,KACtB,gBAAe,KAAK;EAClB,QAAQ;EACR,QAAQ;EACR,UAAU;EACV,UAAU;EACX,CAAC;;AAIN,SAAS,kBACP,YACA,eACA,WACA,aACA,cACS;CACT,MAAM,cAAc;AAGpB,KAAI,CAAC,aAAa,UAAW,QAAO;CAEpC,MAAM,mBAAmB,oBAAoB,aAAa,CACxD,QACA,cACD,CAAC;AACF,KAAI,kBAAkB;EACpB,MAAM,SAAS;AACf,eACE,QACA,UACA,uBAAuB,aAAa,aAAa,EACjD,aACD;AACD,eACE,QACA,SACA,uBAAuB,aAAa,aAAa,EACjD,aACD;OAED,mBACE,aACA,eACA,WACA,aACA,aACD;CAGH,MAAM,iBAAiB,oBAAoB,aAAa,CAAC,YAAY,CAAC;AACtE,KAAI,gBAAgB;EAClB,MAAM,SAAS;AACf,eACE,QACA,UACA,sBAAsB,aAAa,aAAa,EAChD,aACD;AACD,eACE,QACA,UACA,sBAAsB,aAAa,aAAa,EAChD,aACD;;AAEH,QAAO;;AAGT,SAAS,0BACP,UACA,aACA,cACM;AACN,KAAI;EAEF,MAAM,cADO,SAAS,MACI;AAG1B,MAAI,eAAe,OAAO,YAAY,WAAW,YAAY;GAC3D,MAAM,WAAW,YAAY,OAAO,KAAK,YAAY;AACrD,eAAY,UAAU,GAAG,SACvB,uBAAuB,aAAa,aAAa,CAAC,UAAU,GAAG,KAAK;;AAExE,MAAI,eAAe,OAAO,YAAY,UAAU,YAAY;GAC1D,MAAM,gBAAgB,YAAY,MAAM,KAAK,YAAY;AACzD,eAAY,SAAS,GAAG,SACtB,uBAAuB,aAAa,aAAa,CAC/C,eACA,GAAG,KACJ;;EAGL,MAAM,YAAY,SAAS;AAC3B,MAAI,aAAa,OAAO,UAAU,WAAW,YAAY;GACvD,MAAM,oBAAoB,UAAU,OAAO,KAAK,UAAU;AAC1D,aAAU,UAAU,GAAG,SACrB,sBAAsB,aAAa,aAAa,CAC9C,mBACA,GAAG,KACJ;;AAEL,MAAI,aAAa,OAAO,UAAU,WAAW,YAAY;GACvD,MAAM,0BAA0B,UAAU,OAAO,KAAK,UAAU;AAChE,aAAU,UAAU,GAAG,SACrB,sBAAsB,aAAa,aAAa,CAC9C,yBACA,GAAG,KACJ;;SAEC;;AAKV,SAAS,sBACP,aACA,cAC4E;AAC5E,SAAQ,UAAU,GAAG,SAAS;EAC5B,MAAM,YAAY,YAAY,KAAK;EACnC,MAAM,SAAS,SAAS,GAAG,KAAK;AAChC,MAAI,kBAAkB,QACpB,QAAO,OACJ,MAAM,aAAa;AAClB,OAAI,iBAAiB,SAAS,CAC5B,QAAO,4BACL,aACA,UACA,WACA,KAAK,IACL,aACD;AAEH,2BACE,aACA,UACA,WACA,KAAK,IACL,aACD;AACD,UAAO;IACP,CACD,OAAO,QAAQ;AACd,yBACE,aACA,KACA,WACA,KAAK,IACL,aACD;AACD,SAAM;IACN;AAEN,SAAO;;;AAQX,SAAS,oBACP,KACA,MACS;CACT,IAAIC,UAAmB,IAAI;AAC3B,MAAK,MAAM,OAAO,MAAM;AACtB,MAAI,WAAW,QAAQ,OAAO,YAAY,SAAU,QAAO;EAC3D,MAAM,MAAM;AACZ,MAAI,OAAO,IAAI,SAAS,YAAY,IAAI,QAAQ,KAC9C,WAAU,IAAI;MAEd,QAAO;;AAGX,QAAO;;AAGT,SAAS,yBACP,IACA,UACA,WACA,cACA,cACM;AACN,KAAI,YAAY,QAAQ,OAAO,aAAa,SAAU;CAEtD,MAAM,MAAM,kBAAkB;AAC9B,KAAI,OAAO,KAAM;CAEjB,MAAM,OAAO;CACb,MAAM,QAAQ,KAAK;CAEnB,MAAM,SADU,KAAK,UACI;CACzB,MAAM,UAAU,QAAQ;CAExB,MAAM,YAAY,YAAY,KAAK,GAAG;AAEtC,IAAG,eAAe;EAChB,QAAQ,IAAI,UAAU;EACtB,SAAS,OAAO,SAAS,WAAW,GAAG;EACvC,WAAW,IAAI;EACf,OAAO,OAAO,KAAK,SAAS,UAAU;EACtC,UAAU;EACV;EACA,SAAS,IAAI;EACb,aAAa,OAAO;EACpB,cAAc,OAAO;EACrB,aAAa,OAAO;EACpB,cAAc,OAAO,QAAQ,iBAAiB,GAAG;EACjD,SAAS,IAAI;EACb,KAAK,IAAI;EACT,GAAG,eAAe,IAAI;EACvB,CAAC;;AAGJ,SAAS,wBACP,IACA,UACA,WACA,cACM;AACN,KAAI,YAAY,QAAQ,OAAO,aAAa,SAAU;CAEtD,MAAM,MAAM,kBAAkB;AAC9B,KAAI,OAAO,KAAM;CAEjB,MAAM,OAAO;CACb,MAAM,QAAQ,KAAK;CAEnB,MAAM,YADU,KAAK,SACM,MAAM,MAAM,EAAE,SAAS,OAAO;CAEzD,MAAM,YAAY,YAAY,KAAK,GAAG;AAEtC,IAAG,eAAe;EAChB,QAAQ,IAAI,UAAU;EACtB,SAAS,OAAO,WAAW,QAAQ,GAAG;EACtC,WAAW,IAAI;EACf,OAAO,OAAO,KAAK,SAAS,UAAU;EACtC,UAAU;EACV;EACA,SAAS,IAAI;EACb,aAAa,OAAO;EACpB,cAAc,OAAO;EACrB,cAAc,OAAO,KAAK,eAAe,GAAG;EAC5C,SAAS,IAAI;EACb,KAAK,IAAI;EACT,GAAG,eAAe,IAAI;EACvB,CAAC;;AAGJ,SAAS,sBACP,IACA,OACA,WACA,aACA,cACM;CACN,MAAM,MAAM,kBAAkB;AAC9B,KAAI,OAAO,KAAM;CAEjB,MAAM,OAAO;CACb,MAAM,YAAY,YAAY,KAAK,GAAG;AAEtC,IAAG,eAAe;EAChB,QAAQ,IAAI,UAAU;EACtB,SAAS;EACT,WAAW,IAAI;EACf,OAAO,OAAO,MAAM,SAAS,MAAM,WAAW,UAAU;EACxD,UAAU;EACV;EACA,SAAS,IAAI;EACb,SAAS;EACT,cAAc,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;EACpE,SAAS,IAAI;EACb,KAAK,IAAI;EACT,GAAG,eAAe,IAAI;EACvB,CAAC;;AAGJ,SAAS,qBACP,IACA,UACA,WACM;AACN,KAAI,YAAY,QAAQ,OAAO,aAAa,SAAU;CAEtD,MAAM,MAAM,kBAAkB;AAC9B,KAAI,OAAO,KAAM;CAEjB,MAAM,OAAO;CACb,MAAM,UAAW,KAAK,YAAY;CAClC,MAAM,OAAO,OAAO,QAAQ,SAAS,aAAa,OAAO,QAAQ,MAAM,CAAC,GAAG;CAC3E,MAAM,QAAQ,QAAQ;CAEtB,MAAM,YAAY,YAAY,KAAK,GAAG;AAEtC,IAAG,eAAe;EAChB,QAAQ,IAAI,UAAU;EACtB,SAAS;EACT,WAAW,IAAI;EACf,OAAO;EACP,UAAU;EACV;EACA,SAAS,IAAI;EACb,aAAa,OAAO;EACpB,cAAc,OAAO;EACrB,aAAa,OAAO;EACpB,SAAS,IAAI;EACb,KAAK,IAAI;EACT,GAAG,eAAe,IAAI;EACvB,CAAC;;AAGJ,SAAS,sBACP,IACA,UACA,WACA,aACM;AACN,KAAI,YAAY,QAAQ,OAAO,aAAa,SAAU;CAEtD,MAAM,MAAM,kBAAkB;AAC9B,KAAI,OAAO,KAAM;CAEjB,MAAM,OAAO;CAMb,MAAM,cALS,KAAK,QACI,UACC,UAGE,MAAM,MAAM,EAAE,QAAQ,KAAK;CACtD,MAAM,QAAQ,KAAK;CACnB,MAAM,OAAO;CAEb,MAAM,YAAY,YAAY,KAAK,GAAG;AAEtC,IAAG,eAAe;EAChB,QAAQ,IAAI,UAAU;EACtB,SAAS,OAAO,WAAW,QAAQ,GAAG;EACtC,WAAW,IAAI;EACf,OAAO,OAAO,MAAM,WAAW,UAAU;EACzC,UAAU;EACV;EACA,SAAS,IAAI;EACb,aAAa,OAAO;EACpB,cAAc,OAAO;EACrB,aAAa,OAAO;EACpB,cAAc,OAAO,KAAK,cAAc,GAAG;EAC3C,SAAS,IAAI;EACb,KAAK,IAAI;EACT,GAAG,eAAe,IAAI;EACvB,CAAC;;AAGJ,SAAS,wBACP,IACA,UACA,WACA,aACA,cACM;AACN,KAAI,YAAY,QAAQ,OAAO,aAAa,SAAU;CACtD,MAAM,MAAM,kBAAkB;AAC9B,KAAI,OAAO,KAAM;CAEjB,MAAM,OAAO;CACb,MAAM,QAAQ,KAAK;CACnB,MAAM,aACJ,OAAO,KAAK,gBAAgB,WACxB,KAAK,cACL,sBAAsB,KAAK,OAAO;CACxC,MAAM,OAAO;AAEb,IAAG,eAAe;EAChB,QAAQ,IAAI,UAAU;EACtB,SAAS;EACT,WAAW,IAAI;EACf,OAAO,OAAO,KAAK,SAAS,MAAM,SAAS,UAAU;EACrD,UAAU;EACV,WAAW,YAAY,KAAK,GAAG;EAC/B,SAAS,IAAI;EACb,aACE,OAAO,OAAO,iBAAiB,WAC1B,MAAM,eACP;EACN,cACE,OAAO,OAAO,kBAAkB,WAC3B,MAAM,gBACP;EACN,aACE,OAAO,OAAO,iBAAiB,WAC1B,MAAM,eACP;EACN,iBACE,QACE,OAAO,wBACN,qBAAqB,YAClB,OAAO,uBACN,mBACH;EACN,cAAc,8BAA8B,KAAK;EACjD,SAAS,IAAI;EACb,KAAK,IAAI;EACT,GAAG,eAAe,IAAI;EACvB,CAAC;;AAGJ,gBAAgB,4BACd,IACA,QACA,WACA,aACA,cACyB;CACzB,MAAM,MAAM,kBAAkB;AAC9B,KAAI,OAAO,MAAM;AACf,SAAO;AACP;;CAEF,MAAM,OAAO;CACb,MAAM,QAAQ,OAAO,MAAM,SAAS,UAAU;CAC9C,IAAI,UAAU;CACd,IAAI,eAAe;CACnB,IAAIL;CACJ,IAAIC;CACJ,IAAIC;CACJ,IAAI,UAAU;CACd,IAAIC;AAEJ,KAAI;AACF,aAAW,MAAM,SAAS,QAAQ;GAChC,MAAM,IAAI;GACV,MAAM,OAAO,EAAE;AACf,OAAI,SAAS,8BAA8B;IACzC,MAAM,QAAQ,EAAE;AAChB,QAAI,OAAO,UAAU,SAAU,YAAW;cACjC,SAAS,sBAAsB;IACxC,MAAM,WAAW,EAAE;IACnB,MAAM,QAAQ,UAAU;IACxB,MAAM,aAAa,UAAU;AAC7B,QAAI,OAAO,eAAe,YAAY,WAAW,SAAS,EACxD,WAAU;AAEZ,QAAI,OAAO,OAAO,iBAAiB,SACjC,eAAc,MAAM;AACtB,QAAI,OAAO,OAAO,kBAAkB,SAClC,gBAAe,MAAM;AACvB,QAAI,OAAO,OAAO,iBAAiB,SACjC,eAAc,MAAM;IACtB,MAAM,SAAS,UAAU;AACzB,QAAI,OAAO,WAAW,SAAU,gBAAe;;AAEjD,SAAM;;UAED,OAAO;AACd,YAAU;AACV,iBAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AACrE,QAAM;WACE;AACR,KAAG,eAAe;GAChB,QAAQ,IAAI,UAAU;GACtB;GACA,WAAW,IAAI;GACf;GACA,UAAU;GACV,WAAW,YAAY,KAAK,GAAG;GAC/B,SAAS,IAAI;GACb;GACA;GACA;GACA;GACA,SAAS,IAAI;GACb,KAAK,IAAI;GACT,aAAa;GACb;GACA;GACA,GAAG,eAAe,IAAI;GACvB,CAAC;;;AAIN,SAAS,sBAAsB,QAAyB;AACtD,KAAI,CAAC,MAAM,QAAQ,OAAO,CAAE,QAAO;CACnC,IAAI,OAAO;AACX,MAAK,MAAM,QAAQ,QAAQ;AACzB,MAAI,QAAQ,QAAQ,OAAO,SAAS,SAAU;EAC9C,MAAM,UAAW,KAAiC;AAClD,MAAI,CAAC,MAAM,QAAQ,QAAQ,CAAE;AAC7B,OAAK,MAAM,QAAQ,SAAS;AAC1B,OAAI,QAAQ,QAAQ,OAAO,SAAS,SAAU;GAC9C,MAAM,WAAY,KAAiC;AACnD,OAAI,OAAO,aAAa,SAAU,SAAQ;;;AAG9C,QAAO;;AAGT,SAAS,8BACP,UACoB;AACpB,KAAI,OAAO,SAAS,WAAW,YAAY,SAAS,OAAO,SAAS,EAClE,QAAO,SAAS;CAElB,MAAM,SAAS,SAAS;AACxB,KAAI,CAAC,MAAM,QAAQ,OAAO,IAAI,OAAO,WAAW,EAAG,QAAO;CAC1D,MAAM,QAAQ,OAAO;AACrB,QAAO,OAAO,OAAO,WAAW,WAAW,MAAM,SAAS;;AAG5D,SAAS,eAAe,KASI;CAC1B,MAAMG,SAAkC;EACtC,eAAe,IAAI,iBAAiB;EACpC,eAAe,IAAI,iBAAiB;EACpC,cAAc,IAAI,gBAAgB;EAClC,SAAS,IAAI,WAAW;EACxB,QAAQ,IAAI,UAAU;EACvB;CAED,MAAMC,KAA8B,EAAE;AACtC,KAAI,IAAI,sBAAsB,KAC5B,IAAG,6BAA6B,IAAI;AAEtC,KAAI,IAAI,YAAY,IAAI,iBACtB,IAAG,0BAA0B,GAAG,IAAI,SAAS,GAAG,IAAI;AAEtD,KAAI,OAAO,KAAK,GAAG,CAAC,SAAS,EAC3B,QAAO,kBAAkB;AAG3B,QAAO"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic.d.ts","names":[],"sources":["../../src/providers/anthropic.ts"],"sourcesContent":[],"mappings":";;;;;;AAyBM,cADO,mBACW,EAAA,OAAM;AAI9B,cAJM,gBAI2B,EAJT,MAKX,CAAA,MAAA,EAAA,OAEK,CAAA,GAAA,IAAA;AAOA,UAVD,gBAAA,CAUC;EAA0B,SAAA,EAT/B,aAS+B;EAGvB,MAAA,CAAA,EAAA,MAAA;EAGE,aAAA,CAAA,EAbL,aAaK,GAAA,IAAA;EAmCP,gBAAA,CAAA,EAAA,OAAA;EAxCN;EAAc,eAAA,CAAA,EAAA,OAAA;AA6CxB;AACa,cAhDA,SAgDA,CAAA,gBA/CK,MA+CL,CAAA,MAAA,EAAA,OAAA,CAAA,GA/C+B,MA+C/B,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA,SA9CH,cAAA,CA8CG;EAQA,QAAA,OAAA;EACE,SAAA,QAAA,EArDM,eAqDN;EACI,QAAA,iBAAA;EAeP,WAAA,CAAA,OAAA,EAlEW,gBAkEX;EACa,IAAA,MAAA,CAAA,CAAA,EAhCT,OAgCS;;AACQ,cA5BpB,eAAA,CA4BoB;EAA5B,SAAA,EA3BQ,MA2BR,CAAA,MAAA,EAAA,OAAA,CAAA;EAAO,QAAA,QAAA;
|
|
1
|
+
{"version":3,"file":"anthropic.d.ts","names":[],"sources":["../../src/providers/anthropic.ts"],"sourcesContent":[],"mappings":";;;;;;AAyBM,cADO,mBACW,EAAA,OAAM;AAI9B,cAJM,gBAI2B,EAJT,MAKX,CAAA,MAAA,EAAA,OAEK,CAAA,GAAA,IAAA;AAOA,UAVD,gBAAA,CAUC;EAA0B,SAAA,EAT/B,aAS+B;EAGvB,MAAA,CAAA,EAAA,MAAA;EAGE,aAAA,CAAA,EAbL,aAaK,GAAA,IAAA;EAmCP,gBAAA,CAAA,EAAA,OAAA;EAxCN;EAAc,eAAA,CAAA,EAAA,OAAA;AA6CxB;AACa,cAhDA,SAgDA,CAAA,gBA/CK,MA+CL,CAAA,MAAA,EAAA,OAAA,CAAA,GA/C+B,MA+C/B,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA,SA9CH,cAAA,CA8CG;EAQA,QAAA,OAAA;EACE,SAAA,QAAA,EArDM,eAqDN;EACI,QAAA,iBAAA;EAeP,WAAA,CAAA,OAAA,EAlEW,gBAkEX;EACa,IAAA,MAAA,CAAA,CAAA,EAhCT,OAgCS;;AACQ,cA5BpB,eAAA,CA4BoB;EAA5B,SAAA,EA3BQ,MA2BR,CAAA,MAAA,EAAA,OAAA,CAAA;EAAO,QAAA,QAAA;EAsSI,QAAA,UAAA;EAmBA,QAAA,cAAA;EACC,QAAA,iBAAA;EAAN,WAAA,CAAA,MAAA,EAAA,OAAA,EAAA,OAAA,EA7UE,OA6UF,EAAA,SAAA,EA5UI,aA4UJ,EAAA,aAAA,EA3UQ,aA2UR,GAAA,IAAA,EAAA,gBAAA,EAAA,OAAA;EAIQ,MAAA,CAAA,MAAA,EAhUP,MAgUO,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA,kBAAA,CAAA,EA/TM,oBA+TN,CAAA,EA9Td,OA8Tc,CA9TN,iBA8TM,GA9Tc,aA8Td,CAAA,OAAA,CAAA,CAAA;EAAN,QAAA,WAAA;EAAK,QAAA,mBAAA;;;iBAxBF,4BAAA;iBAmBA,uBAAA,UACL,MAAM;;;aAIJ,MAAM"}
|
|
@@ -71,7 +71,8 @@ var WrappedMessages = class {
|
|
|
71
71
|
inputTokens: normalizedInput,
|
|
72
72
|
outputTokens: usage.output_tokens,
|
|
73
73
|
cacheReadInputTokens: cacheRead,
|
|
74
|
-
cacheCreationInputTokens: cacheCreation
|
|
74
|
+
cacheCreationInputTokens: cacheCreation,
|
|
75
|
+
defaultProvider: "anthropic"
|
|
75
76
|
});
|
|
76
77
|
} catch {}
|
|
77
78
|
this._trackFn({
|
|
@@ -165,7 +166,8 @@ var WrappedMessages = class {
|
|
|
165
166
|
inputTokens: streamNormalizedInput,
|
|
166
167
|
outputTokens: state.outputTokens,
|
|
167
168
|
cacheReadInputTokens: streamCacheRead,
|
|
168
|
-
cacheCreationInputTokens: streamCacheCreation
|
|
169
|
+
cacheCreationInputTokens: streamCacheCreation,
|
|
170
|
+
defaultProvider: "anthropic"
|
|
169
171
|
});
|
|
170
172
|
} catch {}
|
|
171
173
|
this._trackFn({
|
|
@@ -224,8 +226,11 @@ var WrappedMessages = class {
|
|
|
224
226
|
agentId: ctx.agentId,
|
|
225
227
|
parentAgentId: ctx.parentAgentId,
|
|
226
228
|
customerOrgId: ctx.customerOrgId,
|
|
229
|
+
agentVersion: ctx.agentVersion,
|
|
230
|
+
context: ctx.context,
|
|
227
231
|
env: ctx.env,
|
|
228
232
|
groups: ctx.groups,
|
|
233
|
+
eventProperties: ctx.eventProperties,
|
|
229
234
|
privacyConfig: this._privacyConfig
|
|
230
235
|
});
|
|
231
236
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic.js","names":["_AnthropicModule: Record<string, unknown> | null","clientOpts: Record<string, unknown>","costUsd: number | null","reasoning: string | undefined","toolCalls: Array<Record<string, unknown>>"],"sources":["../../src/providers/anthropic.ts"],"sourcesContent":["/**\n * Anthropic provider wrapper with automatic tracking.\n */\n\nimport type { PrivacyConfig } from '../core/privacy.js';\nimport { trackUserMessage } from '../core/tracking.js';\nimport { getDefaultPropagateContext, injectContext } from '../propagation.js';\nimport type {\n AmplitudeLike,\n AmplitudeOrAI,\n AnthropicResponse,\n TrackFn,\n} from '../types.js';\nimport { calculateCost } from '../utils/costs.js';\nimport { tryRequire } from '../utils/resolve-module.js';\nimport { StreamingAccumulator } from '../utils/streaming.js';\nimport {\n applySessionContext,\n BaseAIProvider,\n contextFields,\n type ProviderTrackOptions,\n} from './base.js';\n\nconst _resolved = tryRequire('@anthropic-ai/sdk');\nexport const ANTHROPIC_AVAILABLE = _resolved != null;\nconst _AnthropicModule: Record<string, unknown> | null = _resolved;\n\nexport { _AnthropicModule };\n\nexport interface AnthropicOptions {\n amplitude: AmplitudeOrAI;\n apiKey?: string;\n privacyConfig?: PrivacyConfig | null;\n propagateContext?: boolean;\n /** Pass the `@anthropic-ai/sdk` module directly to bypass `tryRequire` (required in bundler environments). */\n anthropicModule?: unknown;\n}\n\nexport class Anthropic<\n TClient extends Record<string, unknown> = Record<string, unknown>,\n> extends BaseAIProvider {\n private _client: TClient;\n readonly messages: WrappedMessages;\n private _propagateContext: boolean;\n\n constructor(options: AnthropicOptions) {\n super({\n amplitude: options.amplitude,\n privacyConfig: options.privacyConfig,\n providerName: 'anthropic',\n });\n\n const mod =\n (options.anthropicModule as Record<string, unknown> | null) ??\n _AnthropicModule;\n if (mod == null) {\n throw new Error(\n '@anthropic-ai/sdk package is required. Install it with: npm install @anthropic-ai/sdk — or pass the module directly via the anthropicModule option.',\n );\n }\n\n const AnthropicSDK = mod.Anthropic as new (\n opts: Record<string, unknown>,\n ) => unknown;\n\n const clientOpts: Record<string, unknown> = {};\n if (options.apiKey) clientOpts.apiKey = options.apiKey;\n\n this._client = new AnthropicSDK(clientOpts) as TClient;\n this._propagateContext =\n options.propagateContext ?? getDefaultPropagateContext();\n this.messages = new WrappedMessages(\n this._client,\n this.trackFn(),\n this._amplitude,\n this._privacyConfig,\n this._propagateContext,\n );\n }\n\n get client(): TClient {\n return this._client;\n }\n}\n\nexport class WrappedMessages {\n _original: Record<string, unknown>;\n private _trackFn: TrackFn;\n private _amplitude: AmplitudeLike;\n private _privacyConfig: PrivacyConfig | null;\n private _propagateContext: boolean;\n\n constructor(\n client: unknown,\n trackFn: TrackFn,\n amplitude: AmplitudeLike,\n privacyConfig: PrivacyConfig | null,\n propagateContext: boolean,\n ) {\n const clientObj = client as Record<string, unknown>;\n this._original = clientObj.messages as Record<string, unknown>;\n this._trackFn =\n typeof trackFn === 'function'\n ? trackFn\n : (trackFn as unknown as { trackFn(): TrackFn }).trackFn();\n this._amplitude = amplitude;\n this._privacyConfig = privacyConfig;\n this._propagateContext = propagateContext;\n }\n\n async create(\n params: Record<string, unknown>,\n amplitudeOverrides?: ProviderTrackOptions,\n ): Promise<AnthropicResponse | AsyncIterable<unknown>> {\n const createFn = this._original.create as (\n ...args: unknown[]\n ) => Promise<unknown>;\n const startTime = performance.now();\n const requestParams = this._withContextHeaders(params);\n const ctx = applySessionContext(amplitudeOverrides);\n\n try {\n this._trackInputMessages(\n requestParams.messages as unknown,\n ctx,\n amplitudeOverrides?.trackInputMessages ?? true,\n );\n const response = await createFn.call(this._original, requestParams);\n\n if (requestParams.stream === true && _isAsyncIterable(response)) {\n return this._wrapStream(\n response as AsyncIterable<unknown>,\n requestParams,\n startTime,\n ctx,\n );\n }\n\n const latencyMs = performance.now() - startTime;\n\n const resp = response as AnthropicResponse;\n const usage = resp.usage;\n const extracted = extractAnthropicContent(\n resp.content as unknown as Array<Record<string, unknown>> | undefined,\n );\n const firstTextBlock = resp.content?.find((b) => b.type === 'text');\n const modelName = String(resp.model ?? requestParams.model ?? 'unknown');\n\n const cacheRead = usage?.cache_read_input_tokens ?? 0;\n const cacheCreation = usage?.cache_creation_input_tokens ?? 0;\n const rawInput = usage?.input_tokens ?? 0;\n const normalizedInput =\n cacheRead || cacheCreation\n ? rawInput + cacheRead + cacheCreation\n : rawInput;\n\n let costUsd: number | null = null;\n if (usage?.input_tokens != null && usage?.output_tokens != null) {\n try {\n costUsd = calculateCost({\n modelName,\n inputTokens: normalizedInput,\n outputTokens: usage.output_tokens,\n cacheReadInputTokens: cacheRead,\n cacheCreationInputTokens: cacheCreation,\n });\n } catch {\n // cost calculation is best-effort\n }\n }\n\n this._trackFn({\n ...contextFields(ctx),\n modelName,\n provider: 'anthropic',\n responseContent: String(firstTextBlock?.text ?? ''),\n reasoningContent: extracted.reasoning,\n latencyMs,\n inputTokens: normalizedInput || undefined,\n outputTokens: usage?.output_tokens,\n cacheReadInputTokens: cacheRead || undefined,\n cacheCreationInputTokens: cacheCreation || undefined,\n totalCostUsd: costUsd,\n finishReason: resp.stop_reason,\n toolCalls:\n extracted.toolCalls.length > 0 ? extracted.toolCalls : undefined,\n isStreaming: false,\n systemPrompt: extractAnthropicSystemPrompt(requestParams.system),\n temperature: requestParams.temperature as number | undefined,\n maxOutputTokens: requestParams.max_tokens as number | undefined,\n topP: requestParams.top_p as number | undefined,\n });\n\n return response as AnthropicResponse;\n } catch (error) {\n const latencyMs = performance.now() - startTime;\n this._trackFn({\n ...contextFields(ctx),\n modelName: String(requestParams.model ?? 'unknown'),\n provider: 'anthropic',\n responseContent: '',\n latencyMs,\n isError: true,\n errorMessage: error instanceof Error ? error.message : String(error),\n });\n\n throw error;\n }\n }\n\n private async *_wrapStream(\n stream: AsyncIterable<unknown>,\n params: Record<string, unknown>,\n _startTime: number,\n sessionCtx: ProviderTrackOptions,\n ): AsyncGenerator<unknown> {\n const accumulator = new StreamingAccumulator();\n accumulator.model = String(params.model ?? 'unknown');\n let reasoningContent = '';\n\n try {\n for await (const event of stream) {\n const evt = event as Record<string, unknown>;\n const type = evt.type as string | undefined;\n\n if (type === 'content_block_delta') {\n const delta = evt.delta as Record<string, unknown> | undefined;\n if (delta?.type === 'text_delta' && delta.text != null) {\n accumulator.addContent(String(delta.text));\n } else if (\n delta?.type === 'thinking_delta' &&\n delta.thinking != null\n ) {\n reasoningContent += String(delta.thinking);\n }\n } else if (type === 'content_block_start') {\n const block = evt.content_block as\n | Record<string, unknown>\n | undefined;\n if (block?.type === 'tool_use') {\n accumulator.addToolCall({\n type: 'function',\n id: block.id,\n function: {\n name: String(block.name ?? ''),\n arguments:\n typeof block.input === 'string'\n ? block.input\n : JSON.stringify(block.input ?? {}),\n },\n });\n }\n } else if (type === 'message_delta') {\n const delta = evt.delta as Record<string, unknown> | undefined;\n if (delta?.stop_reason != null) {\n accumulator.finishReason = String(delta.stop_reason);\n }\n const usage = evt.usage as Record<string, number> | undefined;\n if (usage != null) {\n accumulator.setUsage({\n outputTokens: usage.output_tokens,\n });\n }\n } else if (type === 'message_start') {\n const message = evt.message as Record<string, unknown> | undefined;\n if (message?.model != null) {\n accumulator.model = String(message.model);\n }\n const usage = message?.usage as Record<string, number> | undefined;\n if (usage != null) {\n accumulator.setUsage({\n inputTokens: usage.input_tokens,\n cacheReadTokens: usage.cache_read_input_tokens,\n cacheCreationTokens: usage.cache_creation_input_tokens,\n });\n }\n }\n\n yield event;\n }\n } catch (error) {\n accumulator.setError(\n error instanceof Error ? error.message : String(error),\n );\n throw error;\n } finally {\n const state = accumulator.getState();\n const modelName = String(accumulator.model ?? params.model ?? 'unknown');\n\n const streamCacheRead = state.cacheReadTokens ?? 0;\n const streamCacheCreation = state.cacheCreationTokens ?? 0;\n const streamRawInput = state.inputTokens ?? 0;\n const streamNormalizedInput =\n streamCacheRead || streamCacheCreation\n ? streamRawInput + streamCacheRead + streamCacheCreation\n : streamRawInput;\n\n let costUsd: number | null = null;\n if (state.inputTokens != null && state.outputTokens != null) {\n try {\n costUsd = calculateCost({\n modelName,\n inputTokens: streamNormalizedInput,\n outputTokens: state.outputTokens,\n cacheReadInputTokens: streamCacheRead,\n cacheCreationInputTokens: streamCacheCreation,\n });\n } catch {\n // cost calculation is best-effort\n }\n }\n\n this._trackFn({\n ...contextFields(sessionCtx),\n modelName,\n provider: 'anthropic',\n responseContent: state.content,\n latencyMs: accumulator.elapsedMs,\n inputTokens: streamNormalizedInput || undefined,\n outputTokens: state.outputTokens,\n cacheReadInputTokens: streamCacheRead || undefined,\n cacheCreationInputTokens: streamCacheCreation || undefined,\n totalCostUsd: costUsd,\n finishReason: state.finishReason,\n toolCalls: state.toolCalls.length > 0 ? state.toolCalls : undefined,\n providerTtfbMs: state.ttfbMs,\n isStreaming: true,\n isError: state.isError,\n errorMessage: state.errorMessage,\n reasoningContent: reasoningContent || undefined,\n systemPrompt: extractAnthropicSystemPrompt(params.system),\n temperature: params.temperature as number | undefined,\n maxOutputTokens: params.max_tokens as number | undefined,\n topP: params.top_p as number | undefined,\n });\n }\n }\n\n private _withContextHeaders(\n params: Record<string, unknown>,\n ): Record<string, unknown> {\n if (!this._propagateContext) return params;\n const existing = (params.extra_headers ?? params.headers) as\n | Record<string, string>\n | undefined;\n const injected = injectContext(existing);\n return {\n ...params,\n extra_headers: injected,\n };\n }\n\n private _trackInputMessages(\n messages: unknown,\n ctx: ProviderTrackOptions,\n shouldTrackInputMessages: boolean,\n ): void {\n if (!shouldTrackInputMessages) return;\n if (ctx.userId == null || ctx.sessionId == null) return;\n if (!Array.isArray(messages)) return;\n for (const msg of messages) {\n const role = (msg as Record<string, unknown>)?.role;\n if (role !== 'user') continue;\n const rawContent = (msg as Record<string, unknown>)?.content;\n const content = Array.isArray(rawContent)\n ? rawContent\n .map((part) => {\n if (typeof part === 'string') return part;\n const text = (part as Record<string, unknown>)?.text;\n return typeof text === 'string' ? text : '';\n })\n .join('')\n : typeof rawContent === 'string'\n ? rawContent\n : '';\n if (!content) continue;\n trackUserMessage({\n amplitude: this._amplitude,\n userId: ctx.userId,\n messageContent: content,\n sessionId: ctx.sessionId,\n traceId: ctx.traceId,\n turnId: ctx.turnId ?? undefined,\n agentId: ctx.agentId,\n parentAgentId: ctx.parentAgentId,\n customerOrgId: ctx.customerOrgId,\n env: ctx.env,\n groups: ctx.groups,\n privacyConfig: this._privacyConfig,\n });\n }\n }\n}\n\nfunction _isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return (\n value != null &&\n typeof (value as Record<symbol, unknown>)[Symbol.asyncIterator] ===\n 'function'\n );\n}\n\nexport function extractAnthropicSystemPrompt(\n system: unknown,\n): string | undefined {\n if (typeof system === 'string') return system;\n if (Array.isArray(system)) {\n return system\n .map((block) => {\n if (typeof block === 'string') return block;\n if (typeof block === 'object' && block != null) {\n return String((block as Record<string, unknown>).text ?? '');\n }\n return '';\n })\n .filter(Boolean)\n .join('\\n');\n }\n return undefined;\n}\n\nexport function extractAnthropicContent(\n content: Array<Record<string, unknown>> | undefined,\n): {\n text: string;\n reasoning: string | undefined;\n toolCalls: Array<Record<string, unknown>>;\n} {\n let text = '';\n let reasoning: string | undefined;\n const toolCalls: Array<Record<string, unknown>> = [];\n\n if (!content) return { text, reasoning, toolCalls };\n\n for (const block of content) {\n if (block.type === 'text') {\n text += String(block.text ?? '');\n } else if (block.type === 'thinking') {\n reasoning = String(block.thinking ?? '');\n } else if (block.type === 'tool_use') {\n toolCalls.push({\n type: 'function',\n id: block.id,\n function: {\n name: String(block.name ?? ''),\n arguments:\n typeof block.input === 'string'\n ? block.input\n : JSON.stringify(block.input ?? {}),\n },\n });\n }\n }\n\n return { text, reasoning, toolCalls };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"anthropic.js","names":["_AnthropicModule: Record<string, unknown> | null","clientOpts: Record<string, unknown>","costUsd: number | null","reasoning: string | undefined","toolCalls: Array<Record<string, unknown>>"],"sources":["../../src/providers/anthropic.ts"],"sourcesContent":["/**\n * Anthropic provider wrapper with automatic tracking.\n */\n\nimport type { PrivacyConfig } from '../core/privacy.js';\nimport { trackUserMessage } from '../core/tracking.js';\nimport { getDefaultPropagateContext, injectContext } from '../propagation.js';\nimport type {\n AmplitudeLike,\n AmplitudeOrAI,\n AnthropicResponse,\n TrackFn,\n} from '../types.js';\nimport { calculateCost } from '../utils/costs.js';\nimport { tryRequire } from '../utils/resolve-module.js';\nimport { StreamingAccumulator } from '../utils/streaming.js';\nimport {\n applySessionContext,\n BaseAIProvider,\n contextFields,\n type ProviderTrackOptions,\n} from './base.js';\n\nconst _resolved = tryRequire('@anthropic-ai/sdk');\nexport const ANTHROPIC_AVAILABLE = _resolved != null;\nconst _AnthropicModule: Record<string, unknown> | null = _resolved;\n\nexport { _AnthropicModule };\n\nexport interface AnthropicOptions {\n amplitude: AmplitudeOrAI;\n apiKey?: string;\n privacyConfig?: PrivacyConfig | null;\n propagateContext?: boolean;\n /** Pass the `@anthropic-ai/sdk` module directly to bypass `tryRequire` (required in bundler environments). */\n anthropicModule?: unknown;\n}\n\nexport class Anthropic<\n TClient extends Record<string, unknown> = Record<string, unknown>,\n> extends BaseAIProvider {\n private _client: TClient;\n readonly messages: WrappedMessages;\n private _propagateContext: boolean;\n\n constructor(options: AnthropicOptions) {\n super({\n amplitude: options.amplitude,\n privacyConfig: options.privacyConfig,\n providerName: 'anthropic',\n });\n\n const mod =\n (options.anthropicModule as Record<string, unknown> | null) ??\n _AnthropicModule;\n if (mod == null) {\n throw new Error(\n '@anthropic-ai/sdk package is required. Install it with: npm install @anthropic-ai/sdk — or pass the module directly via the anthropicModule option.',\n );\n }\n\n const AnthropicSDK = mod.Anthropic as new (\n opts: Record<string, unknown>,\n ) => unknown;\n\n const clientOpts: Record<string, unknown> = {};\n if (options.apiKey) clientOpts.apiKey = options.apiKey;\n\n this._client = new AnthropicSDK(clientOpts) as TClient;\n this._propagateContext =\n options.propagateContext ?? getDefaultPropagateContext();\n this.messages = new WrappedMessages(\n this._client,\n this.trackFn(),\n this._amplitude,\n this._privacyConfig,\n this._propagateContext,\n );\n }\n\n get client(): TClient {\n return this._client;\n }\n}\n\nexport class WrappedMessages {\n _original: Record<string, unknown>;\n private _trackFn: TrackFn;\n private _amplitude: AmplitudeLike;\n private _privacyConfig: PrivacyConfig | null;\n private _propagateContext: boolean;\n\n constructor(\n client: unknown,\n trackFn: TrackFn,\n amplitude: AmplitudeLike,\n privacyConfig: PrivacyConfig | null,\n propagateContext: boolean,\n ) {\n const clientObj = client as Record<string, unknown>;\n this._original = clientObj.messages as Record<string, unknown>;\n this._trackFn =\n typeof trackFn === 'function'\n ? trackFn\n : (trackFn as unknown as { trackFn(): TrackFn }).trackFn();\n this._amplitude = amplitude;\n this._privacyConfig = privacyConfig;\n this._propagateContext = propagateContext;\n }\n\n async create(\n params: Record<string, unknown>,\n amplitudeOverrides?: ProviderTrackOptions,\n ): Promise<AnthropicResponse | AsyncIterable<unknown>> {\n const createFn = this._original.create as (\n ...args: unknown[]\n ) => Promise<unknown>;\n const startTime = performance.now();\n const requestParams = this._withContextHeaders(params);\n const ctx = applySessionContext(amplitudeOverrides);\n\n try {\n this._trackInputMessages(\n requestParams.messages as unknown,\n ctx,\n amplitudeOverrides?.trackInputMessages ?? true,\n );\n const response = await createFn.call(this._original, requestParams);\n\n if (requestParams.stream === true && _isAsyncIterable(response)) {\n return this._wrapStream(\n response as AsyncIterable<unknown>,\n requestParams,\n startTime,\n ctx,\n );\n }\n\n const latencyMs = performance.now() - startTime;\n\n const resp = response as AnthropicResponse;\n const usage = resp.usage;\n const extracted = extractAnthropicContent(\n resp.content as unknown as Array<Record<string, unknown>> | undefined,\n );\n const firstTextBlock = resp.content?.find((b) => b.type === 'text');\n const modelName = String(resp.model ?? requestParams.model ?? 'unknown');\n\n const cacheRead = usage?.cache_read_input_tokens ?? 0;\n const cacheCreation = usage?.cache_creation_input_tokens ?? 0;\n const rawInput = usage?.input_tokens ?? 0;\n const normalizedInput =\n cacheRead || cacheCreation\n ? rawInput + cacheRead + cacheCreation\n : rawInput;\n\n let costUsd: number | null = null;\n if (usage?.input_tokens != null && usage?.output_tokens != null) {\n try {\n costUsd = calculateCost({\n modelName,\n inputTokens: normalizedInput,\n outputTokens: usage.output_tokens,\n cacheReadInputTokens: cacheRead,\n cacheCreationInputTokens: cacheCreation,\n defaultProvider: 'anthropic',\n });\n } catch {\n // cost calculation is best-effort\n }\n }\n\n this._trackFn({\n ...contextFields(ctx),\n modelName,\n provider: 'anthropic',\n responseContent: String(firstTextBlock?.text ?? ''),\n reasoningContent: extracted.reasoning,\n latencyMs,\n inputTokens: normalizedInput || undefined,\n outputTokens: usage?.output_tokens,\n cacheReadInputTokens: cacheRead || undefined,\n cacheCreationInputTokens: cacheCreation || undefined,\n totalCostUsd: costUsd,\n finishReason: resp.stop_reason,\n toolCalls:\n extracted.toolCalls.length > 0 ? extracted.toolCalls : undefined,\n isStreaming: false,\n systemPrompt: extractAnthropicSystemPrompt(requestParams.system),\n temperature: requestParams.temperature as number | undefined,\n maxOutputTokens: requestParams.max_tokens as number | undefined,\n topP: requestParams.top_p as number | undefined,\n });\n\n return response as AnthropicResponse;\n } catch (error) {\n const latencyMs = performance.now() - startTime;\n this._trackFn({\n ...contextFields(ctx),\n modelName: String(requestParams.model ?? 'unknown'),\n provider: 'anthropic',\n responseContent: '',\n latencyMs,\n isError: true,\n errorMessage: error instanceof Error ? error.message : String(error),\n });\n\n throw error;\n }\n }\n\n private async *_wrapStream(\n stream: AsyncIterable<unknown>,\n params: Record<string, unknown>,\n _startTime: number,\n sessionCtx: ProviderTrackOptions,\n ): AsyncGenerator<unknown> {\n const accumulator = new StreamingAccumulator();\n accumulator.model = String(params.model ?? 'unknown');\n let reasoningContent = '';\n\n try {\n for await (const event of stream) {\n const evt = event as Record<string, unknown>;\n const type = evt.type as string | undefined;\n\n if (type === 'content_block_delta') {\n const delta = evt.delta as Record<string, unknown> | undefined;\n if (delta?.type === 'text_delta' && delta.text != null) {\n accumulator.addContent(String(delta.text));\n } else if (\n delta?.type === 'thinking_delta' &&\n delta.thinking != null\n ) {\n reasoningContent += String(delta.thinking);\n }\n } else if (type === 'content_block_start') {\n const block = evt.content_block as\n | Record<string, unknown>\n | undefined;\n if (block?.type === 'tool_use') {\n accumulator.addToolCall({\n type: 'function',\n id: block.id,\n function: {\n name: String(block.name ?? ''),\n arguments:\n typeof block.input === 'string'\n ? block.input\n : JSON.stringify(block.input ?? {}),\n },\n });\n }\n } else if (type === 'message_delta') {\n const delta = evt.delta as Record<string, unknown> | undefined;\n if (delta?.stop_reason != null) {\n accumulator.finishReason = String(delta.stop_reason);\n }\n const usage = evt.usage as Record<string, number> | undefined;\n if (usage != null) {\n accumulator.setUsage({\n outputTokens: usage.output_tokens,\n });\n }\n } else if (type === 'message_start') {\n const message = evt.message as Record<string, unknown> | undefined;\n if (message?.model != null) {\n accumulator.model = String(message.model);\n }\n const usage = message?.usage as Record<string, number> | undefined;\n if (usage != null) {\n accumulator.setUsage({\n inputTokens: usage.input_tokens,\n cacheReadTokens: usage.cache_read_input_tokens,\n cacheCreationTokens: usage.cache_creation_input_tokens,\n });\n }\n }\n\n yield event;\n }\n } catch (error) {\n accumulator.setError(\n error instanceof Error ? error.message : String(error),\n );\n throw error;\n } finally {\n const state = accumulator.getState();\n const modelName = String(accumulator.model ?? params.model ?? 'unknown');\n\n const streamCacheRead = state.cacheReadTokens ?? 0;\n const streamCacheCreation = state.cacheCreationTokens ?? 0;\n const streamRawInput = state.inputTokens ?? 0;\n const streamNormalizedInput =\n streamCacheRead || streamCacheCreation\n ? streamRawInput + streamCacheRead + streamCacheCreation\n : streamRawInput;\n\n let costUsd: number | null = null;\n if (state.inputTokens != null && state.outputTokens != null) {\n try {\n costUsd = calculateCost({\n modelName,\n inputTokens: streamNormalizedInput,\n outputTokens: state.outputTokens,\n cacheReadInputTokens: streamCacheRead,\n cacheCreationInputTokens: streamCacheCreation,\n defaultProvider: 'anthropic',\n });\n } catch {\n // cost calculation is best-effort\n }\n }\n\n this._trackFn({\n ...contextFields(sessionCtx),\n modelName,\n provider: 'anthropic',\n responseContent: state.content,\n latencyMs: accumulator.elapsedMs,\n inputTokens: streamNormalizedInput || undefined,\n outputTokens: state.outputTokens,\n cacheReadInputTokens: streamCacheRead || undefined,\n cacheCreationInputTokens: streamCacheCreation || undefined,\n totalCostUsd: costUsd,\n finishReason: state.finishReason,\n toolCalls: state.toolCalls.length > 0 ? state.toolCalls : undefined,\n providerTtfbMs: state.ttfbMs,\n isStreaming: true,\n isError: state.isError,\n errorMessage: state.errorMessage,\n reasoningContent: reasoningContent || undefined,\n systemPrompt: extractAnthropicSystemPrompt(params.system),\n temperature: params.temperature as number | undefined,\n maxOutputTokens: params.max_tokens as number | undefined,\n topP: params.top_p as number | undefined,\n });\n }\n }\n\n private _withContextHeaders(\n params: Record<string, unknown>,\n ): Record<string, unknown> {\n if (!this._propagateContext) return params;\n const existing = (params.extra_headers ?? params.headers) as\n | Record<string, string>\n | undefined;\n const injected = injectContext(existing);\n return {\n ...params,\n extra_headers: injected,\n };\n }\n\n private _trackInputMessages(\n messages: unknown,\n ctx: ProviderTrackOptions,\n shouldTrackInputMessages: boolean,\n ): void {\n if (!shouldTrackInputMessages) return;\n if (ctx.userId == null || ctx.sessionId == null) return;\n if (!Array.isArray(messages)) return;\n for (const msg of messages) {\n const role = (msg as Record<string, unknown>)?.role;\n if (role !== 'user') continue;\n const rawContent = (msg as Record<string, unknown>)?.content;\n const content = Array.isArray(rawContent)\n ? rawContent\n .map((part) => {\n if (typeof part === 'string') return part;\n const text = (part as Record<string, unknown>)?.text;\n return typeof text === 'string' ? text : '';\n })\n .join('')\n : typeof rawContent === 'string'\n ? rawContent\n : '';\n if (!content) continue;\n trackUserMessage({\n amplitude: this._amplitude,\n userId: ctx.userId,\n messageContent: content,\n sessionId: ctx.sessionId,\n traceId: ctx.traceId,\n turnId: ctx.turnId ?? undefined,\n agentId: ctx.agentId,\n parentAgentId: ctx.parentAgentId,\n customerOrgId: ctx.customerOrgId,\n agentVersion: ctx.agentVersion,\n context: ctx.context,\n env: ctx.env,\n groups: ctx.groups,\n eventProperties: ctx.eventProperties,\n privacyConfig: this._privacyConfig,\n });\n }\n }\n}\n\nfunction _isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return (\n value != null &&\n typeof (value as Record<symbol, unknown>)[Symbol.asyncIterator] ===\n 'function'\n );\n}\n\nexport function extractAnthropicSystemPrompt(\n system: unknown,\n): string | undefined {\n if (typeof system === 'string') return system;\n if (Array.isArray(system)) {\n return system\n .map((block) => {\n if (typeof block === 'string') return block;\n if (typeof block === 'object' && block != null) {\n return String((block as Record<string, unknown>).text ?? '');\n }\n return '';\n })\n .filter(Boolean)\n .join('\\n');\n }\n return undefined;\n}\n\nexport function extractAnthropicContent(\n content: Array<Record<string, unknown>> | undefined,\n): {\n text: string;\n reasoning: string | undefined;\n toolCalls: Array<Record<string, unknown>>;\n} {\n let text = '';\n let reasoning: string | undefined;\n const toolCalls: Array<Record<string, unknown>> = [];\n\n if (!content) return { text, reasoning, toolCalls };\n\n for (const block of content) {\n if (block.type === 'text') {\n text += String(block.text ?? '');\n } else if (block.type === 'thinking') {\n reasoning = String(block.thinking ?? '');\n } else if (block.type === 'tool_use') {\n toolCalls.push({\n type: 'function',\n id: block.id,\n function: {\n name: String(block.name ?? ''),\n arguments:\n typeof block.input === 'string'\n ? block.input\n : JSON.stringify(block.input ?? {}),\n },\n });\n }\n }\n\n return { text, reasoning, toolCalls };\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bedrock.d.ts","names":[],"sources":["../../src/providers/bedrock.ts"],"sourcesContent":[],"mappings":";;;;;;AA2Ba,cAbA,iBAaQ,EAAA,OAAA;cAZf,cAgBiB,EAhBD,MAgBC,CAAA,MAAA,EAAA,OAAA,CAAA,GAAA,IAAA;AAY4B,UAxBlC,cAAA,CAwBkC;
|
|
1
|
+
{"version":3,"file":"bedrock.d.ts","names":[],"sources":["../../src/providers/bedrock.ts"],"sourcesContent":[],"mappings":";;;;;;AA2Ba,cAbA,iBAaQ,EAAA,OAAA;cAZf,cAgBiB,EAhBD,MAgBC,CAAA,MAAA,EAAA,OAAA,CAAA,GAAA,IAAA;AAY4B,UAxBlC,cAAA,CAwBkC;EAgFpB,SAAA,EAvGlB,aAuGkB;EAA0B,MAAA,EAAA,OAAA;EAhG5B,aAAA,CAAA,EALX,aAKW,GAAA,IAAA;EAAc;EAmQ3B,aAAA,CAAA,EAAA,OAAA;;cAnQH,OAAA,SAAgB,cAAA;;;uBAIN;mBAYE,0BAA0B;yBAgFpB,0BAA0B;;;;iBAmKzC,sBAAA;;;;;;;;aAQH,MAAM"}
|
|
@@ -37,7 +37,8 @@ var Bedrock = class extends BaseAIProvider {
|
|
|
37
37
|
inputTokens: extracted.inputTokens,
|
|
38
38
|
outputTokens: extracted.outputTokens,
|
|
39
39
|
cacheReadInputTokens: extracted.cacheReadTokens ?? 0,
|
|
40
|
-
cacheCreationInputTokens: extracted.cacheWriteTokens ?? 0
|
|
40
|
+
cacheCreationInputTokens: extracted.cacheWriteTokens ?? 0,
|
|
41
|
+
defaultProvider: "bedrock"
|
|
41
42
|
});
|
|
42
43
|
} catch {}
|
|
43
44
|
const ctx = applySessionContext();
|
|
@@ -146,7 +147,8 @@ var Bedrock = class extends BaseAIProvider {
|
|
|
146
147
|
inputTokens: state.inputTokens,
|
|
147
148
|
outputTokens: state.outputTokens,
|
|
148
149
|
cacheReadInputTokens: state.cacheReadTokens ?? 0,
|
|
149
|
-
cacheCreationInputTokens: state.cacheCreationTokens ?? 0
|
|
150
|
+
cacheCreationInputTokens: state.cacheCreationTokens ?? 0,
|
|
151
|
+
defaultProvider: "bedrock"
|
|
150
152
|
});
|
|
151
153
|
} catch {}
|
|
152
154
|
this._track({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bedrock.js","names":["_BedrockModule: Record<string, unknown> | null","costUsd: number | null"],"sources":["../../src/providers/bedrock.ts"],"sourcesContent":["/**\n * AWS Bedrock provider wrapper with automatic tracking.\n *\n * Wraps the AWS SDK BedrockRuntimeClient's converse command.\n */\n\nimport type { PrivacyConfig } from '../core/privacy.js';\nimport type { AmplitudeOrAI, BedrockConverseResponse } from '../types.js';\nimport { calculateCost } from '../utils/costs.js';\nimport { tryRequire } from '../utils/resolve-module.js';\nimport { StreamingAccumulator } from '../utils/streaming.js';\nimport { applySessionContext, BaseAIProvider, contextFields } from './base.js';\n\nconst _resolved = tryRequire('@aws-sdk/client-bedrock-runtime');\nexport const BEDROCK_AVAILABLE = _resolved != null;\nconst _BedrockModule: Record<string, unknown> | null = _resolved;\n\nexport { _BedrockModule };\n\nexport interface BedrockOptions {\n amplitude: AmplitudeOrAI;\n client: unknown;\n privacyConfig?: PrivacyConfig | null;\n /** Pass the `@aws-sdk/client-bedrock-runtime` module directly to bypass `tryRequire` (required in bundler environments). */\n bedrockModule?: unknown;\n}\n\nexport class Bedrock extends BaseAIProvider {\n private _client: unknown;\n private _bedrockMod: Record<string, unknown> | null;\n\n constructor(options: BedrockOptions) {\n super({\n amplitude: options.amplitude,\n privacyConfig: options.privacyConfig,\n providerName: 'bedrock',\n });\n this._client = options.client;\n this._bedrockMod =\n (options.bedrockModule as Record<string, unknown> | null) ??\n _BedrockModule;\n }\n\n async converse(params: Record<string, unknown>): Promise<unknown> {\n const client = this._client as {\n send: (command: unknown) => Promise<unknown>;\n };\n const modelId = String(params.modelId ?? 'unknown');\n\n if (this._bedrockMod == null) {\n throw new Error(\n '@aws-sdk/client-bedrock-runtime is required. Install it with: npm install @aws-sdk/client-bedrock-runtime — or pass the module directly via the bedrockModule option.',\n );\n }\n\n const ConverseCommand = this._bedrockMod.ConverseCommand as new (\n opts: Record<string, unknown>,\n ) => unknown;\n\n const command = new ConverseCommand(params);\n const startTime = performance.now();\n\n try {\n const response = await client.send(command);\n const latencyMs = performance.now() - startTime;\n\n const extracted = extractBedrockResponse(response);\n let costUsd: number | null = null;\n if (extracted.inputTokens != null && extracted.outputTokens != null) {\n try {\n costUsd = calculateCost({\n modelName: modelId,\n inputTokens: extracted.inputTokens,\n outputTokens: extracted.outputTokens,\n cacheReadInputTokens: extracted.cacheReadTokens ?? 0,\n cacheCreationInputTokens: extracted.cacheWriteTokens ?? 0,\n });\n } catch {\n // cost calculation is best-effort\n }\n }\n\n const ctx = applySessionContext();\n this._track({\n ...contextFields(ctx),\n modelName: modelId,\n provider: 'bedrock',\n responseContent: extracted.text,\n latencyMs,\n inputTokens: extracted.inputTokens,\n outputTokens: extracted.outputTokens,\n totalTokens: extracted.totalTokens,\n totalCostUsd: costUsd,\n finishReason: extracted.stopReason,\n toolCalls:\n extracted.toolCalls.length > 0 ? extracted.toolCalls : undefined,\n systemPrompt: extracted.systemPrompt,\n temperature: extracted.temperature,\n topP: extracted.topP,\n maxOutputTokens: extracted.maxOutputTokens,\n isStreaming: false,\n });\n\n return response;\n } catch (error) {\n const latencyMs = performance.now() - startTime;\n const ctx = applySessionContext();\n\n this._track({\n ...contextFields(ctx),\n modelName: modelId,\n provider: 'bedrock',\n responseContent: '',\n latencyMs,\n isError: true,\n errorMessage: error instanceof Error ? error.message : String(error),\n });\n\n throw error;\n }\n }\n\n async converseStream(params: Record<string, unknown>): Promise<unknown> {\n const modelId = String(params.modelId ?? 'unknown');\n const ctx = applySessionContext();\n const startTime = performance.now();\n try {\n const client = this._client as {\n send: (command: unknown) => Promise<unknown>;\n };\n if (this._bedrockMod == null) {\n throw new Error(\n '@aws-sdk/client-bedrock-runtime is required. Install it with: npm install @aws-sdk/client-bedrock-runtime — or pass the module directly via the bedrockModule option.',\n );\n }\n\n const ConverseStreamCommand = this._bedrockMod.ConverseStreamCommand as\n | (new (opts: Record<string, unknown>) => unknown)\n | undefined;\n if (ConverseStreamCommand == null) {\n throw new Error('Bedrock SDK does not expose ConverseStreamCommand');\n }\n\n const command = new ConverseStreamCommand(params);\n const response = (await client.send(command)) as Record<string, unknown>;\n const stream = response.stream as AsyncIterable<unknown> | undefined;\n if (!_isAsyncIterable(stream)) {\n throw new Error('Bedrock stream response is not AsyncIterable');\n }\n\n return {\n ...response,\n stream: this._wrapConverseStream(modelId, params, stream, ctx),\n };\n } catch (error) {\n this._track({\n ...contextFields(ctx),\n modelName: modelId,\n provider: 'bedrock',\n responseContent: '',\n latencyMs: performance.now() - startTime,\n isError: true,\n errorMessage: error instanceof Error ? error.message : String(error),\n isStreaming: true,\n });\n throw error;\n }\n }\n\n get client(): unknown {\n return this._client;\n }\n\n private async *_wrapConverseStream(\n modelId: string,\n params: Record<string, unknown>,\n stream: AsyncIterable<unknown>,\n ctx: ReturnType<typeof applySessionContext>,\n ): AsyncGenerator<unknown> {\n const accumulator = new StreamingAccumulator();\n accumulator.model = modelId;\n\n try {\n for await (const rawEvent of stream) {\n const event = rawEvent as Record<string, unknown>;\n const contentBlockDelta = event.contentBlockDelta as\n | Record<string, unknown>\n | undefined;\n const delta = contentBlockDelta?.delta as\n | Record<string, unknown>\n | undefined;\n if (delta?.text != null) {\n accumulator.addContent(String(delta.text));\n }\n\n const contentBlockStart = event.contentBlockStart as\n | Record<string, unknown>\n | undefined;\n const start = contentBlockStart?.start as\n | Record<string, unknown>\n | undefined;\n if (start?.toolUse != null) {\n accumulator.addToolCall(start.toolUse as Record<string, unknown>);\n }\n\n const messageStart = event.messageStart as\n | Record<string, unknown>\n | undefined;\n if (messageStart?.model != null) {\n accumulator.model = String(messageStart.model);\n }\n\n const messageStop = event.messageStop as\n | Record<string, unknown>\n | undefined;\n if (messageStop?.stopReason != null) {\n accumulator.finishReason = String(messageStop.stopReason);\n }\n\n const metadata = event.metadata as Record<string, unknown> | undefined;\n const usage = metadata?.usage as Record<string, unknown> | undefined;\n accumulator.setUsage({\n inputTokens: usage?.inputTokens as number | undefined,\n outputTokens: usage?.outputTokens as number | undefined,\n totalTokens: usage?.totalTokens as number | undefined,\n cacheReadTokens: usage?.cacheReadInputTokens as number | undefined,\n cacheCreationTokens: usage?.cacheWriteInputTokens as number | undefined,\n });\n\n yield rawEvent;\n }\n } catch (error) {\n accumulator.setError(\n error instanceof Error ? error.message : String(error),\n );\n throw error;\n } finally {\n const state = accumulator.getState();\n const modelName = String(accumulator.model ?? modelId);\n let costUsd: number | null = null;\n if (state.inputTokens != null && state.outputTokens != null) {\n try {\n costUsd = calculateCost({\n modelName,\n inputTokens: state.inputTokens,\n outputTokens: state.outputTokens,\n cacheReadInputTokens: state.cacheReadTokens ?? 0,\n cacheCreationInputTokens: state.cacheCreationTokens ?? 0,\n });\n } catch {\n // cost calculation is best-effort\n }\n }\n\n this._track({\n ...contextFields(ctx),\n modelName,\n provider: 'bedrock',\n responseContent: state.content,\n latencyMs: accumulator.elapsedMs,\n inputTokens: state.inputTokens,\n outputTokens: state.outputTokens,\n totalTokens: state.totalTokens,\n totalCostUsd: costUsd,\n finishReason: state.finishReason,\n toolCalls: state.toolCalls.length > 0 ? state.toolCalls : undefined,\n systemPrompt: extractSystemPromptFromParams(params),\n temperature: (\n params.inferenceConfig as Record<string, unknown> | undefined\n )?.temperature as number | undefined,\n topP: (params.inferenceConfig as Record<string, unknown> | undefined)\n ?.topP as number | undefined,\n maxOutputTokens: (\n params.inferenceConfig as Record<string, unknown> | undefined\n )?.maxTokens as number | undefined,\n providerTtfbMs: state.ttfbMs,\n isStreaming: true,\n isError: state.isError,\n errorMessage: state.errorMessage,\n });\n }\n }\n}\n\nexport function extractBedrockResponse(response: unknown): {\n text: string;\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n cacheReadTokens?: number;\n cacheWriteTokens?: number;\n stopReason?: string;\n toolCalls: Array<Record<string, unknown>>;\n systemPrompt?: string;\n temperature?: number;\n topP?: number;\n maxOutputTokens?: number;\n} {\n const resp = response as BedrockConverseResponse;\n const content = resp.output?.message?.content;\n const textBlock = content?.find(\n (b) => (b as Record<string, unknown>).text != null,\n ) as { text?: string } | undefined;\n const toolCalls = content\n ?.filter((b) => (b as Record<string, unknown>).toolUse != null)\n .map(\n (b) => (b as Record<string, unknown>).toolUse as Record<string, unknown>,\n );\n const usage = resp.usage;\n const respAny = resp as Record<string, unknown>;\n const metrics = respAny.metrics as Record<string, unknown> | undefined;\n const additionalModelResponseFields =\n respAny.additionalModelResponseFields as\n | Record<string, unknown>\n | undefined;\n const inferenceConfig = respAny.inferenceConfig as\n | Record<string, unknown>\n | undefined;\n const system = respAny.system as Array<Record<string, unknown>> | undefined;\n const systemPrompt =\n Array.isArray(system) && system.length > 0\n ? system\n .map((s) => String((s as Record<string, unknown>).text ?? ''))\n .join('')\n : undefined;\n\n return {\n text: String(textBlock?.text ?? ''),\n inputTokens: usage?.inputTokens,\n outputTokens: usage?.outputTokens,\n totalTokens: usage?.totalTokens,\n cacheReadTokens: (usage as Record<string, unknown> | undefined)\n ?.cacheReadInputTokens as number | undefined,\n cacheWriteTokens: (usage as Record<string, unknown> | undefined)\n ?.cacheWriteInputTokens as number | undefined,\n stopReason: resp.stopReason,\n toolCalls: toolCalls ?? [],\n systemPrompt,\n temperature:\n (inferenceConfig?.temperature as number | undefined) ??\n (additionalModelResponseFields?.temperature as number | undefined),\n topP:\n (inferenceConfig?.topP as number | undefined) ??\n (additionalModelResponseFields?.topP as number | undefined),\n maxOutputTokens:\n (inferenceConfig?.maxTokens as number | undefined) ??\n (metrics?.maxOutputTokens as number | undefined),\n };\n}\n\nfunction extractSystemPromptFromParams(\n params: Record<string, unknown>,\n): string | undefined {\n const system = params.system as Array<Record<string, unknown>> | undefined;\n if (!Array.isArray(system) || system.length === 0) return undefined;\n return system.map((s) => String(s.text ?? '')).join('');\n}\n\nfunction _isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return (\n value != null &&\n typeof (value as Record<symbol, unknown>)[Symbol.asyncIterator] ===\n 'function'\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bedrock.js","names":["_BedrockModule: Record<string, unknown> | null","costUsd: number | null"],"sources":["../../src/providers/bedrock.ts"],"sourcesContent":["/**\n * AWS Bedrock provider wrapper with automatic tracking.\n *\n * Wraps the AWS SDK BedrockRuntimeClient's converse command.\n */\n\nimport type { PrivacyConfig } from '../core/privacy.js';\nimport type { AmplitudeOrAI, BedrockConverseResponse } from '../types.js';\nimport { calculateCost } from '../utils/costs.js';\nimport { tryRequire } from '../utils/resolve-module.js';\nimport { StreamingAccumulator } from '../utils/streaming.js';\nimport { applySessionContext, BaseAIProvider, contextFields } from './base.js';\n\nconst _resolved = tryRequire('@aws-sdk/client-bedrock-runtime');\nexport const BEDROCK_AVAILABLE = _resolved != null;\nconst _BedrockModule: Record<string, unknown> | null = _resolved;\n\nexport { _BedrockModule };\n\nexport interface BedrockOptions {\n amplitude: AmplitudeOrAI;\n client: unknown;\n privacyConfig?: PrivacyConfig | null;\n /** Pass the `@aws-sdk/client-bedrock-runtime` module directly to bypass `tryRequire` (required in bundler environments). */\n bedrockModule?: unknown;\n}\n\nexport class Bedrock extends BaseAIProvider {\n private _client: unknown;\n private _bedrockMod: Record<string, unknown> | null;\n\n constructor(options: BedrockOptions) {\n super({\n amplitude: options.amplitude,\n privacyConfig: options.privacyConfig,\n providerName: 'bedrock',\n });\n this._client = options.client;\n this._bedrockMod =\n (options.bedrockModule as Record<string, unknown> | null) ??\n _BedrockModule;\n }\n\n async converse(params: Record<string, unknown>): Promise<unknown> {\n const client = this._client as {\n send: (command: unknown) => Promise<unknown>;\n };\n const modelId = String(params.modelId ?? 'unknown');\n\n if (this._bedrockMod == null) {\n throw new Error(\n '@aws-sdk/client-bedrock-runtime is required. Install it with: npm install @aws-sdk/client-bedrock-runtime — or pass the module directly via the bedrockModule option.',\n );\n }\n\n const ConverseCommand = this._bedrockMod.ConverseCommand as new (\n opts: Record<string, unknown>,\n ) => unknown;\n\n const command = new ConverseCommand(params);\n const startTime = performance.now();\n\n try {\n const response = await client.send(command);\n const latencyMs = performance.now() - startTime;\n\n const extracted = extractBedrockResponse(response);\n let costUsd: number | null = null;\n if (extracted.inputTokens != null && extracted.outputTokens != null) {\n try {\n costUsd = calculateCost({\n modelName: modelId,\n inputTokens: extracted.inputTokens,\n outputTokens: extracted.outputTokens,\n cacheReadInputTokens: extracted.cacheReadTokens ?? 0,\n cacheCreationInputTokens: extracted.cacheWriteTokens ?? 0,\n defaultProvider: 'bedrock',\n });\n } catch {\n // cost calculation is best-effort\n }\n }\n\n const ctx = applySessionContext();\n this._track({\n ...contextFields(ctx),\n modelName: modelId,\n provider: 'bedrock',\n responseContent: extracted.text,\n latencyMs,\n inputTokens: extracted.inputTokens,\n outputTokens: extracted.outputTokens,\n totalTokens: extracted.totalTokens,\n totalCostUsd: costUsd,\n finishReason: extracted.stopReason,\n toolCalls:\n extracted.toolCalls.length > 0 ? extracted.toolCalls : undefined,\n systemPrompt: extracted.systemPrompt,\n temperature: extracted.temperature,\n topP: extracted.topP,\n maxOutputTokens: extracted.maxOutputTokens,\n isStreaming: false,\n });\n\n return response;\n } catch (error) {\n const latencyMs = performance.now() - startTime;\n const ctx = applySessionContext();\n\n this._track({\n ...contextFields(ctx),\n modelName: modelId,\n provider: 'bedrock',\n responseContent: '',\n latencyMs,\n isError: true,\n errorMessage: error instanceof Error ? error.message : String(error),\n });\n\n throw error;\n }\n }\n\n async converseStream(params: Record<string, unknown>): Promise<unknown> {\n const modelId = String(params.modelId ?? 'unknown');\n const ctx = applySessionContext();\n const startTime = performance.now();\n try {\n const client = this._client as {\n send: (command: unknown) => Promise<unknown>;\n };\n if (this._bedrockMod == null) {\n throw new Error(\n '@aws-sdk/client-bedrock-runtime is required. Install it with: npm install @aws-sdk/client-bedrock-runtime — or pass the module directly via the bedrockModule option.',\n );\n }\n\n const ConverseStreamCommand = this._bedrockMod.ConverseStreamCommand as\n | (new (opts: Record<string, unknown>) => unknown)\n | undefined;\n if (ConverseStreamCommand == null) {\n throw new Error('Bedrock SDK does not expose ConverseStreamCommand');\n }\n\n const command = new ConverseStreamCommand(params);\n const response = (await client.send(command)) as Record<string, unknown>;\n const stream = response.stream as AsyncIterable<unknown> | undefined;\n if (!_isAsyncIterable(stream)) {\n throw new Error('Bedrock stream response is not AsyncIterable');\n }\n\n return {\n ...response,\n stream: this._wrapConverseStream(modelId, params, stream, ctx),\n };\n } catch (error) {\n this._track({\n ...contextFields(ctx),\n modelName: modelId,\n provider: 'bedrock',\n responseContent: '',\n latencyMs: performance.now() - startTime,\n isError: true,\n errorMessage: error instanceof Error ? error.message : String(error),\n isStreaming: true,\n });\n throw error;\n }\n }\n\n get client(): unknown {\n return this._client;\n }\n\n private async *_wrapConverseStream(\n modelId: string,\n params: Record<string, unknown>,\n stream: AsyncIterable<unknown>,\n ctx: ReturnType<typeof applySessionContext>,\n ): AsyncGenerator<unknown> {\n const accumulator = new StreamingAccumulator();\n accumulator.model = modelId;\n\n try {\n for await (const rawEvent of stream) {\n const event = rawEvent as Record<string, unknown>;\n const contentBlockDelta = event.contentBlockDelta as\n | Record<string, unknown>\n | undefined;\n const delta = contentBlockDelta?.delta as\n | Record<string, unknown>\n | undefined;\n if (delta?.text != null) {\n accumulator.addContent(String(delta.text));\n }\n\n const contentBlockStart = event.contentBlockStart as\n | Record<string, unknown>\n | undefined;\n const start = contentBlockStart?.start as\n | Record<string, unknown>\n | undefined;\n if (start?.toolUse != null) {\n accumulator.addToolCall(start.toolUse as Record<string, unknown>);\n }\n\n const messageStart = event.messageStart as\n | Record<string, unknown>\n | undefined;\n if (messageStart?.model != null) {\n accumulator.model = String(messageStart.model);\n }\n\n const messageStop = event.messageStop as\n | Record<string, unknown>\n | undefined;\n if (messageStop?.stopReason != null) {\n accumulator.finishReason = String(messageStop.stopReason);\n }\n\n const metadata = event.metadata as Record<string, unknown> | undefined;\n const usage = metadata?.usage as Record<string, unknown> | undefined;\n accumulator.setUsage({\n inputTokens: usage?.inputTokens as number | undefined,\n outputTokens: usage?.outputTokens as number | undefined,\n totalTokens: usage?.totalTokens as number | undefined,\n cacheReadTokens: usage?.cacheReadInputTokens as number | undefined,\n cacheCreationTokens: usage?.cacheWriteInputTokens as number | undefined,\n });\n\n yield rawEvent;\n }\n } catch (error) {\n accumulator.setError(\n error instanceof Error ? error.message : String(error),\n );\n throw error;\n } finally {\n const state = accumulator.getState();\n const modelName = String(accumulator.model ?? modelId);\n let costUsd: number | null = null;\n if (state.inputTokens != null && state.outputTokens != null) {\n try {\n costUsd = calculateCost({\n modelName,\n inputTokens: state.inputTokens,\n outputTokens: state.outputTokens,\n cacheReadInputTokens: state.cacheReadTokens ?? 0,\n cacheCreationInputTokens: state.cacheCreationTokens ?? 0,\n defaultProvider: 'bedrock',\n });\n } catch {\n // cost calculation is best-effort\n }\n }\n\n this._track({\n ...contextFields(ctx),\n modelName,\n provider: 'bedrock',\n responseContent: state.content,\n latencyMs: accumulator.elapsedMs,\n inputTokens: state.inputTokens,\n outputTokens: state.outputTokens,\n totalTokens: state.totalTokens,\n totalCostUsd: costUsd,\n finishReason: state.finishReason,\n toolCalls: state.toolCalls.length > 0 ? state.toolCalls : undefined,\n systemPrompt: extractSystemPromptFromParams(params),\n temperature: (\n params.inferenceConfig as Record<string, unknown> | undefined\n )?.temperature as number | undefined,\n topP: (params.inferenceConfig as Record<string, unknown> | undefined)\n ?.topP as number | undefined,\n maxOutputTokens: (\n params.inferenceConfig as Record<string, unknown> | undefined\n )?.maxTokens as number | undefined,\n providerTtfbMs: state.ttfbMs,\n isStreaming: true,\n isError: state.isError,\n errorMessage: state.errorMessage,\n });\n }\n }\n}\n\nexport function extractBedrockResponse(response: unknown): {\n text: string;\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n cacheReadTokens?: number;\n cacheWriteTokens?: number;\n stopReason?: string;\n toolCalls: Array<Record<string, unknown>>;\n systemPrompt?: string;\n temperature?: number;\n topP?: number;\n maxOutputTokens?: number;\n} {\n const resp = response as BedrockConverseResponse;\n const content = resp.output?.message?.content;\n const textBlock = content?.find(\n (b) => (b as Record<string, unknown>).text != null,\n ) as { text?: string } | undefined;\n const toolCalls = content\n ?.filter((b) => (b as Record<string, unknown>).toolUse != null)\n .map(\n (b) => (b as Record<string, unknown>).toolUse as Record<string, unknown>,\n );\n const usage = resp.usage;\n const respAny = resp as Record<string, unknown>;\n const metrics = respAny.metrics as Record<string, unknown> | undefined;\n const additionalModelResponseFields =\n respAny.additionalModelResponseFields as\n | Record<string, unknown>\n | undefined;\n const inferenceConfig = respAny.inferenceConfig as\n | Record<string, unknown>\n | undefined;\n const system = respAny.system as Array<Record<string, unknown>> | undefined;\n const systemPrompt =\n Array.isArray(system) && system.length > 0\n ? system\n .map((s) => String((s as Record<string, unknown>).text ?? ''))\n .join('')\n : undefined;\n\n return {\n text: String(textBlock?.text ?? ''),\n inputTokens: usage?.inputTokens,\n outputTokens: usage?.outputTokens,\n totalTokens: usage?.totalTokens,\n cacheReadTokens: (usage as Record<string, unknown> | undefined)\n ?.cacheReadInputTokens as number | undefined,\n cacheWriteTokens: (usage as Record<string, unknown> | undefined)\n ?.cacheWriteInputTokens as number | undefined,\n stopReason: resp.stopReason,\n toolCalls: toolCalls ?? [],\n systemPrompt,\n temperature:\n (inferenceConfig?.temperature as number | undefined) ??\n (additionalModelResponseFields?.temperature as number | undefined),\n topP:\n (inferenceConfig?.topP as number | undefined) ??\n (additionalModelResponseFields?.topP as number | undefined),\n maxOutputTokens:\n (inferenceConfig?.maxTokens as number | undefined) ??\n (metrics?.maxOutputTokens as number | undefined),\n };\n}\n\nfunction extractSystemPromptFromParams(\n params: Record<string, unknown>,\n): string | undefined {\n const system = params.system as Array<Record<string, unknown>> | undefined;\n if (!Array.isArray(system) || system.length === 0) return undefined;\n return system.map((s) => String(s.text ?? '')).join('');\n}\n\nfunction _isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return (\n value != null &&\n typeof (value as Record<symbol, unknown>)[Symbol.asyncIterator] ===\n 'function'\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gemini.d.ts","names":[],"sources":["../../src/providers/gemini.ts"],"sourcesContent":[],"mappings":";;;;;;AAaM,cADO,gBACQ,EAAA,OAAM;AAI3B,cAJM,aAIwB,EAJT,MAKR,CAAA,MAAA,EAAA,OAEK,CAAA,GAAA,IAAA;AAQK,UAXN,aAAA,CAWM;EAuBX,SAAA,EAjCC,aAiCD;EACP,MAAA,CAAA,EAAA,MAAA;
|
|
1
|
+
{"version":3,"file":"gemini.d.ts","names":[],"sources":["../../src/providers/gemini.ts"],"sourcesContent":[],"mappings":";;;;;;AAaM,cADO,gBACQ,EAAA,OAAM;AAI3B,cAJM,aAIwB,EAJT,MAKR,CAAA,MAAA,EAAA,OAEK,CAAA,GAAA,IAAA;AAQK,UAXN,aAAA,CAWM;EAuBX,SAAA,EAjCC,aAiCD;EACP,MAAA,CAAA,EAAA,MAAA;EA0EO,aAAA,CAAA,EA1GM,aA0GN,GAAA,IAAA;EACP;EAtGuB,YAAA,CAAA,EAAA,OAAA;;AA0PZ,cA1PH,MAAA,SAAe,cAAA,CAgQV;;uBA7PK;yCAuBX,0BACP;+CA0EO,0BACP;;;;iBAoJW,qBAAA;;;;;;kBAME,MAAM"}
|