@juspay/neurolink 13.7.0 → 13.8.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.
Files changed (84) hide show
  1. package/CHANGELOG.md +3 -6
  2. package/dist/browser/neurolink.min.js +480 -460
  3. package/dist/cli/commands/serve.js +11 -1
  4. package/dist/cli/commands/transcribe.js +39 -3
  5. package/dist/constants/langfuse.d.ts +2 -0
  6. package/dist/constants/langfuse.js +2 -0
  7. package/dist/factories/sttDescriptors.js +7 -0
  8. package/dist/index.d.ts +3 -2
  9. package/dist/index.js +4 -2
  10. package/dist/mcp/externalServerManager.js +4 -1
  11. package/dist/mcp/mcpClientFactory.d.ts +6 -0
  12. package/dist/mcp/mcpClientFactory.js +44 -0
  13. package/dist/neurolink.js +42 -3
  14. package/dist/observability/exporters/langfuseExporter.d.ts +4 -0
  15. package/dist/observability/exporters/langfuseExporter.js +29 -8
  16. package/dist/observability/otlpEncoding.js +2 -2
  17. package/dist/server/abstract/baseServerAdapter.js +2 -0
  18. package/dist/server/adapters/expressAdapter.js +1 -1
  19. package/dist/server/adapters/fastifyAdapter.js +4 -1
  20. package/dist/server/adapters/honoAdapter.js +1 -1
  21. package/dist/server/adapters/koaAdapter.js +1 -1
  22. package/dist/server/routes/transcribeRoutes.d.ts +0 -8
  23. package/dist/server/routes/transcribeRoutes.js +130 -3
  24. package/dist/server/utils/validation.d.ts +409 -15
  25. package/dist/server/utils/validation.js +106 -4
  26. package/dist/server/websocket/frameQueue.d.ts +16 -0
  27. package/dist/server/websocket/frameQueue.js +55 -0
  28. package/dist/server/websocket/realtimeTranscription.d.ts +48 -0
  29. package/dist/server/websocket/realtimeTranscription.js +603 -0
  30. package/dist/server/websocket/transcribeWebSocket.d.ts +17 -1
  31. package/dist/server/websocket/transcribeWebSocket.js +263 -64
  32. package/dist/services/server/ai/observability/langfuseSetup.js +6 -1
  33. package/dist/types/cli.d.ts +6 -0
  34. package/dist/types/exporter.d.ts +3 -1
  35. package/dist/types/server.d.ts +304 -2
  36. package/dist/types/stt.d.ts +38 -3
  37. package/dist/types/transcribe.d.ts +401 -5
  38. package/dist/voice/audioLevel.d.ts +14 -0
  39. package/dist/voice/audioLevel.js +60 -0
  40. package/dist/voice/codeMix.d.ts +40 -0
  41. package/dist/voice/codeMix.js +282 -0
  42. package/dist/voice/correction/align.d.ts +12 -0
  43. package/dist/voice/correction/align.js +48 -0
  44. package/dist/voice/correction/guards.d.ts +39 -0
  45. package/dist/voice/correction/guards.js +122 -0
  46. package/dist/voice/correction/index.d.ts +25 -3
  47. package/dist/voice/correction/index.js +132 -4
  48. package/dist/voice/correction/rewrite.d.ts +64 -3
  49. package/dist/voice/correction/rewrite.js +295 -25
  50. package/dist/voice/eval/sttEvalLangfuse.d.ts +14 -0
  51. package/dist/voice/eval/sttEvalLangfuse.js +182 -0
  52. package/dist/voice/eval/sttEvalStore.d.ts +27 -0
  53. package/dist/voice/eval/sttEvalStore.js +397 -0
  54. package/dist/voice/index.js +3 -0
  55. package/dist/voice/languages.d.ts +34 -0
  56. package/dist/voice/languages.js +290 -0
  57. package/dist/voice/modelAssets.d.ts +28 -0
  58. package/dist/voice/modelAssets.js +113 -0
  59. package/dist/voice/output/render.d.ts +32 -0
  60. package/dist/voice/output/render.js +368 -0
  61. package/dist/voice/providers/OpenAISTT.d.ts +11 -1
  62. package/dist/voice/providers/OpenAISTT.js +57 -6
  63. package/dist/voice/session/transcriptionSession.d.ts +55 -0
  64. package/dist/voice/session/transcriptionSession.js +225 -0
  65. package/dist/voice/streaming/chunkedStreamAdapter.d.ts +7 -0
  66. package/dist/voice/streaming/chunkedStreamAdapter.js +711 -28
  67. package/dist/voice/streaming/endpointer.d.ts +50 -17
  68. package/dist/voice/streaming/endpointer.js +115 -19
  69. package/dist/voice/transcribe.d.ts +18 -1
  70. package/dist/voice/transcribe.js +459 -18
  71. package/dist/voice/transcribeStream.d.ts +18 -1
  72. package/dist/voice/transcribeStream.js +413 -16
  73. package/dist/voice/vad/assets.d.ts +36 -0
  74. package/dist/voice/vad/assets.js +142 -0
  75. package/dist/voice/vad/frameScorer.d.ts +28 -0
  76. package/dist/voice/vad/frameScorer.js +90 -0
  77. package/dist/voice/vad/sileroVad.d.ts +43 -0
  78. package/dist/voice/vad/sileroVad.js +178 -0
  79. package/dist/voice/whistle/assets.d.ts +3 -4
  80. package/dist/voice/whistle/assets.js +11 -95
  81. package/docs-site/static/search-index.json +21 -6
  82. package/models/silero-vad/README.md +19 -0
  83. package/models/silero-vad/silero_vad.onnx +0 -0
  84. package/package.json +3 -1
