@prestyj/voice 4.3.191
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/LICENSE +21 -0
- package/README.md +79 -0
- package/dist/bridges/ezboss.cjs +96 -0
- package/dist/bridges/ezboss.cjs.map +1 -0
- package/dist/bridges/ezboss.d.cts +13 -0
- package/dist/bridges/ezboss.d.ts +13 -0
- package/dist/bridges/ezboss.js +70 -0
- package/dist/bridges/ezboss.js.map +1 -0
- package/dist/bridges/ezcoder-rpc.cjs +128 -0
- package/dist/bridges/ezcoder-rpc.cjs.map +1 -0
- package/dist/bridges/ezcoder-rpc.d.cts +18 -0
- package/dist/bridges/ezcoder-rpc.d.ts +18 -0
- package/dist/bridges/ezcoder-rpc.js +101 -0
- package/dist/bridges/ezcoder-rpc.js.map +1 -0
- package/dist/chunk-VJ6MPV2Z.js +225 -0
- package/dist/chunk-VJ6MPV2Z.js.map +1 -0
- package/dist/chunk-YLNKQ7CC.js +234 -0
- package/dist/chunk-YLNKQ7CC.js.map +1 -0
- package/dist/index.cjs +357 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +90 -0
- package/dist/index.d.ts +90 -0
- package/dist/index.js +109 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/openai-codex-realtime.cjs +362 -0
- package/dist/providers/openai-codex-realtime.cjs.map +1 -0
- package/dist/providers/openai-codex-realtime.d.cts +15 -0
- package/dist/providers/openai-codex-realtime.d.ts +15 -0
- package/dist/providers/openai-codex-realtime.js +31 -0
- package/dist/providers/openai-codex-realtime.js.map +1 -0
- package/dist/providers/openai-realtime.cjs +342 -0
- package/dist/providers/openai-realtime.cjs.map +1 -0
- package/dist/providers/openai-realtime.d.cts +34 -0
- package/dist/providers/openai-realtime.d.ts +34 -0
- package/dist/providers/openai-realtime.js +12 -0
- package/dist/providers/openai-realtime.js.map +1 -0
- package/dist/types-Dc4Q3Z6X.d.cts +257 -0
- package/dist/types-Dc4Q3Z6X.d.ts +257 -0
- package/package.json +63 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import {
|
|
2
|
+
agentToolToVoiceTool,
|
|
3
|
+
createVoiceSession,
|
|
4
|
+
executeVoiceToolCall,
|
|
5
|
+
ggAiToolToRealtimeFunctionTool,
|
|
6
|
+
ggAiToolToVoiceTool,
|
|
7
|
+
normalizeVoiceProviderError,
|
|
8
|
+
voiceToolToRealtimeFunctionTool
|
|
9
|
+
} from "./chunk-YLNKQ7CC.js";
|
|
10
|
+
|
|
11
|
+
// src/providers/in-memory.ts
|
|
12
|
+
function createInMemoryVoiceProvider(options = {}) {
|
|
13
|
+
const sessions = [];
|
|
14
|
+
const now = options.now ?? (() => /* @__PURE__ */ new Date());
|
|
15
|
+
const idFactory = options.idFactory ?? (() => `voice_${sessions.length + 1}`);
|
|
16
|
+
return {
|
|
17
|
+
name: "in-memory",
|
|
18
|
+
get sessions() {
|
|
19
|
+
return sessions;
|
|
20
|
+
},
|
|
21
|
+
async connect(connectOptions) {
|
|
22
|
+
const id = idFactory();
|
|
23
|
+
const session = new InMemorySession(id, connectOptions.session, now);
|
|
24
|
+
sessions.push(session);
|
|
25
|
+
session.emit({
|
|
26
|
+
type: "session_started",
|
|
27
|
+
session: session.metadata
|
|
28
|
+
});
|
|
29
|
+
return session;
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
var InMemorySession = class {
|
|
34
|
+
id;
|
|
35
|
+
provider = "in-memory";
|
|
36
|
+
metadata;
|
|
37
|
+
#state = "connected";
|
|
38
|
+
#handlers = /* @__PURE__ */ new Set();
|
|
39
|
+
#sentAudio = [];
|
|
40
|
+
#sentText = [];
|
|
41
|
+
#sentToolResults = [];
|
|
42
|
+
constructor(id, config, now) {
|
|
43
|
+
this.id = id;
|
|
44
|
+
this.metadata = {
|
|
45
|
+
sessionId: id,
|
|
46
|
+
provider: "in-memory",
|
|
47
|
+
model: config.model,
|
|
48
|
+
createdAt: now().toISOString()
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
get state() {
|
|
52
|
+
return this.#state;
|
|
53
|
+
}
|
|
54
|
+
get sentAudio() {
|
|
55
|
+
return this.#sentAudio;
|
|
56
|
+
}
|
|
57
|
+
get sentText() {
|
|
58
|
+
return this.#sentText;
|
|
59
|
+
}
|
|
60
|
+
get sentToolResults() {
|
|
61
|
+
return this.#sentToolResults;
|
|
62
|
+
}
|
|
63
|
+
onEvent(handler) {
|
|
64
|
+
this.#handlers.add(handler);
|
|
65
|
+
return () => {
|
|
66
|
+
this.#handlers.delete(handler);
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
async sendAudio(chunk) {
|
|
70
|
+
this.#sentAudio.push(chunk);
|
|
71
|
+
}
|
|
72
|
+
async sendText(text) {
|
|
73
|
+
this.#sentText.push(text);
|
|
74
|
+
this.emit({ type: "input_transcript_done", text });
|
|
75
|
+
}
|
|
76
|
+
async sendToolResult(result) {
|
|
77
|
+
this.#sentToolResults.push(result);
|
|
78
|
+
this.emit({ type: "tool_result_sent", result });
|
|
79
|
+
}
|
|
80
|
+
async updateConfig(_config) {
|
|
81
|
+
}
|
|
82
|
+
async close(reason) {
|
|
83
|
+
if (this.#state === "closed") {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
this.#state = "closed";
|
|
87
|
+
this.emit({ type: "closed", reason });
|
|
88
|
+
}
|
|
89
|
+
emit(event) {
|
|
90
|
+
const handlers = [...this.#handlers];
|
|
91
|
+
for (const handler of handlers) {
|
|
92
|
+
handler(event);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
triggerToolCall(call) {
|
|
96
|
+
this.emit({ type: "tool_call", call });
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
export {
|
|
100
|
+
agentToolToVoiceTool,
|
|
101
|
+
createInMemoryVoiceProvider,
|
|
102
|
+
createVoiceSession,
|
|
103
|
+
executeVoiceToolCall,
|
|
104
|
+
ggAiToolToRealtimeFunctionTool,
|
|
105
|
+
ggAiToolToVoiceTool,
|
|
106
|
+
normalizeVoiceProviderError,
|
|
107
|
+
voiceToolToRealtimeFunctionTool
|
|
108
|
+
};
|
|
109
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/providers/in-memory.ts"],"sourcesContent":["import type {\n AudioInputChunk,\n VoiceEvent,\n VoiceEventHandler,\n VoiceProvider,\n VoiceProviderConnectOptions,\n VoiceSession,\n VoiceSessionConfig,\n VoiceToolCall,\n VoiceToolResult,\n} from \"../types.js\";\n\nexport interface InMemoryVoiceProviderOptions {\n readonly now?: () => Date;\n readonly idFactory?: () => string;\n}\n\nexport interface InMemoryVoiceProvider extends Omit<VoiceProvider, \"connect\"> {\n readonly sessions: readonly InMemoryVoiceSession[];\n connect(options: VoiceProviderConnectOptions): Promise<InMemoryVoiceSession>;\n}\n\nexport interface InMemoryVoiceSession extends VoiceSession {\n emit(event: VoiceEvent): void;\n readonly sentAudio: readonly AudioInputChunk[];\n readonly sentText: readonly string[];\n readonly sentToolResults: readonly VoiceToolResult[];\n triggerToolCall(call: VoiceToolCall): void;\n}\n\nexport function createInMemoryVoiceProvider(\n options: InMemoryVoiceProviderOptions = {},\n): InMemoryVoiceProvider {\n const sessions: InMemorySession[] = [];\n const now = options.now ?? (() => new Date());\n const idFactory = options.idFactory ?? (() => `voice_${sessions.length + 1}`);\n\n return {\n name: \"in-memory\",\n get sessions() {\n return sessions;\n },\n async connect(connectOptions: VoiceProviderConnectOptions): Promise<InMemoryVoiceSession> {\n const id = idFactory();\n const session = new InMemorySession(id, connectOptions.session, now);\n sessions.push(session);\n session.emit({\n type: \"session_started\",\n session: session.metadata,\n });\n return session;\n },\n };\n}\n\nclass InMemorySession implements InMemoryVoiceSession {\n readonly id: string;\n readonly provider = \"in-memory\";\n readonly metadata;\n #state: VoiceSession[\"state\"] = \"connected\";\n #handlers = new Set<VoiceEventHandler>();\n #sentAudio: AudioInputChunk[] = [];\n #sentText: string[] = [];\n #sentToolResults: VoiceToolResult[] = [];\n\n constructor(id: string, config: VoiceSessionConfig, now: () => Date) {\n this.id = id;\n this.metadata = {\n sessionId: id,\n provider: \"in-memory\",\n model: config.model,\n createdAt: now().toISOString(),\n };\n }\n\n get state(): VoiceSession[\"state\"] {\n return this.#state;\n }\n\n get sentAudio(): readonly AudioInputChunk[] {\n return this.#sentAudio;\n }\n\n get sentText(): readonly string[] {\n return this.#sentText;\n }\n\n get sentToolResults(): readonly VoiceToolResult[] {\n return this.#sentToolResults;\n }\n\n onEvent(handler: VoiceEventHandler): () => void {\n this.#handlers.add(handler);\n return () => {\n this.#handlers.delete(handler);\n };\n }\n\n async sendAudio(chunk: AudioInputChunk): Promise<void> {\n this.#sentAudio.push(chunk);\n }\n\n async sendText(text: string): Promise<void> {\n this.#sentText.push(text);\n this.emit({ type: \"input_transcript_done\", text });\n }\n\n async sendToolResult(result: VoiceToolResult): Promise<void> {\n this.#sentToolResults.push(result);\n this.emit({ type: \"tool_result_sent\", result });\n }\n\n async updateConfig(_config: Partial<VoiceSessionConfig>): Promise<void> {}\n\n async close(reason?: string): Promise<void> {\n if (this.#state === \"closed\") {\n return;\n }\n this.#state = \"closed\";\n this.emit({ type: \"closed\", reason });\n }\n\n emit(event: VoiceEvent): void {\n const handlers = [...this.#handlers];\n for (const handler of handlers) {\n handler(event);\n }\n }\n\n triggerToolCall(call: VoiceToolCall): void {\n this.emit({ type: \"tool_call\", call });\n }\n}\n"],"mappings":";;;;;;;;;;;AA8BO,SAAS,4BACd,UAAwC,CAAC,GAClB;AACvB,QAAM,WAA8B,CAAC;AACrC,QAAM,MAAM,QAAQ,QAAQ,MAAM,oBAAI,KAAK;AAC3C,QAAM,YAAY,QAAQ,cAAc,MAAM,SAAS,SAAS,SAAS,CAAC;AAE1E,SAAO;AAAA,IACL,MAAM;AAAA,IACN,IAAI,WAAW;AACb,aAAO;AAAA,IACT;AAAA,IACA,MAAM,QAAQ,gBAA4E;AACxF,YAAM,KAAK,UAAU;AACrB,YAAM,UAAU,IAAI,gBAAgB,IAAI,eAAe,SAAS,GAAG;AACnE,eAAS,KAAK,OAAO;AACrB,cAAQ,KAAK;AAAA,QACX,MAAM;AAAA,QACN,SAAS,QAAQ;AAAA,MACnB,CAAC;AACD,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,IAAM,kBAAN,MAAsD;AAAA,EAC3C;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACT,SAAgC;AAAA,EAChC,YAAY,oBAAI,IAAuB;AAAA,EACvC,aAAgC,CAAC;AAAA,EACjC,YAAsB,CAAC;AAAA,EACvB,mBAAsC,CAAC;AAAA,EAEvC,YAAY,IAAY,QAA4B,KAAiB;AACnE,SAAK,KAAK;AACV,SAAK,WAAW;AAAA,MACd,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO,OAAO;AAAA,MACd,WAAW,IAAI,EAAE,YAAY;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,IAAI,QAA+B;AACjC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,YAAwC;AAC1C,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,WAA8B;AAChC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,kBAA8C;AAChD,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,QAAQ,SAAwC;AAC9C,SAAK,UAAU,IAAI,OAAO;AAC1B,WAAO,MAAM;AACX,WAAK,UAAU,OAAO,OAAO;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,OAAuC;AACrD,SAAK,WAAW,KAAK,KAAK;AAAA,EAC5B;AAAA,EAEA,MAAM,SAAS,MAA6B;AAC1C,SAAK,UAAU,KAAK,IAAI;AACxB,SAAK,KAAK,EAAE,MAAM,yBAAyB,KAAK,CAAC;AAAA,EACnD;AAAA,EAEA,MAAM,eAAe,QAAwC;AAC3D,SAAK,iBAAiB,KAAK,MAAM;AACjC,SAAK,KAAK,EAAE,MAAM,oBAAoB,OAAO,CAAC;AAAA,EAChD;AAAA,EAEA,MAAM,aAAa,SAAqD;AAAA,EAAC;AAAA,EAEzE,MAAM,MAAM,QAAgC;AAC1C,QAAI,KAAK,WAAW,UAAU;AAC5B;AAAA,IACF;AACA,SAAK,SAAS;AACd,SAAK,KAAK,EAAE,MAAM,UAAU,OAAO,CAAC;AAAA,EACtC;AAAA,EAEA,KAAK,OAAyB;AAC5B,UAAM,WAAW,CAAC,GAAG,KAAK,SAAS;AACnC,eAAW,WAAW,UAAU;AAC9B,cAAQ,KAAK;AAAA,IACf;AAAA,EACF;AAAA,EAEA,gBAAgB,MAA2B;AACzC,SAAK,KAAK,EAAE,MAAM,aAAa,KAAK,CAAC;AAAA,EACvC;AACF;","names":[]}
|
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/providers/openai-codex-realtime.ts
|
|
21
|
+
var openai_codex_realtime_exports = {};
|
|
22
|
+
__export(openai_codex_realtime_exports, {
|
|
23
|
+
createExperimentalCodexRealtimeProvider: () => createExperimentalCodexRealtimeProvider,
|
|
24
|
+
toExperimentalCodexRealtimeCallRequest: () => toExperimentalCodexRealtimeCallRequest,
|
|
25
|
+
toExperimentalCodexSessionConfig: () => toExperimentalCodexSessionConfig
|
|
26
|
+
});
|
|
27
|
+
module.exports = __toCommonJS(openai_codex_realtime_exports);
|
|
28
|
+
|
|
29
|
+
// src/session.ts
|
|
30
|
+
function createVoiceSession(options) {
|
|
31
|
+
return new VoiceSessionController(options);
|
|
32
|
+
}
|
|
33
|
+
function normalizeVoiceProviderError(error) {
|
|
34
|
+
if (error instanceof Error) {
|
|
35
|
+
return error;
|
|
36
|
+
}
|
|
37
|
+
if (typeof error === "string") {
|
|
38
|
+
return new Error(error);
|
|
39
|
+
}
|
|
40
|
+
return new Error("Voice provider error", { cause: error });
|
|
41
|
+
}
|
|
42
|
+
var VoiceSessionController = class {
|
|
43
|
+
id;
|
|
44
|
+
provider;
|
|
45
|
+
metadata;
|
|
46
|
+
#state = "connected";
|
|
47
|
+
#handlers = /* @__PURE__ */ new Set();
|
|
48
|
+
#unsubscribeTransport;
|
|
49
|
+
#options;
|
|
50
|
+
constructor(options) {
|
|
51
|
+
this.id = options.id;
|
|
52
|
+
this.provider = options.provider;
|
|
53
|
+
this.metadata = options.metadata ?? { sessionId: options.id, provider: options.provider };
|
|
54
|
+
this.#options = options;
|
|
55
|
+
this.#unsubscribeTransport = options.transport?.onEvent((event) => {
|
|
56
|
+
this.#handleTransportEvent(event);
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
get state() {
|
|
60
|
+
return this.#state;
|
|
61
|
+
}
|
|
62
|
+
onEvent(handler) {
|
|
63
|
+
this.#handlers.add(handler);
|
|
64
|
+
return () => {
|
|
65
|
+
this.#handlers.delete(handler);
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
async sendAudio(chunk, signal) {
|
|
69
|
+
await this.#options.onSendAudio?.(chunk, signal);
|
|
70
|
+
await this.#options.transport?.send({ type: "audio", chunk }, signal);
|
|
71
|
+
}
|
|
72
|
+
async sendText(text, signal) {
|
|
73
|
+
await this.#options.onSendText?.(text, signal);
|
|
74
|
+
await this.#options.transport?.send({ type: "text", text }, signal);
|
|
75
|
+
}
|
|
76
|
+
async sendToolResult(result, signal) {
|
|
77
|
+
await this.#options.onSendToolResult?.(result, signal);
|
|
78
|
+
await this.#options.transport?.send({ type: "tool_result", result }, signal);
|
|
79
|
+
this.#emit({ type: "tool_result_sent", result });
|
|
80
|
+
}
|
|
81
|
+
async updateConfig(config, signal) {
|
|
82
|
+
await this.#options.onUpdateConfig?.(config, signal);
|
|
83
|
+
await this.#options.transport?.send({ type: "config", config }, signal);
|
|
84
|
+
}
|
|
85
|
+
async close(reason) {
|
|
86
|
+
if (this.#state === "closed" || this.#state === "closing") {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
this.#state = "closing";
|
|
90
|
+
await this.#options.onClose?.(reason);
|
|
91
|
+
await this.#options.transport?.close(reason);
|
|
92
|
+
this.#unsubscribeTransport?.();
|
|
93
|
+
this.#state = "closed";
|
|
94
|
+
this.#emit({ type: "closed", reason });
|
|
95
|
+
}
|
|
96
|
+
#handleTransportEvent(event) {
|
|
97
|
+
if (event.type === "raw") {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
if (event.type === "closed") {
|
|
101
|
+
this.#state = "closed";
|
|
102
|
+
}
|
|
103
|
+
this.#emit(event);
|
|
104
|
+
}
|
|
105
|
+
#emit(event) {
|
|
106
|
+
const handlers = [...this.#handlers];
|
|
107
|
+
for (const handler of handlers) {
|
|
108
|
+
handler(event);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
// src/tools.ts
|
|
114
|
+
var import_zod = require("zod");
|
|
115
|
+
function voiceToolToRealtimeFunctionTool(tool) {
|
|
116
|
+
return {
|
|
117
|
+
type: "function",
|
|
118
|
+
name: tool.name,
|
|
119
|
+
description: tool.description,
|
|
120
|
+
parameters: tool.parameters
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// src/providers/openai-realtime.ts
|
|
125
|
+
function createOpenAIRealtimeProvider(options = {}) {
|
|
126
|
+
return {
|
|
127
|
+
name: options.providerName ?? "openai-realtime",
|
|
128
|
+
async connect(connectOptions) {
|
|
129
|
+
if (!connectOptions.transport) {
|
|
130
|
+
throw new Error("OpenAI Realtime provider requires an injected VoiceTransport");
|
|
131
|
+
}
|
|
132
|
+
const sessionConfig = toOpenAISessionConfig(connectOptions.session);
|
|
133
|
+
await connectOptions.transport.connect(connectOptions);
|
|
134
|
+
return createVoiceSession({
|
|
135
|
+
id: createSessionId(connectOptions.session),
|
|
136
|
+
provider: options.providerName ?? "openai-realtime",
|
|
137
|
+
transport: createNormalizingTransport(connectOptions.transport),
|
|
138
|
+
metadata: createMetadata(connectOptions.session),
|
|
139
|
+
onSendToolResult: async (result, signal) => {
|
|
140
|
+
await connectOptions.transport?.send(
|
|
141
|
+
{ type: "tool_result", result: toOpenAIToolResult(result) },
|
|
142
|
+
signal
|
|
143
|
+
);
|
|
144
|
+
},
|
|
145
|
+
onUpdateConfig: async (config, signal) => {
|
|
146
|
+
await connectOptions.transport?.send(
|
|
147
|
+
{
|
|
148
|
+
type: "config",
|
|
149
|
+
config: { ...config, session: sessionConfig }
|
|
150
|
+
},
|
|
151
|
+
signal
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
function toOpenAISessionConfig(config) {
|
|
159
|
+
const audio = {};
|
|
160
|
+
if (config.voice) {
|
|
161
|
+
audio.output = { voice: config.voice };
|
|
162
|
+
}
|
|
163
|
+
if (config.inputAudioFormat) {
|
|
164
|
+
audio.input = { format: config.inputAudioFormat };
|
|
165
|
+
}
|
|
166
|
+
if (config.outputAudioFormat) {
|
|
167
|
+
audio.output = {
|
|
168
|
+
...audio.output,
|
|
169
|
+
format: config.outputAudioFormat
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
if (config.turnDetection !== void 0) {
|
|
173
|
+
audio.input = {
|
|
174
|
+
...audio.input,
|
|
175
|
+
turn_detection: config.turnDetection
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
return {
|
|
179
|
+
type: "realtime",
|
|
180
|
+
model: config.model,
|
|
181
|
+
...config.instructions ? { instructions: config.instructions } : {},
|
|
182
|
+
...Object.keys(audio).length > 0 ? { audio } : {},
|
|
183
|
+
...config.tools && config.tools.length > 0 ? { tools: config.tools.map((tool) => voiceToolToRealtimeFunctionTool(tool)) } : {},
|
|
184
|
+
...config.metadata ? { metadata: config.metadata } : {}
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
function normalizeOpenAIRealtimeEvent(event) {
|
|
188
|
+
if (!isJsonObject(event)) {
|
|
189
|
+
return null;
|
|
190
|
+
}
|
|
191
|
+
const type = typeof event.type === "string" ? event.type : "";
|
|
192
|
+
switch (type) {
|
|
193
|
+
case "session.created":
|
|
194
|
+
case "session.updated":
|
|
195
|
+
return {
|
|
196
|
+
type: "session_started",
|
|
197
|
+
session: normalizeSessionMetadata(event.session)
|
|
198
|
+
};
|
|
199
|
+
case "conversation.item.input_audio_transcription.delta":
|
|
200
|
+
return {
|
|
201
|
+
type: "input_transcript_delta",
|
|
202
|
+
delta: stringValue(event.delta),
|
|
203
|
+
itemId: stringOrUndefined(event.item_id)
|
|
204
|
+
};
|
|
205
|
+
case "conversation.item.input_audio_transcription.completed":
|
|
206
|
+
return {
|
|
207
|
+
type: "input_transcript_done",
|
|
208
|
+
text: stringValue(event.transcript),
|
|
209
|
+
itemId: stringOrUndefined(event.item_id)
|
|
210
|
+
};
|
|
211
|
+
case "response.output_audio_transcript.delta":
|
|
212
|
+
return {
|
|
213
|
+
type: "output_text_delta",
|
|
214
|
+
delta: stringValue(event.delta),
|
|
215
|
+
itemId: stringOrUndefined(event.item_id)
|
|
216
|
+
};
|
|
217
|
+
case "response.output_audio_transcript.done":
|
|
218
|
+
return {
|
|
219
|
+
type: "output_text_done",
|
|
220
|
+
text: stringValue(event.transcript),
|
|
221
|
+
itemId: stringOrUndefined(event.item_id)
|
|
222
|
+
};
|
|
223
|
+
case "response.output_text.delta":
|
|
224
|
+
case "response.text.delta":
|
|
225
|
+
return {
|
|
226
|
+
type: "output_text_delta",
|
|
227
|
+
delta: stringValue(event.delta),
|
|
228
|
+
itemId: stringOrUndefined(event.item_id)
|
|
229
|
+
};
|
|
230
|
+
case "response.output_text.done":
|
|
231
|
+
case "response.text.done":
|
|
232
|
+
return {
|
|
233
|
+
type: "output_text_done",
|
|
234
|
+
text: stringValue(event.text),
|
|
235
|
+
itemId: stringOrUndefined(event.item_id)
|
|
236
|
+
};
|
|
237
|
+
case "response.output_audio.delta":
|
|
238
|
+
case "response.audio.delta":
|
|
239
|
+
return {
|
|
240
|
+
type: "output_audio_delta",
|
|
241
|
+
chunk: { data: stringValue(event.delta), format: "base64" },
|
|
242
|
+
itemId: stringOrUndefined(event.item_id)
|
|
243
|
+
};
|
|
244
|
+
case "response.output_audio.done":
|
|
245
|
+
case "response.audio.done":
|
|
246
|
+
return { type: "output_audio_done", itemId: stringOrUndefined(event.item_id) };
|
|
247
|
+
case "response.function_call_arguments.done":
|
|
248
|
+
return { type: "tool_call", call: normalizeToolCall(event) };
|
|
249
|
+
case "error":
|
|
250
|
+
return {
|
|
251
|
+
type: "error",
|
|
252
|
+
error: normalizeVoiceProviderError(event.error ?? event),
|
|
253
|
+
recoverable: true
|
|
254
|
+
};
|
|
255
|
+
default:
|
|
256
|
+
return null;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
function createNormalizingTransport(transport) {
|
|
260
|
+
return {
|
|
261
|
+
kind: transport.kind,
|
|
262
|
+
connect: transport.connect.bind(transport),
|
|
263
|
+
send: transport.send.bind(transport),
|
|
264
|
+
close: transport.close.bind(transport),
|
|
265
|
+
onEvent(handler) {
|
|
266
|
+
return transport.onEvent((event) => {
|
|
267
|
+
handler(normalizeTransportEvent(event));
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
function normalizeTransportEvent(event) {
|
|
273
|
+
if (event.type !== "raw") {
|
|
274
|
+
return event;
|
|
275
|
+
}
|
|
276
|
+
const normalized = normalizeOpenAIRealtimeEvent(event.data);
|
|
277
|
+
return normalized ?? event;
|
|
278
|
+
}
|
|
279
|
+
function normalizeToolCall(event) {
|
|
280
|
+
const args = parseJsonObject(event.arguments);
|
|
281
|
+
return {
|
|
282
|
+
id: stringValue(event.call_id ?? event.item_id ?? event.event_id),
|
|
283
|
+
name: stringValue(event.name),
|
|
284
|
+
args,
|
|
285
|
+
providerCallId: stringOrUndefined(event.call_id),
|
|
286
|
+
raw: event
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
function toOpenAIToolResult(result) {
|
|
290
|
+
return result;
|
|
291
|
+
}
|
|
292
|
+
function createMetadata(config) {
|
|
293
|
+
return {
|
|
294
|
+
provider: "openai-realtime",
|
|
295
|
+
model: config.model,
|
|
296
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
function createSessionId(config) {
|
|
300
|
+
const model = config.model.replace(/[^a-zA-Z0-9_-]/g, "_");
|
|
301
|
+
return `openai_${model}_${Date.now()}`;
|
|
302
|
+
}
|
|
303
|
+
function normalizeSessionMetadata(value) {
|
|
304
|
+
if (!isJsonObject(value)) {
|
|
305
|
+
return { provider: "openai-realtime" };
|
|
306
|
+
}
|
|
307
|
+
return {
|
|
308
|
+
sessionId: stringOrUndefined(value.id),
|
|
309
|
+
provider: "openai-realtime",
|
|
310
|
+
model: stringOrUndefined(value.model)
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
function parseJsonObject(value) {
|
|
314
|
+
if (isJsonObject(value)) {
|
|
315
|
+
return value;
|
|
316
|
+
}
|
|
317
|
+
if (typeof value !== "string") {
|
|
318
|
+
return {};
|
|
319
|
+
}
|
|
320
|
+
try {
|
|
321
|
+
const parsed = JSON.parse(value);
|
|
322
|
+
return isJsonObject(parsed) ? parsed : {};
|
|
323
|
+
} catch {
|
|
324
|
+
return {};
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
function stringValue(value) {
|
|
328
|
+
return typeof value === "string" ? value : "";
|
|
329
|
+
}
|
|
330
|
+
function stringOrUndefined(value) {
|
|
331
|
+
return typeof value === "string" ? value : void 0;
|
|
332
|
+
}
|
|
333
|
+
function isJsonObject(value) {
|
|
334
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
// src/providers/openai-codex-realtime.ts
|
|
338
|
+
function createExperimentalCodexRealtimeProvider(options = {}) {
|
|
339
|
+
return createOpenAIRealtimeProvider({
|
|
340
|
+
...options,
|
|
341
|
+
baseUrl: options.baseUrl ?? "https://chatgpt.com/backend-api/codex",
|
|
342
|
+
providerName: "openai-codex-realtime-experimental"
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
function toExperimentalCodexRealtimeCallRequest(request) {
|
|
346
|
+
return {
|
|
347
|
+
sdp: request.sdp,
|
|
348
|
+
session: request.session
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
function toExperimentalCodexSessionConfig(config) {
|
|
352
|
+
const session = toOpenAISessionConfig(config);
|
|
353
|
+
const { type: _type, ...rest } = session;
|
|
354
|
+
return rest;
|
|
355
|
+
}
|
|
356
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
357
|
+
0 && (module.exports = {
|
|
358
|
+
createExperimentalCodexRealtimeProvider,
|
|
359
|
+
toExperimentalCodexRealtimeCallRequest,
|
|
360
|
+
toExperimentalCodexSessionConfig
|
|
361
|
+
});
|
|
362
|
+
//# sourceMappingURL=openai-codex-realtime.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/providers/openai-codex-realtime.ts","../../src/session.ts","../../src/tools.ts","../../src/providers/openai-realtime.ts"],"sourcesContent":["import { createOpenAIRealtimeProvider, toOpenAISessionConfig } from \"./openai-realtime.js\";\nimport type {\n OpenAIRealtimeCallRequest,\n OpenAIRealtimeProviderOptions,\n OpenAIRealtimeSessionConfig,\n} from \"./openai-realtime.js\";\nimport type { JsonObject, VoiceProvider, VoiceSessionConfig } from \"../types.js\";\n\nexport interface ExperimentalCodexRealtimeProviderOptions extends OpenAIRealtimeProviderOptions {\n readonly baseUrl?: string;\n}\n\nexport interface ExperimentalCodexRealtimeCallRequest {\n readonly sdp: string;\n readonly session: OpenAIRealtimeSessionConfig;\n}\n\nexport function createExperimentalCodexRealtimeProvider(\n options: ExperimentalCodexRealtimeProviderOptions = {},\n): VoiceProvider {\n return createOpenAIRealtimeProvider({\n ...options,\n baseUrl: options.baseUrl ?? \"https://chatgpt.com/backend-api/codex\",\n providerName: \"openai-codex-realtime-experimental\",\n });\n}\n\nexport function toExperimentalCodexRealtimeCallRequest(\n request: OpenAIRealtimeCallRequest,\n): ExperimentalCodexRealtimeCallRequest {\n return {\n sdp: request.sdp,\n session: request.session,\n };\n}\n\nexport function toExperimentalCodexSessionConfig(config: VoiceSessionConfig): JsonObject {\n const session = toOpenAISessionConfig(config);\n const { type: _type, ...rest } = session;\n return rest;\n}\n","import type {\n AudioInputChunk,\n JsonObject,\n VoiceConnectionState,\n VoiceEvent,\n VoiceEventHandler,\n VoiceSession,\n VoiceSessionConfig,\n VoiceSessionMetadata,\n VoiceToolResult,\n VoiceTransport,\n VoiceTransportEvent,\n} from \"./types.js\";\n\nexport interface VoiceSessionControllerOptions {\n readonly id: string;\n readonly provider: string;\n readonly transport?: VoiceTransport;\n readonly metadata?: VoiceSessionMetadata;\n readonly onSendToolResult?: (result: VoiceToolResult, signal?: AbortSignal) => Promise<void>;\n readonly onSendAudio?: (chunk: AudioInputChunk, signal?: AbortSignal) => Promise<void>;\n readonly onSendText?: (text: string, signal?: AbortSignal) => Promise<void>;\n readonly onUpdateConfig?: (\n config: Partial<VoiceSessionConfig>,\n signal?: AbortSignal,\n ) => Promise<void>;\n readonly onClose?: (reason?: string) => Promise<void>;\n}\n\nexport function createVoiceSession(options: VoiceSessionControllerOptions): VoiceSession {\n return new VoiceSessionController(options);\n}\n\nexport function normalizeVoiceProviderError(error: unknown): Error {\n if (error instanceof Error) {\n return error;\n }\n if (typeof error === \"string\") {\n return new Error(error);\n }\n return new Error(\"Voice provider error\", { cause: error });\n}\n\nclass VoiceSessionController implements VoiceSession {\n readonly id: string;\n readonly provider: string;\n readonly metadata: VoiceSessionMetadata;\n #state: VoiceConnectionState = \"connected\";\n #handlers = new Set<VoiceEventHandler>();\n #unsubscribeTransport?: () => void;\n #options: VoiceSessionControllerOptions;\n\n constructor(options: VoiceSessionControllerOptions) {\n this.id = options.id;\n this.provider = options.provider;\n this.metadata = options.metadata ?? { sessionId: options.id, provider: options.provider };\n this.#options = options;\n this.#unsubscribeTransport = options.transport?.onEvent((event) => {\n this.#handleTransportEvent(event);\n });\n }\n\n get state(): VoiceConnectionState {\n return this.#state;\n }\n\n onEvent(handler: VoiceEventHandler): () => void {\n this.#handlers.add(handler);\n return () => {\n this.#handlers.delete(handler);\n };\n }\n\n async sendAudio(chunk: AudioInputChunk, signal?: AbortSignal): Promise<void> {\n await this.#options.onSendAudio?.(chunk, signal);\n await this.#options.transport?.send({ type: \"audio\", chunk }, signal);\n }\n\n async sendText(text: string, signal?: AbortSignal): Promise<void> {\n await this.#options.onSendText?.(text, signal);\n await this.#options.transport?.send({ type: \"text\", text }, signal);\n }\n\n async sendToolResult(result: VoiceToolResult, signal?: AbortSignal): Promise<void> {\n await this.#options.onSendToolResult?.(result, signal);\n await this.#options.transport?.send({ type: \"tool_result\", result }, signal);\n this.#emit({ type: \"tool_result_sent\", result });\n }\n\n async updateConfig(config: Partial<VoiceSessionConfig>, signal?: AbortSignal): Promise<void> {\n await this.#options.onUpdateConfig?.(config, signal);\n await this.#options.transport?.send({ type: \"config\", config }, signal);\n }\n\n async close(reason?: string): Promise<void> {\n if (this.#state === \"closed\" || this.#state === \"closing\") {\n return;\n }\n this.#state = \"closing\";\n await this.#options.onClose?.(reason);\n await this.#options.transport?.close(reason);\n this.#unsubscribeTransport?.();\n this.#state = \"closed\";\n this.#emit({ type: \"closed\", reason });\n }\n\n #handleTransportEvent(event: VoiceTransportEvent): void {\n if (event.type === \"raw\") {\n return;\n }\n if (event.type === \"closed\") {\n this.#state = \"closed\";\n }\n this.#emit(event);\n }\n\n #emit(event: VoiceEvent): void {\n const handlers = [...this.#handlers];\n for (const handler of handlers) {\n handler(event);\n }\n }\n}\n\nexport function isJsonObject(value: unknown): value is JsonObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import type { AgentTool, ToolContext, ToolExecuteResult } from \"@prestyj/agent\";\nimport type { Tool } from \"@prestyj/ai\";\nimport { z } from \"zod\";\nimport type {\n JsonObject,\n RealtimeFunctionToolDefinition,\n ToolConfirmationDecision,\n VoiceTool,\n VoiceToolCall,\n VoiceToolContext,\n VoiceToolExecutionError,\n VoiceToolExecutionResult,\n VoiceToolResult,\n} from \"./types.js\";\n\ntype ZodParseResult = { success: true; data: unknown } | { success: false; error: z.ZodError };\n\nexport type VoiceToolSource = VoiceTool | AgentTool | Tool;\n\nexport interface ExecuteVoiceToolCallOptions {\n readonly tools: readonly VoiceTool[];\n readonly call: VoiceToolCall;\n readonly signal?: AbortSignal;\n readonly confirmation?: VoiceToolContext[\"confirmation\"];\n readonly onUpdate?: VoiceToolContext[\"onUpdate\"];\n}\n\nexport function ggAiToolToRealtimeFunctionTool(tool: Tool): RealtimeFunctionToolDefinition {\n return {\n type: \"function\",\n name: tool.name,\n description: tool.description,\n parameters: tool.rawInputSchema ?? zodToJsonSchemaObject(tool.parameters),\n };\n}\n\nexport function voiceToolToRealtimeFunctionTool(tool: VoiceTool): RealtimeFunctionToolDefinition {\n return {\n type: \"function\",\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n };\n}\n\nexport function ggAiToolToVoiceTool(tool: Tool): VoiceTool {\n return {\n name: tool.name,\n description: tool.description,\n parameters: tool.rawInputSchema ?? zodToJsonSchemaObject(tool.parameters),\n };\n}\n\nexport function agentToolToVoiceTool<T extends z.ZodType>(tool: AgentTool<T>): VoiceTool {\n return {\n name: tool.name,\n description: tool.description,\n parameters: tool.rawInputSchema ?? zodToJsonSchemaObject(tool.parameters),\n async execute(args, context): Promise<VoiceToolExecutionResult> {\n const parsed = tool.parameters.safeParse(args) as ZodParseResult;\n if (!parsed.success) {\n return {\n error: \"Invalid tool arguments\",\n issues: parsed.error.issues,\n };\n }\n\n const agentContext: ToolContext = {\n signal: context.signal,\n toolCallId: context.toolCallId,\n onUpdate: context.onUpdate,\n };\n const result = await tool.execute(parsed.data as z.infer<T>, agentContext);\n return normalizeAgentToolResult(result);\n },\n };\n}\n\nexport async function executeVoiceToolCall(\n options: ExecuteVoiceToolCallOptions,\n): Promise<VoiceToolResult> {\n const tool = options.tools.find((candidate) => candidate.name === options.call.name);\n if (!tool) {\n return createErrorResult(options.call, {\n type: \"tool_not_found\",\n message: `Tool not found: ${options.call.name}`,\n });\n }\n\n const confirmation = await resolveConfirmation(tool, options.call, options.confirmation);\n if (!confirmation.approved) {\n return createErrorResult(options.call, {\n type: \"tool_confirmation_denied\",\n message: confirmation.reason,\n });\n }\n\n if (!tool.execute) {\n return createErrorResult(options.call, {\n type: \"tool_execution_failed\",\n message: `Tool has no executor: ${tool.name}`,\n });\n }\n\n try {\n const abortController = new AbortController();\n const signal = options.signal ?? abortController.signal;\n const content = await tool.execute(options.call.args, {\n signal,\n toolCallId: options.call.id,\n confirmation: options.confirmation,\n onUpdate: options.onUpdate,\n });\n return {\n toolCallId: options.call.id,\n name: options.call.name,\n content,\n };\n } catch (error) {\n return createErrorResult(options.call, {\n type: \"tool_execution_failed\",\n message: error instanceof Error ? error.message : \"Tool execution failed\",\n cause: error,\n });\n }\n}\n\nfunction zodToJsonSchemaObject(schema: z.ZodType): JsonObject {\n const jsonSchema = z.toJSONSchema(schema) as JsonObject;\n const { $schema: _schema, ...rest } = jsonSchema;\n return rest;\n}\n\nfunction normalizeAgentToolResult(result: ToolExecuteResult): VoiceToolExecutionResult {\n if (typeof result === \"string\") {\n return result;\n }\n if (typeof result.content === \"string\") {\n if (result.details === undefined) {\n return result.content;\n }\n return { content: result.content, details: result.details };\n }\n return { content: result.content, details: result.details };\n}\n\nasync function resolveConfirmation(\n tool: VoiceTool,\n call: VoiceToolCall,\n confirmation: VoiceToolContext[\"confirmation\"],\n): Promise<ToolConfirmationDecision> {\n const policy = tool.confirmation ?? \"never\";\n if (policy === \"never\") {\n return { approved: true };\n }\n if (policy === \"destructive\" && !tool.destructive) {\n return { approved: true };\n }\n if (typeof policy === \"function\") {\n return policy({ call, tool });\n }\n if (!confirmation) {\n return {\n approved: false,\n reason: `Tool requires confirmation: ${tool.name}`,\n };\n }\n return confirmation({ call, tool });\n}\n\nfunction createErrorResult(call: VoiceToolCall, error: VoiceToolExecutionError): VoiceToolResult {\n const content: JsonObject = {\n error: error.message,\n type: error.type,\n };\n return {\n toolCallId: call.id,\n name: call.name,\n content,\n isError: true,\n };\n}\n","import { createVoiceSession, normalizeVoiceProviderError } from \"../session.js\";\nimport { voiceToolToRealtimeFunctionTool } from \"../tools.js\";\nimport type {\n JsonObject,\n RealtimeFunctionToolDefinition,\n VoiceEvent,\n VoiceProvider,\n VoiceProviderConnectOptions,\n VoiceSession,\n VoiceSessionConfig,\n VoiceSessionMetadata,\n VoiceToolCall,\n VoiceToolResult,\n VoiceTransport,\n VoiceTransportEvent,\n} from \"../types.js\";\n\nexport interface OpenAIRealtimeProviderOptions {\n readonly baseUrl?: string;\n readonly providerName?: string;\n}\n\nexport interface OpenAIRealtimeSessionConfig {\n readonly type: \"realtime\";\n readonly model: string;\n readonly instructions?: string;\n readonly audio?: JsonObject;\n readonly tools?: readonly RealtimeFunctionToolDefinition[];\n readonly metadata?: Readonly<Record<string, string>>;\n}\n\nexport interface OpenAIClientSecretRequest {\n readonly session: OpenAIRealtimeSessionConfig;\n}\n\nexport interface OpenAIRealtimeCallRequest {\n readonly sdp: string;\n readonly session: OpenAIRealtimeSessionConfig;\n}\n\nexport interface OpenAIRealtimeHttpClient {\n createClientSecret(\n request: OpenAIClientSecretRequest,\n options: { readonly signal?: AbortSignal },\n ): Promise<JsonObject>;\n createCall(\n request: OpenAIRealtimeCallRequest,\n options: { readonly signal?: AbortSignal },\n ): Promise<string>;\n}\n\nexport function createOpenAIRealtimeProvider(\n options: OpenAIRealtimeProviderOptions = {},\n): VoiceProvider {\n return {\n name: options.providerName ?? \"openai-realtime\",\n async connect(connectOptions: VoiceProviderConnectOptions): Promise<VoiceSession> {\n if (!connectOptions.transport) {\n throw new Error(\"OpenAI Realtime provider requires an injected VoiceTransport\");\n }\n const sessionConfig = toOpenAISessionConfig(connectOptions.session);\n await connectOptions.transport.connect(connectOptions);\n return createVoiceSession({\n id: createSessionId(connectOptions.session),\n provider: options.providerName ?? \"openai-realtime\",\n transport: createNormalizingTransport(connectOptions.transport),\n metadata: createMetadata(connectOptions.session),\n onSendToolResult: async (result, signal) => {\n await connectOptions.transport?.send(\n { type: \"tool_result\", result: toOpenAIToolResult(result) },\n signal,\n );\n },\n onUpdateConfig: async (config, signal) => {\n await connectOptions.transport?.send(\n {\n type: \"config\",\n config: { ...config, session: sessionConfig } as Partial<VoiceSessionConfig>,\n },\n signal,\n );\n },\n });\n },\n };\n}\n\nexport function toOpenAISessionConfig(config: VoiceSessionConfig): OpenAIRealtimeSessionConfig {\n const audio: JsonObject = {};\n if (config.voice) {\n audio.output = { voice: config.voice };\n }\n if (config.inputAudioFormat) {\n audio.input = { format: config.inputAudioFormat };\n }\n if (config.outputAudioFormat) {\n audio.output = {\n ...(audio.output as JsonObject | undefined),\n format: config.outputAudioFormat,\n };\n }\n if (config.turnDetection !== undefined) {\n audio.input = {\n ...(audio.input as JsonObject | undefined),\n turn_detection: config.turnDetection,\n };\n }\n\n return {\n type: \"realtime\",\n model: config.model,\n ...(config.instructions ? { instructions: config.instructions } : {}),\n ...(Object.keys(audio).length > 0 ? { audio } : {}),\n ...(config.tools && config.tools.length > 0\n ? { tools: config.tools.map((tool) => voiceToolToRealtimeFunctionTool(tool)) }\n : {}),\n ...(config.metadata ? { metadata: config.metadata } : {}),\n };\n}\n\nexport function normalizeOpenAIRealtimeEvent(event: unknown): VoiceEvent | null {\n if (!isJsonObject(event)) {\n return null;\n }\n const type = typeof event.type === \"string\" ? event.type : \"\";\n switch (type) {\n case \"session.created\":\n case \"session.updated\":\n return {\n type: \"session_started\",\n session: normalizeSessionMetadata(event.session),\n };\n case \"conversation.item.input_audio_transcription.delta\":\n return {\n type: \"input_transcript_delta\",\n delta: stringValue(event.delta),\n itemId: stringOrUndefined(event.item_id),\n };\n case \"conversation.item.input_audio_transcription.completed\":\n return {\n type: \"input_transcript_done\",\n text: stringValue(event.transcript),\n itemId: stringOrUndefined(event.item_id),\n };\n case \"response.output_audio_transcript.delta\":\n return {\n type: \"output_text_delta\",\n delta: stringValue(event.delta),\n itemId: stringOrUndefined(event.item_id),\n };\n case \"response.output_audio_transcript.done\":\n return {\n type: \"output_text_done\",\n text: stringValue(event.transcript),\n itemId: stringOrUndefined(event.item_id),\n };\n case \"response.output_text.delta\":\n case \"response.text.delta\":\n return {\n type: \"output_text_delta\",\n delta: stringValue(event.delta),\n itemId: stringOrUndefined(event.item_id),\n };\n case \"response.output_text.done\":\n case \"response.text.done\":\n return {\n type: \"output_text_done\",\n text: stringValue(event.text),\n itemId: stringOrUndefined(event.item_id),\n };\n case \"response.output_audio.delta\":\n case \"response.audio.delta\":\n return {\n type: \"output_audio_delta\",\n chunk: { data: stringValue(event.delta), format: \"base64\" },\n itemId: stringOrUndefined(event.item_id),\n };\n case \"response.output_audio.done\":\n case \"response.audio.done\":\n return { type: \"output_audio_done\", itemId: stringOrUndefined(event.item_id) };\n case \"response.function_call_arguments.done\":\n return { type: \"tool_call\", call: normalizeToolCall(event) };\n case \"error\":\n return {\n type: \"error\",\n error: normalizeVoiceProviderError(event.error ?? event),\n recoverable: true,\n };\n default:\n return null;\n }\n}\n\nfunction createNormalizingTransport(transport: VoiceTransport): VoiceTransport {\n return {\n kind: transport.kind,\n connect: transport.connect.bind(transport),\n send: transport.send.bind(transport),\n close: transport.close.bind(transport),\n onEvent(handler) {\n return transport.onEvent((event) => {\n handler(normalizeTransportEvent(event));\n });\n },\n };\n}\n\nfunction normalizeTransportEvent(event: VoiceTransportEvent): VoiceTransportEvent {\n if (event.type !== \"raw\") {\n return event;\n }\n const normalized = normalizeOpenAIRealtimeEvent(event.data);\n return normalized ?? event;\n}\n\nfunction normalizeToolCall(event: JsonObject): VoiceToolCall {\n const args = parseJsonObject(event.arguments);\n return {\n id: stringValue(event.call_id ?? event.item_id ?? event.event_id),\n name: stringValue(event.name),\n args,\n providerCallId: stringOrUndefined(event.call_id),\n raw: event,\n };\n}\n\nfunction toOpenAIToolResult(result: VoiceToolResult): VoiceToolResult {\n return result;\n}\n\nfunction createMetadata(config: VoiceSessionConfig): VoiceSessionMetadata {\n return {\n provider: \"openai-realtime\",\n model: config.model,\n createdAt: new Date().toISOString(),\n };\n}\n\nfunction createSessionId(config: VoiceSessionConfig): string {\n const model = config.model.replace(/[^a-zA-Z0-9_-]/g, \"_\");\n return `openai_${model}_${Date.now()}`;\n}\n\nfunction normalizeSessionMetadata(value: unknown): VoiceSessionMetadata {\n if (!isJsonObject(value)) {\n return { provider: \"openai-realtime\" };\n }\n return {\n sessionId: stringOrUndefined(value.id),\n provider: \"openai-realtime\",\n model: stringOrUndefined(value.model),\n };\n}\n\nfunction parseJsonObject(value: unknown): JsonObject {\n if (isJsonObject(value)) {\n return value;\n }\n if (typeof value !== \"string\") {\n return {};\n }\n try {\n const parsed: unknown = JSON.parse(value);\n return isJsonObject(parsed) ? parsed : {};\n } catch {\n return {};\n }\n}\n\nfunction stringValue(value: unknown): string {\n return typeof value === \"string\" ? value : \"\";\n}\n\nfunction stringOrUndefined(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction isJsonObject(value: unknown): value is JsonObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { OpenAIRealtimeSessionConfig, OpenAIRealtimeProviderOptions, OpenAIRealtimeCallRequest } from './openai-realtime.cjs';
|
|
2
|
+
import { h as VoiceProvider, c as VoiceSessionConfig, J as JsonObject } from '../types-Dc4Q3Z6X.cjs';
|
|
3
|
+
|
|
4
|
+
interface ExperimentalCodexRealtimeProviderOptions extends OpenAIRealtimeProviderOptions {
|
|
5
|
+
readonly baseUrl?: string;
|
|
6
|
+
}
|
|
7
|
+
interface ExperimentalCodexRealtimeCallRequest {
|
|
8
|
+
readonly sdp: string;
|
|
9
|
+
readonly session: OpenAIRealtimeSessionConfig;
|
|
10
|
+
}
|
|
11
|
+
declare function createExperimentalCodexRealtimeProvider(options?: ExperimentalCodexRealtimeProviderOptions): VoiceProvider;
|
|
12
|
+
declare function toExperimentalCodexRealtimeCallRequest(request: OpenAIRealtimeCallRequest): ExperimentalCodexRealtimeCallRequest;
|
|
13
|
+
declare function toExperimentalCodexSessionConfig(config: VoiceSessionConfig): JsonObject;
|
|
14
|
+
|
|
15
|
+
export { type ExperimentalCodexRealtimeCallRequest, type ExperimentalCodexRealtimeProviderOptions, createExperimentalCodexRealtimeProvider, toExperimentalCodexRealtimeCallRequest, toExperimentalCodexSessionConfig };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { OpenAIRealtimeSessionConfig, OpenAIRealtimeProviderOptions, OpenAIRealtimeCallRequest } from './openai-realtime.js';
|
|
2
|
+
import { h as VoiceProvider, c as VoiceSessionConfig, J as JsonObject } from '../types-Dc4Q3Z6X.js';
|
|
3
|
+
|
|
4
|
+
interface ExperimentalCodexRealtimeProviderOptions extends OpenAIRealtimeProviderOptions {
|
|
5
|
+
readonly baseUrl?: string;
|
|
6
|
+
}
|
|
7
|
+
interface ExperimentalCodexRealtimeCallRequest {
|
|
8
|
+
readonly sdp: string;
|
|
9
|
+
readonly session: OpenAIRealtimeSessionConfig;
|
|
10
|
+
}
|
|
11
|
+
declare function createExperimentalCodexRealtimeProvider(options?: ExperimentalCodexRealtimeProviderOptions): VoiceProvider;
|
|
12
|
+
declare function toExperimentalCodexRealtimeCallRequest(request: OpenAIRealtimeCallRequest): ExperimentalCodexRealtimeCallRequest;
|
|
13
|
+
declare function toExperimentalCodexSessionConfig(config: VoiceSessionConfig): JsonObject;
|
|
14
|
+
|
|
15
|
+
export { type ExperimentalCodexRealtimeCallRequest, type ExperimentalCodexRealtimeProviderOptions, createExperimentalCodexRealtimeProvider, toExperimentalCodexRealtimeCallRequest, toExperimentalCodexSessionConfig };
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createOpenAIRealtimeProvider,
|
|
3
|
+
toOpenAISessionConfig
|
|
4
|
+
} from "../chunk-VJ6MPV2Z.js";
|
|
5
|
+
import "../chunk-YLNKQ7CC.js";
|
|
6
|
+
|
|
7
|
+
// src/providers/openai-codex-realtime.ts
|
|
8
|
+
function createExperimentalCodexRealtimeProvider(options = {}) {
|
|
9
|
+
return createOpenAIRealtimeProvider({
|
|
10
|
+
...options,
|
|
11
|
+
baseUrl: options.baseUrl ?? "https://chatgpt.com/backend-api/codex",
|
|
12
|
+
providerName: "openai-codex-realtime-experimental"
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
function toExperimentalCodexRealtimeCallRequest(request) {
|
|
16
|
+
return {
|
|
17
|
+
sdp: request.sdp,
|
|
18
|
+
session: request.session
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
function toExperimentalCodexSessionConfig(config) {
|
|
22
|
+
const session = toOpenAISessionConfig(config);
|
|
23
|
+
const { type: _type, ...rest } = session;
|
|
24
|
+
return rest;
|
|
25
|
+
}
|
|
26
|
+
export {
|
|
27
|
+
createExperimentalCodexRealtimeProvider,
|
|
28
|
+
toExperimentalCodexRealtimeCallRequest,
|
|
29
|
+
toExperimentalCodexSessionConfig
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=openai-codex-realtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/providers/openai-codex-realtime.ts"],"sourcesContent":["import { createOpenAIRealtimeProvider, toOpenAISessionConfig } from \"./openai-realtime.js\";\nimport type {\n OpenAIRealtimeCallRequest,\n OpenAIRealtimeProviderOptions,\n OpenAIRealtimeSessionConfig,\n} from \"./openai-realtime.js\";\nimport type { JsonObject, VoiceProvider, VoiceSessionConfig } from \"../types.js\";\n\nexport interface ExperimentalCodexRealtimeProviderOptions extends OpenAIRealtimeProviderOptions {\n readonly baseUrl?: string;\n}\n\nexport interface ExperimentalCodexRealtimeCallRequest {\n readonly sdp: string;\n readonly session: OpenAIRealtimeSessionConfig;\n}\n\nexport function createExperimentalCodexRealtimeProvider(\n options: ExperimentalCodexRealtimeProviderOptions = {},\n): VoiceProvider {\n return createOpenAIRealtimeProvider({\n ...options,\n baseUrl: options.baseUrl ?? \"https://chatgpt.com/backend-api/codex\",\n providerName: \"openai-codex-realtime-experimental\",\n });\n}\n\nexport function toExperimentalCodexRealtimeCallRequest(\n request: OpenAIRealtimeCallRequest,\n): ExperimentalCodexRealtimeCallRequest {\n return {\n sdp: request.sdp,\n session: request.session,\n };\n}\n\nexport function toExperimentalCodexSessionConfig(config: VoiceSessionConfig): JsonObject {\n const session = toOpenAISessionConfig(config);\n const { type: _type, ...rest } = session;\n return rest;\n}\n"],"mappings":";;;;;;;AAiBO,SAAS,wCACd,UAAoD,CAAC,GACtC;AACf,SAAO,6BAA6B;AAAA,IAClC,GAAG;AAAA,IACH,SAAS,QAAQ,WAAW;AAAA,IAC5B,cAAc;AAAA,EAChB,CAAC;AACH;AAEO,SAAS,uCACd,SACsC;AACtC,SAAO;AAAA,IACL,KAAK,QAAQ;AAAA,IACb,SAAS,QAAQ;AAAA,EACnB;AACF;AAEO,SAAS,iCAAiC,QAAwC;AACvF,QAAM,UAAU,sBAAsB,MAAM;AAC5C,QAAM,EAAE,MAAM,OAAO,GAAG,KAAK,IAAI;AACjC,SAAO;AACT;","names":[]}
|