@amplitude/ai 0.3.4 → 0.3.5

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.
Files changed (45) hide show
  1. package/AGENTS.md +1 -1
  2. package/README.md +176 -172
  3. package/data/agent_event_catalog.json +18 -3
  4. package/dist/client.d.ts +1 -0
  5. package/dist/client.d.ts.map +1 -1
  6. package/dist/client.js +1 -0
  7. package/dist/client.js.map +1 -1
  8. package/dist/core/constants.d.ts +4 -1
  9. package/dist/core/constants.d.ts.map +1 -1
  10. package/dist/core/constants.js +4 -1
  11. package/dist/core/constants.js.map +1 -1
  12. package/dist/core/privacy.d.ts +7 -1
  13. package/dist/core/privacy.d.ts.map +1 -1
  14. package/dist/core/privacy.js +78 -2
  15. package/dist/core/privacy.js.map +1 -1
  16. package/dist/core/tracking.d.ts +3 -2
  17. package/dist/core/tracking.d.ts.map +1 -1
  18. package/dist/core/tracking.js +4 -2
  19. package/dist/core/tracking.js.map +1 -1
  20. package/dist/index.d.ts +3 -3
  21. package/dist/index.js +3 -3
  22. package/dist/providers/anthropic.d.ts.map +1 -1
  23. package/dist/providers/anthropic.js +6 -0
  24. package/dist/providers/anthropic.js.map +1 -1
  25. package/dist/providers/bedrock.d.ts.map +1 -1
  26. package/dist/providers/bedrock.js +8 -0
  27. package/dist/providers/bedrock.js.map +1 -1
  28. package/dist/providers/gemini.d.ts.map +1 -1
  29. package/dist/providers/gemini.js +6 -0
  30. package/dist/providers/gemini.js.map +1 -1
  31. package/dist/providers/mistral.d.ts.map +1 -1
  32. package/dist/providers/mistral.js +6 -0
  33. package/dist/providers/mistral.js.map +1 -1
  34. package/dist/providers/openai.d.ts +2 -1
  35. package/dist/providers/openai.d.ts.map +1 -1
  36. package/dist/providers/openai.js +13 -1
  37. package/dist/providers/openai.js.map +1 -1
  38. package/dist/types.d.ts +1 -0
  39. package/dist/types.d.ts.map +1 -1
  40. package/dist/types.js.map +1 -1
  41. package/dist/utils/logger.d.ts.map +1 -1
  42. package/llms-full.txt +1 -1
  43. package/llms.txt +1 -1
  44. package/mcp.schema.json +1 -1
  45. package/package.json +1 -1
