@mastra/openai 1.1.0 → 1.1.1-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,1175 +1,972 @@
1
- import { randomUUID } from 'crypto';
2
- import { ReadableStream, TransformStream } from 'stream/web';
3
- import { Agent } from '@mastra/core/agent';
4
- import { RequestContext } from '@mastra/core/request-context';
5
- import { ChunkFrom, MastraModelOutput } from '@mastra/core/stream';
6
- import { Agent as Agent$1, run } from '@openai/agents';
7
- import { MessageList } from '@mastra/core/agent/message-list';
8
- import { getOrCreateSpan, EntityType, SpanType, executeWithContext } from '@mastra/core/observability';
9
- import { toStandardSchema, standardSchemaToJSONSchema } from '@mastra/core/schema';
10
-
11
- // src/index.ts
1
+ import { randomUUID } from "crypto";
2
+ import { ReadableStream, TransformStream } from "stream/web";
3
+ import { Agent } from "@mastra/core/agent";
4
+ import { RequestContext } from "@mastra/core/request-context";
5
+ import { ChunkFrom, MastraModelOutput } from "@mastra/core/stream";
6
+ import { Agent as Agent$1, run } from "@openai/agents";
7
+ import { MessageList } from "@mastra/core/agent/message-list";
8
+ import { EntityType, SpanType, executeWithContext, getOrCreateSpan } from "@mastra/core/observability";
9
+ import { standardSchemaToJSONSchema, toStandardSchema } from "@mastra/core/schema";
10
+ //#region src/utils.ts
12
11
  function createNoopModel({ modelId, provider }) {
13
- return {
14
- modelId,
15
- provider,
16
- specificationVersion: "v3",
17
- supportedUrls: {},
18
- doGenerate: async () => createNoopStreamResult(),
19
- doStream: async () => createNoopStreamResult()
20
- };
12
+ return {
13
+ modelId,
14
+ provider,
15
+ specificationVersion: "v3",
16
+ supportedUrls: {},
17
+ doGenerate: async () => createNoopStreamResult(),
18
+ doStream: async () => createNoopStreamResult()
19
+ };
21
20
  }
