@amplitude/ai 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/AGENTS.md +3 -1
  2. package/README.md +44 -15
  3. package/dist/client.d.ts.map +1 -1
  4. package/dist/client.js +2 -1
  5. package/dist/client.js.map +1 -1
  6. package/dist/index.d.ts +2 -2
  7. package/dist/index.js +2 -2
  8. package/dist/integrations/anthropic-tools.js +2 -1
  9. package/dist/integrations/anthropic-tools.js.map +1 -1
  10. package/dist/integrations/langchain.d.ts.map +1 -1
  11. package/dist/integrations/langchain.js +35 -5
  12. package/dist/integrations/langchain.js.map +1 -1
  13. package/dist/integrations/llamaindex.d.ts.map +1 -1
  14. package/dist/integrations/llamaindex.js +27 -4
  15. package/dist/integrations/llamaindex.js.map +1 -1
  16. package/dist/integrations/openai-agents.js +5 -1
  17. package/dist/integrations/openai-agents.js.map +1 -1
  18. package/dist/integrations/opentelemetry.d.ts.map +1 -1
  19. package/dist/integrations/opentelemetry.js +2 -1
  20. package/dist/integrations/opentelemetry.js.map +1 -1
  21. package/dist/mcp/patterns.d.ts.map +1 -1
  22. package/dist/mcp/patterns.js +6 -0
  23. package/dist/mcp/patterns.js.map +1 -1
  24. package/dist/mcp/server.d.ts.map +1 -1
  25. package/dist/mcp/validate-file.js +1 -1
  26. package/dist/mcp/validate-file.js.map +1 -1
  27. package/dist/patching.d.ts.map +1 -1
  28. package/dist/patching.js +7 -1
  29. package/dist/patching.js.map +1 -1
  30. package/dist/providers/anthropic.d.ts.map +1 -1
  31. package/dist/providers/anthropic.js +11 -20
  32. package/dist/providers/anthropic.js.map +1 -1
  33. package/dist/providers/azure-openai.d.ts +3 -3
  34. package/dist/providers/azure-openai.d.ts.map +1 -1
  35. package/dist/providers/azure-openai.js +2 -2
  36. package/dist/providers/azure-openai.js.map +1 -1
  37. package/dist/providers/base.d.ts +11 -2
  38. package/dist/providers/base.d.ts.map +1 -1
  39. package/dist/providers/base.js +32 -14
  40. package/dist/providers/base.js.map +1 -1
  41. package/dist/providers/bedrock.d.ts.map +1 -1
  42. package/dist/providers/bedrock.js +16 -29
  43. package/dist/providers/bedrock.js.map +1 -1
  44. package/dist/providers/gemini.d.ts.map +1 -1
  45. package/dist/providers/gemini.js +12 -29
  46. package/dist/providers/gemini.js.map +1 -1
  47. package/dist/providers/mistral.d.ts.map +1 -1
  48. package/dist/providers/mistral.js +24 -26
  49. package/dist/providers/mistral.js.map +1 -1
  50. package/dist/providers/openai.d.ts.map +1 -1
  51. package/dist/providers/openai.js +37 -45
  52. package/dist/providers/openai.js.map +1 -1
  53. package/dist/session.d.ts +23 -0
  54. package/dist/session.d.ts.map +1 -1
  55. package/dist/session.js +44 -1
  56. package/dist/session.js.map +1 -1
  57. package/dist/types.d.ts +3 -0
  58. package/dist/types.d.ts.map +1 -1
  59. package/dist/types.js.map +1 -1
  60. package/dist/utils/costs.d.ts +46 -5
  61. package/dist/utils/costs.d.ts.map +1 -1
  62. package/dist/utils/costs.js +115 -26
  63. package/dist/utils/costs.js.map +1 -1
  64. package/dist/utils/providers.d.ts +6 -1
  65. package/dist/utils/providers.d.ts.map +1 -1
  66. package/dist/utils/providers.js +9 -3
  67. package/dist/utils/providers.js.map +1 -1
  68. package/dist/utils/streaming.d.ts +2 -0
  69. package/dist/utils/streaming.d.ts.map +1 -1
  70. package/dist/utils/streaming.js +10 -0
  71. package/dist/utils/streaming.js.map +1 -1
  72. package/llms-full.txt +17 -1
  73. package/llms.txt +1 -1
  74. package/mcp.schema.json +1 -1
  75. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  import { tryRequire } from "../utils/resolve-module.js";
