uneeq-js 2.47.10 → 2.48.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.
@@ -1,4 +1,5 @@
1
1
  import { AvatarAvailableCountResponse } from '../types/AvatarAvailableCountResponse';
2
+ import { ChatMetadata } from '../types/ChatMetadata';
2
3
  import { MediaUnavailableRequest } from '../types/MediaUnavailableRequest';
3
4
  import { NewSessionRequest } from '../types/NewSessionRequest';
4
5
  import { NewSessionResponse } from '../types/NewSessionResponse';
@@ -19,8 +20,8 @@ export declare class API {
19
20
  startSession(data: NewSessionRequest): Promise<NewSessionResponse>;
20
21
  endCall(): Promise<void>;
21
22
  avatarStart(data: PersonaStartRequest): Promise<void>;
22
- avatarWelcome(): Promise<void>;
23
- avatarAsk(text: string): Promise<void>;
23
+ avatarWelcome(metadata?: ChatMetadata): Promise<void>;
24
+ avatarAsk(text: string, metadata?: ChatMetadata): Promise<void>;
24
25
  avatarStartRecording(): Promise<void>;
25
26
  avatarStopRecording(): Promise<void>;
26
27
  stopSpeaking(): Promise<void>;
@@ -1,6 +1,7 @@
1
+ import { ChatMetadata } from '../types/ChatMetadata';
1
2
  import { SpeechHandlerOptions } from '../types/SpeechHandlerOptions';
2
3
  export declare class SpeechHandler {
3
- private options;
4
+ options: SpeechHandlerOptions;
4
5
  private ws;
5
6
  private mediaRecorder;
6
7
  private logPrefix;
@@ -17,6 +18,7 @@ export declare class SpeechHandler {
17
18
  stopRecognition(): void;
18
19
  pause(): boolean;
19
20
  resume(): boolean;
21
+ setChatMetadata(chatMetadata: ChatMetadata): void;
20
22
  private loadScript;
21
23
  private loadScripts;
22
24
  private handleAppMessages;
@@ -0,0 +1,9 @@
1
+ export interface ChatMetadata {
2
+ userSpokenLocale?: string;
3
+ browserDetectedLocales?: string;
4
+ userTimezone?: string;
5
+ userScreenWidth?: number;
6
+ userScreenHeight?: number;
7
+ userAgent?: string;
8
+ custom?: string;
9
+ }
@@ -1,3 +1,4 @@
1
+ import { ChatMetadata } from './ChatMetadata';
1
2
  import { ClientPerformanceStats } from './ClientPerformanceStats';
2
3
  import { PublishSubscribeState } from './PublishSubscribeState';
3
4
  import { SpeechTranscriptionResult } from './SpeechTranscriptionResult';
@@ -52,7 +53,8 @@ export declare enum UneeqMessageType {
52
53
  DigitalHumanVideoError = "DigitalHumanVideoError",
53
54
  DigitalHumanFailedToPlay = "DigitalHumanFailedToPlay",
54
55
  DigitalHumanPlayedInMutedModeSuccess = "DigitalHumanPlayedInMutedModeSuccess",
55
- DigitalHumanUnmuted = "DigitalHumanUnmuted"
56
+ DigitalHumanUnmuted = "DigitalHumanUnmuted",
57
+ CustomMetadataUpdated = "CustomMetadataUpdated"
56
58
  }
57
59
  /**
58
60
  * Service is ready to be used
@@ -432,3 +434,8 @@ export declare class DigitalHumanUnmuted implements UneeqMessage {
432
434
  uneeqMessageType: UneeqMessageType;
433
435
  constructor();
434
436
  }
437
+ export declare class CustomMetadataUpdated implements UneeqMessage {
438
+ readonly chatMetadata: ChatMetadata;
439
+ uneeqMessageType: UneeqMessageType;
440
+ constructor(chatMetadata: ChatMetadata);
441
+ }
@@ -1,5 +1,6 @@
1
1
  import { Subject } from 'rxjs';
2
2
  import { API } from '../service/api';
3
+ import { ChatMetadata } from './ChatMetadata';
3
4
  export interface SpeechHandlerOptions {
4
5
  apiUrl: string;
5
6
  sessionId: string;
@@ -9,4 +10,5 @@ export interface SpeechHandlerOptions {
9
10
  hintPhrases: string;
10
11
  locales: string;
11
12
  jwtToken: string;
13
+ chatMetadata: ChatMetadata;
12
14
  }
@@ -81,4 +81,10 @@ export interface UneeqOptions {
81
81
  * A space separated list of phrases the speech recognition system should expect.
82
82
  */
83
83
  speechRecognitionHintPhrases?: string;
84
+ /**
85
+ * Custom Metadata
86
+ * A stringified value that will be sent to BYO NLPs with all chat calls like playWelcomeMessage and sendTranscript requests.
87
+ * This can be set to any stringified value.
88
+ */
89
+ customMetadata?: string;
84
90
  }
@@ -34,6 +34,7 @@ export declare class Uneeq {
34
34
  private digitalHumanVideoElement;
35
35
  private sessionWasResumed;
36
36
  private uneeqLocalStorage;
37
+ private chatMetadata;
37
38
  constructor(options: UneeqOptions);
38
39
  setLoggerEnabled(enabled: boolean): void;
39
40
  /**
@@ -83,6 +84,13 @@ export declare class Uneeq {
83
84
  * @param enable Defaults to true
84
85
  */
85
86
  enableMicrophoneAndCamera(enable?: boolean): void;
87
+ /**
88
+ * Set the custom field in chat metadata to a string value that will be sent
89
+ * to BYO NLPs with all chat calls like playWelcomeMessage and sendTranscript requests.
90
+ *
91
+ * @param customMetadata
92
+ */
93
+ setCustomChatMetadata(customMetadata: string): void;
86
94
  /**
87
95
  * Send a text based message to the avatar.
88
96
  * @param text
@@ -168,4 +176,5 @@ export declare class Uneeq {
168
176
  * Warn implementer if unavailable
169
177
  */
170
178
  private checkIfResumeSessionIsAvailable;
179
+ private initChatMetadata;
171
180
  }
package/dist/umd/index.js CHANGED
@@ -3727,6 +3727,7 @@ class Uneeq {
3727
3727
  if (this.options.customData) {
3728
3728
  this.startSessionData.customData = this.options.customData;
3729
3729
  }
3730
+ this.chatMetadata = this.initChatMetadata(this.options);
3730
3731
  logger_1.logger.log(`Uneeq Created (version ${this.version})`);
3731
3732
  this.streamManager = new stream_manager_1.StreamManager();
3732
3733
  this.initDigitalHumanVideoElement();
@@ -3849,6 +3850,21 @@ class Uneeq {
3849
3850
  this.deviceManager.enableLocalDevices(enable, enable);
3850
3851
  }
3851
3852
  }
3853
+ /**
3854
+ * Set the custom field in chat metadata to a string value that will be sent
3855
+ * to BYO NLPs with all chat calls like playWelcomeMessage and sendTranscript requests.
3856
+ *
3857
+ * @param customMetadata
3858
+ */
3859
+ setCustomChatMetadata(customMetadata) {
3860
+ if (this.chatMetadata) {
3861
+ this.chatMetadata.custom = customMetadata;
3862
+ this.messages.next(new MessageTypes_1.CustomMetadataUpdated(this.chatMetadata));
3863
+ }
3864
+ else {
3865
+ this.messages.next(new MessageTypes_1.WarningMessage('Call to set custom chat metadata will be ignored as metadata does not exist yet.'));
3866
+ }
3867
+ }
3852
3868
  /**
3853
3869
  * Send a text based message to the avatar.
3854
3870
  * @param text
@@ -3856,7 +3872,7 @@ class Uneeq {
3856
3872
  sendTranscript(text) {
3857
3873
  if (this.serviceReadyCheck('sendTranscript')) {
3858
3874
  if (!this.sessionPaused) {
3859
- this.api.avatarAsk(text);
3875
+ this.api.avatarAsk(text, this.chatMetadata);
3860
3876
  }
3861
3877
  else {
3862
3878
  this.messages.next(new MessageTypes_1.WarningMessage('Call to sendTranscript() will be ignored. Session is paused.'));
@@ -3977,7 +3993,7 @@ class Uneeq {
3977
3993
  * Trigger this conversation's welcome message
3978
3994
  */
3979
3995
  playWelcomeMessage() {
3980
- return this.api.avatarWelcome();
3996
+ return this.api.avatarWelcome(this.chatMetadata);
3981
3997
  }
3982
3998
  /* Unmute the digital human video - this might be called if the video started in muted mode.*/
3983
3999
  unmuteDigitalHuman() {
@@ -4042,7 +4058,8 @@ class Uneeq {
4042
4058
  assetBasePath: this.options.assetBasePath,
4043
4059
  locales: this.options.speechToTextLocales || '',
4044
4060
  hintPhrases: this.options.speechRecognitionHintPhrases || '',
4045
- jwtToken: token
4061
+ jwtToken: token,
4062
+ chatMetadata: this.chatMetadata
4046
4063
  });
4047
4064
  }
4048
4065
  else {
@@ -4072,7 +4089,7 @@ class Uneeq {
4072
4089
  if (!this.sessionStarted) {
4073
4090
  this.messages.next(new MessageTypes_1.SessionLiveMessage(this.session.showUneeqLogo || false, this.sessionWasResumed));
4074
4091
  if (this.options.playWelcome) {
4075
- this.api.avatarWelcome();
4092
+ this.playWelcomeMessage();
4076
4093
  }
4077
4094
  // Metric the session start time
4078
4095
  const startTimeMetric = {
@@ -4210,6 +4227,17 @@ class Uneeq {
4210
4227
  this.options.resumeSession = false;
4211
4228
  }
4212
4229
  }
4230
+ initChatMetadata(options) {
4231
+ return {
4232
+ userSpokenLocale: '',
4233
+ browserDetectedLocales: options.speechToTextLocales,
4234
+ userTimezone: this.api.getTimeZone(),
4235
+ userScreenWidth: window.screen.availWidth,
4236
+ userScreenHeight: window.screen.availHeight,
4237
+ userAgent: navigator.userAgent,
4238
+ custom: options.customMetadata
4239
+ };
4240
+ }
4213
4241
  }
4214
4242
  exports.Uneeq = Uneeq;
4215
4243
 
@@ -13271,7 +13299,7 @@ exports.race = race;
13271
13299
  /***/ ((module) => {
13272
13300
 
13273
13301
  "use strict";
13274
- module.exports = JSON.parse('{"name":"uneeq-js","version":"2.47.10","description":"","main":"dist/index.js","types":"dist/src/index.d.ts","scripts":{"start":"npx webpack -w","test-local":"npx karma start karma.conf.js -logLevel=DEBUG","test":"npx karma start --browsers ChromeHeadless --single-run","test:windows":"karma start karma.conf.js","build":"webpack --config webpack.config.prod.js && webpack --config webpack.config.umd.js","lint":"npx tslint -p tsconfig.json --fix","docs":"npx typedoc --options"},"files":["dist","!dist/test"],"author":"","license":"ISC","dependencies":{"@stomp/stompjs":"^6.0.0","@uehreka/seriously":"^1.0.1","fast-text-encoding":"^1.0.0","intrinsic-scale":"^3.0.4","onnxruntime-web":"^1.15.1","promjs":"^0.4.1","ring-buffer-ts":"^1.2.0","rxjs":"^7.8.1","rxjs-compat":"^6.6.7","simple-peer":"^9.11.1","webrtc-adapter":"^8.2.3"},"devDependencies":{"@types/dom-mediacapture-record":"^1.0.16","@types/jasmine":"^2.8.8","@types/node":"^10.9.4","fetch-mock":"7.7.3","ignore-styles":"^5.0.1","jasmine":"^5.1.0","jasmine-core":"^5.1.0","karma":"^6.4.2","karma-chrome-launcher":"^3.2.0","karma-firefox-launcher":"^2.1.2","karma-jasmine":"^5.1.0","karma-jasmine-html-reporter":"^2.1.0","karma-requirejs":"^1.1.0","karma-typescript":"^5.5.4","karma-typescript-es6-transform":"^5.5.4","nock":"^9.6.1","requirejs":"^2.3.6","ts-loader":"^9.4.4","ts-node":"^7.0.1","tslint":"^5.11.0","tslint-no-focused-test":"^0.5.0","typedoc":"^0.18.0","typescript":"^5.1.6","webpack":"^5.88.2","webpack-cli":"^5.1.4"}}');
13302
+ module.exports = JSON.parse('{"name":"uneeq-js","version":"2.48.0","description":"","main":"dist/index.js","types":"dist/src/index.d.ts","scripts":{"start":"npx webpack -w","test-local":"npx karma start karma.conf.js -logLevel=DEBUG","test":"npx karma start --browsers ChromeHeadless --single-run","test:windows":"karma start karma.conf.js","build":"webpack --config webpack.config.prod.js && webpack --config webpack.config.umd.js","lint":"npx tslint -p tsconfig.json --fix","docs":"npx typedoc --options"},"files":["dist","!dist/test"],"author":"","license":"ISC","dependencies":{"@stomp/stompjs":"^6.0.0","@uehreka/seriously":"^1.0.1","fast-text-encoding":"^1.0.0","intrinsic-scale":"^3.0.4","onnxruntime-web":"^1.15.1","promjs":"^0.4.1","ring-buffer-ts":"^1.2.0","rxjs":"^7.8.1","rxjs-compat":"^6.6.7","simple-peer":"^9.11.1","webrtc-adapter":"^8.2.3"},"devDependencies":{"@types/dom-mediacapture-record":"^1.0.16","@types/jasmine":"^2.8.8","@types/node":"^10.9.4","fetch-mock":"7.7.3","ignore-styles":"^5.0.1","jasmine":"^5.1.0","jasmine-core":"^5.1.0","karma":"^6.4.2","karma-chrome-launcher":"^3.2.0","karma-firefox-launcher":"^2.1.2","karma-jasmine":"^5.1.0","karma-jasmine-html-reporter":"^2.1.0","karma-requirejs":"^1.1.0","karma-typescript":"^5.5.4","karma-typescript-es6-transform":"^5.5.4","nock":"^9.6.1","requirejs":"^2.3.6","ts-loader":"^9.4.4","ts-node":"^7.0.1","tslint":"^5.11.0","tslint-no-focused-test":"^0.5.0","typedoc":"^0.18.0","typescript":"^5.1.6","webpack":"^5.88.2","webpack-cli":"^5.1.4"}}');
13275
13303
 
13276
13304
  /***/ }),
13277
13305
  /* 242 */
@@ -13312,11 +13340,16 @@ class API {
13312
13340
  avatarStart(data) {
13313
13341
  return this.postRequest('/api/v1/avatar/' + this._callId + '/start', data);
13314
13342
  }
13315
- avatarWelcome() {
13316
- return this.postRequest('/api/v1/avatar/' + this._callId + '/welcome');
13343
+ avatarWelcome(metadata = {}) {
13344
+ return this.postRequest('/api/v1/avatar/' + this._callId + '/welcome', {
13345
+ metadata: JSON.stringify(metadata)
13346
+ });
13317
13347
  }
13318
- avatarAsk(text) {
13319
- return this.postRequest('/api/v1/avatar/' + this._callId + '/ask', { text });
13348
+ avatarAsk(text, metadata = {}) {
13349
+ return this.postRequest('/api/v1/avatar/' + this._callId + '/ask', {
13350
+ text,
13351
+ metadata: JSON.stringify(metadata)
13352
+ });
13320
13353
  }
13321
13354
  avatarStartRecording() {
13322
13355
  return this.postRequest('/api/v1/avatar/' + this._callId + '/audioCapture/start');
@@ -29928,7 +29961,7 @@ exports.DigitalHumanVideoPlayManager = DigitalHumanVideoPlayManager;
29928
29961
  "use strict";
29929
29962
 
29930
29963
  Object.defineProperty(exports, "__esModule", ({ value: true }));
29931
- exports.DigitalHumanUnmuted = exports.DigitalHumanPlayedInMutedModeSuccess = exports.DigitalHumanFailedToPlay = exports.DigitalHumanVideoError = exports.ClientPerformanceMessage = exports.ClientMediaStreamUpdateMessage = exports.OnlineStatusUpdateMessage = exports.SessionInfoMessage = exports.AvatarRequestIgnored = exports.AvatarRequestCompleted = exports.SessionErrorMessage = exports.WebRtcStatsMessage = exports.WebRtcDataMessage = exports.SessionLiveMessage = exports.WarningMessage = exports.RecordingStoppedMessage = exports.RecordingStartedMessage = exports.DevicePermissionAllowedMessage = exports.AvatarTextInputFinishedMessage = exports.FinishedSpeakingMessage = exports.StartedSpeakingMessage = exports.UserStoppedSpeakingMessage = exports.UserStartedSpeakingMessage = exports.SpeechTranscriptionMessage = exports.AvatarQuestionMessage = exports.InstructionsMessage = exports.AvatarAnswerContentMessage = exports.AvatarAnswerMessage = exports.ResumeSessionUnavailable = exports.ConnectionLostMessage = exports.VoiceActivityInputModeNotSupportedMessage = exports.MicActivityNotSupportedMessage = exports.MicActivityMessage = exports.MicActivityErrorMessage = exports.ServiceUnavailableMessage = exports.AvatarUnavailableMessage = exports.AvatarAvailableMessage = exports.SessionEndedMessage = exports.SessionResumedMessage = exports.SessionPausedMessage = exports.DeviceListUpdatedMessage = exports.DeviceErrorMessage = exports.SetSpeakerSuccessMessage = exports.SetMicSuccessMessage = exports.SetCameraSuccessMessage = exports.DeviceNotFoundErrorMessage = exports.ReadyMessage = exports.UneeqMessageType = void 0;
29964
+ exports.CustomMetadataUpdated = exports.DigitalHumanUnmuted = exports.DigitalHumanPlayedInMutedModeSuccess = exports.DigitalHumanFailedToPlay = exports.DigitalHumanVideoError = exports.ClientPerformanceMessage = exports.ClientMediaStreamUpdateMessage = exports.OnlineStatusUpdateMessage = exports.SessionInfoMessage = exports.AvatarRequestIgnored = exports.AvatarRequestCompleted = exports.SessionErrorMessage = exports.WebRtcStatsMessage = exports.WebRtcDataMessage = exports.SessionLiveMessage = exports.WarningMessage = exports.RecordingStoppedMessage = exports.RecordingStartedMessage = exports.DevicePermissionAllowedMessage = exports.AvatarTextInputFinishedMessage = exports.FinishedSpeakingMessage = exports.StartedSpeakingMessage = exports.UserStoppedSpeakingMessage = exports.UserStartedSpeakingMessage = exports.SpeechTranscriptionMessage = exports.AvatarQuestionMessage = exports.InstructionsMessage = exports.AvatarAnswerContentMessage = exports.AvatarAnswerMessage = exports.ResumeSessionUnavailable = exports.ConnectionLostMessage = exports.VoiceActivityInputModeNotSupportedMessage = exports.MicActivityNotSupportedMessage = exports.MicActivityMessage = exports.MicActivityErrorMessage = exports.ServiceUnavailableMessage = exports.AvatarUnavailableMessage = exports.AvatarAvailableMessage = exports.SessionEndedMessage = exports.SessionResumedMessage = exports.SessionPausedMessage = exports.DeviceListUpdatedMessage = exports.DeviceErrorMessage = exports.SetSpeakerSuccessMessage = exports.SetMicSuccessMessage = exports.SetCameraSuccessMessage = exports.DeviceNotFoundErrorMessage = exports.ReadyMessage = exports.UneeqMessageType = void 0;
29932
29965
  var UneeqMessageType;
29933
29966
  (function (UneeqMessageType) {
29934
29967
  UneeqMessageType["Ready"] = "Ready";
@@ -29978,6 +30011,7 @@ var UneeqMessageType;
29978
30011
  UneeqMessageType["DigitalHumanFailedToPlay"] = "DigitalHumanFailedToPlay";
29979
30012
  UneeqMessageType["DigitalHumanPlayedInMutedModeSuccess"] = "DigitalHumanPlayedInMutedModeSuccess";
29980
30013
  UneeqMessageType["DigitalHumanUnmuted"] = "DigitalHumanUnmuted";
30014
+ UneeqMessageType["CustomMetadataUpdated"] = "CustomMetadataUpdated";
29981
30015
  })(UneeqMessageType || (exports.UneeqMessageType = UneeqMessageType = {}));
29982
30016
  /**
29983
30017
  * Service is ready to be used
@@ -30454,6 +30488,13 @@ class DigitalHumanUnmuted {
30454
30488
  }
30455
30489
  }
30456
30490
  exports.DigitalHumanUnmuted = DigitalHumanUnmuted;
30491
+ class CustomMetadataUpdated {
30492
+ constructor(chatMetadata) {
30493
+ this.chatMetadata = chatMetadata;
30494
+ this.uneeqMessageType = UneeqMessageType.CustomMetadataUpdated;
30495
+ }
30496
+ }
30497
+ exports.CustomMetadataUpdated = CustomMetadataUpdated;
30457
30498
 
30458
30499
 
30459
30500
  /***/ }),
@@ -51246,6 +51287,7 @@ class SpeechHandler {
51246
51287
  if (this.stream && this.micVad) {
51247
51288
  this.stream.getTracks().forEach((track) => track.enabled = false);
51248
51289
  this.micVad.pause();
51290
+ this.onVadSpeechEnd();
51249
51291
  return true;
51250
51292
  }
51251
51293
  logger_1.logger.warn(this.logPrefix + 'Could not pause speech recognition.');
@@ -51260,6 +51302,9 @@ class SpeechHandler {
51260
51302
  logger_1.logger.warn(this.logPrefix + 'Could not resume speech recognition.');
51261
51303
  return false;
51262
51304
  }
51305
+ setChatMetadata(chatMetadata) {
51306
+ this.options.chatMetadata = chatMetadata;
51307
+ }
51263
51308
  loadScript(url) {
51264
51309
  return new Promise((resolve) => {
51265
51310
  const script = document.createElement('script');
@@ -51295,6 +51340,9 @@ class SpeechHandler {
51295
51340
  this.stopRecognition();
51296
51341
  this.ws.close();
51297
51342
  break;
51343
+ case MessageTypes_1.UneeqMessageType.CustomMetadataUpdated:
51344
+ this.options.chatMetadata = msg.chatMetadata;
51345
+ break;
51298
51346
  default:
51299
51347
  }
51300
51348
  });
@@ -51480,7 +51528,8 @@ class SpeechHandler {
51480
51528
  handleTranscriptionResult(result) {
51481
51529
  logger_1.logger.log(this.logPrefix + `Speech transcription (${result.confidence} confidence): ${result.transcript}`);
51482
51530
  if (result.final) {
51483
- this.options.api.avatarAsk(result.transcript);
51531
+ this.options.chatMetadata.userSpokenLocale = result.language_code;
51532
+ this.options.api.avatarAsk(result.transcript, this.options.chatMetadata);
51484
51533
  }
51485
51534
  else if (this.digitalHumanSpeaking) {
51486
51535
  this.options.api.stopSpeaking();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "uneeq-js",
3
- "version": "2.47.10",
3
+ "version": "2.48.0",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/src/index.d.ts",
package/readme.md CHANGED
@@ -8,6 +8,12 @@ https://docs.uneeq.io/build-your-own-experience
8
8
  To use uneeq-js with a typescript version < 3.8, 'skipLibCheck' must be set to true.
9
9
 
10
10
  ## Release Notes
11
+ #### 2.48.0
12
+ * Add client and custom metadata that is sent during chats with a digital human. Developers can specify anything they wish in the custom metadata using the new function setCustomChatMetadata.
13
+
14
+ #### 2.47.11
15
+ * Speech Recognition: Bug fix: Pausing recording during active speech causes recognition state to be lost.
16
+
11
17
  #### 2.47.10
12
18
  * Speech Recognition: Added support for reconnecting speech recognition upon disconnection.
13
19