22
21
  function createNoopStreamResult() {
23
- return {
24
- stream: new ReadableStream({
25
- start: (controller) => controller.close()
26
- })
27
- };
28
- }
29
- function createCompletedMastraStream({
30
- runId,
31
- prompt,
32
- text,
33
- responseId,
34
- modelId,
35
- usage,
36
- providerMetadata,
37
- costContext,
38
- object
39
- }) {
40
- return new ReadableStream({
41
- start(controller) {
42
- const textId = randomUUID();
43
- enqueueStartChunks(controller, {
44
- runId,
45
- prompt,
46
- textId,
47
- responseId,
48
- modelId,
49
- providerMetadata
50
- });
51
- if (text) {
52
- enqueueTextDelta(controller, runId, textId, text);
53
- }
54
- enqueueFinishChunks(controller, {
55
- runId,
56
- prompt,
57
- textId,
58
- text,
59
- responseId,
60
- modelId,
61
- usage,
62
- providerMetadata,
63
- costContext,
64
- object
65
- });
66
- controller.close();
67
- }
68
- });
69
- }
70
- function createMastraOutput({
71
- messages,
72
- runId,
73
- modelId,
74
- provider,
75
- stream,
76
- options
77
- }) {
78
- const messageList = new MessageList();
79
- messageList.add(messages, "input");
80
- messageList.add([{ role: "assistant", content: "" }], "response");
81
- return new MastraModelOutput({
82
- model: {
83
- modelId,
84
- provider,
85
- version: "v3"
86
- },
87
- stream,
88
- messageList,
89
- messageId: randomUUID(),
90
- options: {
91
- ...options,
92
- runId
93
- }
94
- });
95
- }
96
- function toFullOutput({
97
- messages,
98
- runId,
99
- provider,
100
- result,
101
- options
102
- }) {
103
- const text = result.content.map((part) => part.text).join("");
104
- const stream = createCompletedMastraStream({
105
- runId,
106
- prompt: promptToText(messages),
107
- text,
108
- responseId: result.response.id,
109
- modelId: result.response.modelId,
110
- usage: toLanguageModelUsage(result.usage),
111
- providerMetadata: result.providerMetadata,
112
- costContext: result.costContext,
113
- object: result.object
114
- });
115
- return createMastraOutput({
116
- messages,
117
- runId,
118
- modelId: result.response.modelId,
119
- provider,
120
- stream,
121
- options
122
- }).getFullOutput();
123
- }
124
- function createSDKAgentTelemetry({
125
- agentId,
126
- agentName,
127
- provider,
128
- modelId,
129
- messages,
130
- prompt,
131
- runId,
132
- streaming,
133
- method,
134
- requestContext,
135
- instructions,
136
- maxSteps,
137
- tracingOptions,
138
- tracingContext,
139
- onFinish,
140
- onStepFinish,
141
- mastra
142
- }) {
143
- const agentSpan = getOrCreateSpan({
144
- type: SpanType.AGENT_RUN,
145
- name: `agent run: '${agentId}'`,
146
- entityType: EntityType.AGENT,
147
- entityId: agentId,
148
- entityName: agentName,
149
- input: messages,
150
- attributes: {
151
- prompt,
152
- instructions,
153
- maxSteps
154
- },
155
- metadata: {
156
- runId,
157
- sdkAgent: true,
158
- sdkProvider: provider,
159
- sdkMethod: method
160
- },
161
- tracingOptions,
162
- tracingContext,
163
- requestContext,
164
- mastra
165
- });
166
- const modelSpan = agentSpan?.createChildSpan({
167
- type: SpanType.MODEL_GENERATION,
168
- name: `llm: '${modelId}'`,
169
- input: {
170
- messages
171
- },
172
- attributes: {
173
- model: modelId,
174
- provider,
175
- streaming
176
- },
177
- metadata: {
178
- runId,
179
- sdkAgent: true,
180
- sdkProvider: provider,
181
- sdkMethod: method
182
- },
183
- requestContext
184
- });
185
- const modelSpanTracker = getModelSpanTracker(modelSpan);
186
- const toolSpans = /* @__PURE__ */ new Map();
187
- let ended = false;
188
- const startToolCall = ({ toolCallId, toolName, input }) => {
189
- if (toolSpans.has(toolCallId)) {
190
- return;
191
- }
192
- const parentSpan = agentSpan ?? modelSpan;
193
- if (!parentSpan) {
194
- return;
195
- }
196
- const mcp = parseMcpToolName(toolName);
197
- const span = mcp ? parentSpan.createChildSpan({
198
- type: SpanType.MCP_TOOL_CALL,
199
- name: `mcp_tool: '${toolName}' on '${mcp.serverName}'`,
200
- input,
201
- entityType: EntityType.TOOL,
202
- entityId: toolName,
203
- entityName: toolName,
204
- attributes: {
205
- mcpServer: mcp.serverName
206
- },
207
- metadata: {
208
- runId,
209
- sdkAgent: true,
210
- sdkProvider: provider,
211
- sdkMethod: method,
212
- toolCallId
213
- },
214
- requestContext
215
- }) : parentSpan.createChildSpan({
216
- type: SpanType.TOOL_CALL,
217
- name: `tool: '${toolName}'`,
218
- input,
219
- entityType: EntityType.TOOL,
220
- entityId: toolName,
221
- entityName: toolName,
222
- attributes: {
223
- toolType: "tool"
224
- },
225
- metadata: {
226
- runId,
227
- sdkAgent: true,
228
- sdkProvider: provider,
229
- sdkMethod: method,
230
- toolCallId
231
- },
232
- requestContext
233
- });
234
- toolSpans.set(toolCallId, span);
235
- };
236
- const endToolCall = ({ toolCallId, output, isError }) => {
237
- const span = toolSpans.get(toolCallId);
238
- if (!span) {
239
- return;
240
- }
241
- toolSpans.delete(toolCallId);
242
- if (isError) {
243
- span.error({
244
- error: output instanceof Error ? output : new Error(typeof output === "string" ? output : "SDK tool call failed"),
245
- attributes: { success: false }
246
- });
247
- return;
248
- }
249
- span.end({
250
- output,
251
- attributes: { success: true }
252
- });
253
- };
254
- const closeOpenToolSpans = (success, error) => {
255
- for (const [toolCallId, span] of toolSpans) {
256
- toolSpans.delete(toolCallId);
257
- if (success) {
258
- span.end({ attributes: { success: true } });
259
- continue;
260
- }
261
- const normalized = error instanceof Error ? error : new Error(String(error ?? "SDK agent run failed"));
262
- span.error({ error: normalized, attributes: { success: false } });
263
- }
264
- };
265
- const endModel = ({
266
- text,
267
- usage,
268
- providerMetadata,
269
- finishReason = "stop",
270
- responseId,
271
- responseModel,
272
- costContext
273
- }) => {
274
- if (modelSpanTracker) {
275
- modelSpanTracker.endGeneration({
276
- output: {
277
- text
278
- },
279
- attributes: {
280
- finishReason,
281
- responseId,
282
- responseModel,
283
- costContext
284
- },
285
- usage,
286
- providerMetadata
287
- });
288
- return;
289
- }
290
- modelSpan?.end({
291
- output: {
292
- text
293
- },
294
- attributes: {
295
- finishReason,
296
- responseId,
297
- responseModel,
298
- usage: usage ? toUsageStats(usage) : void 0,
299
- costContext
300
- }
301
- });
302
- };
303
- const end = (result) => {
304
- if (ended) {
305
- return;
306
- }
307
- ended = true;
308
- closeOpenToolSpans(true);
309
- endModel(result);
310
- agentSpan?.end({
311
- output: {
312
- text: result.text
313
- }
314
- });
315
- };
316
- const fail = (error) => {
317
- if (ended) {
318
- return;
319
- }
320
- ended = true;
321
- const normalized = error instanceof Error ? error : new Error(String(error));
322
- closeOpenToolSpans(false, normalized);
323
- if (modelSpanTracker) {
324
- modelSpanTracker.reportGenerationError({ error: normalized });
325
- } else {
326
- modelSpan?.error({ error: normalized });
327
- }
328
- agentSpan?.error({ error: normalized });
329
- };
330
- return {
331
- execute: (fn) => executeWithContext({ span: modelSpan ?? agentSpan, fn }),
332
- endGenerate(result) {
333
- end({
334
- text: result.content.map((part) => part.text).join(""),
335
- usage: toLanguageModelUsage(result.usage),
336
- providerMetadata: result.providerMetadata,
337
- finishReason: result.finishReason.unified,
338
- responseId: result.response.id,
339
- responseModel: result.response.modelId,
340
- costContext: result.costContext
341
- });
342
- },
343
- fail,
344
- startToolCall,
345
- endToolCall,
346
- wrapStream(stream) {
347
- const trackedStream = modelSpanTracker?.wrapStream(stream) ?? stream;
348
- return wrapStreamForAgentSpan(trackedStream, {
349
- end,
350
- fail
351
- });
352
- },
353
- outputOptions() {
354
- return {
355
- onFinish,
356
- onStepFinish,
357
- requestContext,
358
- tracingContext: agentSpan ? { currentSpan: agentSpan } : tracingContext
359
- };
360
- }
361
- };
22
+ return { stream: new ReadableStream({ start: (controller) => controller.close() }) };
23
+ }
24
+ function createCompletedMastraStream({ runId, prompt, text, responseId, modelId, usage, providerMetadata, costContext, object }) {
25
+ return new ReadableStream({ start(controller) {
26
+ const textId = randomUUID();
27
+ enqueueStartChunks(controller, {
28
+ runId,
29
+ prompt,
30
+ textId,
31
+ responseId,
32
+ modelId,
33
+ providerMetadata
34
+ });
35
+ if (text) enqueueTextDelta(controller, runId, textId, text);
36
+ enqueueFinishChunks(controller, {
37
+ runId,
38
+ prompt,
39
+ textId,
40
+ text,
41
+ responseId,
42
+ modelId,
43
+ usage,
44
+ providerMetadata,
45
+ costContext,
46
+ object
47
+ });
48
+ controller.close();
49
+ } });
50
+ }
51
+ function createMastraOutput({ messages, runId, modelId, provider, stream, options }) {
52
+ const messageList = new MessageList();
53
+ messageList.add(messages, "input");
54
+ messageList.add([{
55
+ role: "assistant",
56
+ content: ""
57
+ }], "response");
58
+ return new MastraModelOutput({
59
+ model: {
60
+ modelId,
61
+ provider,
62
+ version: "v3"
63
+ },
64
+ stream,
65
+ messageList,
66
+ messageId: randomUUID(),
67
+ options: {
68
+ ...options,
69
+ runId
70
+ }
71
+ });
72
+ }
73
+ function toFullOutput({ messages, runId, provider, result, options }) {
74
+ const text = result.content.map((part) => part.text).join("");
75
+ const stream = createCompletedMastraStream({
76
+ runId,
77
+ prompt: promptToText(messages),
78
+ text,
79
+ responseId: result.response.id,
80
+ modelId: result.response.modelId,
81
+ usage: toLanguageModelUsage(result.usage),
82
+ providerMetadata: result.providerMetadata,
83
+ costContext: result.costContext,
84
+ object: result.object
85
+ });
86
+ return createMastraOutput({
87
+ messages,
88
+ runId,
89
+ modelId: result.response.modelId,
90
+ provider,
91
+ stream,
92
+ options
93
+ }).getFullOutput();
94
+ }
95
+ function createSDKAgentTelemetry({ agentId, agentName, provider, modelId, messages, prompt, runId, streaming, method, requestContext, instructions, maxSteps, tracingOptions, tracingContext, onFinish, onStepFinish, mastra }) {
96
+ const agentSpan = getOrCreateSpan({
97
+ type: SpanType.AGENT_RUN,
98
+ name: `agent run: '${agentId}'`,
99
+ entityType: EntityType.AGENT,
100
+ entityId: agentId,
101
+ entityName: agentName,
102
+ input: messages,
103
+ attributes: {
104
+ prompt,
105
+ instructions,
106
+ maxSteps
107
+ },
108
+ metadata: {
109
+ runId,
110
+ sdkAgent: true,
111
+ sdkProvider: provider,
112
+ sdkMethod: method
113
+ },
114
+ tracingOptions,
115
+ tracingContext,
116
+ requestContext,
117
+ mastra
118
+ });
119
+ const modelSpan = agentSpan?.createChildSpan({
120
+ type: SpanType.MODEL_GENERATION,
121
+ name: `llm: '${modelId}'`,
122
+ input: { messages },
123
+ attributes: {
124
+ model: modelId,
125
+ provider,
126
+ streaming
127
+ },
128
+ metadata: {
129
+ runId,
130
+ sdkAgent: true,
131
+ sdkProvider: provider,
132
+ sdkMethod: method
133
+ },
134
+ requestContext
135
+ });
136
+ const modelSpanTracker = getModelSpanTracker(modelSpan);
137
+ const toolSpans = /* @__PURE__ */ new Map();
138
+ let ended = false;
139
+ const startToolCall = ({ toolCallId, toolName, input }) => {
140
+ if (toolSpans.has(toolCallId)) return;
141
+ const parentSpan = agentSpan ?? modelSpan;
142
+ if (!parentSpan) return;
143
+ const mcp = parseMcpToolName(toolName);
144
+ const span = mcp ? parentSpan.createChildSpan({
145
+ type: SpanType.MCP_TOOL_CALL,
146
+ name: `mcp_tool: '${toolName}' on '${mcp.serverName}'`,
147
+ input,
148
+ entityType: EntityType.TOOL,
149
+ entityId: toolName,
150
+ entityName: toolName,
151
+ attributes: { mcpServer: mcp.serverName },
152
+ metadata: {
153
+ runId,
154
+ sdkAgent: true,
155
+ sdkProvider: provider,
156
+ sdkMethod: method,
157
+ toolCallId
158
+ },
159
+ requestContext
160
+ }) : parentSpan.createChildSpan({
161
+ type: SpanType.TOOL_CALL,
162
+ name: `tool: '${toolName}'`,
163
+ input,
164
+ entityType: EntityType.TOOL,
165
+ entityId: toolName,
166
+ entityName: toolName,
167
+ attributes: { toolType: "tool" },
168
+ metadata: {
169
+ runId,
170
+ sdkAgent: true,
171
+ sdkProvider: provider,
172
+ sdkMethod: method,
173
+ toolCallId
174
+ },
175
+ requestContext
176
+ });
177
+ toolSpans.set(toolCallId, span);
178
+ };
179
+ const endToolCall = ({ toolCallId, output, isError }) => {
180
+ const span = toolSpans.get(toolCallId);
181
+ if (!span) return;
182
+ toolSpans.delete(toolCallId);
183
+ if (isError) {
184
+ span.error({
185
+ error: output instanceof Error ? output : new Error(typeof output === "string" ? output : "SDK tool call failed"),
186
+ attributes: { success: false }
187
+ });
188
+ return;
189
+ }
190
+ span.end({
191
+ output,
192
+ attributes: { success: true }
193
+ });
194
+ };
195
+ const closeOpenToolSpans = (success, error) => {
196
+ for (const [toolCallId, span] of toolSpans) {
197
+ toolSpans.delete(toolCallId);
198
+ if (success) {
199
+ span.end({ attributes: { success: true } });
200
+ continue;
201
+ }
202
+ const normalized = error instanceof Error ? error : new Error(String(error ?? "SDK agent run failed"));
203
+ span.error({
204
+ error: normalized,
205
+ attributes: { success: false }
206
+ });
207
+ }
208
+ };
209
+ const endModel = ({ text, usage, providerMetadata, finishReason = "stop", responseId, responseModel, costContext }) => {
210
+ if (modelSpanTracker) {
211
+ modelSpanTracker.endGeneration({
212
+ output: { text },
213
+ attributes: {
214
+ finishReason,
215
+ responseId,
216
+ responseModel,
217
+ costContext
218
+ },
219
+ usage,
220
+ providerMetadata
221
+ });
222
+ return;
223
+ }
224
+ modelSpan?.end({
225
+ output: { text },
226
+ attributes: {
227
+ finishReason,
228
+ responseId,
229
+ responseModel,
230
+ usage: usage ? toUsageStats(usage) : void 0,
231
+ costContext
232
+ }
233
+ });
234
+ };
235
+ const end = (result) => {
236
+ if (ended) return;
237
+ ended = true;
238
+ closeOpenToolSpans(true);
239
+ endModel(result);
240
+ agentSpan?.end({ output: { text: result.text } });
241
+ };
242
+ const fail = (error) => {
243
+ if (ended) return;
244
+ ended = true;
245
+ const normalized = error instanceof Error ? error : new Error(String(error));
246
+ closeOpenToolSpans(false, normalized);
247
+ if (modelSpanTracker) modelSpanTracker.reportGenerationError({ error: normalized });
248
+ else modelSpan?.error({ error: normalized });
249
+ agentSpan?.error({ error: normalized });
250
+ };
251
+ return {
252
+ execute: (fn) => executeWithContext({
253
+ span: modelSpan ?? agentSpan,
254
+ fn
255
+ }),
256
+ endGenerate(result) {
257
+ end({
258
+ text: result.content.map((part) => part.text).join(""),
259
+ usage: toLanguageModelUsage(result.usage),
260
+ providerMetadata: result.providerMetadata,
261
+ finishReason: result.finishReason.unified,
262
+ responseId: result.response.id,
263
+ responseModel: result.response.modelId,
264
+ costContext: result.costContext
265
+ });
266
+ },
267
+ fail,
268
+ startToolCall,
269
+ endToolCall,
270
+ wrapStream(stream) {
271
+ return wrapStreamForAgentSpan(modelSpanTracker?.wrapStream(stream) ?? stream, {
272
+ end,
273
+ fail
274
+ });
275
+ },
276
+ outputOptions() {
277
+ return {
278
+ onFinish,
279
+ onStepFinish,
280
+ requestContext,
281
+ tracingContext: agentSpan ? { currentSpan: agentSpan } : tracingContext
282
+ };
283
+ }
284
+ };
362
285
  }
