@openai/agents-openai 0.4.14 → 0.5.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 (40) hide show
  1. package/dist/defaults.d.ts +4 -0
  2. package/dist/defaults.js +15 -1
  3. package/dist/defaults.js.map +1 -1
  4. package/dist/defaults.mjs +11 -0
  5. package/dist/defaults.mjs.map +1 -1
  6. package/dist/index.d.ts +3 -2
  7. package/dist/index.js +5 -1
  8. package/dist/index.js.map +1 -1
  9. package/dist/index.mjs +3 -2
  10. package/dist/index.mjs.map +1 -1
  11. package/dist/metadata.js +2 -2
  12. package/dist/metadata.js.map +1 -1
  13. package/dist/metadata.mjs +2 -2
  14. package/dist/metadata.mjs.map +1 -1
  15. package/dist/openaiProvider.d.ts +7 -0
  16. package/dist/openaiProvider.js +84 -2
  17. package/dist/openaiProvider.js.map +1 -1
  18. package/dist/openaiProvider.mjs +86 -4
  19. package/dist/openaiProvider.mjs.map +1 -1
  20. package/dist/openaiResponsesModel.d.ts +28 -1
  21. package/dist/openaiResponsesModel.js +435 -33
  22. package/dist/openaiResponsesModel.js.map +1 -1
  23. package/dist/openaiResponsesModel.mjs +433 -32
  24. package/dist/openaiResponsesModel.mjs.map +1 -1
  25. package/dist/responsesTransportUtils.d.ts +29 -0
  26. package/dist/responsesTransportUtils.js +208 -0
  27. package/dist/responsesTransportUtils.js.map +1 -0
  28. package/dist/responsesTransportUtils.mjs +198 -0
  29. package/dist/responsesTransportUtils.mjs.map +1 -0
  30. package/dist/responsesWebSocketConnection.d.ts +22 -0
  31. package/dist/responsesWebSocketConnection.js +273 -0
  32. package/dist/responsesWebSocketConnection.js.map +1 -0
  33. package/dist/responsesWebSocketConnection.mjs +259 -0
  34. package/dist/responsesWebSocketConnection.mjs.map +1 -0
  35. package/dist/responsesWebSocketSession.d.ts +22 -0
  36. package/dist/responsesWebSocketSession.js +56 -0
  37. package/dist/responsesWebSocketSession.js.map +1 -0
  38. package/dist/responsesWebSocketSession.mjs +53 -0
  39. package/dist/responsesWebSocketSession.mjs.map +1 -0
  40. package/package.json +2 -2