@@ -173,12 +173,70 @@ export declare const TranscribeDictionaryEntrySchema: z.ZodObject<{
173
173
  heardAs: z.ZodOptional<z.ZodArray<z.ZodString>>;
174
174
  meaning: z.ZodOptional<z.ZodString>;
175
175
  }, z.core.$strip>;
176
- /**
177
- * Engine and correction settings shared by `POST /agent/transcribe`, the
178
- * OpenAI-compatible route's extension fields and the transcribe WebSocket's
179
- * config frame. Unknown keys (including `credentials`) are stripped: a caller
180
- * cannot swap in its own key or point an engine at another host.
181
- */
176
+ /** A BCP-47 output tag (`es`, `fr-CA`, `hi-Latn`, `zh-Hant`) or `source`. */
177
+ export declare const TranscribeOutputLanguageSchema: z.ZodString;
178
+ /** Output languages and how they are rendered. */
179
+ export declare const TranscribeOutputSchema: z.ZodObject<{
180
+ languages: z.ZodArray<z.ZodString>;
181
+ provider: z.ZodOptional<z.ZodString>;
182
+ model: z.ZodOptional<z.ZodString>;
183
+ timeoutMs: z.ZodOptional<z.ZodNumber>;
184
+ contextUtterances: z.ZodOptional<z.ZodNumber>;
185
+ glossary: z.ZodOptional<z.ZodBoolean>;
186
+ }, z.core.$strip>;
187
+ /** A text frame on the transcribe WebSocket after the config: change the output languages. */
188
+ export declare const TranscribeOutputControlSchema: z.ZodObject<{
189
+ type: z.ZodLiteral<"output">;
190
+ languages: z.ZodArray<z.ZodString>;
191
+ }, z.core.$strip>;
192
+ /** A listener's frame on the session socket: which languages and speakers to follow. */
193
+ export declare const TranscribeSubscribeSchema: z.ZodObject<{
194
+ type: z.ZodLiteral<"subscribe">;
195
+ languages: z.ZodOptional<z.ZodArray<z.ZodString>>;
196
+ speakers: z.ZodOptional<z.ZodArray<z.ZodString>>;
197
+ backlog: z.ZodOptional<z.ZodBoolean>;
198
+ interim: z.ZodOptional<z.ZodBoolean>;
199
+ }, z.core.$strip>;
200
+ export declare const STTEvalSegmentSchema: z.ZodObject<{
201
+ id: z.ZodString;
202
+ source: z.ZodEnum<{
203
+ primary: "primary";
204
+ shadow: "shadow";
205
+ }>;
206
+ model: z.ZodString;
207
+ participant_identity: z.ZodString;
208
+ participant_name: z.ZodOptional<z.ZodString>;
209
+ text: z.ZodString;
210
+ language: z.ZodOptional<z.ZodNullable<z.ZodString>>;
211
+ start_time: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
212
+ end_time: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
213
+ received_at: z.ZodNumber;
214
+ }, z.core.$strip>;
215
+ export declare const STTEvalBatchSchema: z.ZodObject<{
216
+ call_id: z.ZodString;
217
+ room: z.ZodOptional<z.ZodString>;
218
+ batch: z.ZodNumber;
219
+ final: z.ZodOptional<z.ZodBoolean>;
220
+ models: z.ZodObject<{
221
+ primary: z.ZodString;
222
+ shadow: z.ZodString;
223
+ }, z.core.$strip>;
224
+ segments: z.ZodArray<z.ZodObject<{
225
+ id: z.ZodString;
226
+ source: z.ZodEnum<{
227
+ primary: "primary";
228
+ shadow: "shadow";
229
+ }>;
230
+ model: z.ZodString;
231
+ participant_identity: z.ZodString;
232
+ participant_name: z.ZodOptional<z.ZodString>;
233
+ text: z.ZodString;
234
+ language: z.ZodOptional<z.ZodNullable<z.ZodString>>;
235
+ start_time: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
236
+ end_time: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
237
+ received_at: z.ZodNumber;
238
+ }, z.core.$strip>>;
239
+ }, z.core.$strip>;
182
240
  export declare const TranscribeConfigSchema: z.ZodObject<{
183
241
  provider: z.ZodOptional<z.ZodString>;
184
242
  model: z.ZodOptional<z.ZodString>;
@@ -196,22 +254,32 @@ export declare const TranscribeConfigSchema: z.ZodObject<{
196
254
  decide: "decide";
197
255
  }>>;
198
256
  decideTimeoutMs: z.ZodOptional<z.ZodNumber>;
199
- rewrite: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodObject<{
257
+ rewrite: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodLiteral<"auto">, z.ZodObject<{
200
258
  provider: z.ZodOptional<z.ZodString>;
201
259
  model: z.ZodOptional<z.ZodString>;
202
260
  timeoutMs: z.ZodOptional<z.ZodNumber>;
261
+ mode: z.ZodOptional<z.ZodEnum<{
262
+ auto: "auto";
263
+ always: "always";
264
+ }>>;
203
265
  }, z.core.$strip>]>>;
266
+ perSentence: z.ZodOptional<z.ZodBoolean>;
204
267
  transliterate: z.ZodOptional<z.ZodEnum<{
205
268
  native: "native";
206
269
  latin: "latin";
207
270
  }>>;
208
271
  punctuate: z.ZodOptional<z.ZodBoolean>;
209
- secondOpinion: z.ZodOptional<z.ZodObject<{
272
+ cleanup: z.ZodOptional<z.ZodEnum<{
273
+ verbatim: "verbatim";
274
+ clean: "clean";
275
+ }>>;
276
+ secondOpinion: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<"auto">, z.ZodObject<{
210
277
  provider: z.ZodString;
211
278
  model: z.ZodOptional<z.ZodString>;
212
- }, z.core.$strip>>;
279
+ }, z.core.$strip>]>>;
213
280
  context: z.ZodOptional<z.ZodString>;