363
286
  function parseMcpToolName(toolName) {
364
- const match = /^mcp__([^_].*?)__(.+)$/.exec(toolName);
365
- if (!match?.[1] || !match[2]) {
366
- return void 0;
367
- }
368
- return {
369
- serverName: match[1],
370
- toolName: match[2]
371
- };
287
+ const match = /^mcp__([^_].*?)__(.+)$/.exec(toolName);
288
+ if (!match?.[1] || !match[2]) return;
289
+ return {
290
+ serverName: match[1],
291
+ toolName: match[2]
292
+ };
372
293
  }
373
294
  function getModelSpanTracker(modelSpan) {
374
- if (!modelSpan || !("createTracker" in modelSpan)) {
375
- return void 0;
376
- }
377
- return modelSpan.createTracker();
295
+ if (!modelSpan || !("createTracker" in modelSpan)) return;
296
+ return modelSpan.createTracker();
378
297
  }
379
298
  function wrapStreamForAgentSpan(stream, telemetry) {
380
- let text = "";
381
- return stream.pipeThrough(
382
- new TransformStream({
383
- transform(chunk, controller) {
384
- if (chunk.type === "text-delta") {
385
- text += chunk.payload.text;
386
- }
387
- if (chunk.type === "finish") {
388
- telemetry.end({
389
- text,
390
- usage: chunk.payload.output.usage,
391
- providerMetadata: chunk.payload.providerMetadata,
392
- finishReason: chunk.payload.stepResult.reason,
393
- responseId: chunk.payload.response?.id,
394
- responseModel: chunk.payload.response?.modelId,
395
- costContext: getCostContext(chunk.payload.metadata?.costContext)
396
- });
397
- }
398
- if (chunk.type === "error") {
399
- telemetry.fail(chunk.payload.error);
400
- }
401
- controller.enqueue(chunk);
402
- },
403
- flush() {
404
- telemetry.end({ text });
405
- }
406
- })
407
- );
299
+ let text = "";
300
+ return stream.pipeThrough(new TransformStream({
301
+ transform(chunk, controller) {
302
+ if (chunk.type === "text-delta") text += chunk.payload.text;
303
+ if (chunk.type === "finish") telemetry.end({
304
+ text,
305
+ usage: chunk.payload.output.usage,
306
+ providerMetadata: chunk.payload.providerMetadata,
307
+ finishReason: chunk.payload.stepResult.reason,
308
+ responseId: chunk.payload.response?.id,
309
+ responseModel: chunk.payload.response?.modelId,
310
+ costContext: getCostContext(chunk.payload.metadata?.costContext)
311
+ });
312
+ if (chunk.type === "error") telemetry.fail(chunk.payload.error);
313
+ controller.enqueue(chunk);
314
+ },
315
+ flush() {
316
+ telemetry.end({ text });
317
+ }
318
+ }));
408
319
  }
409
320
  function toUsageStats(usage) {
410
- return {
411
- inputTokens: usage.inputTokens,
412
- outputTokens: usage.outputTokens,
413
- inputDetails: {
414
- cacheRead: usage.cachedInputTokens,
415
- cacheWrite: usage.cacheCreationInputTokens
416
- },
417
- outputDetails: {
418
- text: usage.outputTokens,
419
- reasoning: usage.reasoningTokens
420
- }
421
- };
321
+ return {
322
+ inputTokens: usage.inputTokens,
323
+ outputTokens: usage.outputTokens,
324
+ inputDetails: {
325
+ cacheRead: usage.cachedInputTokens,
326
+ cacheWrite: usage.cacheCreationInputTokens
327
+ },
328
+ outputDetails: {
329
+ text: usage.outputTokens,
330
+ reasoning: usage.reasoningTokens
331
+ }
332
+ };
422
333
  }
423
334
  function getCostContext(value) {
424
- if (!value || typeof value !== "object") {
425
- return void 0;
426
- }
427
- return value;
428
- }
429
- function enqueueStartChunks(controller, {
430
- runId,
431
- prompt,
432
- textId,
433
- responseId,
434
- modelId,
435
- providerMetadata
436
- }) {
437
- controller.enqueue({
438
- type: "start",
439
- runId,
440
- from: ChunkFrom.AGENT,
441
- payload: {}
442
- });
443
- controller.enqueue({
444
- type: "step-start",
445
- runId,
446
- from: ChunkFrom.AGENT,
447
- payload: {
448
- request: { body: prompt }
449
- }
450
- });
451
- controller.enqueue({
452
- type: "response-metadata",
453
- runId,
454
- from: ChunkFrom.AGENT,
455
- payload: {
456
- ...responseId ? { id: responseId } : {},
457
- modelId,
458
- timestamp: (/* @__PURE__ */ new Date()).toISOString()
459
- }
460
- });
461
- controller.enqueue({
462
- type: "text-start",
463
- runId,
464
- from: ChunkFrom.AGENT,
465
- payload: {
466
- id: textId,
467
- providerMetadata
468
- }
469
- });
335
+ if (!value || typeof value !== "object") return;
336
+ return value;
337
+ }
338
+ function enqueueStartChunks(controller, { runId, prompt, textId, responseId, modelId, providerMetadata }) {
339
+ controller.enqueue({
340
+ type: "start",
341
+ runId,
342
+ from: ChunkFrom.AGENT,
343
+ payload: {}
344
+ });
345
+ controller.enqueue({
346
+ type: "step-start",
347
+ runId,
348
+ from: ChunkFrom.AGENT,
349
+ payload: { request: { body: prompt } }
350
+ });
351
+ controller.enqueue({
352
+ type: "response-metadata",
353
+ runId,
354
+ from: ChunkFrom.AGENT,
355
+ payload: {
356
+ ...responseId ? { id: responseId } : {},
357
+ modelId,
358
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
359
+ }
360
+ });
361
+ controller.enqueue({
362
+ type: "text-start",
363
+ runId,
364
+ from: ChunkFrom.AGENT,
365
+ payload: {
366
+ id: textId,
367
+ providerMetadata
368
+ }
369
+ });
470
370
  }
