dvgateway-adapters 1.3.9 → 1.4.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.
@@ -0,0 +1,196 @@
1
+ /**
2
+ * Google Gemini Live API — Speech-to-Speech Adapter
3
+ *
4
+ * Implements a direct speech-to-speech pipeline using Google's Gemini Live API
5
+ * (BidiGenerateContent). This adapter is a drop-in alternative to
6
+ * OpenAIRealtimeAdapter — same RealtimeSpeechAdapter interface, same callbacks,
7
+ * same pipelineType="s2s" dashboard integration.
8
+ *
9
+ * Architecture:
10
+ *
11
+ * DVGateway audio in (16kHz PCM)
12
+ * ↓ (Gemini Live native input rate — no resampling needed)
13
+ * Gemini Live API (WebSocket)
14
+ * ↓ gemini-live-2.5-flash-preview processes speech end-to-end
15
+ * DVGateway audio out (24kHz → 16kHz downsample)
16
+ * ↓
17
+ * TTS injector → call audio
18
+ *
19
+ * Supported endpoints (choose via `endpoint` option):
20
+ * - "ai-studio" (default): AI Studio global endpoint
21
+ * wss://generativelanguage.googleapis.com/ws/.../BidiGenerateContent?key=KEY
22
+ * - "vertex": Vertex AI regional endpoint
23
+ * wss://{LOCATION}-aiplatform.googleapis.com/ws/.../BidiGenerateContent
24
+ * (requires Bearer access token via `accessToken` option)
25
+ *
26
+ * Audio format:
27
+ * Input: PCM16 16kHz mono, base64-encoded, MIME "audio/pcm;rate=16000"
28
+ * Output: PCM16 24kHz mono, base64-encoded (downsampled to 16kHz for DVGateway)
29
+ *
30
+ * Key differences vs OpenAIRealtimeAdapter:
31
+ * - Input rate matches DVGateway natively (no upsample)
32
+ * - Message schema is BidiGenerateContent proto-JSON, not OpenAI events
33
+ * - Server-side VAD signals are implicit — we infer speech activity from
34
+ * `interrupted` / `turnComplete` server messages (best-effort). For precise
35
+ * VAD, set `turnDetection.mode = "none"` and call `sendActivityStart()` /
36
+ * `sendActivityEnd()` manually.
37
+ *
38
+ * API Reference:
39
+ * https://ai.google.dev/gemini-api/docs/live-api
40
+ * https://ai.google.dev/api/live
41
+ */
42
+ import type { AudioChunk, TranscriptResult } from 'dvgateway-sdk';
43
+ import type { RealtimeSpeechAdapter, RealtimeSpeechActivityEvent, RealtimeToolCall } from './openai-realtime.js';
44
+ /**
45
+ * Prebuilt voice names supported by Gemini Live (half-cascade models).
46
+ * Native-audio models support more voices (Google Cloud TTS full catalog),
47
+ * but these 8 are the portable defaults available on both paths.
48
+ * Reference: https://ai.google.dev/gemini-api/docs/live-api/capabilities
49
+ */
50
+ export type GeminiLiveVoice = 'Puck' | 'Charon' | 'Kore' | 'Fenrir' | 'Aoede' | 'Leda' | 'Orus' | 'Zephyr';
51
+ /** Gemini Live API model identifiers (as of 2026-04). */
52
+ export type GeminiLiveModel = 'gemini-live-2.5-flash-preview' | 'gemini-2.5-flash-native-audio' | 'gemini-2.0-flash-live-001';
53
+ export type GeminiLiveEndpoint = 'ai-studio' | 'vertex';
54
+ export type GeminiLiveTurnDetectionMode = 'server_vad' | 'none';
55
+ export interface GeminiLiveTurnDetectionOptions {
56
+ /**
57
+ * Turn detection strategy.
58
+ * - "server_vad" (default): Gemini's server-side VAD auto-detects speech
59
+ * boundaries and barge-in. No manual activityStart/End required.
60
+ * - "none": client is responsible — set automaticActivityDetection.disabled
61
+ * and call sendActivityStart() / sendActivityEnd() yourself.
62
+ */
63
+ mode?: GeminiLiveTurnDetectionMode;
64
+ /** VAD start-of-speech sensitivity (LOW/MEDIUM/HIGH). Default: MEDIUM. */
65
+ startSensitivity?: 'LOW' | 'MEDIUM' | 'HIGH';
66
+ /** VAD end-of-speech sensitivity (LOW/MEDIUM/HIGH). Default: MEDIUM. */
67
+ endSensitivity?: 'LOW' | 'MEDIUM' | 'HIGH';
68
+ /** Prefix padding in ms applied before detected speech start. Default: 200. */
69
+ prefixPaddingMs?: number;
70
+ /** Silence duration in ms before turn is considered ended. Default: 800. */
71
+ silenceDurationMs?: number;
72
+ }
73
+ /** Function/tool declaration for Gemini Live (same schema as Gemini Generative API). */
74
+ export interface GeminiLiveTool {
75
+ name: string;
76
+ description?: string;
77
+ /** JSON Schema describing the function parameters. */
78
+ parameters?: Record<string, unknown>;
79
+ }
80
+ export interface GeminiLiveAdapterOptions {
81
+ /** API key for AI Studio endpoint (required if endpoint="ai-studio"). */
82
+ apiKey?: string;
83
+ /** Bearer access token for Vertex endpoint (required if endpoint="vertex"). */
84
+ accessToken?: string;
85
+ /** Vertex AI project ID (required if endpoint="vertex"). */
86
+ project?: string;
87
+ /** Vertex AI location, e.g. "asia-northeast1" (required if endpoint="vertex"). */
88
+ location?: string;
89
+ /**
90
+ * Which Gemini Live endpoint to use.
91
+ * - "ai-studio" (default): global AI Studio, API key auth.
92
+ * - "vertex": regional Vertex AI, Bearer token auth, project/location required.
93
+ */
94
+ endpoint?: GeminiLiveEndpoint;
95
+ /**
96
+ * Model (default: "gemini-live-2.5-flash-preview").
97
+ * For Vertex AI this will be normalized to the full resource path internally.
98
+ */
99
+ model?: GeminiLiveModel;
100
+ /** Voice for the AI response (default: "Puck"). */
101
+ voice?: GeminiLiveVoice;
102
+ /**
103
+ * System instructions. Equivalent to OpenAI's `instructions` field.
104
+ * Default: generic voice assistant prompt.
105
+ */
106
+ instructions?: string;
107
+ /** Turn detection configuration — see GeminiLiveTurnDetectionOptions. */
108
+ turnDetection?: GeminiLiveTurnDetectionOptions;
109
+ /**
110
+ * Enable input (user) audio transcription (default: true).
111
+ * Emits TranscriptResult events with speaker="customer".
112
+ */
113
+ inputTranscription?: boolean;
114
+ /**
115
+ * Enable output (assistant) audio transcription (default: true).
116
+ * Emits TranscriptResult events with speaker="agent".
117
+ */
118
+ outputTranscription?: boolean;
119
+ /**
120
+ * BCP-47 language hint for transcription (default: empty — auto-detect).
121
+ * E.g. "ko-KR", "en-US". Gemini is strong on multilingual inference but
122
+ * a hint improves accuracy for short utterances.
123
+ */
124
+ language?: string;
125
+ /** Response temperature (default: 0.8). Gemini accepts 0.0–2.0. */
126
+ temperature?: number;
127
+ /** Maximum response output tokens. Default: no cap. */
128
+ maxOutputTokens?: number;
129
+ /** Tools the model can call during the session. */
130
+ tools?: GeminiLiveTool[];
131
+ }
132
+ export declare class GeminiLiveAdapter implements RealtimeSpeechAdapter {
133
+ private readonly opts;
134
+ private readonly tools;
135
+ private audioOutputHandler;
136
+ private transcriptHandler;
137
+ private errorHandler;
138
+ private toolCallHandler;
139
+ private speechActivityHandler;
140
+ private readonly sessions;
141
+ /** Per-session input transcript accumulator (Gemini streams text incrementally) */
142
+ private readonly inputTranscriptBuf;
143
+ /** Per-session output transcript accumulator */
144
+ private readonly outputTranscriptBuf;
145
+ /** Per-session "caller speaking" state (for synthetic onSpeechActivity events) */
146
+ private readonly callerSpeaking;
147
+ private stopped;
148
+ constructor(opts: GeminiLiveAdapterOptions);
149
+ onAudioOutput(handler: (chunk: Buffer, linkedId: string) => void): void;
150
+ onTranscript(handler: (result: TranscriptResult) => void): void;
151
+ onError(handler: (err: Error, linkedId?: string) => void): void;
152
+ onToolCall(handler: (toolCall: RealtimeToolCall) => void): void;
153
+ /**
154
+ * Register a handler for speech activity events.
155
+ *
156
+ * Gemini Live does NOT emit explicit speech_started/stopped events like
157
+ * OpenAI Realtime. This adapter approximates speech activity from the
158
+ * following server signals:
159
+ *
160
+ * - `serverContent.interrupted=true` → caller started speaking while AI was
161
+ * responding (barge-in). Fires `{ side: "caller", speaking: true }`.
162
+ * - `serverContent.turnComplete=true` → turn boundary reached. Fires
163
+ * `{ side: "caller", speaking: false }` if the caller was marked speaking.
164
+ *
165
+ * For precise VAD, set `turnDetection.mode = "none"` and call
166
+ * `sendActivityStart()` / `sendActivityEnd()` manually from your own VAD
167
+ * logic — those methods fire this callback synchronously with the server message.
168
+ */
169
+ onSpeechActivity(handler: (event: RealtimeSpeechActivityEvent) => void): void;
170
+ /**
171
+ * Submit a tool call result back to the model.
172
+ * Call this after receiving a tool call via onToolCall().
173
+ */
174
+ submitToolResult(linkedId: string, callId: string, result: unknown): void;
175
+ /**
176
+ * Mark the start of caller speech (manual VAD mode only).
177
+ * Sends a `realtime_input.activity_start` message to Gemini and fires the
178
+ * onSpeechActivity callback. No-op if turnDetection.mode !== "none".
179
+ */
180
+ sendActivityStart(linkedId: string): void;
181
+ /**
182
+ * Mark the end of caller speech (manual VAD mode only).
183
+ * Sends a `realtime_input.activity_end` message to Gemini and fires the
184
+ * onSpeechActivity callback. No-op if turnDetection.mode !== "none".
185
+ */
186
+ sendActivityEnd(linkedId: string): void;
187
+ startSession(linkedId: string, audioIn: AsyncIterable<AudioChunk>): Promise<void>;
188
+ stop(linkedId?: string): Promise<void>;
189
+ private resolveModelPath;
190
+ private buildRealtimeInputConfig;
191
+ private connectLive;
192
+ private pipeAudioIn;
193
+ private handleServerMessage;
194
+ private sendMessage;
195
+ }
196
+ //# sourceMappingURL=gemini-live.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini-live.d.ts","sourceRoot":"","sources":["../../src/realtime/gemini-live.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,461 @@
1
+ /**
2
+ * Google Gemini Live API — Speech-to-Speech Adapter
3
+ *
4
+ * Implements a direct speech-to-speech pipeline using Google's Gemini Live API
5
+ * (BidiGenerateContent). This adapter is a drop-in alternative to
6
+ * OpenAIRealtimeAdapter — same RealtimeSpeechAdapter interface, same callbacks,
7
+ * same pipelineType="s2s" dashboard integration.
8
+ *
9
+ * Architecture:
10
+ *
11
+ * DVGateway audio in (16kHz PCM)
12
+ * ↓ (Gemini Live native input rate — no resampling needed)
13
+ * Gemini Live API (WebSocket)
14
+ * ↓ gemini-live-2.5-flash-preview processes speech end-to-end
15
+ * DVGateway audio out (24kHz → 16kHz downsample)
16
+ * ↓
17
+ * TTS injector → call audio
18
+ *
19
+ * Supported endpoints (choose via `endpoint` option):
20
+ * - "ai-studio" (default): AI Studio global endpoint
21
+ * wss://generativelanguage.googleapis.com/ws/.../BidiGenerateContent?key=KEY
22
+ * - "vertex": Vertex AI regional endpoint
23
+ * wss://{LOCATION}-aiplatform.googleapis.com/ws/.../BidiGenerateContent
24
+ * (requires Bearer access token via `accessToken` option)
25
+ *
26
+ * Audio format:
27
+ * Input: PCM16 16kHz mono, base64-encoded, MIME "audio/pcm;rate=16000"
28
+ * Output: PCM16 24kHz mono, base64-encoded (downsampled to 16kHz for DVGateway)
29
+ *
30
+ * Key differences vs OpenAIRealtimeAdapter:
31
+ * - Input rate matches DVGateway natively (no upsample)
32
+ * - Message schema is BidiGenerateContent proto-JSON, not OpenAI events
33
+ * - Server-side VAD signals are implicit — we infer speech activity from
34
+ * `interrupted` / `turnComplete` server messages (best-effort). For precise
35
+ * VAD, set `turnDetection.mode = "none"` and call `sendActivityStart()` /
36
+ * `sendActivityEnd()` manually.
37
+ *
38
+ * API Reference:
39
+ * https://ai.google.dev/gemini-api/docs/live-api
40
+ * https://ai.google.dev/api/live
41
+ */
42
+ import WebSocket from 'ws';
43
+ import { resample, float32ToSlin16, slin16ToFloat32 } from 'dvgateway-sdk';
44
+ // ─── Implementation ──────────────────────────────────────────────────────────
45
+ const AI_STUDIO_URL = 'wss://generativelanguage.googleapis.com/ws/google.ai.generativelanguage.v1beta.GenerativeService.BidiGenerateContent';
46
+ const GEMINI_OUTPUT_SAMPLE_RATE = 24000;
47
+ const DV_SAMPLE_RATE = 16000;
48
+ const INPUT_CHUNK_MS = 20;
49
+ const INPUT_SAMPLES_16K = Math.round(DV_SAMPLE_RATE * INPUT_CHUNK_MS / 1000); // 320 samples
50
+ export class GeminiLiveAdapter {
51
+ opts;
52
+ tools;
53
+ audioOutputHandler = null;
54
+ transcriptHandler = null;
55
+ errorHandler = null;
56
+ toolCallHandler = null;
57
+ speechActivityHandler = null;
58
+ sessions = new Map();
59
+ /** Per-session input transcript accumulator (Gemini streams text incrementally) */
60
+ inputTranscriptBuf = new Map();
61
+ /** Per-session output transcript accumulator */
62
+ outputTranscriptBuf = new Map();
63
+ /** Per-session "caller speaking" state (for synthetic onSpeechActivity events) */
64
+ callerSpeaking = new Map();
65
+ stopped = false;
66
+ constructor(opts) {
67
+ const endpoint = opts.endpoint ?? 'ai-studio';
68
+ if (endpoint === 'ai-studio' && !opts.apiKey) {
69
+ throw new Error('GeminiLiveAdapter: apiKey is required when endpoint="ai-studio"');
70
+ }
71
+ if (endpoint === 'vertex' && (!opts.accessToken || !opts.project || !opts.location)) {
72
+ throw new Error('GeminiLiveAdapter: accessToken, project, and location are required when endpoint="vertex"');
73
+ }
74
+ this.opts = {
75
+ endpoint,
76
+ apiKey: opts.apiKey ?? '',
77
+ accessToken: opts.accessToken ?? '',
78
+ project: opts.project ?? '',
79
+ location: opts.location ?? '',
80
+ model: opts.model ?? 'gemini-live-2.5-flash-preview',
81
+ voice: opts.voice ?? 'Puck',
82
+ instructions: opts.instructions ??
83
+ 'You are a helpful voice assistant. Keep answers concise and conversational.',
84
+ turnDetection: opts.turnDetection ?? {},
85
+ inputTranscription: opts.inputTranscription ?? true,
86
+ outputTranscription: opts.outputTranscription ?? true,
87
+ language: opts.language ?? '',
88
+ temperature: opts.temperature ?? 0.8,
89
+ maxOutputTokens: opts.maxOutputTokens ?? null,
90
+ };
91
+ this.tools = opts.tools ?? [];
92
+ }
93
+ onAudioOutput(handler) {
94
+ this.audioOutputHandler = handler;
95
+ }
96
+ onTranscript(handler) {
97
+ this.transcriptHandler = handler;
98
+ }
99
+ onError(handler) {
100
+ this.errorHandler = handler;
101
+ }
102
+ onToolCall(handler) {
103
+ this.toolCallHandler = handler;
104
+ }
105
+ /**
106
+ * Register a handler for speech activity events.
107
+ *
108
+ * Gemini Live does NOT emit explicit speech_started/stopped events like
109
+ * OpenAI Realtime. This adapter approximates speech activity from the
110
+ * following server signals:
111
+ *
112
+ * - `serverContent.interrupted=true` → caller started speaking while AI was
113
+ * responding (barge-in). Fires `{ side: "caller", speaking: true }`.
114
+ * - `serverContent.turnComplete=true` → turn boundary reached. Fires
115
+ * `{ side: "caller", speaking: false }` if the caller was marked speaking.
116
+ *
117
+ * For precise VAD, set `turnDetection.mode = "none"` and call
118
+ * `sendActivityStart()` / `sendActivityEnd()` manually from your own VAD
119
+ * logic — those methods fire this callback synchronously with the server message.
120
+ */
121
+ onSpeechActivity(handler) {
122
+ this.speechActivityHandler = handler;
123
+ }
124
+ /**
125
+ * Submit a tool call result back to the model.
126
+ * Call this after receiving a tool call via onToolCall().
127
+ */
128
+ submitToolResult(linkedId, callId, result) {
129
+ const ws = this.sessions.get(linkedId);
130
+ if (!ws || ws.readyState !== WebSocket.OPEN)
131
+ return;
132
+ // Gemini tool_response schema: functionResponses[].response is a struct
133
+ const response = typeof result === 'object' && result !== null
134
+ ? result
135
+ : { result };
136
+ this.sendMessage(ws, {
137
+ tool_response: {
138
+ function_responses: [{ id: callId, name: '', response }],
139
+ },
140
+ });
141
+ }
142
+ /**
143
+ * Mark the start of caller speech (manual VAD mode only).
144
+ * Sends a `realtime_input.activity_start` message to Gemini and fires the
145
+ * onSpeechActivity callback. No-op if turnDetection.mode !== "none".
146
+ */
147
+ sendActivityStart(linkedId) {
148
+ const ws = this.sessions.get(linkedId);
149
+ if (!ws || ws.readyState !== WebSocket.OPEN)
150
+ return;
151
+ if (this.opts.turnDetection.mode !== 'none')
152
+ return;
153
+ this.sendMessage(ws, { realtime_input: { activity_start: {} } });
154
+ this.callerSpeaking.set(linkedId, true);
155
+ this.speechActivityHandler?.({
156
+ linkedId,
157
+ side: 'caller',
158
+ speaking: true,
159
+ timestampMs: Date.now(),
160
+ });
161
+ }
162
+ /**
163
+ * Mark the end of caller speech (manual VAD mode only).
164
+ * Sends a `realtime_input.activity_end` message to Gemini and fires the
165
+ * onSpeechActivity callback. No-op if turnDetection.mode !== "none".
166
+ */
167
+ sendActivityEnd(linkedId) {
168
+ const ws = this.sessions.get(linkedId);
169
+ if (!ws || ws.readyState !== WebSocket.OPEN)
170
+ return;
171
+ if (this.opts.turnDetection.mode !== 'none')
172
+ return;
173
+ this.sendMessage(ws, { realtime_input: { activity_end: {} } });
174
+ this.callerSpeaking.set(linkedId, false);
175
+ this.speechActivityHandler?.({
176
+ linkedId,
177
+ side: 'caller',
178
+ speaking: false,
179
+ timestampMs: Date.now(),
180
+ });
181
+ }
182
+ async startSession(linkedId, audioIn) {
183
+ this.stopped = false;
184
+ const ws = await this.connectLive(linkedId);
185
+ this.sessions.set(linkedId, ws);
186
+ this.inputTranscriptBuf.set(linkedId, '');
187
+ this.outputTranscriptBuf.set(linkedId, '');
188
+ this.callerSpeaking.set(linkedId, false);
189
+ // ── Send initial setup message ──
190
+ const setupMsg = {
191
+ setup: {
192
+ model: this.resolveModelPath(),
193
+ generation_config: {
194
+ response_modalities: ['AUDIO'],
195
+ speech_config: {
196
+ voice_config: {
197
+ prebuilt_voice_config: { voice_name: this.opts.voice },
198
+ },
199
+ ...(this.opts.language && { language_code: this.opts.language }),
200
+ },
201
+ temperature: this.opts.temperature,
202
+ ...(this.opts.maxOutputTokens !== null && {
203
+ max_output_tokens: this.opts.maxOutputTokens,
204
+ }),
205
+ },
206
+ system_instruction: {
207
+ parts: [{ text: this.opts.instructions }],
208
+ },
209
+ realtime_input_config: this.buildRealtimeInputConfig(),
210
+ ...(this.opts.inputTranscription && { input_audio_transcription: {} }),
211
+ ...(this.opts.outputTranscription && { output_audio_transcription: {} }),
212
+ ...(this.tools.length > 0 && {
213
+ tools: [
214
+ {
215
+ function_declarations: this.tools.map((t) => ({
216
+ name: t.name,
217
+ description: t.description,
218
+ ...(t.parameters && { parameters: t.parameters }),
219
+ })),
220
+ },
221
+ ],
222
+ }),
223
+ },
224
+ };
225
+ this.sendMessage(ws, setupMsg);
226
+ // Pipe audio in background
227
+ void this.pipeAudioIn(linkedId, ws, audioIn);
228
+ // Wait until WS closes or stop() is called
229
+ await new Promise((resolve) => {
230
+ ws.once('close', resolve);
231
+ const check = setInterval(() => {
232
+ if (this.stopped || !this.sessions.has(linkedId)) {
233
+ clearInterval(check);
234
+ resolve();
235
+ }
236
+ }, 100);
237
+ });
238
+ }
239
+ async stop(linkedId) {
240
+ if (linkedId) {
241
+ const ws = this.sessions.get(linkedId);
242
+ if (ws && ws.readyState === WebSocket.OPEN) {
243
+ ws.close(1000, 'session ended');
244
+ }
245
+ this.sessions.delete(linkedId);
246
+ this.inputTranscriptBuf.delete(linkedId);
247
+ this.outputTranscriptBuf.delete(linkedId);
248
+ this.callerSpeaking.delete(linkedId);
249
+ }
250
+ else {
251
+ this.stopped = true;
252
+ for (const [id, ws] of this.sessions) {
253
+ if (ws.readyState === WebSocket.OPEN) {
254
+ ws.close(1000, 'adapter stopped');
255
+ }
256
+ this.sessions.delete(id);
257
+ this.inputTranscriptBuf.delete(id);
258
+ this.outputTranscriptBuf.delete(id);
259
+ this.callerSpeaking.delete(id);
260
+ }
261
+ }
262
+ }
263
+ // ── Private helpers ─────────────────────────────────────────────────────
264
+ resolveModelPath() {
265
+ if (this.opts.endpoint === 'vertex') {
266
+ return `projects/${this.opts.project}/locations/${this.opts.location}/publishers/google/models/${this.opts.model}`;
267
+ }
268
+ // AI Studio expects "models/MODEL_ID"
269
+ return `models/${this.opts.model}`;
270
+ }
271
+ buildRealtimeInputConfig() {
272
+ const td = this.opts.turnDetection;
273
+ if (td.mode === 'none') {
274
+ return {
275
+ automatic_activity_detection: { disabled: true },
276
+ };
277
+ }
278
+ const cfg = { automatic_activity_detection: { disabled: false } };
279
+ const vad = {};
280
+ if (td.startSensitivity)
281
+ vad.start_of_speech_sensitivity = `START_SENSITIVITY_${td.startSensitivity}`;
282
+ if (td.endSensitivity)
283
+ vad.end_of_speech_sensitivity = `END_SENSITIVITY_${td.endSensitivity}`;
284
+ if (td.prefixPaddingMs != null)
285
+ vad.prefix_padding_ms = td.prefixPaddingMs;
286
+ if (td.silenceDurationMs != null)
287
+ vad.silence_duration_ms = td.silenceDurationMs;
288
+ if (Object.keys(vad).length > 0) {
289
+ cfg.automatic_activity_detection = { disabled: false, ...vad };
290
+ }
291
+ return cfg;
292
+ }
293
+ async connectLive(linkedId) {
294
+ let url;
295
+ const headers = {};
296
+ if (this.opts.endpoint === 'vertex') {
297
+ url = `wss://${this.opts.location}-aiplatform.googleapis.com/ws/google.cloud.aiplatform.v1.LlmBidiService/BidiGenerateContent`;
298
+ headers['Authorization'] = `Bearer ${this.opts.accessToken}`;
299
+ }
300
+ else {
301
+ url = `${AI_STUDIO_URL}?key=${encodeURIComponent(this.opts.apiKey)}`;
302
+ }
303
+ const ws = new WebSocket(url, { headers });
304
+ ws.on('message', (data) => {
305
+ try {
306
+ const msg = JSON.parse(data.toString());
307
+ this.handleServerMessage(msg, linkedId);
308
+ }
309
+ catch {
310
+ // Ignore malformed JSON
311
+ }
312
+ });
313
+ ws.on('error', (err) => {
314
+ this.errorHandler?.(err, linkedId);
315
+ });
316
+ ws.on('close', () => {
317
+ this.sessions.delete(linkedId);
318
+ });
319
+ await new Promise((resolve, reject) => {
320
+ ws.once('open', resolve);
321
+ ws.once('error', reject);
322
+ });
323
+ return ws;
324
+ }
325
+ async pipeAudioIn(linkedId, ws, audioIn) {
326
+ for await (const chunk of audioIn) {
327
+ if (this.stopped || ws.readyState !== WebSocket.OPEN)
328
+ break;
329
+ // DVGateway is 16kHz; Gemini Live input is 16kHz → no resampling needed.
330
+ // (Keep the resample call guarded for forward compatibility if DV changes.)
331
+ const samples16k = chunk.sampleRate === DV_SAMPLE_RATE
332
+ ? chunk.samples
333
+ : resample(chunk.samples, chunk.sampleRate, DV_SAMPLE_RATE);
334
+ // Split into 20ms frames and send
335
+ let offset = 0;
336
+ while (offset < samples16k.length) {
337
+ const end = Math.min(offset + INPUT_SAMPLES_16K, samples16k.length);
338
+ const frame = samples16k.subarray(offset, end);
339
+ offset = end;
340
+ const pcm16 = float32ToSlin16(frame);
341
+ const b64 = Buffer.from(pcm16.buffer, pcm16.byteOffset, pcm16.byteLength).toString('base64');
342
+ this.sendMessage(ws, {
343
+ realtime_input: {
344
+ media_chunks: [
345
+ { mime_type: 'audio/pcm;rate=16000', data: b64 },
346
+ ],
347
+ },
348
+ });
349
+ }
350
+ }
351
+ }
352
+ handleServerMessage(msg, linkedId) {
353
+ // ── setupComplete: ready to stream audio ──
354
+ if (msg.setupComplete) {
355
+ return;
356
+ }
357
+ // ── serverContent: main response channel ──
358
+ if (msg.serverContent) {
359
+ const sc = msg.serverContent;
360
+ // Audio output (modelTurn.parts[].inlineData)
361
+ if (sc.modelTurn?.parts) {
362
+ for (const part of sc.modelTurn.parts) {
363
+ if (part.inlineData?.data) {
364
+ // Gemini outputs PCM16 at 24kHz — downsample to DVGateway's 16kHz
365
+ const pcm24kBuf = Buffer.from(part.inlineData.data, 'base64');
366
+ const samples24k = slin16ToFloat32(pcm24kBuf);
367
+ const samples16k = resample(samples24k, GEMINI_OUTPUT_SAMPLE_RATE, DV_SAMPLE_RATE);
368
+ const pcm16k = float32ToSlin16(samples16k);
369
+ this.audioOutputHandler?.(Buffer.from(pcm16k.buffer, pcm16k.byteOffset, pcm16k.byteLength), linkedId);
370
+ }
371
+ // Text parts are ignored in audio-only mode (still present for tool-call context)
372
+ }
373
+ }
374
+ // Interruption: caller barge-in detected by server-side VAD
375
+ if (sc.interrupted === true) {
376
+ if (!this.callerSpeaking.get(linkedId)) {
377
+ this.callerSpeaking.set(linkedId, true);
378
+ this.speechActivityHandler?.({
379
+ linkedId,
380
+ side: 'caller',
381
+ speaking: true,
382
+ timestampMs: Date.now(),
383
+ });
384
+ }
385
+ }
386
+ // Turn complete: AI finished generating → if caller was marked speaking, clear it
387
+ if (sc.turnComplete === true || sc.generationComplete === true) {
388
+ if (this.callerSpeaking.get(linkedId)) {
389
+ this.callerSpeaking.set(linkedId, false);
390
+ this.speechActivityHandler?.({
391
+ linkedId,
392
+ side: 'caller',
393
+ speaking: false,
394
+ timestampMs: Date.now(),
395
+ });
396
+ }
397
+ }
398
+ // Input transcription (caller speech → text, streamed incrementally)
399
+ if (sc.inputTranscription?.text != null) {
400
+ const prev = this.inputTranscriptBuf.get(linkedId) ?? '';
401
+ const next = prev + sc.inputTranscription.text;
402
+ this.inputTranscriptBuf.set(linkedId, next);
403
+ // Emit as finalized on turnComplete (below); for now just accumulate
404
+ }
405
+ // Output transcription (assistant speech → text, streamed incrementally)
406
+ if (sc.outputTranscription?.text != null) {
407
+ const prev = this.outputTranscriptBuf.get(linkedId) ?? '';
408
+ const next = prev + sc.outputTranscription.text;
409
+ this.outputTranscriptBuf.set(linkedId, next);
410
+ }
411
+ // On turn completion, flush accumulated transcripts as final results
412
+ if (sc.turnComplete === true) {
413
+ const inputText = this.inputTranscriptBuf.get(linkedId) ?? '';
414
+ if (inputText.trim()) {
415
+ this.transcriptHandler?.({
416
+ linkedId,
417
+ text: inputText,
418
+ isFinal: true,
419
+ speaker: 'customer',
420
+ timestampMs: Date.now(),
421
+ });
422
+ }
423
+ const outputText = this.outputTranscriptBuf.get(linkedId) ?? '';
424
+ if (outputText.trim()) {
425
+ this.transcriptHandler?.({
426
+ linkedId,
427
+ text: outputText,
428
+ isFinal: true,
429
+ speaker: 'agent',
430
+ timestampMs: Date.now(),
431
+ });
432
+ }
433
+ this.inputTranscriptBuf.set(linkedId, '');
434
+ this.outputTranscriptBuf.set(linkedId, '');
435
+ }
436
+ }
437
+ // ── toolCall: model wants to invoke a function ──
438
+ if (msg.toolCall?.functionCalls) {
439
+ for (const fc of msg.toolCall.functionCalls) {
440
+ if (fc.name) {
441
+ this.toolCallHandler?.({
442
+ callId: fc.id ?? '',
443
+ name: fc.name,
444
+ args: fc.args ?? {},
445
+ linkedId,
446
+ });
447
+ }
448
+ }
449
+ }
450
+ // ── goAway: session will close soon (quota / deployment boundary) ──
451
+ if (msg.goAway) {
452
+ this.errorHandler?.(new Error(`Gemini Live goAway: session closing in ${msg.goAway.timeLeft ?? 'unknown'}`), linkedId);
453
+ }
454
+ }
455
+ sendMessage(ws, obj) {
456
+ if (ws.readyState === WebSocket.OPEN) {
457
+ ws.send(JSON.stringify(obj));
458
+ }
459
+ }
460
+ }
461
+ //# sourceMappingURL=gemini-live.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini-live.js","sourceRoot":"","sources":["../../src/realtime/gemini-live.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,5 @@
1
1
  export { OpenAIRealtimeAdapter } from './openai-realtime.js';