214
281
  maxDropRatio: z.ZodOptional<z.ZodNumber>;
282
+ contextUtterances: z.ZodOptional<z.ZodNumber>;
215
283
  }, z.core.$strip>>;
216
284
  fallback: z.ZodOptional<z.ZodObject<{
217
285
  provider: z.ZodString;
@@ -222,6 +290,27 @@ export declare const TranscribeConfigSchema: z.ZodObject<{
222
290
  unsure: "unsure";
223
291
  }>>>;
224
292
  }, z.core.$strip>>;
293
+ routing: z.ZodOptional<z.ZodObject<{
294
+ probe: z.ZodOptional<z.ZodBoolean>;
295
+ lockAfterPasses: z.ZodOptional<z.ZodNumber>;
296
+ prior: z.ZodOptional<z.ZodEnum<{
297
+ none: "none";
298
+ carry: "carry";
299
+ }>>;
300
+ engines: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
301
+ }, z.core.$strip>>;
302
+ chunking: z.ZodOptional<z.ZodEnum<{
303
+ engine: "engine";
304
+ utterances: "utterances";
305
+ }>>;
306
+ output: z.ZodOptional<z.ZodObject<{
307
+ languages: z.ZodArray<z.ZodString>;
308
+ provider: z.ZodOptional<z.ZodString>;
309
+ model: z.ZodOptional<z.ZodString>;
310
+ timeoutMs: z.ZodOptional<z.ZodNumber>;
311
+ contextUtterances: z.ZodOptional<z.ZodNumber>;
312
+ glossary: z.ZodOptional<z.ZodBoolean>;
313
+ }, z.core.$strip>>;
225
314
  diarization: z.ZodOptional<z.ZodBoolean>;
226
315
  wordTimestamps: z.ZodOptional<z.ZodBoolean>;
227
316
  timeoutMs: z.ZodOptional<z.ZodNumber>;
@@ -246,22 +335,32 @@ export declare const TranscribeRequestSchema: z.ZodObject<{
246
335
  decide: "decide";
247
336
  }>>;
248
337
  decideTimeoutMs: z.ZodOptional<z.ZodNumber>;
249
- rewrite: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodObject<{
338
+ rewrite: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodLiteral<"auto">, z.ZodObject<{
250
339
  provider: z.ZodOptional<z.ZodString>;
251
340
  model: z.ZodOptional<z.ZodString>;
252
341
  timeoutMs: z.ZodOptional<z.ZodNumber>;
342
+ mode: z.ZodOptional<z.ZodEnum<{
343
+ auto: "auto";
344
+ always: "always";
345
+ }>>;
253
346
  }, z.core.$strip>]>>;
347
+ perSentence: z.ZodOptional<z.ZodBoolean>;
254
348
  transliterate: z.ZodOptional<z.ZodEnum<{
255
349
  native: "native";
256
350
  latin: "latin";
257
351
  }>>;
258
352
  punctuate: z.ZodOptional<z.ZodBoolean>;
259
- secondOpinion: z.ZodOptional<z.ZodObject<{
353
+ cleanup: z.ZodOptional<z.ZodEnum<{
354
+ verbatim: "verbatim";
355
+ clean: "clean";
356
+ }>>;
357
+ secondOpinion: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<"auto">, z.ZodObject<{
260
358
  provider: z.ZodString;
261
359
  model: z.ZodOptional<z.ZodString>;
262
- }, z.core.$strip>>;
360
+ }, z.core.$strip>]>>;
263
361
  context: z.ZodOptional<z.ZodString>;
264
362
  maxDropRatio: z.ZodOptional<z.ZodNumber>;
363
+ contextUtterances: z.ZodOptional<z.ZodNumber>;
265
364
  }, z.core.$strip>>;
266
365
  fallback: z.ZodOptional<z.ZodObject<{
267
366
  provider: z.ZodString;
@@ -272,6 +371,27 @@ export declare const TranscribeRequestSchema: z.ZodObject<{
272
371
  unsure: "unsure";
273
372
  }>>>;
274
373
  }, z.core.$strip>>;