471
371
  function enqueueTextDelta(controller, runId, textId, text) {
472
- controller.enqueue({
473
- type: "text-delta",
474
- runId,
475
- from: ChunkFrom.AGENT,
476
- payload: {
477
- id: textId,
478
- text
479
- }
480
- });
481
- }
482
- function enqueueFinishChunks(controller, {
483
- runId,
484
- prompt,
485
- textId,
486
- text,
487
- responseId,
488
- modelId,
489
- usage,
490
- providerMetadata,
491
- costContext,
492
- object
493
- }) {
494
- const timestamp = /* @__PURE__ */ new Date();
495
- const response = {
496
- ...responseId ? { id: responseId } : {},
497
- modelId,
498
- timestamp
499
- };
500
- const metadata = {
501
- providerMetadata,
502
- costContext,
503
- request: { body: prompt },
504
- modelId,
505
- timestamp
506
- };
507
- controller.enqueue({
508
- type: "text-end",
509
- runId,
510
- from: ChunkFrom.AGENT,
511
- payload: {
512
- id: textId,
513
- providerMetadata
514
- }
515
- });
516
- if (object !== void 0) {
517
- controller.enqueue({
518
- type: "object-result",
519
- runId,
520
- from: ChunkFrom.AGENT,
521
- object
522
- });
523
- }
524
- controller.enqueue({
525
- type: "step-finish",
526
- runId,
527
- from: ChunkFrom.AGENT,
528
- payload: {
529
- ...responseId ? { id: responseId } : {},
530
- providerMetadata,
531
- totalUsage: usage,
532
- response,
533
- stepResult: {
534
- reason: "stop",
535
- warnings: []
536
- },
537
- output: {
538
- text,
539
- usage,
540
- steps: []
541
- },
542
- metadata
543
- }
544
- });
545
- controller.enqueue({
546
- type: "finish",
547
- runId,
548
- from: ChunkFrom.AGENT,
549
- payload: {
550
- stepResult: {
551
- reason: "stop",
552
- warnings: []
553
- },
554
- output: {
555
- usage,
556
- steps: []
557
- },
558
- metadata,
559
- providerMetadata,
560
- messages: {
561
- all: [],
562
- user: [],
563
- nonUser: []
564
- },
565
- response
566
- }
567
- });
372
+ controller.enqueue({
373
+ type: "text-delta",
374
+ runId,
375
+ from: ChunkFrom.AGENT,
376
+ payload: {
377
+ id: textId,
378
+ text
379
+ }
380
+ });
381
+ }
382
+ function enqueueFinishChunks(controller, { runId, prompt, textId, text, responseId, modelId, usage, providerMetadata, costContext, object }) {
383
+ const timestamp = /* @__PURE__ */ new Date();
384
+ const response = {
385
+ ...responseId ? { id: responseId } : {},
386
+ modelId,
387
+ timestamp
388
+ };
389
+ const metadata = {
390
+ providerMetadata,
391
+ costContext,
392
+ request: { body: prompt },
393
+ modelId,
394
+ timestamp
395
+ };
396
+ controller.enqueue({
397
+ type: "text-end",
398
+ runId,
399
+ from: ChunkFrom.AGENT,
400
+ payload: {
401
+ id: textId,
402
+ providerMetadata
403
+ }
404
+ });
405
+ if (object !== void 0) controller.enqueue({
406
+ type: "object-result",
407
+ runId,
408
+ from: ChunkFrom.AGENT,
409
+ object
410
+ });
411
+ controller.enqueue({
412
+ type: "step-finish",
413
+ runId,
414
+ from: ChunkFrom.AGENT,
415
+ payload: {
416
+ ...responseId ? { id: responseId } : {},
417
+ providerMetadata,
418
+ totalUsage: usage,
419
+ response,
420
+ stepResult: {
421
+ reason: "stop",
422
+ warnings: []
423
+ },
424
+ output: {
425
+ text,
426
+ usage,
427
+ steps: []
428
+ },
429
+ metadata
430
+ }
431
+ });
432
+ controller.enqueue({
433
+ type: "finish",
434
+ runId,
435
+ from: ChunkFrom.AGENT,
436
+ payload: {
437
+ stepResult: {
438
+ reason: "stop",
439
+ warnings: []
440
+ },
441
+ output: {
442
+ usage,
443
+ steps: []
444
+ },
445
+ metadata,
446
+ providerMetadata,
447
+ messages: {
448
+ all: [],
449
+ user: [],
450
+ nonUser: []
451
+ },
452
+ response
453
+ }
454
+ });
568
455
  }
569
456
  function toLanguageModelUsage(usage) {
570
- const inputTokens = usage.inputTokens.total ?? 0;
571
- const outputTokens = usage.outputTokens.total ?? 0;
572
- return {
573
- inputTokens,
574
- outputTokens,
575
- totalTokens: inputTokens + outputTokens,
576
- cachedInputTokens: usage.inputTokens.cacheRead,
577
- cacheCreationInputTokens: usage.inputTokens.cacheWrite,
578
- reasoningTokens: usage.outputTokens.reasoning,
579
- raw: usage
580
- };
457
+ const inputTokens = usage.inputTokens.total ?? 0;
458
+ const outputTokens = usage.outputTokens.total ?? 0;
459
+ return {
460
+ inputTokens,
461
+ outputTokens,
462
+ totalTokens: inputTokens + outputTokens,
463
+ cachedInputTokens: usage.inputTokens.cacheRead,
464
+ cacheCreationInputTokens: usage.inputTokens.cacheWrite,
465
+ reasoningTokens: usage.outputTokens.reasoning,
466
+ raw: usage
467
+ };
581
468
  }
582
469
  function createProviderMetadata(provider, metadata) {
583
- return {
584
- [provider]: toJsonRecord(metadata)
585
- };
470
+ return { [provider]: toJsonRecord(metadata) };
586
471
  }
587
472
  function toJsonRecord(record) {
588
- return Object.fromEntries(
589
- Object.entries(record).filter((entry) => entry[1] !== void 0).map(([key, value]) => [key, toJsonValue(value)])
590
- );
473
+ return Object.fromEntries(Object.entries(record).filter((entry) => entry[1] !== void 0).map(([key, value]) => [key, toJsonValue(value)]));
591
474
  }
592
475
  function toJsonValue(value) {
593
- if (value === null || typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
594
- return value;
595
- }
596
- if (Array.isArray(value)) {
597
- return value.filter((item) => item !== void 0).map(toJsonValue);
598
- }
599
- if (value instanceof Date) {
600
- return value.toISOString();
601
- }
602
- if (typeof value === "object") {
603
- return toJsonRecord(value);
604
- }
605
- return String(value);
476
+ if (value === null || typeof value === "string" || typeof value === "number" || typeof value === "boolean") return value;
477
+ if (Array.isArray(value)) return value.filter((item) => item !== void 0).map(toJsonValue);
478
+ if (value instanceof Date) return value.toISOString();
479
+ if (typeof value === "object") return toJsonRecord(value);
480
+ return String(value);
606
481
  }
607
482
  function promptToText(prompt) {
608
- if (typeof prompt === "string") {
609
- return prompt;
610
- }
611
- if (Array.isArray(prompt)) {
612
- return prompt.map(promptToText).filter(Boolean).join("\n");
613
- }
614
- if (!prompt || typeof prompt !== "object") {
615
- return "";
616
- }
617
- const record = prompt;
618
- if (typeof record.text === "string") {
619
- return record.text;
620
- }
621
- if (typeof record.content === "string") {
622
- return record.content;
623
- }
624
- if (record.content) {
625
- return promptToText(record.content);
626
- }
627
- return "";
483
+ if (typeof prompt === "string") return prompt;
484
+ if (Array.isArray(prompt)) return prompt.map(promptToText).filter(Boolean).join("\n");
485
+ if (!prompt || typeof prompt !== "object") return "";
486
+ const record = prompt;
487
+ if (typeof record.text === "string") return record.text;
488
+ if (typeof record.content === "string") return record.content;
489
+ if (record.content) return promptToText(record.content);
490
+ return "";
628
491
  }
629
492
  function getStructuredOutputSchema(structuredOutput) {
630
- if (!structuredOutput?.schema) {
631
- return void 0;
632
- }
633
- return {
634
- type: "json_schema",
635
- name: "mastra_output",
636
- strict: false,
637
- schema: standardSchemaToJSONSchema(toStandardSchema(structuredOutput.schema))
638
- };
493
+ if (!structuredOutput?.schema) return;
494
+ return {
495
+ type: "json_schema",
496
+ name: "mastra_output",
497
+ strict: false,
498
+ schema: standardSchemaToJSONSchema(toStandardSchema(structuredOutput.schema))
499
+ };
639
500
  }
640
501
  async function getStructuredOutputFromValue(value, structuredOutput) {
641
- if (!structuredOutput?.schema) {
642
- return void 0;
643
- }
644
- let parsed;
645
- if (typeof value === "string") {
646
- try {
647
- parsed = JSON.parse(value);
648
- } catch (error) {
649
- return handleStructuredOutputError(
650
- new Error("Structured output must be valid JSON.", { cause: error }),
651
- structuredOutput
652
- );
653
- }
654
- } else {
655
- parsed = value;
656
- }
657
- const schema = toStandardSchema(structuredOutput.schema);
658
- const result = await schema["~standard"].validate(parsed);
659
- if (!result.issues) {
660
- return result.value;
661
- }
662
- const message = result.issues.map((issue) => `- ${issue.path?.join(".") || "root"}: ${issue.message}`).join("\n");
663
- return handleStructuredOutputError(new Error(`Structured output validation failed:
664
- ${message}`), structuredOutput);
502
+ if (!structuredOutput?.schema) return;
503
+ let parsed;
504
+ if (typeof value === "string") try {
505
+ parsed = JSON.parse(value);
506
+ } catch (error) {
507
+ return handleStructuredOutputError(new Error("Structured output must be valid JSON.", { cause: error }), structuredOutput);
508
+ }
509
+ else parsed = value;
510
+ const result = await toStandardSchema(structuredOutput.schema)["~standard"].validate(parsed);
511
+ if (!result.issues) return result.value;
512
+ const message = result.issues.map((issue) => `- ${issue.path?.join(".") || "root"}: ${issue.message}`).join("\n");
513
+ return handleStructuredOutputError(/* @__PURE__ */ new Error(`Structured output validation failed:\n${message}`), structuredOutput);
665
514
  }
