openai 4.78.0 → 4.79.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.
- package/CHANGELOG.md +29 -0
- package/README.md +87 -0
- package/beta/realtime/index.d.ts +2 -0
- package/beta/realtime/index.d.ts.map +1 -0
- package/beta/realtime/index.js +6 -0
- package/beta/realtime/index.js.map +1 -0
- package/beta/realtime/index.mjs +2 -0
- package/beta/realtime/index.mjs.map +1 -0
- package/beta/realtime/internal-base.d.ts +47 -0
- package/beta/realtime/internal-base.d.ts.map +1 -0
- package/beta/realtime/internal-base.js +43 -0
- package/beta/realtime/internal-base.js.map +1 -0
- package/beta/realtime/internal-base.mjs +37 -0
- package/beta/realtime/internal-base.mjs.map +1 -0
- package/beta/realtime/websocket.d.ts +22 -0
- package/beta/realtime/websocket.d.ts.map +1 -0
- package/beta/realtime/websocket.js +91 -0
- package/beta/realtime/websocket.js.map +1 -0
- package/beta/realtime/websocket.mjs +64 -0
- package/beta/realtime/websocket.mjs.map +1 -0
- package/beta/realtime/ws.d.ts +19 -0
- package/beta/realtime/ws.d.ts.map +1 -0
- package/beta/realtime/ws.js +66 -0
- package/beta/realtime/ws.js.map +1 -0
- package/beta/realtime/ws.mjs +59 -0
- package/beta/realtime/ws.mjs.map +1 -0
- package/core.d.ts.map +1 -1
- package/core.js +28 -1
- package/core.js.map +1 -1
- package/core.mjs +28 -1
- package/core.mjs.map +1 -1
- package/index.d.mts +6 -6
- package/index.d.ts +6 -6
- package/index.d.ts.map +1 -1
- package/lib/EventEmitter.d.ts +45 -0
- package/lib/EventEmitter.d.ts.map +1 -0
- package/lib/EventEmitter.js +83 -0
- package/lib/EventEmitter.js.map +1 -0
- package/lib/EventEmitter.mjs +79 -0
- package/lib/EventEmitter.mjs.map +1 -0
- package/package.json +5 -1
- package/resources/audio/speech.d.ts.map +1 -1
- package/resources/audio/speech.js +6 -1
- package/resources/audio/speech.js.map +1 -1
- package/resources/audio/speech.mjs +6 -1
- package/resources/audio/speech.mjs.map +1 -1
- package/resources/beta/beta.d.ts +2 -2
- package/resources/beta/beta.d.ts.map +1 -1
- package/resources/beta/index.d.ts +1 -1
- package/resources/beta/index.d.ts.map +1 -1
- package/resources/beta/vector-stores/index.d.ts +1 -1
- package/resources/beta/vector-stores/index.d.ts.map +1 -1
- package/resources/beta/vector-stores/vector-stores.d.ts +3 -3
- package/resources/beta/vector-stores/vector-stores.d.ts.map +1 -1
- package/resources/files.d.ts.map +1 -1
- package/resources/files.js +6 -5
- package/resources/files.js.map +1 -1
- package/resources/files.mjs +6 -5
- package/resources/files.mjs.map +1 -1
- package/src/beta/realtime/index.ts +1 -0
- package/src/beta/realtime/internal-base.ts +83 -0
- package/src/beta/realtime/websocket.ts +97 -0
- package/src/beta/realtime/ws.ts +69 -0
- package/src/core.ts +35 -1
- package/src/index.ts +6 -6
- package/src/lib/EventEmitter.ts +98 -0
- package/src/resources/audio/speech.ts +6 -1
- package/src/resources/beta/beta.ts +2 -2
- package/src/resources/beta/index.ts +1 -1
- package/src/resources/beta/vector-stores/index.ts +1 -1
- package/src/resources/beta/vector-stores/vector-stores.ts +3 -3
- package/src/resources/files.ts +6 -5
- package/src/version.ts +1 -1
- package/version.d.ts +1 -1
- package/version.js +1 -1
- package/version.mjs +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,34 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 4.79.0 (2025-01-17)
|
|
4
|
+
|
|
5
|
+
Full Changelog: [v4.78.1...v4.79.0](https://github.com/openai/openai-node/compare/v4.78.1...v4.79.0)
|
|
6
|
+
|
|
7
|
+
### Features
|
|
8
|
+
|
|
9
|
+
* **client:** add Realtime API support ([#1266](https://github.com/openai/openai-node/issues/1266)) ([7160ebe](https://github.com/openai/openai-node/commit/7160ebe647769fbf48a600c9961d1a6f86dc9622))
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
### Bug Fixes
|
|
13
|
+
|
|
14
|
+
* **logs/azure:** redact sensitive header when DEBUG is set ([#1218](https://github.com/openai/openai-node/issues/1218)) ([6a72fd7](https://github.com/openai/openai-node/commit/6a72fd736733db19504a829bf203b39d5b9e3644))
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
### Chores
|
|
18
|
+
|
|
19
|
+
* fix streaming ([379c743](https://github.com/openai/openai-node/commit/379c7435ed5d508458e9cdc22386039b84fcec5e))
|
|
20
|
+
* **internal:** streaming refactors ([#1261](https://github.com/openai/openai-node/issues/1261)) ([dd4af93](https://github.com/openai/openai-node/commit/dd4af939792583854a313367c5fe2f98eea2f3c8))
|
|
21
|
+
* **types:** add `| undefined` to client options properties ([#1264](https://github.com/openai/openai-node/issues/1264)) ([5e56979](https://github.com/openai/openai-node/commit/5e569799b9ac8f915b16de90d91d38b568c1edce))
|
|
22
|
+
* **types:** rename vector store chunking strategy ([#1263](https://github.com/openai/openai-node/issues/1263)) ([d31acee](https://github.com/openai/openai-node/commit/d31acee860c80ba945d4e70b956c7ed75f5f849a))
|
|
23
|
+
|
|
24
|
+
## 4.78.1 (2025-01-10)
|
|
25
|
+
|
|
26
|
+
Full Changelog: [v4.78.0...v4.78.1](https://github.com/openai/openai-node/compare/v4.78.0...v4.78.1)
|
|
27
|
+
|
|
28
|
+
### Bug Fixes
|
|
29
|
+
|
|
30
|
+
* send correct Accept header for certain endpoints ([#1257](https://github.com/openai/openai-node/issues/1257)) ([8756693](https://github.com/openai/openai-node/commit/8756693c5690b16045cdd8d33636fe7643d45f3a))
|
|
31
|
+
|
|
3
32
|
## 4.78.0 (2025-01-09)
|
|
4
33
|
|
|
5
34
|
Full Changelog: [v4.77.4...v4.78.0](https://github.com/openai/openai-node/compare/v4.77.4...v4.78.0)
|
package/README.md
CHANGED
|
@@ -83,6 +83,93 @@ main();
|
|
|
83
83
|
If you need to cancel a stream, you can `break` from the loop
|
|
84
84
|
or call `stream.controller.abort()`.
|
|
85
85
|
|
|
86
|
+
## Realtime API beta
|
|
87
|
+
|
|
88
|
+
The Realtime API enables you to build low-latency, multi-modal conversational experiences. It currently supports text and audio as both input and output, as well as [function calling](https://platform.openai.com/docs/guides/function-calling) through a `WebSocket` connection.
|
|
89
|
+
|
|
90
|
+
The Realtime API works through a combination of client-sent events and server-sent events. Clients can send events to do things like update session configuration or send text and audio inputs. Server events confirm when audio responses have completed, or when a text response from the model has been received. A full event reference can be found [here](https://platform.openai.com/docs/api-reference/realtime-client-events) and a guide can be found [here](https://platform.openai.com/docs/guides/realtime).
|
|
91
|
+
|
|
92
|
+
This SDK supports accessing the Realtime API through the [WebSocket API](https://developer.mozilla.org/en-US/docs/Web/API/WebSocket) or with [ws](https://github.com/websockets/ws).
|
|
93
|
+
|
|
94
|
+
Basic text based example with `ws`:
|
|
95
|
+
|
|
96
|
+
```ts
|
|
97
|
+
// requires `yarn add ws @types/ws`
|
|
98
|
+
import { OpenAIRealtimeWS } from 'openai/beta/realtime/ws';
|
|
99
|
+
|
|
100
|
+
const rt = new OpenAIRealtimeWS({ model: 'gpt-4o-realtime-preview-2024-12-17' });
|
|
101
|
+
|
|
102
|
+
// access the underlying `ws.WebSocket` instance
|
|
103
|
+
rt.socket.on('open', () => {
|
|
104
|
+
console.log('Connection opened!');
|
|
105
|
+
rt.send({
|
|
106
|
+
type: 'session.update',
|
|
107
|
+
session: {
|
|
108
|
+
modalities: ['text'],
|
|
109
|
+
model: 'gpt-4o-realtime-preview',
|
|
110
|
+
},
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
rt.send({
|
|
114
|
+
type: 'conversation.item.create',
|
|
115
|
+
item: {
|
|
116
|
+
type: 'message',
|
|
117
|
+
role: 'user',
|
|
118
|
+
content: [{ type: 'input_text', text: 'Say a couple paragraphs!' }],
|
|
119
|
+
},
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
rt.send({ type: 'response.create' });
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
rt.on('error', (err) => {
|
|
126
|
+
// in a real world scenario this should be logged somewhere as you
|
|
127
|
+
// likely want to continue procesing events regardless of any errors
|
|
128
|
+
throw err;
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
rt.on('session.created', (event) => {
|
|
132
|
+
console.log('session created!', event.session);
|
|
133
|
+
console.log();
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
rt.on('response.text.delta', (event) => process.stdout.write(event.delta));
|
|
137
|
+
rt.on('response.text.done', () => console.log());
|
|
138
|
+
|
|
139
|
+
rt.on('response.done', () => rt.close());
|
|
140
|
+
|
|
141
|
+
rt.socket.on('close', () => console.log('\nConnection closed!'));
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
To use the web API `WebSocket` implementation, replace `OpenAIRealtimeWS` with `OpenAIRealtimeWebSocket` and adjust any `rt.socket` access:
|
|
145
|
+
|
|
146
|
+
```ts
|
|
147
|
+
import { OpenAIRealtimeWebSocket } from 'openai/beta/realtime/websocket';
|
|
148
|
+
|
|
149
|
+
const rt = new OpenAIRealtimeWebSocket({ model: 'gpt-4o-realtime-preview-2024-12-17' });
|
|
150
|
+
// ...
|
|
151
|
+
rt.socket.addEventListener('open', () => {
|
|
152
|
+
// ...
|
|
153
|
+
});
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
A full example can be found [here](https://github.com/openai/openai-node/blob/master/examples/realtime/web.ts).
|
|
157
|
+
|
|
158
|
+
### Realtime error handling
|
|
159
|
+
|
|
160
|
+
When an error is encountered, either on the client side or returned from the server through the [`error` event](https://platform.openai.com/docs/guides/realtime/realtime-api-beta#handling-errors), the `error` event listener will be fired. However, if you haven't registered an `error` event listener then an `unhandled Promise rejection` error will be thrown.
|
|
161
|
+
|
|
162
|
+
It is **highly recommended** that you register an `error` event listener and handle errors approriately as typically the underlying connection is still usable.
|
|
163
|
+
|
|
164
|
+
```ts
|
|
165
|
+
const rt = new OpenAIRealtimeWS({ model: 'gpt-4o-realtime-preview-2024-12-17' });
|
|
166
|
+
rt.on('error', (err) => {
|
|
167
|
+
// in a real world scenario this should be logged somewhere as you
|
|
168
|
+
// likely want to continue procesing events regardless of any errors
|
|
169
|
+
throw err;
|
|
170
|
+
});
|
|
171
|
+
```
|
|
172
|
+
|
|
86
173
|
### Request & Response types
|
|
87
174
|
|
|
88
175
|
This library includes TypeScript definitions for all request params and response fields. You may import and use them like so:
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/beta/realtime/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OpenAIRealtimeError = void 0;
|
|
4
|
+
var internal_base_1 = require("./internal-base.js");
|
|
5
|
+
Object.defineProperty(exports, "OpenAIRealtimeError", { enumerable: true, get: function () { return internal_base_1.OpenAIRealtimeError; } });
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/beta/realtime/index.ts"],"names":[],"mappings":";;;AAAA,oDAAsD;AAA7C,oHAAA,mBAAmB,OAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../src/beta/realtime/index.ts"],"names":[],"mappings":"OAAO,EAAE,mBAAmB,EAAE"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
|
|
2
|
+
import { RealtimeClientEvent, RealtimeServerEvent, ErrorEvent } from "../../resources/beta/realtime/realtime.js";
|
|
3
|
+
import { EventEmitter } from "../../lib/EventEmitter.js";
|
|
4
|
+
import { OpenAIError } from "../../error.js";
|
|
5
|
+
export declare class OpenAIRealtimeError extends OpenAIError {
|
|
6
|
+
/**
|
|
7
|
+
* The error data that the API sent back in an `error` event.
|
|
8
|
+
*/
|
|
9
|
+
error?: ErrorEvent.Error | undefined;
|
|
10
|
+
/**
|
|
11
|
+
* The unique ID of the server event.
|
|
12
|
+
*/
|
|
13
|
+
event_id?: string | undefined;
|
|
14
|
+
constructor(message: string, event: ErrorEvent | null);
|
|
15
|
+
}
|
|
16
|
+
type Simplify<T> = {
|
|
17
|
+
[KeyType in keyof T]: T[KeyType];
|
|
18
|
+
} & {};
|
|
19
|
+
type RealtimeEvents = Simplify<{
|
|
20
|
+
event: (event: RealtimeServerEvent) => void;
|
|
21
|
+
error: (error: OpenAIRealtimeError) => void;
|
|
22
|
+
} & {
|
|
23
|
+
[EventType in Exclude<RealtimeServerEvent['type'], 'error'>]: (event: Extract<RealtimeServerEvent, {
|
|
24
|
+
type: EventType;
|
|
25
|
+
}>) => unknown;
|
|
26
|
+
}>;
|
|
27
|
+
export declare abstract class OpenAIRealtimeEmitter extends EventEmitter<RealtimeEvents> {
|
|
28
|
+
/**
|
|
29
|
+
* Send an event to the API.
|
|
30
|
+
*/
|
|
31
|
+
abstract send(event: RealtimeClientEvent): void;
|
|
32
|
+
/**
|
|
33
|
+
* Close the websocket connection.
|
|
34
|
+
*/
|
|
35
|
+
abstract close(props?: {
|
|
36
|
+
code: number;
|
|
37
|
+
reason: string;
|
|
38
|
+
}): void;
|
|
39
|
+
protected _onError(event: null, message: string, cause: any): void;
|
|
40
|
+
protected _onError(event: ErrorEvent, message?: string | undefined): void;
|
|
41
|
+
}
|
|
42
|
+
export declare function buildRealtimeURL(props: {
|
|
43
|
+
baseURL: string;
|
|
44
|
+
model: string;
|
|
45
|
+
}): URL;
|
|
46
|
+
export {};
|
|
47
|
+
//# sourceMappingURL=internal-base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internal-base.d.ts","sourceRoot":"","sources":["../../src/beta/realtime/internal-base.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AAC9G,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,qBAAa,mBAAoB,SAAQ,WAAW;IAClD;;OAEG;IACH,KAAK,CAAC,EAAE,UAAU,CAAC,KAAK,GAAG,SAAS,CAAC;IAErC;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;gBAElB,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI;CAMtD;AAED,KAAK,QAAQ,CAAC,CAAC,IAAI;KAAG,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC;CAAE,GAAG,EAAE,CAAC;AAE7D,KAAK,cAAc,GAAG,QAAQ,CAC5B;IACE,KAAK,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;IAC5C,KAAK,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;CAC7C,GAAG;KACD,SAAS,IAAI,OAAO,CAAC,mBAAmB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,GAAG,CAC5D,KAAK,EAAE,OAAO,CAAC,mBAAmB,EAAE;QAAE,IAAI,EAAE,SAAS,CAAA;KAAE,CAAC,KACrD,OAAO;CACb,CACF,CAAC;AAEF,8BAAsB,qBAAsB,SAAQ,YAAY,CAAC,cAAc,CAAC;IAC9E;;OAEG;IACH,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI;IAE/C;;OAEG;IACH,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAE9D,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,IAAI;IAClE,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;CAyB1E;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,GAAG,CAO/E"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildRealtimeURL = exports.OpenAIRealtimeEmitter = exports.OpenAIRealtimeError = void 0;
|
|
4
|
+
const EventEmitter_1 = require("../../lib/EventEmitter.js");
|
|
5
|
+
const error_1 = require("../../error.js");
|
|
6
|
+
class OpenAIRealtimeError extends error_1.OpenAIError {
|
|
7
|
+
constructor(message, event) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.error = event?.error;
|
|
10
|
+
this.event_id = event?.event_id;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
exports.OpenAIRealtimeError = OpenAIRealtimeError;
|
|
14
|
+
class OpenAIRealtimeEmitter extends EventEmitter_1.EventEmitter {
|
|
15
|
+
_onError(event, message, cause) {
|
|
16
|
+
message =
|
|
17
|
+
event?.error ?
|
|
18
|
+
`${event.error.message} code=${event.error.code} param=${event.error.param} type=${event.error.type} event_id=${event.error.event_id}`
|
|
19
|
+
: message ?? 'unknown error';
|
|
20
|
+
if (!this._hasListener('error')) {
|
|
21
|
+
const error = new OpenAIRealtimeError(message +
|
|
22
|
+
`\n\nTo resolve these unhandled rejection errors you should bind an \`error\` callback, e.g. \`rt.on('error', (error) => ...)\` `, event);
|
|
23
|
+
// @ts-ignore
|
|
24
|
+
error.cause = cause;
|
|
25
|
+
Promise.reject(error);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const error = new OpenAIRealtimeError(message, event);
|
|
29
|
+
// @ts-ignore
|
|
30
|
+
error.cause = cause;
|
|
31
|
+
this._emit('error', error);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
exports.OpenAIRealtimeEmitter = OpenAIRealtimeEmitter;
|
|
35
|
+
function buildRealtimeURL(props) {
|
|
36
|
+
const path = '/realtime';
|
|
37
|
+
const url = new URL(props.baseURL + (props.baseURL.endsWith('/') ? path.slice(1) : path));
|
|
38
|
+
url.protocol = 'wss';
|
|
39
|
+
url.searchParams.set('model', props.model);
|
|
40
|
+
return url;
|
|
41
|
+
}
|
|
42
|
+
exports.buildRealtimeURL = buildRealtimeURL;
|
|
43
|
+
//# sourceMappingURL=internal-base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internal-base.js","sourceRoot":"","sources":["../../src/beta/realtime/internal-base.ts"],"names":[],"mappings":";;;AACA,4DAAsD;AACtD,0CAA0C;AAE1C,MAAa,mBAAoB,SAAQ,mBAAW;IAWlD,YAAY,OAAe,EAAE,KAAwB;QACnD,KAAK,CAAC,OAAO,CAAC,CAAC;QAEf,IAAI,CAAC,KAAK,GAAG,KAAK,EAAE,KAAK,CAAC;QAC1B,IAAI,CAAC,QAAQ,GAAG,KAAK,EAAE,QAAQ,CAAC;IAClC,CAAC;CACF;AAjBD,kDAiBC;AAeD,MAAsB,qBAAsB,SAAQ,2BAA4B;IAapE,QAAQ,CAAC,KAAwB,EAAE,OAA4B,EAAE,KAAW;QACpF,OAAO;YACL,KAAK,EAAE,KAAK,CAAC,CAAC;gBACZ,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,SAAS,KAAK,CAAC,KAAK,CAAC,IAAI,UAAU,KAAK,CAAC,KAAK,CAAC,KAAK,SAAS,KAAK,CAAC,KAAK,CAAC,IAAI,aAAa,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE;gBACxI,CAAC,CAAC,OAAO,IAAI,eAAe,CAAC;QAE/B,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE;YAC/B,MAAM,KAAK,GAAG,IAAI,mBAAmB,CACnC,OAAO;gBACL,iIAAiI,EACnI,KAAK,CACN,CAAC;YACF,aAAa;YACb,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;YACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACtB,OAAO;SACR;QAED,MAAM,KAAK,GAAG,IAAI,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACtD,aAAa;QACb,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;QAEpB,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;CACF;AArCD,sDAqCC;AAED,SAAgB,gBAAgB,CAAC,KAAyC;IACxE,MAAM,IAAI,GAAG,WAAW,CAAC;IAEzB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1F,GAAG,CAAC,QAAQ,GAAG,KAAK,CAAC;IACrB,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAC3C,OAAO,GAAG,CAAC;AACb,CAAC;AAPD,4CAOC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { EventEmitter } from "../../lib/EventEmitter.mjs";
|
|
2
|
+
import { OpenAIError } from "../../error.mjs";
|
|
3
|
+
export class OpenAIRealtimeError extends OpenAIError {
|
|
4
|
+
constructor(message, event) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.error = event?.error;
|
|
7
|
+
this.event_id = event?.event_id;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export class OpenAIRealtimeEmitter extends EventEmitter {
|
|
11
|
+
_onError(event, message, cause) {
|
|
12
|
+
message =
|
|
13
|
+
event?.error ?
|
|
14
|
+
`${event.error.message} code=${event.error.code} param=${event.error.param} type=${event.error.type} event_id=${event.error.event_id}`
|
|
15
|
+
: message ?? 'unknown error';
|
|
16
|
+
if (!this._hasListener('error')) {
|
|
17
|
+
const error = new OpenAIRealtimeError(message +
|
|
18
|
+
`\n\nTo resolve these unhandled rejection errors you should bind an \`error\` callback, e.g. \`rt.on('error', (error) => ...)\` `, event);
|
|
19
|
+
// @ts-ignore
|
|
20
|
+
error.cause = cause;
|
|
21
|
+
Promise.reject(error);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const error = new OpenAIRealtimeError(message, event);
|
|
25
|
+
// @ts-ignore
|
|
26
|
+
error.cause = cause;
|
|
27
|
+
this._emit('error', error);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export function buildRealtimeURL(props) {
|
|
31
|
+
const path = '/realtime';
|
|
32
|
+
const url = new URL(props.baseURL + (props.baseURL.endsWith('/') ? path.slice(1) : path));
|
|
33
|
+
url.protocol = 'wss';
|
|
34
|
+
url.searchParams.set('model', props.model);
|
|
35
|
+
return url;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=internal-base.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internal-base.mjs","sourceRoot":"","sources":["../../src/beta/realtime/internal-base.ts"],"names":[],"mappings":"OACO,EAAE,YAAY,EAAE;OAChB,EAAE,WAAW,EAAE;AAEtB,MAAM,OAAO,mBAAoB,SAAQ,WAAW;IAWlD,YAAY,OAAe,EAAE,KAAwB;QACnD,KAAK,CAAC,OAAO,CAAC,CAAC;QAEf,IAAI,CAAC,KAAK,GAAG,KAAK,EAAE,KAAK,CAAC;QAC1B,IAAI,CAAC,QAAQ,GAAG,KAAK,EAAE,QAAQ,CAAC;IAClC,CAAC;CACF;AAeD,MAAM,OAAgB,qBAAsB,SAAQ,YAA4B;IAapE,QAAQ,CAAC,KAAwB,EAAE,OAA4B,EAAE,KAAW;QACpF,OAAO;YACL,KAAK,EAAE,KAAK,CAAC,CAAC;gBACZ,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,SAAS,KAAK,CAAC,KAAK,CAAC,IAAI,UAAU,KAAK,CAAC,KAAK,CAAC,KAAK,SAAS,KAAK,CAAC,KAAK,CAAC,IAAI,aAAa,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE;gBACxI,CAAC,CAAC,OAAO,IAAI,eAAe,CAAC;QAE/B,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE;YAC/B,MAAM,KAAK,GAAG,IAAI,mBAAmB,CACnC,OAAO;gBACL,iIAAiI,EACnI,KAAK,CACN,CAAC;YACF,aAAa;YACb,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;YACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACtB,OAAO;SACR;QAED,MAAM,KAAK,GAAG,IAAI,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACtD,aAAa;QACb,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;QAEpB,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;CACF;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAyC;IACxE,MAAM,IAAI,GAAG,WAAW,CAAC;IAEzB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1F,GAAG,CAAC,QAAQ,GAAG,KAAK,CAAC;IACrB,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAC3C,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
|
|
2
|
+
import { OpenAI } from "../../index.js";
|
|
3
|
+
import type { RealtimeClientEvent } from "../../resources/beta/realtime/realtime.js";
|
|
4
|
+
import { OpenAIRealtimeEmitter } from "./internal-base.js";
|
|
5
|
+
type _WebSocket = typeof globalThis extends ({
|
|
6
|
+
WebSocket: infer ws;
|
|
7
|
+
}) ? InstanceType<ws> : any;
|
|
8
|
+
export declare class OpenAIRealtimeWebSocket extends OpenAIRealtimeEmitter {
|
|
9
|
+
url: URL;
|
|
10
|
+
socket: _WebSocket;
|
|
11
|
+
constructor(props: {
|
|
12
|
+
model: string;
|
|
13
|
+
dangerouslyAllowBrowser?: boolean;
|
|
14
|
+
}, client?: Pick<OpenAI, 'apiKey' | 'baseURL'>);
|
|
15
|
+
send(event: RealtimeClientEvent): void;
|
|
16
|
+
close(props?: {
|
|
17
|
+
code: number;
|
|
18
|
+
reason: string;
|
|
19
|
+
}): void;
|
|
20
|
+
}
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=websocket.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../../src/beta/realtime/websocket.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC,OAAO,KAAK,EAAE,mBAAmB,EAAuB,MAAM,wCAAwC,CAAC;AACvG,OAAO,EAAE,qBAAqB,EAAoB,MAAM,iBAAiB,CAAC;AAM1E,KAAK,UAAU,GACb,OAAO,UAAU,SAAS,CACxB;IACE,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB,CACF,GAEC,YAAY,CAAC,EAAE,CAAC,GAChB,GAAG,CAAC;AAER,qBAAa,uBAAwB,SAAQ,qBAAqB;IAChE,GAAG,EAAE,GAAG,CAAC;IACT,MAAM,EAAE,UAAU,CAAC;gBAGjB,KAAK,EAAE;QACL,KAAK,EAAE,MAAM,CAAC;QACd,uBAAuB,CAAC,EAAE,OAAO,CAAC;KACnC,EACD,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAC;IAoD7C,IAAI,CAAC,KAAK,EAAE,mBAAmB;IAQ/B,KAAK,CAAC,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;CAO/C"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.OpenAIRealtimeWebSocket = void 0;
|
|
27
|
+
const index_1 = require("../../index.js");
|
|
28
|
+
const error_1 = require("../../error.js");
|
|
29
|
+
const Core = __importStar(require("../../core.js"));
|
|
30
|
+
const internal_base_1 = require("./internal-base.js");
|
|
31
|
+
class OpenAIRealtimeWebSocket extends internal_base_1.OpenAIRealtimeEmitter {
|
|
32
|
+
constructor(props, client) {
|
|
33
|
+
super();
|
|
34
|
+
const dangerouslyAllowBrowser = props.dangerouslyAllowBrowser ??
|
|
35
|
+
client?._options?.dangerouslyAllowBrowser ??
|
|
36
|
+
(client?.apiKey.startsWith('ek_') ? true : null);
|
|
37
|
+
if (!dangerouslyAllowBrowser && Core.isRunningInBrowser()) {
|
|
38
|
+
throw new error_1.OpenAIError("It looks like you're running in a browser-like environment.\n\nThis is disabled by default, as it risks exposing your secret API credentials to attackers.\n\nYou can avoid this error by creating an ephemeral session token:\nhttps://platform.openai.com/docs/api-reference/realtime-sessions\n");
|
|
39
|
+
}
|
|
40
|
+
client ?? (client = new index_1.OpenAI({ dangerouslyAllowBrowser }));
|
|
41
|
+
this.url = (0, internal_base_1.buildRealtimeURL)({ baseURL: client.baseURL, model: props.model });
|
|
42
|
+
// @ts-ignore
|
|
43
|
+
this.socket = new WebSocket(this.url, [
|
|
44
|
+
'realtime',
|
|
45
|
+
`openai-insecure-api-key.${client.apiKey}`,
|
|
46
|
+
'openai-beta.realtime-v1',
|
|
47
|
+
]);
|
|
48
|
+
this.socket.addEventListener('message', (websocketEvent) => {
|
|
49
|
+
const event = (() => {
|
|
50
|
+
try {
|
|
51
|
+
return JSON.parse(websocketEvent.data.toString());
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
this._onError(null, 'could not parse websocket event', err);
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
})();
|
|
58
|
+
if (event) {
|
|
59
|
+
this._emit('event', event);
|
|
60
|
+
if (event.type === 'error') {
|
|
61
|
+
this._onError(event);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
// @ts-expect-error TS isn't smart enough to get the relationship right here
|
|
65
|
+
this._emit(event.type, event);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
this.socket.addEventListener('error', (event) => {
|
|
70
|
+
this._onError(null, event.message, null);
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
send(event) {
|
|
74
|
+
try {
|
|
75
|
+
this.socket.send(JSON.stringify(event));
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
this._onError(null, 'could not send data', err);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
close(props) {
|
|
82
|
+
try {
|
|
83
|
+
this.socket.close(props?.code ?? 1000, props?.reason ?? 'OK');
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
this._onError(null, 'could not close the connection', err);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
exports.OpenAIRealtimeWebSocket = OpenAIRealtimeWebSocket;
|
|
91
|
+
//# sourceMappingURL=websocket.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../src/beta/realtime/websocket.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { OpenAI } from "../../index.mjs";
|
|
2
|
+
import { OpenAIError } from "../../error.mjs";
|
|
3
|
+
import * as Core from "../../core.mjs";
|
|
4
|
+
import { OpenAIRealtimeEmitter, buildRealtimeURL } from "./internal-base.mjs";
|
|
5
|
+
export class OpenAIRealtimeWebSocket extends OpenAIRealtimeEmitter {
|
|
6
|
+
constructor(props, client) {
|
|
7
|
+
super();
|
|
8
|
+
const dangerouslyAllowBrowser = props.dangerouslyAllowBrowser ??
|
|
9
|
+
client?._options?.dangerouslyAllowBrowser ??
|
|
10
|
+
(client?.apiKey.startsWith('ek_') ? true : null);
|
|
11
|
+
if (!dangerouslyAllowBrowser && Core.isRunningInBrowser()) {
|
|
12
|
+
throw new OpenAIError("It looks like you're running in a browser-like environment.\n\nThis is disabled by default, as it risks exposing your secret API credentials to attackers.\n\nYou can avoid this error by creating an ephemeral session token:\nhttps://platform.openai.com/docs/api-reference/realtime-sessions\n");
|
|
13
|
+
}
|
|
14
|
+
client ?? (client = new OpenAI({ dangerouslyAllowBrowser }));
|
|
15
|
+
this.url = buildRealtimeURL({ baseURL: client.baseURL, model: props.model });
|
|
16
|
+
// @ts-ignore
|
|
17
|
+
this.socket = new WebSocket(this.url, [
|
|
18
|
+
'realtime',
|
|
19
|
+
`openai-insecure-api-key.${client.apiKey}`,
|
|
20
|
+
'openai-beta.realtime-v1',
|
|
21
|
+
]);
|
|
22
|
+
this.socket.addEventListener('message', (websocketEvent) => {
|
|
23
|
+
const event = (() => {
|
|
24
|
+
try {
|
|
25
|
+
return JSON.parse(websocketEvent.data.toString());
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
this._onError(null, 'could not parse websocket event', err);
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
})();
|
|
32
|
+
if (event) {
|
|
33
|
+
this._emit('event', event);
|
|
34
|
+
if (event.type === 'error') {
|
|
35
|
+
this._onError(event);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
// @ts-expect-error TS isn't smart enough to get the relationship right here
|
|
39
|
+
this._emit(event.type, event);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
this.socket.addEventListener('error', (event) => {
|
|
44
|
+
this._onError(null, event.message, null);
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
send(event) {
|
|
48
|
+
try {
|
|
49
|
+
this.socket.send(JSON.stringify(event));
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
this._onError(null, 'could not send data', err);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
close(props) {
|
|
56
|
+
try {
|
|
57
|
+
this.socket.close(props?.code ?? 1000, props?.reason ?? 'OK');
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
this._onError(null, 'could not close the connection', err);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=websocket.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket.mjs","sourceRoot":"","sources":["../../src/beta/realtime/websocket.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
|
|
2
|
+
import WS from 'ws';
|
|
3
|
+
import { OpenAI } from "../../index.js";
|
|
4
|
+
import type { RealtimeClientEvent } from "../../resources/beta/realtime/realtime.js";
|
|
5
|
+
import { OpenAIRealtimeEmitter } from "./internal-base.js";
|
|
6
|
+
export declare class OpenAIRealtimeWS extends OpenAIRealtimeEmitter {
|
|
7
|
+
url: URL;
|
|
8
|
+
socket: WS.WebSocket;
|
|
9
|
+
constructor(props: {
|
|
10
|
+
model: string;
|
|
11
|
+
options?: WS.ClientOptions | undefined;
|
|
12
|
+
}, client?: Pick<OpenAI, 'apiKey' | 'baseURL'>);
|
|
13
|
+
send(event: RealtimeClientEvent): void;
|
|
14
|
+
close(props?: {
|
|
15
|
+
code: number;
|
|
16
|
+
reason: string;
|
|
17
|
+
}): void;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=ws.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ws.d.ts","sourceRoot":"","sources":["../../src/beta/realtime/ws.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,KAAK,EAAE,mBAAmB,EAAuB,MAAM,wCAAwC,CAAC;AACvG,OAAO,EAAE,qBAAqB,EAAoB,MAAM,iBAAiB,CAAC;AAE1E,qBAAa,gBAAiB,SAAQ,qBAAqB;IACzD,GAAG,EAAE,GAAG,CAAC;IACT,MAAM,EAAE,EAAE,CAAC,SAAS,CAAC;gBAGnB,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,EAAE,CAAC,aAAa,GAAG,SAAS,CAAA;KAAE,EAChE,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAC;IA0C7C,IAAI,CAAC,KAAK,EAAE,mBAAmB;IAQ/B,KAAK,CAAC,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;CAO/C"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.OpenAIRealtimeWS = void 0;
|
|
7
|
+
const ws_1 = __importDefault(require("ws"));
|
|
8
|
+
const index_1 = require("../../index.js");
|
|
9
|
+
const internal_base_1 = require("./internal-base.js");
|
|
10
|
+
class OpenAIRealtimeWS extends internal_base_1.OpenAIRealtimeEmitter {
|
|
11
|
+
constructor(props, client) {
|
|
12
|
+
super();
|
|
13
|
+
client ?? (client = new index_1.OpenAI());
|
|
14
|
+
this.url = (0, internal_base_1.buildRealtimeURL)({ baseURL: client.baseURL, model: props.model });
|
|
15
|
+
this.socket = new ws_1.default.WebSocket(this.url, {
|
|
16
|
+
...props.options,
|
|
17
|
+
headers: {
|
|
18
|
+
...props.options?.headers,
|
|
19
|
+
Authorization: `Bearer ${client.apiKey}`,
|
|
20
|
+
'OpenAI-Beta': 'realtime=v1',
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
this.socket.on('message', (wsEvent) => {
|
|
24
|
+
const event = (() => {
|
|
25
|
+
try {
|
|
26
|
+
return JSON.parse(wsEvent.toString());
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
this._onError(null, 'could not parse websocket event', err);
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
})();
|
|
33
|
+
if (event) {
|
|
34
|
+
this._emit('event', event);
|
|
35
|
+
if (event.type === 'error') {
|
|
36
|
+
this._onError(event);
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
// @ts-expect-error TS isn't smart enough to get the relationship right here
|
|
40
|
+
this._emit(event.type, event);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
this.socket.on('error', (err) => {
|
|
45
|
+
this._onError(null, err.message, err);
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
send(event) {
|
|
49
|
+
try {
|
|
50
|
+
this.socket.send(JSON.stringify(event));
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
this._onError(null, 'could not send data', err);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
close(props) {
|
|
57
|
+
try {
|
|
58
|
+
this.socket.close(props?.code ?? 1000, props?.reason ?? 'OK');
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
this._onError(null, 'could not close the connection', err);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
exports.OpenAIRealtimeWS = OpenAIRealtimeWS;
|
|
66
|
+
//# sourceMappingURL=ws.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ws.js","sourceRoot":"","sources":["../../src/beta/realtime/ws.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAoB;AACpB,0CAAqC;AAErC,sDAA0E;AAE1E,MAAa,gBAAiB,SAAQ,qCAAqB;IAIzD,YACE,KAAgE,EAChE,MAA2C;QAE3C,KAAK,EAAE,CAAC;QACR,MAAM,KAAN,MAAM,GAAK,IAAI,cAAM,EAAE,EAAC;QAExB,IAAI,CAAC,GAAG,GAAG,IAAA,gCAAgB,EAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;QAC7E,IAAI,CAAC,MAAM,GAAG,IAAI,YAAE,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE;YACvC,GAAG,KAAK,CAAC,OAAO;YAChB,OAAO,EAAE;gBACP,GAAG,KAAK,CAAC,OAAO,EAAE,OAAO;gBACzB,aAAa,EAAE,UAAU,MAAM,CAAC,MAAM,EAAE;gBACxC,aAAa,EAAE,aAAa;aAC7B;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE;YACpC,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE;gBAClB,IAAI;oBACF,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAwB,CAAC;iBAC9D;gBAAC,OAAO,GAAG,EAAE;oBACZ,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,iCAAiC,EAAE,GAAG,CAAC,CAAC;oBAC5D,OAAO,IAAI,CAAC;iBACb;YACH,CAAC,CAAC,EAAE,CAAC;YAEL,IAAI,KAAK,EAAE;gBACT,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBAE3B,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE;oBAC1B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;iBACtB;qBAAM;oBACL,4EAA4E;oBAC5E,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;iBAC/B;aACF;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YAC9B,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,KAA0B;QAC7B,IAAI;YACF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;SACzC;QAAC,OAAO,GAAG,EAAE;YACZ,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,qBAAqB,EAAE,GAAG,CAAC,CAAC;SACjD;IACH,CAAC;IAED,KAAK,CAAC,KAAwC;QAC5C,IAAI;YACF,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,IAAI,IAAI,EAAE,KAAK,EAAE,MAAM,IAAI,IAAI,CAAC,CAAC;SAC/D;QAAC,OAAO,GAAG,EAAE;YACZ,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,gCAAgC,EAAE,GAAG,CAAC,CAAC;SAC5D;IACH,CAAC;CACF;AA/DD,4CA+DC"}
|