374
+ routing: z.ZodOptional<z.ZodObject<{
375
+ probe: z.ZodOptional<z.ZodBoolean>;
376
+ lockAfterPasses: z.ZodOptional<z.ZodNumber>;
377
+ prior: z.ZodOptional<z.ZodEnum<{
378
+ none: "none";
379
+ carry: "carry";
380
+ }>>;
381
+ engines: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
382
+ }, z.core.$strip>>;
383
+ chunking: z.ZodOptional<z.ZodEnum<{
384
+ engine: "engine";
385
+ utterances: "utterances";
386
+ }>>;
387
+ output: z.ZodOptional<z.ZodObject<{
388
+ languages: z.ZodArray<z.ZodString>;
389
+ provider: z.ZodOptional<z.ZodString>;
390
+ model: z.ZodOptional<z.ZodString>;
391
+ timeoutMs: z.ZodOptional<z.ZodNumber>;
392
+ contextUtterances: z.ZodOptional<z.ZodNumber>;
393
+ glossary: z.ZodOptional<z.ZodBoolean>;
394
+ }, z.core.$strip>>;
275
395
  diarization: z.ZodOptional<z.ZodBoolean>;
276
396
  wordTimestamps: z.ZodOptional<z.ZodBoolean>;
277
397
  timeoutMs: z.ZodOptional<z.ZodNumber>;
@@ -312,22 +432,32 @@ export declare const TranscribeStreamConfigSchema: z.ZodObject<{
312
432
  decide: "decide";
313
433
  }>>;
314
434
  decideTimeoutMs: z.ZodOptional<z.ZodNumber>;
315
- rewrite: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodObject<{
435
+ rewrite: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodLiteral<"auto">, z.ZodObject<{
316
436
  provider: z.ZodOptional<z.ZodString>;
317
437
  model: z.ZodOptional<z.ZodString>;
318
438
  timeoutMs: z.ZodOptional<z.ZodNumber>;
439
+ mode: z.ZodOptional<z.ZodEnum<{
440
+ auto: "auto";
441
+ always: "always";
442
+ }>>;
319
443
  }, z.core.$strip>]>>;
444
+ perSentence: z.ZodOptional<z.ZodBoolean>;
320
445
  transliterate: z.ZodOptional<z.ZodEnum<{
321
446
  native: "native";
322
447
  latin: "latin";
323
448
  }>>;
324
449
  punctuate: z.ZodOptional<z.ZodBoolean>;
325
- secondOpinion: z.ZodOptional<z.ZodObject<{
450
+ cleanup: z.ZodOptional<z.ZodEnum<{
451
+ verbatim: "verbatim";
452
+ clean: "clean";
453
+ }>>;
454
+ secondOpinion: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<"auto">, z.ZodObject<{
326
455
  provider: z.ZodString;
327
456
  model: z.ZodOptional<z.ZodString>;
328
- }, z.core.$strip>>;
457
+ }, z.core.$strip>]>>;
329
458
  context: z.ZodOptional<z.ZodString>;
330
459
  maxDropRatio: z.ZodOptional<z.ZodNumber>;
460
+ contextUtterances: z.ZodOptional<z.ZodNumber>;
331
461
  }, z.core.$strip>>;
332
462
  fallback: z.ZodOptional<z.ZodObject<{
333
463
  provider: z.ZodString;
@@ -338,9 +468,34 @@ export declare const TranscribeStreamConfigSchema: z.ZodObject<{
338
468
  unsure: "unsure";
339
469
  }>>>;
340
470
  }, z.core.$strip>>;
471
+ routing: z.ZodOptional<z.ZodObject<{
472
+ probe: z.ZodOptional<z.ZodBoolean>;
473
+ lockAfterPasses: z.ZodOptional<z.ZodNumber>;
474
+ prior: z.ZodOptional<z.ZodEnum<{
475
+ none: "none";
476
+ carry: "carry";
477
+ }>>;
478
+ engines: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
479
+ }, z.core.$strip>>;
480
+ chunking: z.ZodOptional<z.ZodEnum<{
481
+ engine: "engine";
482
+ utterances: "utterances";
483
+ }>>;
484
+ output: z.ZodOptional<z.ZodObject<{
485
+ languages: z.ZodArray<z.ZodString>;
486
+ provider: z.ZodOptional<z.ZodString>;
487
+ model: z.ZodOptional<z.ZodString>;
488
+ timeoutMs: z.ZodOptional<z.ZodNumber>;
489
+ contextUtterances: z.ZodOptional<z.ZodNumber>;
490
+ glossary: z.ZodOptional<z.ZodBoolean>;
491
+ }, z.core.$strip>>;
341
492
  diarization: z.ZodOptional<z.ZodBoolean>;
342
493
  wordTimestamps: z.ZodOptional<z.ZodBoolean>;
343
494
  timeoutMs: z.ZodOptional<z.ZodNumber>;