666
515
  function handleStructuredOutputError(error, structuredOutput) {
667
- if (structuredOutput.errorStrategy === "fallback") {
668
- return structuredOutput.fallbackValue;
669
- }
670
- if (structuredOutput.errorStrategy === "warn") {
671
- structuredOutput.logger?.warn(error.message);
672
- return void 0;
673
- }
674
- throw error;
516
+ if (structuredOutput.errorStrategy === "fallback") return structuredOutput.fallbackValue;
517
+ if (structuredOutput.errorStrategy === "warn") {
518
+ structuredOutput.logger?.warn(error.message);
519
+ return;
520
+ }
521
+ throw error;
675
522
  }
676
523
  function sumDefined(...values) {
677
- const defined = values.filter((value) => typeof value === "number");
678
- if (defined.length === 0) {
679
- return void 0;
680
- }
681
- return defined.reduce((sum, value) => sum + value, 0);
682
- }
683
-
684
- // src/index.ts
685
- var PROVIDER = "@openai/agents";
686
- var MODEL_ID = "openai-agents-sdk";
524
+ const defined = values.filter((value) => typeof value === "number");
525
+ if (defined.length === 0) return;
526
+ return defined.reduce((sum, value) => sum + value, 0);
527
+ }
528
+ //#endregion
529
+ //#region src/index.ts
530
+ const PROVIDER = "@openai/agents";
531
+ const MODEL_ID = "openai-agents-sdk";
687
532
  var OpenAISDKAgent = class extends Agent {
688
- options;
689
- #mastra;
690
- #createdAgent;
691
- constructor(options) {
692
- super({
693
- id: options.id,
694
- name: options.name ?? options.id,
695
- description: options.description,
696
- instructions: "",
697
- model: createNoopModel({
698
- modelId: getModelId(options),
699
- provider: PROVIDER
700
- })
701
- });
702
- this.options = options;
703
- }
704
- __registerMastra(mastra) {
705
- super.__registerMastra(mastra);
706
- this.#mastra = mastra;
707
- }
708
- supportsMemory() {
709
- return false;
710
- }
711
- async generate(messages, options) {
712
- const prompt = promptToText(messages);
713
- const runId = options?.runId ?? randomUUID();
714
- const sdkAgent = getRunOpenAIAgent(this.resolveOpenAIAgent(), options);
715
- const modelId = getModelId(this.options, sdkAgent);
716
- const requestContext = options?.requestContext ?? new RequestContext();
717
- const instructions = options?.instructions ? promptToText(options.instructions) : void 0;
718
- const telemetry = createSDKAgentTelemetry({
719
- agentId: this.id,
720
- agentName: this.name,
721
- provider: PROVIDER,
722
- modelId,
723
- messages,
724
- prompt,
725
- runId,
726
- streaming: false,
727
- method: "generate",
728
- requestContext,
729
- instructions,
730
- maxSteps: options?.maxSteps,
731
- tracingOptions: options?.tracingOptions,
732
- tracingContext: options?.tracingContext,
733
- onFinish: options?.onFinish,
734
- onStepFinish: options?.onStepFinish,
735
- mastra: this.#mastra
736
- });
737
- let result;
738
- try {
739
- result = await telemetry.execute(() => runOpenAIGenerate(prompt, sdkAgent, runId, telemetry, options));
740
- telemetry.endGenerate(result);
741
- } catch (error) {
742
- telemetry.fail(error);
743
- throw error;
744
- }
745
- return toFullOutput({
746
- messages,
747
- runId,
748
- provider: PROVIDER,
749
- result,
750
- options: { ...telemetry.outputOptions(), structuredOutput: getStructuredOutputOption(options) }
751
- });
752
- }
753
- async stream(messages, options) {
754
- const prompt = promptToText(messages);
755
- const runId = options?.runId ?? randomUUID();
756
- const sdkAgent = getRunOpenAIAgent(this.resolveOpenAIAgent(), options);
757
- const modelId = getModelId(this.options, sdkAgent);
758
- const requestContext = options?.requestContext ?? new RequestContext();
759
- const instructions = options?.instructions ? promptToText(options.instructions) : void 0;
760
- const telemetry = createSDKAgentTelemetry({
761
- agentId: this.id,
762
- agentName: this.name,
763
- provider: PROVIDER,
764
- modelId,
765
- messages,
766
- prompt,
767
- runId,
768
- streaming: true,
769
- method: "stream",
770
- requestContext,
771
- instructions,
772
- maxSteps: options?.maxSteps,
773
- tracingOptions: options?.tracingOptions,
774
- tracingContext: options?.tracingContext,
775
- onFinish: options?.onFinish,
776
- onStepFinish: options?.onStepFinish,
777
- mastra: this.#mastra
778
- });
779
- return createMastraOutput({
780
- messages,
781
- runId,
782
- modelId,
783
- provider: PROVIDER,
784
- stream: telemetry.wrapStream(runOpenAIAsMastraStream(prompt, sdkAgent, runId, modelId, telemetry, options)),
785
- options: { ...telemetry.outputOptions(), structuredOutput: getStructuredOutputOption(options) }
786
- });
787
- }
788
- async resumeGenerate(resumeData, options) {
789
- const data = validateOpenAIResumeData(resumeData);
790
- return this.generate(data.message, createOpenAIResumeRunOptions(data, options));
791
- }
792
- async resumeStream(resumeData, options) {
793
- const data = validateOpenAIResumeData(resumeData);
794
- return this.stream(data.message, createOpenAIResumeRunOptions(data, options));
795
- }
796
- resolveOpenAIAgent() {
797
- this.#createdAgent ??= this.options.agent ?? new Agent$1(toOpenAIAgentOptions(this.options));
798
- return this.#createdAgent;
799
- }
533
+ options;
534
+ #mastra;
535
+ #createdAgent;
536
+ constructor(options) {
537
+ super({
538
+ id: options.id,
539
+ name: options.name ?? options.id,
540
+ description: options.description,
541
+ instructions: "",
542
+ model: createNoopModel({
543
+ modelId: getModelId(options),
544
+ provider: PROVIDER
545
+ })
546
+ });
547
+ this.options = options;
548
+ }
549
+ __registerMastra(mastra) {
550
+ super.__registerMastra(mastra);
551
+ this.#mastra = mastra;
552
+ }
553
+ supportsMemory() {
554
+ return false;
555
+ }
556
+ async generate(messages, options) {
557
+ const prompt = promptToText(messages);
558
+ const runId = options?.runId ?? randomUUID();
559
+ const sdkAgent = getRunOpenAIAgent(this.resolveOpenAIAgent(), options);
560
+ const modelId = getModelId(this.options, sdkAgent);
561
+ const requestContext = options?.requestContext ?? new RequestContext();
562
+ const instructions = options?.instructions ? promptToText(options.instructions) : void 0;
563
+ const telemetry = createSDKAgentTelemetry({
564
+ agentId: this.id,
565
+ agentName: this.name,
566
+ provider: PROVIDER,
567
+ modelId,
568
+ messages,
569
+ prompt,
570
+ runId,
571
+ streaming: false,
572
+ method: "generate",
573
+ requestContext,
574
+ instructions,
575
+ maxSteps: options?.maxSteps,
576
+ tracingOptions: options?.tracingOptions,
577
+ tracingContext: options?.tracingContext,
578
+ onFinish: options?.onFinish,
579
+ onStepFinish: options?.onStepFinish,
580
+ mastra: this.#mastra
581
+ });
582
+ let result;
583
+ try {
584
+ result = await telemetry.execute(() => runOpenAIGenerate(prompt, sdkAgent, runId, telemetry, options));
585
+ telemetry.endGenerate(result);
586
+ } catch (error) {
587
+ telemetry.fail(error);
588
+ throw error;
589
+ }
590
+ return toFullOutput({
591
+ messages,
592
+ runId,
593
+ provider: PROVIDER,
594
+ result,
595
+ options: {
596
+ ...telemetry.outputOptions(),
597
+ structuredOutput: getStructuredOutputOption(options)
598
+ }
599
+ });
600
+ }
601
+ async stream(messages, options) {
602
+ const prompt = promptToText(messages);
603
+ const runId = options?.runId ?? randomUUID();
604
+ const sdkAgent = getRunOpenAIAgent(this.resolveOpenAIAgent(), options);
605
+ const modelId = getModelId(this.options, sdkAgent);
606
+ const requestContext = options?.requestContext ?? new RequestContext();
607
+ const instructions = options?.instructions ? promptToText(options.instructions) : void 0;
608
+ const telemetry = createSDKAgentTelemetry({
609
+ agentId: this.id,
610
+ agentName: this.name,
611
+ provider: PROVIDER,
612
+ modelId,
613
+ messages,
614
+ prompt,
615
+ runId,
616
+ streaming: true,
617
+ method: "stream",
618
+ requestContext,
619
+ instructions,
620
+ maxSteps: options?.maxSteps,
621
+ tracingOptions: options?.tracingOptions,
622
+ tracingContext: options?.tracingContext,
623
+ onFinish: options?.onFinish,
624
+ onStepFinish: options?.onStepFinish,
625
+ mastra: this.#mastra
626
+ });
627
+ return createMastraOutput({
628
+ messages,
629
+ runId,
630
+ modelId,
631
+ provider: PROVIDER,
632
+ stream: telemetry.wrapStream(runOpenAIAsMastraStream(prompt, sdkAgent, runId, modelId, telemetry, options)),
633
+ options: {
634
+ ...telemetry.outputOptions(),
635
+ structuredOutput: getStructuredOutputOption(options)
636
+ }
637
+ });
638
+ }
639
+ async resumeGenerate(resumeData, options) {
640
+ const data = validateOpenAIResumeData(resumeData);
641
+ return this.generate(data.message, createOpenAIResumeRunOptions(data, options));
642
+ }
643
+ async resumeStream(resumeData, options) {
644
+ const data = validateOpenAIResumeData(resumeData);
645
+ return this.stream(data.message, createOpenAIResumeRunOptions(data, options));
646
+ }
647
+ resolveOpenAIAgent() {
648
+ this.#createdAgent ??= this.options.agent ?? new Agent$1(toOpenAIAgentOptions(this.options));
649
+ return this.#createdAgent;
650
+ }
800
651
  };
