@ariaflowagents/livekit-plugin 0.9.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.
Files changed (154) hide show
  1. package/README.md +155 -0
  2. package/dist/agent/AriaFlowAgent.d.ts +11 -0
  3. package/dist/agent/AriaFlowAgent.d.ts.map +1 -0
  4. package/dist/agent/AriaFlowAgent.js +22 -0
  5. package/dist/agent/AriaFlowAgent.js.map +1 -0
  6. package/dist/audio_byte_stream.d.ts +29 -0
  7. package/dist/audio_byte_stream.d.ts.map +1 -0
  8. package/dist/audio_byte_stream.js +62 -0
  9. package/dist/audio_byte_stream.js.map +1 -0
  10. package/dist/audio_frame.d.ts +2 -0
  11. package/dist/audio_frame.d.ts.map +1 -0
  12. package/dist/audio_frame.js +6 -0
  13. package/dist/audio_frame.js.map +1 -0
  14. package/dist/codec/g711.d.ts +14 -0
  15. package/dist/codec/g711.d.ts.map +1 -0
  16. package/dist/codec/g711.js +51 -0
  17. package/dist/codec/g711.js.map +1 -0
  18. package/dist/errors.d.ts +14 -0
  19. package/dist/errors.d.ts.map +1 -0
  20. package/dist/errors.js +27 -0
  21. package/dist/errors.js.map +1 -0
  22. package/dist/filler/FillerCoordinator.d.ts +7 -0
  23. package/dist/filler/FillerCoordinator.d.ts.map +1 -0
  24. package/dist/filler/FillerCoordinator.js +29 -0
  25. package/dist/filler/FillerCoordinator.js.map +1 -0
  26. package/dist/gemini/filler.d.ts +14 -0
  27. package/dist/gemini/filler.d.ts.map +1 -0
  28. package/dist/gemini/filler.js +48 -0
  29. package/dist/gemini/filler.js.map +1 -0
  30. package/dist/gemini/index.d.ts +4 -0
  31. package/dist/gemini/index.d.ts.map +1 -0
  32. package/dist/gemini/index.js +4 -0
  33. package/dist/gemini/index.js.map +1 -0
  34. package/dist/gemini/stt.d.ts +106 -0
  35. package/dist/gemini/stt.d.ts.map +1 -0
  36. package/dist/gemini/stt.js +528 -0
  37. package/dist/gemini/stt.js.map +1 -0
  38. package/dist/gemini/tts.d.ts +57 -0
  39. package/dist/gemini/tts.d.ts.map +1 -0
  40. package/dist/gemini/tts.js +529 -0
  41. package/dist/gemini/tts.js.map +1 -0
  42. package/dist/index.d.ts +29 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +33 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/livekit_io.d.ts +44 -0
  47. package/dist/livekit_io.d.ts.map +1 -0
  48. package/dist/livekit_io.js +101 -0
  49. package/dist/livekit_io.js.map +1 -0
  50. package/dist/llm/AriaRuntimeLLMAdapter.d.ts +65 -0
  51. package/dist/llm/AriaRuntimeLLMAdapter.d.ts.map +1 -0
  52. package/dist/llm/AriaRuntimeLLMAdapter.js +296 -0
  53. package/dist/llm/AriaRuntimeLLMAdapter.js.map +1 -0
  54. package/dist/llm/LiveKitRealtimeAdapter.d.ts +99 -0
  55. package/dist/llm/LiveKitRealtimeAdapter.d.ts.map +1 -0
  56. package/dist/llm/LiveKitRealtimeAdapter.js +206 -0
  57. package/dist/llm/LiveKitRealtimeAdapter.js.map +1 -0
  58. package/dist/metrics/bridge.d.ts +35 -0
  59. package/dist/metrics/bridge.d.ts.map +1 -0
  60. package/dist/metrics/bridge.js +89 -0
  61. package/dist/metrics/bridge.js.map +1 -0
  62. package/dist/metrics/index.d.ts +3 -0
  63. package/dist/metrics/index.d.ts.map +1 -0
  64. package/dist/metrics/index.js +2 -0
  65. package/dist/metrics/index.js.map +1 -0
  66. package/dist/metrics/types.d.ts +84 -0
  67. package/dist/metrics/types.d.ts.map +1 -0
  68. package/dist/metrics/types.js +22 -0
  69. package/dist/metrics/types.js.map +1 -0
  70. package/dist/recording/index.d.ts +4 -0
  71. package/dist/recording/index.d.ts.map +1 -0
  72. package/dist/recording/index.js +3 -0
  73. package/dist/recording/index.js.map +1 -0
  74. package/dist/recording/manager.d.ts +14 -0
  75. package/dist/recording/manager.d.ts.map +1 -0
  76. package/dist/recording/manager.js +80 -0
  77. package/dist/recording/manager.js.map +1 -0
  78. package/dist/recording/s3_adapter.d.ts +26 -0
  79. package/dist/recording/s3_adapter.d.ts.map +1 -0
  80. package/dist/recording/s3_adapter.js +120 -0
  81. package/dist/recording/s3_adapter.js.map +1 -0
  82. package/dist/recording/storage.d.ts +19 -0
  83. package/dist/recording/storage.d.ts.map +1 -0
  84. package/dist/recording/storage.js +2 -0
  85. package/dist/recording/storage.js.map +1 -0
  86. package/dist/session/AriaFlowLivekitSession.d.ts +50 -0
  87. package/dist/session/AriaFlowLivekitSession.d.ts.map +1 -0
  88. package/dist/session/AriaFlowLivekitSession.js +85 -0
  89. package/dist/session/AriaFlowLivekitSession.js.map +1 -0
  90. package/dist/session/AriaFlowVoiceSession.d.ts +71 -0
  91. package/dist/session/AriaFlowVoiceSession.d.ts.map +1 -0
  92. package/dist/session/AriaFlowVoiceSession.js +105 -0
  93. package/dist/session/AriaFlowVoiceSession.js.map +1 -0
  94. package/dist/session/createAriaFlowSession.d.ts +21 -0
  95. package/dist/session/createAriaFlowSession.d.ts.map +1 -0
  96. package/dist/session/createAriaFlowSession.js +8 -0
  97. package/dist/session/createAriaFlowSession.js.map +1 -0
  98. package/dist/session/createAriaVoicePipeline.d.ts +29 -0
  99. package/dist/session/createAriaVoicePipeline.d.ts.map +1 -0
  100. package/dist/session/createAriaVoicePipeline.js +28 -0
  101. package/dist/session/createAriaVoicePipeline.js.map +1 -0
  102. package/dist/session/voice_defaults.d.ts +34 -0
  103. package/dist/session/voice_defaults.d.ts.map +1 -0
  104. package/dist/session/voice_defaults.js +42 -0
  105. package/dist/session/voice_defaults.js.map +1 -0
  106. package/dist/session_manager.d.ts +42 -0
  107. package/dist/session_manager.d.ts.map +1 -0
  108. package/dist/session_manager.js +97 -0
  109. package/dist/session_manager.js.map +1 -0
  110. package/dist/transport_adapter.d.ts +19 -0
  111. package/dist/transport_adapter.d.ts.map +1 -0
  112. package/dist/transport_adapter.js +10 -0
  113. package/dist/transport_adapter.js.map +1 -0
  114. package/dist/turn_detection/eou_detector.d.ts +93 -0
  115. package/dist/turn_detection/eou_detector.d.ts.map +1 -0
  116. package/dist/turn_detection/eou_detector.js +190 -0
  117. package/dist/turn_detection/eou_detector.js.map +1 -0
  118. package/dist/turn_detection/eou_text_normalizer.d.ts +9 -0
  119. package/dist/turn_detection/eou_text_normalizer.d.ts.map +1 -0
  120. package/dist/turn_detection/eou_text_normalizer.js +17 -0
  121. package/dist/turn_detection/eou_text_normalizer.js.map +1 -0
  122. package/dist/turn_detection/eou_turn_detector_adapter.d.ts +40 -0
  123. package/dist/turn_detection/eou_turn_detector_adapter.d.ts.map +1 -0
  124. package/dist/turn_detection/eou_turn_detector_adapter.js +54 -0
  125. package/dist/turn_detection/eou_turn_detector_adapter.js.map +1 -0
  126. package/dist/turn_detection/index.d.ts +7 -0
  127. package/dist/turn_detection/index.d.ts.map +1 -0
  128. package/dist/turn_detection/index.js +8 -0
  129. package/dist/turn_detection/index.js.map +1 -0
  130. package/dist/turn_detection/llm_turn_marker_prompt.d.ts +13 -0
  131. package/dist/turn_detection/llm_turn_marker_prompt.d.ts.map +1 -0
  132. package/dist/turn_detection/llm_turn_marker_prompt.js +39 -0
  133. package/dist/turn_detection/llm_turn_marker_prompt.js.map +1 -0
  134. package/dist/turn_detection/llm_turn_markers.d.ts +57 -0
  135. package/dist/turn_detection/llm_turn_markers.d.ts.map +1 -0
  136. package/dist/turn_detection/llm_turn_markers.js +79 -0
  137. package/dist/turn_detection/llm_turn_markers.js.map +1 -0
  138. package/dist/turn_detection/turn_detector.d.ts +72 -0
  139. package/dist/turn_detection/turn_detector.d.ts.map +1 -0
  140. package/dist/turn_detection/turn_detector.js +84 -0
  141. package/dist/turn_detection/turn_detector.js.map +1 -0
  142. package/dist/turn_detection/vad_loader.d.ts +13 -0
  143. package/dist/turn_detection/vad_loader.d.ts.map +1 -0
  144. package/dist/turn_detection/vad_loader.js +34 -0
  145. package/dist/turn_detection/vad_loader.js.map +1 -0
  146. package/dist/types.d.ts +22 -0
  147. package/dist/types.d.ts.map +1 -0
  148. package/dist/types.js +9 -0
  149. package/dist/types.js.map +1 -0
  150. package/dist/utils/resample.d.ts +26 -0
  151. package/dist/utils/resample.d.ts.map +1 -0
  152. package/dist/utils/resample.js +48 -0
  153. package/dist/utils/resample.js.map +1 -0
  154. package/package.json +65 -0