495
+ mode: z.ZodOptional<z.ZodEnum<{
496
+ file: "file";
497
+ live: "live";
498
+ }>>;
344
499
  streaming: z.ZodOptional<z.ZodObject<{
345
500
  mode: z.ZodOptional<z.ZodEnum<{
346
501
  auto: "auto";
@@ -355,8 +510,247 @@ export declare const TranscribeStreamConfigSchema: z.ZodObject<{
355
510
  onsetRms: z.ZodOptional<z.ZodNumber>;
356
511
  prerollMs: z.ZodOptional<z.ZodNumber>;
357
512
  minSpeechMs: z.ZodOptional<z.ZodNumber>;
513
+ concurrency: z.ZodOptional<z.ZodNumber>;
514
+ finalRetries: z.ZodOptional<z.ZodNumber>;
515
+ vad: z.ZodOptional<z.ZodObject<{
516
+ engine: z.ZodOptional<z.ZodEnum<{
517
+ auto: "auto";
518
+ silero: "silero";
519
+ energy: "energy";
520
+ }>>;
521
+ onset: z.ZodOptional<z.ZodNumber>;
522
+ sustain: z.ZodOptional<z.ZodNumber>;
523
+ startMs: z.ZodOptional<z.ZodNumber>;
524
+ }, z.core.$strip>>;
525
+ normalize: z.ZodOptional<z.ZodBoolean>;
358
526
  }, z.core.$strip>>;
359
527
  }, z.core.$strip>;
528
+ export declare const STTRealtimeProfileSchema: z.ZodObject<{
529
+ timeoutMs: z.ZodOptional<z.ZodNumber>;
530
+ provider: z.ZodOptional<z.ZodString>;
531
+ output: z.ZodOptional<z.ZodObject<{
532
+ languages: z.ZodArray<z.ZodString>;
533
+ provider: z.ZodOptional<z.ZodString>;
534
+ model: z.ZodOptional<z.ZodString>;
535
+ timeoutMs: z.ZodOptional<z.ZodNumber>;
536
+ contextUtterances: z.ZodOptional<z.ZodNumber>;
537
+ glossary: z.ZodOptional<z.ZodBoolean>;
538
+ }, z.core.$strip>>;
539
+ model: z.ZodOptional<z.ZodString>;
540
+ streaming: z.ZodOptional<z.ZodObject<{
541
+ mode: z.ZodOptional<z.ZodEnum<{
542
+ auto: "auto";
543
+ native: "native";
544
+ chunked: "chunked";
545
+ }>>;
546
+ sampleRate: z.ZodOptional<z.ZodNumber>;
547
+ endSilenceMs: z.ZodOptional<z.ZodNumber>;
548
+ intervalMs: z.ZodOptional<z.ZodNumber>;
549
+ softCutSeconds: z.ZodOptional<z.ZodNumber>;
550
+ maxUtteranceSeconds: z.ZodOptional<z.ZodNumber>;
551
+ onsetRms: z.ZodOptional<z.ZodNumber>;
552
+ prerollMs: z.ZodOptional<z.ZodNumber>;
553
+ minSpeechMs: z.ZodOptional<z.ZodNumber>;
554
+ concurrency: z.ZodOptional<z.ZodNumber>;
555
+ finalRetries: z.ZodOptional<z.ZodNumber>;
556
+ vad: z.ZodOptional<z.ZodObject<{
557
+ engine: z.ZodOptional<z.ZodEnum<{
558
+ auto: "auto";
559
+ silero: "silero";
560
+ energy: "energy";
561
+ }>>;
562
+ onset: z.ZodOptional<z.ZodNumber>;
563
+ sustain: z.ZodOptional<z.ZodNumber>;
564
+ startMs: z.ZodOptional<z.ZodNumber>;
565
+ }, z.core.$strip>>;
566
+ normalize: z.ZodOptional<z.ZodBoolean>;
567
+ }, z.core.$strip>>;
568
+ prompt: z.ZodOptional<z.ZodString>;
569
+ language: z.ZodOptional<z.ZodString>;
570
+ diarization: z.ZodOptional<z.ZodBoolean>;
571
+ wordTimestamps: z.ZodOptional<z.ZodBoolean>;
572
+ dictionary: z.ZodOptional<z.ZodArray<z.ZodObject<{
573
+ term: z.ZodString;
574
+ heardAs: z.ZodOptional<z.ZodArray<z.ZodString>>;
575
+ meaning: z.ZodOptional<z.ZodString>;
576
+ }, z.core.$strip>>>;
577
+ correction: z.ZodOptional<z.ZodObject<{
578
+ enabled: z.ZodOptional<z.ZodBoolean>;
579
+ guard: z.ZodOptional<z.ZodEnum<{
580
+ none: "none";
581
+ decide: "decide";
582
+ }>>;
583
+ decideTimeoutMs: z.ZodOptional<z.ZodNumber>;
584
+ rewrite: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodLiteral<"auto">, z.ZodObject<{
585
+ provider: z.ZodOptional<z.ZodString>;
586
+ model: z.ZodOptional<z.ZodString>;
587
+ timeoutMs: z.ZodOptional<z.ZodNumber>;
588
+ mode: z.ZodOptional<z.ZodEnum<{
589
+ auto: "auto";
590
+ always: "always";
591
+ }>>;
592
+ }, z.core.$strip>]>>;
593
+ perSentence: z.ZodOptional<z.ZodBoolean>;
594
+ transliterate: z.ZodOptional<z.ZodEnum<{
595
+ native: "native";
596
+ latin: "latin";
597
+ }>>;
598
+ punctuate: z.ZodOptional<z.ZodBoolean>;
599
+ cleanup: z.ZodOptional<z.ZodEnum<{
600
+ verbatim: "verbatim";
601
+ clean: "clean";
602
+ }>>;
603
+ secondOpinion: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<"auto">, z.ZodObject<{
604
+ provider: z.ZodString;
605
+ model: z.ZodOptional<z.ZodString>;
606
+ }, z.core.$strip>]>>;
607
+ context: z.ZodOptional<z.ZodString>;
608
+ maxDropRatio: z.ZodOptional<z.ZodNumber>;
609
+ contextUtterances: z.ZodOptional<z.ZodNumber>;
610
+ }, z.core.$strip>>;
611
+ fallback: z.ZodOptional<z.ZodObject<{
612
+ provider: z.ZodString;
613
+ model: z.ZodOptional<z.ZodString>;
614
+ when: z.ZodOptional<z.ZodArray<z.ZodEnum<{
615
+ error: "error";
616
+ empty: "empty";
617
+ unsure: "unsure";
618
+ }>>>;
619
+ }, z.core.$strip>>;
620
+ routing: z.ZodOptional<z.ZodObject<{
621
+ probe: z.ZodOptional<z.ZodBoolean>;
622
+ lockAfterPasses: z.ZodOptional<z.ZodNumber>;
623
+ prior: z.ZodOptional<z.ZodEnum<{
624
+ none: "none";
625
+ carry: "carry";
626
+ }>>;
627
+ engines: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
628
+ }, z.core.$strip>>;
629
+ chunking: z.ZodOptional<z.ZodEnum<{
630
+ engine: "engine";
631
+ utterances: "utterances";
632
+ }>>;
633
+ completed: z.ZodOptional<z.ZodEnum<{
634
+ final: "final";
635
+ corrected: "corrected";
636
+ }>>;
637
+ correctionWaitMs: z.ZodOptional<z.ZodNumber>;
638
+ clientLanguage: z.ZodOptional<z.ZodBoolean>;
639
+ clientTurnDetection: z.ZodOptional<z.ZodBoolean>;
640
+ }, z.core.$strip>;
641
+ export declare const STTRealtimeProfilesSchema: z.ZodRecord<z.ZodString, z.ZodObject<{
642
+ timeoutMs: z.ZodOptional<z.ZodNumber>;
643
+ provider: z.ZodOptional<z.ZodString>;
644
+ output: z.ZodOptional<z.ZodObject<{
645
+ languages: z.ZodArray<z.ZodString>;
646
+ provider: z.ZodOptional<z.ZodString>;
647
+ model: z.ZodOptional<z.ZodString>;
648
+ timeoutMs: z.ZodOptional<z.ZodNumber>;
649
+ contextUtterances: z.ZodOptional<z.ZodNumber>;
650
+ glossary: z.ZodOptional<z.ZodBoolean>;
651
+ }, z.core.$strip>>;
652
+ model: z.ZodOptional<z.ZodString>;
653
+ streaming: z.ZodOptional<z.ZodObject<{
654
+ mode: z.ZodOptional<z.ZodEnum<{
655
+ auto: "auto";
656
+ native: "native";
657
+ chunked: "chunked";
658
+ }>>;
659
+ sampleRate: z.ZodOptional<z.ZodNumber>;
660
+ endSilenceMs: z.ZodOptional<z.ZodNumber>;
661
+ intervalMs: z.ZodOptional<z.ZodNumber>;
662
+ softCutSeconds: z.ZodOptional<z.ZodNumber>;
663
+ maxUtteranceSeconds: z.ZodOptional<z.ZodNumber>;
664
+ onsetRms: z.ZodOptional<z.ZodNumber>;
665
+ prerollMs: z.ZodOptional<z.ZodNumber>;
666
+ minSpeechMs: z.ZodOptional<z.ZodNumber>;
667
+ concurrency: z.ZodOptional<z.ZodNumber>;
668
+ finalRetries: z.ZodOptional<z.ZodNumber>;
669
+ vad: z.ZodOptional<z.ZodObject<{
670
+ engine: z.ZodOptional<z.ZodEnum<{
671
+ auto: "auto";
672
+ silero: "silero";
673
+ energy: "energy";
674
+ }>>;
675
+ onset: z.ZodOptional<z.ZodNumber>;
676
+ sustain: z.ZodOptional<z.ZodNumber>;
677
+ startMs: z.ZodOptional<z.ZodNumber>;
678
+ }, z.core.$strip>>;
679
+ normalize: z.ZodOptional<z.ZodBoolean>;
680
+ }, z.core.$strip>>;
681
+ prompt: z.ZodOptional<z.ZodString>;
682
+ language: z.ZodOptional<z.ZodString>;
683
+ diarization: z.ZodOptional<z.ZodBoolean>;
684
+ wordTimestamps: z.ZodOptional<z.ZodBoolean>;
685
+ dictionary: z.ZodOptional<z.ZodArray<z.ZodObject<{
686
+ term: z.ZodString;
687
+ heardAs: z.ZodOptional<z.ZodArray<z.ZodString>>;
688
+ meaning: z.ZodOptional<z.ZodString>;
689
+ }, z.core.$strip>>>;
690
+ correction: z.ZodOptional<z.ZodObject<{
691
+ enabled: z.ZodOptional<z.ZodBoolean>;
692
+ guard: z.ZodOptional<z.ZodEnum<{
693
+ none: "none";
694
+ decide: "decide";
695
+ }>>;
696
+ decideTimeoutMs: z.ZodOptional<z.ZodNumber>;
697
+ rewrite: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodLiteral<"auto">, z.ZodObject<{
698
+ provider: z.ZodOptional<z.ZodString>;
699
+ model: z.ZodOptional<z.ZodString>;
700
+ timeoutMs: z.ZodOptional<z.ZodNumber>;
701
+ mode: z.ZodOptional<z.ZodEnum<{
702
+ auto: "auto";
703
+ always: "always";
704
+ }>>;
705
+ }, z.core.$strip>]>>;
706
+ perSentence: z.ZodOptional<z.ZodBoolean>;
707
+ transliterate: z.ZodOptional<z.ZodEnum<{
708
+ native: "native";
709
+ latin: "latin";
710
+ }>>;
711
+ punctuate: z.ZodOptional<z.ZodBoolean>;
712
+ cleanup: z.ZodOptional<z.ZodEnum<{
713
+ verbatim: "verbatim";
714
+ clean: "clean";
715
+ }>>;
716
+ secondOpinion: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<"auto">, z.ZodObject<{
717
+ provider: z.ZodString;
718
+ model: z.ZodOptional<z.ZodString>;
719
+ }, z.core.$strip>]>>;
720
+ context: z.ZodOptional<z.ZodString>;
721
+ maxDropRatio: z.ZodOptional<z.ZodNumber>;
722
+ contextUtterances: z.ZodOptional<z.ZodNumber>;
723
+ }, z.core.$strip>>;
724
+ fallback: z.ZodOptional<z.ZodObject<{
725
+ provider: z.ZodString;
726
+ model: z.ZodOptional<z.ZodString>;
727
+ when: z.ZodOptional<z.ZodArray<z.ZodEnum<{
728
+ error: "error";
729
+ empty: "empty";
730
+ unsure: "unsure";
731
+ }>>>;
732
+ }, z.core.$strip>>;
733
+ routing: z.ZodOptional<z.ZodObject<{
734
+ probe: z.ZodOptional<z.ZodBoolean>;
735
+ lockAfterPasses: z.ZodOptional<z.ZodNumber>;
736
+ prior: z.ZodOptional<z.ZodEnum<{
737
+ none: "none";
738
+ carry: "carry";
739
+ }>>;
740
+ engines: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
741
+ }, z.core.$strip>>;
742
+ chunking: z.ZodOptional<z.ZodEnum<{
743
+ engine: "engine";
744
+ utterances: "utterances";
745
+ }>>;
746
+ completed: z.ZodOptional<z.ZodEnum<{
747
+ final: "final";
748
+ corrected: "corrected";
749
+ }>>;
750
+ correctionWaitMs: z.ZodOptional<z.ZodNumber>;
751
+ clientLanguage: z.ZodOptional<z.ZodBoolean>;
752
+ clientTurnDetection: z.ZodOptional<z.ZodBoolean>;
753
+ }, z.core.$strip>>;
360
754
  /**
361
755
  * Type guard to check if a value is an ErrorResponse
362
756
  */