@@ -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 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
+ {"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 toolDefinitions: extractBedrockToolDefinitions(params),\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 toolDefinitions: extractBedrockToolDefinitions(params),\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 extractBedrockToolDefinitions(\n params: Record<string, unknown>,\n): Array<Record<string, unknown>> | undefined {\n const toolConfig = params.toolConfig as Record<string, unknown> | undefined;\n if (toolConfig == null) return undefined;\n const tools = toolConfig.tools;\n return Array.isArray(tools) && tools.length > 0\n ? (tools as Array<Record<string, unknown>>)\n : undefined;\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,EAAM,OAAA;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"}
1
+ {"version":3,"file":"gemini.d.ts","names":[],"sources":["../../src/providers/gemini.ts"],"sourcesContent":[],"mappings":";;;;;;AAaM,cADO,gBACQ,EAAM,OAAA;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;EA2EO,aAAA,CAAA,EA3GM,aA2GN,GAAA,IAAA;EACP;EAvGuB,YAAA,CAAA,EAAA,OAAA;;AA4PZ,cA5PH,MAAA,SAAe,cAAA,CAkQV;;uBA/PK;yCAuBX,0BACP;+CA2EO,0BACP;;;;iBAqJW,qBAAA;;;;;;kBAME,MAAM"}
@@ -50,6 +50,7 @@ var Gemini = class extends BaseAIProvider {
50
50
  totalCostUsd: costUsd,
51
51
  finishReason: extracted.finishReason,
52
52
  toolCalls: extracted.functionCalls?.length ? extracted.functionCalls : void 0,
53
+ toolDefinitions: extractGeminiToolDefinitions(params),
53
54
  systemPrompt: extractGeminiSystemPrompt(params),
54
55
  temperature: extractGeminiTemperature(params),
55
56
  topP: extractGeminiTopP(params),
@@ -155,6 +156,7 @@ var Gemini = class extends BaseAIProvider {
155
156
  totalCostUsd: costUsd,
156
157
  finishReason: state.finishReason,
157
158
  toolCalls: state.toolCalls.length > 0 ? state.toolCalls : void 0,
159
+ toolDefinitions: extractGeminiToolDefinitions(params),
158
160
  systemPrompt: extractGeminiSystemPrompt(params),
159
161
  temperature: extractGeminiTemperature(params),
160
162
  topP: extractGeminiTopP(params),
@@ -199,6 +201,10 @@ function extractGeminiTopP(params) {
199
201
  function extractGeminiMaxOutputTokens(params) {
200
202
  return params.generationConfig?.maxOutputTokens;
201
203
  }
204
+ function extractGeminiToolDefinitions(params) {
205
+ const tools = params.tools;
206
+ return Array.isArray(tools) && tools.length > 0 ? tools : void 0;
207
+ }
202
208
  function _isAsyncIterable(value) {
203
209
  return value != null && typeof value[Symbol.asyncIterator] === "function";
204
210
  }
@@ -1 +1 @@
1
- {"version":3,"file":"gemini.js","names":["_GeminiModule: Record<string, unknown> | null","costUsd: number | null"],"sources":["../../src/providers/gemini.ts"],"sourcesContent":["/**\n * Google Gemini provider wrapper with automatic tracking.\n */\n\nimport type { PrivacyConfig } from '../core/privacy.js';\nimport type { AmplitudeOrAI, GeminiResponse } 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('@google/generative-ai');\nexport const GEMINI_AVAILABLE = _resolved != null;\nconst _GeminiModule: Record<string, unknown> | null = _resolved;\n\nexport { _GeminiModule };\n\nexport interface GeminiOptions {\n amplitude: AmplitudeOrAI;\n apiKey?: string;\n privacyConfig?: PrivacyConfig | null;\n /** Pass the `@google/generative-ai` module directly to bypass `tryRequire` (required in bundler environments). */\n geminiModule?: unknown;\n}\n\nexport class Gemini extends BaseAIProvider {\n private _client: unknown;\n\n constructor(options: GeminiOptions) {\n super({\n amplitude: options.amplitude,\n privacyConfig: options.privacyConfig,\n providerName: 'gemini',\n });\n\n const mod =\n (options.geminiModule as Record<string, unknown> | null) ?? _GeminiModule;\n if (mod == null) {\n throw new Error(\n '@google/generative-ai package is required. Install it with: npm install @google/generative-ai — or pass the module directly via the geminiModule option.',\n );\n }\n\n const GoogleGenAI = mod.GoogleGenerativeAI as new (\n apiKey: string,\n ) => unknown;\n this._client = new GoogleGenAI(options.apiKey ?? '');\n }\n\n async generateContent(\n model: string,\n params: Record<string, unknown>,\n ): Promise<unknown> {\n const clientObj = this._client as Record<string, unknown>;\n const getModel = clientObj.getGenerativeModel as (\n opts: Record<string, unknown>,\n ) => Record<string, unknown>;\n const genModel = getModel.call(this._client, { model });\n const generateFn = genModel.generateContent as (\n ...args: unknown[]\n ) => Promise<unknown>;\n\n const startTime = performance.now();\n\n try {\n const response = await generateFn.call(genModel, params);\n const latencyMs = performance.now() - startTime;\n\n const extracted = extractGeminiResponse(response);\n let costUsd: number | null = null;\n if (extracted.inputTokens != null && extracted.outputTokens != null) {\n try {\n costUsd = calculateCost({\n modelName: model,\n inputTokens: extracted.inputTokens,\n outputTokens: extracted.outputTokens,\n defaultProvider: 'google',\n });\n } catch {\n // cost calculation is best-effort\n }\n }\n\n const ctx = applySessionContext();\n this._track({\n ...contextFields(ctx),\n modelName: model,\n provider: 'gemini',\n responseContent: extracted.text,\n latencyMs,\n inputTokens: extracted.inputTokens,\n outputTokens: extracted.outputTokens,\n totalTokens: extracted.totalTokens,\n totalCostUsd: costUsd,\n finishReason: extracted.finishReason,\n toolCalls: extracted.functionCalls?.length\n ? extracted.functionCalls\n : undefined,\n systemPrompt: extractGeminiSystemPrompt(params),\n temperature: extractGeminiTemperature(params),\n topP: extractGeminiTopP(params),\n maxOutputTokens: extractGeminiMaxOutputTokens(params),\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: model,\n provider: 'gemini',\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 generateContentStream(\n model: string,\n params: Record<string, unknown>,\n ): Promise<unknown> {\n const ctx = applySessionContext();\n const startTime = performance.now();\n try {\n const clientObj = this._client as Record<string, unknown>;\n const getModel = clientObj.getGenerativeModel as (\n opts: Record<string, unknown>,\n ) => Record<string, unknown>;\n const genModel = getModel.call(this._client, { model });\n const streamFn = genModel.generateContentStream as\n | ((...args: unknown[]) => Promise<unknown>)\n | undefined;\n if (typeof streamFn !== 'function') {\n throw new Error('Gemini SDK does not expose generateContentStream');\n }\n\n const response = await streamFn.call(genModel, params);\n const streamResponse = response as Record<string, unknown>;\n const stream = streamResponse.stream as\n | AsyncIterable<unknown>\n | undefined;\n const finalResponse = streamResponse.response as\n | Promise<unknown>\n | undefined;\n\n if (!_isAsyncIterable(stream)) {\n throw new Error('Gemini stream response is not AsyncIterable');\n }\n\n return {\n ...streamResponse,\n stream: this._wrapStream(model, params, stream, finalResponse, ctx),\n };\n } catch (error) {\n this._track({\n ...contextFields(ctx),\n modelName: model,\n provider: 'gemini',\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 *_wrapStream(\n model: string,\n params: Record<string, unknown>,\n stream: AsyncIterable<unknown>,\n finalResponse: Promise<unknown> | undefined,\n ctx: ReturnType<typeof applySessionContext>,\n ): AsyncGenerator<unknown> {\n const accumulator = new StreamingAccumulator();\n\n try {\n for await (const chunk of stream) {\n const extracted = extractGeminiResponse(chunk);\n if (extracted.text) accumulator.addContent(extracted.text);\n if (Array.isArray(extracted.functionCalls)) {\n for (const fc of extracted.functionCalls) accumulator.addToolCall(fc);\n }\n if (extracted.finishReason != null) {\n accumulator.finishReason = String(extracted.finishReason);\n }\n accumulator.setUsage({\n inputTokens: extracted.inputTokens,\n outputTokens: extracted.outputTokens,\n totalTokens: extracted.totalTokens,\n });\n yield chunk;\n }\n } catch (error) {\n accumulator.setError(\n error instanceof Error ? error.message : String(error),\n );\n throw error;\n } finally {\n if (finalResponse != null) {\n try {\n const extractedFinal = extractGeminiResponse(await finalResponse);\n accumulator.setUsage({\n inputTokens: extractedFinal.inputTokens,\n outputTokens: extractedFinal.outputTokens,\n totalTokens: extractedFinal.totalTokens,\n });\n if (extractedFinal.finishReason != null) {\n accumulator.finishReason = String(extractedFinal.finishReason);\n }\n if (\n Array.isArray(extractedFinal.functionCalls) &&\n accumulator.toolCalls.length === 0\n ) {\n for (const fc of extractedFinal.functionCalls) {\n accumulator.addToolCall(fc);\n }\n }\n } catch {\n // best-effort final response extraction\n }\n }\n\n const state = accumulator.getState();\n let costUsd: number | null = null;\n if (state.inputTokens != null && state.outputTokens != null) {\n try {\n costUsd = calculateCost({\n modelName: model,\n inputTokens: state.inputTokens,\n outputTokens: state.outputTokens,\n defaultProvider: 'google',\n });\n } catch {\n // cost calculation is best-effort\n }\n }\n\n this._track({\n ...contextFields(ctx),\n modelName: model,\n provider: 'gemini',\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: extractGeminiSystemPrompt(params),\n temperature: extractGeminiTemperature(params),\n topP: extractGeminiTopP(params),\n maxOutputTokens: extractGeminiMaxOutputTokens(params),\n providerTtfbMs: state.ttfbMs,\n isStreaming: true,\n isError: state.isError,\n errorMessage: state.errorMessage,\n });\n }\n }\n}\n\nexport function extractGeminiResponse(response: unknown): {\n text: string;\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n finishReason?: string;\n functionCalls?: Array<Record<string, unknown>>;\n} {\n const resp = response as GeminiResponse;\n const respObj = resp.response ?? resp;\n let text = '';\n if (typeof respObj.text === 'function') {\n try {\n text = String(respObj.text());\n } catch {\n // text() throws when the response has no candidates (e.g. safety block)\n }\n }\n const usage = respObj.usageMetadata;\n\n const candidate = respObj.candidates?.[0];\n const finishReason = candidate?.finishReason;\n\n const parts = candidate?.content?.parts;\n const functionCalls = parts\n ?.filter((p) => p.functionCall != null)\n .map((p) => p.functionCall as Record<string, unknown>);\n\n return {\n text,\n inputTokens: usage?.promptTokenCount,\n outputTokens: usage?.candidatesTokenCount,\n totalTokens: usage?.totalTokenCount,\n finishReason,\n functionCalls: functionCalls?.length ? functionCalls : undefined,\n };\n}\n\nfunction extractGeminiSystemPrompt(\n params: Record<string, unknown>,\n): string | undefined {\n const systemInstruction =\n (params.systemInstruction as string | undefined) ??\n ((params.generationConfig as Record<string, unknown> | undefined)\n ?.systemInstruction as string | undefined);\n return systemInstruction;\n}\n\nfunction extractGeminiTemperature(\n params: Record<string, unknown>,\n): number | undefined {\n return (params.generationConfig as Record<string, unknown> | undefined)\n ?.temperature as number | undefined;\n}\n\nfunction extractGeminiTopP(\n params: Record<string, unknown>,\n): number | undefined {\n return (params.generationConfig as Record<string, unknown> | undefined)\n ?.topP as number | undefined;\n}\n\nfunction extractGeminiMaxOutputTokens(\n params: Record<string, unknown>,\n): number | undefined {\n return (params.generationConfig as Record<string, unknown> | undefined)\n ?.maxOutputTokens as number | undefined;\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":"gemini.js","names":["_GeminiModule: Record<string, unknown> | null","costUsd: number | null"],"sources":["../../src/providers/gemini.ts"],"sourcesContent":["/**\n * Google Gemini provider wrapper with automatic tracking.\n */\n\nimport type { PrivacyConfig } from '../core/privacy.js';\nimport type { AmplitudeOrAI, GeminiResponse } 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('@google/generative-ai');\nexport const GEMINI_AVAILABLE = _resolved != null;\nconst _GeminiModule: Record<string, unknown> | null = _resolved;\n\nexport { _GeminiModule };\n\nexport interface GeminiOptions {\n amplitude: AmplitudeOrAI;\n apiKey?: string;\n privacyConfig?: PrivacyConfig | null;\n /** Pass the `@google/generative-ai` module directly to bypass `tryRequire` (required in bundler environments). */\n geminiModule?: unknown;\n}\n\nexport class Gemini extends BaseAIProvider {\n private _client: unknown;\n\n constructor(options: GeminiOptions) {\n super({\n amplitude: options.amplitude,\n privacyConfig: options.privacyConfig,\n providerName: 'gemini',\n });\n\n const mod =\n (options.geminiModule as Record<string, unknown> | null) ?? _GeminiModule;\n if (mod == null) {\n throw new Error(\n '@google/generative-ai package is required. Install it with: npm install @google/generative-ai — or pass the module directly via the geminiModule option.',\n );\n }\n\n const GoogleGenAI = mod.GoogleGenerativeAI as new (\n apiKey: string,\n ) => unknown;\n this._client = new GoogleGenAI(options.apiKey ?? '');\n }\n\n async generateContent(\n model: string,\n params: Record<string, unknown>,\n ): Promise<unknown> {\n const clientObj = this._client as Record<string, unknown>;\n const getModel = clientObj.getGenerativeModel as (\n opts: Record<string, unknown>,\n ) => Record<string, unknown>;\n const genModel = getModel.call(this._client, { model });\n const generateFn = genModel.generateContent as (\n ...args: unknown[]\n ) => Promise<unknown>;\n\n const startTime = performance.now();\n\n try {\n const response = await generateFn.call(genModel, params);\n const latencyMs = performance.now() - startTime;\n\n const extracted = extractGeminiResponse(response);\n let costUsd: number | null = null;\n if (extracted.inputTokens != null && extracted.outputTokens != null) {\n try {\n costUsd = calculateCost({\n modelName: model,\n inputTokens: extracted.inputTokens,\n outputTokens: extracted.outputTokens,\n defaultProvider: 'google',\n });\n } catch {\n // cost calculation is best-effort\n }\n }\n\n const ctx = applySessionContext();\n this._track({\n ...contextFields(ctx),\n modelName: model,\n provider: 'gemini',\n responseContent: extracted.text,\n latencyMs,\n inputTokens: extracted.inputTokens,\n outputTokens: extracted.outputTokens,\n totalTokens: extracted.totalTokens,\n totalCostUsd: costUsd,\n finishReason: extracted.finishReason,\n toolCalls: extracted.functionCalls?.length\n ? extracted.functionCalls\n : undefined,\n toolDefinitions: extractGeminiToolDefinitions(params),\n systemPrompt: extractGeminiSystemPrompt(params),\n temperature: extractGeminiTemperature(params),\n topP: extractGeminiTopP(params),\n maxOutputTokens: extractGeminiMaxOutputTokens(params),\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: model,\n provider: 'gemini',\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 generateContentStream(\n model: string,\n params: Record<string, unknown>,\n ): Promise<unknown> {\n const ctx = applySessionContext();\n const startTime = performance.now();\n try {\n const clientObj = this._client as Record<string, unknown>;\n const getModel = clientObj.getGenerativeModel as (\n opts: Record<string, unknown>,\n ) => Record<string, unknown>;\n const genModel = getModel.call(this._client, { model });\n const streamFn = genModel.generateContentStream as\n | ((...args: unknown[]) => Promise<unknown>)\n | undefined;\n if (typeof streamFn !== 'function') {\n throw new Error('Gemini SDK does not expose generateContentStream');\n }\n\n const response = await streamFn.call(genModel, params);\n const streamResponse = response as Record<string, unknown>;\n const stream = streamResponse.stream as\n | AsyncIterable<unknown>\n | undefined;\n const finalResponse = streamResponse.response as\n | Promise<unknown>\n | undefined;\n\n if (!_isAsyncIterable(stream)) {\n throw new Error('Gemini stream response is not AsyncIterable');\n }\n\n return {\n ...streamResponse,\n stream: this._wrapStream(model, params, stream, finalResponse, ctx),\n };\n } catch (error) {\n this._track({\n ...contextFields(ctx),\n modelName: model,\n provider: 'gemini',\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 *_wrapStream(\n model: string,\n params: Record<string, unknown>,\n stream: AsyncIterable<unknown>,\n finalResponse: Promise<unknown> | undefined,\n ctx: ReturnType<typeof applySessionContext>,\n ): AsyncGenerator<unknown> {\n const accumulator = new StreamingAccumulator();\n\n try {\n for await (const chunk of stream) {\n const extracted = extractGeminiResponse(chunk);\n if (extracted.text) accumulator.addContent(extracted.text);\n if (Array.isArray(extracted.functionCalls)) {\n for (const fc of extracted.functionCalls) accumulator.addToolCall(fc);\n }\n if (extracted.finishReason != null) {\n accumulator.finishReason = String(extracted.finishReason);\n }\n accumulator.setUsage({\n inputTokens: extracted.inputTokens,\n outputTokens: extracted.outputTokens,\n totalTokens: extracted.totalTokens,\n });\n yield chunk;\n }\n } catch (error) {\n accumulator.setError(\n error instanceof Error ? error.message : String(error),\n );\n throw error;\n } finally {\n if (finalResponse != null) {\n try {\n const extractedFinal = extractGeminiResponse(await finalResponse);\n accumulator.setUsage({\n inputTokens: extractedFinal.inputTokens,\n outputTokens: extractedFinal.outputTokens,\n totalTokens: extractedFinal.totalTokens,\n });\n if (extractedFinal.finishReason != null) {\n accumulator.finishReason = String(extractedFinal.finishReason);\n }\n if (\n Array.isArray(extractedFinal.functionCalls) &&\n accumulator.toolCalls.length === 0\n ) {\n for (const fc of extractedFinal.functionCalls) {\n accumulator.addToolCall(fc);\n }\n }\n } catch {\n // best-effort final response extraction\n }\n }\n\n const state = accumulator.getState();\n let costUsd: number | null = null;\n if (state.inputTokens != null && state.outputTokens != null) {\n try {\n costUsd = calculateCost({\n modelName: model,\n inputTokens: state.inputTokens,\n outputTokens: state.outputTokens,\n defaultProvider: 'google',\n });\n } catch {\n // cost calculation is best-effort\n }\n }\n\n this._track({\n ...contextFields(ctx),\n modelName: model,\n provider: 'gemini',\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 toolDefinitions: extractGeminiToolDefinitions(params),\n systemPrompt: extractGeminiSystemPrompt(params),\n temperature: extractGeminiTemperature(params),\n topP: extractGeminiTopP(params),\n maxOutputTokens: extractGeminiMaxOutputTokens(params),\n providerTtfbMs: state.ttfbMs,\n isStreaming: true,\n isError: state.isError,\n errorMessage: state.errorMessage,\n });\n }\n }\n}\n\nexport function extractGeminiResponse(response: unknown): {\n text: string;\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n finishReason?: string;\n functionCalls?: Array<Record<string, unknown>>;\n} {\n const resp = response as GeminiResponse;\n const respObj = resp.response ?? resp;\n let text = '';\n if (typeof respObj.text === 'function') {\n try {\n text = String(respObj.text());\n } catch {\n // text() throws when the response has no candidates (e.g. safety block)\n }\n }\n const usage = respObj.usageMetadata;\n\n const candidate = respObj.candidates?.[0];\n const finishReason = candidate?.finishReason;\n\n const parts = candidate?.content?.parts;\n const functionCalls = parts\n ?.filter((p) => p.functionCall != null)\n .map((p) => p.functionCall as Record<string, unknown>);\n\n return {\n text,\n inputTokens: usage?.promptTokenCount,\n outputTokens: usage?.candidatesTokenCount,\n totalTokens: usage?.totalTokenCount,\n finishReason,\n functionCalls: functionCalls?.length ? functionCalls : undefined,\n };\n}\n\nfunction extractGeminiSystemPrompt(\n params: Record<string, unknown>,\n): string | undefined {\n const systemInstruction =\n (params.systemInstruction as string | undefined) ??\n ((params.generationConfig as Record<string, unknown> | undefined)\n ?.systemInstruction as string | undefined);\n return systemInstruction;\n}\n\nfunction extractGeminiTemperature(\n params: Record<string, unknown>,\n): number | undefined {\n return (params.generationConfig as Record<string, unknown> | undefined)\n ?.temperature as number | undefined;\n}\n\nfunction extractGeminiTopP(\n params: Record<string, unknown>,\n): number | undefined {\n return (params.generationConfig as Record<string, unknown> | undefined)\n ?.topP as number | undefined;\n}\n\nfunction extractGeminiMaxOutputTokens(\n params: Record<string, unknown>,\n): number | undefined {\n return (params.generationConfig as Record<string, unknown> | undefined)\n ?.maxOutputTokens as number | undefined;\n}\n\nfunction extractGeminiToolDefinitions(\n params: Record<string, unknown>,\n): Array<Record<string, unknown>> | undefined {\n const tools = params.tools;\n return Array.isArray(tools) && tools.length > 0\n ? (tools as Array<Record<string, unknown>>)\n : undefined;\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":"mistral.d.ts","names":[],"sources":["../../src/providers/mistral.ts"],"sourcesContent":[],"mappings":";;;;;;AAaM,cADO,iBACS,EAAM,OAAA;AAI5B,cAJM,cAIyB,EAJT,MAKT,CAAA,MAAA,EAAA,OAEK,CAAA,GAAA,IAAA;AAOD,UAVA,cAAA,CAUA;EAEM,SAAA,EAXV,aAWU;EAJM,MAAA,CAAA,EAAA,MAAA;EAAc,aAAA,CAAA,EALzB,aAKyB,GAAA,IAAA;EAoC9B;EAI2B,aAAA,CAAA,EAAA,OAAA;;AAQW,cAhDtC,OAAA,SAAgB,cAAA,CAgDsB;EAmF5B,QAAA,OAAA;EAA0B,SAAA,IAAA,EAjIhC,WAiIgC;EAAO,WAAA,CAAA,OAAA,EA/HjC,cA+HiC;;;cA/F3C,WAAA;;;wCAI2B;mBAQf,0BAA0B;iBAmF5B,0BAA0B"}
1
+ {"version":3,"file":"mistral.d.ts","names":[],"sources":["../../src/providers/mistral.ts"],"sourcesContent":[],"mappings":";;;;;;AAaM,cADO,iBACS,EAAM,OAAA;AAI5B,cAJM,cAIyB,EAJT,MAKT,CAAA,MAAA,EAAA,OAEK,CAAA,GAAA,IAAA;AAOD,UAVA,cAAA,CAUA;EAEM,SAAA,EAXV,aAWU;EAJM,MAAA,CAAA,EAAA,MAAA;EAAc,aAAA,CAAA,EALzB,aAKyB,GAAA,IAAA;EAoC9B;EAI2B,aAAA,CAAA,EAAA,OAAA;;AAQW,cAhDtC,OAAA,SAAgB,cAAA,CAgDsB;EAoF5B,QAAA,OAAA;EAA0B,SAAA,IAAA,EAlIhC,WAkIgC;EAAO,WAAA,CAAA,OAAA,EAhIjC,cAgIiC;;;cAhG3C,WAAA;;;wCAI2B;mBAQf,0BAA0B;iBAoF5B,0BAA0B"}
@@ -70,6 +70,7 @@ var WrappedChat = class {
70
70
  totalCostUsd: costUsd,
71
71
  finishReason: choice?.finish_reason,
72
72
  toolCalls: toolCalls ?? void 0,
73
+ toolDefinitions: extractMistralToolDefinitions(params),
73
74
  systemPrompt: extractMistralSystemPrompt(params),
74
75
  temperature: params.temperature,
75
76
  topP: params.top_p,
@@ -179,6 +180,7 @@ var WrappedChat = class {
179
180
  totalCostUsd: costUsd,
180
181
  finishReason: state.finishReason,
181
182
  toolCalls: state.toolCalls.length > 0 ? state.toolCalls : void 0,
183
+ toolDefinitions: extractMistralToolDefinitions(params),
182
184
  systemPrompt: extractMistralSystemPrompt(params),
183
185
  temperature: params.temperature,
184
186
  topP: params.top_p,
@@ -207,6 +209,10 @@ function extractMistralSystemPrompt(params) {
207
209
  const systemMessage = messages.find((m) => m.role === "system");
208
210
  return typeof systemMessage?.content === "string" ? systemMessage.content : void 0;
209
211
  }
212
+ function extractMistralToolDefinitions(params) {
213
+ const tools = params.tools;
214
+ return Array.isArray(tools) && tools.length > 0 ? tools : void 0;
215
+ }
210
216
  function _isAsyncIterable(value) {
211
217
  return value != null && typeof value[Symbol.asyncIterator] === "function";
212
218
  }
@@ -1 +1 @@
1
- {"version":3,"file":"mistral.js","names":["_MistralModule: Record<string, unknown> | null","clientOpts: Record<string, unknown>","costUsd: number | null"],"sources":["../../src/providers/mistral.ts"],"sourcesContent":["/**\n * Mistral AI provider wrapper with automatic tracking.\n */\n\nimport type { PrivacyConfig } from '../core/privacy.js';\nimport type { AmplitudeOrAI, MistralChatResponse, TrackFn } 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('@mistralai/mistralai');\nexport const MISTRAL_AVAILABLE = _resolved != null;\nconst _MistralModule: Record<string, unknown> | null = _resolved;\n\nexport { _MistralModule };\n\nexport interface MistralOptions {\n amplitude: AmplitudeOrAI;\n apiKey?: string;\n privacyConfig?: PrivacyConfig | null;\n /** Pass the `@mistralai/mistralai` module directly to bypass `tryRequire` (required in bundler environments). */\n mistralModule?: unknown;\n}\n\nexport class Mistral extends BaseAIProvider {\n private _client: unknown;\n readonly chat: WrappedChat;\n\n constructor(options: MistralOptions) {\n super({\n amplitude: options.amplitude,\n privacyConfig: options.privacyConfig,\n providerName: 'mistral',\n });\n\n const mod =\n (options.mistralModule as Record<string, unknown> | null) ??\n _MistralModule;\n if (mod == null) {\n throw new Error(\n '@mistralai/mistralai package is required. Install it with: npm install @mistralai/mistralai — or pass the module directly via the mistralModule option.',\n );\n }\n\n const MistralSDK = (mod.Mistral ??\n mod.MistralClient ??\n mod.default) as new (opts: Record<string, unknown>) => unknown;\n\n const clientOpts: Record<string, unknown> = {};\n if (options.apiKey) clientOpts.apiKey = options.apiKey;\n\n this._client = new MistralSDK(clientOpts);\n this.chat = new WrappedChat(this._client, this.trackFn());\n }\n\n get client(): unknown {\n return this._client;\n }\n}\n\nexport class WrappedChat {\n private _client: unknown;\n private _trackFn: TrackFn;\n\n constructor(client: unknown, trackFn: TrackFn) {\n this._client = client;\n this._trackFn =\n typeof trackFn === 'function'\n ? trackFn\n : (trackFn as unknown as { trackFn(): TrackFn }).trackFn();\n }\n\n async complete(params: Record<string, unknown>): Promise<unknown> {\n const clientObj = this._client as Record<string, unknown>;\n const chat = clientObj.chat as Record<string, unknown>;\n const completeFn = chat.complete as (\n ...args: unknown[]\n ) => Promise<unknown>;\n\n const startTime = performance.now();\n const ctx = applySessionContext();\n\n try {\n const response = await completeFn.call(chat, params);\n if (\n (params.stream === true || chat.stream != null) &&\n _isAsyncIterable(response)\n ) {\n return this._wrapStream(\n response as AsyncIterable<unknown>,\n params,\n ctx,\n );\n }\n const latencyMs = performance.now() - startTime;\n\n const resp = response as MistralChatResponse;\n const choice = resp.choices?.[0];\n const usage = resp.usage;\n const modelName = String(resp.model ?? params.model ?? 'unknown');\n const toolCalls = (\n choice?.message as { tool_calls?: Array<Record<string, unknown>> }\n )?.tool_calls;\n\n let costUsd: number | null = null;\n if (usage?.prompt_tokens != null && usage?.completion_tokens != null) {\n try {\n costUsd = calculateCost({\n modelName,\n inputTokens: usage.prompt_tokens,\n outputTokens: usage.completion_tokens,\n defaultProvider: 'mistral',\n });\n } catch {\n // cost calculation is best-effort\n }\n }\n\n this._trackFn({\n ...contextFields(ctx),\n modelName,\n provider: 'mistral',\n responseContent: extractMistralContent(choice?.message?.content),\n latencyMs,\n inputTokens: usage?.prompt_tokens,\n outputTokens: usage?.completion_tokens,\n totalTokens: usage?.total_tokens,\n totalCostUsd: costUsd,\n finishReason: choice?.finish_reason,\n toolCalls: toolCalls ?? undefined,\n systemPrompt: extractMistralSystemPrompt(params),\n temperature: params.temperature as number | undefined,\n topP: params.top_p as number | undefined,\n maxOutputTokens: params.max_tokens as number | undefined,\n isStreaming: false,\n });\n\n return response;\n } catch (error) {\n const latencyMs = performance.now() - startTime;\n\n this._trackFn({\n ...contextFields(ctx),\n modelName: String(params.model ?? 'unknown'),\n provider: 'mistral',\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 stream(params: Record<string, unknown>): Promise<unknown> {\n const ctx = applySessionContext();\n const startTime = performance.now();\n try {\n const clientObj = this._client as Record<string, unknown>;\n const chat = clientObj.chat as Record<string, unknown>;\n const streamFn = chat.stream as\n | ((...args: unknown[]) => Promise<unknown>)\n | undefined;\n if (typeof streamFn !== 'function') {\n throw new Error('Mistral SDK does not expose chat.stream');\n }\n\n const response = await streamFn.call(chat, params);\n if (!_isAsyncIterable(response)) {\n throw new Error('Mistral stream response is not AsyncIterable');\n }\n return this._wrapStream(response as AsyncIterable<unknown>, params, ctx);\n } catch (error) {\n this._trackFn({\n ...contextFields(ctx),\n modelName: String(params.model ?? 'unknown'),\n provider: 'mistral',\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 private async *_wrapStream(\n stream: AsyncIterable<unknown>,\n params: Record<string, unknown>,\n sessionCtx: ReturnType<typeof applySessionContext>,\n ): AsyncGenerator<unknown> {\n const accumulator = new StreamingAccumulator();\n accumulator.model = String(params.model ?? 'unknown');\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\n | Record<string, unknown>\n | undefined;\n const message = choices?.[0]?.message as\n | Record<string, unknown>\n | undefined;\n\n const content =\n (delta?.content as string | undefined) ??\n (message?.content as string | undefined);\n if (typeof content === 'string' && content.length > 0) {\n accumulator.addContent(content);\n }\n\n const toolCalls =\n (delta?.tool_calls as Array<Record<string, unknown>> | undefined) ??\n (message?.tool_calls as Array<Record<string, unknown>> | undefined);\n if (Array.isArray(toolCalls)) {\n for (const call of toolCalls) {\n const idx = call.index as number | undefined;\n const id = call.id as string | undefined;\n const fn = call.function as Record<string, unknown> | undefined;\n if (idx != null && id && fn?.name != null) {\n accumulator.setToolCallAt(idx, {\n type: 'function',\n id,\n function: {\n name: fn.name,\n arguments: ((fn.arguments as string) ?? ''),\n },\n });\n } else if (idx != null && fn?.arguments) {\n accumulator.appendToolCallArgs(idx, fn.arguments as string);\n } else {\n accumulator.addToolCall(call);\n }\n }\n }\n\n const finishReason = choices?.[0]?.finish_reason;\n if (finishReason != null)\n accumulator.finishReason = String(finishReason);\n\n const usage = c.usage as Record<string, unknown> | undefined;\n accumulator.setUsage({\n inputTokens: usage?.prompt_tokens as number | undefined,\n outputTokens: usage?.completion_tokens as number | undefined,\n totalTokens: usage?.total_tokens as number | undefined,\n });\n\n yield chunk;\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 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 defaultProvider: 'mistral',\n });\n } catch {\n // cost calculation is best-effort\n }\n }\n\n this._trackFn({\n ...contextFields(sessionCtx),\n modelName,\n provider: 'mistral',\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: extractMistralSystemPrompt(params),\n temperature: params.temperature as number | undefined,\n topP: params.top_p as number | undefined,\n maxOutputTokens: params.max_tokens as number | undefined,\n providerTtfbMs: state.ttfbMs,\n isStreaming: true,\n isError: state.isError,\n errorMessage: state.errorMessage,\n });\n }\n }\n}\n\nfunction extractMistralContent(content: unknown): string {\n if (typeof content === 'string') return content;\n if (content == null) return '';\n if (Array.isArray(content)) {\n return content\n .map((chunk) => {\n if (typeof chunk === 'string') return chunk;\n if (typeof chunk === 'object' && chunk != null) {\n return String((chunk as Record<string, unknown>).text ?? '');\n }\n return '';\n })\n .filter(Boolean)\n .join('');\n }\n return String(content);\n}\n\nfunction extractMistralSystemPrompt(\n params: Record<string, unknown>,\n): string | undefined {\n const messages = params.messages as\n | Array<Record<string, unknown>>\n | undefined;\n if (!Array.isArray(messages)) return undefined;\n const systemMessage = messages.find((m) => m.role === 'system');\n return typeof systemMessage?.content === 'string'\n ? systemMessage.content\n : undefined;\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":"mistral.js","names":["_MistralModule: Record<string, unknown> | null","clientOpts: Record<string, unknown>","costUsd: number | null"],"sources":["../../src/providers/mistral.ts"],"sourcesContent":["/**\n * Mistral AI provider wrapper with automatic tracking.\n */\n\nimport type { PrivacyConfig } from '../core/privacy.js';\nimport type { AmplitudeOrAI, MistralChatResponse, TrackFn } 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('@mistralai/mistralai');\nexport const MISTRAL_AVAILABLE = _resolved != null;\nconst _MistralModule: Record<string, unknown> | null = _resolved;\n\nexport { _MistralModule };\n\nexport interface MistralOptions {\n amplitude: AmplitudeOrAI;\n apiKey?: string;\n privacyConfig?: PrivacyConfig | null;\n /** Pass the `@mistralai/mistralai` module directly to bypass `tryRequire` (required in bundler environments). */\n mistralModule?: unknown;\n}\n\nexport class Mistral extends BaseAIProvider {\n private _client: unknown;\n readonly chat: WrappedChat;\n\n constructor(options: MistralOptions) {\n super({\n amplitude: options.amplitude,\n privacyConfig: options.privacyConfig,\n providerName: 'mistral',\n });\n\n const mod =\n (options.mistralModule as Record<string, unknown> | null) ??\n _MistralModule;\n if (mod == null) {\n throw new Error(\n '@mistralai/mistralai package is required. Install it with: npm install @mistralai/mistralai — or pass the module directly via the mistralModule option.',\n );\n }\n\n const MistralSDK = (mod.Mistral ??\n mod.MistralClient ??\n mod.default) as new (opts: Record<string, unknown>) => unknown;\n\n const clientOpts: Record<string, unknown> = {};\n if (options.apiKey) clientOpts.apiKey = options.apiKey;\n\n this._client = new MistralSDK(clientOpts);\n this.chat = new WrappedChat(this._client, this.trackFn());\n }\n\n get client(): unknown {\n return this._client;\n }\n}\n\nexport class WrappedChat {\n private _client: unknown;\n private _trackFn: TrackFn;\n\n constructor(client: unknown, trackFn: TrackFn) {\n this._client = client;\n this._trackFn =\n typeof trackFn === 'function'\n ? trackFn\n : (trackFn as unknown as { trackFn(): TrackFn }).trackFn();\n }\n\n async complete(params: Record<string, unknown>): Promise<unknown> {\n const clientObj = this._client as Record<string, unknown>;\n const chat = clientObj.chat as Record<string, unknown>;\n const completeFn = chat.complete as (\n ...args: unknown[]\n ) => Promise<unknown>;\n\n const startTime = performance.now();\n const ctx = applySessionContext();\n\n try {\n const response = await completeFn.call(chat, params);\n if (\n (params.stream === true || chat.stream != null) &&\n _isAsyncIterable(response)\n ) {\n return this._wrapStream(\n response as AsyncIterable<unknown>,\n params,\n ctx,\n );\n }\n const latencyMs = performance.now() - startTime;\n\n const resp = response as MistralChatResponse;\n const choice = resp.choices?.[0];\n const usage = resp.usage;\n const modelName = String(resp.model ?? params.model ?? 'unknown');\n const toolCalls = (\n choice?.message as { tool_calls?: Array<Record<string, unknown>> }\n )?.tool_calls;\n\n let costUsd: number | null = null;\n if (usage?.prompt_tokens != null && usage?.completion_tokens != null) {\n try {\n costUsd = calculateCost({\n modelName,\n inputTokens: usage.prompt_tokens,\n outputTokens: usage.completion_tokens,\n defaultProvider: 'mistral',\n });\n } catch {\n // cost calculation is best-effort\n }\n }\n\n this._trackFn({\n ...contextFields(ctx),\n modelName,\n provider: 'mistral',\n responseContent: extractMistralContent(choice?.message?.content),\n latencyMs,\n inputTokens: usage?.prompt_tokens,\n outputTokens: usage?.completion_tokens,\n totalTokens: usage?.total_tokens,\n totalCostUsd: costUsd,\n finishReason: choice?.finish_reason,\n toolCalls: toolCalls ?? undefined,\n toolDefinitions: extractMistralToolDefinitions(params),\n systemPrompt: extractMistralSystemPrompt(params),\n temperature: params.temperature as number | undefined,\n topP: params.top_p as number | undefined,\n maxOutputTokens: params.max_tokens as number | undefined,\n isStreaming: false,\n });\n\n return response;\n } catch (error) {\n const latencyMs = performance.now() - startTime;\n\n this._trackFn({\n ...contextFields(ctx),\n modelName: String(params.model ?? 'unknown'),\n provider: 'mistral',\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 stream(params: Record<string, unknown>): Promise<unknown> {\n const ctx = applySessionContext();\n const startTime = performance.now();\n try {\n const clientObj = this._client as Record<string, unknown>;\n const chat = clientObj.chat as Record<string, unknown>;\n const streamFn = chat.stream as\n | ((...args: unknown[]) => Promise<unknown>)\n | undefined;\n if (typeof streamFn !== 'function') {\n throw new Error('Mistral SDK does not expose chat.stream');\n }\n\n const response = await streamFn.call(chat, params);\n if (!_isAsyncIterable(response)) {\n throw new Error('Mistral stream response is not AsyncIterable');\n }\n return this._wrapStream(response as AsyncIterable<unknown>, params, ctx);\n } catch (error) {\n this._trackFn({\n ...contextFields(ctx),\n modelName: String(params.model ?? 'unknown'),\n provider: 'mistral',\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 private async *_wrapStream(\n stream: AsyncIterable<unknown>,\n params: Record<string, unknown>,\n sessionCtx: ReturnType<typeof applySessionContext>,\n ): AsyncGenerator<unknown> {\n const accumulator = new StreamingAccumulator();\n accumulator.model = String(params.model ?? 'unknown');\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\n | Record<string, unknown>\n | undefined;\n const message = choices?.[0]?.message as\n | Record<string, unknown>\n | undefined;\n\n const content =\n (delta?.content as string | undefined) ??\n (message?.content as string | undefined);\n if (typeof content === 'string' && content.length > 0) {\n accumulator.addContent(content);\n }\n\n const toolCalls =\n (delta?.tool_calls as Array<Record<string, unknown>> | undefined) ??\n (message?.tool_calls as Array<Record<string, unknown>> | undefined);\n if (Array.isArray(toolCalls)) {\n for (const call of toolCalls) {\n const idx = call.index as number | undefined;\n const id = call.id as string | undefined;\n const fn = call.function as Record<string, unknown> | undefined;\n if (idx != null && id && fn?.name != null) {\n accumulator.setToolCallAt(idx, {\n type: 'function',\n id,\n function: {\n name: fn.name,\n arguments: ((fn.arguments as string) ?? ''),\n },\n });\n } else if (idx != null && fn?.arguments) {\n accumulator.appendToolCallArgs(idx, fn.arguments as string);\n } else {\n accumulator.addToolCall(call);\n }\n }\n }\n\n const finishReason = choices?.[0]?.finish_reason;\n if (finishReason != null)\n accumulator.finishReason = String(finishReason);\n\n const usage = c.usage as Record<string, unknown> | undefined;\n accumulator.setUsage({\n inputTokens: usage?.prompt_tokens as number | undefined,\n outputTokens: usage?.completion_tokens as number | undefined,\n totalTokens: usage?.total_tokens as number | undefined,\n });\n\n yield chunk;\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 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 defaultProvider: 'mistral',\n });\n } catch {\n // cost calculation is best-effort\n }\n }\n\n this._trackFn({\n ...contextFields(sessionCtx),\n modelName,\n provider: 'mistral',\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 toolDefinitions: extractMistralToolDefinitions(params),\n systemPrompt: extractMistralSystemPrompt(params),\n temperature: params.temperature as number | undefined,\n topP: params.top_p as number | undefined,\n maxOutputTokens: params.max_tokens as number | undefined,\n providerTtfbMs: state.ttfbMs,\n isStreaming: true,\n isError: state.isError,\n errorMessage: state.errorMessage,\n });\n }\n }\n}\n\nfunction extractMistralContent(content: unknown): string {\n if (typeof content === 'string') return content;\n if (content == null) return '';\n if (Array.isArray(content)) {\n return content\n .map((chunk) => {\n if (typeof chunk === 'string') return chunk;\n if (typeof chunk === 'object' && chunk != null) {\n return String((chunk as Record<string, unknown>).text ?? '');\n }\n return '';\n })\n .filter(Boolean)\n .join('');\n }\n return String(content);\n}\n\nfunction extractMistralSystemPrompt(\n params: Record<string, unknown>,\n): string | undefined {\n const messages = params.messages as\n | Array<Record<string, unknown>>\n | undefined;\n if (!Array.isArray(messages)) return undefined;\n const systemMessage = messages.find((m) => m.role === 'system');\n return typeof systemMessage?.content === 'string'\n ? systemMessage.content\n : undefined;\n}\n\nfunction extractMistralToolDefinitions(\n params: Record<string, unknown>,\n): Array<Record<string, unknown>> | undefined {\n const tools = params.tools;\n return Array.isArray(tools) && tools.length > 0\n ? (tools as Array<Record<string, unknown>>)\n : undefined;\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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"}
@@ -56,6 +56,7 @@ declare class WrappedResponses {
56
56
  private _trackInputMessages;
57
57
  }
58
58
  declare function extractSystemPrompt(params: Record<string, unknown>): string | undefined;
59
+ declare function extractToolDefinitions(params: Record<string, unknown>): Array<Record<string, unknown>> | undefined;
59
60
  //#endregion
60
- export { OPENAI_AVAILABLE, OpenAI, OpenAIOptions, WrappedChat, WrappedCompletions, WrappedResponses, _OpenAIModule, extractSystemPrompt };
61
+ export { OPENAI_AVAILABLE, OpenAI, OpenAIOptions, WrappedChat, WrappedCompletions, WrappedResponses, _OpenAIModule, extractSystemPrompt, extractToolDefinitions };
61
62
  //# sourceMappingURL=openai.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"openai.d.ts","names":[],"sources":["../../src/providers/openai.ts"],"sourcesContent":[],"mappings":";;;;;;AAoDiB,cAnBJ,gBAmBI,EAAA,OAAA;cAlBX,aAmBgB,EAnBD,MAmBC,CAAA,MAAA,EAAA,OAAA,CAAA,GAAA,IAAA;AA6CN,UA5DC,aAAA,CA4DD;EAhDN,SAAA,EAXG,aAWH;EAAc,MAAA,CAAA,EAAA,MAAA;EAqDX,OAAA,CAAA,EAAA,MAAW;EACA,aAAA,CAAA,EA9DN,aA8DM,GAAA,IAAA;EAIX,gBAAA,CAAA,EAAA,OAAA;EACE;EACI,YAAA,CAAA,EAAA,OAAA;;AAeN,cA7EA,MA6EkB,CAAA,gBA5Eb,MA4Ea,CAAA,MAAA,EAAA,OAAA,CAAA,GA5Ea,MA4Eb,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA,SA3ErB,cAAA,CA2EqB;EAClB,QAAA,OAAA;EAQI,SAAA,IAAA,EAlFA,WAkFA;EACJ,SAAA,SAAA,EAlFS,gBAkFT;EACE,QAAA,iBAAA;EACI,WAAA,CAAA,OAAA,EAjFI,aAiFJ;EAgBP,IAAA,MAAA,CAAA,CAAA,EAvDI,OAuDJ;;AAEC,cApDA,WAAA,CAoDA;EAAyB,SAAA,WAAA,EAnDd,kBAmDc;EAAjC,WAAA,CAAA,MAAA,EAAA,OAAA,EAAA,OAAA,EA/CQ,OA+CR,EAAA,SAAA,EA9CU,aA8CV,EAAA,aAAA,EA7Cc,aA6Cd,GAAA,IAAA,EAAA,gBAAA,EAAA,OAAA;;AA0GoB,cAxIZ,kBAAA,CAwIY;EACZ,SAAA,EAxIA,MAwIA,CAAA,MAAA,EAAA,OAAA,CAAA;EAAyB,QAAA,QAAA;EAAjC,QAAA,UAAA;EAAO,QAAA,cAAA;EAgMC,QAAA,iBAAgB;EAChB,QAAA,aAAA;EASA,WAAA,CAAA,WAAA,EA1UI,MA0UJ,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAzUA,OAyUA,EAAA,SAAA,EAxUE,aAwUF,EAAA,aAAA,EAvUM,aAuUN,GAAA,IAAA,EAAA,gBAAA,EAAA,OAAA,EAAA,YAAA,CAAA,EAAA,MAAA;EACE,MAAA,CAAA,MAAA,EAxTH,MAwTG,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA,kBAAA,CAAA,EAvTU,oBAuTV,CAAA,EAtTV,OAsTU,CAtTF,sBAsTE,GAtTuB,aAsTvB,CAAA,OAAA,CAAA,CAAA;EACI,KAAA,CAAA,MAAA,EA9MP,MA8MO,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA,kBAAA,CAAA,EA7MM,oBA6MN,CAAA,EA5Md,OA4Mc,CA5MN,sBA4MM,GA5MmB,aA4MnB,CAAA,OAAA,CAAA,CAAA;EAkBP,QAAA,WAAA;EACa,QAAA,mBAAA;EACZ,QAAA,mBAAA;;AAAR,cAhCQ,gBAAA,CAgCR;EAmFO,SAAA,EAlHC,MAkHD,CAAA,MAAA,EAAA,OAAA,CAAA;EACa,QAAA,QAAA;EACZ,QAAA,UAAA;EAAR,QAAA,cAAA;EAAO,QAAA,iBAAA;EAgLI,QAAA,aAAA;wCA3RH,oBACE,8BACI;iBAkBP,8CACa,uBACpB,QAAQ,iBAAiB;iBAmFlB,8CACa,uBACpB,QAAQ;;;;;iBAgLG,mBAAA,SACN"}
1
+ {"version":3,"file":"openai.d.ts","names":[],"sources":["../../src/providers/openai.ts"],"sourcesContent":[],"mappings":"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"}
@@ -106,6 +106,7 @@ var WrappedCompletions = class {
106
106
  finishReason: choice?.finish_reason,
107
107
  toolCalls: toolCalls ?? void 0,
108
108
  isStreaming: false,
109
+ toolDefinitions: extractToolDefinitions(requestParams),
109
110
  systemPrompt: extractSystemPrompt(requestParams),
110
111
  temperature: requestParams.temperature,
111
112
  maxOutputTokens: requestParams.max_tokens,
@@ -216,6 +217,7 @@ var WrappedCompletions = class {
216
217
  isError: state.isError,
217
218
  errorMessage: state.errorMessage,
218
219
  reasoningContent: reasoningContent || void 0,
220
+ toolDefinitions: extractToolDefinitions(params),
219
221
  systemPrompt: extractSystemPrompt(params),
220
222
  temperature: params.temperature,
221
223
  maxOutputTokens: params.max_tokens,
@@ -314,6 +316,7 @@ var WrappedResponses = class {
314
316
  finishReason: extractResponsesFinishReason(resp),
315
317
  toolCalls: responseToolCalls.length > 0 ? responseToolCalls : void 0,
316
318
  isStreaming: false,
319
+ toolDefinitions: extractResponsesToolDefinitions(requestParams),
317
320
  systemPrompt: extractResponsesSystemPrompt(requestParams),
318
321
  temperature: requestParams.temperature,
319
322
  maxOutputTokens: requestParams.max_output_tokens,
@@ -418,6 +421,7 @@ var WrappedResponses = class {
418
421
  isStreaming: true,
419
422
  isError: state.isError,
420
423
  errorMessage: state.errorMessage,
424
+ toolDefinitions: extractResponsesToolDefinitions(params),
421
425
  systemPrompt: extractResponsesSystemPrompt(params),
422
426
  temperature: params.temperature,
423
427
  maxOutputTokens: params.max_output_tokens,
@@ -500,6 +504,14 @@ function extractOutputItemText(item) {
500
504
  for (const c of item.content) if (typeof c?.text === "string") text += c.text;
501
505
  return text;
502
506
  }
507
+ function extractToolDefinitions(params) {
508
+ const tools = params.tools;
509
+ return Array.isArray(tools) && tools.length > 0 ? tools : void 0;
510
+ }
511
+ function extractResponsesToolDefinitions(params) {
512
+ const tools = params.tools;
513
+ return Array.isArray(tools) && tools.length > 0 ? tools : void 0;
514
+ }
503
515
  function extractResponsesUserInputs(input) {
504
516
  if (typeof input === "string") return [input];
505
517
  if (!Array.isArray(input)) return [];
@@ -520,5 +532,5 @@ function extractResponsesUserInputs(input) {
520
532
  }
521
533
 
522
534
  //#endregion
523
- export { OPENAI_AVAILABLE, OpenAI, WrappedChat, WrappedCompletions, WrappedResponses, _OpenAIModule, extractSystemPrompt };
535
+ export { OPENAI_AVAILABLE, OpenAI, WrappedChat, WrappedCompletions, WrappedResponses, _OpenAIModule, extractSystemPrompt, extractToolDefinitions };
524
536
  //# sourceMappingURL=openai.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"openai.js","names":["_OpenAIModule: Record<string, unknown> | null","clientOpts: Record<string, unknown>","costUsd: number | null","toolCalls: Array<Record<string, unknown>>","result: string[]"],"sources":["../../src/providers/openai.ts"],"sourcesContent":["/**\n * OpenAI provider wrapper with automatic tracking.\n *\n * Wraps the OpenAI client and instruments:\n * - chat.completions.create()\n * - responses.create()\n * to track AI response events via Amplitude.\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 ChatCompletionResponse,\n ChatMessage,\n OpenAIResponse,\n OpenAIResponseInput,\n OpenAIResponseOutputItem,\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('openai');\nexport const OPENAI_AVAILABLE = _resolved != null;\nconst _OpenAIModule: Record<string, unknown> | null = _resolved;\n\nexport { _OpenAIModule };\n\nexport interface OpenAIOptions {\n amplitude: AmplitudeOrAI;\n apiKey?: string;\n baseUrl?: string;\n privacyConfig?: PrivacyConfig | null;\n propagateContext?: boolean;\n /** Pass the `openai` module directly to bypass `tryRequire` (required in bundler environments). */\n openaiModule?: unknown;\n}\n\nexport class OpenAI<\n TClient extends Record<string, unknown> = Record<string, unknown>,\n> extends BaseAIProvider {\n private _client: TClient;\n readonly chat: WrappedChat;\n readonly responses: WrappedResponses;\n private _propagateContext: boolean;\n\n constructor(options: OpenAIOptions) {\n super({\n amplitude: options.amplitude,\n privacyConfig: options.privacyConfig,\n providerName: 'openai',\n });\n\n const mod =\n (options.openaiModule as Record<string, unknown> | null) ?? _OpenAIModule;\n if (mod == null) {\n throw new Error(\n 'openai package is required. Install it with: npm install openai — or pass the module directly via the openaiModule option.',\n );\n }\n\n const OpenAISDK = mod.OpenAI 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 if (options.baseUrl) clientOpts.baseURL = options.baseUrl;\n\n this._client = new OpenAISDK(clientOpts) as TClient;\n this._propagateContext =\n options.propagateContext ?? getDefaultPropagateContext();\n this.chat = new WrappedChat(\n this._client,\n this.trackFn(),\n this._amplitude,\n this._privacyConfig,\n this._propagateContext,\n );\n this.responses = new WrappedResponses(\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 WrappedChat {\n readonly completions: WrappedCompletions;\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 const chat = clientObj.chat as Record<string, unknown>;\n this.completions = new WrappedCompletions(\n chat.completions as Record<string, unknown>,\n trackFn,\n amplitude,\n privacyConfig,\n propagateContext,\n );\n }\n}\n\nexport class WrappedCompletions {\n _original: Record<string, unknown>;\n private _trackFn: TrackFn;\n private _amplitude: AmplitudeLike;\n private _privacyConfig: PrivacyConfig | null;\n private _propagateContext: boolean;\n private _providerName: string;\n\n constructor(\n completions: Record<string, unknown>,\n trackFn: TrackFn,\n amplitude: AmplitudeLike,\n privacyConfig: PrivacyConfig | null,\n propagateContext: boolean,\n providerName = 'openai',\n ) {\n this._original = completions;\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 this._providerName = providerName;\n }\n\n async create(\n params: Record<string, unknown>,\n amplitudeOverrides?: ProviderTrackOptions,\n ): Promise<ChatCompletionResponse | AsyncIterable<unknown>> {\n const createFn = this._original.create as (\n ...args: unknown[]\n ) => Promise<unknown>;\n const startTime = performance.now();\n let requestParams = this._withContextHeaders(params);\n const ctx = applySessionContext(amplitudeOverrides);\n\n if (requestParams.stream === true && requestParams.stream_options == null) {\n requestParams = {\n ...requestParams,\n stream_options: { include_usage: true },\n };\n }\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 ChatCompletionResponse;\n const usage = resp.usage;\n const choice = resp.choices?.[0];\n const modelName = String(resp.model ?? requestParams.model ?? 'unknown');\n const toolCalls = choice?.message?.tool_calls;\n\n const usageExt = usage as Record<string, unknown> | undefined;\n const promptDetails = usageExt?.prompt_tokens_details as\n | Record<string, number>\n | undefined;\n const completionDetails = usageExt?.completion_tokens_details as\n | Record<string, number>\n | undefined;\n const reasoningTokens = completionDetails?.reasoning_tokens;\n const cachedTokens = promptDetails?.cached_tokens;\n\n let costUsd: number | null = null;\n if (usage?.prompt_tokens != null && usage?.completion_tokens != null) {\n try {\n costUsd = calculateCost({\n modelName,\n inputTokens: usage.prompt_tokens,\n outputTokens: usage.completion_tokens,\n reasoningTokens: reasoningTokens ?? 0,\n cacheReadInputTokens: cachedTokens ?? 0,\n defaultProvider: 'openai',\n });\n } catch {\n // cost calculation is best-effort\n }\n }\n\n this._trackFn({\n ...contextFields(ctx),\n modelName,\n provider: this._providerName,\n responseContent: String(choice?.message?.content ?? ''),\n latencyMs,\n inputTokens: usage?.prompt_tokens,\n outputTokens: usage?.completion_tokens,\n totalTokens: usage?.total_tokens,\n reasoningTokens,\n cacheReadInputTokens: cachedTokens,\n totalCostUsd: costUsd,\n finishReason: choice?.finish_reason,\n toolCalls: toolCalls ?? undefined,\n isStreaming: false,\n systemPrompt: extractSystemPrompt(requestParams),\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 ChatCompletionResponse;\n } catch (error) {\n const latencyMs = performance.now() - startTime;\n this._trackFn({\n ...contextFields(ctx),\n modelName: String(requestParams.model ?? 'unknown'),\n provider: this._providerName,\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 parse(\n params: Record<string, unknown>,\n amplitudeOverrides?: ProviderTrackOptions,\n ): Promise<ChatCompletionResponse | AsyncIterable<unknown>> {\n const parseFn = this._original.parse as\n | ((...args: unknown[]) => Promise<unknown>)\n | undefined;\n if (typeof parseFn !== 'function') {\n throw new Error('OpenAI SDK does not expose chat.completions.parse');\n }\n const originalCreate = this._original.create;\n this._original.create = parseFn;\n try {\n return await this.create(params, amplitudeOverrides);\n } finally {\n this._original.create = originalCreate;\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 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\n | Record<string, unknown>\n | undefined;\n\n if (delta?.content != null) {\n accumulator.addContent(String(delta.content));\n }\n\n const deltaToolCalls = delta?.tool_calls as\n | Array<Record<string, unknown>>\n | undefined;\n if (Array.isArray(deltaToolCalls)) {\n for (const call of deltaToolCalls) {\n const idx = call.index as number | undefined;\n const id = call.id as string | undefined;\n const fn = call.function as Record<string, unknown> | undefined;\n if (idx != null && id && fn?.name != null) {\n accumulator.setToolCallAt(idx, {\n type: 'function',\n id,\n function: {\n name: fn.name,\n arguments: ((fn.arguments as string) ?? ''),\n },\n });\n } else if (idx != null && fn?.arguments) {\n accumulator.appendToolCallArgs(idx, fn.arguments as string);\n } else {\n accumulator.addToolCall(call);\n }\n }\n }\n\n if (delta?.reasoning_content != null) {\n reasoningContent += String(delta.reasoning_content);\n }\n\n const finishReason = choices?.[0]?.finish_reason;\n if (finishReason != null) {\n accumulator.finishReason = String(finishReason);\n }\n\n const usage = c.usage as Record<string, unknown> | undefined;\n if (usage != null) {\n const promptDetails = usage.prompt_tokens_details as\n | Record<string, number>\n | undefined;\n const completionDetails = usage.completion_tokens_details as\n | Record<string, number>\n | undefined;\n\n accumulator.setUsage({\n inputTokens: usage.prompt_tokens as number | undefined,\n outputTokens: usage.completion_tokens as number | undefined,\n totalTokens: usage.total_tokens as number | undefined,\n reasoningTokens: completionDetails?.reasoning_tokens,\n cacheReadTokens: promptDetails?.cached_tokens,\n });\n }\n\n yield chunk;\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 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 reasoningTokens: state.reasoningTokens ?? 0,\n cacheReadInputTokens: state.cacheReadTokens ?? 0,\n defaultProvider: 'openai',\n });\n } catch {\n // cost calculation is best-effort\n }\n }\n\n this._trackFn({\n ...contextFields(sessionCtx),\n modelName,\n provider: this._providerName,\n responseContent: state.content,\n latencyMs: accumulator.elapsedMs,\n inputTokens: state.inputTokens,\n outputTokens: state.outputTokens,\n totalTokens: state.totalTokens,\n reasoningTokens: state.reasoningTokens,\n cacheReadInputTokens: state.cacheReadTokens,\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: extractSystemPrompt(params),\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 as ChatMessage[]) {\n if (msg?.role !== 'user') continue;\n const content = msg.content;\n if (typeof content !== 'string' || content.length === 0) 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 messageSource: ctx.parentAgentId ? 'agent' : 'user',\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\nexport class WrappedResponses {\n _original: Record<string, unknown>;\n private _trackFn: TrackFn;\n private _amplitude: AmplitudeLike;\n private _privacyConfig: PrivacyConfig | null;\n private _propagateContext: boolean;\n private _providerName: string;\n\n constructor(\n client: unknown,\n trackFn: TrackFn,\n amplitude: AmplitudeLike,\n privacyConfig: PrivacyConfig | null,\n propagateContext: boolean,\n providerName = 'openai',\n ) {\n const clientObj = client as Record<string, unknown>;\n const responses = (clientObj.responses ?? {}) as Record<string, unknown>;\n this._original = responses;\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 this._providerName = providerName;\n }\n\n async create(\n params: Record<string, unknown>,\n amplitudeOverrides?: ProviderTrackOptions,\n ): Promise<OpenAIResponse | 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.input as unknown,\n ctx,\n amplitudeOverrides?.trackInputMessages ?? true,\n );\n const response = await createFn.call(this._original, requestParams);\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 const resp = response as OpenAIResponse;\n const usage = resp.usage;\n const responseText = extractResponsesText(resp);\n const responseToolCalls = extractResponsesToolCalls(resp);\n const modelName = String(resp.model ?? requestParams.model ?? 'unknown');\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: usage.input_tokens,\n outputTokens: usage.output_tokens,\n reasoningTokens: usage.output_tokens_details?.reasoning_tokens ?? 0,\n defaultProvider: 'openai',\n });\n } catch {\n // cost calculation is best-effort\n }\n }\n\n this._trackFn({\n ...contextFields(ctx),\n modelName,\n provider: this._providerName,\n responseContent: responseText,\n latencyMs,\n inputTokens: usage?.input_tokens,\n outputTokens: usage?.output_tokens,\n totalTokens: usage?.total_tokens,\n reasoningTokens: usage?.output_tokens_details?.reasoning_tokens,\n totalCostUsd: costUsd,\n finishReason: extractResponsesFinishReason(resp),\n toolCalls: responseToolCalls.length > 0 ? responseToolCalls : undefined,\n isStreaming: false,\n systemPrompt: extractResponsesSystemPrompt(requestParams),\n temperature: requestParams.temperature as number | undefined,\n maxOutputTokens: requestParams.max_output_tokens as number | undefined,\n topP: requestParams.top_p as number | undefined,\n });\n\n return response as OpenAIResponse;\n } catch (error) {\n const latencyMs = performance.now() - startTime;\n this._trackFn({\n ...contextFields(ctx),\n modelName: String(requestParams.model ?? 'unknown'),\n provider: this._providerName,\n responseContent: '',\n latencyMs,\n isError: true,\n errorMessage: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n }\n\n async stream(\n params: Record<string, unknown>,\n amplitudeOverrides?: ProviderTrackOptions,\n ): Promise<AsyncIterable<unknown>> {\n const streamFn = this._original.stream as\n | ((...args: unknown[]) => Promise<unknown>)\n | undefined;\n if (typeof streamFn !== 'function') {\n throw new Error('OpenAI SDK does not expose responses.stream');\n }\n const startTime = performance.now();\n const requestParams = this._withContextHeaders(params);\n const ctx = applySessionContext(amplitudeOverrides);\n\n try {\n this._trackInputMessages(\n requestParams.input as unknown,\n ctx,\n amplitudeOverrides?.trackInputMessages ?? true,\n );\n const response = await streamFn.call(this._original, requestParams);\n if (!_isAsyncIterable(response)) {\n throw new Error('OpenAI responses.stream did not return AsyncIterable');\n }\n return this._wrapStream(\n response as AsyncIterable<unknown>,\n requestParams,\n startTime,\n ctx,\n );\n } catch (error) {\n this._trackFn({\n ...contextFields(ctx),\n modelName: String(requestParams.model ?? 'unknown'),\n provider: this._providerName,\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 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\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') accumulator.addContent(delta);\n } else if (type === 'response.completed') {\n const response = e.response as OpenAIResponse | undefined;\n if (response != null) {\n const outputText = extractResponsesText(response);\n if (outputText.length > 0) {\n accumulator.content = outputText;\n }\n const usage = response.usage;\n accumulator.setUsage({\n inputTokens: usage?.input_tokens,\n outputTokens: usage?.output_tokens,\n totalTokens: usage?.total_tokens,\n reasoningTokens: usage?.output_tokens_details?.reasoning_tokens,\n });\n const finishReason = extractResponsesFinishReason(response);\n if (finishReason != null) accumulator.finishReason = finishReason;\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 let costUsd: number | null = null;\n if (state.inputTokens != null && state.outputTokens != null) {\n try {\n costUsd = calculateCost({\n modelName: String(accumulator.model ?? params.model ?? 'unknown'),\n inputTokens: state.inputTokens,\n outputTokens: state.outputTokens,\n reasoningTokens: state.reasoningTokens ?? 0,\n defaultProvider: 'openai',\n });\n } catch {\n // cost calculation is best-effort\n }\n }\n this._trackFn({\n ...contextFields(sessionCtx),\n modelName: String(accumulator.model ?? params.model ?? 'unknown'),\n provider: this._providerName,\n responseContent: state.content,\n latencyMs: accumulator.elapsedMs,\n inputTokens: state.inputTokens,\n outputTokens: state.outputTokens,\n totalTokens: state.totalTokens,\n reasoningTokens: state.reasoningTokens,\n totalCostUsd: costUsd,\n finishReason: state.finishReason,\n providerTtfbMs: state.ttfbMs,\n isStreaming: true,\n isError: state.isError,\n errorMessage: state.errorMessage,\n systemPrompt: extractResponsesSystemPrompt(params),\n temperature: params.temperature as number | undefined,\n maxOutputTokens: params.max_output_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 input: unknown,\n ctx: ProviderTrackOptions,\n shouldTrackInputMessages: boolean,\n ): void {\n if (!shouldTrackInputMessages) return;\n if (ctx.userId == null || ctx.sessionId == null) return;\n for (const text of extractResponsesUserInputs(input)) {\n if (!text) continue;\n trackUserMessage({\n amplitude: this._amplitude,\n userId: ctx.userId,\n messageContent: text,\n sessionId: ctx.sessionId,\n traceId: ctx.traceId,\n turnId: ctx.turnId ?? undefined,\n messageSource: ctx.parentAgentId ? 'agent' : 'user',\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 extractSystemPrompt(\n params: Record<string, unknown>,\n): string | undefined {\n const messages = params.messages as\n | Array<Record<string, unknown>>\n | undefined;\n if (!messages?.length) return undefined;\n const systemMsg = messages.find(\n (m) => m.role === 'system' || m.role === 'developer',\n );\n return systemMsg ? String(systemMsg.content ?? '') : undefined;\n}\n\nfunction extractResponsesSystemPrompt(\n params: Record<string, unknown>,\n): string | undefined {\n const instructions = params.instructions;\n return typeof instructions === 'string' ? instructions : undefined;\n}\n\nfunction extractResponsesFinishReason(\n resp: OpenAIResponse,\n): string | undefined {\n const status = resp.status;\n if (typeof status === 'string' && status.length > 0) return status;\n const out = resp.output?.[0];\n if (out != null && typeof out.status === 'string') return out.status;\n return undefined;\n}\n\nfunction extractResponsesText(resp: OpenAIResponse): string {\n if (typeof resp.output_text === 'string') return resp.output_text;\n const outputs = resp.output ?? [];\n let text = '';\n for (const item of outputs) {\n text += extractOutputItemText(item);\n }\n return text;\n}\n\nfunction extractResponsesToolCalls(\n resp: OpenAIResponse,\n): Array<Record<string, unknown>> {\n const toolCalls: Array<Record<string, unknown>> = [];\n const outputs = resp.output ?? [];\n for (const item of outputs) {\n if (!Array.isArray(item.content)) continue;\n for (const contentItem of item.content) {\n if (\n contentItem?.type === 'tool_call' ||\n contentItem?.type === 'function_call'\n ) {\n toolCalls.push(contentItem as Record<string, unknown>);\n }\n }\n }\n return toolCalls;\n}\n\nfunction extractOutputItemText(item: OpenAIResponseOutputItem): string {\n if (!Array.isArray(item.content)) return '';\n let text = '';\n for (const c of item.content) {\n if (typeof c?.text === 'string') text += c.text;\n }\n return text;\n}\n\nfunction extractResponsesUserInputs(input: unknown): string[] {\n if (typeof input === 'string') return [input];\n if (!Array.isArray(input)) return [];\n\n const result: string[] = [];\n for (const entry of input as OpenAIResponseInput[]) {\n if (typeof entry === 'string') {\n result.push(entry);\n continue;\n }\n const role = entry.role;\n if (role !== 'user') continue;\n const content = entry.content;\n if (typeof content === 'string') {\n result.push(content);\n } else if (Array.isArray(content)) {\n for (const part of content) {\n if (typeof part?.text === 'string') result.push(part.text);\n }\n }\n }\n return result;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"openai.js","names":["_OpenAIModule: Record<string, unknown> | null","clientOpts: Record<string, unknown>","costUsd: number | null","toolCalls: Array<Record<string, unknown>>","result: string[]"],"sources":["../../src/providers/openai.ts"],"sourcesContent":["/**\n * OpenAI provider wrapper with automatic tracking.\n *\n * Wraps the OpenAI client and instruments:\n * - chat.completions.create()\n * - responses.create()\n * to track AI response events via Amplitude.\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 ChatCompletionResponse,\n ChatMessage,\n OpenAIResponse,\n OpenAIResponseInput,\n OpenAIResponseOutputItem,\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('openai');\nexport const OPENAI_AVAILABLE = _resolved != null;\nconst _OpenAIModule: Record<string, unknown> | null = _resolved;\n\nexport { _OpenAIModule };\n\nexport interface OpenAIOptions {\n amplitude: AmplitudeOrAI;\n apiKey?: string;\n baseUrl?: string;\n privacyConfig?: PrivacyConfig | null;\n propagateContext?: boolean;\n /** Pass the `openai` module directly to bypass `tryRequire` (required in bundler environments). */\n openaiModule?: unknown;\n}\n\nexport class OpenAI<\n TClient extends Record<string, unknown> = Record<string, unknown>,\n> extends BaseAIProvider {\n private _client: TClient;\n readonly chat: WrappedChat;\n readonly responses: WrappedResponses;\n private _propagateContext: boolean;\n\n constructor(options: OpenAIOptions) {\n super({\n amplitude: options.amplitude,\n privacyConfig: options.privacyConfig,\n providerName: 'openai',\n });\n\n const mod =\n (options.openaiModule as Record<string, unknown> | null) ?? _OpenAIModule;\n if (mod == null) {\n throw new Error(\n 'openai package is required. Install it with: npm install openai — or pass the module directly via the openaiModule option.',\n );\n }\n\n const OpenAISDK = mod.OpenAI 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 if (options.baseUrl) clientOpts.baseURL = options.baseUrl;\n\n this._client = new OpenAISDK(clientOpts) as TClient;\n this._propagateContext =\n options.propagateContext ?? getDefaultPropagateContext();\n this.chat = new WrappedChat(\n this._client,\n this.trackFn(),\n this._amplitude,\n this._privacyConfig,\n this._propagateContext,\n );\n this.responses = new WrappedResponses(\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 WrappedChat {\n readonly completions: WrappedCompletions;\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 const chat = clientObj.chat as Record<string, unknown>;\n this.completions = new WrappedCompletions(\n chat.completions as Record<string, unknown>,\n trackFn,\n amplitude,\n privacyConfig,\n propagateContext,\n );\n }\n}\n\nexport class WrappedCompletions {\n _original: Record<string, unknown>;\n private _trackFn: TrackFn;\n private _amplitude: AmplitudeLike;\n private _privacyConfig: PrivacyConfig | null;\n private _propagateContext: boolean;\n private _providerName: string;\n\n constructor(\n completions: Record<string, unknown>,\n trackFn: TrackFn,\n amplitude: AmplitudeLike,\n privacyConfig: PrivacyConfig | null,\n propagateContext: boolean,\n providerName = 'openai',\n ) {\n this._original = completions;\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 this._providerName = providerName;\n }\n\n async create(\n params: Record<string, unknown>,\n amplitudeOverrides?: ProviderTrackOptions,\n ): Promise<ChatCompletionResponse | AsyncIterable<unknown>> {\n const createFn = this._original.create as (\n ...args: unknown[]\n ) => Promise<unknown>;\n const startTime = performance.now();\n let requestParams = this._withContextHeaders(params);\n const ctx = applySessionContext(amplitudeOverrides);\n\n if (requestParams.stream === true && requestParams.stream_options == null) {\n requestParams = {\n ...requestParams,\n stream_options: { include_usage: true },\n };\n }\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 ChatCompletionResponse;\n const usage = resp.usage;\n const choice = resp.choices?.[0];\n const modelName = String(resp.model ?? requestParams.model ?? 'unknown');\n const toolCalls = choice?.message?.tool_calls;\n\n const usageExt = usage as Record<string, unknown> | undefined;\n const promptDetails = usageExt?.prompt_tokens_details as\n | Record<string, number>\n | undefined;\n const completionDetails = usageExt?.completion_tokens_details as\n | Record<string, number>\n | undefined;\n const reasoningTokens = completionDetails?.reasoning_tokens;\n const cachedTokens = promptDetails?.cached_tokens;\n\n let costUsd: number | null = null;\n if (usage?.prompt_tokens != null && usage?.completion_tokens != null) {\n try {\n costUsd = calculateCost({\n modelName,\n inputTokens: usage.prompt_tokens,\n outputTokens: usage.completion_tokens,\n reasoningTokens: reasoningTokens ?? 0,\n cacheReadInputTokens: cachedTokens ?? 0,\n defaultProvider: 'openai',\n });\n } catch {\n // cost calculation is best-effort\n }\n }\n\n this._trackFn({\n ...contextFields(ctx),\n modelName,\n provider: this._providerName,\n responseContent: String(choice?.message?.content ?? ''),\n latencyMs,\n inputTokens: usage?.prompt_tokens,\n outputTokens: usage?.completion_tokens,\n totalTokens: usage?.total_tokens,\n reasoningTokens,\n cacheReadInputTokens: cachedTokens,\n totalCostUsd: costUsd,\n finishReason: choice?.finish_reason,\n toolCalls: toolCalls ?? undefined,\n isStreaming: false,\n toolDefinitions: extractToolDefinitions(requestParams),\n systemPrompt: extractSystemPrompt(requestParams),\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 ChatCompletionResponse;\n } catch (error) {\n const latencyMs = performance.now() - startTime;\n this._trackFn({\n ...contextFields(ctx),\n modelName: String(requestParams.model ?? 'unknown'),\n provider: this._providerName,\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 parse(\n params: Record<string, unknown>,\n amplitudeOverrides?: ProviderTrackOptions,\n ): Promise<ChatCompletionResponse | AsyncIterable<unknown>> {\n const parseFn = this._original.parse as\n | ((...args: unknown[]) => Promise<unknown>)\n | undefined;\n if (typeof parseFn !== 'function') {\n throw new Error('OpenAI SDK does not expose chat.completions.parse');\n }\n const originalCreate = this._original.create;\n this._original.create = parseFn;\n try {\n return await this.create(params, amplitudeOverrides);\n } finally {\n this._original.create = originalCreate;\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 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\n | Record<string, unknown>\n | undefined;\n\n if (delta?.content != null) {\n accumulator.addContent(String(delta.content));\n }\n\n const deltaToolCalls = delta?.tool_calls as\n | Array<Record<string, unknown>>\n | undefined;\n if (Array.isArray(deltaToolCalls)) {\n for (const call of deltaToolCalls) {\n const idx = call.index as number | undefined;\n const id = call.id as string | undefined;\n const fn = call.function as Record<string, unknown> | undefined;\n if (idx != null && id && fn?.name != null) {\n accumulator.setToolCallAt(idx, {\n type: 'function',\n id,\n function: {\n name: fn.name,\n arguments: ((fn.arguments as string) ?? ''),\n },\n });\n } else if (idx != null && fn?.arguments) {\n accumulator.appendToolCallArgs(idx, fn.arguments as string);\n } else {\n accumulator.addToolCall(call);\n }\n }\n }\n\n if (delta?.reasoning_content != null) {\n reasoningContent += String(delta.reasoning_content);\n }\n\n const finishReason = choices?.[0]?.finish_reason;\n if (finishReason != null) {\n accumulator.finishReason = String(finishReason);\n }\n\n const usage = c.usage as Record<string, unknown> | undefined;\n if (usage != null) {\n const promptDetails = usage.prompt_tokens_details as\n | Record<string, number>\n | undefined;\n const completionDetails = usage.completion_tokens_details as\n | Record<string, number>\n | undefined;\n\n accumulator.setUsage({\n inputTokens: usage.prompt_tokens as number | undefined,\n outputTokens: usage.completion_tokens as number | undefined,\n totalTokens: usage.total_tokens as number | undefined,\n reasoningTokens: completionDetails?.reasoning_tokens,\n cacheReadTokens: promptDetails?.cached_tokens,\n });\n }\n\n yield chunk;\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 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 reasoningTokens: state.reasoningTokens ?? 0,\n cacheReadInputTokens: state.cacheReadTokens ?? 0,\n defaultProvider: 'openai',\n });\n } catch {\n // cost calculation is best-effort\n }\n }\n\n this._trackFn({\n ...contextFields(sessionCtx),\n modelName,\n provider: this._providerName,\n responseContent: state.content,\n latencyMs: accumulator.elapsedMs,\n inputTokens: state.inputTokens,\n outputTokens: state.outputTokens,\n totalTokens: state.totalTokens,\n reasoningTokens: state.reasoningTokens,\n cacheReadInputTokens: state.cacheReadTokens,\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 toolDefinitions: extractToolDefinitions(params),\n systemPrompt: extractSystemPrompt(params),\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 as ChatMessage[]) {\n if (msg?.role !== 'user') continue;\n const content = msg.content;\n if (typeof content !== 'string' || content.length === 0) 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 messageSource: ctx.parentAgentId ? 'agent' : 'user',\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\nexport class WrappedResponses {\n _original: Record<string, unknown>;\n private _trackFn: TrackFn;\n private _amplitude: AmplitudeLike;\n private _privacyConfig: PrivacyConfig | null;\n private _propagateContext: boolean;\n private _providerName: string;\n\n constructor(\n client: unknown,\n trackFn: TrackFn,\n amplitude: AmplitudeLike,\n privacyConfig: PrivacyConfig | null,\n propagateContext: boolean,\n providerName = 'openai',\n ) {\n const clientObj = client as Record<string, unknown>;\n const responses = (clientObj.responses ?? {}) as Record<string, unknown>;\n this._original = responses;\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 this._providerName = providerName;\n }\n\n async create(\n params: Record<string, unknown>,\n amplitudeOverrides?: ProviderTrackOptions,\n ): Promise<OpenAIResponse | 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.input as unknown,\n ctx,\n amplitudeOverrides?.trackInputMessages ?? true,\n );\n const response = await createFn.call(this._original, requestParams);\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 const resp = response as OpenAIResponse;\n const usage = resp.usage;\n const responseText = extractResponsesText(resp);\n const responseToolCalls = extractResponsesToolCalls(resp);\n const modelName = String(resp.model ?? requestParams.model ?? 'unknown');\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: usage.input_tokens,\n outputTokens: usage.output_tokens,\n reasoningTokens: usage.output_tokens_details?.reasoning_tokens ?? 0,\n defaultProvider: 'openai',\n });\n } catch {\n // cost calculation is best-effort\n }\n }\n\n this._trackFn({\n ...contextFields(ctx),\n modelName,\n provider: this._providerName,\n responseContent: responseText,\n latencyMs,\n inputTokens: usage?.input_tokens,\n outputTokens: usage?.output_tokens,\n totalTokens: usage?.total_tokens,\n reasoningTokens: usage?.output_tokens_details?.reasoning_tokens,\n totalCostUsd: costUsd,\n finishReason: extractResponsesFinishReason(resp),\n toolCalls: responseToolCalls.length > 0 ? responseToolCalls : undefined,\n isStreaming: false,\n toolDefinitions: extractResponsesToolDefinitions(requestParams),\n systemPrompt: extractResponsesSystemPrompt(requestParams),\n temperature: requestParams.temperature as number | undefined,\n maxOutputTokens: requestParams.max_output_tokens as number | undefined,\n topP: requestParams.top_p as number | undefined,\n });\n\n return response as OpenAIResponse;\n } catch (error) {\n const latencyMs = performance.now() - startTime;\n this._trackFn({\n ...contextFields(ctx),\n modelName: String(requestParams.model ?? 'unknown'),\n provider: this._providerName,\n responseContent: '',\n latencyMs,\n isError: true,\n errorMessage: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n }\n\n async stream(\n params: Record<string, unknown>,\n amplitudeOverrides?: ProviderTrackOptions,\n ): Promise<AsyncIterable<unknown>> {\n const streamFn = this._original.stream as\n | ((...args: unknown[]) => Promise<unknown>)\n | undefined;\n if (typeof streamFn !== 'function') {\n throw new Error('OpenAI SDK does not expose responses.stream');\n }\n const startTime = performance.now();\n const requestParams = this._withContextHeaders(params);\n const ctx = applySessionContext(amplitudeOverrides);\n\n try {\n this._trackInputMessages(\n requestParams.input as unknown,\n ctx,\n amplitudeOverrides?.trackInputMessages ?? true,\n );\n const response = await streamFn.call(this._original, requestParams);\n if (!_isAsyncIterable(response)) {\n throw new Error('OpenAI responses.stream did not return AsyncIterable');\n }\n return this._wrapStream(\n response as AsyncIterable<unknown>,\n requestParams,\n startTime,\n ctx,\n );\n } catch (error) {\n this._trackFn({\n ...contextFields(ctx),\n modelName: String(requestParams.model ?? 'unknown'),\n provider: this._providerName,\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 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\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') accumulator.addContent(delta);\n } else if (type === 'response.completed') {\n const response = e.response as OpenAIResponse | undefined;\n if (response != null) {\n const outputText = extractResponsesText(response);\n if (outputText.length > 0) {\n accumulator.content = outputText;\n }\n const usage = response.usage;\n accumulator.setUsage({\n inputTokens: usage?.input_tokens,\n outputTokens: usage?.output_tokens,\n totalTokens: usage?.total_tokens,\n reasoningTokens: usage?.output_tokens_details?.reasoning_tokens,\n });\n const finishReason = extractResponsesFinishReason(response);\n if (finishReason != null) accumulator.finishReason = finishReason;\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 let costUsd: number | null = null;\n if (state.inputTokens != null && state.outputTokens != null) {\n try {\n costUsd = calculateCost({\n modelName: String(accumulator.model ?? params.model ?? 'unknown'),\n inputTokens: state.inputTokens,\n outputTokens: state.outputTokens,\n reasoningTokens: state.reasoningTokens ?? 0,\n defaultProvider: 'openai',\n });\n } catch {\n // cost calculation is best-effort\n }\n }\n this._trackFn({\n ...contextFields(sessionCtx),\n modelName: String(accumulator.model ?? params.model ?? 'unknown'),\n provider: this._providerName,\n responseContent: state.content,\n latencyMs: accumulator.elapsedMs,\n inputTokens: state.inputTokens,\n outputTokens: state.outputTokens,\n totalTokens: state.totalTokens,\n reasoningTokens: state.reasoningTokens,\n totalCostUsd: costUsd,\n finishReason: state.finishReason,\n providerTtfbMs: state.ttfbMs,\n isStreaming: true,\n isError: state.isError,\n errorMessage: state.errorMessage,\n toolDefinitions: extractResponsesToolDefinitions(params),\n systemPrompt: extractResponsesSystemPrompt(params),\n temperature: params.temperature as number | undefined,\n maxOutputTokens: params.max_output_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 input: unknown,\n ctx: ProviderTrackOptions,\n shouldTrackInputMessages: boolean,\n ): void {\n if (!shouldTrackInputMessages) return;\n if (ctx.userId == null || ctx.sessionId == null) return;\n for (const text of extractResponsesUserInputs(input)) {\n if (!text) continue;\n trackUserMessage({\n amplitude: this._amplitude,\n userId: ctx.userId,\n messageContent: text,\n sessionId: ctx.sessionId,\n traceId: ctx.traceId,\n turnId: ctx.turnId ?? undefined,\n messageSource: ctx.parentAgentId ? 'agent' : 'user',\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 extractSystemPrompt(\n params: Record<string, unknown>,\n): string | undefined {\n const messages = params.messages as\n | Array<Record<string, unknown>>\n | undefined;\n if (!messages?.length) return undefined;\n const systemMsg = messages.find(\n (m) => m.role === 'system' || m.role === 'developer',\n );\n return systemMsg ? String(systemMsg.content ?? '') : undefined;\n}\n\nfunction extractResponsesSystemPrompt(\n params: Record<string, unknown>,\n): string | undefined {\n const instructions = params.instructions;\n return typeof instructions === 'string' ? instructions : undefined;\n}\n\nfunction extractResponsesFinishReason(\n resp: OpenAIResponse,\n): string | undefined {\n const status = resp.status;\n if (typeof status === 'string' && status.length > 0) return status;\n const out = resp.output?.[0];\n if (out != null && typeof out.status === 'string') return out.status;\n return undefined;\n}\n\nfunction extractResponsesText(resp: OpenAIResponse): string {\n if (typeof resp.output_text === 'string') return resp.output_text;\n const outputs = resp.output ?? [];\n let text = '';\n for (const item of outputs) {\n text += extractOutputItemText(item);\n }\n return text;\n}\n\nfunction extractResponsesToolCalls(\n resp: OpenAIResponse,\n): Array<Record<string, unknown>> {\n const toolCalls: Array<Record<string, unknown>> = [];\n const outputs = resp.output ?? [];\n for (const item of outputs) {\n if (!Array.isArray(item.content)) continue;\n for (const contentItem of item.content) {\n if (\n contentItem?.type === 'tool_call' ||\n contentItem?.type === 'function_call'\n ) {\n toolCalls.push(contentItem as Record<string, unknown>);\n }\n }\n }\n return toolCalls;\n}\n\nfunction extractOutputItemText(item: OpenAIResponseOutputItem): string {\n if (!Array.isArray(item.content)) return '';\n let text = '';\n for (const c of item.content) {\n if (typeof c?.text === 'string') text += c.text;\n }\n return text;\n}\n\nexport function extractToolDefinitions(\n params: Record<string, unknown>,\n): Array<Record<string, unknown>> | undefined {\n const tools = params.tools;\n return Array.isArray(tools) && tools.length > 0\n ? (tools as Array<Record<string, unknown>>)\n : undefined;\n}\n\nfunction extractResponsesToolDefinitions(\n params: Record<string, unknown>,\n): Array<Record<string, unknown>> | undefined {\n const tools = params.tools;\n return Array.isArray(tools) && tools.length > 0\n ? (tools as Array<Record<string, unknown>>)\n : undefined;\n}\n\nfunction extractResponsesUserInputs(input: unknown): string[] {\n if (typeof input === 'string') return [input];\n if (!Array.isArray(input)) return [];\n\n const result: string[] = [];\n for (const entry of input as OpenAIResponseInput[]) {\n if (typeof entry === 'string') {\n result.push(entry);\n continue;\n }\n const role = entry.role;\n if (role !== 'user') continue;\n const content = entry.content;\n if (typeof content === 'string') {\n result.push(content);\n } else if (Array.isArray(content)) {\n for (const part of content) {\n if (typeof part?.text === 'string') result.push(part.text);\n }\n }\n }\n return result;\n}\n"],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -377,6 +377,7 @@ interface TrackCallOptions {
377
377
  finishReason?: string | null;
378
378
  toolCalls?: Array<ToolCallShape | Record<string, unknown>> | null;
379
379
  reasoningContent?: string | null;
380
+ toolDefinitions?: Array<Record<string, unknown>> | null;
380
381
  systemPrompt?: string | null;
381
382
  temperature?: number | null;
382
383
  maxOutputTokens?: number | null;