2
2
  import { calculateCost } from "../utils/costs.js";
3
3
  import { StreamingAccumulator } from "../utils/streaming.js";
4
- import { BaseAIProvider, applySessionContext } from "./base.js";
4
+ import { BaseAIProvider, applySessionContext, contextFields } from "./base.js";
5
5
 
6
6
  //#region src/providers/mistral.ts
7
7
  const _resolved = tryRequire("@mistralai/mistralai");
@@ -54,20 +54,16 @@ var WrappedChat = class {
54
54
  costUsd = calculateCost({
55
55
  modelName,
56
56
  inputTokens: usage.prompt_tokens,
57
- outputTokens: usage.completion_tokens
57
+ outputTokens: usage.completion_tokens,
58
+ defaultProvider: "mistral"
58
59
  });
59
60
  } catch {}
60
61
  this._trackFn({
61
- userId: ctx.userId ?? "unknown",
62
+ ...contextFields(ctx),
62
63
  modelName,
63
64
  provider: "mistral",
64
65
  responseContent: extractMistralContent(choice?.message?.content),
65
66
  latencyMs,
66
- sessionId: ctx.sessionId,
67
- traceId: ctx.traceId,
68
- turnId: ctx.turnId ?? void 0,
69
- agentId: ctx.agentId,
70
- env: ctx.env,
71
67
  inputTokens: usage?.prompt_tokens,
72
68
  outputTokens: usage?.completion_tokens,
73
69
  totalTokens: usage?.total_tokens,
@@ -84,15 +80,11 @@ var WrappedChat = class {
84
80
  } catch (error) {
85
81
  const latencyMs = performance.now() - startTime;
86
82
  this._trackFn({
87
- userId: ctx.userId ?? "unknown",
83
+ ...contextFields(ctx),
88
84
  modelName: String(params.model ?? "unknown"),
89
85
  provider: "mistral",
90
86
  responseContent: "",
91
87
  latencyMs,
92
- sessionId: ctx.sessionId,
93
- traceId: ctx.traceId,
94
- agentId: ctx.agentId,
95
- env: ctx.env,
96
88
  isError: true,
97
89
  errorMessage: error instanceof Error ? error.message : String(error)
98
90
  });
@@ -111,15 +103,11 @@ var WrappedChat = class {
111
103
  return this._wrapStream(response, params, ctx);
112
104
  } catch (error) {
113
105
  this._trackFn({
114
- userId: ctx.userId ?? "unknown",
106
+ ...contextFields(ctx),
115
107
  modelName: String(params.model ?? "unknown"),
116
108
  provider: "mistral",
117
109
  responseContent: "",
118
110
  latencyMs: performance.now() - startTime,
119
- sessionId: ctx.sessionId,
120
- traceId: ctx.traceId,
121
- agentId: ctx.agentId,
122
- env: ctx.env,
123
111
  isError: true,
124
112
  errorMessage: error instanceof Error ? error.message : String(error),
125
113
  isStreaming: true
@@ -139,7 +127,21 @@ var WrappedChat = class {
139
127
  const content = delta?.content ?? message?.content;
140
128
  if (typeof content === "string" && content.length > 0) accumulator.addContent(content);
141
129
  const toolCalls = delta?.tool_calls ?? message?.tool_calls;
142
- if (Array.isArray(toolCalls)) for (const call of toolCalls) accumulator.addToolCall(call);
130
+ if (Array.isArray(toolCalls)) for (const call of toolCalls) {
131
+ const idx = call.index;
132
+ const id = call.id;
133
+ const fn = call.function;
134
+ if (idx != null && id && fn?.name != null) accumulator.setToolCallAt(idx, {
135
+ type: "function",
136
+ id,
137
+ function: {
138
+ name: fn.name,
139
+ arguments: fn.arguments ?? ""
140
+ }
141
+ });
142
+ else if (idx != null && fn?.arguments) accumulator.appendToolCallArgs(idx, fn.arguments);
143
+ else accumulator.addToolCall(call);
144
+ }
143
145
  const finishReason = choices?.[0]?.finish_reason;
144
146
  if (finishReason != null) accumulator.finishReason = String(finishReason);
145
147
  const usage = c.usage;
@@ -161,20 +163,16 @@ var WrappedChat = class {
161
163
  costUsd = calculateCost({
162
164
  modelName,
163
165
  inputTokens: state.inputTokens,
164
- outputTokens: state.outputTokens
166
+ outputTokens: state.outputTokens,
167
+ defaultProvider: "mistral"
165
168
  });
166
169
  } catch {}
167
170
  this._trackFn({
168
- userId: sessionCtx.userId ?? "unknown",
171
+ ...contextFields(sessionCtx),
169
172
  modelName,
170
173
  provider: "mistral",
171
174
  responseContent: state.content,
172
175
  latencyMs: accumulator.elapsedMs,
173
- sessionId: sessionCtx.sessionId,
174
- traceId: sessionCtx.traceId,
175
- turnId: sessionCtx.turnId ?? void 0,
176
- agentId: sessionCtx.agentId,
177
- env: sessionCtx.env,
178
176
  inputTokens: state.inputTokens,
179
177
  outputTokens: state.outputTokens,
180
178
  totalTokens: state.totalTokens,
@@ -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 } 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 });\n } catch {\n // cost calculation is best-effort\n }\n }\n\n this._trackFn({\n userId: ctx.userId ?? 'unknown',\n modelName,\n provider: 'mistral',\n responseContent: extractMistralContent(choice?.message?.content),\n latencyMs,\n sessionId: ctx.sessionId,\n traceId: ctx.traceId,\n turnId: ctx.turnId ?? undefined,\n agentId: ctx.agentId,\n env: ctx.env,\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 userId: ctx.userId ?? 'unknown',\n modelName: String(params.model ?? 'unknown'),\n provider: 'mistral',\n responseContent: '',\n latencyMs,\n sessionId: ctx.sessionId,\n traceId: ctx.traceId,\n agentId: ctx.agentId,\n env: ctx.env,\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 userId: ctx.userId ?? 'unknown',\n modelName: String(params.model ?? 'unknown'),\n provider: 'mistral',\n responseContent: '',\n latencyMs: performance.now() - startTime,\n sessionId: ctx.sessionId,\n traceId: ctx.traceId,\n agentId: ctx.agentId,\n env: ctx.env,\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) accumulator.addToolCall(call);\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 });\n } catch {\n // cost calculation is best-effort\n }\n }\n\n this._trackFn({\n userId: sessionCtx.userId ?? 'unknown',\n modelName,\n provider: 'mistral',\n responseContent: state.content,\n latencyMs: accumulator.elapsedMs,\n sessionId: sessionCtx.sessionId,\n traceId: sessionCtx.traceId,\n turnId: sessionCtx.turnId ?? undefined,\n agentId: sessionCtx.agentId,\n env: sessionCtx.env,\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 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 +1 @@
1
- {"version":3,"file":"openai.d.ts","names":[],"sources":["../../src/providers/openai.ts"],"sourcesContent":[],"mappings":";;;;;;AAmDiB,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;;AAkHoB,cAhJZ,kBAAA,CAgJY;EACZ,SAAA,EAhJA,MAgJA,CAAA,MAAA,EAAA,OAAA,CAAA;EAAyB,QAAA,QAAA;EAAjC,QAAA,UAAA;EAAO,QAAA,cAAA;EAgLC,QAAA,iBAAgB;EAChB,QAAA,aAAA;EASA,WAAA,CAAA,WAAA,EAlUI,MAkUJ,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAjUA,OAiUA,EAAA,SAAA,EAhUE,aAgUF,EAAA,aAAA,EA/TM,aA+TN,GAAA,IAAA,EAAA,gBAAA,EAAA,OAAA,EAAA,YAAA,CAAA,EAAA,MAAA;EACE,MAAA,CAAA,MAAA,EAhTH,MAgTG,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA,kBAAA,CAAA,EA/SU,oBA+SV,CAAA,EA9SV,OA8SU,CA9SF,sBA8SE,GA9SuB,aA8SvB,CAAA,OAAA,CAAA,CAAA;EACI,KAAA,CAAA,MAAA,EA9LP,MA8LO,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA,kBAAA,CAAA,EA7LM,oBA6LN,CAAA,EA5Ld,OA4Lc,CA5LN,sBA4LM,GA5LmB,aA4LnB,CAAA,OAAA,CAAA,CAAA;EAkBP,QAAA,WAAA;EACa,QAAA,mBAAA;EACZ,QAAA,mBAAA;;AAAR,cAhCQ,gBAAA,CAgCR;EA2FO,SAAA,EA1HC,MA0HD,CAAA,MAAA,EAAA,OAAA,CAAA;EACa,QAAA,QAAA;EACZ,QAAA,UAAA;EAAR,QAAA,cAAA;EAAO,QAAA,iBAAA;EAoLI,QAAA,aAAA;wCAvSH,oBACE,8BACI;iBAkBP,8CACa,uBACpB,QAAQ,iBAAiB;iBA2FlB,8CACa,uBACpB,QAAQ;;;;;iBAoLG,mBAAA,SACN"}
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;EA+LC,QAAA,iBAAgB;EAChB,QAAA,aAAA;EASA,WAAA,CAAA,WAAA,EAzUI,MAyUJ,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAxUA,OAwUA,EAAA,SAAA,EAvUE,aAuUF,EAAA,aAAA,EAtUM,aAsUN,GAAA,IAAA,EAAA,gBAAA,EAAA,OAAA,EAAA,YAAA,CAAA,EAAA,MAAA;EACE,MAAA,CAAA,MAAA,EAvTH,MAuTG,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA,kBAAA,CAAA,EAtTU,oBAsTV,CAAA,EArTV,OAqTU,CArTF,sBAqTE,GArTuB,aAqTvB,CAAA,OAAA,CAAA,CAAA;EACI,KAAA,CAAA,MAAA,EA7MP,MA6MO,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA,kBAAA,CAAA,EA5MM,oBA4MN,CAAA,EA3Md,OA2Mc,CA3MN,sBA2MM,GA3MmB,aA2MnB,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;EA+KI,QAAA,aAAA;wCA1RH,oBACE,8BACI;iBAkBP,8CACa,uBACpB,QAAQ,iBAAiB;iBAmFlB,8CACa,uBACpB,QAAQ;;;;;iBA+KG,mBAAA,SACN"}
@@ -3,7 +3,7 @@ import { getDefaultPropagateContext, injectContext } from "../propagation.js";
3
3
  import { tryRequire } from "../utils/resolve-module.js";
4
4
  import { calculateCost } from "../utils/costs.js";
5
5
  import { StreamingAccumulator } from "../utils/streaming.js";
6
- import { BaseAIProvider, applySessionContext } from "./base.js";
6
+ import { BaseAIProvider, applySessionContext, contextFields } from "./base.js";
7
7
 
8
8
  //#region src/providers/openai.ts
9
9
  const _resolved = tryRequire("openai");
@@ -87,20 +87,16 @@ var WrappedCompletions = class {
87
87
  inputTokens: usage.prompt_tokens,
88
88
  outputTokens: usage.completion_tokens,
89
89
  reasoningTokens: reasoningTokens ?? 0,
90
- cacheReadInputTokens: cachedTokens ?? 0
90
+ cacheReadInputTokens: cachedTokens ?? 0,
91
+ defaultProvider: "openai"
91
92
  });
92
93
  } catch {}
93
94
  this._trackFn({
94
- userId: ctx.userId ?? "unknown",
95
+ ...contextFields(ctx),
95
96
  modelName,
96
97
  provider: this._providerName,
97
98
  responseContent: String(choice?.message?.content ?? ""),
98
99
  latencyMs,
99
- sessionId: ctx.sessionId,
100
- traceId: ctx.traceId,
101
- turnId: ctx.turnId ?? void 0,
102
- agentId: ctx.agentId,
103
- env: ctx.env,
104
100
  inputTokens: usage?.prompt_tokens,
105
101
  outputTokens: usage?.completion_tokens,
106
102
  totalTokens: usage?.total_tokens,
@@ -119,15 +115,11 @@ var WrappedCompletions = class {
119
115
  } catch (error) {
120
116
  const latencyMs = performance.now() - startTime;
121
117
  this._trackFn({
122
- userId: ctx.userId ?? "unknown",
118
+ ...contextFields(ctx),
123
119
  modelName: String(requestParams.model ?? "unknown"),
124
120
  provider: this._providerName,
125
121
  responseContent: "",
126
122
  latencyMs,
127
- sessionId: ctx.sessionId,
128
- traceId: ctx.traceId,
129
- agentId: ctx.agentId,
130
- env: ctx.env,
131
123
  isError: true,
132
124
  errorMessage: error instanceof Error ? error.message : String(error)
133
125
  });
@@ -156,7 +148,21 @@ var WrappedCompletions = class {
156
148
  const delta = choices?.[0]?.delta;
157
149
  if (delta?.content != null) accumulator.addContent(String(delta.content));
158
150
  const deltaToolCalls = delta?.tool_calls;
159
- if (Array.isArray(deltaToolCalls)) for (const call of deltaToolCalls) accumulator.addToolCall(call);
151
+ if (Array.isArray(deltaToolCalls)) for (const call of deltaToolCalls) {
152
+ const idx = call.index;
153
+ const id = call.id;
154
+ const fn = call.function;
155
+ if (idx != null && id && fn?.name != null) accumulator.setToolCallAt(idx, {
156
+ type: "function",
157
+ id,
158
+ function: {
159
+ name: fn.name,
160
+ arguments: fn.arguments ?? ""
161
+ }
162
+ });
163
+ else if (idx != null && fn?.arguments) accumulator.appendToolCallArgs(idx, fn.arguments);
164
+ else accumulator.addToolCall(call);
165
+ }
160
166
  if (delta?.reasoning_content != null) reasoningContent += String(delta.reasoning_content);
161
167
  const finishReason = choices?.[0]?.finish_reason;
162
168
  if (finishReason != null) accumulator.finishReason = String(finishReason);
@@ -187,20 +193,16 @@ var WrappedCompletions = class {
187
193
  inputTokens: state.inputTokens,
188
194
  outputTokens: state.outputTokens,
189
195
  reasoningTokens: state.reasoningTokens ?? 0,
190
- cacheReadInputTokens: state.cacheReadTokens ?? 0
196
+ cacheReadInputTokens: state.cacheReadTokens ?? 0,
197
+ defaultProvider: "openai"
191
198
  });
192
199
  } catch {}
193
200
  this._trackFn({
194
- userId: sessionCtx.userId ?? "unknown",
201
+ ...contextFields(sessionCtx),
195
202
  modelName,
196
203
  provider: this._providerName,
197
204
  responseContent: state.content,
198
205
  latencyMs: accumulator.elapsedMs,
199
- sessionId: sessionCtx.sessionId,
200
- traceId: sessionCtx.traceId,
201
- turnId: sessionCtx.turnId ?? void 0,
202
- agentId: sessionCtx.agentId,
203
- env: sessionCtx.env,
204
206
  inputTokens: state.inputTokens,
205
207
  outputTokens: state.outputTokens,
206
208
  totalTokens: state.totalTokens,
@@ -247,8 +249,11 @@ var WrappedCompletions = class {
247
249
  agentId: ctx.agentId,
248
250
  parentAgentId: ctx.parentAgentId,
249
251
  customerOrgId: ctx.customerOrgId,
252
+ agentVersion: ctx.agentVersion,
253
+ context: ctx.context,
250
254
  env: ctx.env,
251
255
  groups: ctx.groups,
256
+ eventProperties: ctx.eventProperties,
252
257
  privacyConfig: this._privacyConfig
253
258
  });
254
259
  }
@@ -290,20 +295,16 @@ var WrappedResponses = class {
290
295
  modelName,
291
296
  inputTokens: usage.input_tokens,
292
297
  outputTokens: usage.output_tokens,
293
- reasoningTokens: usage.output_tokens_details?.reasoning_tokens ?? 0
298
+ reasoningTokens: usage.output_tokens_details?.reasoning_tokens ?? 0,
299
+ defaultProvider: "openai"
294
300
  });
295
301
  } catch {}
296
302
  this._trackFn({
297
- userId: ctx.userId ?? "unknown",
303
+ ...contextFields(ctx),
298
304
  modelName,
299
305
  provider: this._providerName,
300
306
  responseContent: responseText,
301
307
  latencyMs,
302
- sessionId: ctx.sessionId,
303
- traceId: ctx.traceId,
304
- turnId: ctx.turnId ?? void 0,
305
- agentId: ctx.agentId,
306
- env: ctx.env,
307
308
  inputTokens: usage?.input_tokens,
308
309
  outputTokens: usage?.output_tokens,
309
310
  totalTokens: usage?.total_tokens,
@@ -321,15 +322,11 @@ var WrappedResponses = class {
321
322
  } catch (error) {
322
323
  const latencyMs = performance.now() - startTime;
323
324
  this._trackFn({
324
- userId: ctx.userId ?? "unknown",
325
+ ...contextFields(ctx),
325
326
  modelName: String(requestParams.model ?? "unknown"),
326
327
  provider: this._providerName,
327
328
  responseContent: "",
328
329
  latencyMs,
329
- sessionId: ctx.sessionId,
330
- traceId: ctx.traceId,
331
- agentId: ctx.agentId,
332
- env: ctx.env,
333
330
  isError: true,
334
331
  errorMessage: error instanceof Error ? error.message : String(error)
335
332
  });
@@ -349,15 +346,11 @@ var WrappedResponses = class {
349
346
  return this._wrapStream(response, requestParams, startTime, ctx);
350
347
  } catch (error) {
351
348
  this._trackFn({
352
- userId: ctx.userId ?? "unknown",
349
+ ...contextFields(ctx),
353
350
  modelName: String(requestParams.model ?? "unknown"),
354
351
  provider: this._providerName,
355
352
  responseContent: "",
356
353
  latencyMs: performance.now() - startTime,
357
- sessionId: ctx.sessionId,
358
- traceId: ctx.traceId,
359
- agentId: ctx.agentId,
360
- env: ctx.env,
361
354
  isError: true,
362
355
  errorMessage: error instanceof Error ? error.message : String(error),
363
356
  isStreaming: true
@@ -404,20 +397,16 @@ var WrappedResponses = class {
404
397
  modelName: String(accumulator.model ?? params.model ?? "unknown"),
405
398
  inputTokens: state.inputTokens,
406
399
  outputTokens: state.outputTokens,
407
- reasoningTokens: state.reasoningTokens ?? 0
400
+ reasoningTokens: state.reasoningTokens ?? 0,
401
+ defaultProvider: "openai"
408
402
  });
409
403
  } catch {}
410
404
  this._trackFn({
411
- userId: sessionCtx.userId ?? "unknown",
405
+ ...contextFields(sessionCtx),
412
406
  modelName: String(accumulator.model ?? params.model ?? "unknown"),
413
407
  provider: this._providerName,
414
408
  responseContent: state.content,
415
409
  latencyMs: accumulator.elapsedMs,
416
- sessionId: sessionCtx.sessionId,
417
- traceId: sessionCtx.traceId,
418
- turnId: sessionCtx.turnId ?? void 0,
419
- agentId: sessionCtx.agentId,
420
- env: sessionCtx.env,
421
410
  inputTokens: state.inputTokens,
422
411
  outputTokens: state.outputTokens,
423
412
  totalTokens: state.totalTokens,
@@ -458,8 +447,11 @@ var WrappedResponses = class {
458
447
  agentId: ctx.agentId,
459
448
  parentAgentId: ctx.parentAgentId,
460
449
  customerOrgId: ctx.customerOrgId,
450
+ agentVersion: ctx.agentVersion,
451
+ context: ctx.context,
461
452
  env: ctx.env,
462
453
  groups: ctx.groups,
454
+ eventProperties: ctx.eventProperties,
463
455
  privacyConfig: this._privacyConfig
464
456
  });
465
457
  }
@@ -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 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 });\n } catch {\n // cost calculation is best-effort\n }\n }\n\n this._trackFn({\n userId: ctx.userId ?? 'unknown',\n modelName,\n provider: this._providerName,\n responseContent: String(choice?.message?.content ?? ''),\n latencyMs,\n sessionId: ctx.sessionId,\n traceId: ctx.traceId,\n turnId: ctx.turnId ?? undefined,\n agentId: ctx.agentId,\n env: ctx.env,\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 userId: ctx.userId ?? 'unknown',\n modelName: String(requestParams.model ?? 'unknown'),\n provider: this._providerName,\n responseContent: '',\n latencyMs,\n sessionId: ctx.sessionId,\n traceId: ctx.traceId,\n agentId: ctx.agentId,\n env: ctx.env,\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 accumulator.addToolCall(call);\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 });\n } catch {\n // cost calculation is best-effort\n }\n }\n\n this._trackFn({\n userId: sessionCtx.userId ?? 'unknown',\n modelName,\n provider: this._providerName,\n responseContent: state.content,\n latencyMs: accumulator.elapsedMs,\n sessionId: sessionCtx.sessionId,\n traceId: sessionCtx.traceId,\n turnId: sessionCtx.turnId ?? undefined,\n agentId: sessionCtx.agentId,\n env: sessionCtx.env,\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 agentId: ctx.agentId,\n parentAgentId: ctx.parentAgentId,\n customerOrgId: ctx.customerOrgId,\n env: ctx.env,\n groups: ctx.groups,\n privacyConfig: this._privacyConfig,\n });\n }\n }\n}\n\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 });\n } catch {\n // cost calculation is best-effort\n }\n }\n\n this._trackFn({\n userId: ctx.userId ?? 'unknown',\n modelName,\n provider: this._providerName,\n responseContent: responseText,\n latencyMs,\n sessionId: ctx.sessionId,\n traceId: ctx.traceId,\n turnId: ctx.turnId ?? undefined,\n agentId: ctx.agentId,\n env: ctx.env,\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 userId: ctx.userId ?? 'unknown',\n modelName: String(requestParams.model ?? 'unknown'),\n provider: this._providerName,\n responseContent: '',\n latencyMs,\n sessionId: ctx.sessionId,\n traceId: ctx.traceId,\n agentId: ctx.agentId,\n env: ctx.env,\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 userId: ctx.userId ?? 'unknown',\n modelName: String(requestParams.model ?? 'unknown'),\n provider: this._providerName,\n responseContent: '',\n latencyMs: performance.now() - startTime,\n sessionId: ctx.sessionId,\n traceId: ctx.traceId,\n agentId: ctx.agentId,\n env: ctx.env,\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 });\n } catch {\n // cost calculation is best-effort\n }\n }\n this._trackFn({\n userId: sessionCtx.userId ?? 'unknown',\n modelName: String(accumulator.model ?? params.model ?? 'unknown'),\n provider: this._providerName,\n responseContent: state.content,\n latencyMs: accumulator.elapsedMs,\n sessionId: sessionCtx.sessionId,\n traceId: sessionCtx.traceId,\n turnId: sessionCtx.turnId ?? undefined,\n agentId: sessionCtx.agentId,\n env: sessionCtx.env,\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 agentId: ctx.agentId,\n parentAgentId: ctx.parentAgentId,\n customerOrgId: ctx.customerOrgId,\n env: ctx.env,\n groups: ctx.groups,\n privacyConfig: this._privacyConfig,\n });\n }\n }\n}\n\nfunction _isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return (\n value != null &&\n typeof (value as Record<symbol, unknown>)[Symbol.asyncIterator] ===\n 'function'\n );\n}\n\nexport function 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 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 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 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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"}
package/dist/session.d.ts CHANGED
@@ -32,6 +32,29 @@ declare class Session {
32
32
  * Synchronous version of run() for non-async code.
33
33
  */
34
34
  runSync<T>(fn: (session: Session) => T): T;
35
+ /**
36
+ * Run a callback as a child agent within this session.
37
+ *
38
+ * Provider wrappers automatically pick up the child agent's identity
39
+ * (`agentId`, `parentAgentId`) while sharing this session's `sessionId`,
40
+ * `traceId`, and turn counter. No `[Agent] Session End` is emitted.
41
+ *
42
+ * @example
43
+ * ```typescript
44
+ * const child = parentAgent.child('researcher');
45
+ * await session.run(async (s) => {
46
+ * const result = await s.runAs(child, async (cs) => {
47
+ * // provider wrappers see agentId='researcher'
48
+ * return openai.chat.completions.create({ ... });
49
+ * });
50
+ * });
51
+ * ```
52
+ */
53
+ runAs<T>(childAgent: BoundAgent, fn: (session: Session) => T | Promise<T>): Promise<T>;
54
+ /**
55
+ * Synchronous version of {@link runAs}.
56
+ */
57
+ runAsSync<T>(childAgent: BoundAgent, fn: (session: Session) => T): T;
35
58
  private _autoEnd;
36
59
  private _inject;
37
60
  trackUserMessage(content: string, opts?: UserMessageOpts): string;
@@ -1 +1 @@
1
- {"version":3,"file":"session.d.ts","names":[],"sources":["../src/session.ts"],"sourcesContent":[],"mappings":";;;;;AAkLU,cA9IG,OAAA,CA8IH;EAeA,SAAA,SAAA,EAAA,MAAA;EAcA,OAAA,EAAA,MAAA,GAAA,IAAA;EAU6C,SAAA,kBAAA,EAAA,MAAA,GAAA,IAAA;EAQ7C,SAAA,MAAA,EAAA,MAAA,GAAA,IAAA;EAAc,SAAA,QAAA,EAAA,MAAA,GAAA,IAAA;;;;;qBAjLb;;;;;;;;;8BAyDmB;;;;;uBAQD,YAAY,IAAI,QAAQ,KAAK,QAAQ;;;;2BAavC,YAAY,IAAI;;;2CA2CD;6FAShC;8EAeA;4EAcA;wDAU6C;8DAQ7C"}
1
+ {"version":3,"file":"session.d.ts","names":[],"sources":["../src/session.ts"],"sourcesContent":[],"mappings":";;;;;AA2JkB,cAvHL,OAAA,CAuHK;EAAY,SAAA,SAAA,EAAA,MAAA;EAAY,OAAA,EAAA,MAAA,GAAA,IAAA;EAAR,SAAA,kBAAA,EAAA,MAAA,GAAA,IAAA;EACrB,SAAA,MAAA,EAAA,MAAA,GAAA,IAAA;EAAR,SAAA,QAAA,EAAA,MAAA,GAAA,IAAA;EAgBW,SAAA,gBAAA,EAAA,MAAA,GAAA,IAAA;EACE,QAAA,MAAA;EAAY,QAAA,YAAA;EACzB,QAAA,gBAAA;EA8CqC,WAAA,CAAA,KAAA,EA5K/B,UA4K+B,EAAA,IAwDlB,CAxDkB,EAAA;IAShC,SAAA,CAAA,EAAA,MAAA,GAAA,IAAA;IAeA,kBAAA,CAAA,EAAA,MAAA,GAAA,IAAA;IAcA,MAAA,CAAA,EAAA,MAAA,GAAA,IAAA;IAU6C,QAAA,CAAA,EAAA,MAAA,GAAA,IAAA;IAQ7C,gBAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAAc,CAAA;;;8BA3KM;;;;;uBAQD,YAAY,IAAI,QAAQ,KAAK,QAAQ;;;;2BAavC,YAAY,IAAI;;;;;;;;;;;;;;;;;;;uBA4B3B,0BACE,YAAY,IAAI,QAAQ,KACrC,QAAQ;;;;2BAgBG,0BACE,YAAY,IACzB;;;2CA8CqC;6FAShC;8EAeA;4EAcA;wDAU6C;8DAQ7C"}