@@ -180,12 +180,63 @@ export const TranscribeDictionaryEntrySchema = z.object({
180
180
  meaning: z.string().max(2000).optional(),
181
181
  });
182
182
  const sttProviderName = z.string().min(1).max(100);
183
+ /** A BCP-47 output tag (`es`, `fr-CA`, `hi-Latn`, `zh-Hant`) or `source`. */
184
+ export const TranscribeOutputLanguageSchema = z
185
+ .string()
186
+ .trim()
187
+ .regex(/^(?:source|[A-Za-z]{2,3}(?:-[A-Za-z]{4})?(?:-(?:[A-Za-z]{2}|\d{3}))?)$/u, "must be a BCP-47 tag such as es, fr-CA or hi-Latn, or source");
188
+ /** Output languages and how they are rendered. */
189
+ export const TranscribeOutputSchema = z.object({
190
+ languages: z.array(TranscribeOutputLanguageSchema).max(8),
191
+ provider: z.string().min(1).max(100).optional(),
192
+ model: z.string().min(1).max(200).optional(),
193
+ timeoutMs: z.number().int().positive().max(120_000).optional(),
194
+ contextUtterances: z.number().int().min(0).max(10).optional(),
195
+ glossary: z.boolean().optional(),
196
+ });
197
+ /** A text frame on the transcribe WebSocket after the config: change the output languages. */
198
+ export const TranscribeOutputControlSchema = z.object({
199
+ type: z.literal("output"),
200
+ languages: z.array(TranscribeOutputLanguageSchema).max(8),
201
+ });
202
+ /** A listener's frame on the session socket: which languages and speakers to follow. */
203
+ export const TranscribeSubscribeSchema = z.object({
204
+ type: z.literal("subscribe"),
205
+ languages: z.array(TranscribeOutputLanguageSchema).max(8).optional(),
206
+ speakers: z.array(z.string().min(1).max(100)).max(64).optional(),
207
+ backlog: z.boolean().optional(),
208
+ interim: z.boolean().optional(),
209
+ });
183
210
  /**
184
211
  * Engine and correction settings shared by `POST /agent/transcribe`, the
185
212
  * OpenAI-compatible route's extension fields and the transcribe WebSocket's
186
213
  * config frame. Unknown keys (including `credentials`) are stripped: a caller
187
214
  * cannot swap in its own key or point an engine at another host.
188
215
  */