801
652
  function getStructuredOutputOption(options) {
802
- return options?.structuredOutput;
653
+ return options?.structuredOutput;
803
654
  }
804
655
  function validateOpenAIResumeData(resumeData) {
805
- const record = toRecord(resumeData);
806
- if (!record || !("message" in record)) {
807
- throw new Error("OpenAISDKAgent resumeData must include a message.");
808
- }
809
- if (typeof resumeData.previousResponseId === "string" || typeof resumeData.conversationId === "string" || resumeData.session !== void 0) {
810
- return resumeData;
811
- }
812
- throw new Error("OpenAISDKAgent resumeData must include previousResponseId, conversationId, or session.");
656
+ const record = toRecord(resumeData);
657
+ if (!record || !("message" in record)) throw new Error("OpenAISDKAgent resumeData must include a message.");
658
+ if (typeof resumeData.previousResponseId === "string" || typeof resumeData.conversationId === "string" || resumeData.session !== void 0) return resumeData;
659
+ throw new Error("OpenAISDKAgent resumeData must include previousResponseId, conversationId, or session.");
813
660
  }
814
661
  function createOpenAIResumeRunOptions(resumeData, options) {
815
- return {
816
- ...options,
817
- previousResponseId: resumeData.previousResponseId ?? options?.previousResponseId,
818
- conversationId: resumeData.conversationId ?? options?.conversationId,
819
- session: resumeData.session ?? options?.session
820
- };
662
+ return {
663
+ ...options,
664
+ previousResponseId: resumeData.previousResponseId ?? options?.previousResponseId,
665
+ conversationId: resumeData.conversationId ?? options?.conversationId,
666
+ session: resumeData.session ?? options?.session
667
+ };
821
668
  }
822
669
  async function runOpenAIGenerate(prompt, agent, runId, telemetry, options) {
823
- const result = await run(agent, prompt, createOpenAIRunOptions(options, false));
824
- recordOpenAIToolTelemetry(result.newItems, telemetry);
825
- const text = getTextFromFinalOutput(result.finalOutput);
826
- const responseId = result.lastResponseId;
827
- const modelId = getModelId(void 0, result.lastAgent ?? agent, result.rawResponses.at(-1));
828
- const usage = createOpenAIUsageTotals(result.state.usage);
829
- const providerMetadata = getOpenAIProviderMetadata({
830
- modelId,
831
- responseId,
832
- lastResponseId: result.lastResponseId,
833
- rawResponseCount: result.rawResponses.length,
834
- itemCount: result.newItems.length,
835
- usage
836
- });
837
- return {
838
- content: [{ type: "text", text }],
839
- finishReason: { unified: "stop", raw: "stop" },
840
- usage: toV3Usage(usage),
841
- response: {
842
- id: responseId,
843
- modelId,
844
- timestamp: /* @__PURE__ */ new Date()
845
- },
846
- providerMetadata,
847
- object: await getStructuredOutputFromValue(result.finalOutput, options?.structuredOutput)
848
- };
670
+ const result = await run(agent, prompt, createOpenAIRunOptions(options, false));
671
+ recordOpenAIToolTelemetry(result.newItems, telemetry);
672
+ const text = getTextFromFinalOutput(result.finalOutput);
673
+ const responseId = result.lastResponseId;
674
+ const modelId = getModelId(void 0, result.lastAgent ?? agent, result.rawResponses.at(-1));
675
+ const usage = createOpenAIUsageTotals(result.state.usage);
676
+ const providerMetadata = getOpenAIProviderMetadata({
677
+ modelId,
678
+ responseId,
679
+ lastResponseId: result.lastResponseId,
680
+ rawResponseCount: result.rawResponses.length,
681
+ itemCount: result.newItems.length,
682
+ usage
683
+ });
684
+ return {
685
+ content: [{
686
+ type: "text",
687
+ text
688
+ }],
689
+ finishReason: {
690
+ unified: "stop",
691
+ raw: "stop"
692
+ },
693
+ usage: toV3Usage(usage),
694
+ response: {
695
+ id: responseId,
696
+ modelId,
697
+ timestamp: /* @__PURE__ */ new Date()
698
+ },
699
+ providerMetadata,
700
+ object: await getStructuredOutputFromValue(result.finalOutput, options?.structuredOutput)
701
+ };
849
702
  }
850
703
  function runOpenAIAsMastraStream(prompt, agent, runId, requestedModelId, telemetry, options) {
851
- return new ReadableStream({
852
- start: async (controller) => {
853
- const textId = randomUUID();
854
- let text = "";
855
- let responseId;
856
- let modelId = requestedModelId;
857
- try {
858
- const result = await run(agent, prompt, createOpenAIRunOptions(options, true));
859
- enqueueStartChunks(controller, {
860
- runId,
861
- prompt,
862
- textId,
863
- responseId,
864
- modelId
865
- });
866
- for await (const event of result) {
867
- const delta = getTextDelta(event);
868
- if (delta) {
869
- text += delta;
870
- enqueueTextDelta(controller, runId, textId, delta);
871
- }
872
- recordOpenAIStreamToolTelemetry(event, telemetry);
873
- }
874
- await result.completed;
875
- responseId = result.lastResponseId ?? responseId;
876
- modelId = getModelId(void 0, result.lastAgent ?? agent, result.rawResponses.at(-1));
877
- if (!text) {
878
- text = getTextFromFinalOutput(result.finalOutput);
879
- if (text) {
880
- enqueueTextDelta(controller, runId, textId, text);
881
- }
882
- }
883
- const usage = createOpenAIUsageTotals(result.state.usage);
884
- const providerMetadata = getOpenAIProviderMetadata({
885
- modelId,
886
- responseId,
887
- lastResponseId: result.lastResponseId,
888
- rawResponseCount: result.rawResponses.length,
889
- itemCount: result.newItems.length,
890
- usage
891
- });
892
- enqueueFinishChunks(controller, {
893
- runId,
894
- prompt,
895
- textId,
896
- text,
897
- responseId,
898
- modelId,
899
- usage: toLanguageModelUsage(toV3Usage(usage)),
900
- providerMetadata,
901
- object: await getStructuredOutputFromValue(result.finalOutput, options?.structuredOutput)
902
- });
903
- controller.close();
904
- } catch (error) {
905
- controller.enqueue({
906
- type: "error",
907
- runId,
908
- from: ChunkFrom.AGENT,
909
- payload: { error }
910
- });
911
- controller.close();
912
- }
913
- }
914
- });
704
+ return new ReadableStream({ start: async (controller) => {
705
+ const textId = randomUUID();
706
+ let text = "";
707
+ let responseId;
708
+ let modelId = requestedModelId;
709
+ try {
710
+ const result = await run(agent, prompt, createOpenAIRunOptions(options, true));
711
+ enqueueStartChunks(controller, {
712
+ runId,
713
+ prompt,
714
+ textId,
715
+ responseId,
716
+ modelId
717
+ });
718
+ for await (const event of result) {
719
+ const delta = getTextDelta(event);
720
+ if (delta) {
721
+ text += delta;
722
+ enqueueTextDelta(controller, runId, textId, delta);
723
+ }
724
+ recordOpenAIStreamToolTelemetry(event, telemetry);
725
+ }
726
+ await result.completed;
727
+ responseId = result.lastResponseId ?? responseId;
728
+ modelId = getModelId(void 0, result.lastAgent ?? agent, result.rawResponses.at(-1));
729
+ if (!text) {
730
+ text = getTextFromFinalOutput(result.finalOutput);
731
+ if (text) enqueueTextDelta(controller, runId, textId, text);
732
+ }
733
+ const usage = createOpenAIUsageTotals(result.state.usage);
734
+ const providerMetadata = getOpenAIProviderMetadata({
735
+ modelId,
736
+ responseId,
737
+ lastResponseId: result.lastResponseId,
738
+ rawResponseCount: result.rawResponses.length,
739
+ itemCount: result.newItems.length,
740
+ usage
741
+ });
742
+ enqueueFinishChunks(controller, {
743
+ runId,
744
+ prompt,
745
+ textId,
746
+ text,
747
+ responseId,
748
+ modelId,
749
+ usage: toLanguageModelUsage(toV3Usage(usage)),
750
+ providerMetadata,
751
+ object: await getStructuredOutputFromValue(result.finalOutput, options?.structuredOutput)
752
+ });
753
+ controller.close();
754
+ } catch (error) {
755
+ controller.enqueue({
756
+ type: "error",
757
+ runId,
758
+ from: ChunkFrom.AGENT,
759
+ payload: { error }
760
+ });
761
+ controller.close();
762
+ }
763
+ } });
915
764
  }
