@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.
- package/dist/browser.bundled.d.ts +102 -1
- package/dist/config-builder.d.ts +11 -1
- package/dist/config-builder.d.ts.map +1 -1
- package/dist/index.bundled.d.ts +117 -3
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +63 -7
- package/dist/index.js.map +3 -3
- package/dist/recog-client-sdk.browser.js +44 -7
- package/dist/recog-client-sdk.browser.js.map +3 -3
- package/dist/recognition-client.d.ts.map +1 -1
- package/dist/recognition-client.types.d.ts +9 -1
- package/dist/recognition-client.types.d.ts.map +1 -1
- package/dist/utils/message-handler.d.ts +2 -1
- package/dist/utils/message-handler.d.ts.map +1 -1
- package/dist/utils/url-builder.d.ts +2 -0
- package/dist/utils/url-builder.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/config-builder.ts +20 -0
- package/src/index.ts +3 -0
- package/src/recognition-client.ts +11 -1
- package/src/recognition-client.types.ts +12 -0
- package/src/utils/message-handler.ts +14 -3
- package/src/utils/url-builder.spec.ts +43 -0
- package/src/utils/url-builder.ts +7 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recognition-client.d.ts","sourceRoot":"","sources":["../src/recognition-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;
|
|
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,
|
|
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;
|
|
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.
|
|
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",
|
package/src/config-builder.ts
CHANGED
|
@@ -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,
|
package/src/utils/url-builder.ts
CHANGED
|
@@ -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
|
}
|