@volley/recognition-client-sdk 0.1.689 → 0.1.767

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.
@@ -1 +1 @@
1
- {"version":3,"file":"recognition-client.d.ts","sourceRoot":"","sources":["../src/recognition-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"recognition-client.d.ts","sourceRoot":"","sources":["../src/recognition-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAGH,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAML,KAAK,qBAAqB,EAS1B,KAAK,aAAa,EAGnB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,KAAK,EACV,kBAAkB,EAClB,uBAAuB,EACvB,8CAA8C,EAE/C,MAAM,+BAA+B,CAAC;AAUvC;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE3D;AAgCD;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,qBAAqB,CAAC;AAGxD,YAAY,EAAE,8CAA8C,EAAE,MAAM,+BAA+B,CAAC;AAkCpG;;;;;GAKG;AACH,qBAAa,wCACX,SAAQ,oBAAoB,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,CAC7C,YAAW,kBAAkB;IAE7B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAK;IAC7C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAAoB;IAEnE,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,YAAY,CAAyC;IAC7D,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,KAAK,CAAoC;IACjD,OAAO,CAAC,iBAAiB,CAA4B;IAGrD,OAAO,CAAC,iBAAiB,CAAS;IAGlC,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,qBAAqB,CAAO;IACpC,OAAO,CAAC,iBAAiB,CAAK;gBAElB,MAAM,EAAE,8CAA8C;IAqFlE;;;;;;OAMG;IACH,OAAO,CAAC,GAAG;IAWX;;;OAGG;IACH,OAAO,CAAC,OAAO;IAqBA,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA6BvC;;;OAGG;YACW,gBAAgB;IAkIrB,SAAS,CAAC,SAAS,EAAE,WAAW,GAAG,eAAe,GAAG,IAAI,GAAG,IAAI;IAiBzE,OAAO,CAAC,iBAAiB;IAsCzB;;;OAGG;IAEG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAoCpC,cAAc,IAAI,IAAI;IAwBtB,mBAAmB,IAAI,MAAM;IAI7B,MAAM,IAAI,MAAM;IAIhB,QAAQ,IAAI,WAAW;IAIvB,WAAW,IAAI,OAAO;IAItB,YAAY,IAAI,OAAO;IAIvB,UAAU,IAAI,OAAO;IAIrB,uBAAuB,IAAI,OAAO;IAIlC,mBAAmB,IAAI,OAAO;IAI9B,aAAa,IAAI,OAAO;IAIxB,eAAe,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAmB7C,QAAQ,IAAI,uBAAuB;IAgBnC,SAAS,CAAC,WAAW,IAAI,IAAI;IAqF7B,SAAS,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IA8C5D;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAwB/B,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;cAYlB,SAAS,CAAC,GAAG,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,GAAG,CAAA;KAAE,GAAG,IAAI;IAQ/E;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAiC5B;;;OAGG;IACH,OAAO,CAAC,YAAY;IAwBpB;;;;;;;;;OASG;IACH,eAAe,CAAC,SAAS,EAAE,WAAW,GAAG,eAAe,GAAG,IAAI,GAAG,IAAI;IAiBtE;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAiC/B;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;CA2B3B"}
@@ -4,7 +4,7 @@
4
4
  * Type definitions and interfaces for the recognition client SDK.
5
5
  * These interfaces enable dependency injection, testing, and alternative implementations.
6
6
  */
7
- import { TranscriptionResultV1, FunctionCallResultV1, MetadataResultV1, ErrorResultV1, SessionConfiguredV1, ASRRequestConfig, GameContextV1, Stage } from '@recog/shared-types';
7
+ import { TranscriptionResultV1, FunctionCallResultV1, MetadataResultV1, ErrorResultV1, SessionConfiguredV1, AudioMetricsResultV1, ASRRequestConfig, GameContextV1, Stage } from '@recog/shared-types';
8
8
  /**
9
9
  * Client connection state enum
10
10
  * Represents the various states a recognition client can be in during its lifecycle
@@ -95,6 +95,8 @@ export interface IRecognitionClientConfig {
95
95
  platform?: string;
96
96
  /** Experiment cohort (optional). Defaults to 'control' if not provided. */
97
97
  experimentCohort?: 'treatment' | 'control';
98
+ /** Explicit major version for ASR config selection (e.g. 1, 3). Takes precedence over experimentCohort. */
99
+ experimentMajorVersion?: number;
98
100
  /** Callback when transcript is received */
99
101
  onTranscript?: (result: TranscriptionResultV1) => void;
100
102
  /**
@@ -104,6 +106,12 @@ export interface IRecognitionClientConfig {
104
106
  onFunctionCall?: (result: FunctionCallResultV1) => void;
105
107
  /** Callback when metadata is received. Only once after transcription is complete.*/
106
108
  onMetadata?: (metadata: MetadataResultV1) => void;
109
+ /**
110
+ * Callback when streaming audio metrics arrive (volume, silence ratio, clipping, SNR, etc.).
111
+ * Only fires when `asrRequestConfig.audioMetricsIntervalMs > 0`.
112
+ * Final metrics still arrive embedded in `onMetadata.audioMetrics`.
113
+ */
114
+ onAudioMetrics?: (metrics: AudioMetricsResultV1) => void;
107
115
  /** Callback when session is configured with actual ASR provider/model (optional) */
108
116
  onSessionConfigured?: (config: SessionConfiguredV1) => void;
109
117
  /** Callback when error occurs */
@@ -1 +1 @@
1
- {"version":3,"file":"recognition-client.types.d.ts","sourceRoot":"","sources":["../src/recognition-client.types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"recognition-client.types.d.ts","sourceRoot":"","sources":["../src/recognition-client.types.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
  * Message Handler for Recognition Client
3
3
  * Routes incoming WebSocket messages to appropriate callbacks
4
4
  */
5
- import { type TranscriptionResultV1, type FunctionCallResultV1, type MetadataResultV1, type ErrorResultV1, type ClientControlMessageV1, type SessionConfiguredV1 } from '@recog/shared-types';
5
+ import { type TranscriptionResultV1, type FunctionCallResultV1, type MetadataResultV1, type ErrorResultV1, type ClientControlMessageV1, type SessionConfiguredV1, type AudioMetricsResultV1 } from '@recog/shared-types';
6
6
  export interface MessageHandlerCallbacks {
7
7
  onTranscript: (result: TranscriptionResultV1) => void;
8
8
  onFunctionCall: (result: FunctionCallResultV1) => void;
@@ -10,6 +10,7 @@ export interface MessageHandlerCallbacks {
10
10
  onError: (error: ErrorResultV1) => void;
11
11
  onControlMessage: (msg: ClientControlMessageV1) => void;
12
12
  onSessionConfigured?: ((config: SessionConfiguredV1) => void) | undefined;
13
+ onAudioMetrics?: ((metrics: AudioMetricsResultV1) => void) | undefined;
13
14
  logger?: (level: 'debug' | 'info' | 'warn' | 'error', message: string, data?: any) => void;
14
15
  }
15
16
  export declare class MessageHandler {
@@ -1 +1 @@
1
- {"version":3,"file":"message-handler.d.ts","sourceRoot":"","sources":["../../src/utils/message-handler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAGL,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACzB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,WAAW,uBAAuB;IACtC,YAAY,EAAE,CAAC,MAAM,EAAE,qBAAqB,KAAK,IAAI,CAAC;IACtD,cAAc,EAAE,CAAC,MAAM,EAAE,oBAAoB,KAAK,IAAI,CAAC;IACvD,UAAU,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACjD,OAAO,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IACxC,gBAAgB,EAAE,CAAC,GAAG,EAAE,sBAAsB,KAAK,IAAI,CAAC;IACxD,mBAAmB,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,mBAAmB,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC1E,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;CAC5F;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,mBAAmB,CAAuB;IAClD,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,SAAS,CAA0B;gBAE/B,SAAS,EAAE,uBAAuB;IAI9C;;OAEG;IACH,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIvC;;OAEG;IACH,aAAa,CAAC,GAAG,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,GAAG,CAAA;KAAE,GAAG,IAAI;IA0DhE;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAgB3B;;OAEG;IACH,UAAU;;;;;CAUX"}
1
+ {"version":3,"file":"message-handler.d.ts","sourceRoot":"","sources":["../../src/utils/message-handler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAEL,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EAC1B,MAAM,qBAAqB,CAAC;AAE7B,MAAM,WAAW,uBAAuB;IACtC,YAAY,EAAE,CAAC,MAAM,EAAE,qBAAqB,KAAK,IAAI,CAAC;IACtD,cAAc,EAAE,CAAC,MAAM,EAAE,oBAAoB,KAAK,IAAI,CAAC;IACvD,UAAU,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACjD,OAAO,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IACxC,gBAAgB,EAAE,CAAC,GAAG,EAAE,sBAAsB,KAAK,IAAI,CAAC;IACxD,mBAAmB,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,mBAAmB,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC1E,cAAc,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,oBAAoB,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAEvE,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;CAC5F;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,mBAAmB,CAAuB;IAClD,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,SAAS,CAA0B;gBAE/B,SAAS,EAAE,uBAAuB;IAI9C;;OAEG;IACH,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIvC;;OAEG;IAEH,aAAa,CAAC,GAAG,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,GAAG,CAAA;KAAE,GAAG,IAAI;IA8DhE;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAgB3B;;OAEG;IACH,UAAU,IAAI;QACZ,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;QAChC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;QACnC,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;KACtC;CAUF"}
@@ -20,6 +20,8 @@ export interface UrlBuilderConfig {
20
20
  gameId?: string;
21
21
  /** Experiment cohort - defaults to 'control' if not provided */
22
22
  experimentCohort?: 'treatment' | 'control';
23
+ /** Explicit major version for ASR config selection */
24
+ experimentMajorVersion?: number;
23
25
  }
24
26
  /**
25
27
  * Build WebSocket URL with all query parameters
@@ -1 +1 @@
1
- {"version":3,"file":"url-builder.d.ts","sourceRoot":"","sources":["../../src/utils/url-builder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAE7E,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,sBAAsB,EAAE,CAAC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,aAAa,CAAC;IAC5B,oFAAoF;IACpF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gEAAgE;IAChE,gBAAgB,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;CAC5C;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAkElE"}
1
+ {"version":3,"file":"url-builder.d.ts","sourceRoot":"","sources":["../../src/utils/url-builder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAE7E,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,sBAAsB,EAAE,CAAC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,aAAa,CAAC;IAC5B,oFAAoF;IACpF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gEAAgE;IAChE,gBAAgB,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IAC3C,sDAAsD;IACtD,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAuElE"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@volley/recognition-client-sdk",
3
- "version": "0.1.689",
3
+ "version": "0.1.767",
4
4
  "description": "Recognition Service TypeScript/Node.js Client SDK",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -55,9 +55,9 @@
55
55
  "ts-jest": "29.2.5",
56
56
  "typescript": "5.1.6",
57
57
  "@recog/shared-config": "1.0.0",
58
- "@recog/shared-types": "1.0.0",
59
58
  "@recog/shared-utils": "1.0.0",
60
- "@recog/websocket": "1.0.0"
59
+ "@recog/websocket": "1.0.0",
60
+ "@recog/shared-types": "1.0.0"
61
61
  },
62
62
  "keywords": [
63
63
  "recognition",
@@ -14,6 +14,7 @@ import type {
14
14
  TranscriptionResultV1,
15
15
  MetadataResultV1,
16
16
  SessionConfiguredV1,
17
+ AudioMetricsResultV1,
17
18
  ErrorResultV1,
18
19
  Stage
19
20
  } from '@recog/shared-types';
@@ -160,6 +161,15 @@ export class ConfigBuilder {
160
161
  return this;
161
162
  }
162
163
 
164
+ /**
165
+ * Set explicit major version for ASR config selection.
166
+ * Takes precedence over experimentCohort-based version resolution.
167
+ */
168
+ experimentMajorVersion(version: number): this {
169
+ this.config.experimentMajorVersion = version;
170
+ return this;
171
+ }
172
+
163
173
  /**
164
174
  * Set transcript callback
165
175
  */
@@ -184,6 +194,15 @@ export class ConfigBuilder {
184
194
  return this;
185
195
  }
186
196
 
197
+ /**
198
+ * Set streaming audio metrics callback (optional).
199
+ * Only fires when `asrRequestConfig.audioMetricsIntervalMs > 0`.
200
+ */
201
+ onAudioMetrics(callback: (metrics: AudioMetricsResultV1) => void): this {
202
+ this.config.onAudioMetrics = callback;
203
+ return this;
204
+ }
205
+
187
206
  /**
188
207
  * Set error callback
189
208
  */
@@ -243,6 +262,7 @@ export class ConfigBuilder {
243
262
  /**
244
263
  * Set logger function
245
264
  */
265
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
246
266
  logger(logger: (level: 'debug' | 'info' | 'warn' | 'error', message: string, data?: any) => void): this {
247
267
  this.config.logger = logger;
248
268
  return this;
package/src/index.ts CHANGED
@@ -87,6 +87,7 @@ export {
87
87
  type TranscriptionResultV1,
88
88
  type FunctionCallResultV1,
89
89
  type MetadataResultV1,
90
+ type AudioMetricsResultV1,
90
91
  type ErrorResultV1,
91
92
  RecognitionResultTypeV1,
92
93
  ClientControlActionV1,
@@ -109,6 +110,8 @@ export {
109
110
  MistralVoxtralModel,
110
111
  CartesiaModel,
111
112
  DashScopeModel,
113
+ BedrockModel,
114
+ AwsTranscribeModel,
112
115
  Language,
113
116
  SampleRate,
114
117
 
@@ -33,6 +33,7 @@
33
33
  * ```
34
34
  */
35
35
 
36
+ /* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-function-return-type */
36
37
  import { WebSocketAudioClient } from '@recog/websocket';
37
38
  import {
38
39
  AudioEncoding,
@@ -46,6 +47,7 @@ import {
46
47
  type ErrorResultV1,
47
48
  type ClientControlMessageV1,
48
49
  type SessionConfiguredV1,
50
+ type AudioMetricsResultV1,
49
51
  type ASRRequestConfig,
50
52
  type ASRRequestV1,
51
53
  type GameContextV1,
@@ -129,6 +131,7 @@ interface InternalConfig {
129
131
  onFunctionCall: (result: FunctionCallResultV1) => void;
130
132
  onMetadata: (metadata: MetadataResultV1) => void;
131
133
  onSessionConfigured?: ((config: SessionConfiguredV1) => void) | undefined;
134
+ onAudioMetrics?: ((metrics: AudioMetricsResultV1) => void) | undefined;
132
135
  onError: (error: ErrorResultV1) => void;
133
136
  onConnected: () => void;
134
137
  onDisconnected: (code: number, reason: string) => void;
@@ -196,7 +199,8 @@ export class RealTimeTwoWayWebSocketRecognitionClient
196
199
  ...(config.platform && { platform: config.platform }),
197
200
  ...(config.gameContext && { gameContext: config.gameContext }),
198
201
  ...(config.gameId && { gameId: config.gameId }),
199
- ...(config.experimentCohort && { experimentCohort: config.experimentCohort })
202
+ ...(config.experimentCohort && { experimentCohort: config.experimentCohort }),
203
+ ...(config.experimentMajorVersion !== undefined && { experimentMajorVersion: config.experimentMajorVersion })
200
204
  });
201
205
 
202
206
  // Initialize base WebSocketAudioClient
@@ -222,6 +226,7 @@ export class RealTimeTwoWayWebSocketRecognitionClient
222
226
  onFunctionCall: config.onFunctionCall || (() => {}),
223
227
  onMetadata: config.onMetadata || (() => {}),
224
228
  onSessionConfigured: config.onSessionConfigured,
229
+ onAudioMetrics: config.onAudioMetrics,
225
230
  onError: config.onError || (() => {}),
226
231
  onConnected: config.onConnected || (() => {}),
227
232
  onDisconnected: config.onDisconnected || (() => {}),
@@ -251,6 +256,7 @@ export class RealTimeTwoWayWebSocketRecognitionClient
251
256
  onError: this.config.onError,
252
257
  onControlMessage: this.handleControlMessage.bind(this),
253
258
  onSessionConfigured: this.config.onSessionConfigured,
259
+ onAudioMetrics: this.config.onAudioMetrics,
254
260
  ...(this.config.logger && { logger: this.config.logger })
255
261
  });
256
262
  }
@@ -710,6 +716,10 @@ export class RealTimeTwoWayWebSocketRecognitionClient
710
716
  // Include prefix text to remove if provided (for server-side prefix text removal)
711
717
  ...(this.config.asrRequestConfig.prefixTextToRemove && {
712
718
  prefixTextToRemove: this.config.asrRequestConfig.prefixTextToRemove
719
+ }),
720
+ // Streaming audio metrics opt-in (ms interval). Server only forwards metrics if > 0.
721
+ ...(this.config.asrRequestConfig.audioMetricsIntervalMs !== undefined && {
722
+ audioMetricsIntervalMs: this.config.asrRequestConfig.audioMetricsIntervalMs
713
723
  })
714
724
  };
715
725
 
@@ -11,6 +11,7 @@ import {
11
11
  MetadataResultV1,
12
12
  ErrorResultV1,
13
13
  SessionConfiguredV1,
14
+ AudioMetricsResultV1,
14
15
  ASRRequestConfig,
15
16
  GameContextV1,
16
17
  Stage
@@ -131,6 +132,9 @@ export interface IRecognitionClientConfig {
131
132
  /** Experiment cohort (optional). Defaults to 'control' if not provided. */
132
133
  experimentCohort?: 'treatment' | 'control';
133
134
 
135
+ /** Explicit major version for ASR config selection (e.g. 1, 3). Takes precedence over experimentCohort. */
136
+ experimentMajorVersion?: number;
137
+
134
138
  /** Callback when transcript is received */
135
139
  onTranscript?: (result: TranscriptionResultV1) => void;
136
140
 
@@ -143,6 +147,13 @@ export interface IRecognitionClientConfig {
143
147
  /** Callback when metadata is received. Only once after transcription is complete.*/
144
148
  onMetadata?: (metadata: MetadataResultV1) => void;
145
149
 
150
+ /**
151
+ * Callback when streaming audio metrics arrive (volume, silence ratio, clipping, SNR, etc.).
152
+ * Only fires when `asrRequestConfig.audioMetricsIntervalMs > 0`.
153
+ * Final metrics still arrive embedded in `onMetadata.audioMetrics`.
154
+ */
155
+ onAudioMetrics?: (metrics: AudioMetricsResultV1) => void;
156
+
146
157
  /** Callback when session is configured with actual ASR provider/model (optional) */
147
158
  onSessionConfigured?: (config: SessionConfiguredV1) => void;
148
159
 
@@ -203,6 +214,7 @@ export interface IRecognitionClientConfig {
203
214
  * @param message - Log message
204
215
  * @param data - Optional additional data
205
216
  */
217
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
206
218
  logger?: (level: 'debug' | 'info' | 'warn' | 'error', message: string, data?: any) => void;
207
219
  }
208
220
 
@@ -5,13 +5,13 @@
5
5
 
6
6
  import {
7
7
  RecognitionResultTypeV1,
8
- ClientControlActionV1,
9
8
  type TranscriptionResultV1,
10
9
  type FunctionCallResultV1,
11
10
  type MetadataResultV1,
12
11
  type ErrorResultV1,
13
12
  type ClientControlMessageV1,
14
- type SessionConfiguredV1
13
+ type SessionConfiguredV1,
14
+ type AudioMetricsResultV1
15
15
  } from '@recog/shared-types';
16
16
 
17
17
  export interface MessageHandlerCallbacks {
@@ -21,6 +21,8 @@ export interface MessageHandlerCallbacks {
21
21
  onError: (error: ErrorResultV1) => void;
22
22
  onControlMessage: (msg: ClientControlMessageV1) => void;
23
23
  onSessionConfigured?: ((config: SessionConfiguredV1) => void) | undefined;
24
+ onAudioMetrics?: ((metrics: AudioMetricsResultV1) => void) | undefined;
25
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
24
26
  logger?: (level: 'debug' | 'info' | 'warn' | 'error', message: string, data?: any) => void;
25
27
  }
26
28
 
@@ -43,6 +45,7 @@ export class MessageHandler {
43
45
  /**
44
46
  * Handle incoming WebSocket message
45
47
  */
48
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
46
49
  handleMessage(msg: { v: number; type: string; data: any }): void {
47
50
  // Log ALL incoming messages for debugging
48
51
  if (this.callbacks.logger) {
@@ -93,6 +96,10 @@ export class MessageHandler {
93
96
  this.callbacks.onSessionConfigured?.(msgData as SessionConfiguredV1);
94
97
  break;
95
98
 
99
+ case RecognitionResultTypeV1.AUDIO_METRICS:
100
+ this.callbacks.onAudioMetrics?.(msgData as AudioMetricsResultV1);
101
+ break;
102
+
96
103
  default:
97
104
  // Unknown message type - log if logger available
98
105
  if (this.callbacks.logger) {
@@ -124,7 +131,11 @@ export class MessageHandler {
124
131
  /**
125
132
  * Get performance metrics
126
133
  */
127
- getMetrics() {
134
+ getMetrics(): {
135
+ sessionStartTime: number | null;
136
+ firstTranscriptTime: number | null;
137
+ timeToFirstTranscript: number | null;
138
+ } {
128
139
  return {
129
140
  sessionStartTime: this.sessionStartTime,
130
141
  firstTranscriptTime: this.firstTranscriptTime,
@@ -240,6 +240,49 @@ describe('buildWebSocketUrl', () => {
240
240
  expect(urlObj.searchParams.get('platform')).toBe('iOS 17.0');
241
241
  });
242
242
 
243
+ // Spec: docs-internal/spec/experiment-cohort-routing.spec.md
244
+ it('should add experimentCohort to query parameters', () => {
245
+ const config = {
246
+ ...baseConfig,
247
+ experimentCohort: 'treatment' as const
248
+ };
249
+ const url = buildWebSocketUrl(config);
250
+ const urlObj = new URL(url);
251
+ expect(urlObj.searchParams.get('experimentCohort')).toBe('treatment');
252
+ });
253
+
254
+ it('should add experimentMajorVersion to query parameters', () => {
255
+ const config = {
256
+ ...baseConfig,
257
+ experimentMajorVersion: 3
258
+ };
259
+ const url = buildWebSocketUrl(config);
260
+ const urlObj = new URL(url);
261
+ expect(urlObj.searchParams.get('experimentMajorVersion')).toBe('3');
262
+ });
263
+
264
+ it('should not add experimentCohort if not provided', () => {
265
+ const url = buildWebSocketUrl(baseConfig);
266
+ expect(url).not.toContain('experimentCohort=');
267
+ });
268
+
269
+ it('should not add experimentMajorVersion if not provided', () => {
270
+ const url = buildWebSocketUrl(baseConfig);
271
+ expect(url).not.toContain('experimentMajorVersion=');
272
+ });
273
+
274
+ it('should add both experimentCohort and experimentMajorVersion', () => {
275
+ const config = {
276
+ ...baseConfig,
277
+ experimentCohort: 'control' as const,
278
+ experimentMajorVersion: 1
279
+ };
280
+ const url = buildWebSocketUrl(config);
281
+ const urlObj = new URL(url);
282
+ expect(urlObj.searchParams.get('experimentCohort')).toBe('control');
283
+ expect(urlObj.searchParams.get('experimentMajorVersion')).toBe('1');
284
+ });
285
+
243
286
  it('should create valid URL object', () => {
244
287
  const config = {
245
288
  ...baseConfig,
@@ -23,6 +23,8 @@ export interface UrlBuilderConfig {
23
23
  gameId?: string;
24
24
  /** Experiment cohort - defaults to 'control' if not provided */
25
25
  experimentCohort?: 'treatment' | 'control';
26
+ /** Explicit major version for ASR config selection */
27
+ experimentMajorVersion?: number;
26
28
  }
27
29
 
28
30
  /**
@@ -95,5 +97,10 @@ export function buildWebSocketUrl(config: UrlBuilderConfig): string {
95
97
  url.searchParams.set('experimentCohort', config.experimentCohort);
96
98
  }
97
99
 
100
+ // Add explicit major version if provided
101
+ if (config.experimentMajorVersion !== undefined) {
102
+ url.searchParams.set('experimentMajorVersion', String(config.experimentMajorVersion));
103
+ }
104
+
98
105
  return url.toString();
99
106
  }