216
+ const EvalTimeSchema = z.number().finite().nonnegative().nullish();
217
+ export const STTEvalSegmentSchema = z.object({
218
+ id: z.string().min(1).max(200),
219
+ source: z.enum(["primary", "shadow"]),
220
+ model: z.string().max(200),
221
+ participant_identity: z.string().max(500),
222
+ participant_name: z.string().max(500).optional(),
223
+ text: z.string().max(20_000),
224
+ language: z.string().max(35).nullish(),
225
+ start_time: EvalTimeSchema,
226
+ end_time: EvalTimeSchema,
227
+ received_at: z.number().finite().nonnegative(),
228
+ });
229
+ export const STTEvalBatchSchema = z.object({
230
+ call_id: z.string().min(1).max(500),
231
+ room: z.string().max(500).optional(),
232
+ batch: z.number().int().nonnegative(),
233
+ final: z.boolean().optional(),
234
+ models: z.object({
235
+ primary: z.string().max(200),
236
+ shadow: z.string().max(200),
237
+ }),
238
+ segments: z.array(STTEvalSegmentSchema).max(5_000),
239
+ });
189
240
  export const TranscribeConfigSchema = z.object({
190
241
  provider: sttProviderName.optional(),
191
242
  model: z.string().min(1).max(200).optional(),
@@ -200,23 +251,31 @@ export const TranscribeConfigSchema = z.object({
200
251
  rewrite: z
201
252
  .union([
202
253
  z.literal(false),
254
+ z.literal("auto"),
203
255
  z.object({
204
256
  provider: z.string().min(1).max(100).optional(),
205
257
  model: z.string().min(1).max(200).optional(),
206
258
  timeoutMs: z.number().int().positive().max(120_000).optional(),
259
+ mode: z.enum(["auto", "always"]).optional(),
207
260
  }),
208
261
  ])
209
262
  .optional(),
263
+ perSentence: z.boolean().optional(),
210
264
  transliterate: z.enum(["latin", "native"]).optional(),
211
265
  punctuate: z.boolean().optional(),
266
+ cleanup: z.enum(["verbatim", "clean"]).optional(),
212
267
  secondOpinion: z
213
- .object({
214
- provider: sttProviderName,
215
- model: z.string().min(1).max(200).optional(),
216
- })
268
+ .union([
269
+ z.literal("auto"),
270
+ z.object({
271
+ provider: sttProviderName,
272
+ model: z.string().min(1).max(200).optional(),
273
+ }),
274
+ ])
217
275
  .optional(),
218
276
  context: z.string().max(1000).optional(),
219
277
  maxDropRatio: z.number().min(0).max(1).optional(),
278
+ contextUtterances: z.number().int().min(0).max(10).optional(),
220
279
  })
221
280
  .optional(),
222
281
  fallback: z
@@ -226,6 +285,21 @@ export const TranscribeConfigSchema = z.object({
226
285
  when: z.array(z.enum(["unsure", "empty", "error"])).optional(),
227
286
  })
228
287
  .optional(),
288
+ routing: z
289
+ .object({
290
+ probe: z.boolean().optional(),
291
+ lockAfterPasses: z.number().int().min(1).max(5).optional(),
292
+ prior: z.enum(["carry", "none"]).optional(),
293
+ engines: z
294
+ .record(z.string().min(1).max(35), sttProviderName)
295
+ .refine((engines) => Object.keys(engines).length <= 64, {
296
+ message: "at most 64 routes",
297
+ })
298
+ .optional(),
299
+ })
300
+ .optional(),
301
+ chunking: z.enum(["engine", "utterances"]).optional(),
302
+ output: TranscribeOutputSchema.optional(),
229
303
  diarization: z.boolean().optional(),
230
304
  wordTimestamps: z.boolean().optional(),
231
305
  timeoutMs: z.number().int().positive().max(600_000).optional(),
@@ -257,6 +331,13 @@ export const TranscribeRequestSchema = TranscribeConfigSchema.extend({
257
331
  * The transcribe WebSocket's first text frame: the config plus streaming tuning.
258
332
  */
259
333
  export const TranscribeStreamConfigSchema = TranscribeConfigSchema.extend({
334
+ /**
335
+ * `"file"`: the socket carries a whole recording as fast as the client can
336
+ * send it, not a microphone. No interim passes, utterances transcribed
337
+ * several at a time, a failed final retried, file-sized engine timeouts and
338
+ * shorter utterance cuts, with results per utterance as they finish.
339
+ */
340
+ mode: z.enum(["live", "file"]).optional(),
260
341
  streaming: z
261
342
  .object({
262
343
  mode: z.enum(["auto", "native", "chunked"]).optional(),
@@ -268,9 +349,30 @@ export const TranscribeStreamConfigSchema = TranscribeConfigSchema.extend({
268
349
  onsetRms: z.number().positive().optional(),
269
350
  prerollMs: z.number().nonnegative().optional(),
270
351
  minSpeechMs: z.number().nonnegative().optional(),
352
+ concurrency: z.number().int().min(1).max(8).optional(),
353
+ finalRetries: z.number().int().min(0).max(3).optional(),
354
+ // The detector and its thresholds; where its model lives is the server's business.
355
+ vad: z
356
+ .object({
357
+ engine: z.enum(["auto", "silero", "energy"]).optional(),
358
+ onset: z.number().min(0).max(1).optional(),
359
+ sustain: z.number().min(0).max(1).optional(),
360
+ startMs: z.number().nonnegative().max(2000).optional(),
361
+ })
362
+ .optional(),
363
+ normalize: z.boolean().optional(),
271
364
  })
272
365
  .optional(),
273
366
  });
367
+ export const STTRealtimeProfileSchema = TranscribeStreamConfigSchema.omit({
368
+ mode: true,
369
+ }).extend({
370
+ completed: z.enum(["corrected", "final"]).optional(),
371
+ correctionWaitMs: z.number().int().min(0).max(30_000).optional(),
372
+ clientLanguage: z.boolean().optional(),
373
+ clientTurnDetection: z.boolean().optional(),
374
+ });
375
+ export const STTRealtimeProfilesSchema = z.record(z.string().min(1).max(100), STTRealtimeProfileSchema);
274
376
  // ============================================
275
377
  // Error Response Type Guards / Helpers
276
378
  // ============================================