@openai/agents-realtime 0.0.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.
Files changed (100) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +13 -0
  3. package/dist/bundle/openai-realtime-agents.mjs +8777 -0
  4. package/dist/bundle/openai-realtime-agents.umd.js +11 -0
  5. package/dist/clientMessages.d.ts +40 -0
  6. package/dist/clientMessages.js +2 -0
  7. package/dist/clientMessages.js.map +1 -0
  8. package/dist/clientMessages.mjs +2 -0
  9. package/dist/clientMessages.mjs.map +1 -0
  10. package/dist/guardrail.d.ts +32 -0
  11. package/dist/guardrail.js +34 -0
  12. package/dist/guardrail.js.map +1 -0
  13. package/dist/guardrail.mjs +34 -0
  14. package/dist/guardrail.mjs.map +1 -0
  15. package/dist/index.d.ts +18 -0
  16. package/dist/index.js +13 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/index.mjs +13 -0
  19. package/dist/index.mjs.map +1 -0
  20. package/dist/items.d.ts +183 -0
  21. package/dist/items.js +47 -0
  22. package/dist/items.js.map +1 -0
  23. package/dist/items.mjs +47 -0
  24. package/dist/items.mjs.map +1 -0
  25. package/dist/logger.d.ts +2 -0
  26. package/dist/logger.js +4 -0
  27. package/dist/logger.js.map +1 -0
  28. package/dist/logger.mjs +4 -0
  29. package/dist/logger.mjs.map +1 -0
  30. package/dist/metadata.d.ts +9 -0
  31. package/dist/metadata.js +11 -0
  32. package/dist/metadata.js.map +1 -0
  33. package/dist/metadata.mjs +11 -0
  34. package/dist/metadata.mjs.map +1 -0
  35. package/dist/openaiRealtimeBase.d.ts +143 -0
  36. package/dist/openaiRealtimeBase.js +449 -0
  37. package/dist/openaiRealtimeBase.js.map +1 -0
  38. package/dist/openaiRealtimeBase.mjs +449 -0
  39. package/dist/openaiRealtimeBase.mjs.map +1 -0
  40. package/dist/openaiRealtimeEvents.d.ts +3242 -0
  41. package/dist/openaiRealtimeEvents.js +439 -0
  42. package/dist/openaiRealtimeEvents.js.map +1 -0
  43. package/dist/openaiRealtimeEvents.mjs +439 -0
  44. package/dist/openaiRealtimeEvents.mjs.map +1 -0
  45. package/dist/openaiRealtimeWebRtc.d.ts +102 -0
  46. package/dist/openaiRealtimeWebRtc.js +245 -0
  47. package/dist/openaiRealtimeWebRtc.js.map +1 -0
  48. package/dist/openaiRealtimeWebRtc.mjs +245 -0
  49. package/dist/openaiRealtimeWebRtc.mjs.map +1 -0
  50. package/dist/openaiRealtimeWebsocket.d.ts +126 -0
  51. package/dist/openaiRealtimeWebsocket.js +293 -0
  52. package/dist/openaiRealtimeWebsocket.js.map +1 -0
  53. package/dist/openaiRealtimeWebsocket.mjs +293 -0
  54. package/dist/openaiRealtimeWebsocket.mjs.map +1 -0
  55. package/dist/realtimeAgent.d.ts +49 -0
  56. package/dist/realtimeAgent.js +37 -0
  57. package/dist/realtimeAgent.js.map +1 -0
  58. package/dist/realtimeAgent.mjs +37 -0
  59. package/dist/realtimeAgent.mjs.map +1 -0
  60. package/dist/realtimeSession.d.ts +210 -0
  61. package/dist/realtimeSession.js +469 -0
  62. package/dist/realtimeSession.js.map +1 -0
  63. package/dist/realtimeSession.mjs +469 -0
  64. package/dist/realtimeSession.mjs.map +1 -0
  65. package/dist/realtimeSessionEvents.d.ts +118 -0
  66. package/dist/realtimeSessionEvents.js +2 -0
  67. package/dist/realtimeSessionEvents.js.map +1 -0
  68. package/dist/realtimeSessionEvents.mjs +2 -0
  69. package/dist/realtimeSessionEvents.mjs.map +1 -0
  70. package/dist/shims/shims-browser.d.ts +9 -0
  71. package/dist/shims/shims-browser.js +6 -0
  72. package/dist/shims/shims-browser.js.map +1 -0
  73. package/dist/shims/shims-browser.mjs +6 -0
  74. package/dist/shims/shims-browser.mjs.map +1 -0
  75. package/dist/shims/shims-node.d.ts +2 -0
  76. package/dist/shims/shims-node.js +5 -0
  77. package/dist/shims/shims-node.js.map +1 -0
  78. package/dist/shims/shims-node.mjs +5 -0
  79. package/dist/shims/shims-node.mjs.map +1 -0
  80. package/dist/shims/shims.d.ts +1 -0
  81. package/dist/shims/shims.js +2 -0
  82. package/dist/shims/shims.js.map +1 -0
  83. package/dist/shims/shims.mjs +2 -0
  84. package/dist/shims/shims.mjs.map +1 -0
  85. package/dist/transportLayer.d.ts +96 -0
  86. package/dist/transportLayer.js +2 -0
  87. package/dist/transportLayer.js.map +1 -0
  88. package/dist/transportLayer.mjs +2 -0
  89. package/dist/transportLayer.mjs.map +1 -0
  90. package/dist/transportLayerEvents.d.ts +99 -0
  91. package/dist/transportLayerEvents.js +2 -0
  92. package/dist/transportLayerEvents.js.map +1 -0
  93. package/dist/transportLayerEvents.mjs +2 -0
  94. package/dist/transportLayerEvents.mjs.map +1 -0
  95. package/dist/utils.d.ts +61 -0
  96. package/dist/utils.js +183 -0
  97. package/dist/utils.js.map +1 -0
  98. package/dist/utils.mjs +183 -0
  99. package/dist/utils.mjs.map +1 -0
  100. package/package.json +77 -0
