openai 7.23.0 → 7.25.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 +51 -0
- package/README.md +4 -1
- package/client.d.mts +1 -1
- package/client.d.mts.map +1 -1
- package/client.d.ts +1 -1
- package/client.d.ts.map +1 -1
- package/client.js +43 -5
- package/client.js.map +1 -1
- package/client.mjs +43 -5
- package/client.mjs.map +1 -1
- package/internal/responses/canonical-output-text.d.mts +8 -4
- package/internal/responses/canonical-output-text.d.mts.map +1 -1
- package/internal/responses/canonical-output-text.d.ts +8 -4
- package/internal/responses/canonical-output-text.d.ts.map +1 -1
- package/internal/responses/canonical-output-text.js +11 -0
- package/internal/responses/canonical-output-text.js.map +1 -1
- package/internal/responses/canonical-output-text.mjs +11 -0
- package/internal/responses/canonical-output-text.mjs.map +1 -1
- package/internal/responses/response-accumulator.d.mts +12 -1
- package/internal/responses/response-accumulator.d.mts.map +1 -1
- package/internal/responses/response-accumulator.d.ts +12 -1
- package/internal/responses/response-accumulator.d.ts.map +1 -1
- package/internal/responses/response-accumulator.js +99 -25
- package/internal/responses/response-accumulator.js.map +1 -1
- package/internal/responses/response-accumulator.mjs +97 -26
- package/internal/responses/response-accumulator.mjs.map +1 -1
- package/internal/ws.d.mts +6 -2
- package/internal/ws.d.mts.map +1 -1
- package/internal/ws.d.ts +6 -2
- package/internal/ws.d.ts.map +1 -1
- package/internal/ws.js +5 -3
- package/internal/ws.js.map +1 -1
- package/internal/ws.mjs +5 -3
- package/internal/ws.mjs.map +1 -1
- package/lib/live/transcript-grouping.d.mts.map +1 -1
- package/lib/live/transcript-grouping.d.ts.map +1 -1
- package/lib/live/transcript-grouping.js +6 -5
- package/lib/live/transcript-grouping.js.map +1 -1
- package/lib/live/transcript-grouping.mjs +6 -5
- package/lib/live/transcript-grouping.mjs.map +1 -1
- package/lib/responses/responses-websocket-accumulator.d.mts +72 -0
- package/lib/responses/responses-websocket-accumulator.d.mts.map +1 -0
- package/lib/responses/responses-websocket-accumulator.d.ts +72 -0
- package/lib/responses/responses-websocket-accumulator.d.ts.map +1 -0
- package/lib/responses/responses-websocket-accumulator.js +291 -0
- package/lib/responses/responses-websocket-accumulator.js.map +1 -0
- package/lib/responses/responses-websocket-accumulator.mjs +287 -0
- package/lib/responses/responses-websocket-accumulator.mjs.map +1 -0
- package/package.json +1 -1
- package/realtime/translations/ws.d.mts +84 -0
- package/realtime/translations/ws.d.mts.map +1 -0
- package/realtime/translations/ws.d.ts +84 -0
- package/realtime/translations/ws.d.ts.map +1 -0
- package/realtime/translations/ws.js +444 -0
- package/realtime/translations/ws.js.map +1 -0
- package/realtime/translations/ws.mjs +439 -0
- package/realtime/translations/ws.mjs.map +1 -0
- package/resources/audio/speech.d.mts +2 -2
- package/resources/audio/speech.d.mts.map +1 -1
- package/resources/audio/speech.d.ts +2 -2
- package/resources/audio/speech.d.ts.map +1 -1
- package/resources/audio/speech.js +1 -1
- package/resources/audio/speech.mjs +1 -1
- package/resources/audio/transcriptions.d.mts +2 -1
- package/resources/audio/transcriptions.d.mts.map +1 -1
- package/resources/audio/transcriptions.d.ts +2 -1
- package/resources/audio/transcriptions.d.ts.map +1 -1
- package/resources/audio/transcriptions.js.map +1 -1
- package/resources/audio/transcriptions.mjs.map +1 -1
- package/resources/beta/agents/agents.d.mts +577 -18
- package/resources/beta/agents/agents.d.mts.map +1 -1
- package/resources/beta/agents/agents.d.ts +577 -18
- package/resources/beta/agents/agents.d.ts.map +1 -1
- package/resources/beta/agents/agents.js.map +1 -1
- package/resources/beta/agents/agents.mjs.map +1 -1
- package/resources/beta/agents/environments/templates.d.mts +62 -9
- package/resources/beta/agents/environments/templates.d.mts.map +1 -1
- package/resources/beta/agents/environments/templates.d.ts +62 -9
- package/resources/beta/agents/environments/templates.d.ts.map +1 -1
- package/resources/beta/agents/index.d.mts +1 -1
- package/resources/beta/agents/index.d.mts.map +1 -1
- package/resources/beta/agents/index.d.ts +1 -1
- package/resources/beta/agents/index.d.ts.map +1 -1
- package/resources/beta/agents/index.js.map +1 -1
- package/resources/beta/agents/index.mjs.map +1 -1
- package/resources/beta/agents/sessions/events.d.mts +10 -7
- package/resources/beta/agents/sessions/events.d.mts.map +1 -1
- package/resources/beta/agents/sessions/events.d.ts +10 -7
- package/resources/beta/agents/sessions/events.d.ts.map +1 -1
- package/resources/beta/agents/sessions/events.js +10 -7
- package/resources/beta/agents/sessions/events.js.map +1 -1
- package/resources/beta/agents/sessions/events.mjs +10 -7
- package/resources/beta/agents/sessions/events.mjs.map +1 -1
- package/resources/beta/agents/sessions/sessions.d.mts +4 -2
- package/resources/beta/agents/sessions/sessions.d.mts.map +1 -1
- package/resources/beta/agents/sessions/sessions.d.ts +4 -2
- package/resources/beta/agents/sessions/sessions.d.ts.map +1 -1
- package/resources/beta/agents/sessions/sessions.js.map +1 -1
- package/resources/beta/agents/sessions/sessions.mjs.map +1 -1
- package/resources/beta/agents/vaults/credentials.d.mts +24 -7
- package/resources/beta/agents/vaults/credentials.d.mts.map +1 -1
- package/resources/beta/agents/vaults/credentials.d.ts +24 -7
- package/resources/beta/agents/vaults/credentials.d.ts.map +1 -1
- package/resources/beta/agents/vaults/credentials.js +2 -6
- package/resources/beta/agents/vaults/credentials.js.map +1 -1
- package/resources/beta/agents/vaults/credentials.mjs +2 -6
- package/resources/beta/agents/vaults/credentials.mjs.map +1 -1
- package/resources/beta/beta.d.mts +2 -2
- package/resources/beta/beta.d.mts.map +1 -1
- package/resources/beta/beta.d.ts +2 -2
- package/resources/beta/beta.d.ts.map +1 -1
- package/resources/beta/beta.js.map +1 -1
- package/resources/beta/beta.mjs.map +1 -1
- package/resources/beta/index.d.mts +1 -1
- package/resources/beta/index.d.mts.map +1 -1
- package/resources/beta/index.d.ts +1 -1
- package/resources/beta/index.d.ts.map +1 -1
- package/resources/beta/index.js.map +1 -1
- package/resources/beta/index.mjs.map +1 -1
- package/resources/beta/responses/responses.d.mts +69 -10
- package/resources/beta/responses/responses.d.mts.map +1 -1
- package/resources/beta/responses/responses.d.ts +69 -10
- package/resources/beta/responses/responses.d.ts.map +1 -1
- package/resources/beta/responses/responses.js.map +1 -1
- package/resources/beta/responses/responses.mjs.map +1 -1
- package/resources/files.d.mts +2 -2
- package/resources/files.d.mts.map +1 -1
- package/resources/files.d.ts +2 -2
- package/resources/files.d.ts.map +1 -1
- package/resources/index.d.mts +1 -1
- package/resources/index.d.mts.map +1 -1
- package/resources/index.d.ts +1 -1
- package/resources/index.d.ts.map +1 -1
- package/resources/live/forks/ws-base.js +1 -1
- package/resources/live/forks/ws-base.js.map +1 -1
- package/resources/live/forks/ws-base.mjs +1 -1
- package/resources/live/forks/ws-base.mjs.map +1 -1
- package/resources/live/sideband/ws-base.js +1 -1
- package/resources/live/sideband/ws-base.js.map +1 -1
- package/resources/live/sideband/ws-base.mjs +1 -1
- package/resources/live/sideband/ws-base.mjs.map +1 -1
- package/resources/live/ws-base.js +1 -1
- package/resources/live/ws-base.js.map +1 -1
- package/resources/live/ws-base.mjs +1 -1
- package/resources/live/ws-base.mjs.map +1 -1
- package/resources/realtime/index.d.mts +1 -0
- package/resources/realtime/index.d.mts.map +1 -1
- package/resources/realtime/index.d.ts +1 -0
- package/resources/realtime/index.d.ts.map +1 -1
- package/resources/realtime/index.js +3 -1
- package/resources/realtime/index.js.map +1 -1
- package/resources/realtime/index.mjs +1 -0
- package/resources/realtime/index.mjs.map +1 -1
- package/resources/realtime/realtime.d.mts +4 -0
- package/resources/realtime/realtime.d.mts.map +1 -1
- package/resources/realtime/realtime.d.ts +4 -0
- package/resources/realtime/realtime.d.ts.map +1 -1
- package/resources/realtime/realtime.js +4 -0
- package/resources/realtime/realtime.js.map +1 -1
- package/resources/realtime/realtime.mjs +4 -0
- package/resources/realtime/realtime.mjs.map +1 -1
- package/resources/realtime/translations/client-secrets.d.mts +67 -0
- package/resources/realtime/translations/client-secrets.d.mts.map +1 -0
- package/resources/realtime/translations/client-secrets.d.ts +67 -0
- package/resources/realtime/translations/client-secrets.d.ts.map +1 -0
- package/resources/realtime/translations/client-secrets.js +39 -0
- package/resources/realtime/translations/client-secrets.js.map +1 -0
- package/resources/realtime/translations/client-secrets.mjs +35 -0
- package/resources/realtime/translations/client-secrets.mjs.map +1 -0
- package/resources/realtime/translations/index.d.mts +3 -0
- package/resources/realtime/translations/index.d.mts.map +1 -0
- package/resources/realtime/translations/index.d.ts +3 -0
- package/resources/realtime/translations/index.d.ts.map +1 -0
- package/resources/realtime/translations/index.js +9 -0
- package/resources/realtime/translations/index.js.map +1 -0
- package/resources/realtime/translations/index.mjs +4 -0
- package/resources/realtime/translations/index.mjs.map +1 -0
- package/resources/realtime/translations/translations.d.mts +10 -0
- package/resources/realtime/translations/translations.d.mts.map +1 -0
- package/resources/realtime/translations/translations.d.ts +10 -0
- package/resources/realtime/translations/translations.d.ts.map +1 -0
- package/resources/realtime/translations/translations.js +17 -0
- package/resources/realtime/translations/translations.js.map +1 -0
- package/resources/realtime/translations/translations.mjs +12 -0
- package/resources/realtime/translations/translations.mjs.map +1 -0
- package/resources/realtime/translations.d.mts +2 -0
- package/resources/realtime/translations.d.mts.map +1 -0
- package/resources/realtime/translations.d.ts +2 -0
- package/resources/realtime/translations.d.ts.map +1 -0
- package/resources/realtime/translations.js +6 -0
- package/resources/realtime/translations.js.map +1 -0
- package/resources/realtime/translations.mjs +3 -0
- package/resources/realtime/translations.mjs.map +1 -0
- package/resources/responses/responses.d.mts +66 -7
- package/resources/responses/responses.d.mts.map +1 -1
- package/resources/responses/responses.d.ts +66 -7
- package/resources/responses/responses.d.ts.map +1 -1
- package/resources/responses/responses.js.map +1 -1
- package/resources/responses/responses.mjs.map +1 -1
- package/resources/shared.d.mts +1 -1
- package/resources/shared.d.mts.map +1 -1
- package/resources/shared.d.ts +1 -1
- package/resources/shared.d.ts.map +1 -1
- package/src/client.ts +42 -6
- package/src/internal/responses/canonical-output-text.ts +30 -5
- package/src/internal/responses/response-accumulator.ts +155 -56
- package/src/internal/ws.ts +5 -3
- package/src/lib/live/transcript-grouping.ts +6 -5
- package/src/lib/responses/responses-websocket-accumulator.ts +374 -0
- package/src/realtime/translations/ws.ts +539 -0
- package/src/resources/audio/speech.ts +4 -1
- package/src/resources/audio/transcriptions.ts +2 -1
- package/src/resources/beta/agents/agents.ts +699 -12
- package/src/resources/beta/agents/environments/templates.ts +70 -9
- package/src/resources/beta/agents/index.ts +3 -0
- package/src/resources/beta/agents/sessions/events.ts +10 -7
- package/src/resources/beta/agents/sessions/sessions.ts +4 -2
- package/src/resources/beta/agents/vaults/credentials.ts +21 -7
- package/src/resources/beta/beta.ts +6 -0
- package/src/resources/beta/index.ts +3 -0
- package/src/resources/beta/responses/responses.ts +75 -6
- package/src/resources/files.ts +3 -3
- package/src/resources/index.ts +1 -1
- package/src/resources/live/forks/ws-base.ts +1 -1
- package/src/resources/live/sideband/ws-base.ts +1 -1
- package/src/resources/live/ws-base.ts +1 -1
- package/src/resources/realtime/api.md +8 -0
- package/src/resources/realtime/index.ts +1 -0
- package/src/resources/realtime/realtime.ts +6 -0
- package/src/resources/realtime/translations/client-secrets.ts +93 -0
- package/src/resources/realtime/translations/index.ts +4 -0
- package/src/resources/realtime/translations/translations.ts +15 -0
- package/src/resources/realtime/translations.ts +3 -0
- package/src/resources/responses/responses.ts +72 -6
- package/src/resources/shared.ts +1 -0
- package/src/version.ts +1 -1
- package/version.d.mts +1 -1
- package/version.d.ts +1 -1
- package/version.js +1 -1
- package/version.mjs +1 -1
|
@@ -0,0 +1,444 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OpenAIRealtimeTranslationWS = void 0;
|
|
4
|
+
const tslib_1 = require("../../internal/tslib.js");
|
|
5
|
+
const WS = tslib_1.__importStar(require("ws"));
|
|
6
|
+
const EventEmitter_1 = require("../../lib/EventEmitter.js");
|
|
7
|
+
const x509_workload_identity_auth_1 = require("../../internal/auth/x509-workload-identity-auth.js");
|
|
8
|
+
const bedrock_1 = require("../../internal/bedrock.js");
|
|
9
|
+
const detect_platform_1 = require("../../internal/detect-platform.js");
|
|
10
|
+
const realtime_credentials_1 = require("../../internal/realtime-credentials.js");
|
|
11
|
+
const ws_1 = require("../../internal/ws.js");
|
|
12
|
+
const ws_adapter_1 = require("../../internal/ws-adapter.js");
|
|
13
|
+
const ws_adapter_node_1 = require("../../internal/ws-adapter-node.js");
|
|
14
|
+
const internal_base_1 = require("../internal-base.js");
|
|
15
|
+
function parseEvent(data) {
|
|
16
|
+
let event;
|
|
17
|
+
try {
|
|
18
|
+
event = JSON.parse(data);
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
throw new internal_base_1.OpenAIRealtimeError('Could not parse translation WebSocket event as JSON.', null);
|
|
22
|
+
}
|
|
23
|
+
if (typeof event !== 'object' ||
|
|
24
|
+
event === null ||
|
|
25
|
+
Array.isArray(event) ||
|
|
26
|
+
typeof Object.getOwnPropertyDescriptor(event, 'type')?.value !== 'string') {
|
|
27
|
+
throw new internal_base_1.OpenAIRealtimeError('Translation event must be an object with a string type.', null);
|
|
28
|
+
}
|
|
29
|
+
// SAFETY: The envelope was checked above; payload fields remain unknown until selected by event type.
|
|
30
|
+
return event;
|
|
31
|
+
}
|
|
32
|
+
/** Copies a freshly parsed JSON tree's containers, sharing its immutable string payloads. */
|
|
33
|
+
function copyEvent(event) {
|
|
34
|
+
const copy = { ...event };
|
|
35
|
+
const containers = [copy];
|
|
36
|
+
for (const container of containers) {
|
|
37
|
+
for (const [key, value] of Object.entries(container)) {
|
|
38
|
+
if (typeof value === 'object' && value !== null) {
|
|
39
|
+
const child = Array.isArray(value) ? [...value] : { ...value };
|
|
40
|
+
Object.defineProperty(container, key, {
|
|
41
|
+
value: child,
|
|
42
|
+
writable: true,
|
|
43
|
+
enumerable: true,
|
|
44
|
+
configurable: true,
|
|
45
|
+
});
|
|
46
|
+
containers.push(child);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return copy;
|
|
51
|
+
}
|
|
52
|
+
function isObject(value) {
|
|
53
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
54
|
+
}
|
|
55
|
+
function isString(value) {
|
|
56
|
+
return typeof value === 'string';
|
|
57
|
+
}
|
|
58
|
+
function hasRequiredFields(value, fields) {
|
|
59
|
+
return (isObject(value) &&
|
|
60
|
+
Object.entries(fields).every(([key, check]) => check(Object.getOwnPropertyDescriptor(value, key)?.value)));
|
|
61
|
+
}
|
|
62
|
+
function hasOptionalFields(value, fields) {
|
|
63
|
+
return (isObject(value) &&
|
|
64
|
+
Object.entries(fields).every(([key, check]) => {
|
|
65
|
+
const field = Object.getOwnPropertyDescriptor(value, key);
|
|
66
|
+
return field === undefined || check(field.value);
|
|
67
|
+
}));
|
|
68
|
+
}
|
|
69
|
+
const inputAudioFields = {
|
|
70
|
+
transcription: (value) => value === null || hasRequiredFields(value, { model: isString }),
|
|
71
|
+
noise_reduction: (value) => value === null ||
|
|
72
|
+
hasRequiredFields(value, {
|
|
73
|
+
type: (kind) => kind === 'near_field' || kind === 'far_field',
|
|
74
|
+
}),
|
|
75
|
+
};
|
|
76
|
+
const audioFields = {
|
|
77
|
+
input: (value) => hasOptionalFields(value, inputAudioFields),
|
|
78
|
+
output: (value) => hasOptionalFields(value, { language: isString }),
|
|
79
|
+
};
|
|
80
|
+
const sessionFields = {
|
|
81
|
+
id: isString,
|
|
82
|
+
model: isString,
|
|
83
|
+
expires_at: (value) => typeof value === 'number',
|
|
84
|
+
type: (value) => value === 'translation',
|
|
85
|
+
audio: (value) => hasOptionalFields(value, audioFields),
|
|
86
|
+
};
|
|
87
|
+
function isOptionalNullableString(value) {
|
|
88
|
+
return value === undefined || value === null || isString(value);
|
|
89
|
+
}
|
|
90
|
+
function isOptionalNumber(value) {
|
|
91
|
+
return value === undefined || typeof value === 'number';
|
|
92
|
+
}
|
|
93
|
+
const errorFields = {
|
|
94
|
+
message: isString,
|
|
95
|
+
type: isString,
|
|
96
|
+
code: isOptionalNullableString,
|
|
97
|
+
event_id: isOptionalNullableString,
|
|
98
|
+
param: isOptionalNullableString,
|
|
99
|
+
};
|
|
100
|
+
const commonFields = { type: isString, event_id: isString };
|
|
101
|
+
const deltaFields = {
|
|
102
|
+
...commonFields,
|
|
103
|
+
delta: isString,
|
|
104
|
+
elapsed_ms: (value) => value === null || isOptionalNumber(value),
|
|
105
|
+
};
|
|
106
|
+
const sessionEventFields = {
|
|
107
|
+
...commonFields,
|
|
108
|
+
session: (value) => hasRequiredFields(value, sessionFields),
|
|
109
|
+
};
|
|
110
|
+
// Regeneration that adds an event or field must also update its dispatcher.
|
|
111
|
+
const translationEventFields = {
|
|
112
|
+
'session.closed': commonFields,
|
|
113
|
+
'session.input_transcript.delta': deltaFields,
|
|
114
|
+
'session.output_transcript.delta': deltaFields,
|
|
115
|
+
'session.output_audio.delta': {
|
|
116
|
+
...deltaFields,
|
|
117
|
+
channels: isOptionalNumber,
|
|
118
|
+
format: (value) => value === undefined || value === 'pcm16',
|
|
119
|
+
sample_rate: isOptionalNumber,
|
|
120
|
+
},
|
|
121
|
+
'session.created': sessionEventFields,
|
|
122
|
+
'session.updated': sessionEventFields,
|
|
123
|
+
error: { ...commonFields, error: (value) => hasRequiredFields(value, errorFields) },
|
|
124
|
+
};
|
|
125
|
+
/** Check the required fields before exposing an envelope through a typed listener. */
|
|
126
|
+
function isCompleteTranslationEvent(event) {
|
|
127
|
+
// SAFETY: Only the above schema-checked map's own data properties can supply a validator.
|
|
128
|
+
const fields = Object.getOwnPropertyDescriptor(translationEventFields, event.type)?.value;
|
|
129
|
+
return fields !== undefined && hasRequiredFields(event, fields);
|
|
130
|
+
}
|
|
131
|
+
function buildTranslationURL(client, model) {
|
|
132
|
+
if (typeof model !== 'string' || !model) {
|
|
133
|
+
throw new Error('A translation model is required.');
|
|
134
|
+
}
|
|
135
|
+
const endpoint = new URL(client.baseURL);
|
|
136
|
+
endpoint.pathname = `${endpoint.pathname.replace(/\/$/u, '')}/realtime/translations`;
|
|
137
|
+
const url = new URL(client.buildURL(endpoint.toString(), { model }));
|
|
138
|
+
if (url.protocol !== 'https:') {
|
|
139
|
+
throw new Error('The translation endpoint must use HTTPS.');
|
|
140
|
+
}
|
|
141
|
+
if (url.searchParams.has('intent')) {
|
|
142
|
+
throw new Error('Realtime translation does not accept an intent query parameter.');
|
|
143
|
+
}
|
|
144
|
+
url.hash = '';
|
|
145
|
+
url.protocol = 'wss:';
|
|
146
|
+
return url;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Node.js translation WebSocket. Install the optional `ws` peer dependency.
|
|
150
|
+
* Wait for `socket` to open before sending. Events are never buffered or replayed.
|
|
151
|
+
* Compression is off by default; set `options.perMessageDeflate` to opt in.
|
|
152
|
+
*/
|
|
153
|
+
// oxlint-disable-next-line unicorn/prefer-event-target -- Reuse the SDK typed emitter and its public on/off event contract.
|
|
154
|
+
class OpenAIRealtimeTranslationWS extends EventEmitter_1.EventEmitter {
|
|
155
|
+
constructor(url, options) {
|
|
156
|
+
super();
|
|
157
|
+
/** Sends the protocol close once; use `finish` to await trailing output. */
|
|
158
|
+
this.session = { close: () => this.send({ type: 'session.close' }) };
|
|
159
|
+
this._inputClosed = false;
|
|
160
|
+
this._terminalReceived = false;
|
|
161
|
+
this._terminalDelivered = false;
|
|
162
|
+
this._transportClosed = false;
|
|
163
|
+
this._onMessage = (data) => {
|
|
164
|
+
if (this._terminalReceived) {
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
const wireData = data.toString();
|
|
168
|
+
let event;
|
|
169
|
+
try {
|
|
170
|
+
event = parseEvent(wireData);
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
// SAFETY: parseEvent only throws normalized, payload-free OpenAIRealtimeError instances.
|
|
174
|
+
this._reportError(error);
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
const { type } = event;
|
|
178
|
+
const typed = isCompleteTranslationEvent(event);
|
|
179
|
+
const terminal = type === 'session.closed' && typed;
|
|
180
|
+
if (terminal) {
|
|
181
|
+
this._inputClosed = true;
|
|
182
|
+
this._terminalReceived = true;
|
|
183
|
+
}
|
|
184
|
+
try {
|
|
185
|
+
try {
|
|
186
|
+
// Raw listeners may mutate their event. Keep typed dispatch and finish
|
|
187
|
+
// anchored to the original validated wire event, including nested data.
|
|
188
|
+
if (this._hasListener('event')) {
|
|
189
|
+
this._emit('event', typed ? copyEvent(event) : event);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
finally {
|
|
193
|
+
if (type === 'error' && typed) {
|
|
194
|
+
// SAFETY: The error envelope is preserved as server data, as for other Realtime events.
|
|
195
|
+
// oxlint-disable-next-line anti-slop/no-chained-type-assertions -- Forward server error fields unchanged through the existing Realtime error wrapper.
|
|
196
|
+
const apiErrorEvent = event;
|
|
197
|
+
const error = new internal_base_1.OpenAIRealtimeError(`Translation API error: ${apiErrorEvent.error.message}`, apiErrorEvent);
|
|
198
|
+
this._reportError(error);
|
|
199
|
+
}
|
|
200
|
+
else if (type !== 'error' && typed) {
|
|
201
|
+
// SAFETY: The wire discriminator selects its listener; future event names remain visible on `event`.
|
|
202
|
+
this._emit(type, event);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
finally {
|
|
207
|
+
if (terminal) {
|
|
208
|
+
this._terminalDelivered = true;
|
|
209
|
+
try {
|
|
210
|
+
this._closeTransport();
|
|
211
|
+
}
|
|
212
|
+
finally {
|
|
213
|
+
this._settleFinish();
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
};
|
|
218
|
+
this._onError = (cause) => {
|
|
219
|
+
// Closing before open also emits a ws error. The caller already requested
|
|
220
|
+
// cleanup; _onClose still records an incomplete drain for a later finish().
|
|
221
|
+
if (this._closeTimer !== undefined && !this._terminalReceived && !this._failure) {
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
const error = new internal_base_1.OpenAIRealtimeError('Translation WebSocket transport failed.', null);
|
|
225
|
+
Object.defineProperty(error, 'cause', { value: cause, writable: true, configurable: true });
|
|
226
|
+
this._fail(error);
|
|
227
|
+
// finish already rejects transport failures; don't report that same failure a second time.
|
|
228
|
+
if (this._hasListener('error') || !this._finishPromise) {
|
|
229
|
+
this._reportError(error);
|
|
230
|
+
}
|
|
231
|
+
};
|
|
232
|
+
this._onClose = (code) => {
|
|
233
|
+
const reportPrematureClose = !this._terminalReceived && !this._failure && !this._finishPromise && this._closeTimer === undefined;
|
|
234
|
+
this._inputClosed = true;
|
|
235
|
+
this._transportClosed = true;
|
|
236
|
+
clearTimeout(this._closeTimer);
|
|
237
|
+
this.socket.off('message', this._onMessage);
|
|
238
|
+
this.socket.off('error', this._onError);
|
|
239
|
+
this.socket.off('close', this._onClose);
|
|
240
|
+
if (!this._terminalReceived) {
|
|
241
|
+
this._failure ?? (this._failure = new internal_base_1.OpenAIRealtimeError('Translation WebSocket closed before session.closed.', null));
|
|
242
|
+
}
|
|
243
|
+
else if (code !== 1000 && code !== 1001 && code !== 1005) {
|
|
244
|
+
this._failure ?? (this._failure = new internal_base_1.OpenAIRealtimeError('Translation transport closed abnormally after session.closed.', null));
|
|
245
|
+
}
|
|
246
|
+
this._settleFinish();
|
|
247
|
+
if (reportPrematureClose && this._failure) {
|
|
248
|
+
this._reportError(this._failure);
|
|
249
|
+
}
|
|
250
|
+
};
|
|
251
|
+
this._onAbort = () => {
|
|
252
|
+
const error = new internal_base_1.OpenAIRealtimeError('Translation finish was aborted.', null);
|
|
253
|
+
Object.defineProperty(error, 'cause', {
|
|
254
|
+
value: this._signal?.reason,
|
|
255
|
+
writable: true,
|
|
256
|
+
configurable: true,
|
|
257
|
+
});
|
|
258
|
+
this._fail(error);
|
|
259
|
+
};
|
|
260
|
+
this.url = url;
|
|
261
|
+
this.socket = new ws_adapter_node_1.NodeWebSocket(new WS.WebSocket(url, options));
|
|
262
|
+
this.socket.on('message', this._onMessage);
|
|
263
|
+
this.socket.on('error', this._onError);
|
|
264
|
+
this.socket.on('close', this._onClose);
|
|
265
|
+
}
|
|
266
|
+
/** Resolves the API key and starts connecting; resolves before the socket opens. */
|
|
267
|
+
static async create(client, props) {
|
|
268
|
+
// SAFETY: Probe optional host capabilities without requiring Node ambient types in published source.
|
|
269
|
+
const scope = globalThis;
|
|
270
|
+
if ((0, detect_platform_1.isRunningInBrowser)() || !scope.process?.versions?.node) {
|
|
271
|
+
throw new Error('Realtime translation WebSockets require Node.js.');
|
|
272
|
+
}
|
|
273
|
+
(0, x509_workload_identity_auth_1.assertX509WebSocketSupported)(client);
|
|
274
|
+
// SAFETY: OpenAI owns these options; this read only rejects unsupported authentication modes.
|
|
275
|
+
const clientOptions = client['_options'];
|
|
276
|
+
if ((0, internal_base_1.isAzure)(client) ||
|
|
277
|
+
bedrock_1.brand_privateBedrockClient in client ||
|
|
278
|
+
clientOptions.provider ||
|
|
279
|
+
clientOptions.workloadIdentity) {
|
|
280
|
+
throw new Error('Realtime translation WebSockets require an ordinary OpenAI API-key client.');
|
|
281
|
+
}
|
|
282
|
+
const url = buildTranslationURL(client, props.model);
|
|
283
|
+
const { apiKey } = await (0, realtime_credentials_1.resolveRealtimeAPIKey)(client);
|
|
284
|
+
if (!apiKey) {
|
|
285
|
+
throw new Error('Realtime translation WebSockets require an API key.');
|
|
286
|
+
}
|
|
287
|
+
const headers = new Map(Object.entries(client._buildWebSocketHeaders({ Authorization: `Bearer ${apiKey}` })));
|
|
288
|
+
for (const [name, value] of Object.entries(props.options?.headers ?? {})) {
|
|
289
|
+
if (value === null) {
|
|
290
|
+
headers.delete(name.toLowerCase());
|
|
291
|
+
}
|
|
292
|
+
else if (value !== undefined) {
|
|
293
|
+
headers.set(name.toLowerCase(), value);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
const options = {
|
|
297
|
+
...props.options,
|
|
298
|
+
maxPayload: props.options?.maxPayload ?? 0,
|
|
299
|
+
perMessageDeflate: props.options?.perMessageDeflate ?? false,
|
|
300
|
+
headers: Object.fromEntries(headers),
|
|
301
|
+
followRedirects: false,
|
|
302
|
+
};
|
|
303
|
+
(0, ws_1.snapshotWebSocketCredentials)(options);
|
|
304
|
+
return new OpenAIRealtimeTranslationWS(url, options);
|
|
305
|
+
}
|
|
306
|
+
/** Sends a typed event, future event envelope, or raw JSON envelope after the socket opens. */
|
|
307
|
+
send(event) {
|
|
308
|
+
const data = typeof event === 'string' ? event : JSON.stringify(event);
|
|
309
|
+
const envelope = parseEvent(data);
|
|
310
|
+
if (envelope.type === 'session.close') {
|
|
311
|
+
if (this._inputClosed) {
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
314
|
+
this._inputClosed = true;
|
|
315
|
+
}
|
|
316
|
+
else if (this._inputClosed) {
|
|
317
|
+
throw new internal_base_1.OpenAIRealtimeError('Translation input is closed.', null);
|
|
318
|
+
}
|
|
319
|
+
try {
|
|
320
|
+
if (this.socket.readyState !== ws_adapter_1.ReadyState.OPEN) {
|
|
321
|
+
throw new Error('The translation WebSocket is not open.');
|
|
322
|
+
}
|
|
323
|
+
this.socket.send(data);
|
|
324
|
+
}
|
|
325
|
+
catch {
|
|
326
|
+
const error = new internal_base_1.OpenAIRealtimeError('Could not send translation WebSocket event.', null);
|
|
327
|
+
this._fail(error);
|
|
328
|
+
throw error;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Stops input, sends `session.close` once, and delivers all events through `session.closed`.
|
|
333
|
+
* The first call owns the finite deadline and optional cancellation signal. Repeated calls
|
|
334
|
+
* share its result. API error events remain observable and do not end the drain.
|
|
335
|
+
* A timeout, abort, or transport failure rejects; no connection or input is replayed.
|
|
336
|
+
* Resolves after terminal delivery and transport closure. The deadline includes transport
|
|
337
|
+
* cleanup; a stalled close handshake is terminated and rejects the operation.
|
|
338
|
+
*/
|
|
339
|
+
finish({ timeoutMs, signal }) {
|
|
340
|
+
if (this._finishPromise) {
|
|
341
|
+
return this._finishPromise;
|
|
342
|
+
}
|
|
343
|
+
if (!Number.isFinite(timeoutMs) || timeoutMs <= 0 || timeoutMs > 2147483647) {
|
|
344
|
+
return Promise.reject(new Error('timeoutMs must be a positive finite WebSocket deadline of at most 2147483647.'));
|
|
345
|
+
}
|
|
346
|
+
// oxlint-disable-next-line promise/avoid-new -- The existing socket dispatcher settles this completion; there is no second event reader.
|
|
347
|
+
this._finishPromise = new Promise((resolve, reject) => {
|
|
348
|
+
this._resolveFinish = resolve;
|
|
349
|
+
this._rejectFinish = reject;
|
|
350
|
+
});
|
|
351
|
+
if (this._transportClosed) {
|
|
352
|
+
this._settleFinish();
|
|
353
|
+
return this._finishPromise;
|
|
354
|
+
}
|
|
355
|
+
clearTimeout(this._closeTimer);
|
|
356
|
+
this._closeTimer = undefined;
|
|
357
|
+
this._signal = signal;
|
|
358
|
+
this._finishTimer = setTimeout(() => {
|
|
359
|
+
this._fail(new internal_base_1.OpenAIRealtimeError('Timed out finishing the translation session and closing its transport.', null));
|
|
360
|
+
}, timeoutMs);
|
|
361
|
+
signal?.addEventListener('abort', this._onAbort, { once: true });
|
|
362
|
+
if (signal?.aborted) {
|
|
363
|
+
this._onAbort();
|
|
364
|
+
}
|
|
365
|
+
else if (!this._terminalReceived && !this._failure) {
|
|
366
|
+
try {
|
|
367
|
+
this.session.close();
|
|
368
|
+
}
|
|
369
|
+
catch {
|
|
370
|
+
// send already records the failure and terminates the connection.
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
this._settleFinish();
|
|
374
|
+
return this._finishPromise;
|
|
375
|
+
}
|
|
376
|
+
/** Closes the transport without waiting for terminal output. Prefer `finish` for a complete session. */
|
|
377
|
+
close() {
|
|
378
|
+
this._inputClosed = true;
|
|
379
|
+
this._closeTransport();
|
|
380
|
+
}
|
|
381
|
+
_reportError(error) {
|
|
382
|
+
if (this._hasListener('error')) {
|
|
383
|
+
this._emit('error', error);
|
|
384
|
+
}
|
|
385
|
+
else {
|
|
386
|
+
error.message += " Bind an error listener, e.g. connection.on('error', (error) => ...).";
|
|
387
|
+
// oxlint-disable-next-line promise/no-promise-in-callback -- Match Realtime's explicit unhandled rejection contract when no SDK listener or completion operation observes the error.
|
|
388
|
+
Promise.reject(error);
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
_fail(error) {
|
|
392
|
+
this._inputClosed = true;
|
|
393
|
+
this._failure ?? (this._failure = error);
|
|
394
|
+
this._settleFinish();
|
|
395
|
+
if (this.socket.readyState !== ws_adapter_1.ReadyState.CLOSED) {
|
|
396
|
+
this.socket.platformSocket.terminate();
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
_settleFinish() {
|
|
400
|
+
if (!this._transportClosed || (!this._failure && !this._terminalDelivered)) {
|
|
401
|
+
return;
|
|
402
|
+
}
|
|
403
|
+
clearTimeout(this._finishTimer);
|
|
404
|
+
this._signal?.removeEventListener('abort', this._onAbort);
|
|
405
|
+
this._signal = undefined;
|
|
406
|
+
if (this._failure) {
|
|
407
|
+
this._rejectFinish?.(this._failure);
|
|
408
|
+
}
|
|
409
|
+
else {
|
|
410
|
+
this._resolveFinish?.();
|
|
411
|
+
}
|
|
412
|
+
this._resolveFinish = undefined;
|
|
413
|
+
this._rejectFinish = undefined;
|
|
414
|
+
}
|
|
415
|
+
_closeTransport() {
|
|
416
|
+
if (this.socket.readyState === ws_adapter_1.ReadyState.CLOSED || this.socket.readyState === ws_adapter_1.ReadyState.CLOSING) {
|
|
417
|
+
return;
|
|
418
|
+
}
|
|
419
|
+
if (!this._finishPromise) {
|
|
420
|
+
this._closeTimer = setTimeout(() => {
|
|
421
|
+
const error = new internal_base_1.OpenAIRealtimeError('Timed out closing the translation transport.', null);
|
|
422
|
+
this._fail(error);
|
|
423
|
+
this._reportError(error);
|
|
424
|
+
}, 1000);
|
|
425
|
+
const timer = this._closeTimer;
|
|
426
|
+
if (typeof timer === 'object' &&
|
|
427
|
+
timer !== null &&
|
|
428
|
+
'unref' in timer &&
|
|
429
|
+
typeof timer.unref === 'function') {
|
|
430
|
+
timer.unref();
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
try {
|
|
434
|
+
this.socket.close(1000, 'OK');
|
|
435
|
+
}
|
|
436
|
+
catch {
|
|
437
|
+
const error = new internal_base_1.OpenAIRealtimeError('Could not close the translation transport.', null);
|
|
438
|
+
this._fail(error);
|
|
439
|
+
this._emit('error', error);
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
exports.OpenAIRealtimeTranslationWS = OpenAIRealtimeTranslationWS;
|
|
444
|
+
//# sourceMappingURL=ws.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ws.js","sourceRoot":"","sources":["../../src/realtime/translations/ws.ts"],"names":[],"mappings":"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"}
|