@@ -0,0 +1,106 @@
1
+ import { type APIConnectOptions, stt } from '@livekit/agents';
2
+ interface GeminiRealtimeBlob {
3
+ data: string;
4
+ mimeType: string;
5
+ }
6
+ export interface GeminiLiveSession {
7
+ sendRealtimeInput(payload: {
8
+ audio?: GeminiRealtimeBlob;
9
+ media?: GeminiRealtimeBlob;
10
+ audioStreamEnd?: boolean;
11
+ text?: string;
12
+ }): void;
13
+ sendClientContent?(payload?: {
14
+ turns?: unknown[];
15
+ turnComplete?: boolean;
16
+ }): void;
17
+ close(): Promise<void> | void;
18
+ }
19
+ export interface GeminiLiveConnectCallbacks {
20
+ onopen?: () => void;
21
+ onmessage?: (message: unknown) => void;
22
+ onerror?: (error: unknown) => void;
23
+ onclose?: (event: unknown) => void;
24
+ }
25
+ export interface GeminiLiveClient {
26
+ live: {
27
+ connect(args: {
28
+ model: string;
29
+ config: Record<string, unknown>;
30
+ callbacks: GeminiLiveConnectCallbacks;
31
+ }): Promise<GeminiLiveSession>;
32
+ };
33
+ models?: {
34
+ generateContentStream?: (args: unknown) => Promise<AsyncIterable<unknown>>;
35
+ };
36
+ }
37
+ /**
38
+ * Runtime validation that a value conforms to the GeminiLiveClient interface.
39
+ *
40
+ * GoogleGenAI from @google/genai exposes `.live.connect()` at runtime but its
41
+ * TypeScript declarations do not include the `live` property. Instead of casting
42
+ * with `as unknown as GeminiLiveClient`, we validate the shape at construction
43
+ * time and return the narrowed type. If @google/genai changes its API surface,
44
+ * this throws immediately with a descriptive message rather than failing later
45
+ * on the first `.live.connect()` call.
46
+ */
47
+ export declare function assertGeminiLiveClient(value: unknown, label: string): GeminiLiveClient;
48
+ export interface GeminiFillerPayload {
49
+ requestId: string;
50
+ transcript: string;
51
+ filler: string;
52
+ }
53
+ export interface GeminiFillerEvent extends stt.SpeechEvent {
54
+ _geminiFillerMode: true;
55
+ }
56
+ export interface GeminiLiveSTTOptions {
57
+ apiKey?: string;
58
+ model?: string;
59
+ voice?: string;
60
+ language?: string;
61
+ interimResults?: boolean;
62
+ sampleRate?: number;
63
+ systemInstruction?: string;
64
+ /**
65
+ * Enables filler mode where Gemini returns JSON:
66
+ * `{ "transcript": string, "filler": string }`.
67
+ *
68
+ * Example:
69
+ * ```ts
70
+ * const stt = new GeminiLiveSTT({
71
+ * fillerMode: true,
72
+ * fillerPrompt: 'Return strict JSON with transcript and filler',
73
+ * });
74
+ * ```
75
+ */
76
+ fillerMode?: boolean;
77
+ fillerPrompt?: string;
78
+ fillerMinTranscriptLength?: number;
79
+ /** Number of session reconnect attempts on websocket drop. */
80
+ maxReconnectAttempts?: number;
81
+ /** For tests/mocking. Defaults to `new GoogleGenAI({ apiKey })`. */
82
+ client?: GeminiLiveClient;
83
+ }
84
+ type GeminiLiveSTTResolvedOptions = Required<Omit<GeminiLiveSTTOptions, 'client'>>;
85
+ export declare class GeminiLiveSTT extends stt.STT {
86
+ #private;
87
+ label: string;
88
+ constructor(opts?: GeminiLiveSTTOptions);
89
+ protected _recognize(): Promise<stt.SpeechEvent>;
90
+ get options(): Readonly<GeminiLiveSTTResolvedOptions>;
91
+ get client(): GeminiLiveClient;
92
+ updateOptions(opts: Partial<GeminiLiveSTTOptions>): void;
93
+ onFiller(listener: (payload: GeminiFillerPayload) => void): () => void;
94
+ emitFiller(payload: GeminiFillerPayload): void;
95
+ stream(options?: {
96
+ connOptions?: APIConnectOptions;
97
+ }): GeminiLiveSpeechStream;
98
+ }
99
+ export declare class GeminiLiveSpeechStream extends stt.SpeechStream {
100
+ #private;
101
+ label: string;
102
+ constructor(sttImpl: GeminiLiveSTT, connOptions?: APIConnectOptions);
103
+ protected run(): Promise<void>;
104
+ }
105
+ export {};
106
+ //# sourceMappingURL=stt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stt.d.ts","sourceRoot":"","sources":["../../src/gemini/stt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,528 @@
1
+ var _a;
2
+ import { AudioByteStream, Future, log, shortuuid, stt, stream as lkStream, } from '@livekit/agents';
3
+ import { GoogleGenAI, Modality } from '@google/genai';
4
+ import { buildFillerInstruction, parseFillerResponse } from './filler.js';
5
+ const DEFAULT_MODEL = 'gemini-2.5-flash-native-audio-preview-12-2025';
6
+ const DEFAULT_SAMPLE_RATE = 16000;
7
+ const DEFAULT_MAX_RECONNECT_ATTEMPTS = 3;
8
+ const DEFAULT_RECONNECT_BASE_DELAY_MS = 250;
9
+ const MAX_RECONNECT_DELAY_MS = 3000;
10
+ const RESUME_BUFFER_LIMIT = 320;
11
+ const DEFAULT_VOICE = 'Kore';
12
+ /**
13
+ * Runtime validation that a value conforms to the GeminiLiveClient interface.
14
+ *
15
+ * GoogleGenAI from @google/genai exposes `.live.connect()` at runtime but its
16
+ * TypeScript declarations do not include the `live` property. Instead of casting
17
+ * with `as unknown as GeminiLiveClient`, we validate the shape at construction
18
+ * time and return the narrowed type. If @google/genai changes its API surface,
19
+ * this throws immediately with a descriptive message rather than failing later
20
+ * on the first `.live.connect()` call.
21
+ */
22
+ export function assertGeminiLiveClient(value, label) {
23
+ if (typeof value !== 'object' ||
24
+ value === null ||
25
+ !('live' in value) ||
26
+ typeof value.live !== 'object' ||
27
+ value.live === null) {
28
+ throw new Error(`${label}: Expected a GeminiLiveClient with a .live property, ` +
29
+ `got ${typeof value}. The installed @google/genai version may have ` +
30
+ `changed its API surface.`);
31
+ }
32
+ const live = value.live;
33
+ if (typeof live.connect !== 'function') {
34
+ throw new Error(`${label}: Expected .live.connect to be a function, ` +
35
+ `got ${typeof live.connect}. The installed @google/genai version may have ` +
36
+ `changed its Live API surface.`);
37
+ }
38
+ return value;
39
+ }
40
+ function toRealtimeBlob(bytes, sampleRate) {
41
+ return {
42
+ data: Buffer.from(bytes).toString('base64'),
43
+ mimeType: `audio/pcm;rate=${sampleRate}`,
44
+ };
45
+ }
46
+ function extractTextParts(message) {
47
+ const parts = message
48
+ ?.serverContent?.modelTurn?.parts ?? [];
49
+ const texts = [];
50
+ for (const part of parts) {
51
+ if (typeof part?.text === 'string' && part.text.length > 0) {
52
+ texts.push(part.text);
53
+ }
54
+ }
55
+ return texts;
56
+ }
57
+ function extractInputTranscriptionText(message) {
58
+ const text = message?.serverContent
59
+ ?.inputTranscription?.text ?? '';
60
+ if (typeof text === 'string' && text.length > 0) {
61
+ return text;
62
+ }
63
+ return undefined;
64
+ }
65
+ function isTurnComplete(message) {
66
+ return Boolean(message?.serverContent?.turnComplete);
67
+ }
68
+ function normalizePcmBytes(frame) {
69
+ const data = frame.data;
70
+ const buf = Buffer.from(data.buffer, data.byteOffset, data.byteLength);
71
+ return new Uint8Array(buf);
72
+ }
73
+ function toArrayBuffer(bytes) {
74
+ const copy = new Uint8Array(bytes.byteLength);
75
+ copy.set(bytes);
76
+ return copy.buffer;
77
+ }
78
+ export class GeminiLiveSTT extends stt.STT {
79
+ label = 'gemini.live.STT';
80
+ #opts;
81
+ #client;
82
+ #fillerListeners = new Set();
83
+ constructor(opts = {}) {
84
+ super({
85
+ streaming: true,
86
+ interimResults: opts.interimResults ?? true,
87
+ alignedTranscript: false,
88
+ });
89
+ this.#opts = {
90
+ apiKey: opts.apiKey ?? process.env.GOOGLE_API_KEY ?? '',
91
+ model: opts.model ?? DEFAULT_MODEL,
92
+ voice: opts.voice ?? DEFAULT_VOICE,
93
+ language: opts.language ?? 'en-US',
94
+ interimResults: opts.interimResults ?? true,
95
+ sampleRate: opts.sampleRate ?? DEFAULT_SAMPLE_RATE,
96
+ systemInstruction: opts.systemInstruction ?? '',
97
+ fillerMode: opts.fillerMode ?? false,
98
+ fillerPrompt: opts.fillerPrompt ?? '',
99
+ fillerMinTranscriptLength: opts.fillerMinTranscriptLength ?? 15,
100
+ maxReconnectAttempts: opts.maxReconnectAttempts ?? DEFAULT_MAX_RECONNECT_ATTEMPTS,
101
+ };
102
+ if (!this.#opts.apiKey && !opts.client) {
103
+ throw new Error('GeminiLiveSTT: API key is required. Pass apiKey or set GOOGLE_API_KEY env var.');
104
+ }
105
+ this.#client =
106
+ opts.client ??
107
+ assertGeminiLiveClient(new GoogleGenAI({ apiKey: this.#opts.apiKey }), 'GeminiLiveSTT');
108
+ }
109
+ async _recognize() {
110
+ throw new Error('GeminiLiveSTT: only streaming is supported. Use .stream()');
111
+ }
112
+ get options() {
113
+ return this.#opts;
114
+ }
115
+ get client() {
116
+ return this.#client;
117
+ }
118
+ updateOptions(opts) {
119
+ this.#opts = {
120
+ ...this.#opts,
121
+ ...(opts.apiKey !== undefined ? { apiKey: opts.apiKey } : {}),
122
+ ...(opts.model !== undefined ? { model: opts.model } : {}),
123
+ ...(opts.voice !== undefined ? { voice: opts.voice } : {}),
124
+ ...(opts.language !== undefined ? { language: opts.language } : {}),
125
+ ...(opts.interimResults !== undefined ? { interimResults: opts.interimResults } : {}),
126
+ ...(opts.sampleRate !== undefined ? { sampleRate: opts.sampleRate } : {}),
127
+ ...(opts.systemInstruction !== undefined
128
+ ? { systemInstruction: opts.systemInstruction }
129
+ : {}),
130
+ ...(opts.fillerMode !== undefined ? { fillerMode: opts.fillerMode } : {}),
131
+ ...(opts.fillerPrompt !== undefined ? { fillerPrompt: opts.fillerPrompt } : {}),
132
+ ...(opts.fillerMinTranscriptLength !== undefined
133
+ ? { fillerMinTranscriptLength: opts.fillerMinTranscriptLength }
134
+ : {}),
135
+ ...(opts.maxReconnectAttempts !== undefined
136
+ ? { maxReconnectAttempts: opts.maxReconnectAttempts }
137
+ : {}),
138
+ };
139
+ if (opts.client) {
140
+ this.#client = opts.client;
141
+ }
142
+ }
143
+ onFiller(listener) {
144
+ this.#fillerListeners.add(listener);
145
+ return () => {
146
+ this.#fillerListeners.delete(listener);
147
+ };
148
+ }
149
+ emitFiller(payload) {
150
+ for (const listener of this.#fillerListeners) {
151
+ try {
152
+ listener(payload);
153
+ }
154
+ catch {
155
+ // Ignore listener failures so STT stream is never blocked by downstream observers.
156
+ }
157
+ }
158
+ }
159
+ stream(options) {
160
+ return new GeminiLiveSpeechStream(this, options?.connOptions);
161
+ }
162
+ }
163
+ export class GeminiLiveSpeechStream extends stt.SpeechStream {
164
+ label = 'gemini.live.SpeechStream';
165
+ #stt;
166
+ #logger = log();
167
+ constructor(sttImpl, connOptions) {
168
+ super(sttImpl, sttImpl.options.sampleRate, connOptions);
169
+ this.#stt = sttImpl;
170
+ }
171
+ async run() {
172
+ const requestId = shortuuid('gemini_stt_');
173
+ const state = {
174
+ speaking: false,
175
+ transcriptBuffer: '',
176
+ };
177
+ let reconnectAttempt = 0;
178
+ let resumeChunks = [];
179
+ while (!this.abortSignal.aborted && !this.closed) {
180
+ try {
181
+ const result = await this.#runSingleConnection({
182
+ requestId,
183
+ state,
184
+ resumeChunks,
185
+ });
186
+ if (result.status === 'done') {
187
+ return;
188
+ }
189
+ reconnectAttempt += 1;
190
+ if (reconnectAttempt > this.#stt.options.maxReconnectAttempts) {
191
+ const closeSuffix = result.closeEvent
192
+ ? ` (last close code=${result.closeEvent.code ?? 'n/a'}, reason="${result.closeEvent.reason ?? ''}")`
193
+ : '';
194
+ throw new Error(`GeminiLiveSTT: reconnect limit exceeded (${this.#stt.options.maxReconnectAttempts})${closeSuffix}`);
195
+ }
196
+ // Flush partial transcript from the dropped connection to avoid
197
+ // garbled concatenation with post-reconnect text.
198
+ if (state.speaking && state.transcriptBuffer.trim()) {
199
+ this.queue.put({
200
+ type: stt.SpeechEventType.FINAL_TRANSCRIPT,
201
+ alternatives: [{
202
+ text: state.transcriptBuffer.trim(),
203
+ language: this.#stt.options.language,
204
+ startTime: 0,
205
+ endTime: 0,
206
+ confidence: 0,
207
+ }],
208
+ requestId,
209
+ });
210
+ }
211
+ state.speaking = false;
212
+ state.transcriptBuffer = '';
213
+ resumeChunks = result.resumeChunks;
214
+ this.#logger.warn({
215
+ reconnectAttempt,
216
+ resumeChunkCount: resumeChunks.length,
217
+ closeEvent: result.closeEvent,
218
+ }, 'GeminiLiveSTT: reconnecting after websocket drop');
219
+ await this.#sleepWithAbort(this.#reconnectDelayMs(reconnectAttempt));
220
+ }
221
+ catch (error) {
222
+ if (this.abortSignal.aborted) {
223
+ return;
224
+ }
225
+ this.#logger.error({ error }, 'GeminiLiveSTT run() error');
226
+ throw error;
227
+ }
228
+ }
229
+ }
230
+ async #runSingleConnection(args) {
231
+ const { requestId, state } = args;
232
+ const opts = this.#stt.options;
233
+ const sessionConfig = {
234
+ responseModalities: [Modality.AUDIO],
235
+ speechConfig: {
236
+ voiceConfig: {
237
+ prebuiltVoiceConfig: {
238
+ voiceName: opts.voice,
239
+ },
240
+ },
241
+ },
242
+ inputAudioTranscription: {},
243
+ };
244
+ if (opts.fillerMode) {
245
+ sessionConfig.systemInstruction = {
246
+ parts: [
247
+ {
248
+ text: buildFillerInstruction({
249
+ baseInstruction: opts.systemInstruction,
250
+ fillerPrompt: opts.fillerPrompt,
251
+ fillerMinTranscriptLength: opts.fillerMinTranscriptLength,
252
+ }),
253
+ },
254
+ ],
255
+ };
256
+ }
257
+ else if (opts.systemInstruction) {
258
+ sessionConfig.systemInstruction = {
259
+ parts: [{ text: opts.systemInstruction }],
260
+ };
261
+ }
262
+ const sessionReady = new Future();
263
+ const disconnected = new Future();
264
+ const messageChannel = lkStream.createStreamChannel();
265
+ let session = null;
266
+ let localInputClosed = false;
267
+ let unexpectedDisconnect = false;
268
+ let closeEventDetails;
269
+ session = await this.#stt.client.live.connect({
270
+ model: opts.model,
271
+ config: sessionConfig,
272
+ callbacks: {
273
+ onopen: () => {
274
+ sessionReady.resolve();
275
+ },
276
+ onmessage: (message) => {
277
+ void messageChannel.write(message).catch(() => {
278
+ // Ignore writes after close.
279
+ });
280
+ },
281
+ onerror: (error) => {
282
+ this.#logger.error({ error: error instanceof Error ? error : String(error) }, 'GeminiLiveSTT websocket error');
283
+ if (!disconnected.done) {
284
+ unexpectedDisconnect = true;
285
+ disconnected.resolve();
286
+ }
287
+ void messageChannel.close().catch(() => { });
288
+ },
289
+ onclose: (event) => {
290
+ const closeEvent = event;
291
+ closeEventDetails = {
292
+ code: closeEvent?.code,
293
+ reason: closeEvent?.reason,
294
+ wasClean: closeEvent?.wasClean,
295
+ };
296
+ if (!disconnected.done) {
297
+ unexpectedDisconnect = true;
298
+ disconnected.resolve();
299
+ }
300
+ void messageChannel.close().catch(() => { });
301
+ },
302
+ },
303
+ });
304
+ await sessionReady.await;
305
+ const resumeChunks = [...args.resumeChunks];
306
+ const inputIterator = this.input[Symbol.asyncIterator]();
307
+ const readInputTask = async () => {
308
+ const bstream = new AudioByteStream(opts.sampleRate, 1, Math.floor(opts.sampleRate / 20));
309
+ let sentAudioSinceStreamEnd = false;
310
+ for (const chunk of resumeChunks) {
311
+ session.sendRealtimeInput({ media: toRealtimeBlob(chunk, opts.sampleRate) });
312
+ sentAudioSinceStreamEnd = true;
313
+ }
314
+ while (!this.abortSignal.aborted && !this.closed) {
315
+ const next = await Promise.race([
316
+ inputIterator.next().then((value) => ({ kind: 'input', value })),
317
+ disconnected.await.then(() => ({ kind: 'disconnect' })),
318
+ ]);
319
+ if (next.kind === 'disconnect') {
320
+ return;
321
+ }
322
+ if (next.value.done) {
323
+ localInputClosed = true;
324
+ if (sentAudioSinceStreamEnd) {
325
+ session.sendRealtimeInput({ audioStreamEnd: true });
326
+ sentAudioSinceStreamEnd = false;
327
+ }
328
+ return;
329
+ }
330
+ if (next.value.value === _a.FLUSH_SENTINEL) {
331
+ for (const frame of bstream.flush()) {
332
+ const bytes = new Uint8Array(Buffer.from(frame.data.buffer, frame.data.byteOffset, frame.data.byteLength));
333
+ this.#rememberChunk(resumeChunks, bytes);
334
+ session.sendRealtimeInput({ media: toRealtimeBlob(bytes, opts.sampleRate) });
335
+ sentAudioSinceStreamEnd = true;
336
+ }
337
+ continue;
338
+ }
339
+ const frame = next.value.value;
340
+ const pcm = normalizePcmBytes(frame);
341
+ for (const chunk of bstream.write(toArrayBuffer(pcm))) {
342
+ const bytes = new Uint8Array(Buffer.from(chunk.data.buffer, chunk.data.byteOffset, chunk.data.byteLength));
343
+ this.#rememberChunk(resumeChunks, bytes);
344
+ session.sendRealtimeInput({ media: toRealtimeBlob(bytes, opts.sampleRate) });
345
+ sentAudioSinceStreamEnd = true;
346
+ }
347
+ }
348
+ };
349
+ const receiveTask = async () => {
350
+ const reader = messageChannel.stream().getReader();
351
+ try {
352
+ while (!this.abortSignal.aborted && !this.closed) {
353
+ const result = await reader.read();
354
+ if (result.done) {
355
+ return;
356
+ }
357
+ const message = result.value;
358
+ const inputTranscriptionText = extractInputTranscriptionText(message);
359
+ const texts = inputTranscriptionText
360
+ ? [inputTranscriptionText]
361
+ : extractTextParts(message);
362
+ for (const text of texts) {
363
+ if (!state.speaking) {
364
+ state.speaking = true;
365
+ if (!this.queue.closed) {
366
+ this.queue.put({
367
+ type: stt.SpeechEventType.START_OF_SPEECH,
368
+ requestId,
369
+ });
370
+ }
371
+ }
372
+ if (inputTranscriptionText) {
373
+ // Gemini input transcription can be cumulative across events.
374
+ if (text.startsWith(state.transcriptBuffer)) {
375
+ state.transcriptBuffer = text;
376
+ }
377
+ else if (text !== state.transcriptBuffer) {
378
+ state.transcriptBuffer += text;
379
+ }
380
+ }
381
+ else {
382
+ state.transcriptBuffer += text;
383
+ }
384
+ if (opts.interimResults && !opts.fillerMode && !this.queue.closed) {
385
+ this.queue.put({
386
+ type: stt.SpeechEventType.INTERIM_TRANSCRIPT,
387
+ requestId,
388
+ alternatives: [
389
+ {
390
+ text: state.transcriptBuffer,
391
+ language: opts.language,
392
+ startTime: 0,
393
+ endTime: 0,
394
+ confidence: 0.9,
395
+ },
396
+ ],
397
+ });
398
+ }
399
+ }
400
+ if (isTurnComplete(message) && state.speaking) {
401
+ this.#emitTurnComplete({
402
+ requestId,
403
+ language: opts.language,
404
+ transcriptBuffer: state.transcriptBuffer,
405
+ fillerMode: opts.fillerMode,
406
+ fillerMinTranscriptLength: opts.fillerMinTranscriptLength,
407
+ });
408
+ state.speaking = false;
409
+ state.transcriptBuffer = '';
410
+ if (!this.queue.closed) {
411
+ this.queue.put({
412
+ type: stt.SpeechEventType.END_OF_SPEECH,
413
+ requestId,
414
+ });
415
+ }
416
+ }
417
+ }
418
+ }
419
+ finally {
420
+ reader.releaseLock();
421
+ await messageChannel.close().catch(() => { });
422
+ }
423
+ };
424
+ // Use an AbortController so that if receiveTask fails, readInputTask
425
+ // is signaled to stop rather than hanging on inputIterator.next().
426
+ const taskAbort = new AbortController();
427
+ try {
428
+ await Promise.all([
429
+ readInputTask().catch((err) => { taskAbort.abort(); throw err; }),
430
+ receiveTask().catch((err) => { taskAbort.abort(); throw err; }),
431
+ ]);
432
+ }
433
+ finally {
434
+ taskAbort.abort();
435
+ await Promise.resolve(session?.close()).catch(() => { });
436
+ }
437
+ if (unexpectedDisconnect && !localInputClosed && !this.abortSignal.aborted && !this.closed) {
438
+ this.#logger.warn({ closeEvent: closeEventDetails }, 'GeminiLiveSTT websocket closed unexpectedly; attempting reconnect');
439
+ return {
440
+ status: 'disconnected',
441
+ resumeChunks,
442
+ closeEvent: closeEventDetails,
443
+ };
444
+ }
445
+ return {
446
+ status: localInputClosed ? 'done' : 'disconnected',
447
+ resumeChunks,
448
+ closeEvent: closeEventDetails,
449
+ };
450
+ }
451
+ #reconnectDelayMs(attempt) {
452
+ const base = Math.min(MAX_RECONNECT_DELAY_MS, DEFAULT_RECONNECT_BASE_DELAY_MS * 2 ** Math.max(0, attempt - 1));
453
+ const jitter = Math.floor(Math.random() * 120);
454
+ return base + jitter;
455
+ }
456
+ async #sleepWithAbort(ms) {
457
+ if (ms <= 0 || this.abortSignal.aborted || this.closed) {
458
+ return;
459
+ }
460
+ await new Promise((resolve) => {
461
+ const timer = setTimeout(() => {
462
+ this.abortSignal.removeEventListener('abort', onAbort);
463
+ resolve();
464
+ }, ms);
465
+ const onAbort = () => {
466
+ clearTimeout(timer);
467
+ resolve();
468
+ };
469
+ this.abortSignal.addEventListener('abort', onAbort, { once: true });
470
+ });
471
+ }
472
+ #rememberChunk(buffer, bytes) {
473
+ if (buffer.length >= RESUME_BUFFER_LIMIT) {
474
+ buffer.shift();
475
+ }
476
+ buffer.push(bytes);
477
+ }
478
+ #emitTurnComplete(args) {
479
+ const payload = parseFillerResponse(args.transcriptBuffer);
480
+ const transcript = payload.transcript.trim();
481
+ const filler = payload.filler.trim();
482
+ if (!transcript && !filler) {
483
+ return;
484
+ }
485
+ if (args.fillerMode &&
486
+ filler &&
487
+ transcript.length >= args.fillerMinTranscriptLength &&
488
+ !this.queue.closed) {
489
+ const fillerEvent = {
490
+ type: stt.SpeechEventType.INTERIM_TRANSCRIPT,
491
+ requestId: args.requestId,
492
+ alternatives: [
493
+ {
494
+ text: filler,
495
+ language: args.language,
496
+ startTime: 0,
497
+ endTime: 0,
498
+ confidence: 1,
499
+ },
500
+ ],
501
+ _geminiFillerMode: true,
502
+ };
503
+ this.queue.put(fillerEvent);
504
+ this.#stt.emitFiller({
505
+ requestId: args.requestId,
506
+ transcript,
507
+ filler,
508
+ });
509
+ }
510
+ if (!this.queue.closed && transcript) {
511
+ this.queue.put({
512
+ type: stt.SpeechEventType.FINAL_TRANSCRIPT,
513
+ requestId: args.requestId,
514
+ alternatives: [
515
+ {
516
+ text: transcript,
517
+ language: args.language,
518
+ startTime: 0,
519
+ endTime: 0,
520
+ confidence: payload.parsedAsJson ? 0.95 : 0.9,
521
+ },
522
+ ],
523
+ });
524
+ }
525
+ }
526
+ }
527
+ _a = GeminiLiveSpeechStream;
528
+ //# sourceMappingURL=stt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stt.js","sourceRoot":"","sources":["../../src/gemini/stt.ts"],"names":[],"mappings":"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"}