@@ -0,0 +1,469 @@
1
+ import { getHandoff, getTransferMessage, ModelBehaviorError, OutputGuardrailTripwireTriggered, RunContext, RunToolApprovalItem, } from '@openai/agents-core';
2
+ import { RuntimeEventEmitter } from '@openai/agents-core/_shims';
3
+ import { isZodObject, toSmartString } from '@openai/agents-core/utils';
4
+ import { defineRealtimeOutputGuardrail, getRealtimeGuardrailFeedbackMessage, getRealtimeGuardrailSettings, } from "./guardrail.js";
5
+ import { OpenAIRealtimeWebRTC } from "./openaiRealtimeWebRtc.js";
6
+ import { OpenAIRealtimeWebSocket } from "./openaiRealtimeWebsocket.js";
7
+ import { getLastTextFromAudioOutputMessage, hasWebRTCSupport, updateRealtimeHistory, } from "./utils.js";
8
+ import logger from "./logger.js";
9
+ /**
10
+ * A `RealtimeSession` is the corner piece of building Voice Agents. It's the equivalent of a
11
+ * Runner in text-based agents except that it automatically handles multiple turns by maintaining a
12
+ * connection with the underlying transport layer.
13
+ *
14
+ * The session handles managing the local history copy, executes tools, runs output guardrails, and
15
+ * facilities handoffs.
16
+ *
17
+ * The actual audio handling and generation of model responses is handled by the underlying
18
+ * transport layer. By default if you are using a browser with WebRTC support, the session will
19
+ * automatically use the WebRTC version of the OpenAI Realtime API. On the server or if you pass
20
+ * `websocket` as the transport layer, the session will establish a connection using WebSockets.
21
+ *
22
+ * In the case of WebRTC, in the browser, the transport layer will also automatically configure the
23
+ * microphone and audio output to be used by the session.
24
+ *
25
+ * You can also create a transport layer instance yourself and pass it in to have more control over
26
+ * the configuration or even extend the existing ones. Check out the `TwilioRealtimeTransportLayer`
27
+ * for an example of how to create a custom transport layer.
28
+ *
29
+ * @example
30
+ * ```ts
31
+ * const agent = new RealtimeAgent({
32
+ * name: 'my-agent',
33
+ * instructions: 'You are a helpful assistant that can answer questions and help with tasks.',
34
+ * })
35
+ *
36
+ * const session = new RealtimeSession(agent);
37
+ * session.connect({
38
+ * apiKey: 'your-api-key',
39
+ * });
40
+ * ```
41
+ */
42
+ export class RealtimeSession extends RuntimeEventEmitter {
43
+ initialAgent;
44
+ options;
45
+ #transport;
46
+ #currentAgent;
47
+ #currentTools = [];
48
+ #context;
49
+ #outputGuardrails = [];
50
+ #outputGuardrailSettings;
51
+ #transcribedTextDeltas = {};
52
+ #history = [];
53
+ #shouldIncludeAudioData;
54
+ constructor(initialAgent, options = {}) {
55
+ super();
56
+ this.initialAgent = initialAgent;
57
+ this.options = options;
58
+ if ((typeof options.transport === 'undefined' && hasWebRTCSupport()) ||
59
+ options.transport === 'webrtc') {
60
+ this.#transport = new OpenAIRealtimeWebRTC();
61
+ }
62
+ else if (options.transport === 'websocket' ||
63
+ typeof options.transport === 'undefined') {
64
+ this.#transport = new OpenAIRealtimeWebSocket();
65
+ }
66
+ else {
67
+ this.#transport = options.transport;
68
+ }
69
+ this.#currentAgent = initialAgent;
70
+ this.#context = new RunContext({
71
+ ...(options.context ?? {}),
72
+ history: this.#history,
73
+ });
74
+ this.#outputGuardrails = (options.outputGuardrails ?? []).map(defineRealtimeOutputGuardrail);
75
+ this.#outputGuardrailSettings = getRealtimeGuardrailSettings(options.outputGuardrailSettings ?? {});
76
+ this.#shouldIncludeAudioData = options.historyStoreAudio ?? false;
77
+ }
78
+ /**
79
+ * The transport layer used by the session.
80
+ */
81
+ get transport() {
82
+ return this.#transport;
83
+ }
84
+ /**
85
+ * The current agent in the session.
86
+ */
87
+ get currentAgent() {
88
+ return this.#currentAgent;
89
+ }
90
+ /**
91
+ * The current usage of the session.
92
+ */
93
+ get usage() {
94
+ return this.#context.usage;
95
+ }
96
+ /**
97
+ * The current context of the session.
98
+ */
99
+ get context() {
100
+ return this.#context;
101
+ }
102
+ /**
103
+ * Whether the session is muted. Might be `null` if the underlying transport layer does not
104
+ * support muting.
105
+ */
106
+ get muted() {
107
+ return this.#transport.muted;
108
+ }
109
+ /**
110
+ * The history of the session.
111
+ */
112
+ get history() {
113
+ return this.#history;
114
+ }
115
+ async #setCurrentAgent(agent) {
116
+ this.#currentAgent = agent;
117
+ const handoffs = this.#currentAgent.handoffs.map(getHandoff);
118
+ const handoffTools = handoffs.map((handoff) => handoff.getHandoffAsFunctionTool());
119
+ this.#currentTools = [
120
+ ...(await this.#currentAgent.getAllTools()).filter((tool) => tool.type === 'function'),
121
+ ...handoffTools,
122
+ ];
123
+ }
124
+ async #getSessionConfig(additionalConfig = {}) {
125
+ const instructions = await this.#currentAgent.getSystemPrompt(this.#context);
126
+ const tracingConfig = this.options
127
+ .tracingDisabled
128
+ ? null
129
+ : this.options.workflowName
130
+ ? {
131
+ workflow_name: this.options.workflowName,
132
+ }
133
+ : 'auto';
134
+ if (tracingConfig !== null && tracingConfig !== 'auto') {
135
+ if (this.options.groupId) {
136
+ tracingConfig.group_id = this.options.groupId;
137
+ }
138
+ if (this.options.traceMetadata) {
139
+ tracingConfig.metadata = this.options.traceMetadata;
140
+ }
141
+ }
142
+ else if (this.options.groupId || this.options.traceMetadata) {
143
+ logger.warn('In order to set traceMetadata or a groupId you need to specify a workflowName.');
144
+ }
145
+ return {
146
+ instructions,
147
+ voice: this.#currentAgent.voice,
148
+ model: this.options.model,
149
+ tools: this.#currentTools,
150
+ tracing: tracingConfig,
151
+ ...additionalConfig,
152
+ };
153
+ }
154
+ async updateAgent(newAgent) {
155
+ this.#currentAgent.emit('agent_handoff', this.#context, newAgent);
156
+ this.emit('agent_handoff', this.#context, this.#currentAgent, newAgent);
157
+ await this.#setCurrentAgent(newAgent);
158
+ await this.#transport.updateSessionConfig(await this.#getSessionConfig());
159
+ return newAgent;
160
+ }
161
+ async #handleHandoff(toolCall, handoff) {
162
+ const newAgent = (await handoff.onInvokeHandoff(this.#context, toolCall.arguments));
163
+ this.#currentAgent.emit('agent_handoff', this.#context, newAgent);
164
+ this.emit('agent_handoff', this.#context, this.#currentAgent, newAgent);
165
+ // update session with new agent
166
+ await this.#setCurrentAgent(newAgent);
167
+ await this.#transport.updateSessionConfig(await this.#getSessionConfig());
168
+ const output = getTransferMessage(newAgent);
169
+ this.#transport.sendFunctionCallOutput(toolCall, output, true);
170
+ return newAgent;
171
+ }
172
+ async #handleFunctionToolCall(toolCall, tool) {
173
+ this.#context.context.history = JSON.parse(JSON.stringify(this.#history)); // deep copy of the history
174
+ let parsedArgs = toolCall.arguments;
175
+ if (tool.parameters) {
176
+ if (isZodObject(tool.parameters)) {
177
+ parsedArgs = tool.parameters.parse(parsedArgs);
178
+ }
179
+ else {
180
+ parsedArgs = JSON.parse(parsedArgs);
181
+ }
182
+ }
183
+ const needsApproval = await tool.needsApproval(this.#context, parsedArgs, toolCall.callId);
184
+ if (needsApproval) {
185
+ const approval = this.context.isToolApproved({
186
+ toolName: tool.name,
187
+ callId: toolCall.callId,
188
+ });
189
+ if (approval === false) {
190
+ this.emit('agent_tool_start', this.#context, this.#currentAgent, tool);
191
+ this.#currentAgent.emit('agent_tool_start', this.#context, tool);
192
+ const result = 'Tool execution was not approved.';
193
+ this.#transport.sendFunctionCallOutput(toolCall, result, true);
194
+ this.emit('agent_tool_end', this.#context, this.#currentAgent, tool, result);
195
+ this.#currentAgent.emit('agent_tool_end', this.#context, tool, result);
196
+ return;
197
+ }
198
+ else if (typeof approval === 'undefined') {
199
+ this.emit('tool_approval_requested', this.#context, this.#currentAgent, {
200
+ type: 'function_approval',
201
+ tool,
202
+ approvalItem: new RunToolApprovalItem(toolCall, this.#currentAgent),
203
+ });
204
+ return;
205
+ }
206
+ }
207
+ this.emit('agent_tool_start', this.#context, this.#currentAgent, tool);
208
+ this.#currentAgent.emit('agent_tool_start', this.#context, tool);
209
+ this.#context.context.history = JSON.parse(JSON.stringify(this.#history)); // deep copy of the history
210
+ const result = await tool.invoke(this.#context, toolCall.arguments);
211
+ const stringResult = toSmartString(result);
212
+ this.#transport.sendFunctionCallOutput(toolCall, stringResult, true);
213
+ this.emit('agent_tool_end', this.#context, this.#currentAgent, tool, stringResult);
214
+ this.#currentAgent.emit('agent_tool_end', this.#context, tool, stringResult);
215
+ }
216
+ async #handleFunctionCall(toolCall) {
217
+ const handoffMap = new Map(this.#currentAgent.handoffs
218
+ .map(getHandoff)
219
+ .map((handoff) => [handoff.toolName, handoff]));
220
+ const functionToolMap = new Map((await this.#currentAgent.getAllTools()).map((tool) => [tool.name, tool]));
221
+ const possibleHandoff = handoffMap.get(toolCall.name);
222
+ if (possibleHandoff) {
223
+ await this.#handleHandoff(toolCall, possibleHandoff);
224
+ }
225
+ else {
226
+ const functionTool = functionToolMap.get(toolCall.name);
227
+ if (functionTool && functionTool.type === 'function') {
228
+ await this.#handleFunctionToolCall(toolCall, functionTool);
229
+ }
230
+ else {
231
+ throw new ModelBehaviorError(`Tool ${toolCall.name} not found`);
232
+ }
233
+ }
234
+ }
235
+ async #runOutputGuardrails(output) {
236
+ if (this.#outputGuardrails.length === 0) {
237
+ return;
238
+ }
239
+ const guardrailArgs = {
240
+ agent: this.#currentAgent,
241
+ agentOutput: output,
242
+ context: this.#context,
243
+ };
244
+ const results = await Promise.all(this.#outputGuardrails.map((guardrail) => guardrail.run(guardrailArgs)));
245
+ for (const result of results) {
246
+ if (result.output.tripwireTriggered) {
247
+ const error = new OutputGuardrailTripwireTriggered(`Output guardrail triggered: ${JSON.stringify(result.output.outputInfo)}`, result);
248
+ this.emit('guardrail_tripped', this.#context, this.#currentAgent, error);
249
+ this.interrupt();
250
+ const feedbackText = getRealtimeGuardrailFeedbackMessage(result);
251
+ this.sendMessage(feedbackText);
252
+ break;
253
+ }
254
+ }
255
+ }
256
+ #setEventListeners() {
257
+ this.#transport.on('*', (event) => {
258
+ this.emit('transport_event', event);
259
+ });
260
+ this.#transport.on('audio', (event) => {
261
+ this.emit('audio', event);
262
+ });
263
+ this.#transport.on('turn_started', () => {
264
+ this.emit('agent_start', this.#context, this.#currentAgent);
265
+ this.#currentAgent.emit('agent_start', this.#context, this.#currentAgent);
266
+ });
267
+ this.#transport.on('turn_done', (event) => {
268
+ const item = event.response.output[event.response.output.length - 1];
269
+ const textOutput = getLastTextFromAudioOutputMessage(item) ?? '';
270
+ this.emit('agent_end', this.#context, this.#currentAgent, textOutput);
271
+ this.#currentAgent.emit('agent_end', this.#context, textOutput);
272
+ this.#runOutputGuardrails(textOutput);
273
+ });
274
+ this.#transport.on('audio_done', () => {
275
+ this.emit('audio_stopped', this.#context, this.#currentAgent);
276
+ });
277
+ let lastRunIndex = 0;
278
+ let lastItemId;
279
+ this.#transport.on('audio_transcript_delta', (event) => {
280
+ try {
281
+ const delta = event.delta;
282
+ const itemId = event.itemId;
283
+ if (lastItemId !== itemId) {
284
+ lastItemId = itemId;
285
+ lastRunIndex = 0;
286
+ }
287
+ const currentText = this.#transcribedTextDeltas[itemId] ?? '';
288
+ const newText = currentText + delta;
289
+ this.#transcribedTextDeltas[itemId] = newText;
290
+ if (this.#outputGuardrailSettings.debounceTextLength < 0) {
291
+ return;
292
+ }
293
+ const newRunIndex = Math.floor(newText.length / this.#outputGuardrailSettings.debounceTextLength);
294
+ if (newRunIndex > lastRunIndex) {
295
+ lastRunIndex = newRunIndex;
296
+ // We don't cancel existing runs because we want the first one to fail to fail
297
+ // The transport layer should upon failure handle the interruption and stop the model
298
+ // from generating further
299
+ this.#runOutputGuardrails(newText);
300
+ }
301
+ }
302
+ catch (err) {
303
+ this.emit('error', {
304
+ type: 'error',
305
+ error: err,
306
+ });
307
+ }
308
+ });
309
+ this.#transport.on('item_update', (event) => {
310
+ try {
311
+ const isNew = !this.#history.some((item) => item.itemId === event.itemId);
312
+ this.#history = updateRealtimeHistory(this.#history, event, this.#shouldIncludeAudioData);
313
+ this.#context.context.history = this.#history;
314
+ if (isNew) {
315
+ const addedItem = this.#history.find((item) => item.itemId === event.itemId);
316
+ if (addedItem) {
317
+ this.emit('history_added', addedItem);
318
+ }
319
+ }
320
+ this.emit('history_updated', this.#history);
321
+ }
322
+ catch (err) {
323
+ this.emit('error', {
324
+ type: 'error',
325
+ error: err,
326
+ });
327
+ }
328
+ });
329
+ this.#transport.on('item_deleted', (event) => {
330
+ try {
331
+ this.#history = this.#history.filter((item) => item.itemId !== event.itemId);
332
+ this.#context.context.history = this.#history;
333
+ this.emit('history_updated', this.#history);
334
+ }
335
+ catch (err) {
336
+ this.emit('error', {
337
+ type: 'error',
338
+ error: err,
339
+ });
340
+ }
341
+ });
342
+ this.#transport.on('function_call', async (event) => {
343
+ try {
344
+ await this.#handleFunctionCall(event);
345
+ }
346
+ catch (error) {
347
+ logger.error('Error handling function call', error);
348
+ this.emit('error', {
349
+ type: 'error',
350
+ error,
351
+ });
352
+ }
353
+ });
354
+ this.#transport.on('usage_update', (usage) => {
355
+ this.#context.usage.add(usage);
356
+ });
357
+ this.#transport.on('audio_interrupted', () => {
358
+ this.emit('audio_interrupted', this.#context, this.#currentAgent);
359
+ });
360
+ this.#transport.on('error', (error) => {
361
+ this.emit('error', error);
362
+ });
363
+ }
364
+ /**
365
+ * Connect to the session. This will establish the connection to the underlying transport layer
366
+ * and start the session.
367
+ *
368
+ * After connecting, the session will also emit a `history_updated` event with an empty history.
369
+ *
370
+ * @param options - The options for the connection.
371
+ */
372
+ async connect(options) {
373
+ // makes sure the current agent is correctly set and loads the tools
374
+ await this.#setCurrentAgent(this.initialAgent);
375
+ this.#setEventListeners();
376
+ await this.#transport.connect({
377
+ apiKey: options.apiKey ?? this.options.apiKey,
378
+ model: this.options.model,
379
+ initialSessionConfig: await this.#getSessionConfig(this.options.config),
380
+ });
381
+ this.#history = [];
382
+ this.emit('history_updated', this.#history);
383
+ }
384
+ /**
385
+ * Update the history of the session.
386
+ * @param newHistory - The new history to set.
387
+ */
388
+ updateHistory(newHistory) {
389
+ let updatedHistory;
390
+ if (typeof newHistory === 'function') {
391
+ updatedHistory = newHistory(this.#history);
392
+ }
393
+ else {
394
+ updatedHistory = newHistory;
395
+ }
396
+ this.#transport.resetHistory(this.#history, updatedHistory);
397
+ }
398
+ /**
399
+ * Send a message to the session.
400
+ * @param message - The message to send.
401
+ * @param otherEventData - Additional event data to send.
402
+ */
403
+ sendMessage(message, otherEventData = {}) {
404
+ this.#transport.sendMessage(message, otherEventData);
405
+ }
406
+ /**
407
+ * Mute the session.
408
+ * @param muted - Whether to mute the session.
409
+ */
410
+ mute(muted) {
411
+ this.#transport.mute(muted);
412
+ }
413
+ /**
414
+ * Disconnect from the session.
415
+ */
416
+ close() {
417
+ this.#transport.close();
418
+ }
419
+ /**
420
+ * Send audio to the session.
421
+ * @param audio - The audio to send.
422
+ * @param options - Additional options.
423
+ * @param options.commit - Whether to finish the turn with this audio.
424
+ */
425
+ sendAudio(audio, options = {}) {
426
+ this.#transport.sendAudio(audio, options);
427
+ }
428
+ /**
429
+ * Interrupt the session artificially for example if you want to build a "stop talking"
430
+ * button.
431
+ */
432
+ interrupt() {
433
+ this.#transport.interrupt();
434
+ }
435
+ /**
436
+ * Approve a tool call. This will also trigger the tool call to the agent.
437
+ * @param approvalItem - The approval item to approve.
438
+ * @param options - Additional options.
439
+ * @param options.alwaysApprove - Whether to always approve the tool call.
440
+ */
441
+ async approve(approvalItem, options = { alwaysApprove: false }) {
442
+ this.#context.approveTool(approvalItem, options);
443
+ const tool = this.#currentAgent.tools.find((tool) => tool.name === approvalItem.rawItem.name);
444
+ if (tool && tool.type === 'function') {
445
+ await this.#handleFunctionToolCall(approvalItem.rawItem, tool);
446
+ }
447
+ else {
448
+ throw new ModelBehaviorError(`Tool ${approvalItem.rawItem.name} not found`);
449
+ }
450
+ }
451
+ /**
452
+ * Reject a tool call. This will also trigger the tool call to the agent.
453
+ * @param approvalItem - The approval item to reject.
454
+ * @param options - Additional options.
455
+ * @param options.alwaysReject - Whether to always reject the tool call.
456
+ */
457
+ async reject(approvalItem, options = { alwaysReject: false }) {
458
+ this.#context.rejectTool(approvalItem, options);
459
+ // we still need to simulate a tool call to the agent to let the agent know
460
+ const tool = this.#currentAgent.tools.find((tool) => tool.name === approvalItem.rawItem.name);
461
+ if (tool && tool.type === 'function') {
462
+ await this.#handleFunctionToolCall(approvalItem.rawItem, tool);
463
+ }
464
+ else {
465
+ throw new ModelBehaviorError(`Tool ${approvalItem.rawItem.name} not found`);
466
+ }
467
+ }
468
+ }
469
+ //# sourceMappingURL=realtimeSession.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"realtimeSession.js","sourceRoot":"","sources":["../src/realtimeSession.ts"],"names":[],"mappings":"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"}