@@ -0,0 +1,259 @@
1
+ import { UserError } from '@openai/agents-core';
2
+ import OpenAI from 'openai';
3
+ export class ResponsesWebSocketInternalError extends Error {
4
+ code;
5
+ constructor(code, message) {
6
+ super(message);
7
+ this.name = 'ResponsesWebSocketInternalError';
8
+ this.code = code;
9
+ }
10
+ }
11
+ export function throwIfAborted(signal) {
12
+ if (signal?.aborted) {
13
+ throw new OpenAI.APIUserAbortError();
14
+ }
15
+ }
16
+ export async function withAbortSignal(promise, signal) {
17
+ throwIfAborted(signal);
18
+ if (!signal) {
19
+ return promise;
20
+ }
21
+ return await new Promise((resolve, reject) => {
22
+ const onAbort = () => {
23
+ reject(new OpenAI.APIUserAbortError());
24
+ };
25
+ signal.addEventListener('abort', onAbort, { once: true });
26
+ promise.then((value) => {
27
+ signal.removeEventListener('abort', onAbort);
28
+ resolve(value);
29
+ }, (error) => {
30
+ signal.removeEventListener('abort', onAbort);
31
+ reject(error);
32
+ });
33
+ });
34
+ }
35
+ export async function withTimeout(promise, timeoutMs, errorMessage) {
36
+ if (typeof timeoutMs !== 'number' ||
37
+ !Number.isFinite(timeoutMs) ||
38
+ timeoutMs <= 0) {
39
+ return await promise;
40
+ }
41
+ return await new Promise((resolve, reject) => {
42
+ const timeoutId = setTimeout(() => {
43
+ reject(new Error(errorMessage));
44
+ }, timeoutMs);
45
+ promise.then((value) => {
46
+ clearTimeout(timeoutId);
47
+ resolve(value);
48
+ }, (error) => {
49
+ clearTimeout(timeoutId);
50
+ reject(error);
51
+ });
52
+ });
53
+ }
54
+ export async function webSocketFrameToText(frame) {
55
+ if (typeof frame === 'string') {
56
+ return frame;
57
+ }
58
+ if (typeof Blob !== 'undefined' && frame instanceof Blob) {
59
+ return await frame.text();
60
+ }
61
+ if (frame instanceof ArrayBuffer) {
62
+ return new TextDecoder().decode(new Uint8Array(frame));
63
+ }
64
+ if (ArrayBuffer.isView(frame)) {
65
+ return new TextDecoder().decode(new Uint8Array(frame.buffer, frame.byteOffset, frame.byteLength));
66
+ }
67
+ throw new Error('Unsupported websocket frame type for Responses API.');
68
+ }
69
+ export function shouldWrapNoEventWebSocketError(error) {
70
+ if (error instanceof ResponsesWebSocketInternalError) {
71
+ return (error.code === 'connection_closed_before_opening' ||
72
+ error.code === 'connection_closed_before_terminal_response_event');
73
+ }
74
+ if (!(error instanceof Error)) {
75
+ return false;
76
+ }
77
+ return (error.message === 'Responses websocket connection closed before opening.' ||
78
+ error.message ===
79
+ 'Responses websocket connection closed before a terminal response event.');
80
+ }
81
+ export function isWebSocketNotOpenError(error) {
82
+ if (error instanceof ResponsesWebSocketInternalError) {
83
+ return error.code === 'socket_not_open';
84
+ }
85
+ if (!(error instanceof Error)) {
86
+ return false;
87
+ }
88
+ if (error.message === 'Responses websocket is not open.') {
89
+ return true;
90
+ }
91
+ // Native WebSocket implementations can throw InvalidStateError/DOMException
92
+ // if the socket closes after the readyState check but before send().
93
+ if (error.name === 'InvalidStateError') {
94
+ return true;
95
+ }
96
+ // `ws` throws a plain Error with this message shape for send races.
97
+ if (error.message.startsWith('WebSocket is not open: readyState ')) {
98
+ return true;
99
+ }
100
+ return false;
101
+ }
102
+ export class ResponsesWebSocketConnection {
103
+ #socket;
104
+ #messages = [];
105
+ #waiters = [];
106
+ #closed = false;
107
+ #error;
108
+ #closedPromise;
109
+ #resolveClosed;
110
+ constructor(socket) {
111
+ this.#socket = socket;
112
+ this.#closedPromise = new Promise((resolve) => {
113
+ this.#resolveClosed = resolve;
114
+ });
115
+ this.#socket.addEventListener('message', this.#onMessage);
116
+ this.#socket.addEventListener('error', this.#onError);
117
+ this.#socket.addEventListener('close', this.#onClose);
118
+ }
119
+ static async connect(url, headers, signal, timeoutMs, timeoutErrorMessage) {
120
+ const WebSocketCtor = globalThis.WebSocket;
121
+ if (!WebSocketCtor) {
122
+ throw new UserError('Responses websocket transport requires a global WebSocket implementation.');
123
+ }
124
+ let socket;
125
+ try {
126
+ socket = new WebSocketCtor(url, { headers });
127
+ }
128
+ catch (error) {
129
+ const wrappedError = new UserError('Responses websocket transport requires a WebSocket implementation that supports custom headers.');
130
+ wrappedError.cause = error;
131
+ throw wrappedError;
132
+ }
133
+ const connection = new ResponsesWebSocketConnection(socket);
134
+ try {
135
+ await connection.waitForOpen(signal, timeoutMs, timeoutErrorMessage);
136
+ }
137
+ catch (error) {
138
+ await connection.close();
139
+ throw error;
140
+ }
141
+ return connection;
142
+ }
143
+ async waitForOpen(signal, timeoutMs, timeoutErrorMessage) {
144
+ if (this.#socket.readyState === this.#socket.OPEN) {
145
+ return;
146
+ }
147
+ if (this.#error) {
148
+ throw this.#error;
149
+ }
150
+ if (this.#closed ||
151
+ this.#socket.readyState === this.#socket.CLOSED ||
152
+ this.#socket.readyState === this.#socket.CLOSING) {
153
+ throw new ResponsesWebSocketInternalError('connection_closed_before_opening', 'Responses websocket connection closed before opening.');
154
+ }
155
+ const openPromise = new Promise((resolve, reject) => {
156
+ const onOpen = () => {
157
+ cleanup();
158
+ resolve();
159
+ };
160
+ const onError = () => {
161
+ cleanup();
162
+ reject(this.#error ??
163
+ new Error('Responses websocket connection failed to open.'));
164
+ };
165
+ const onClose = () => {
166
+ cleanup();
167
+ reject(this.#error ??
168
+ new ResponsesWebSocketInternalError('connection_closed_before_opening', 'Responses websocket connection closed before opening.'));
169
+ };
170
+ const cleanup = () => {
171
+ this.#socket.removeEventListener('open', onOpen);
172
+ this.#socket.removeEventListener('error', onError);
173
+ this.#socket.removeEventListener('close', onClose);
174
+ };
175
+ this.#socket.addEventListener('open', onOpen);
176
+ this.#socket.addEventListener('error', onError);
177
+ this.#socket.addEventListener('close', onClose);
178
+ });
179
+ await withAbortSignal(withTimeout(openPromise, timeoutMs, timeoutErrorMessage ??
180
+ `Responses websocket connection timed out before opening after ${timeoutMs}ms.`), signal);
181
+ }
182
+ async send(data) {
183
+ if (this.#socket.readyState !== this.#socket.OPEN) {
184
+ throw new ResponsesWebSocketInternalError('socket_not_open', 'Responses websocket is not open.');
185
+ }
186
+ this.#socket.send(data);
187
+ }
188
+ isReusable() {
189
+ return (!this.#closed &&
190
+ !this.#error &&
191
+ this.#socket.readyState === this.#socket.OPEN);
192
+ }
193
+ async nextFrame(signal) {
194
+ throwIfAborted(signal);
195
+ return await withAbortSignal(this.#nextFrameInternal(), signal);
196
+ }
197
+ async close() {
198
+ if (!this.#closed) {
199
+ try {
200
+ this.#socket.close();
201
+ }
202
+ catch {
203
+ // Ignore close errors and wait for the socket to settle.
204
+ }
205
+ }
206
+ await this.#closedPromise;
207
+ }
208
+ async #nextFrameInternal() {
209
+ if (this.#messages.length > 0) {
210
+ return this.#messages.shift() ?? null;
211
+ }
212
+ if (this.#error) {
213
+ throw this.#error;
214
+ }
215
+ if (this.#closed) {
216
+ return null;
217
+ }
218
+ return await new Promise((resolve, reject) => {
219
+ this.#waiters.push({ resolve, reject });
220
+ });
221
+ }
222
+ #onMessage = (event) => {
223
+ const data = event.data;
224
+ const waiter = this.#waiters.shift();
225
+ if (waiter) {
226
+ waiter.resolve(data);
227
+ return;
228
+ }
229
+ this.#messages.push(data);
230
+ };
231
+ #onError = (event) => {
232
+ const maybeError = event?.error;
233
+ const maybeMessage = event?.message;
234
+ this.#error =
235
+ maybeError instanceof Error
236
+ ? maybeError
237
+ : new Error(typeof maybeMessage === 'string' && maybeMessage.length > 0
238
+ ? maybeMessage
239
+ : 'Responses websocket connection error.');
240
+ const waiters = this.#waiters.splice(0);
241
+ for (const waiter of waiters) {
242
+ waiter.reject(this.#error);
243
+ }
244
+ };
245
+ #onClose = () => {
246
+ this.#closed = true;
247
+ this.#resolveClosed();
248
+ const waiters = this.#waiters.splice(0);
249
+ for (const waiter of waiters) {
250
+ if (this.#error) {
251
+ waiter.reject(this.#error);
252
+ }
253
+ else {
254
+ waiter.resolve(null);
255
+ }
256
+ }
257
+ };
258
+ }
259
+ //# sourceMappingURL=responsesWebSocketConnection.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"responsesWebSocketConnection.mjs","sourceRoot":"","sources":["../src/responsesWebSocketConnection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { Runner, type RunConfig } from '@openai/agents-core';
2
+ import { OpenAIProvider, type OpenAIProviderOptions } from './openaiProvider';
3
+ export type ResponsesWebSocketSessionOptions = {
4
+ /**
5
+ * Options used to construct the session-scoped OpenAI provider.
6
+ */
7
+ providerOptions?: OpenAIProviderOptions;
8
+ /**
9
+ * Runner configuration for the session. modelProvider is controlled by this helper.
10
+ */
11
+ runnerConfig?: Omit<Partial<RunConfig>, 'modelProvider'>;
12
+ };
13
+ export type ResponsesWebSocketSession = {
14
+ provider: OpenAIProvider;
15
+ runner: Runner;
16
+ run: Runner['run'];
17
+ };
18
+ /**
19
+ * Runs a callback within a session-scoped Responses API websocket provider/runner and closes the
20
+ * provider afterwards so websocket connections do not keep the process alive.
21
+ */
22
+ export declare function withResponsesWebSocketSession<T>(callback: (session: ResponsesWebSocketSession) => Promise<T> | T, options?: ResponsesWebSocketSessionOptions): Promise<T>;
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.withResponsesWebSocketSession = withResponsesWebSocketSession;
4
+ const agents_core_1 = require("@openai/agents-core");
5
+ const openaiProvider_1 = require("./openaiProvider.js");
6
+ function attachCleanupErrorToThrownError(callbackError, cleanupError) {
7
+ if (!(callbackError instanceof Error)) {
8
+ return;
9
+ }
10
+ const callbackErrorWithMetadata = callbackError;
11
+ if (typeof callbackErrorWithMetadata.cause === 'undefined') {
12
+ callbackErrorWithMetadata.cause = cleanupError;
13
+ return;
14
+ }
15
+ callbackErrorWithMetadata.cleanupError = cleanupError;
16
+ }
17
+ /**
18
+ * Runs a callback within a session-scoped Responses API websocket provider/runner and closes the
19
+ * provider afterwards so websocket connections do not keep the process alive.
20
+ */
21
+ async function withResponsesWebSocketSession(callback, options = {}) {
22
+ const provider = new openaiProvider_1.OpenAIProvider({
23
+ ...(options.providerOptions ?? {}),
24
+ useResponses: true,
25
+ useResponsesWebSocket: true,
26
+ });
27
+ const runner = new agents_core_1.Runner({
28
+ ...(options.runnerConfig ?? {}),
29
+ modelProvider: provider,
30
+ });
31
+ const run = runner.run.bind(runner);
32
+ let callbackFailed = false;
33
+ let callbackError;
34
+ let callbackResult;
35
+ try {
36
+ callbackResult = await callback({ provider, runner, run });
37
+ }
38
+ catch (error) {
39
+ callbackFailed = true;
40
+ callbackError = error;
41
+ }
42
+ try {
43
+ await provider.close();
44
+ }
45
+ catch (closeError) {
46
+ if (!callbackFailed) {
47
+ throw closeError;
48
+ }
49
+ attachCleanupErrorToThrownError(callbackError, closeError);
50
+ }
51
+ if (callbackFailed) {
52
+ throw callbackError;
53
+ }
54
+ return callbackResult;
55
+ }
56
+ //# sourceMappingURL=responsesWebSocketSession.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"responsesWebSocketSession.js","sourceRoot":"","sources":["../src/responsesWebSocketSession.ts"],"names":[],"mappings":";;AA6CA,sEAwCC;AArFD,qDAA6D;AAC7D,wDAA8E;AAmB9E,SAAS,+BAA+B,CACtC,aAAsB,EACtB,YAAqB;IAErB,IAAI,CAAC,CAAC,aAAa,YAAY,KAAK,CAAC,EAAE,CAAC;QACtC,OAAO;IACT,CAAC;IAED,MAAM,yBAAyB,GAAG,aAGjC,CAAC;IAEF,IAAI,OAAO,yBAAyB,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;QAC3D,yBAAyB,CAAC,KAAK,GAAG,YAAY,CAAC;QAC/C,OAAO;IACT,CAAC;IAED,yBAAyB,CAAC,YAAY,GAAG,YAAY,CAAC;AACxD,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,6BAA6B,CACjD,QAAgE,EAChE,UAA4C,EAAE;IAE9C,MAAM,QAAQ,GAAG,IAAI,+BAAc,CAAC;QAClC,GAAG,CAAC,OAAO,CAAC,eAAe,IAAI,EAAE,CAAC;QAClC,YAAY,EAAE,IAAI;QAClB,qBAAqB,EAAE,IAAI;KAC5B,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,IAAI,oBAAM,CAAC;QACxB,GAAG,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC;QAC/B,aAAa,EAAE,QAAQ;KACxB,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAkB,CAAC;IAErD,IAAI,cAAc,GAAG,KAAK,CAAC;IAC3B,IAAI,aAAsB,CAAC;IAC3B,IAAI,cAAkB,CAAC;IAEvB,IAAI,CAAC;QACH,cAAc,GAAG,MAAM,QAAQ,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,cAAc,GAAG,IAAI,CAAC;QACtB,aAAa,GAAG,KAAK,CAAC;IACxB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;IAAC,OAAO,UAAU,EAAE,CAAC;QACpB,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,MAAM,UAAU,CAAC;QACnB,CAAC;QACD,+BAA+B,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,aAAa,CAAC;IACtB,CAAC;IAED,OAAO,cAAc,CAAC;AACxB,CAAC"}
@@ -0,0 +1,53 @@
1
+ import { Runner } from '@openai/agents-core';
2
+ import { OpenAIProvider } from "./openaiProvider.mjs";
3
+ function attachCleanupErrorToThrownError(callbackError, cleanupError) {
4
+ if (!(callbackError instanceof Error)) {
5
+ return;
6
+ }
7
+ const callbackErrorWithMetadata = callbackError;
8
+ if (typeof callbackErrorWithMetadata.cause === 'undefined') {
9
+ callbackErrorWithMetadata.cause = cleanupError;
10
+ return;
11
+ }
12
+ callbackErrorWithMetadata.cleanupError = cleanupError;
13
+ }
14
+ /**
15
+ * Runs a callback within a session-scoped Responses API websocket provider/runner and closes the
16
+ * provider afterwards so websocket connections do not keep the process alive.
17
+ */
18
+ export async function withResponsesWebSocketSession(callback, options = {}) {
19
+ const provider = new OpenAIProvider({
20
+ ...(options.providerOptions ?? {}),
21
+ useResponses: true,
22
+ useResponsesWebSocket: true,
23
+ });
24
+ const runner = new Runner({
25
+ ...(options.runnerConfig ?? {}),
26
+ modelProvider: provider,
27
+ });
28
+ const run = runner.run.bind(runner);
29
+ let callbackFailed = false;
30
+ let callbackError;
31
+ let callbackResult;
32
+ try {
33
+ callbackResult = await callback({ provider, runner, run });
34
+ }
35
+ catch (error) {
36
+ callbackFailed = true;
37
+ callbackError = error;
38
+ }
39
+ try {
40
+ await provider.close();
41
+ }
42
+ catch (closeError) {
43
+ if (!callbackFailed) {
44
+ throw closeError;
45
+ }
46
+ attachCleanupErrorToThrownError(callbackError, closeError);
47
+ }
48
+ if (callbackFailed) {
49
+ throw callbackError;
50
+ }
51
+ return callbackResult;
52
+ }
53
+ //# sourceMappingURL=responsesWebSocketSession.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"responsesWebSocketSession.mjs","sourceRoot":"","sources":["../src/responsesWebSocketSession.ts"],"names":[],"mappings":"OAAO,EAAE,MAAM,EAAkB,MAAM,qBAAqB;OACrD,EAAE,cAAc,EAA8B;AAmBrD,SAAS,+BAA+B,CACtC,aAAsB,EACtB,YAAqB;IAErB,IAAI,CAAC,CAAC,aAAa,YAAY,KAAK,CAAC,EAAE,CAAC;QACtC,OAAO;IACT,CAAC;IAED,MAAM,yBAAyB,GAAG,aAGjC,CAAC;IAEF,IAAI,OAAO,yBAAyB,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;QAC3D,yBAAyB,CAAC,KAAK,GAAG,YAAY,CAAC;QAC/C,OAAO;IACT,CAAC;IAED,yBAAyB,CAAC,YAAY,GAAG,YAAY,CAAC;AACxD,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,QAAgE,EAChE,UAA4C,EAAE;IAE9C,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC;QAClC,GAAG,CAAC,OAAO,CAAC,eAAe,IAAI,EAAE,CAAC;QAClC,YAAY,EAAE,IAAI;QAClB,qBAAqB,EAAE,IAAI;KAC5B,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;QACxB,GAAG,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC;QAC/B,aAAa,EAAE,QAAQ;KACxB,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAkB,CAAC;IAErD,IAAI,cAAc,GAAG,KAAK,CAAC;IAC3B,IAAI,aAAsB,CAAC;IAC3B,IAAI,cAAkB,CAAC;IAEvB,IAAI,CAAC;QACH,cAAc,GAAG,MAAM,QAAQ,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,cAAc,GAAG,IAAI,CAAC;QACtB,aAAa,GAAG,KAAK,CAAC;IACxB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;IAAC,OAAO,UAAU,EAAE,CAAC;QACpB,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,MAAM,UAAU,CAAC;QACnB,CAAC;QACD,+BAA+B,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,aAAa,CAAC;IACtB,CAAC;IAED,OAAO,cAAc,CAAC;AACxB,CAAC"}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@openai/agents-openai",
3
3
  "repository": "https://github.com/openai/openai-agents-js",
4
4
  "homepage": "https://openai.github.io/openai-agents-js/",
5
- "version": "0.4.14",
5
+ "version": "0.5.0",
6
6
  "description": "The OpenAI Agents SDK is a lightweight yet powerful framework for building multi-agent workflows.",
7
7
  "author": "OpenAI <support@openai.com>",
8
8
  "main": "dist/index.js",
@@ -17,7 +17,7 @@
17
17
  "dependencies": {
18
18
  "debug": "^4.4.0",
19
19
  "openai": "^6.20.0",
20
- "@openai/agents-core": "0.4.14"
20
+ "@openai/agents-core": "0.5.0"
21
21
  },
22
22
  "keywords": [
23
23
  "openai",