@voxagent/bridge 0.4.0 → 0.5.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 +38 -3
- package/dist/cli.js +66 -16
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +15 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +15 -1
- package/dist/config.js.map +1 -1
- package/dist/drivers/claude.js +1 -1
- package/dist/drivers/claude.js.map +1 -1
- package/dist/drivers/codex.js +1 -1
- package/dist/drivers/codex.js.map +1 -1
- package/dist/live/frontend.d.ts +134 -0
- package/dist/live/frontend.d.ts.map +1 -0
- package/dist/live/frontend.js +521 -0
- package/dist/live/frontend.js.map +1 -0
- package/dist/live/mixer.d.ts +38 -0
- package/dist/live/mixer.d.ts.map +1 -0
- package/dist/live/mixer.js +113 -0
- package/dist/live/mixer.js.map +1 -0
- package/dist/live/pcm.d.ts +34 -0
- package/dist/live/pcm.d.ts.map +1 -0
- package/dist/live/pcm.js +66 -0
- package/dist/live/pcm.js.map +1 -0
- package/dist/live/prompts.d.ts +54 -0
- package/dist/live/prompts.d.ts.map +1 -0
- package/dist/live/prompts.js +129 -0
- package/dist/live/prompts.js.map +1 -0
- package/dist/live/session.d.ts +132 -0
- package/dist/live/session.d.ts.map +1 -0
- package/dist/live/session.js +300 -0
- package/dist/live/session.js.map +1 -0
- package/dist/live/speakers.d.ts +54 -0
- package/dist/live/speakers.d.ts.map +1 -0
- package/dist/live/speakers.js +138 -0
- package/dist/live/speakers.js.map +1 -0
- package/dist/live/transcript.d.ts +40 -0
- package/dist/live/transcript.d.ts.map +1 -0
- package/dist/live/transcript.js +72 -0
- package/dist/live/transcript.js.map +1 -0
- package/dist/pair.d.ts +6 -0
- package/dist/pair.d.ts.map +1 -1
- package/dist/pair.js +1 -0
- package/dist/pair.js.map +1 -1
- package/dist/protocol.d.ts +4 -2
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js.map +1 -1
- package/dist/room.d.ts +20 -0
- package/dist/room.d.ts.map +1 -1
- package/dist/room.js +173 -3
- package/dist/room.js.map +1 -1
- package/dist/version.d.ts +8 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +19 -0
- package/dist/version.js.map +1 -0
- package/package.json +3 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frontend.js","sourceRoot":"","sources":["../../src/live/frontend.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Mixes every human's microphone into the single stream GPT-Live hears.
|
|
3
|
+
*
|
|
4
|
+
* GPT-Live takes one input stream, so the room is summed into one. Each
|
|
5
|
+
* source (one LiveKit mic track) feeds a FIFO as frames arrive; a clock in
|
|
6
|
+
* the runtime pulls fixed blocks at real-time pace. A source that has
|
|
7
|
+
* nothing buffered contributes silence instead of stalling the mix, so a
|
|
8
|
+
* muted or lagging participant never holds up everyone else — the reason
|
|
9
|
+
* this doesn't use rtc-node's `AudioMixer`, which waits on each stream.
|
|
10
|
+
*
|
|
11
|
+
* Levels are reported per source for every block so the speaker tracker
|
|
12
|
+
* can label who is talking on exactly the audio GPT-Live received.
|
|
13
|
+
*/
|
|
14
|
+
export interface MixedBlock {
|
|
15
|
+
mixed: Int16Array;
|
|
16
|
+
/** RMS level (0..1) of each source's contribution to this block. */
|
|
17
|
+
levels: Map<string, number>;
|
|
18
|
+
}
|
|
19
|
+
export interface PcmMixerOptions {
|
|
20
|
+
/**
|
|
21
|
+
* Cap on each source's backlog. Past this the oldest audio is dropped so
|
|
22
|
+
* clock drift or a stalled event loop can't grow latency without bound.
|
|
23
|
+
*/
|
|
24
|
+
maxBufferedSamples: number;
|
|
25
|
+
}
|
|
26
|
+
export declare class PcmMixer {
|
|
27
|
+
private readonly options;
|
|
28
|
+
private queues;
|
|
29
|
+
private scratch;
|
|
30
|
+
/** Samples discarded by the backlog cap, for diagnostics. */
|
|
31
|
+
droppedSamples: number;
|
|
32
|
+
constructor(options: PcmMixerOptions);
|
|
33
|
+
get sourceCount(): number;
|
|
34
|
+
push(sourceId: string, samples: Int16Array): void;
|
|
35
|
+
remove(sourceId: string): void;
|
|
36
|
+
pull(blockSamples: number): MixedBlock;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=mixer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mixer.d.ts","sourceRoot":"","sources":["../../src/live/mixer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAyDH,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,UAAU,CAAC;IAClB,oEAAoE;IACpE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,qBAAa,QAAQ;IAMP,OAAO,CAAC,QAAQ,CAAC,OAAO;IALpC,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,OAAO,CAAqB;IACpC,6DAA6D;IAC7D,cAAc,SAAK;gBAEU,OAAO,EAAE,eAAe;IAErD,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,IAAI;IAUjD,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAI9B,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,UAAU;CAkBvC"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Mixes every human's microphone into the single stream GPT-Live hears.
|
|
3
|
+
*
|
|
4
|
+
* GPT-Live takes one input stream, so the room is summed into one. Each
|
|
5
|
+
* source (one LiveKit mic track) feeds a FIFO as frames arrive; a clock in
|
|
6
|
+
* the runtime pulls fixed blocks at real-time pace. A source that has
|
|
7
|
+
* nothing buffered contributes silence instead of stalling the mix, so a
|
|
8
|
+
* muted or lagging participant never holds up everyone else — the reason
|
|
9
|
+
* this doesn't use rtc-node's `AudioMixer`, which waits on each stream.
|
|
10
|
+
*
|
|
11
|
+
* Levels are reported per source for every block so the speaker tracker
|
|
12
|
+
* can label who is talking on exactly the audio GPT-Live received.
|
|
13
|
+
*/
|
|
14
|
+
import { rmsLevel } from './pcm.js';
|
|
15
|
+
class SampleQueue {
|
|
16
|
+
chunks = [];
|
|
17
|
+
headOffset = 0;
|
|
18
|
+
length = 0;
|
|
19
|
+
push(samples) {
|
|
20
|
+
if (samples.length === 0)
|
|
21
|
+
return;
|
|
22
|
+
this.chunks.push(samples);
|
|
23
|
+
this.length += samples.length;
|
|
24
|
+
}
|
|
25
|
+
/** Drops the oldest samples until at most `max` remain. */
|
|
26
|
+
trimTo(max) {
|
|
27
|
+
let dropped = 0;
|
|
28
|
+
while (this.length > max) {
|
|
29
|
+
const head = this.chunks[0];
|
|
30
|
+
if (!head)
|
|
31
|
+
break;
|
|
32
|
+
const available = head.length - this.headOffset;
|
|
33
|
+
const excess = this.length - max;
|
|
34
|
+
if (available <= excess) {
|
|
35
|
+
this.chunks.shift();
|
|
36
|
+
this.headOffset = 0;
|
|
37
|
+
this.length -= available;
|
|
38
|
+
dropped += available;
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
this.headOffset += excess;
|
|
42
|
+
this.length -= excess;
|
|
43
|
+
dropped += excess;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return dropped;
|
|
47
|
+
}
|
|
48
|
+
/** Copies up to `n` samples into `out`; returns how many were real audio. */
|
|
49
|
+
readInto(out, n) {
|
|
50
|
+
let written = 0;
|
|
51
|
+
while (written < n) {
|
|
52
|
+
const head = this.chunks[0];
|
|
53
|
+
if (!head)
|
|
54
|
+
break;
|
|
55
|
+
const take = Math.min(n - written, head.length - this.headOffset);
|
|
56
|
+
out.set(head.subarray(this.headOffset, this.headOffset + take), written);
|
|
57
|
+
written += take;
|
|
58
|
+
this.headOffset += take;
|
|
59
|
+
if (this.headOffset >= head.length) {
|
|
60
|
+
this.chunks.shift();
|
|
61
|
+
this.headOffset = 0;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
this.length -= written;
|
|
65
|
+
return written;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export class PcmMixer {
|
|
69
|
+
options;
|
|
70
|
+
queues = new Map();
|
|
71
|
+
scratch = new Int16Array(0);
|
|
72
|
+
/** Samples discarded by the backlog cap, for diagnostics. */
|
|
73
|
+
droppedSamples = 0;
|
|
74
|
+
constructor(options) {
|
|
75
|
+
this.options = options;
|
|
76
|
+
}
|
|
77
|
+
get sourceCount() {
|
|
78
|
+
return this.queues.size;
|
|
79
|
+
}
|
|
80
|
+
push(sourceId, samples) {
|
|
81
|
+
let queue = this.queues.get(sourceId);
|
|
82
|
+
if (!queue) {
|
|
83
|
+
queue = new SampleQueue();
|
|
84
|
+
this.queues.set(sourceId, queue);
|
|
85
|
+
}
|
|
86
|
+
queue.push(samples);
|
|
87
|
+
this.droppedSamples += queue.trimTo(this.options.maxBufferedSamples);
|
|
88
|
+
}
|
|
89
|
+
remove(sourceId) {
|
|
90
|
+
this.queues.delete(sourceId);
|
|
91
|
+
}
|
|
92
|
+
pull(blockSamples) {
|
|
93
|
+
const acc = new Int32Array(blockSamples);
|
|
94
|
+
const levels = new Map();
|
|
95
|
+
if (this.scratch.length !== blockSamples)
|
|
96
|
+
this.scratch = new Int16Array(blockSamples);
|
|
97
|
+
for (const [sourceId, queue] of this.queues) {
|
|
98
|
+
const real = queue.readInto(this.scratch, blockSamples);
|
|
99
|
+
for (let i = 0; i < real; i++)
|
|
100
|
+
acc[i] = (acc[i] ?? 0) + (this.scratch[i] ?? 0);
|
|
101
|
+
// Level over the whole block: a source that only had half a block of
|
|
102
|
+
// audio was only talking for half of it.
|
|
103
|
+
levels.set(sourceId, real > 0 ? rmsLevel(this.scratch, real) * Math.sqrt(real / blockSamples) : 0);
|
|
104
|
+
}
|
|
105
|
+
const mixed = new Int16Array(blockSamples);
|
|
106
|
+
for (let i = 0; i < blockSamples; i++) {
|
|
107
|
+
const v = acc[i] ?? 0;
|
|
108
|
+
mixed[i] = v > 32767 ? 32767 : v < -32768 ? -32768 : v;
|
|
109
|
+
}
|
|
110
|
+
return { mixed, levels };
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=mixer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mixer.js","sourceRoot":"","sources":["../../src/live/mixer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file PCM16 helpers shared by the GPT-Live voice front end.
|
|
3
|
+
*
|
|
4
|
+
* GPT-Live's WebSocket carries mono PCM16LE as base64 inside JSON events.
|
|
5
|
+
* These helpers convert between that wire form and the `Int16Array`s the
|
|
6
|
+
* LiveKit side produces and consumes, and re-chunk arbitrary-length audio
|
|
7
|
+
* into fixed frames for `AudioSource.captureFrame`.
|
|
8
|
+
*/
|
|
9
|
+
/** Sample rate of every PCM buffer in the live pipeline (GPT-Live default). */
|
|
10
|
+
export declare const LIVE_SAMPLE_RATE = 24000;
|
|
11
|
+
/** Samples per millisecond at {@link LIVE_SAMPLE_RATE}. */
|
|
12
|
+
export declare const SAMPLES_PER_MS: number;
|
|
13
|
+
/** Encodes PCM16 samples as the base64 string GPT-Live expects. */
|
|
14
|
+
export declare function int16ToBase64(samples: Int16Array): string;
|
|
15
|
+
/**
|
|
16
|
+
* Decodes base64 PCM16 from GPT-Live. Copies into a fresh buffer so the
|
|
17
|
+
* result is 2-byte aligned regardless of where Node's Buffer pool put the
|
|
18
|
+
* decoded bytes. A trailing odd byte (never expected) is dropped.
|
|
19
|
+
*/
|
|
20
|
+
export declare function base64ToInt16(encoded: string): Int16Array;
|
|
21
|
+
/** Root-mean-square level of a PCM16 buffer, normalised to 0..1. */
|
|
22
|
+
export declare function rmsLevel(samples: Int16Array, count?: number): number;
|
|
23
|
+
/**
|
|
24
|
+
* Re-chunks a stream of arbitrary-length PCM16 buffers into fixed-size
|
|
25
|
+
* frames. Anything short of a full frame waits for the next push.
|
|
26
|
+
*/
|
|
27
|
+
export declare class PcmChunker {
|
|
28
|
+
private readonly frameSamples;
|
|
29
|
+
private pending;
|
|
30
|
+
constructor(frameSamples: number);
|
|
31
|
+
push(samples: Int16Array): Int16Array[];
|
|
32
|
+
reset(): void;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=pcm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pcm.d.ts","sourceRoot":"","sources":["../../src/live/pcm.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,+EAA+E;AAC/E,eAAO,MAAM,gBAAgB,QAAS,CAAC;AAEvC,2DAA2D;AAC3D,eAAO,MAAM,cAAc,QAA0B,CAAC;AAEtD,mEAAmE;AACnE,wBAAgB,aAAa,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,CAEzD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CAKzD;AAED,oEAAoE;AACpE,wBAAgB,QAAQ,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,SAAiB,GAAG,MAAM,CAQ5E;AAED;;;GAGG;AACH,qBAAa,UAAU;IAGT,OAAO,CAAC,QAAQ,CAAC,YAAY;IAFzC,OAAO,CAAC,OAAO,CAAiC;gBAEnB,YAAY,EAAE,MAAM;IAEjD,IAAI,CAAC,OAAO,EAAE,UAAU,GAAG,UAAU,EAAE;IAcvC,KAAK,IAAI,IAAI;CAGd"}
|
package/dist/live/pcm.js
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file PCM16 helpers shared by the GPT-Live voice front end.
|
|
3
|
+
*
|
|
4
|
+
* GPT-Live's WebSocket carries mono PCM16LE as base64 inside JSON events.
|
|
5
|
+
* These helpers convert between that wire form and the `Int16Array`s the
|
|
6
|
+
* LiveKit side produces and consumes, and re-chunk arbitrary-length audio
|
|
7
|
+
* into fixed frames for `AudioSource.captureFrame`.
|
|
8
|
+
*/
|
|
9
|
+
/** Sample rate of every PCM buffer in the live pipeline (GPT-Live default). */
|
|
10
|
+
export const LIVE_SAMPLE_RATE = 24_000;
|
|
11
|
+
/** Samples per millisecond at {@link LIVE_SAMPLE_RATE}. */
|
|
12
|
+
export const SAMPLES_PER_MS = LIVE_SAMPLE_RATE / 1000;
|
|
13
|
+
/** Encodes PCM16 samples as the base64 string GPT-Live expects. */
|
|
14
|
+
export function int16ToBase64(samples) {
|
|
15
|
+
return Buffer.from(samples.buffer, samples.byteOffset, samples.byteLength).toString('base64');
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Decodes base64 PCM16 from GPT-Live. Copies into a fresh buffer so the
|
|
19
|
+
* result is 2-byte aligned regardless of where Node's Buffer pool put the
|
|
20
|
+
* decoded bytes. A trailing odd byte (never expected) is dropped.
|
|
21
|
+
*/
|
|
22
|
+
export function base64ToInt16(encoded) {
|
|
23
|
+
const bytes = Buffer.from(encoded, 'base64');
|
|
24
|
+
const even = bytes.length - (bytes.length % 2);
|
|
25
|
+
const copy = new Uint8Array(bytes.subarray(0, even));
|
|
26
|
+
return new Int16Array(copy.buffer);
|
|
27
|
+
}
|
|
28
|
+
/** Root-mean-square level of a PCM16 buffer, normalised to 0..1. */
|
|
29
|
+
export function rmsLevel(samples, count = samples.length) {
|
|
30
|
+
if (count === 0)
|
|
31
|
+
return 0;
|
|
32
|
+
let sum = 0;
|
|
33
|
+
for (let i = 0; i < count; i++) {
|
|
34
|
+
const s = (samples[i] ?? 0) / 32768;
|
|
35
|
+
sum += s * s;
|
|
36
|
+
}
|
|
37
|
+
return Math.sqrt(sum / count);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Re-chunks a stream of arbitrary-length PCM16 buffers into fixed-size
|
|
41
|
+
* frames. Anything short of a full frame waits for the next push.
|
|
42
|
+
*/
|
|
43
|
+
export class PcmChunker {
|
|
44
|
+
frameSamples;
|
|
45
|
+
pending = new Int16Array(0);
|
|
46
|
+
constructor(frameSamples) {
|
|
47
|
+
this.frameSamples = frameSamples;
|
|
48
|
+
}
|
|
49
|
+
push(samples) {
|
|
50
|
+
const joined = new Int16Array(this.pending.length + samples.length);
|
|
51
|
+
joined.set(this.pending);
|
|
52
|
+
joined.set(samples, this.pending.length);
|
|
53
|
+
const frames = [];
|
|
54
|
+
let offset = 0;
|
|
55
|
+
while (joined.length - offset >= this.frameSamples) {
|
|
56
|
+
frames.push(joined.slice(offset, offset + this.frameSamples));
|
|
57
|
+
offset += this.frameSamples;
|
|
58
|
+
}
|
|
59
|
+
this.pending = joined.slice(offset);
|
|
60
|
+
return frames;
|
|
61
|
+
}
|
|
62
|
+
reset() {
|
|
63
|
+
this.pending = new Int16Array(0);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=pcm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pcm.js","sourceRoot":"","sources":["../../src/live/pcm.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,+EAA+E;AAC/E,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEvC,2DAA2D;AAC3D,MAAM,CAAC,MAAM,cAAc,GAAG,gBAAgB,GAAG,IAAI,CAAC;AAEtD,mEAAmE;AACnE,MAAM,UAAU,aAAa,CAAC,OAAmB;IAC/C,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAChG,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IACrD,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACrC,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,QAAQ,CAAC,OAAmB,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM;IAClE,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAC1B,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC;QACpC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC;AAChC,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,UAAU;IAGQ;IAFrB,OAAO,GAAe,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;IAEhD,YAA6B,YAAoB;QAApB,iBAAY,GAAZ,YAAY,CAAQ;IAAG,CAAC;IAErD,IAAI,CAAC,OAAmB;QACtB,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QACpE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzB,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,MAAM,GAAiB,EAAE,CAAC;QAChC,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,OAAO,MAAM,CAAC,MAAM,GAAG,MAAM,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACnD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;YAC9D,MAAM,IAAI,IAAI,CAAC,YAAY,CAAC;QAC9B,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACpC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC;CACF"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Prompts for the GPT-Live voice front end and the local backend.
|
|
3
|
+
*
|
|
4
|
+
* Split the way OpenAI's GPT-Live guides recommend: the live model gets
|
|
5
|
+
* conversation style and a delegation policy; the backend (Claude Code /
|
|
6
|
+
* Codex on the host) gets the task, the transcript it came from, and rules
|
|
7
|
+
* for writing a result the live model will paraphrase aloud.
|
|
8
|
+
*/
|
|
9
|
+
import type { AgentBackend } from '../protocol.js';
|
|
10
|
+
import { type LiveTranscriptLine } from './transcript.js';
|
|
11
|
+
/** Plain-string context appends are capped at 500 tokens by GPT-Live. */
|
|
12
|
+
export declare const MAX_APPEND_CHARS = 1400;
|
|
13
|
+
export interface FrontendPromptInput {
|
|
14
|
+
assistantName: string;
|
|
15
|
+
backend: AgentBackend;
|
|
16
|
+
hostName: string;
|
|
17
|
+
workspace: string;
|
|
18
|
+
/** MCP servers + skills on the host, surfaced as backend capabilities. */
|
|
19
|
+
tools: string[];
|
|
20
|
+
/** Null when only the room ID is known. */
|
|
21
|
+
roomName: string | null;
|
|
22
|
+
}
|
|
23
|
+
export declare function buildFrontendInstructions(input: FrontendPromptInput): string;
|
|
24
|
+
export declare function nowSpeakingHint(name: string, isHost: boolean): string;
|
|
25
|
+
export declare function rosterHint(names: string[]): string;
|
|
26
|
+
export interface DelegationPromptInput {
|
|
27
|
+
assistantName: string;
|
|
28
|
+
/** GPT-Live transcript since the previous hand-off (plus a little overlap). */
|
|
29
|
+
heard: LiveTranscriptLine[];
|
|
30
|
+
/** Speaker-attributed finals from the participants' browsers, oldest first. */
|
|
31
|
+
roomTranscript: {
|
|
32
|
+
speaker: string;
|
|
33
|
+
text: string;
|
|
34
|
+
}[];
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* The user turn handed to the backend for one delegation. GPT-Live says
|
|
38
|
+
* what it wants done only through the conversation, so the backend gets
|
|
39
|
+
* the conversation and is asked to infer the request from its end.
|
|
40
|
+
*/
|
|
41
|
+
export declare function buildDelegationPrompt(input: DelegationPromptInput): string;
|
|
42
|
+
/** System-prompt addendum for backend runs started by a delegation. */
|
|
43
|
+
export declare function buildBackendAddendum(input: {
|
|
44
|
+
assistantName: string;
|
|
45
|
+
roomName: string;
|
|
46
|
+
participants: string[];
|
|
47
|
+
}): string;
|
|
48
|
+
/**
|
|
49
|
+
* Splits text into chunks under the per-append limit, preferring sentence
|
|
50
|
+
* boundaries. Long results are cut after `maxChunks` with a pointer to the
|
|
51
|
+
* agent panel, where the full reply is shown as text.
|
|
52
|
+
*/
|
|
53
|
+
export declare function splitForAppend(text: string, maxChars?: number, maxChunks?: number): string[];
|
|
54
|
+
//# sourceMappingURL=prompts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/live/prompts.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAc,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAEtE,yEAAyE;AACzE,eAAO,MAAM,gBAAgB,OAAO,CAAC;AAErC,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,YAAY,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,2CAA2C;IAC3C,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAOD,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,mBAAmB,GAAG,MAAM,CAkC5E;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,CAErE;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAIlD;AAED,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,+EAA+E;IAC/E,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,+EAA+E;IAC/E,cAAc,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACrD;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,qBAAqB,GAAG,MAAM,CAY1E;AAED,uEAAuE;AACvE,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAC1C,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB,GAAG,MAAM,CAYT;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,SAAmB,EAAE,SAAS,SAAI,GAAG,MAAM,EAAE,CA4BjG"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Prompts for the GPT-Live voice front end and the local backend.
|
|
3
|
+
*
|
|
4
|
+
* Split the way OpenAI's GPT-Live guides recommend: the live model gets
|
|
5
|
+
* conversation style and a delegation policy; the backend (Claude Code /
|
|
6
|
+
* Codex on the host) gets the task, the transcript it came from, and rules
|
|
7
|
+
* for writing a result the live model will paraphrase aloud.
|
|
8
|
+
*/
|
|
9
|
+
import { formatLine } from './transcript.js';
|
|
10
|
+
/** Plain-string context appends are capped at 500 tokens by GPT-Live. */
|
|
11
|
+
export const MAX_APPEND_CHARS = 1400;
|
|
12
|
+
const BACKEND_LABEL = {
|
|
13
|
+
claude: 'Claude Code',
|
|
14
|
+
codex: 'Codex',
|
|
15
|
+
};
|
|
16
|
+
export function buildFrontendInstructions(input) {
|
|
17
|
+
const agent = BACKEND_LABEL[input.backend];
|
|
18
|
+
const tools = input.tools.slice(0, 25);
|
|
19
|
+
return [
|
|
20
|
+
`You are ${input.assistantName}, a calm, friendly voice assistant sitting in a live meeting${input.roomName ? ` called "${input.roomName}"` : ''}. You are the voice of ${agent}, a coding agent running on ${input.hostName}'s computer in the "${input.workspace}" project.`,
|
|
21
|
+
'Speak naturally and briefly: one or two short sentences unless someone asks for more. Never read out code, file paths character by character, or long lists.',
|
|
22
|
+
'',
|
|
23
|
+
'Room policy:',
|
|
24
|
+
'- Several people are in this meeting and mostly talk to each other. Most of what you hear is not for you.',
|
|
25
|
+
`- Respond only when someone addresses you directly, by name ("${input.assistantName}") or clearly speaking to the assistant or the agent, or when someone continues a conversation they started with you. Otherwise keep listening silently.`,
|
|
26
|
+
'- Never comment on, summarize, or answer questions people ask each other.',
|
|
27
|
+
'- Context lines such as "Now speaking: David" tell you who is talking. Use them to know who asked what, and address people by name when it helps.',
|
|
28
|
+
'',
|
|
29
|
+
'Backchannel policy: Do not use backchannels. Stay silent while people talk.',
|
|
30
|
+
'',
|
|
31
|
+
'Interruption policy: Stop speaking when anyone starts talking over you. Listen to what they say.',
|
|
32
|
+
'',
|
|
33
|
+
'Delegation policy:',
|
|
34
|
+
'Backend tools:',
|
|
35
|
+
`- ${agent} on ${input.hostName}'s machine: reads, writes and explains code in the ${input.workspace} project, runs commands and tests, searches the web, and uses the host's tools${tools.length > 0 ? ` (${tools.join(', ')})` : ''}.`,
|
|
36
|
+
'',
|
|
37
|
+
'Delegate to the backend when:',
|
|
38
|
+
'- Someone addressed to you asks you to do, check, look up, build, fix, run or explain something that needs the code, the computer, files, the web or the host\'s tools.',
|
|
39
|
+
'- A correction or an added detail changes work already requested.',
|
|
40
|
+
'',
|
|
41
|
+
'Do not delegate to the backend when:',
|
|
42
|
+
'- The speech was not addressed to you.',
|
|
43
|
+
'- You can answer from the conversation or from a result you already received.',
|
|
44
|
+
'- Someone asks how a task is going. Answer from the progress context you have.',
|
|
45
|
+
'- You need a brief clarification to understand the request.',
|
|
46
|
+
'',
|
|
47
|
+
'Delegate before giving an answer that depends on backend work. Do not guess the result while waiting; a short acknowledgement such as "On it" is enough.',
|
|
48
|
+
'Backend results and progress arrive as context. Relay results briefly in plain speech and say who they answer when several people asked for things.',
|
|
49
|
+
].join('\n');
|
|
50
|
+
}
|
|
51
|
+
export function nowSpeakingHint(name, isHost) {
|
|
52
|
+
return `Now speaking: ${name}${isHost ? ' (the host)' : ''}.`;
|
|
53
|
+
}
|
|
54
|
+
export function rosterHint(names) {
|
|
55
|
+
return names.length === 0
|
|
56
|
+
? 'Nobody else is in the meeting right now.'
|
|
57
|
+
: `People in the meeting: ${names.join(', ')}.`;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* The user turn handed to the backend for one delegation. GPT-Live says
|
|
61
|
+
* what it wants done only through the conversation, so the backend gets
|
|
62
|
+
* the conversation and is asked to infer the request from its end.
|
|
63
|
+
*/
|
|
64
|
+
export function buildDelegationPrompt(input) {
|
|
65
|
+
const heard = input.heard.map((line) => formatLine(line, input.assistantName));
|
|
66
|
+
const room = input.roomTranscript.slice(-8).map((line) => `${line.speaker}: ${line.text}`);
|
|
67
|
+
return [
|
|
68
|
+
`${input.assistantName}, the voice assistant in this meeting, just handed you a task. It does not say what the task is; work it out from the end of the conversation below — usually the last request someone addressed to the assistant.`,
|
|
69
|
+
'',
|
|
70
|
+
'What the voice assistant heard since its last hand-off (speaker labels are a best guess):',
|
|
71
|
+
...(heard.length > 0 ? heard : ['(nothing transcribed)']),
|
|
72
|
+
...(room.length > 0
|
|
73
|
+
? ['', 'Room transcript from speech-to-text (speaker labels are reliable, may lag the line above):', ...room]
|
|
74
|
+
: []),
|
|
75
|
+
].join('\n');
|
|
76
|
+
}
|
|
77
|
+
/** System-prompt addendum for backend runs started by a delegation. */
|
|
78
|
+
export function buildBackendAddendum(input) {
|
|
79
|
+
return [
|
|
80
|
+
'You are running on the host\'s machine as the backend for a voice assistant in a live meeting.',
|
|
81
|
+
`Meeting: "${input.roomName}". Participants: ${input.participants.join(', ') || 'unknown'}.`,
|
|
82
|
+
`${input.assistantName}, a separate voice model, talks with the room. It hands you tasks and relays your final reply out loud in its own words. You never speak to the room directly.`,
|
|
83
|
+
'',
|
|
84
|
+
'How to reply:',
|
|
85
|
+
'- Transcripts can contain recognition mistakes, unfinished phrases and later corrections. Use the latest intent. If a needed detail is genuinely missing, reply with the one question to ask instead of guessing.',
|
|
86
|
+
'- Your final reply is relayed by voice. Give the facts, the status and the next step in plain prose, one to four short sentences.',
|
|
87
|
+
'- No markdown, code blocks, tables or long lists. Mention file names only when they matter.',
|
|
88
|
+
'- Report an action as done only after it succeeded. If the outcome is unclear, say what still needs checking.',
|
|
89
|
+
].join('\n');
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Splits text into chunks under the per-append limit, preferring sentence
|
|
93
|
+
* boundaries. Long results are cut after `maxChunks` with a pointer to the
|
|
94
|
+
* agent panel, where the full reply is shown as text.
|
|
95
|
+
*/
|
|
96
|
+
export function splitForAppend(text, maxChars = MAX_APPEND_CHARS, maxChunks = 3) {
|
|
97
|
+
const clean = text.replace(/\s+/g, ' ').trim();
|
|
98
|
+
if (!clean)
|
|
99
|
+
return [];
|
|
100
|
+
const sentences = clean.match(/[^.!?]+[.!?]+(\s|$)|[^.!?]+$/g) ?? [clean];
|
|
101
|
+
const chunks = [];
|
|
102
|
+
let current = '';
|
|
103
|
+
for (const raw of sentences) {
|
|
104
|
+
let sentence = raw.trim();
|
|
105
|
+
while (sentence.length > maxChars) {
|
|
106
|
+
if (current) {
|
|
107
|
+
chunks.push(current);
|
|
108
|
+
current = '';
|
|
109
|
+
}
|
|
110
|
+
chunks.push(sentence.slice(0, maxChars));
|
|
111
|
+
sentence = sentence.slice(maxChars);
|
|
112
|
+
}
|
|
113
|
+
if (current && current.length + 1 + sentence.length > maxChars) {
|
|
114
|
+
chunks.push(current);
|
|
115
|
+
current = sentence;
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
current = current ? `${current} ${sentence}` : sentence;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
if (current)
|
|
122
|
+
chunks.push(current);
|
|
123
|
+
if (chunks.length <= maxChunks)
|
|
124
|
+
return chunks;
|
|
125
|
+
const kept = chunks.slice(0, maxChunks);
|
|
126
|
+
kept[maxChunks - 1] = `${kept[maxChunks - 1]} (The full answer is in the agent panel.)`;
|
|
127
|
+
return kept;
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/live/prompts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file GPT-Live primary WebSocket client (`wss://api.openai.com/v1/live/sessions`).
|
|
3
|
+
*
|
|
4
|
+
* Speaks the raw event protocol rather than pulling in the `openai` SDK —
|
|
5
|
+
* the surface we use is small and the bridge keeps its dependency list
|
|
6
|
+
* short (same approach as the ElevenLabs engine).
|
|
7
|
+
*
|
|
8
|
+
* Behaviour verified against the real API on 2026-09-27:
|
|
9
|
+
* - `session.started` arrives ~1 s after `session.start`; sessions expire
|
|
10
|
+
* 2 h after start (`session.expires_at`).
|
|
11
|
+
* - Output audio is a continuous real-time stream, silence included, from
|
|
12
|
+
* the moment the session starts. GPT-Live never races ahead of the
|
|
13
|
+
* clock, so barge-in needs no local playback flushing.
|
|
14
|
+
* - After `session.closed` the server drops the socket without a close
|
|
15
|
+
* frame (code 1006 + an `error` event). That is a normal end, not a
|
|
16
|
+
* failure.
|
|
17
|
+
*/
|
|
18
|
+
export declare const LIVE_SESSIONS_URL = "wss://api.openai.com/v1/live/sessions";
|
|
19
|
+
export declare const DEFAULT_LIVE_MODEL = "gpt-live-1";
|
|
20
|
+
export declare const DEFAULT_LIVE_VOICE = "marin";
|
|
21
|
+
export type LiveCloseReason = 'close_requested' | 'expired' | 'content' | 'remote_hangup' | 'connection_lost'
|
|
22
|
+
/** The socket closed before a `session.closed` event arrived. */
|
|
23
|
+
| 'socket_closed';
|
|
24
|
+
/** A text message used to seed a new session's history. */
|
|
25
|
+
export type LiveInitialItem = {
|
|
26
|
+
type: 'message';
|
|
27
|
+
role: 'developer' | 'user';
|
|
28
|
+
content: [{
|
|
29
|
+
type: 'input_text';
|
|
30
|
+
text: string;
|
|
31
|
+
}];
|
|
32
|
+
} | {
|
|
33
|
+
type: 'message';
|
|
34
|
+
role: 'assistant';
|
|
35
|
+
content: [{
|
|
36
|
+
type: 'output_text';
|
|
37
|
+
text: string;
|
|
38
|
+
}];
|
|
39
|
+
};
|
|
40
|
+
export interface LiveSessionConfig {
|
|
41
|
+
apiKey: string;
|
|
42
|
+
model: string;
|
|
43
|
+
voice: string;
|
|
44
|
+
instructions: string;
|
|
45
|
+
/** Prior text history (≤ 128 messages, ≤ 8,192 tokens). */
|
|
46
|
+
input?: LiveInitialItem[];
|
|
47
|
+
url?: string;
|
|
48
|
+
}
|
|
49
|
+
export type LiveSessionEvent = {
|
|
50
|
+
type: 'started';
|
|
51
|
+
sessionId: string;
|
|
52
|
+
expiresAt: number | null;
|
|
53
|
+
} | {
|
|
54
|
+
type: 'audio';
|
|
55
|
+
samples: Int16Array;
|
|
56
|
+
} | {
|
|
57
|
+
type: 'transcript';
|
|
58
|
+
role: 'input' | 'output';
|
|
59
|
+
delta: string;
|
|
60
|
+
startMs: number;
|
|
61
|
+
endMs: number;
|
|
62
|
+
} | {
|
|
63
|
+
type: 'delegation';
|
|
64
|
+
id: string;
|
|
65
|
+
offsetMs: number;
|
|
66
|
+
} | {
|
|
67
|
+
type: 'usage';
|
|
68
|
+
seconds: number;
|
|
69
|
+
contextRatio: number | null;
|
|
70
|
+
} | {
|
|
71
|
+
type: 'error';
|
|
72
|
+
code: string;
|
|
73
|
+
message: string;
|
|
74
|
+
clientEventId: string | null;
|
|
75
|
+
} | {
|
|
76
|
+
type: 'closed';
|
|
77
|
+
reason: LiveCloseReason;
|
|
78
|
+
usageSeconds: number | null;
|
|
79
|
+
};
|
|
80
|
+
/** The slice of the WebSocket API the session uses — lets tests inject a fake. */
|
|
81
|
+
export interface LiveSocket {
|
|
82
|
+
readonly readyState: number;
|
|
83
|
+
send(data: string): void;
|
|
84
|
+
close(): void;
|
|
85
|
+
addEventListener(type: 'open', listener: () => void): void;
|
|
86
|
+
addEventListener(type: 'message', listener: (event: {
|
|
87
|
+
data: unknown;
|
|
88
|
+
}) => void): void;
|
|
89
|
+
addEventListener(type: 'close', listener: (event: {
|
|
90
|
+
code?: number;
|
|
91
|
+
reason?: string;
|
|
92
|
+
}) => void): void;
|
|
93
|
+
addEventListener(type: 'error', listener: (event: unknown) => void): void;
|
|
94
|
+
}
|
|
95
|
+
export type LiveSocketFactory = (url: string, headers: Record<string, string>) => LiveSocket;
|
|
96
|
+
export declare class LiveSession {
|
|
97
|
+
private readonly config;
|
|
98
|
+
private readonly onEvent;
|
|
99
|
+
private readonly socketFactory;
|
|
100
|
+
private socket;
|
|
101
|
+
private state;
|
|
102
|
+
private eventSeq;
|
|
103
|
+
private closedEmitted;
|
|
104
|
+
private lastUsageSeconds;
|
|
105
|
+
private onClosed;
|
|
106
|
+
sessionId: string | null;
|
|
107
|
+
expiresAt: number | null;
|
|
108
|
+
constructor(config: LiveSessionConfig, onEvent: (event: LiveSessionEvent) => void, socketFactory?: LiveSocketFactory);
|
|
109
|
+
get started(): boolean;
|
|
110
|
+
/** Opens the socket and resolves once `session.started` arrives. */
|
|
111
|
+
start(timeoutMs?: number): Promise<void>;
|
|
112
|
+
appendAudio(samples: Int16Array): void;
|
|
113
|
+
/** Quiet context the model may use later without saying it now. */
|
|
114
|
+
appendThinking(content: string, delegationId?: string | null): string | null;
|
|
115
|
+
/** Information the model should say aloud, in its own words. */
|
|
116
|
+
appendCommentary(content: string, delegationId?: string | null): string | null;
|
|
117
|
+
/** Trusted instructions; can interrupt speech in progress. */
|
|
118
|
+
appendInstructions(content: string, delegationId?: string | null): string | null;
|
|
119
|
+
setInputMuted(muted: boolean): void;
|
|
120
|
+
/**
|
|
121
|
+
* Graceful close: `session.close`, then wait for `session.closed` (final
|
|
122
|
+
* usage) up to `timeoutMs` before dropping the socket.
|
|
123
|
+
*/
|
|
124
|
+
close(timeoutMs?: number): Promise<void>;
|
|
125
|
+
private handleMessage;
|
|
126
|
+
private sendAppend;
|
|
127
|
+
private emitClosed;
|
|
128
|
+
private sendRaw;
|
|
129
|
+
private abortSocket;
|
|
130
|
+
private nextEventId;
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=session.d.ts.map
|