916
765
  function toOpenAIAgentOptions(options) {
917
- return {
918
- name: options.name ?? options.id,
919
- ...options.sdkOptions
920
- };
766
+ return {
767
+ name: options.name ?? options.id,
768
+ ...options.sdkOptions
769
+ };
921
770
  }
922
771
  function getRunOpenAIAgent(agent, options) {
923
- const outputType = getStructuredOutputSchema(options?.structuredOutput);
924
- if (!outputType) {
925
- return agent;
926
- }
927
- return agent.clone({ outputType });
772
+ const outputType = getStructuredOutputSchema(options?.structuredOutput);
773
+ if (!outputType) return agent;
774
+ return agent.clone({ outputType });
928
775
  }
929
776
  function createOpenAIRunOptions(options, stream) {
930
- const runOptions = { stream };
931
- addDefined(runOptions, "maxTurns", options?.maxSteps);
932
- addDefined(runOptions, "signal", options?.abortSignal ?? options?.signal);
933
- addDefined(runOptions, "conversationId", options?.conversationId);
934
- addDefined(runOptions, "previousResponseId", options?.previousResponseId);
935
- addDefined(runOptions, "session", options?.session);
936
- return runOptions;
777
+ const runOptions = { stream };
778
+ addDefined(runOptions, "maxTurns", options?.maxSteps);
779
+ addDefined(runOptions, "signal", options?.abortSignal ?? options?.signal);
780
+ addDefined(runOptions, "conversationId", options?.conversationId);
781
+ addDefined(runOptions, "previousResponseId", options?.previousResponseId);
782
+ addDefined(runOptions, "session", options?.session);
783
+ return runOptions;
937
784
  }
938
785
  function addDefined(target, key, value) {
939
- if (value !== void 0) {
940
- target[key] = value;
941
- }
786
+ if (value !== void 0) target[key] = value;
942
787
  }
943
788
  function getModelId(options, agent, rawResponse) {
944
- return getModelNameFromUnknown(rawResponse) ?? getModelNameFromUnknown(agent?.model) ?? getModelNameFromUnknown(options?.sdkOptions?.model) ?? MODEL_ID;
789
+ return getModelNameFromUnknown(rawResponse) ?? getModelNameFromUnknown(agent?.model) ?? getModelNameFromUnknown(options?.sdkOptions?.model) ?? MODEL_ID;
945
790
  }
946
791
  function getModelNameFromUnknown(value) {
947
- if (typeof value === "string") {
948
- return value;
949
- }
950
- const record = toRecord(value);
951
- return getString(record, "model") ?? getString(record, "modelId") ?? getString(record, "modelName") ?? getString(toRecord(record?.providerData), "model");
792
+ if (typeof value === "string") return value;
793
+ const record = toRecord(value);
794
+ return getString(record, "model") ?? getString(record, "modelId") ?? getString(record, "modelName") ?? getString(toRecord(record?.providerData), "model");
952
795
  }
953
796
  function getTextFromFinalOutput(output) {
954
- if (typeof output === "string") {
955
- return output;
956
- }
957
- if (output === void 0 || output === null) {
958
- return "";
959
- }
960
- return JSON.stringify(output);
797
+ if (typeof output === "string") return output;
798
+ if (output === void 0 || output === null) return "";
799
+ return JSON.stringify(output);
961
800
  }
962
801
  function createOpenAIUsageTotals(usage) {
963
- const record = toRecord(usage);
964
- if (!record) {
965
- return {};
966
- }
967
- const inputDetails = getDetailRecords(record.inputTokensDetails);
968
- const outputDetails = getDetailRecords(record.outputTokensDetails);
969
- const requestUsageEntries = Array.isArray(record.requestUsageEntries) ? record.requestUsageEntries : void 0;
970
- return {
971
- inputTokens: getNumber(record.inputTokens),
972
- outputTokens: getNumber(record.outputTokens),
973
- cacheReadInputTokens: sumDetails(inputDetails, "cachedTokens", "cached_tokens", "cacheReadInputTokens"),
974
- cacheCreationInputTokens: sumDetails(inputDetails, "cacheCreationInputTokens", "cache_creation_input_tokens"),
975
- reasoningTokens: sumDetails(outputDetails, "reasoningTokens", "reasoning_tokens"),
976
- requests: getNumber(record.requests),
977
- requestUsageEntries
978
- };
802
+ const record = toRecord(usage);
803
+ if (!record) return {};
804
+ const inputDetails = getDetailRecords(record.inputTokensDetails);
805
+ const outputDetails = getDetailRecords(record.outputTokensDetails);
806
+ const requestUsageEntries = Array.isArray(record.requestUsageEntries) ? record.requestUsageEntries : void 0;
807
+ return {
808
+ inputTokens: getNumber(record.inputTokens),
809
+ outputTokens: getNumber(record.outputTokens),
810
+ cacheReadInputTokens: sumDetails(inputDetails, "cachedTokens", "cached_tokens", "cacheReadInputTokens"),
811
+ cacheCreationInputTokens: sumDetails(inputDetails, "cacheCreationInputTokens", "cache_creation_input_tokens"),
812
+ reasoningTokens: sumDetails(outputDetails, "reasoningTokens", "reasoning_tokens"),
813
+ requests: getNumber(record.requests),
814
+ requestUsageEntries
815
+ };
979
816
  }
980
817
  function getDetailRecords(value) {
981
- if (Array.isArray(value)) {
982
- return value.filter(isRecord);
983
- }
984
- const record = toRecord(value);
985
- return record ? [record] : [];
818
+ if (Array.isArray(value)) return value.filter(isRecord);
819
+ const record = toRecord(value);
820
+ return record ? [record] : [];
986
821
  }
987
822
  function sumDetails(records, ...keys) {
988
- let total = 0;
989
- let found = false;
990
- for (const record of records) {
991
- for (const key of keys) {
992
- const value = getNumber(record[key]);
993
- if (value !== void 0) {
994
- total += value;
995
- found = true;
996
- }
997
- }
998
- }
999
- return found ? total : void 0;
823
+ let total = 0;
824
+ let found = false;
825
+ for (const record of records) for (const key of keys) {
826
+ const value = getNumber(record[key]);
827
+ if (value !== void 0) {
828
+ total += value;
829
+ found = true;
830
+ }
831
+ }
832
+ return found ? total : void 0;
1000
833
  }
1001
834
  function toV3Usage(usage) {
1002
- const totalInputTokens = usage.inputTokens;
1003
- const cacheRead = usage.cacheReadInputTokens;
1004
- const cacheWrite = usage.cacheCreationInputTokens;
1005
- const noCache = totalInputTokens === void 0 ? void 0 : Math.max(totalInputTokens - (sumDefined(cacheRead, cacheWrite) ?? 0), 0);
1006
- const outputTokens = usage.outputTokens;
1007
- const reasoningTokens = usage.reasoningTokens;
1008
- return {
1009
- inputTokens: {
1010
- total: totalInputTokens,
1011
- noCache,
1012
- cacheRead,
1013
- cacheWrite
1014
- },
1015
- outputTokens: {
1016
- total: outputTokens,
1017
- text: outputTokens,
1018
- reasoning: reasoningTokens
1019
- }
1020
- };
1021
- }
1022
- function getOpenAIProviderMetadata({
1023
- modelId,
1024
- responseId,
1025
- lastResponseId,
1026
- rawResponseCount,
1027
- itemCount,
1028
- usage
1029
- }) {
1030
- return createProviderMetadata("openai", {
1031
- model: modelId,
1032
- responseId,
1033
- lastResponseId,
1034
- rawResponseCount,
1035
- itemCount,
1036
- usage
1037
- });
835
+ const totalInputTokens = usage.inputTokens;
836
+ const cacheRead = usage.cacheReadInputTokens;
837
+ const cacheWrite = usage.cacheCreationInputTokens;
838
+ const noCache = totalInputTokens === void 0 ? void 0 : Math.max(totalInputTokens - (sumDefined(cacheRead, cacheWrite) ?? 0), 0);
839
+ const outputTokens = usage.outputTokens;
840
+ const reasoningTokens = usage.reasoningTokens;
841
+ return {
842
+ inputTokens: {
843
+ total: totalInputTokens,
844
+ noCache,
845
+ cacheRead,
846
+ cacheWrite
847
+ },
848
+ outputTokens: {
849
+ total: outputTokens,
850
+ text: outputTokens,
851
+ reasoning: reasoningTokens
852
+ }
853
+ };
854
+ }
855
+ function getOpenAIProviderMetadata({ modelId, responseId, lastResponseId, rawResponseCount, itemCount, usage }) {
856
+ return createProviderMetadata("openai", {
857
+ model: modelId,
858
+ responseId,
859
+ lastResponseId,
860
+ rawResponseCount,
861
+ itemCount,
862
+ usage
863
+ });
1038
864
  }
