@llmrtc/llmrtc-provider-openai 1.0.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +45 -0
- package/NOTICE +7 -0
- package/dist/index.d.ts +4 -2
- package/dist/index.js +59 -17
- package/dist/index.js.map +1 -1
- package/dist/tool-adapter.js +19 -9
- package/dist/tool-adapter.js.map +1 -1
- package/package.json +18 -5
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# @llmrtc/llmrtc-provider-openai
|
|
2
|
+
|
|
3
|
+
## 1.1.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- b35b4e1: Fix streaming TTS failing with "response.body?.getReader is not a function"
|
|
8
|
+
when the OpenAI SDK returns a Node Readable body (Node < 18 or apps loading
|
|
9
|
+
the SDK's Node shims). The provider now handles web ReadableStream bodies,
|
|
10
|
+
async-iterable Node stream bodies, and buffered fallback. Previously the
|
|
11
|
+
error was caught upstream and every turn silently fell back to
|
|
12
|
+
non-streaming TTS, adding seconds of latency.
|
|
13
|
+
|
|
14
|
+
## 1.1.0
|
|
15
|
+
|
|
16
|
+
### Minor Changes
|
|
17
|
+
|
|
18
|
+
- 8ff3ea3: Correctness release: make the advertised behavior actually work end to end.
|
|
19
|
+
- Core: system prompt is always sent and pinned outside the history window;
|
|
20
|
+
runTurnStream accepts an AbortSignal (barge-in); onLLMEnd has real
|
|
21
|
+
guardrail semantics; concurrent turns serialize correctly; clearHistory
|
|
22
|
+
transitions clear conversation history; PlaybookHooks are wired; tool
|
|
23
|
+
executor abort/ordering fixes; deep tool-argument validation.
|
|
24
|
+
- Providers: multi-turn tool calling now works across OpenAI, Anthropic,
|
|
25
|
+
Gemini, Bedrock, OpenRouter, LMStudio, and Ollama (history replay,
|
|
26
|
+
parallel tool results, streaming accumulation); malformed tool arguments
|
|
27
|
+
are flagged instead of silently becoming {}; Bedrock defaults to an
|
|
28
|
+
invocable inference profile; Ollama NDJSON streaming is buffered
|
|
29
|
+
correctly; ElevenLabs format mapping fixed; Whisper uploads are named by
|
|
30
|
+
their actual container.
|
|
31
|
+
- Backend: turns serialize per connection and barge-in aborts the in-flight
|
|
32
|
+
turn in any phase; session reconnection binds the recovered history;
|
|
33
|
+
Metered TURN credentials refresh on a TTL; start()/stop() lifecycle
|
|
34
|
+
fixes; real-time audio pacing.
|
|
35
|
+
- Web client: vision frames are delivered in time to reach the turn;
|
|
36
|
+
session resume follows the protocol and actually restores history;
|
|
37
|
+
close()/failure releases the microphone and camera; frame capture works
|
|
38
|
+
outside Chromium; non-WebRTC fallback (sendAudio/ttsChunk) is usable.
|
|
39
|
+
- Packaging: packages resolve under require(), clean checkouts build first
|
|
40
|
+
try, and npm tarballs ship the NOTICE file.
|
|
41
|
+
|
|
42
|
+
### Patch Changes
|
|
43
|
+
|
|
44
|
+
- Updated dependencies [8ff3ea3]
|
|
45
|
+
- @llmrtc/llmrtc-core@1.1.0
|
package/NOTICE
ADDED
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { LLMChunk, LLMProvider, LLMRequest, LLMResult, STTProvider, STTResult, TTSProvider, TTSConfig, TTSResult } from '@llmrtc/llmrtc-core';
|
|
1
|
+
import { LLMChunk, LLMProvider, LLMRequest, LLMResult, STTProvider, STTConfig, STTResult, TTSProvider, TTSConfig, TTSResult } from '@llmrtc/llmrtc-core';
|
|
2
2
|
export interface OpenAILLMConfig {
|
|
3
3
|
apiKey: string;
|
|
4
4
|
baseURL?: string;
|
|
@@ -25,7 +25,7 @@ export declare class OpenAIWhisperProvider implements STTProvider {
|
|
|
25
25
|
private model;
|
|
26
26
|
private language?;
|
|
27
27
|
constructor(config: OpenAIWhisperConfig);
|
|
28
|
-
transcribe(audio: Buffer): Promise<STTResult>;
|
|
28
|
+
transcribe(audio: Buffer, config?: STTConfig): Promise<STTResult>;
|
|
29
29
|
}
|
|
30
30
|
export type OpenAITTSVoice = 'alloy' | 'echo' | 'fable' | 'onyx' | 'nova' | 'shimmer';
|
|
31
31
|
export type OpenAITTSFormat = 'mp3' | 'opus' | 'aac' | 'flac' | 'wav' | 'pcm';
|
|
@@ -59,6 +59,8 @@ export interface OpenAITTSConfig {
|
|
|
59
59
|
export declare class OpenAITTSProvider implements TTSProvider {
|
|
60
60
|
private readonly config;
|
|
61
61
|
readonly name = "openai-tts";
|
|
62
|
+
/** OpenAI PCM output is 24kHz, 16-bit signed LE, mono */
|
|
63
|
+
readonly pcmSampleRate = 24000;
|
|
62
64
|
private client;
|
|
63
65
|
private model;
|
|
64
66
|
private voice;
|
package/dist/index.js
CHANGED
|
@@ -119,17 +119,41 @@ export class OpenAIWhisperProvider {
|
|
|
119
119
|
this.model = config.model ?? 'whisper-1';
|
|
120
120
|
this.language = config.language;
|
|
121
121
|
}
|
|
122
|
-
async transcribe(audio) {
|
|
122
|
+
async transcribe(audio, config) {
|
|
123
|
+
// The transcription endpoint keys decoding off the filename extension,
|
|
124
|
+
// so sniff the actual container instead of assuming one
|
|
125
|
+
const { filename, mimeType } = sniffAudioContainer(audio);
|
|
123
126
|
// Use OpenAI SDK's toFile helper for cross-platform compatibility
|
|
124
|
-
const file = await toFile(audio,
|
|
127
|
+
const file = await toFile(audio, filename, { type: mimeType });
|
|
125
128
|
const res = await this.client.audio.transcriptions.create({
|
|
126
129
|
file: file,
|
|
127
|
-
model: this.model,
|
|
128
|
-
language: this.language
|
|
130
|
+
model: config?.model ?? this.model,
|
|
131
|
+
language: config?.language ?? this.language
|
|
129
132
|
});
|
|
130
133
|
return { text: res.text ?? '', isFinal: true, raw: res };
|
|
131
134
|
}
|
|
132
135
|
}
|
|
136
|
+
/**
|
|
137
|
+
* Detect the audio container from magic bytes so the upload filename
|
|
138
|
+
* matches the actual data. Defaults to webm (the common browser capture
|
|
139
|
+
* format) when unknown.
|
|
140
|
+
*/
|
|
141
|
+
function sniffAudioContainer(audio) {
|
|
142
|
+
if (audio.length >= 12 && audio.toString('ascii', 0, 4) === 'RIFF' && audio.toString('ascii', 8, 12) === 'WAVE') {
|
|
143
|
+
return { filename: 'audio.wav', mimeType: 'audio/wav' };
|
|
144
|
+
}
|
|
145
|
+
if (audio.length >= 4 && audio.readUInt32BE(0) === 0x1a45dfa3) {
|
|
146
|
+
return { filename: 'audio.webm', mimeType: 'audio/webm' };
|
|
147
|
+
}
|
|
148
|
+
if (audio.length >= 4 && audio.toString('ascii', 0, 4) === 'OggS') {
|
|
149
|
+
return { filename: 'audio.ogg', mimeType: 'audio/ogg' };
|
|
150
|
+
}
|
|
151
|
+
if (audio.length >= 3 &&
|
|
152
|
+
(audio.toString('ascii', 0, 3) === 'ID3' || (audio[0] === 0xff && (audio[1] & 0xe0) === 0xe0))) {
|
|
153
|
+
return { filename: 'audio.mp3', mimeType: 'audio/mpeg' };
|
|
154
|
+
}
|
|
155
|
+
return { filename: 'audio.webm', mimeType: 'audio/webm' };
|
|
156
|
+
}
|
|
133
157
|
function mapMessages(messages) {
|
|
134
158
|
return messages.map((m) => {
|
|
135
159
|
// Handle tool result messages
|
|
@@ -196,6 +220,13 @@ export class OpenAITTSProvider {
|
|
|
196
220
|
writable: true,
|
|
197
221
|
value: 'openai-tts'
|
|
198
222
|
});
|
|
223
|
+
/** OpenAI PCM output is 24kHz, 16-bit signed LE, mono */
|
|
224
|
+
Object.defineProperty(this, "pcmSampleRate", {
|
|
225
|
+
enumerable: true,
|
|
226
|
+
configurable: true,
|
|
227
|
+
writable: true,
|
|
228
|
+
value: 24000
|
|
229
|
+
});
|
|
199
230
|
Object.defineProperty(this, "client", {
|
|
200
231
|
enumerable: true,
|
|
201
232
|
configurable: true,
|
|
@@ -229,7 +260,7 @@ export class OpenAITTSProvider {
|
|
|
229
260
|
const voice = overrideConfig?.voice ?? this.voice;
|
|
230
261
|
const format = mapFormat(overrideConfig?.format);
|
|
231
262
|
const response = await this.client.audio.speech.create({
|
|
232
|
-
model: this.model,
|
|
263
|
+
model: overrideConfig?.model ?? this.model,
|
|
233
264
|
voice,
|
|
234
265
|
input: text,
|
|
235
266
|
response_format: format,
|
|
@@ -253,26 +284,37 @@ export class OpenAITTSProvider {
|
|
|
253
284
|
const voice = overrideConfig?.voice ?? this.voice;
|
|
254
285
|
const format = mapFormat(overrideConfig?.format);
|
|
255
286
|
const response = await this.client.audio.speech.create({
|
|
256
|
-
model: this.model,
|
|
287
|
+
model: overrideConfig?.model ?? this.model,
|
|
257
288
|
voice,
|
|
258
289
|
input: text,
|
|
259
290
|
response_format: format,
|
|
260
291
|
speed: this.speed
|
|
261
292
|
});
|
|
262
|
-
//
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
293
|
+
// The SDK's response body is a web ReadableStream when a global fetch
|
|
294
|
+
// is available, but a Node Readable when the SDK runs with its Node
|
|
295
|
+
// shims (e.g. Node < 18 or an app importing 'openai/shims/node').
|
|
296
|
+
// Handle both instead of assuming getReader() exists.
|
|
297
|
+
const body = response.body;
|
|
298
|
+
if (body && typeof body.getReader === 'function') {
|
|
299
|
+
const reader = body.getReader();
|
|
300
|
+
while (true) {
|
|
301
|
+
const { done, value } = await reader.read();
|
|
302
|
+
if (done)
|
|
303
|
+
break;
|
|
304
|
+
yield Buffer.from(value);
|
|
305
|
+
}
|
|
268
306
|
return;
|
|
269
307
|
}
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
308
|
+
if (body &&
|
|
309
|
+
typeof body[Symbol.asyncIterator] === 'function') {
|
|
310
|
+
for await (const chunk of body) {
|
|
311
|
+
yield Buffer.from(chunk);
|
|
312
|
+
}
|
|
313
|
+
return;
|
|
275
314
|
}
|
|
315
|
+
// Fallback: return the whole buffer if streaming is not available
|
|
316
|
+
const buffer = Buffer.from(await response.arrayBuffer());
|
|
317
|
+
yield buffer;
|
|
276
318
|
}
|
|
277
319
|
}
|
|
278
320
|
/**
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/tool-adapter.js
CHANGED
|
@@ -51,7 +51,7 @@ export function parseToolCallsFromOpenAI(toolCalls) {
|
|
|
51
51
|
return toolCalls.map(call => ({
|
|
52
52
|
callId: call.id,
|
|
53
53
|
name: call.function.name,
|
|
54
|
-
|
|
54
|
+
...parseArguments(call.function.arguments),
|
|
55
55
|
}));
|
|
56
56
|
}
|
|
57
57
|
/**
|
|
@@ -82,24 +82,34 @@ export function processToolCallDelta(accumulators, delta) {
|
|
|
82
82
|
*/
|
|
83
83
|
export function finalizeToolCalls(accumulators) {
|
|
84
84
|
const calls = [];
|
|
85
|
-
for (const [
|
|
85
|
+
for (const [index, acc] of Array.from(accumulators.entries()).sort(([a], [b]) => a - b)) {
|
|
86
86
|
calls.push({
|
|
87
|
-
|
|
87
|
+
// Some OpenAI-compatible backends omit ids on streamed tool calls;
|
|
88
|
+
// generate one so tool results can still be correlated in history
|
|
89
|
+
callId: acc.id || `call_${index}_${Date.now()}`,
|
|
88
90
|
name: acc.name,
|
|
89
|
-
|
|
91
|
+
...parseArguments(acc.arguments),
|
|
90
92
|
});
|
|
91
93
|
}
|
|
92
94
|
return calls;
|
|
93
95
|
}
|
|
94
96
|
/**
|
|
95
|
-
*
|
|
97
|
+
* Parse the model's arguments JSON. Empty input means "no arguments";
|
|
98
|
+
* unparseable input is flagged so executors can fail the call instead of
|
|
99
|
+
* running the tool with silently-empty arguments.
|
|
96
100
|
*/
|
|
97
|
-
function
|
|
101
|
+
function parseArguments(str) {
|
|
102
|
+
if (!str || !str.trim()) {
|
|
103
|
+
return { arguments: {} };
|
|
104
|
+
}
|
|
98
105
|
try {
|
|
99
|
-
return JSON.parse(str);
|
|
106
|
+
return { arguments: JSON.parse(str) };
|
|
100
107
|
}
|
|
101
|
-
catch {
|
|
102
|
-
return {
|
|
108
|
+
catch (err) {
|
|
109
|
+
return {
|
|
110
|
+
arguments: {},
|
|
111
|
+
parseError: err instanceof Error ? err.message : String(err),
|
|
112
|
+
};
|
|
103
113
|
}
|
|
104
114
|
}
|
|
105
115
|
/**
|
package/dist/tool-adapter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-adapter.js","sourceRoot":"","sources":["../src/tool-adapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAuB;IACtD,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxB,IAAI,EAAE,UAAmB;QACzB,QAAQ,EAAE;YACR,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,UAAU,EAAE,IAAI,CAAC,UAA2C;SAC7D;KACF,CAAC,CAAC,CAAC;AACN,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,MAAmB;IAEnB,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAE9B,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,MAAM;gBACT,OAAO,MAAM,CAAC;YAChB,KAAK,MAAM;gBACT,OAAO,MAAM,CAAC;YAChB,KAAK,UAAU;gBACb,OAAO,UAAU,CAAC;YACpB;gBACE,OAAO,MAAM,CAAC;QAClB,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE;KAChC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CACtC,SAOE;IAEF,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5B,MAAM,EAAE,IAAI,CAAC,EAAE;QACf,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI;QACxB,
|
|
1
|
+
{"version":3,"file":"tool-adapter.js","sourceRoot":"","sources":["../src/tool-adapter.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@llmrtc/llmrtc-provider-openai",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.1",
|
|
4
4
|
"description": "OpenAI/compatible LLM + Whisper adapters for @llmrtc/LLMRTC",
|
|
5
5
|
"homepage": "https://www.llmrtc.org",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -22,7 +22,9 @@
|
|
|
22
22
|
"files": [
|
|
23
23
|
"dist",
|
|
24
24
|
"README.md",
|
|
25
|
-
"LICENSE"
|
|
25
|
+
"LICENSE",
|
|
26
|
+
"NOTICE",
|
|
27
|
+
"CHANGELOG.md"
|
|
26
28
|
],
|
|
27
29
|
"scripts": {
|
|
28
30
|
"build": "tsc -b",
|
|
@@ -30,8 +32,19 @@
|
|
|
30
32
|
"prepublishOnly": "npm run build"
|
|
31
33
|
},
|
|
32
34
|
"dependencies": {
|
|
33
|
-
"@llmrtc/llmrtc-core": "^1.
|
|
34
|
-
"openai": "^4.72.0"
|
|
35
|
-
|
|
35
|
+
"@llmrtc/llmrtc-core": "^1.1.0",
|
|
36
|
+
"openai": "^4.72.0"
|
|
37
|
+
},
|
|
38
|
+
"exports": {
|
|
39
|
+
".": {
|
|
40
|
+
"types": "./dist/index.d.ts",
|
|
41
|
+
"import": "./dist/index.js",
|
|
42
|
+
"default": "./dist/index.js"
|
|
43
|
+
},
|
|
44
|
+
"./package.json": "./package.json"
|
|
45
|
+
},
|
|
46
|
+
"sideEffects": false,
|
|
47
|
+
"engines": {
|
|
48
|
+
"node": ">=20"
|
|
36
49
|
}
|
|
37
50
|
}
|