2
2
  export type { OpenAIRealtimeAdapterOptions, OpenAIRealtimeVoice, OpenAIRealtimeTurnDetectionMode, OpenAIRealtimeTurnDetectionOptions, OpenAIRealtimeTool, RealtimeToolCall, RealtimeSpeechActivityEvent, RealtimeSpeechAdapter, } from './openai-realtime.js';
3
+ export { GeminiLiveAdapter } from './gemini-live.js';
4
+ export type { GeminiLiveAdapterOptions, GeminiLiveVoice, GeminiLiveModel, GeminiLiveEndpoint, GeminiLiveTurnDetectionMode, GeminiLiveTurnDetectionOptions, GeminiLiveTool, } from './gemini-live.js';
3
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/realtime/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,YAAY,EACV,4BAA4B,EAC5B,mBAAmB,EACnB,+BAA+B,EAC/B,kCAAkC,EAClC,kBAAkB,EAClB,gBAAgB,EAChB,2BAA2B,EAC3B,qBAAqB,GACtB,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/realtime/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,YAAY,EACV,4BAA4B,EAC5B,mBAAmB,EACnB,+BAA+B,EAC/B,kCAAkC,EAClC,kBAAkB,EAClB,gBAAgB,EAChB,2BAA2B,EAC3B,qBAAqB,GACtB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,YAAY,EACV,wBAAwB,EACxB,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,2BAA2B,EAC3B,8BAA8B,EAC9B,cAAc,GACf,MAAM,kBAAkB,CAAC"}
@@ -1,3 +1,4 @@
1
1
  // Realtime speech-to-speech adapters
2
2
  export { OpenAIRealtimeAdapter } from './openai-realtime.js';
3
+ export { GeminiLiveAdapter } from './gemini-live.js';
3
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/realtime/index.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/realtime/index.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAY7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dvgateway-adapters",
3
- "version": "1.3.9",
3
+ "version": "1.4.1",
4
4
  "description": "AI service adapters for DVGateway SDK (Deepgram, ElevenLabs, Anthropic, OpenAI, OpenAI Realtime)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",