1039
865
  function recordOpenAIToolTelemetry(items, telemetry) {
1040
- for (const item of items) {
1041
- if (item.type === "tool_call_item") {
1042
- const toolCall = getOpenAIToolCall(item.rawItem);
1043
- if (toolCall) {
1044
- telemetry.startToolCall(toolCall);
1045
- }
1046
- continue;
1047
- }
1048
- if (item.type === "tool_call_output_item") {
1049
- const toolOutput = getOpenAIToolOutput(item.rawItem, item.output);
1050
- if (toolOutput) {
1051
- telemetry.endToolCall(toolOutput);
1052
- }
1053
- }
1054
- }
866
+ for (const item of items) {
867
+ if (item.type === "tool_call_item") {
868
+ const toolCall = getOpenAIToolCall(item.rawItem);
869
+ if (toolCall) telemetry.startToolCall(toolCall);
870
+ continue;
871
+ }
872
+ if (item.type === "tool_call_output_item") {
873
+ const toolOutput = getOpenAIToolOutput(item.rawItem, item.output);
874
+ if (toolOutput) telemetry.endToolCall(toolOutput);
875
+ }
876
+ }
1055
877
  }
1056
878
  function recordOpenAIStreamToolTelemetry(event, telemetry) {
1057
- if (event.type !== "run_item_stream_event") {
1058
- return;
1059
- }
1060
- if (event.name === "tool_called") {
1061
- const toolCall = getOpenAIToolCall(event.item.rawItem);
1062
- if (toolCall) {
1063
- telemetry.startToolCall(toolCall);
1064
- }
1065
- return;
1066
- }
1067
- if (event.name === "tool_output") {
1068
- const toolOutput = getOpenAIToolOutput(event.item.rawItem, getObjectValue(event.item, "output"));
1069
- if (toolOutput) {
1070
- telemetry.endToolCall(toolOutput);
1071
- }
1072
- }
879
+ if (event.type !== "run_item_stream_event") return;
880
+ if (event.name === "tool_called") {
881
+ const toolCall = getOpenAIToolCall(event.item.rawItem);
882
+ if (toolCall) telemetry.startToolCall(toolCall);
883
+ return;
884
+ }
885
+ if (event.name === "tool_output") {
886
+ const toolOutput = getOpenAIToolOutput(event.item.rawItem, getObjectValue(event.item, "output"));
887
+ if (toolOutput) telemetry.endToolCall(toolOutput);
888
+ }
1073
889
  }
1074
890
  function getOpenAIToolCall(rawItem) {
1075
- const record = toRecord(rawItem);
1076
- if (!record) {
1077
- return void 0;
1078
- }
1079
- if (record.type === "function_call") {
1080
- const toolCallId = getString(record, "callId") ?? getString(record, "id");
1081
- const toolName = getNamespacedToolName(record);
1082
- if (!toolCallId || !toolName) {
1083
- return void 0;
1084
- }
1085
- return {
1086
- toolCallId,
1087
- toolName,
1088
- input: parseJsonString(record.arguments)
1089
- };
1090
- }
1091
- if (record.type === "hosted_tool_call") {
1092
- const toolCallId = getString(record, "id") ?? getString(record, "name");
1093
- const toolName = getString(record, "name");
1094
- if (!toolCallId || !toolName) {
1095
- return void 0;
1096
- }
1097
- return {
1098
- toolCallId,
1099
- toolName,
1100
- input: parseJsonString(record.arguments)
1101
- };
1102
- }
1103
- if (record.type === "shell_call" || record.type === "apply_patch_call") {
1104
- const toolCallId = getString(record, "callId");
1105
- if (!toolCallId) {
1106
- return void 0;
1107
- }
1108
- return {
1109
- toolCallId,
1110
- toolName: String(record.type),
1111
- input: record.action ?? record.operation
1112
- };
1113
- }
1114
- return void 0;
891
+ const record = toRecord(rawItem);
892
+ if (!record) return;
893
+ if (record.type === "function_call") {
894
+ const toolCallId = getString(record, "callId") ?? getString(record, "id");
895
+ const toolName = getNamespacedToolName(record);
896
+ if (!toolCallId || !toolName) return;
897
+ return {
898
+ toolCallId,
899
+ toolName,
900
+ input: parseJsonString(record.arguments)
901
+ };
902
+ }
903
+ if (record.type === "hosted_tool_call") {
904
+ const toolCallId = getString(record, "id") ?? getString(record, "name");
905
+ const toolName = getString(record, "name");
906
+ if (!toolCallId || !toolName) return;
907
+ return {
908
+ toolCallId,
909
+ toolName,
910
+ input: parseJsonString(record.arguments)
911
+ };
912
+ }
913
+ if (record.type === "shell_call" || record.type === "apply_patch_call") {
914
+ const toolCallId = getString(record, "callId");
915
+ if (!toolCallId) return;
916
+ return {
917
+ toolCallId,
918
+ toolName: String(record.type),
919
+ input: record.action ?? record.operation
920
+ };
921
+ }
1115
922
  }
1116
923
  function getOpenAIToolOutput(rawItem, fallbackOutput) {
1117
- const record = toRecord(rawItem);
1118
- if (!record) {
1119
- return void 0;
1120
- }
1121
- const toolCallId = getString(record, "callId") ?? getString(record, "id");
1122
- if (!toolCallId) {
1123
- return void 0;
1124
- }
1125
- return {
1126
- toolCallId,
1127
- output: record.output ?? fallbackOutput,
1128
- isError: record.status === "failed" || record.status === "incomplete"
1129
- };
924
+ const record = toRecord(rawItem);
925
+ if (!record) return;
926
+ const toolCallId = getString(record, "callId") ?? getString(record, "id");
927
+ if (!toolCallId) return;
928
+ return {
929
+ toolCallId,
930
+ output: record.output ?? fallbackOutput,
931
+ isError: record.status === "failed" || record.status === "incomplete"
932
+ };
1130
933
  }
1131
934
  function getNamespacedToolName(record) {
1132
- const name = getString(record, "name");
1133
- const namespace = getString(record, "namespace");
1134
- if (!name) {
1135
- return void 0;
1136
- }
1137
- return namespace ? `${namespace}.${name}` : name;
935
+ const name = getString(record, "name");
936
+ const namespace = getString(record, "namespace");
937
+ if (!name) return;
938
+ return namespace ? `${namespace}.${name}` : name;
1138
939
  }
1139
940
  function getTextDelta(event) {
1140
- if (event.type !== "raw_model_stream_event") {
1141
- return "";
1142
- }
1143
- const data = toRecord(event.data);
1144
- return data?.type === "output_text_delta" && typeof data.delta === "string" ? data.delta : "";
941
+ if (event.type !== "raw_model_stream_event") return "";
942
+ const data = toRecord(event.data);
943
+ return data?.type === "output_text_delta" && typeof data.delta === "string" ? data.delta : "";
1145
944
  }
1146
945
  function parseJsonString(value) {
1147
- if (typeof value !== "string") {
1148
- return value;
1149
- }
1150
- try {
1151
- return JSON.parse(value);
1152
- } catch {
1153
- return value;
1154
- }
946
+ if (typeof value !== "string") return value;
947
+ try {
948
+ return JSON.parse(value);
949
+ } catch {
950
+ return value;
951
+ }
1155
952
  }
1156
953
  function getNumber(value) {
1157
- return typeof value === "number" ? value : void 0;
954
+ return typeof value === "number" ? value : void 0;
1158
955
  }
1159
956
  function getString(record, key) {
1160
- const value = record?.[key];
1161
- return typeof value === "string" ? value : void 0;
957
+ const value = record?.[key];
958
+ return typeof value === "string" ? value : void 0;
1162
959
  }
1163
960
  function getObjectValue(value, key) {
1164
- return toRecord(value)?.[key];
961
+ return toRecord(value)?.[key];
1165
962
  }
1166
963
  function toRecord(value) {
1167
- return isRecord(value) ? value : void 0;
964
+ return isRecord(value) ? value : void 0;
1168
965
  }
1169
966
  function isRecord(value) {
1170
- return value !== null && typeof value === "object";
967
+ return value !== null && typeof value === "object";
1171
968
  }
1172
-
969
+ //#endregion
1173
970
  export { OpenAISDKAgent };
1174
- //# sourceMappingURL=index.js.map
971
+
1175
972
  //# sourceMappingURL=index.js.map