@zhivex-ai/openai 0.15.0 → 0.16.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/README.md +11 -0
- package/dist/live-audio.d.ts +6 -0
- package/dist/live-audio.d.ts.map +1 -0
- package/dist/live-audio.js +23 -0
- package/dist/live-audio.js.map +1 -0
- package/dist/live-session.d.ts +85 -0
- package/dist/live-session.d.ts.map +1 -0
- package/dist/live-session.js +166 -0
- package/dist/live-session.js.map +1 -0
- package/dist/live-webrtc-browser.d.ts +31 -0
- package/dist/live-webrtc-browser.d.ts.map +1 -0
- package/dist/live-webrtc-browser.js +235 -0
- package/dist/live-webrtc-browser.js.map +1 -0
- package/dist/live-webrtc-protocol.d.ts +15 -0
- package/dist/live-webrtc-protocol.d.ts.map +1 -0
- package/dist/live-webrtc-protocol.js +21 -0
- package/dist/live-webrtc-protocol.js.map +1 -0
- package/dist/live-webrtc-server.d.ts +34 -0
- package/dist/live-webrtc-server.d.ts.map +1 -0
- package/dist/live-webrtc-server.js +79 -0
- package/dist/live-webrtc-server.js.map +1 -0
- package/dist/live.d.ts +4 -5
- package/dist/live.d.ts.map +1 -1
- package/dist/live.js +6 -150
- package/dist/live.js.map +1 -1
- package/package.json +9 -1
package/README.md
CHANGED
|
@@ -465,3 +465,14 @@ These changes describe this source branch, not previously published packages.
|
|
|
465
465
|
predicate, typed string/boolean choice, fractional score, inline images and
|
|
466
466
|
per-question refusal. See [portable Decisions](../../docs/DECISIONS.md) for the
|
|
467
467
|
contract, explicit gateway fallback and separate Decisions pricing.
|
|
468
|
+
|
|
469
|
+
## Experimental GPT-Live browser WebRTC
|
|
470
|
+
|
|
471
|
+
Use `@zhivex-ai/openai/experimental/live-browser` for the application-stream client,
|
|
472
|
+
and `@zhivex-ai/openai/experimental/live-server` for server session creation and
|
|
473
|
+
sideband delegation. These are experimental entrypoints over Core's existing
|
|
474
|
+
RealtimeSession contract. API keys stay on the backend; the app owns microphone
|
|
475
|
+
permission and playback. Muting keeps billing active; end with confirmed
|
|
476
|
+
`session.closed`. See the [Live guide](../../docs/OPENAI_LIVE.md#experimental-browser-webrtc)
|
|
477
|
+
and [Next.js recipe](../../examples/openai-live-webrtc/README.md). Offline tests do
|
|
478
|
+
not constitute authenticated WebRTC provider certification.
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type RealtimeSessionConfig, type RealtimeSessionCallbacks } from "@zhivex-ai/core/provider";
|
|
2
|
+
/** Node/server audio codec. Kept outside the browser protocol graph. */
|
|
3
|
+
export declare function liveAudioCallbacks(resolved: RealtimeSessionConfig): Pick<RealtimeSessionCallbacks, "buildAudioPayloads"> & {
|
|
4
|
+
parseOutputAudio: RealtimeSessionCallbacks["parseEvent"];
|
|
5
|
+
};
|
|
6
|
+
//# sourceMappingURL=live-audio.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-audio.d.ts","sourceRoot":"","sources":["../src/live-audio.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4D,KAAK,qBAAqB,EAAE,KAAK,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAC/J,wEAAwE;AACxE,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,qBAAqB,GAAG,IAAI,CAAC,wBAAwB,EAAE,oBAAoB,CAAC,GAAG;IAAE,gBAAgB,EAAE,wBAAwB,CAAC,YAAY,CAAC,CAAA;CAAE,CAevL"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { ValidationError, decodeBase64WithLimit, encodeAudioFrame } from "@zhivex-ai/core/provider";
|
|
2
|
+
/** Node/server audio codec. Kept outside the browser protocol graph. */
|
|
3
|
+
export function liveAudioCallbacks(resolved) {
|
|
4
|
+
const parseOutputAudio = payload => {
|
|
5
|
+
if (typeof payload.delta !== "string")
|
|
6
|
+
throw new ValidationError("Invalid GPT-Live audio delta.");
|
|
7
|
+
const audio = decodeBase64WithLimit(payload.delta, { maxBytes: 16 * 1024 * 1024, provider: "openai", endpoint: "live/sessions" });
|
|
8
|
+
if (resolved.outputAudioMediaType === "audio/pcm" && audio.byteLength % 2)
|
|
9
|
+
throw new ValidationError("GPT-Live PCM output must contain complete 16-bit samples.");
|
|
10
|
+
return [{ type: "realtime-audio-output", audio, mediaType: resolved.outputAudioMediaType ?? "audio/pcm",
|
|
11
|
+
sampleRateHz: resolved.outputSampleRateHz, channels: 1 }];
|
|
12
|
+
};
|
|
13
|
+
return { parseOutputAudio, buildAudioPayloads: frame => {
|
|
14
|
+
if (frame.mediaType !== resolved.inputAudioMediaType || (frame.sampleRateHz !== undefined && frame.sampleRateHz !== resolved.inputSampleRateHz) || (frame.channels !== undefined && frame.channels !== 1))
|
|
15
|
+
throw new ValidationError("Audio frame does not match the GPT-Live session format; resample it before sending.");
|
|
16
|
+
const audio = encodeAudioFrame(frame);
|
|
17
|
+
const bytes = decodeBase64WithLimit(audio, { maxBytes: 16 * 1024 * 1024, provider: "openai", endpoint: "live/sessions" });
|
|
18
|
+
if (resolved.inputAudioMediaType === "audio/pcm" && bytes.byteLength % 2)
|
|
19
|
+
throw new ValidationError("GPT-Live PCM input must contain complete 16-bit samples.");
|
|
20
|
+
return [{ type: "session.input_audio.append", audio }];
|
|
21
|
+
} };
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=live-audio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-audio.js","sourceRoot":"","sources":["../src/live-audio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,gBAAgB,EAA6D,MAAM,0BAA0B,CAAC;AAC/J,wEAAwE;AACxE,MAAM,UAAU,kBAAkB,CAAC,QAA+B;IAChE,MAAM,gBAAgB,GAA2C,OAAO,CAAC,EAAE;QACzE,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ;YAAE,MAAM,IAAI,eAAe,CAAC,+BAA+B,CAAC,CAAC;QAClG,MAAM,KAAK,GAAG,qBAAqB,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC,CAAC;QAClI,IAAI,QAAQ,CAAC,oBAAoB,KAAK,WAAW,IAAI,KAAK,CAAC,UAAU,GAAG,CAAC;YAAE,MAAM,IAAI,eAAe,CAAC,2DAA2D,CAAC,CAAC;QAClK,OAAO,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,oBAAoB,IAAI,WAAW;gBACrG,YAAY,EAAE,QAAQ,CAAC,kBAAkB,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;IAC9D,CAAC,CAAC;IACF,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,KAAK,CAAC,EAAE;YACnD,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ,CAAC,mBAAmB,IAAI,CAAC,KAAK,CAAC,YAAY,KAAK,SAAS,IAAI,KAAK,CAAC,YAAY,KAAK,QAAQ,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,KAAK,CAAC,QAAQ,KAAK,CAAC,CAAC;gBAAE,MAAM,IAAI,eAAe,CAAC,qFAAqF,CAAC,CAAC;YAC5T,MAAM,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;YACtC,MAAM,KAAK,GAAG,qBAAqB,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC,CAAC;YAC1H,IAAI,QAAQ,CAAC,mBAAmB,KAAK,WAAW,IAAI,KAAK,CAAC,UAAU,GAAG,CAAC;gBAAE,MAAM,IAAI,eAAe,CAAC,0DAA0D,CAAC,CAAC;YAChK,OAAO,CAAC,EAAE,IAAI,EAAE,4BAA4B,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3D,CAAC,EAAE,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { CallbackRealtimeSession, type JsonValue, type ModelCapabilities, type AudioFrame, type RealtimeConnection, type RealtimeEventParser, type RealtimePayloadBuilder, type RealtimeSessionConfig } from "@zhivex-ai/core/runtime";
|
|
2
|
+
export declare const isOpenAILiveModel: (modelId: string) => boolean;
|
|
3
|
+
export declare const liveCapabilities: ModelCapabilities;
|
|
4
|
+
export declare function resolveLiveConfig(config: RealtimeSessionConfig): {
|
|
5
|
+
mode?: "conversation" | "translation" | "transcription";
|
|
6
|
+
instructions?: string;
|
|
7
|
+
voice?: string;
|
|
8
|
+
tools?: import("@zhivex-ai/core/runtime").ToolCollection;
|
|
9
|
+
toolChoice?: import("@zhivex-ai/core/runtime").ToolChoice;
|
|
10
|
+
reasoning?: import("@zhivex-ai/core/runtime").ReasoningConfig;
|
|
11
|
+
inputTranscription?: {
|
|
12
|
+
model?: string;
|
|
13
|
+
language?: string;
|
|
14
|
+
prompt?: string;
|
|
15
|
+
includeLogprobs?: boolean;
|
|
16
|
+
delay?: "minimal" | "low" | "medium" | "high" | "xhigh";
|
|
17
|
+
};
|
|
18
|
+
inputAudioTranscription?: boolean | Record<string, unknown>;
|
|
19
|
+
outputAudioTranscription?: boolean | Record<string, unknown>;
|
|
20
|
+
translation?: {
|
|
21
|
+
targetLanguage: string;
|
|
22
|
+
sourceLanguage?: string;
|
|
23
|
+
instructions?: string;
|
|
24
|
+
};
|
|
25
|
+
turnDetection?: Record<string, unknown> | null;
|
|
26
|
+
noiseReduction?: Record<string, unknown> | null;
|
|
27
|
+
mediaResolution?: string;
|
|
28
|
+
affectiveDialog?: boolean;
|
|
29
|
+
proactiveAudio?: boolean;
|
|
30
|
+
providerOptions?: import("@zhivex-ai/core/runtime").ProviderOptions;
|
|
31
|
+
metadata?: Record<string, JsonValue>;
|
|
32
|
+
delegation: {
|
|
33
|
+
type: "client";
|
|
34
|
+
};
|
|
35
|
+
autoResponse: boolean;
|
|
36
|
+
inputAudioMediaType: string;
|
|
37
|
+
outputAudioMediaType: string;
|
|
38
|
+
inputSampleRateHz: number;
|
|
39
|
+
outputSampleRateHz: number;
|
|
40
|
+
channels: number;
|
|
41
|
+
};
|
|
42
|
+
/** Internal protocol mapper shared by primary WebSocket, WebRTC and sideband. */
|
|
43
|
+
export declare function createLiveSession(modelId: string, resolved: RealtimeSessionConfig, connection: RealtimeConnection, options?: {
|
|
44
|
+
expectedSessionId?: string;
|
|
45
|
+
started?: boolean;
|
|
46
|
+
attached?: boolean;
|
|
47
|
+
webrtc?: boolean;
|
|
48
|
+
timeoutMs?: number;
|
|
49
|
+
parseOutputAudio?: RealtimeEventParser;
|
|
50
|
+
buildAudioPayloads?: RealtimePayloadBuilder<AudioFrame>;
|
|
51
|
+
}): CallbackRealtimeSession;
|
|
52
|
+
export declare function resolveLiveWebRTCConfig(config?: RealtimeSessionConfig): {
|
|
53
|
+
mode?: "conversation" | "translation" | "transcription";
|
|
54
|
+
instructions?: string;
|
|
55
|
+
voice?: string;
|
|
56
|
+
tools?: import("@zhivex-ai/core/runtime").ToolCollection;
|
|
57
|
+
toolChoice?: import("@zhivex-ai/core/runtime").ToolChoice;
|
|
58
|
+
reasoning?: import("@zhivex-ai/core/runtime").ReasoningConfig;
|
|
59
|
+
inputTranscription?: {
|
|
60
|
+
model?: string;
|
|
61
|
+
language?: string;
|
|
62
|
+
prompt?: string;
|
|
63
|
+
includeLogprobs?: boolean;
|
|
64
|
+
delay?: "minimal" | "low" | "medium" | "high" | "xhigh";
|
|
65
|
+
};
|
|
66
|
+
inputAudioTranscription?: boolean | Record<string, unknown>;
|
|
67
|
+
outputAudioTranscription?: boolean | Record<string, unknown>;
|
|
68
|
+
translation?: {
|
|
69
|
+
targetLanguage: string;
|
|
70
|
+
sourceLanguage?: string;
|
|
71
|
+
instructions?: string;
|
|
72
|
+
};
|
|
73
|
+
turnDetection?: Record<string, unknown> | null;
|
|
74
|
+
noiseReduction?: Record<string, unknown> | null;
|
|
75
|
+
mediaResolution?: string;
|
|
76
|
+
affectiveDialog?: boolean;
|
|
77
|
+
proactiveAudio?: boolean;
|
|
78
|
+
providerOptions?: import("@zhivex-ai/core/runtime").ProviderOptions;
|
|
79
|
+
metadata?: Record<string, JsonValue>;
|
|
80
|
+
delegation: {
|
|
81
|
+
type: "client";
|
|
82
|
+
};
|
|
83
|
+
autoResponse: boolean;
|
|
84
|
+
};
|
|
85
|
+
//# sourceMappingURL=live-session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-session.d.ts","sourceRoot":"","sources":["../src/live-session.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EAEvB,KAAK,SAAS,EAAE,KAAK,iBAAiB,EACtC,KAAK,UAAU,EAAE,KAAK,kBAAkB,EAAE,KAAK,mBAAmB,EAAE,KAAK,sBAAsB,EAC/F,KAAK,qBAAqB,EAC3B,MAAM,yBAAyB,CAAC;AAEjC,eAAO,MAAM,iBAAiB,YAAa,MAAM,YAAwD,CAAC;AAE1G,eAAO,MAAM,gBAAgB,EAAE,iBAQ9B,CAAC;AAQF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAkClC,IAAI,EAAE,QAAQ;;;;;;;;EAI1C;AAED,iFAAiF;AACjF,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,qBAAqB,EAAE,UAAU,EAAE,kBAAkB,EAAE,OAAO,GAAE;IAAE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE,mBAAmB,CAAC;IAAC,kBAAkB,CAAC,EAAE,sBAAsB,CAAC,UAAU,CAAC,CAAA;CAAO,2BA8E7U;AAED,wBAAgB,uBAAuB,CAAC,MAAM,GAAE,qBAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAvF7C,IAAI,EAAE,QAAQ;;;EA+F1C"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { CallbackRealtimeSession, ConfigurationError, UnsupportedFeatureError, ValidationError } from "@zhivex-ai/core/runtime";
|
|
2
|
+
export const isOpenAILiveModel = (modelId) => /^gpt-live-1(?:-\d{4}-\d{2}-\d{2})?$/.test(modelId);
|
|
3
|
+
export const liveCapabilities = {
|
|
4
|
+
streaming: false, tools: false, structuredOutput: false, jsonMode: false,
|
|
5
|
+
toolChoice: false, parallelToolCalls: false, vision: false, files: false,
|
|
6
|
+
audioInput: true, audioOutput: true, embeddings: false, reasoning: false, webSearch: false,
|
|
7
|
+
realtime: {
|
|
8
|
+
sessions: true, audioInput: true, audioOutput: true, imageInput: false,
|
|
9
|
+
tools: false, browserTokens: false, fullDuplex: true, clientDelegation: true
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
const allowedConfig = new Set([
|
|
13
|
+
"mode", "instructions", "voice", "delegation", "inputAudioMediaType", "outputAudioMediaType",
|
|
14
|
+
"inputSampleRateHz", "outputSampleRateHz", "channels", "autoResponse", "providerOptions"
|
|
15
|
+
]);
|
|
16
|
+
const allowedOptions = new Set(["headers", "safety_identifier", "input", "store", "closeTimeoutMs"]);
|
|
17
|
+
export function resolveLiveConfig(config) {
|
|
18
|
+
for (const [key, value] of Object.entries(config)) {
|
|
19
|
+
if (value !== undefined && !allowedConfig.has(key))
|
|
20
|
+
throw new UnsupportedFeatureError(`GPT-Live client delegation does not support session option "${key}". Configure tools and reasoning in your backend agent.`);
|
|
21
|
+
}
|
|
22
|
+
if (config.mode !== undefined && config.mode !== "conversation")
|
|
23
|
+
throw new UnsupportedFeatureError("GPT-Live supports conversation mode only.");
|
|
24
|
+
if (config.autoResponse === true)
|
|
25
|
+
throw new UnsupportedFeatureError("GPT-Live does not support manual response triggers; stream audio continuously.");
|
|
26
|
+
if (config.delegation && (config.delegation.type !== "client" || Object.keys(config.delegation).some((key) => key !== "type"))) {
|
|
27
|
+
throw new UnsupportedFeatureError("This GPT-Live adapter supports client delegation only.");
|
|
28
|
+
}
|
|
29
|
+
const provider = config.providerOptions ?? {};
|
|
30
|
+
for (const [key, value] of Object.entries(provider)) {
|
|
31
|
+
if (value !== undefined && !allowedOptions.has(key))
|
|
32
|
+
throw new UnsupportedFeatureError(`Unsupported GPT-Live provider option "${key}".`);
|
|
33
|
+
}
|
|
34
|
+
if (provider.store !== undefined && typeof provider.store !== "boolean")
|
|
35
|
+
throw new ConfigurationError("GPT-Live store must be boolean.");
|
|
36
|
+
if (provider.closeTimeoutMs !== undefined && (!Number.isSafeInteger(provider.closeTimeoutMs) || Number(provider.closeTimeoutMs) <= 0))
|
|
37
|
+
throw new ConfigurationError("GPT-Live closeTimeoutMs must be a positive safe integer.");
|
|
38
|
+
if (provider.input !== undefined) {
|
|
39
|
+
if (!Array.isArray(provider.input) || provider.input.length > 128)
|
|
40
|
+
throw new ConfigurationError("GPT-Live input must contain at most 128 text messages.");
|
|
41
|
+
for (const item of provider.input) {
|
|
42
|
+
const part = item?.content?.[0];
|
|
43
|
+
if (item?.type !== "message" || !["developer", "user", "assistant"].includes(item.role) ||
|
|
44
|
+
!Array.isArray(item.content) || item.content.length !== 1 || typeof part?.text !== "string" ||
|
|
45
|
+
!(item.role === "assistant" ? ["text", "output_text"] : ["input_text"]).includes(part.type)) {
|
|
46
|
+
throw new ConfigurationError("GPT-Live history requires developer/user input_text or assistant output_text messages.");
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
const mediaType = config.inputAudioMediaType ?? config.outputAudioMediaType ?? "audio/pcm";
|
|
51
|
+
const rate = config.inputSampleRateHz ?? config.outputSampleRateHz ?? (mediaType === "audio/pcm" ? 24000 : 8000);
|
|
52
|
+
if ((mediaType !== "audio/pcm" || ![16000, 24000].includes(rate)) &&
|
|
53
|
+
(!["audio/pcmu", "audio/pcma"].includes(mediaType) || rate !== 8000))
|
|
54
|
+
throw new ConfigurationError("GPT-Live requires mono PCM16 at 16/24 kHz or G.711 at 8 kHz.");
|
|
55
|
+
if ((config.channels !== undefined && config.channels !== 1) ||
|
|
56
|
+
(config.outputAudioMediaType !== undefined && config.outputAudioMediaType !== mediaType) ||
|
|
57
|
+
(config.outputSampleRateHz !== undefined && config.outputSampleRateHz !== rate))
|
|
58
|
+
throw new ConfigurationError("GPT-Live requires the same mono audio format for input and output.");
|
|
59
|
+
return {
|
|
60
|
+
...config, delegation: { type: "client" }, autoResponse: false,
|
|
61
|
+
inputAudioMediaType: mediaType, outputAudioMediaType: mediaType,
|
|
62
|
+
inputSampleRateHz: rate, outputSampleRateHz: rate, channels: 1
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/** Internal protocol mapper shared by primary WebSocket, WebRTC and sideband. */
|
|
66
|
+
export function createLiveSession(modelId, resolved, connection, options = {}) {
|
|
67
|
+
const delegations = new Set();
|
|
68
|
+
const metadata = (payload) => payload;
|
|
69
|
+
const unsupported = (feature) => { throw new UnsupportedFeatureError(`GPT-Live ${feature}; use the backend agent or appendContext() as appropriate.`); };
|
|
70
|
+
const append = (update) => {
|
|
71
|
+
if (options.webrtc)
|
|
72
|
+
return unsupported("backend context appends belong on the trusted sideband");
|
|
73
|
+
if (!["instructions", "context", "commentary"].includes(update.kind) || typeof update.content !== "string" || !update.content.trim())
|
|
74
|
+
throw new ValidationError("Live context updates require a kind and non-empty string content.");
|
|
75
|
+
if (update.delegationId !== undefined && !delegations.has(update.delegationId))
|
|
76
|
+
throw new ValidationError("Unknown GPT-Live client delegation ID.");
|
|
77
|
+
// Tokenization is provider-owned (500 tokens per append); never silently truncate a result.
|
|
78
|
+
return [{ type: `session.${update.kind === "context" ? "thinking" : update.kind}.append`,
|
|
79
|
+
content: update.content, delegation_id: update.delegationId ?? null,
|
|
80
|
+
...(update.eventId !== undefined ? { event_id: update.eventId } : {}) }];
|
|
81
|
+
};
|
|
82
|
+
const parseEvent = (payload) => {
|
|
83
|
+
const type = payload.type;
|
|
84
|
+
if (type === "session.started" || type === "session.updated")
|
|
85
|
+
return [{ type: "realtime-provider-data", provider: "openai", data: metadata(payload) }];
|
|
86
|
+
if (type === "session.output_audio.delta") {
|
|
87
|
+
if (!options.parseOutputAudio)
|
|
88
|
+
throw new ValidationError("GPT-Live audio must use the primary media tracks.");
|
|
89
|
+
return options.parseOutputAudio(payload);
|
|
90
|
+
}
|
|
91
|
+
if (type === "session.input_transcript.delta" || type === "session.output_transcript.delta") {
|
|
92
|
+
if (typeof payload.delta !== "string")
|
|
93
|
+
throw new ValidationError("Invalid GPT-Live transcript delta.");
|
|
94
|
+
return [{ type: "realtime-transcript", role: type === "session.input_transcript.delta" ? "user" : "assistant",
|
|
95
|
+
text: payload.delta, isFinal: false,
|
|
96
|
+
...(typeof payload.start_ms === "number" ? { startMs: payload.start_ms } : {}),
|
|
97
|
+
...(typeof payload.end_ms === "number" ? { endMs: payload.end_ms } : {}), providerMetadata: metadata(payload) }];
|
|
98
|
+
}
|
|
99
|
+
if (type === "session.delegation.created") {
|
|
100
|
+
const delegation = payload.delegation;
|
|
101
|
+
if (!delegation || typeof delegation.id !== "string" || !delegation.id || delegation.target !== "client")
|
|
102
|
+
throw new ValidationError("Invalid GPT-Live client delegation event.");
|
|
103
|
+
if (!delegations.has(delegation.id) && delegations.size >= 4096)
|
|
104
|
+
throw new ValidationError("GPT-Live session delegation limit exceeded.");
|
|
105
|
+
delegations.add(delegation.id);
|
|
106
|
+
return [{ type: "realtime-delegation", delegationId: delegation.id,
|
|
107
|
+
...(typeof payload.offset_ms === "number" ? { offsetMs: payload.offset_ms } : {}), providerMetadata: metadata(payload) }];
|
|
108
|
+
}
|
|
109
|
+
if (type === "session.closed")
|
|
110
|
+
return [{ type: "realtime-end", reason: "provider-close", providerMetadata: metadata(payload) }];
|
|
111
|
+
if (type === "error") {
|
|
112
|
+
const error = payload.error;
|
|
113
|
+
return [{ type: "realtime-error", message: typeof error?.message === "string" ? error.message : "GPT-Live session error", providerMetadata: metadata(payload) }];
|
|
114
|
+
}
|
|
115
|
+
// Usage snapshots, acknowledgements and future control events remain inspectable.
|
|
116
|
+
return [{ type: "realtime-provider-data", provider: "openai", data: metadata(payload) }];
|
|
117
|
+
};
|
|
118
|
+
const session = new CallbackRealtimeSession({
|
|
119
|
+
provider: "openai", modelId: modelId, capabilities: liveCapabilities,
|
|
120
|
+
config: resolved, connection, initializationTimeoutMs: options.timeoutMs ?? 15_000,
|
|
121
|
+
closeTimeoutMs: resolved.providerOptions?.closeTimeoutMs,
|
|
122
|
+
callbacks: {
|
|
123
|
+
parseEvent,
|
|
124
|
+
...(options.attached ? {} : { isReadyPayload: (p) => p.type === "session.started" }),
|
|
125
|
+
shouldReplayEvent: (event) => event.type !== "realtime-audio-output",
|
|
126
|
+
isCloseAcknowledgementPayload: (p) => {
|
|
127
|
+
if (p.type !== "session.closed")
|
|
128
|
+
return false;
|
|
129
|
+
if (options.expectedSessionId) {
|
|
130
|
+
const snapshot = p.session;
|
|
131
|
+
const usage = p.usage;
|
|
132
|
+
if (snapshot?.id !== options.expectedSessionId || typeof usage?.seconds !== "number" || !Number.isFinite(usage.seconds) || usage.seconds < 0) {
|
|
133
|
+
throw new ValidationError("Invalid GPT-Live finalization event; final usage is unconfirmed.");
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return true;
|
|
137
|
+
},
|
|
138
|
+
buildInitialPayloads: () => options.started ? [] : [{ type: "session.start", session: {
|
|
139
|
+
model: modelId, ...(resolved.instructions !== undefined ? { instructions: resolved.instructions } : {}),
|
|
140
|
+
audio: { format: { type: resolved.inputAudioMediaType, rate: resolved.inputSampleRateHz }, output: { voice: resolved.voice ?? "marin" } },
|
|
141
|
+
delegation: { type: "client" }, store: resolved.providerOptions?.store ?? false,
|
|
142
|
+
...(resolved.providerOptions?.input !== undefined ? { input: resolved.providerOptions.input } : {})
|
|
143
|
+
} }],
|
|
144
|
+
buildAudioPayloads: options.buildAudioPayloads ?? (() => unsupported("media uses the primary WebRTC tracks")),
|
|
145
|
+
buildTextPayloads: () => unsupported("does not accept typed user input on the voice frontend"),
|
|
146
|
+
buildToolResultPayloads: () => unsupported("does not accept Realtime tool results"),
|
|
147
|
+
buildUpdatePayloads: () => unsupported("client sessions have immutable startup configuration"),
|
|
148
|
+
buildContextPayloads: append,
|
|
149
|
+
buildInputMutePayloads: (muted) => [{ type: muted ? "session.input_audio.mute" : "session.input_audio.unmute" }],
|
|
150
|
+
buildClosePayloads: () => [{ type: "session.close" }]
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
return session;
|
|
154
|
+
}
|
|
155
|
+
export function resolveLiveWebRTCConfig(config = {}) {
|
|
156
|
+
for (const key of ["inputAudioMediaType", "outputAudioMediaType", "inputSampleRateHz", "outputSampleRateHz", "channels"]) {
|
|
157
|
+
if (config[key] !== undefined)
|
|
158
|
+
throw new ConfigurationError("WebRTC audio format is negotiated by SDP.");
|
|
159
|
+
}
|
|
160
|
+
if (config.providerOptions?.headers !== undefined || config.providerOptions?.safety_identifier !== undefined)
|
|
161
|
+
throw new ConfigurationError("Supply connection headers on the server options.");
|
|
162
|
+
const resolved = resolveLiveConfig(config);
|
|
163
|
+
const { inputAudioMediaType, outputAudioMediaType, inputSampleRateHz, outputSampleRateHz, channels, ...rtc } = resolved;
|
|
164
|
+
return rtc;
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=live-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-session.js","sourceRoot":"","sources":["../src/live-session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type RealtimeSession } from "@zhivex-ai/core/runtime";
|
|
2
|
+
import { type OpenAILiveWebRTCAnswer } from "./live-webrtc-protocol.js";
|
|
3
|
+
export type { OpenAILiveWebRTCAnswer } from "./live-webrtc-protocol.js";
|
|
4
|
+
export interface OpenAILiveWebRTCOptions {
|
|
5
|
+
modelId?: string;
|
|
6
|
+
/** Application-permissioned stream. SDK owns only audio clones; never captures devices. */
|
|
7
|
+
mediaStream: MediaStream;
|
|
8
|
+
/** Call your authenticated backend. Keep configuration and credentials there. */
|
|
9
|
+
exchangeSdp(input: {
|
|
10
|
+
offerSdp: string;
|
|
11
|
+
signal: AbortSignal;
|
|
12
|
+
}): Promise<OpenAILiveWebRTCAnswer>;
|
|
13
|
+
/** Close a known session via your authorized backend if handshake/connection fails.
|
|
14
|
+
* The backend also needs a creation lease for cancellation before an ID reaches the browser. */
|
|
15
|
+
releaseSession(input: {
|
|
16
|
+
sessionId: string;
|
|
17
|
+
}): Promise<void>;
|
|
18
|
+
onTrack?: (event: RTCTrackEvent) => void;
|
|
19
|
+
onError?: (error: Error) => void;
|
|
20
|
+
signal?: AbortSignal;
|
|
21
|
+
timeoutMs?: number;
|
|
22
|
+
closeTimeoutMs?: number;
|
|
23
|
+
peerConnectionFactory?: () => RTCPeerConnection;
|
|
24
|
+
}
|
|
25
|
+
export interface OpenAILiveWebRTCSession extends RealtimeSession {
|
|
26
|
+
readonly sessionId: string;
|
|
27
|
+
readonly peerConnection: RTCPeerConnection;
|
|
28
|
+
}
|
|
29
|
+
/** Experimental browser transport over the shared RealtimeSession lifecycle. */
|
|
30
|
+
export declare function experimentalConnectOpenAILiveWebRTC(options: OpenAILiveWebRTCOptions): Promise<OpenAILiveWebRTCSession>;
|
|
31
|
+
//# sourceMappingURL=live-webrtc-browser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-webrtc-browser.d.ts","sourceRoot":"","sources":["../src/live-webrtc-browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyC,KAAK,eAAe,EAA2B,MAAM,yBAAyB,CAAC;AAE/H,OAAO,EAAsC,KAAK,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAC5G,YAAY,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAExE,MAAM,WAAW,uBAAuB;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2FAA2F;IAC3F,WAAW,EAAE,WAAW,CAAC;IACzB,iFAAiF;IACjF,WAAW,CAAC,KAAK,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAC/F;oGACgG;IAChG,cAAc,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IACzC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qBAAqB,CAAC,EAAE,MAAM,iBAAiB,CAAC;CACjD;AACD,MAAM,WAAW,uBAAwB,SAAQ,eAAe;IAC9D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,cAAc,EAAE,iBAAiB,CAAC;CAC5C;AAED,gFAAgF;AAChF,wBAAsB,mCAAmC,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAwI5H"}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { ConfigurationError, withTimeoutSignal } from "@zhivex-ai/core/runtime";
|
|
2
|
+
import { createLiveSession, isOpenAILiveModel } from "./live-session.js";
|
|
3
|
+
import { liveAnswer, liveSdp, liveSessionId } from "./live-webrtc-protocol.js";
|
|
4
|
+
/** Experimental browser transport over the shared RealtimeSession lifecycle. */
|
|
5
|
+
export async function experimentalConnectOpenAILiveWebRTC(options) {
|
|
6
|
+
const modelId = options.modelId ?? "gpt-live-1";
|
|
7
|
+
if (!isOpenAILiveModel(modelId))
|
|
8
|
+
throw new ConfigurationError("A supported GPT-Live-1 model is required.");
|
|
9
|
+
if (typeof options.exchangeSdp !== "function" || typeof options.releaseSession !== "function")
|
|
10
|
+
throw new ConfigurationError("Application SDP exchange and session cleanup callbacks are required.");
|
|
11
|
+
if (!options.mediaStream?.getAudioTracks().length)
|
|
12
|
+
throw new ConfigurationError("WebRTC requires an application-provided audio track.");
|
|
13
|
+
if (options.closeTimeoutMs !== undefined && (!Number.isSafeInteger(options.closeTimeoutMs) || options.closeTimeoutMs <= 0))
|
|
14
|
+
throw new ConfigurationError("Invalid close timeout.");
|
|
15
|
+
if (!options.peerConnectionFactory && typeof globalThis.RTCPeerConnection !== "function")
|
|
16
|
+
throw new ConfigurationError("This browser does not support RTCPeerConnection.");
|
|
17
|
+
const deadline = withTimeoutSignal({ timeoutMs: options.timeoutMs ?? 15_000, abortSignal: options.signal });
|
|
18
|
+
let pc;
|
|
19
|
+
try {
|
|
20
|
+
deadline.signal.throwIfAborted();
|
|
21
|
+
pc = (options.peerConnectionFactory ?? (() => new RTCPeerConnection({ iceServers: [] })))();
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
deadline.cleanup();
|
|
25
|
+
throw error;
|
|
26
|
+
}
|
|
27
|
+
const tracks = [];
|
|
28
|
+
const enabled = [];
|
|
29
|
+
let channel;
|
|
30
|
+
let closed = false, acknowledged = false, sessionId;
|
|
31
|
+
let failure;
|
|
32
|
+
let receiver;
|
|
33
|
+
const queue = [];
|
|
34
|
+
let queuedBytes = 0;
|
|
35
|
+
let released;
|
|
36
|
+
let rejectInterrupted;
|
|
37
|
+
const interrupted = new Promise((_, reject) => { rejectInterrupted = reject; });
|
|
38
|
+
void interrupted.catch(() => { });
|
|
39
|
+
const bounded = (promise) => Promise.race([promise, interrupted]);
|
|
40
|
+
const report = (error) => { try {
|
|
41
|
+
options.onError?.(error);
|
|
42
|
+
}
|
|
43
|
+
catch { /* Teardown must proceed. */ } };
|
|
44
|
+
const release = () => {
|
|
45
|
+
if (acknowledged || !sessionId)
|
|
46
|
+
return Promise.resolve();
|
|
47
|
+
if (!released) {
|
|
48
|
+
// An aborted handshake signal must not cancel the backend's cleanup request.
|
|
49
|
+
released = (async () => {
|
|
50
|
+
let timer;
|
|
51
|
+
try {
|
|
52
|
+
await Promise.race([options.releaseSession({ sessionId: sessionId }), new Promise((_, reject) => {
|
|
53
|
+
timer = setTimeout(() => reject(new Error("Backend session cleanup timed out; finalization is unconfirmed.")), 5000);
|
|
54
|
+
})]);
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
report(error instanceof Error ? error : new Error("Backend session cleanup failed; finalization is unconfirmed."));
|
|
58
|
+
}
|
|
59
|
+
finally {
|
|
60
|
+
if (timer)
|
|
61
|
+
clearTimeout(timer);
|
|
62
|
+
}
|
|
63
|
+
})();
|
|
64
|
+
}
|
|
65
|
+
return released;
|
|
66
|
+
};
|
|
67
|
+
const cleanup = () => {
|
|
68
|
+
if (closed)
|
|
69
|
+
return;
|
|
70
|
+
closed = true;
|
|
71
|
+
deadline.cleanup();
|
|
72
|
+
deadline.signal.removeEventListener("abort", abortSetup);
|
|
73
|
+
options.signal?.removeEventListener("abort", abortCaller);
|
|
74
|
+
pc.ontrack = null;
|
|
75
|
+
pc.onconnectionstatechange = null;
|
|
76
|
+
if (channel) {
|
|
77
|
+
channel.onmessage = null;
|
|
78
|
+
channel.onerror = null;
|
|
79
|
+
channel.onclose = null;
|
|
80
|
+
channel.close();
|
|
81
|
+
}
|
|
82
|
+
for (const track of tracks)
|
|
83
|
+
track.stop();
|
|
84
|
+
pc.close();
|
|
85
|
+
queue.length = 0;
|
|
86
|
+
queuedBytes = 0;
|
|
87
|
+
receiver?.reject(failure ?? new Error("WebRTC connection closed."));
|
|
88
|
+
receiver = undefined;
|
|
89
|
+
rejectInterrupted(failure ?? new Error("WebRTC connection closed."));
|
|
90
|
+
};
|
|
91
|
+
const fail = (error) => {
|
|
92
|
+
if (closed || acknowledged)
|
|
93
|
+
return;
|
|
94
|
+
failure = error;
|
|
95
|
+
cleanup();
|
|
96
|
+
deadline.abort(error);
|
|
97
|
+
void release();
|
|
98
|
+
report(error);
|
|
99
|
+
};
|
|
100
|
+
const abortSetup = () => fail(deadline.signal.reason instanceof Error ? deadline.signal.reason : new Error("WebRTC connection aborted; finalization is unconfirmed."));
|
|
101
|
+
const abortCaller = () => fail(options.signal?.reason instanceof Error ? options.signal.reason : new Error("WebRTC session aborted; finalization is unconfirmed."));
|
|
102
|
+
const connection = {
|
|
103
|
+
async sendJson(payload) {
|
|
104
|
+
if (closed || channel?.readyState !== "open")
|
|
105
|
+
throw new ConfigurationError("WebRTC data channel is not open.");
|
|
106
|
+
const json = JSON.stringify(payload), bytes = new TextEncoder().encode(json).length;
|
|
107
|
+
if (bytes > 64 * 1024 || bytes + channel.bufferedAmount > 256 * 1024)
|
|
108
|
+
throw new ConfigurationError("WebRTC outgoing buffer limit exceeded.");
|
|
109
|
+
channel.send(json);
|
|
110
|
+
},
|
|
111
|
+
async recvJson() {
|
|
112
|
+
if (failure)
|
|
113
|
+
throw failure;
|
|
114
|
+
if (queue.length) {
|
|
115
|
+
const entry = queue.shift();
|
|
116
|
+
queuedBytes -= entry.bytes;
|
|
117
|
+
return entry.payload;
|
|
118
|
+
}
|
|
119
|
+
if (closed)
|
|
120
|
+
return undefined;
|
|
121
|
+
if (receiver)
|
|
122
|
+
throw new ConfigurationError("Concurrent WebRTC receives are unsupported.");
|
|
123
|
+
return new Promise((resolve, reject) => { receiver = { resolve, reject }; });
|
|
124
|
+
},
|
|
125
|
+
async close() { cleanup(); await release(); }
|
|
126
|
+
};
|
|
127
|
+
deadline.signal.addEventListener("abort", abortSetup, { once: true });
|
|
128
|
+
try {
|
|
129
|
+
pc.ontrack = event => { try {
|
|
130
|
+
options.onTrack?.(event);
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
fail(new Error("Application track callback failed; finalization is unconfirmed."));
|
|
134
|
+
} };
|
|
135
|
+
pc.onconnectionstatechange = () => { if (["failed", "closed", "disconnected"].includes(pc.connectionState))
|
|
136
|
+
fail(new Error("WebRTC connection lost; final usage is unconfirmed.")); };
|
|
137
|
+
for (const source of options.mediaStream.getAudioTracks()) {
|
|
138
|
+
const track = source.clone();
|
|
139
|
+
tracks.push(track);
|
|
140
|
+
enabled.push(source.enabled);
|
|
141
|
+
track.enabled = false;
|
|
142
|
+
pc.addTrack(track, options.mediaStream);
|
|
143
|
+
}
|
|
144
|
+
channel = pc.createDataChannel("oai-events");
|
|
145
|
+
channel.onerror = () => fail(new Error("WebRTC data channel failed; finalization is unconfirmed."));
|
|
146
|
+
channel.onclose = () => fail(new Error("WebRTC data channel closed before session.closed; final usage is unconfirmed."));
|
|
147
|
+
channel.onmessage = event => {
|
|
148
|
+
if (closed)
|
|
149
|
+
return;
|
|
150
|
+
try {
|
|
151
|
+
if (typeof event.data !== "string")
|
|
152
|
+
throw new Error("WebRTC events must be JSON text.");
|
|
153
|
+
const bytes = new TextEncoder().encode(event.data).length;
|
|
154
|
+
if (bytes > 64 * 1024)
|
|
155
|
+
throw new Error("WebRTC event exceeds 64 KiB.");
|
|
156
|
+
const payload = JSON.parse(event.data);
|
|
157
|
+
if (!payload || Array.isArray(payload) || typeof payload.type !== "string")
|
|
158
|
+
throw new Error("Invalid WebRTC event.");
|
|
159
|
+
if (payload.type === "session.started" && payload.session?.id !== sessionId)
|
|
160
|
+
throw new Error("WebRTC session ID mismatch.");
|
|
161
|
+
if (payload.type === "session.closed") {
|
|
162
|
+
if (payload.session?.id !== sessionId || !Number.isFinite(payload.usage?.seconds) || payload.usage.seconds < 0)
|
|
163
|
+
throw new Error("Invalid WebRTC finalization event; final usage is unconfirmed.");
|
|
164
|
+
acknowledged = true;
|
|
165
|
+
}
|
|
166
|
+
if (receiver) {
|
|
167
|
+
const waiter = receiver;
|
|
168
|
+
receiver = undefined;
|
|
169
|
+
waiter.resolve(payload);
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
if (queue.length >= 128 || queuedBytes + bytes > 256 * 1024)
|
|
173
|
+
throw new Error("WebRTC incoming queue limit exceeded.");
|
|
174
|
+
queue.push({ payload, bytes });
|
|
175
|
+
queuedBytes += bytes;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
catch (error) {
|
|
179
|
+
fail(error instanceof Error ? error : new Error("Invalid WebRTC event."));
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
const offer = await bounded(pc.createOffer());
|
|
183
|
+
if (closed)
|
|
184
|
+
throw failure;
|
|
185
|
+
await bounded(pc.setLocalDescription(offer));
|
|
186
|
+
if (pc.iceGatheringState !== "complete")
|
|
187
|
+
await new Promise((resolve, reject) => {
|
|
188
|
+
const finish = (error) => { pc.removeEventListener("icegatheringstatechange", check); deadline.signal.removeEventListener("abort", abort); error ? reject(error) : resolve(); };
|
|
189
|
+
const check = () => { if (pc.iceGatheringState === "complete")
|
|
190
|
+
finish(); };
|
|
191
|
+
const abort = () => finish(deadline.signal.reason);
|
|
192
|
+
pc.addEventListener("icegatheringstatechange", check);
|
|
193
|
+
deadline.signal.addEventListener("abort", abort, { once: true });
|
|
194
|
+
check();
|
|
195
|
+
if (deadline.signal.aborted)
|
|
196
|
+
abort();
|
|
197
|
+
});
|
|
198
|
+
if (closed)
|
|
199
|
+
throw failure;
|
|
200
|
+
const exchange = options.exchangeSdp({ offerSdp: liveSdp(pc.localDescription?.sdp), signal: deadline.signal }).then(raw => {
|
|
201
|
+
sessionId = liveSessionId(raw?.session?.id);
|
|
202
|
+
const answer = liveAnswer(raw);
|
|
203
|
+
if (closed) {
|
|
204
|
+
void release();
|
|
205
|
+
throw failure ?? new Error("WebRTC closed during signaling.");
|
|
206
|
+
}
|
|
207
|
+
return answer;
|
|
208
|
+
});
|
|
209
|
+
const answer = await bounded(exchange);
|
|
210
|
+
await bounded(pc.setRemoteDescription({ type: "answer", sdp: answer.transport.sdp }));
|
|
211
|
+
if (closed)
|
|
212
|
+
throw failure;
|
|
213
|
+
const session = createLiveSession(modelId, { delegation: { type: "client" }, providerOptions: { closeTimeoutMs: options.closeTimeoutMs } }, connection, { started: true, webrtc: true, timeoutMs: options.timeoutMs });
|
|
214
|
+
await bounded(session.initialize());
|
|
215
|
+
if (closed)
|
|
216
|
+
throw failure;
|
|
217
|
+
deadline.cleanup();
|
|
218
|
+
deadline.signal.removeEventListener("abort", abortSetup);
|
|
219
|
+
options.signal?.addEventListener("abort", abortCaller, { once: true });
|
|
220
|
+
if (options.signal?.aborted) {
|
|
221
|
+
abortCaller();
|
|
222
|
+
throw failure;
|
|
223
|
+
}
|
|
224
|
+
tracks.forEach((track, index) => { track.enabled = enabled[index]; });
|
|
225
|
+
return Object.assign(session, { sessionId: answer.session.id, peerConnection: pc });
|
|
226
|
+
}
|
|
227
|
+
catch (error) {
|
|
228
|
+
failure ??= error instanceof Error ? error : new Error("WebRTC setup failed.");
|
|
229
|
+
deadline.abort(failure);
|
|
230
|
+
cleanup();
|
|
231
|
+
await release();
|
|
232
|
+
throw failure;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=live-webrtc-browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-webrtc-browser.js","sourceRoot":"","sources":["../src/live-webrtc-browser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** Experimental, secret-free response returned to the browser. */
|
|
2
|
+
export interface OpenAILiveWebRTCAnswer {
|
|
3
|
+
session: {
|
|
4
|
+
id: string;
|
|
5
|
+
};
|
|
6
|
+
transport: {
|
|
7
|
+
type: "webrtc";
|
|
8
|
+
sdp: string;
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export declare const LIVE_SDP_MAX_BYTES: number;
|
|
12
|
+
export declare function liveSdp(value: unknown): string;
|
|
13
|
+
export declare function liveSessionId(value: unknown): string;
|
|
14
|
+
export declare function liveAnswer(value: unknown): OpenAILiveWebRTCAnswer;
|
|
15
|
+
//# sourceMappingURL=live-webrtc-protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-webrtc-protocol.d.ts","sourceRoot":"","sources":["../src/live-webrtc-protocol.ts"],"names":[],"mappings":"AAEA,kEAAkE;AAClE,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IACxB,SAAS,EAAE;QAAE,IAAI,EAAE,QAAQ,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5C;AACD,eAAO,MAAM,kBAAkB,QAAY,CAAC;AAC5C,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAK9C;AACD,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAGpD;AACD,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,sBAAsB,CAKjE"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ConfigurationError } from "@zhivex-ai/core/runtime";
|
|
2
|
+
export const LIVE_SDP_MAX_BYTES = 64 * 1024;
|
|
3
|
+
export function liveSdp(value) {
|
|
4
|
+
if (typeof value !== "string" || !value.startsWith("v=0\r\n") && !value.startsWith("v=0\n") || new TextEncoder().encode(value).length > LIVE_SDP_MAX_BYTES) {
|
|
5
|
+
throw new ConfigurationError("GPT-Live requires a valid SDP of at most 64 KiB.");
|
|
6
|
+
}
|
|
7
|
+
return value;
|
|
8
|
+
}
|
|
9
|
+
export function liveSessionId(value) {
|
|
10
|
+
if (typeof value !== "string" || !value || value === "." || value === ".." || value.length > 256 || /[\s\x00-\x1f\x7f]/.test(value))
|
|
11
|
+
throw new ConfigurationError("Invalid GPT-Live session ID.");
|
|
12
|
+
return value;
|
|
13
|
+
}
|
|
14
|
+
export function liveAnswer(value) {
|
|
15
|
+
const result = value;
|
|
16
|
+
if (result?.transport?.type !== "webrtc")
|
|
17
|
+
throw new ConfigurationError("Invalid GPT-Live WebRTC answer.");
|
|
18
|
+
// Whitelist fields: never serialize the provider's session configuration or secrets.
|
|
19
|
+
return { session: { id: liveSessionId(result.session?.id) }, transport: { type: "webrtc", sdp: liveSdp(result.transport.sdp) } };
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=live-webrtc-protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-webrtc-protocol.js","sourceRoot":"","sources":["../src/live-webrtc-protocol.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAO7D,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,GAAG,IAAI,CAAC;AAC5C,MAAM,UAAU,OAAO,CAAC,KAAc;IACpC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,kBAAkB,EAAE,CAAC;QAC3J,MAAM,IAAI,kBAAkB,CAAC,kDAAkD,CAAC,CAAC;IACnF,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AACD,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG,IAAI,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,kBAAkB,CAAC,8BAA8B,CAAC,CAAC;IAClM,OAAO,KAAK,CAAC;AACf,CAAC;AACD,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,MAAM,MAAM,GAAG,KAAoD,CAAC;IACpE,IAAI,MAAM,EAAE,SAAS,EAAE,IAAI,KAAK,QAAQ;QAAE,MAAM,IAAI,kBAAkB,CAAC,iCAAiC,CAAC,CAAC;IAC1G,qFAAqF;IACrF,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,aAAa,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;AACnI,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { type RealtimeConnectionFactory, type RealtimeConnectOptions, type RealtimeSessionConfig } from "@zhivex-ai/core/provider";
|
|
2
|
+
import { type OpenAILiveWebRTCAnswer } from "./live-webrtc-protocol.js";
|
|
3
|
+
export type { OpenAILiveWebRTCAnswer } from "./live-webrtc-protocol.js";
|
|
4
|
+
export interface OpenAILiveServerOptions {
|
|
5
|
+
/** Trusted server only. No environment lookup or browser credential flow. */
|
|
6
|
+
apiKey: string;
|
|
7
|
+
fetch?: typeof fetch;
|
|
8
|
+
safetyIdentifier?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface OpenAILiveWebRTCCreateOptions extends OpenAILiveServerOptions, Pick<RealtimeConnectOptions, "signal" | "timeoutMs"> {
|
|
11
|
+
modelId?: string;
|
|
12
|
+
offerSdp: string;
|
|
13
|
+
session?: RealtimeSessionConfig;
|
|
14
|
+
/** Bind the known ID to an application creation lease before delivering the answer. */
|
|
15
|
+
onSessionCreated?: (input: {
|
|
16
|
+
sessionId: string;
|
|
17
|
+
}) => void | Promise<void>;
|
|
18
|
+
}
|
|
19
|
+
/** Experimental trusted-server SDP exchange. One request, no retries. */
|
|
20
|
+
export declare function experimentalCreateOpenAILiveWebRTCSession(options: OpenAILiveWebRTCCreateOptions): Promise<OpenAILiveWebRTCAnswer>;
|
|
21
|
+
export interface OpenAILiveAttachOptions extends OpenAILiveServerOptions, RealtimeConnectOptions {
|
|
22
|
+
/** Authorize this ID against the authenticated user's server-side session record first. */
|
|
23
|
+
sessionId: string;
|
|
24
|
+
modelId?: string;
|
|
25
|
+
session?: RealtimeSessionConfig;
|
|
26
|
+
connectionFactory?: RealtimeConnectionFactory;
|
|
27
|
+
}
|
|
28
|
+
/** Experimental sideband for runRealtimeDelegations. Does not start another paid session. */
|
|
29
|
+
export declare function experimentalAttachOpenAILiveSession(options: OpenAILiveAttachOptions): Promise<import("@zhivex-ai/core/provider").CallbackRealtimeSession & {
|
|
30
|
+
sessionId: string;
|
|
31
|
+
/** Detach only; the primary session continues billing. close() ends the shared session. */
|
|
32
|
+
disconnect: () => Promise<void>;
|
|
33
|
+
}>;
|
|
34
|
+
//# sourceMappingURL=live-webrtc-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-webrtc-server.d.ts","sourceRoot":"","sources":["../src/live-webrtc-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,yBAAyB,EAAE,KAAK,sBAAsB,EAAE,KAAK,qBAAqB,EACxF,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EAAsC,KAAK,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAC5G,YAAY,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAExE,MAAM,WAAW,uBAAuB;IACtC,6EAA6E;IAC7E,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AACD,MAAM,WAAW,6BAA8B,SAAQ,uBAAuB,EAAE,IAAI,CAAC,sBAAsB,EAAE,QAAQ,GAAG,WAAW,CAAC;IAClI,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,qBAAqB,CAAC;IAChC,uFAAuF;IACvF,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3E;AAMD,yEAAyE;AACzE,wBAAsB,yCAAyC,CAAC,OAAO,EAAE,6BAA6B,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAkCvI;AACD,MAAM,WAAW,uBAAwB,SAAQ,uBAAuB,EAAE,sBAAsB;IAC9F,2FAA2F;IAC3F,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,qBAAqB,CAAC;IAChC,iBAAiB,CAAC,EAAE,yBAAyB,CAAC;CAC/C;AACD,6FAA6F;AAC7F,wBAAsB,mCAAmC,CAAC,OAAO,EAAE,uBAAuB;;IActF,2FAA2F;;GAG9F"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { ConfigurationError, ProviderHTTPError, assertTrustedEndpoint, openWebSocketConnection, readJsonWithLimit, withTimeoutSignal } from "@zhivex-ai/core/provider";
|
|
2
|
+
import { liveAudioCallbacks } from "./live-audio.js";
|
|
3
|
+
import { createLiveSession, isOpenAILiveModel, resolveLiveWebRTCConfig } from "./live-session.js";
|
|
4
|
+
import { liveAnswer, liveSdp, liveSessionId } from "./live-webrtc-protocol.js";
|
|
5
|
+
const headers = (options) => {
|
|
6
|
+
if (typeof options.apiKey !== "string" || !options.apiKey.trim() || /[\r\n]/.test(options.apiKey))
|
|
7
|
+
throw new ConfigurationError("A server API key is required.");
|
|
8
|
+
if (options.safetyIdentifier !== undefined && (!/^[\x21-\x7e]{1,256}$/.test(options.safetyIdentifier)))
|
|
9
|
+
throw new ConfigurationError("Invalid safety identifier.");
|
|
10
|
+
return { authorization: `Bearer ${options.apiKey}`, ...(options.safetyIdentifier ? { "OpenAI-Safety-Identifier": options.safetyIdentifier } : {}) };
|
|
11
|
+
};
|
|
12
|
+
/** Experimental trusted-server SDP exchange. One request, no retries. */
|
|
13
|
+
export async function experimentalCreateOpenAILiveWebRTCSession(options) {
|
|
14
|
+
const modelId = options.modelId ?? "gpt-live-1";
|
|
15
|
+
if (!isOpenAILiveModel(modelId))
|
|
16
|
+
throw new ConfigurationError("A supported GPT-Live-1 model is required.");
|
|
17
|
+
const config = resolveLiveWebRTCConfig(options.session);
|
|
18
|
+
const requestHeaders = headers(options);
|
|
19
|
+
const body = JSON.stringify({ session: {
|
|
20
|
+
model: modelId, delegation: { type: "client" }, store: config.providerOptions?.store ?? false,
|
|
21
|
+
...(config.instructions !== undefined ? { instructions: config.instructions } : {}),
|
|
22
|
+
audio: { output: { voice: config.voice ?? "marin" } },
|
|
23
|
+
...(config.providerOptions?.input !== undefined ? { input: config.providerOptions.input } : {}),
|
|
24
|
+
// The browser may close/mute, but cannot append instructions or backend results.
|
|
25
|
+
client: { data_channel: {
|
|
26
|
+
allowed_client_events: ["session.close", "session.input_audio.mute", "session.input_audio.unmute"],
|
|
27
|
+
allowed_server_events: ["session.started", "session.closed", "session.input_transcript.delta", "session.output_transcript.delta", "session.usage.updated", "error"].map(type => ({ type }))
|
|
28
|
+
} }
|
|
29
|
+
}, transport: { type: "webrtc", sdp: liveSdp(options.offerSdp) } });
|
|
30
|
+
if (new TextEncoder().encode(body).length > 256 * 1024)
|
|
31
|
+
throw new ConfigurationError("GPT-Live session request exceeds 256 KiB.");
|
|
32
|
+
const deadline = withTimeoutSignal({ timeoutMs: options.timeoutMs ?? 15_000, abortSignal: options.signal });
|
|
33
|
+
try {
|
|
34
|
+
deadline.signal.throwIfAborted();
|
|
35
|
+
const response = await (options.fetch ?? fetch)("https://api.openai.com/v1/live/sessions", {
|
|
36
|
+
method: "POST", headers: { ...requestHeaders, "content-type": "application/json" }, body, signal: deadline.signal, redirect: "error"
|
|
37
|
+
});
|
|
38
|
+
if (!response.ok) {
|
|
39
|
+
await response.body?.cancel();
|
|
40
|
+
throw new ProviderHTTPError(`OpenAI Live session creation failed (${response.status}).`, response.status);
|
|
41
|
+
}
|
|
42
|
+
const raw = await readJsonWithLimit(response, { maxBytes: 128 * 1024, provider: "openai", endpoint: "live/sessions", abort: deadline.abort });
|
|
43
|
+
// Record a valid ID even if the remaining response is malformed or the caller aborted.
|
|
44
|
+
const sessionId = liveSessionId(raw?.session?.id);
|
|
45
|
+
await options.onSessionCreated?.({ sessionId });
|
|
46
|
+
deadline.signal.throwIfAborted();
|
|
47
|
+
return liveAnswer(raw);
|
|
48
|
+
}
|
|
49
|
+
finally {
|
|
50
|
+
deadline.cleanup();
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/** Experimental sideband for runRealtimeDelegations. Does not start another paid session. */
|
|
54
|
+
export async function experimentalAttachOpenAILiveSession(options) {
|
|
55
|
+
const modelId = options.modelId ?? "gpt-live-1";
|
|
56
|
+
if (!isOpenAILiveModel(modelId))
|
|
57
|
+
throw new ConfigurationError("A supported GPT-Live-1 model is required.");
|
|
58
|
+
const config = resolveLiveWebRTCConfig(options.session);
|
|
59
|
+
const url = assertTrustedEndpoint(`wss://api.openai.com/v1/live/sessions/${encodeURIComponent(liveSessionId(options.sessionId))}/attach`, {
|
|
60
|
+
label: "OpenAI Live sideband", protocols: ["wss"], allowedHosts: ["api.openai.com"]
|
|
61
|
+
});
|
|
62
|
+
const connection = await (options.connectionFactory ?? openWebSocketConnection)(url.toString(), headers(options), { signal: options.signal, timeoutMs: options.timeoutMs ?? 15_000, maxIncomingFrameBytes: options.maxIncomingFrameBytes, subprotocols: options.subprotocols });
|
|
63
|
+
// Attachment observes an already-running session: no session.start or started wait.
|
|
64
|
+
const reflected = { ...config, outputAudioMediaType: "audio/pcm", outputSampleRateHz: 24000 };
|
|
65
|
+
const session = createLiveSession(modelId, reflected, connection, { expectedSessionId: options.sessionId, started: true, attached: true, parseOutputAudio: liveAudioCallbacks(reflected).parseOutputAudio });
|
|
66
|
+
try {
|
|
67
|
+
await session.initialize();
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
await connection.close();
|
|
71
|
+
throw error;
|
|
72
|
+
}
|
|
73
|
+
return Object.assign(session, {
|
|
74
|
+
sessionId: options.sessionId,
|
|
75
|
+
/** Detach only; the primary session continues billing. close() ends the shared session. */
|
|
76
|
+
disconnect: () => connection.close()
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=live-webrtc-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-webrtc-server.js","sourceRoot":"","sources":["../src/live-webrtc-server.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,iBAAiB,EAE5H,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAClG,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,EAA+B,MAAM,2BAA2B,CAAC;AAgB5G,MAAM,OAAO,GAAG,CAAC,OAAgC,EAAE,EAAE;IACnD,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,kBAAkB,CAAC,+BAA+B,CAAC,CAAC;IACjK,IAAI,OAAO,CAAC,gBAAgB,KAAK,SAAS,IAAI,CAAC,CAAC,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAAE,MAAM,IAAI,kBAAkB,CAAC,4BAA4B,CAAC,CAAC;IACnK,OAAO,EAAE,aAAa,EAAE,UAAU,OAAO,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,0BAA0B,EAAE,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AACtJ,CAAC,CAAC;AACF,yEAAyE;AACzE,MAAM,CAAC,KAAK,UAAU,yCAAyC,CAAC,OAAsC;IACpG,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,YAAY,CAAC;IAChD,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC;QAAE,MAAM,IAAI,kBAAkB,CAAC,2CAA2C,CAAC,CAAC;IAC3G,MAAM,MAAM,GAAG,uBAAuB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACxD,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE;YACrC,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,eAAe,EAAE,KAAK,IAAI,KAAK;YAC7F,GAAG,CAAC,MAAM,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnF,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,OAAO,EAAE,EAAE;YACrD,GAAG,CAAC,MAAM,CAAC,eAAe,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/F,iFAAiF;YACjF,MAAM,EAAE,EAAE,YAAY,EAAE;oBACtB,qBAAqB,EAAE,CAAC,eAAe,EAAE,0BAA0B,EAAE,4BAA4B,CAAC;oBAClG,qBAAqB,EAAE,CAAC,iBAAiB,EAAE,gBAAgB,EAAE,gCAAgC,EAAE,iCAAiC,EAAE,uBAAuB,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;iBAC5L,EAAE;SACJ,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;IACpE,IAAI,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,GAAG,GAAG,IAAI;QAAE,MAAM,IAAI,kBAAkB,CAAC,2CAA2C,CAAC,CAAC;IAClI,MAAM,QAAQ,GAAG,iBAAiB,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5G,IAAI,CAAC;QACH,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,yCAAyC,EAAE;YACzF,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,GAAG,cAAc,EAAE,cAAc,EAAE,kBAAkB,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO;SACrI,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;YAC9B,MAAM,IAAI,iBAAiB,CAAC,wCAAwC,QAAQ,CAAC,MAAM,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC5G,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,iBAAiB,CAAM,QAAQ,EAAE,EAAE,QAAQ,EAAE,GAAG,GAAG,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;QACnJ,uFAAuF;QACvF,MAAM,SAAS,GAAG,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;QAClD,MAAM,OAAO,CAAC,gBAAgB,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;QAChD,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;QACjC,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;YAAS,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;IAAC,CAAC;AACnC,CAAC;AAQD,6FAA6F;AAC7F,MAAM,CAAC,KAAK,UAAU,mCAAmC,CAAC,OAAgC;IACxF,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,YAAY,CAAC;IAChD,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC;QAAE,MAAM,IAAI,kBAAkB,CAAC,2CAA2C,CAAC,CAAC;IAC3G,MAAM,MAAM,GAAG,uBAAuB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACxD,MAAM,GAAG,GAAG,qBAAqB,CAAC,yCAAyC,kBAAkB,CAAC,aAAa,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE;QACxI,KAAK,EAAE,sBAAsB,EAAE,SAAS,EAAE,CAAC,KAAK,CAAC,EAAE,YAAY,EAAE,CAAC,gBAAgB,CAAC;KACpF,CAAC,CAAC;IACH,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,iBAAiB,IAAI,uBAAuB,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,MAAM,EAAE,qBAAqB,EAAE,OAAO,CAAC,qBAAqB,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAChR,oFAAoF;IACpF,MAAM,SAAS,GAAG,EAAE,GAAG,MAAM,EAAE,oBAAoB,EAAE,WAAW,EAAE,kBAAkB,EAAE,KAAK,EAAE,CAAC;IAC9F,MAAM,OAAO,GAAG,iBAAiB,CAAC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,iBAAiB,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,gBAAgB,EAAE,kBAAkB,CAAC,SAAS,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAC7M,IAAI,CAAC;QAAC,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;IAAC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAAC,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC;QAAC,MAAM,KAAK,CAAC;IAAC,CAAC;IAC5F,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE;QAC5B,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,2FAA2F;QAC3F,UAAU,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE;KACrC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/live.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export
|
|
3
|
-
export declare const liveCapabilities: ModelCapabilities;
|
|
1
|
+
import { type RealtimeModel, type RealtimeConnectOptions, type RealtimeConnectionFactory, type RealtimeSessionConfig } from "@zhivex-ai/core/provider";
|
|
2
|
+
export { isOpenAILiveModel } from "./live-session.js";
|
|
4
3
|
/** Server WebSocket adapter. The application owns the delegated agent and its tools. */
|
|
5
4
|
export declare class OpenAILiveModel implements RealtimeModel {
|
|
6
5
|
readonly modelId: string;
|
|
@@ -10,9 +9,9 @@ export declare class OpenAILiveModel implements RealtimeModel {
|
|
|
10
9
|
private readonly realtimeURL?;
|
|
11
10
|
private readonly allowUnsafeEndpoints;
|
|
12
11
|
readonly provider = "openai";
|
|
13
|
-
readonly capabilities: ModelCapabilities;
|
|
12
|
+
readonly capabilities: import("@zhivex-ai/core/provider").ModelCapabilities;
|
|
14
13
|
constructor(modelId: string, baseURL: string, headers: (options: Record<string, unknown> | undefined) => Record<string, string>, connectionFactory: RealtimeConnectionFactory, realtimeURL?: string | undefined, allowUnsafeEndpoints?: boolean);
|
|
15
|
-
connect(config?: RealtimeSessionConfig, options?: RealtimeConnectOptions): Promise<CallbackRealtimeSession>;
|
|
14
|
+
connect(config?: RealtimeSessionConfig, options?: RealtimeConnectOptions): Promise<import("@zhivex-ai/core/provider").CallbackRealtimeSession>;
|
|
16
15
|
createBrowserToken(): Promise<never>;
|
|
17
16
|
}
|
|
18
17
|
//# sourceMappingURL=live.d.ts.map
|
package/dist/live.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"live.d.ts","sourceRoot":"","sources":["../src/live.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"live.d.ts","sourceRoot":"","sources":["../src/live.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsE,KAAK,aAAa,EAAE,KAAK,sBAAsB,EAAE,KAAK,yBAAyB,EAAE,KAAK,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAG3N,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,wFAAwF;AACxF,qBAAa,eAAgB,YAAW,aAAa;IAIjD,QAAQ,CAAC,OAAO,EAAE,MAAM;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;IAC7B,OAAO,CAAC,QAAQ,CAAC,oBAAoB;IARvC,QAAQ,CAAC,QAAQ,YAAY;IAC7B,QAAQ,CAAC,YAAY,uDAAoB;IACzC,YACW,OAAO,EAAE,MAAM,EACP,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACjF,iBAAiB,EAAE,yBAAyB,EAC5C,WAAW,CAAC,EAAE,MAAM,YAAA,EACpB,oBAAoB,UAAQ,EAC3C;IAEE,OAAO,CAAC,MAAM,GAAE,qBAA0B,EAAE,OAAO,CAAC,EAAE,sBAAsB,uEAgBjF;IAEK,kBAAkB,IAAI,OAAO,CAAC,KAAK,CAAC,CAEzC;CACF"}
|
package/dist/live.js
CHANGED
|
@@ -1,67 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
toolChoice: false, parallelToolCalls: false, vision: false, files: false,
|
|
6
|
-
audioInput: true, audioOutput: true, embeddings: false, reasoning: false, webSearch: false,
|
|
7
|
-
realtime: {
|
|
8
|
-
sessions: true, audioInput: true, audioOutput: true, imageInput: false,
|
|
9
|
-
tools: false, browserTokens: false, fullDuplex: true, clientDelegation: true
|
|
10
|
-
}
|
|
11
|
-
};
|
|
12
|
-
const allowedConfig = new Set([
|
|
13
|
-
"mode", "instructions", "voice", "delegation", "inputAudioMediaType", "outputAudioMediaType",
|
|
14
|
-
"inputSampleRateHz", "outputSampleRateHz", "channels", "autoResponse", "providerOptions"
|
|
15
|
-
]);
|
|
16
|
-
const allowedOptions = new Set(["headers", "safety_identifier", "input", "store", "closeTimeoutMs"]);
|
|
17
|
-
function resolveConfig(config) {
|
|
18
|
-
for (const [key, value] of Object.entries(config)) {
|
|
19
|
-
if (value !== undefined && !allowedConfig.has(key))
|
|
20
|
-
throw new UnsupportedFeatureError(`GPT-Live client delegation does not support session option "${key}". Configure tools and reasoning in your backend agent.`);
|
|
21
|
-
}
|
|
22
|
-
if (config.mode !== undefined && config.mode !== "conversation")
|
|
23
|
-
throw new UnsupportedFeatureError("GPT-Live supports conversation mode only.");
|
|
24
|
-
if (config.autoResponse === true)
|
|
25
|
-
throw new UnsupportedFeatureError("GPT-Live does not support manual response triggers; stream audio continuously.");
|
|
26
|
-
if (config.delegation && (config.delegation.type !== "client" || Object.keys(config.delegation).some((key) => key !== "type"))) {
|
|
27
|
-
throw new UnsupportedFeatureError("This GPT-Live adapter supports client delegation only.");
|
|
28
|
-
}
|
|
29
|
-
const provider = config.providerOptions ?? {};
|
|
30
|
-
for (const [key, value] of Object.entries(provider)) {
|
|
31
|
-
if (value !== undefined && !allowedOptions.has(key))
|
|
32
|
-
throw new UnsupportedFeatureError(`Unsupported GPT-Live provider option "${key}".`);
|
|
33
|
-
}
|
|
34
|
-
if (provider.store !== undefined && typeof provider.store !== "boolean")
|
|
35
|
-
throw new ConfigurationError("GPT-Live store must be boolean.");
|
|
36
|
-
if (provider.closeTimeoutMs !== undefined && (!Number.isSafeInteger(provider.closeTimeoutMs) || Number(provider.closeTimeoutMs) <= 0))
|
|
37
|
-
throw new ConfigurationError("GPT-Live closeTimeoutMs must be a positive safe integer.");
|
|
38
|
-
if (provider.input !== undefined) {
|
|
39
|
-
if (!Array.isArray(provider.input) || provider.input.length > 128)
|
|
40
|
-
throw new ConfigurationError("GPT-Live input must contain at most 128 text messages.");
|
|
41
|
-
for (const item of provider.input) {
|
|
42
|
-
const part = item?.content?.[0];
|
|
43
|
-
if (item?.type !== "message" || !["developer", "user", "assistant"].includes(item.role) ||
|
|
44
|
-
!Array.isArray(item.content) || item.content.length !== 1 || typeof part?.text !== "string" ||
|
|
45
|
-
!(item.role === "assistant" ? ["text", "output_text"] : ["input_text"]).includes(part.type)) {
|
|
46
|
-
throw new ConfigurationError("GPT-Live history requires developer/user input_text or assistant output_text messages.");
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
const mediaType = config.inputAudioMediaType ?? config.outputAudioMediaType ?? "audio/pcm";
|
|
51
|
-
const rate = config.inputSampleRateHz ?? config.outputSampleRateHz ?? (mediaType === "audio/pcm" ? 24000 : 8000);
|
|
52
|
-
if ((mediaType !== "audio/pcm" || ![16000, 24000].includes(rate)) &&
|
|
53
|
-
(!["audio/pcmu", "audio/pcma"].includes(mediaType) || rate !== 8000))
|
|
54
|
-
throw new ConfigurationError("GPT-Live requires mono PCM16 at 16/24 kHz or G.711 at 8 kHz.");
|
|
55
|
-
if ((config.channels !== undefined && config.channels !== 1) ||
|
|
56
|
-
(config.outputAudioMediaType !== undefined && config.outputAudioMediaType !== mediaType) ||
|
|
57
|
-
(config.outputSampleRateHz !== undefined && config.outputSampleRateHz !== rate))
|
|
58
|
-
throw new ConfigurationError("GPT-Live requires the same mono audio format for input and output.");
|
|
59
|
-
return {
|
|
60
|
-
...config, delegation: { type: "client" }, autoResponse: false,
|
|
61
|
-
inputAudioMediaType: mediaType, outputAudioMediaType: mediaType,
|
|
62
|
-
inputSampleRateHz: rate, outputSampleRateHz: rate, channels: 1
|
|
63
|
-
};
|
|
64
|
-
}
|
|
1
|
+
import { ConfigurationError, UnsupportedFeatureError, assertTrustedEndpoint } from "@zhivex-ai/core/provider";
|
|
2
|
+
import { liveCapabilities, resolveLiveConfig, createLiveSession } from "./live-session.js";
|
|
3
|
+
import { liveAudioCallbacks } from "./live-audio.js";
|
|
4
|
+
export { isOpenAILiveModel } from "./live-session.js";
|
|
65
5
|
/** Server WebSocket adapter. The application owns the delegated agent and its tools. */
|
|
66
6
|
export class OpenAILiveModel {
|
|
67
7
|
modelId;
|
|
@@ -81,7 +21,7 @@ export class OpenAILiveModel {
|
|
|
81
21
|
this.allowUnsafeEndpoints = allowUnsafeEndpoints;
|
|
82
22
|
}
|
|
83
23
|
async connect(config = {}, options) {
|
|
84
|
-
const resolved =
|
|
24
|
+
const resolved = resolveLiveConfig(config);
|
|
85
25
|
const url = new URL(this.baseURL);
|
|
86
26
|
url.protocol = url.protocol === "https:" ? "wss:" : "ws:";
|
|
87
27
|
url.pathname = `${url.pathname.replace(/\/+$/, "")}/live/sessions`;
|
|
@@ -95,91 +35,7 @@ export class OpenAILiveModel {
|
|
|
95
35
|
if (options?.timeoutMs !== undefined && (!Number.isSafeInteger(options.timeoutMs) || options.timeoutMs <= 0))
|
|
96
36
|
throw new ConfigurationError("GPT-Live timeoutMs must be a positive safe integer.");
|
|
97
37
|
const connection = await this.connectionFactory(endpoint.toString(), this.headers(config.providerOptions), options);
|
|
98
|
-
const
|
|
99
|
-
const metadata = (payload) => payload;
|
|
100
|
-
const unsupported = (feature) => { throw new UnsupportedFeatureError(`GPT-Live ${feature}; use the backend agent or appendContext() as appropriate.`); };
|
|
101
|
-
const append = (update) => {
|
|
102
|
-
if (!["instructions", "context", "commentary"].includes(update.kind) || typeof update.content !== "string" || !update.content.trim())
|
|
103
|
-
throw new ValidationError("Live context updates require a kind and non-empty string content.");
|
|
104
|
-
if (update.delegationId !== undefined && !delegations.has(update.delegationId))
|
|
105
|
-
throw new ValidationError("Unknown GPT-Live client delegation ID.");
|
|
106
|
-
// Tokenization is provider-owned (500 tokens per append); never silently truncate a result.
|
|
107
|
-
return [{ type: `session.${update.kind === "context" ? "thinking" : update.kind}.append`,
|
|
108
|
-
content: update.content, delegation_id: update.delegationId ?? null,
|
|
109
|
-
...(update.eventId !== undefined ? { event_id: update.eventId } : {}) }];
|
|
110
|
-
};
|
|
111
|
-
const parseEvent = (payload) => {
|
|
112
|
-
const type = payload.type;
|
|
113
|
-
if (type === "session.started" || type === "session.updated")
|
|
114
|
-
return [{ type: "realtime-provider-data", provider: "openai", data: metadata(payload) }];
|
|
115
|
-
if (type === "session.output_audio.delta") {
|
|
116
|
-
if (typeof payload.delta !== "string")
|
|
117
|
-
throw new ValidationError("Invalid GPT-Live audio delta.");
|
|
118
|
-
const audio = decodeBase64WithLimit(payload.delta, { maxBytes: 16 * 1024 * 1024, provider: "openai", endpoint: "live/sessions" });
|
|
119
|
-
if (resolved.outputAudioMediaType === "audio/pcm" && audio.byteLength % 2)
|
|
120
|
-
throw new ValidationError("GPT-Live PCM output must contain complete 16-bit samples.");
|
|
121
|
-
return [{ type: "realtime-audio-output", audio, mediaType: resolved.outputAudioMediaType,
|
|
122
|
-
sampleRateHz: resolved.outputSampleRateHz, channels: 1 }];
|
|
123
|
-
}
|
|
124
|
-
if (type === "session.input_transcript.delta" || type === "session.output_transcript.delta") {
|
|
125
|
-
if (typeof payload.delta !== "string")
|
|
126
|
-
throw new ValidationError("Invalid GPT-Live transcript delta.");
|
|
127
|
-
return [{ type: "realtime-transcript", role: type === "session.input_transcript.delta" ? "user" : "assistant",
|
|
128
|
-
text: payload.delta, isFinal: false,
|
|
129
|
-
...(typeof payload.start_ms === "number" ? { startMs: payload.start_ms } : {}),
|
|
130
|
-
...(typeof payload.end_ms === "number" ? { endMs: payload.end_ms } : {}), providerMetadata: metadata(payload) }];
|
|
131
|
-
}
|
|
132
|
-
if (type === "session.delegation.created") {
|
|
133
|
-
const delegation = payload.delegation;
|
|
134
|
-
if (!delegation || typeof delegation.id !== "string" || !delegation.id || delegation.target !== "client")
|
|
135
|
-
throw new ValidationError("Invalid GPT-Live client delegation event.");
|
|
136
|
-
if (!delegations.has(delegation.id) && delegations.size >= 4096)
|
|
137
|
-
throw new ValidationError("GPT-Live session delegation limit exceeded.");
|
|
138
|
-
delegations.add(delegation.id);
|
|
139
|
-
return [{ type: "realtime-delegation", delegationId: delegation.id,
|
|
140
|
-
...(typeof payload.offset_ms === "number" ? { offsetMs: payload.offset_ms } : {}), providerMetadata: metadata(payload) }];
|
|
141
|
-
}
|
|
142
|
-
if (type === "session.closed")
|
|
143
|
-
return [{ type: "realtime-end", reason: "provider-close", providerMetadata: metadata(payload) }];
|
|
144
|
-
if (type === "error") {
|
|
145
|
-
const error = payload.error;
|
|
146
|
-
return [{ type: "realtime-error", message: typeof error?.message === "string" ? error.message : "GPT-Live session error", providerMetadata: metadata(payload) }];
|
|
147
|
-
}
|
|
148
|
-
// Usage snapshots, acknowledgements and future control events remain inspectable.
|
|
149
|
-
return [{ type: "realtime-provider-data", provider: "openai", data: metadata(payload) }];
|
|
150
|
-
};
|
|
151
|
-
const session = new CallbackRealtimeSession({
|
|
152
|
-
provider: this.provider, modelId: this.modelId, capabilities: this.capabilities,
|
|
153
|
-
config: resolved, connection, initializationTimeoutMs: options?.timeoutMs ?? 15_000,
|
|
154
|
-
closeTimeoutMs: config.providerOptions?.closeTimeoutMs,
|
|
155
|
-
callbacks: {
|
|
156
|
-
parseEvent,
|
|
157
|
-
isReadyPayload: (p) => p.type === "session.started",
|
|
158
|
-
shouldReplayEvent: (event) => event.type !== "realtime-audio-output",
|
|
159
|
-
isCloseAcknowledgementPayload: (p) => p.type === "session.closed",
|
|
160
|
-
buildInitialPayloads: () => [{ type: "session.start", session: {
|
|
161
|
-
model: this.modelId, ...(resolved.instructions !== undefined ? { instructions: resolved.instructions } : {}),
|
|
162
|
-
audio: { format: { type: resolved.inputAudioMediaType, rate: resolved.inputSampleRateHz }, output: { voice: resolved.voice ?? "marin" } },
|
|
163
|
-
delegation: { type: "client" }, store: resolved.providerOptions?.store ?? false,
|
|
164
|
-
...(resolved.providerOptions?.input !== undefined ? { input: resolved.providerOptions.input } : {})
|
|
165
|
-
} }],
|
|
166
|
-
buildAudioPayloads: (frame) => {
|
|
167
|
-
if (frame.mediaType !== resolved.inputAudioMediaType || (frame.sampleRateHz !== undefined && frame.sampleRateHz !== resolved.inputSampleRateHz) || (frame.channels !== undefined && frame.channels !== 1))
|
|
168
|
-
throw new ValidationError("Audio frame does not match the GPT-Live session format; resample it before sending.");
|
|
169
|
-
const audio = encodeAudioFrame(frame);
|
|
170
|
-
const bytes = decodeBase64WithLimit(audio, { maxBytes: 16 * 1024 * 1024, provider: "openai", endpoint: "live/sessions" });
|
|
171
|
-
if (resolved.inputAudioMediaType === "audio/pcm" && bytes.byteLength % 2)
|
|
172
|
-
throw new ValidationError("GPT-Live PCM input must contain complete 16-bit samples.");
|
|
173
|
-
return [{ type: "session.input_audio.append", audio }];
|
|
174
|
-
},
|
|
175
|
-
buildTextPayloads: () => unsupported("does not accept typed user input on the voice frontend"),
|
|
176
|
-
buildToolResultPayloads: () => unsupported("does not accept Realtime tool results"),
|
|
177
|
-
buildUpdatePayloads: () => unsupported("client sessions have immutable startup configuration"),
|
|
178
|
-
buildContextPayloads: append,
|
|
179
|
-
buildInputMutePayloads: (muted) => [{ type: muted ? "session.input_audio.mute" : "session.input_audio.unmute" }],
|
|
180
|
-
buildClosePayloads: () => [{ type: "session.close" }]
|
|
181
|
-
}
|
|
182
|
-
});
|
|
38
|
+
const session = createLiveSession(this.modelId, resolved, connection, { timeoutMs: options?.timeoutMs, ...liveAudioCallbacks(resolved) });
|
|
183
39
|
try {
|
|
184
40
|
await session.initialize();
|
|
185
41
|
}
|
package/dist/live.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"live.js","sourceRoot":"","sources":["../src/live.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"live.js","sourceRoot":"","sources":["../src/live.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zhivex-ai/openai",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.16.0",
|
|
4
4
|
"description": "OpenAI adapter for Zhivex AI SDK.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -14,6 +14,14 @@
|
|
|
14
14
|
".": {
|
|
15
15
|
"types": "./dist/index.d.ts",
|
|
16
16
|
"import": "./dist/index.js"
|
|
17
|
+
},
|
|
18
|
+
"./experimental/live-browser": {
|
|
19
|
+
"types": "./dist/live-webrtc-browser.d.ts",
|
|
20
|
+
"import": "./dist/live-webrtc-browser.js"
|
|
21
|
+
},
|
|
22
|
+
"./experimental/live-server": {
|
|
23
|
+
"types": "./dist/live-webrtc-server.d.ts",
|
|
24
|
+
"import": "./dist/live-webrtc-server.js"
|
|
17
25
|
}
|
|
18
26
|
},
|
|
19
27
|
"files": [
|