@livekit/agents-plugin-livekit 0.1.2 → 1.0.0-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/dist/hf_utils.cjs +272 -0
  2. package/dist/hf_utils.cjs.map +1 -0
  3. package/dist/hf_utils.d.cts +40 -0
  4. package/dist/hf_utils.d.ts +40 -0
  5. package/dist/hf_utils.d.ts.map +1 -0
  6. package/dist/hf_utils.js +237 -0
  7. package/dist/hf_utils.js.map +1 -0
  8. package/dist/hf_utils.test.cjs +330 -0
  9. package/dist/hf_utils.test.cjs.map +1 -0
  10. package/dist/hf_utils.test.d.cts +2 -0
  11. package/dist/hf_utils.test.d.ts +2 -0
  12. package/dist/hf_utils.test.d.ts.map +1 -0
  13. package/dist/hf_utils.test.js +307 -0
  14. package/dist/hf_utils.test.js.map +1 -0
  15. package/dist/index.cjs +27 -10
  16. package/dist/index.cjs.map +1 -1
  17. package/dist/index.d.cts +2 -2
  18. package/dist/index.d.ts +2 -2
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +24 -6
  21. package/dist/index.js.map +1 -1
  22. package/dist/turn_detector/base.cjs +202 -0
  23. package/dist/turn_detector/base.cjs.map +1 -0
  24. package/dist/turn_detector/base.d.cts +52 -0
  25. package/dist/turn_detector/base.d.ts +52 -0
  26. package/dist/turn_detector/base.d.ts.map +1 -0
  27. package/dist/turn_detector/base.js +172 -0
  28. package/dist/turn_detector/base.js.map +1 -0
  29. package/dist/turn_detector/constants.cjs +44 -0
  30. package/dist/turn_detector/constants.cjs.map +1 -0
  31. package/dist/turn_detector/constants.d.cts +7 -0
  32. package/dist/turn_detector/constants.d.ts +7 -0
  33. package/dist/turn_detector/constants.d.ts.map +1 -0
  34. package/dist/turn_detector/constants.js +16 -0
  35. package/dist/turn_detector/constants.js.map +1 -0
  36. package/dist/turn_detector/english.cjs +52 -0
  37. package/dist/turn_detector/english.cjs.map +1 -0
  38. package/dist/turn_detector/english.d.cts +11 -0
  39. package/dist/turn_detector/english.d.ts +11 -0
  40. package/dist/turn_detector/english.d.ts.map +1 -0
  41. package/dist/turn_detector/english.js +26 -0
  42. package/dist/turn_detector/english.js.map +1 -0
  43. package/dist/turn_detector/index.cjs +53 -0
  44. package/dist/turn_detector/index.cjs.map +1 -0
  45. package/dist/turn_detector/index.d.cts +5 -0
  46. package/dist/turn_detector/index.d.ts +5 -0
  47. package/dist/turn_detector/index.d.ts.map +1 -0
  48. package/dist/turn_detector/index.js +23 -0
  49. package/dist/turn_detector/index.js.map +1 -0
  50. package/dist/turn_detector/multilingual.cjs +144 -0
  51. package/dist/turn_detector/multilingual.cjs.map +1 -0
  52. package/dist/turn_detector/multilingual.d.cts +15 -0
  53. package/dist/turn_detector/multilingual.d.ts +15 -0
  54. package/dist/turn_detector/multilingual.d.ts.map +1 -0
  55. package/dist/turn_detector/multilingual.js +118 -0
  56. package/dist/turn_detector/multilingual.js.map +1 -0
  57. package/dist/turn_detector/utils.cjs +54 -0
  58. package/dist/turn_detector/utils.cjs.map +1 -0
  59. package/dist/turn_detector/utils.d.cts +35 -0
  60. package/dist/turn_detector/utils.d.ts +35 -0
  61. package/dist/turn_detector/utils.d.ts.map +1 -0
  62. package/dist/turn_detector/utils.js +29 -0
  63. package/dist/turn_detector/utils.js.map +1 -0
  64. package/dist/turn_detector/utils.test.cjs +196 -0
  65. package/dist/turn_detector/utils.test.cjs.map +1 -0
  66. package/dist/turn_detector/utils.test.d.cts +2 -0
  67. package/dist/turn_detector/utils.test.d.ts +2 -0
  68. package/dist/turn_detector/utils.test.d.ts.map +1 -0
  69. package/dist/turn_detector/utils.test.js +195 -0
  70. package/dist/turn_detector/utils.test.js.map +1 -0
  71. package/package.json +7 -6
  72. package/src/hf_utils.test.ts +392 -0
  73. package/src/hf_utils.ts +365 -0
  74. package/src/index.ts +32 -9
  75. package/src/turn_detector/base.ts +238 -0
  76. package/src/turn_detector/constants.ts +16 -0
  77. package/src/turn_detector/english.ts +27 -0
  78. package/src/turn_detector/index.ts +21 -0
  79. package/src/turn_detector/multilingual.ts +145 -0
  80. package/src/turn_detector/utils.test.ts +231 -0
  81. package/src/turn_detector/utils.ts +76 -0
  82. package/dist/turn_detector.cjs +0 -129
  83. package/dist/turn_detector.cjs.map +0 -1
  84. package/dist/turn_detector.d.cts +0 -22
  85. package/dist/turn_detector.d.ts +0 -22
  86. package/dist/turn_detector.d.ts.map +0 -1
  87. package/dist/turn_detector.js +0 -102
  88. package/dist/turn_detector.js.map +0 -1
  89. package/dist/turn_detector.onnx +0 -0
  90. package/src/turn_detector.onnx +0 -0
  91. package/src/turn_detector.ts +0 -121
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var english_exports = {};
20
+ __export(english_exports, {
21
+ EOURunnerEn: () => EOURunnerEn,
22
+ EnglishModel: () => EnglishModel,
23
+ INFERENCE_METHOD_EN: () => INFERENCE_METHOD_EN,
24
+ default: () => english_default
25
+ });
26
+ module.exports = __toCommonJS(english_exports);
27
+ var import_base = require("./base.cjs");
28
+ const INFERENCE_METHOD_EN = "lk_end_of_utterance_en";
29
+ class EOURunnerEn extends import_base.EOURunnerBase {
30
+ constructor() {
31
+ super("en");
32
+ }
33
+ }
34
+ class EnglishModel extends import_base.EOUModel {
35
+ constructor(unlikelyThreshold) {
36
+ super({
37
+ modelType: "en",
38
+ unlikelyThreshold
39
+ });
40
+ }
41
+ inferenceMethod() {
42
+ return INFERENCE_METHOD_EN;
43
+ }
44
+ }
45
+ var english_default = EOURunnerEn;
46
+ // Annotate the CommonJS export names for ESM import in node:
47
+ 0 && (module.exports = {
48
+ EOURunnerEn,
49
+ EnglishModel,
50
+ INFERENCE_METHOD_EN
51
+ });
52
+ //# sourceMappingURL=english.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/turn_detector/english.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { EOUModel, EOURunnerBase } from './base.js';\n\nexport const INFERENCE_METHOD_EN = 'lk_end_of_utterance_en';\n\nexport class EOURunnerEn extends EOURunnerBase {\n constructor() {\n super('en');\n }\n}\n\nexport class EnglishModel extends EOUModel {\n constructor(unlikelyThreshold?: number) {\n super({\n modelType: 'en',\n unlikelyThreshold,\n });\n }\n\n inferenceMethod(): string {\n return INFERENCE_METHOD_EN;\n }\n}\n\nexport default EOURunnerEn;\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,kBAAwC;AAEjC,MAAM,sBAAsB;AAE5B,MAAM,oBAAoB,0BAAc;AAAA,EAC7C,cAAc;AACZ,UAAM,IAAI;AAAA,EACZ;AACF;AAEO,MAAM,qBAAqB,qBAAS;AAAA,EACzC,YAAY,mBAA4B;AACtC,UAAM;AAAA,MACJ,WAAW;AAAA,MACX;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,kBAA0B;AACxB,WAAO;AAAA,EACT;AACF;AAEA,IAAO,kBAAQ;","names":[]}
@@ -0,0 +1,11 @@
1
+ import { EOUModel, EOURunnerBase } from './base.js';
2
+ export declare const INFERENCE_METHOD_EN = "lk_end_of_utterance_en";
3
+ export declare class EOURunnerEn extends EOURunnerBase {
4
+ constructor();
5
+ }
6
+ export declare class EnglishModel extends EOUModel {
7
+ constructor(unlikelyThreshold?: number);
8
+ inferenceMethod(): string;
9
+ }
10
+ export default EOURunnerEn;
11
+ //# sourceMappingURL=english.d.ts.map
@@ -0,0 +1,11 @@
1
+ import { EOUModel, EOURunnerBase } from './base.js';
2
+ export declare const INFERENCE_METHOD_EN = "lk_end_of_utterance_en";
3
+ export declare class EOURunnerEn extends EOURunnerBase {
4
+ constructor();
5
+ }
6
+ export declare class EnglishModel extends EOUModel {
7
+ constructor(unlikelyThreshold?: number);
8
+ inferenceMethod(): string;
9
+ }
10
+ export default EOURunnerEn;
11
+ //# sourceMappingURL=english.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"english.d.ts","sourceRoot":"","sources":["../../src/turn_detector/english.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAEpD,eAAO,MAAM,mBAAmB,2BAA2B,CAAC;AAE5D,qBAAa,WAAY,SAAQ,aAAa;;CAI7C;AAED,qBAAa,YAAa,SAAQ,QAAQ;gBAC5B,iBAAiB,CAAC,EAAE,MAAM;IAOtC,eAAe,IAAI,MAAM;CAG1B;AAED,eAAe,WAAW,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { EOUModel, EOURunnerBase } from "./base.js";
2
+ const INFERENCE_METHOD_EN = "lk_end_of_utterance_en";
3
+ class EOURunnerEn extends EOURunnerBase {
4
+ constructor() {
5
+ super("en");
6
+ }
7
+ }
8
+ class EnglishModel extends EOUModel {
9
+ constructor(unlikelyThreshold) {
10
+ super({
11
+ modelType: "en",
12
+ unlikelyThreshold
13
+ });
14
+ }
15
+ inferenceMethod() {
16
+ return INFERENCE_METHOD_EN;
17
+ }
18
+ }
19
+ var english_default = EOURunnerEn;
20
+ export {
21
+ EOURunnerEn,
22
+ EnglishModel,
23
+ INFERENCE_METHOD_EN,
24
+ english_default as default
25
+ };
26
+ //# sourceMappingURL=english.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/turn_detector/english.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { EOUModel, EOURunnerBase } from './base.js';\n\nexport const INFERENCE_METHOD_EN = 'lk_end_of_utterance_en';\n\nexport class EOURunnerEn extends EOURunnerBase {\n constructor() {\n super('en');\n }\n}\n\nexport class EnglishModel extends EOUModel {\n constructor(unlikelyThreshold?: number) {\n super({\n modelType: 'en',\n unlikelyThreshold,\n });\n }\n\n inferenceMethod(): string {\n return INFERENCE_METHOD_EN;\n }\n}\n\nexport default EOURunnerEn;\n"],"mappings":"AAGA,SAAS,UAAU,qBAAqB;AAEjC,MAAM,sBAAsB;AAE5B,MAAM,oBAAoB,cAAc;AAAA,EAC7C,cAAc;AACZ,UAAM,IAAI;AAAA,EACZ;AACF;AAEO,MAAM,qBAAqB,SAAS;AAAA,EACzC,YAAY,mBAA4B;AACtC,UAAM;AAAA,MACJ,WAAW;AAAA,MACX;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,kBAA0B;AACxB,WAAO;AAAA,EACT;AACF;AAEA,IAAO,kBAAQ;","names":[]}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var turn_detector_exports = {};
20
+ __export(turn_detector_exports, {
21
+ EOUModel: () => import_base.EOUModel,
22
+ EnglishModel: () => import_english2.EnglishModel,
23
+ MultilingualModel: () => import_multilingual2.MultilingualModel,
24
+ getUnicodeCategory: () => import_utils.getUnicodeCategory,
25
+ normalizeText: () => import_utils.normalizeText
26
+ });
27
+ module.exports = __toCommonJS(turn_detector_exports);
28
+ var getImportMetaUrl = () => typeof document === "undefined" ? new URL(`file:${__filename}`).href : document.currentScript && document.currentScript.src || new URL("main.js", document.baseURI).href;
29
+ var importMetaUrl = /* @__PURE__ */ getImportMetaUrl();
30
+ var import_agents = require("@livekit/agents");
31
+ var import_english = require("./english.cjs");
32
+ var import_multilingual = require("./multilingual.cjs");
33
+ var import_base = require("./base.cjs");
34
+ var import_english2 = require("./english.cjs");
35
+ var import_multilingual2 = require("./multilingual.cjs");
36
+ var import_utils = require("./utils.cjs");
37
+ import_agents.InferenceRunner.registerRunner(
38
+ import_english.INFERENCE_METHOD_EN,
39
+ new URL("./english.js", importMetaUrl).toString()
40
+ );
41
+ import_agents.InferenceRunner.registerRunner(
42
+ import_multilingual.INFERENCE_METHOD_MULTILINGUAL,
43
+ new URL("./multilingual.js", importMetaUrl).toString()
44
+ );
45
+ // Annotate the CommonJS export names for ESM import in node:
46
+ 0 && (module.exports = {
47
+ EOUModel,
48
+ EnglishModel,
49
+ MultilingualModel,
50
+ getUnicodeCategory,
51
+ normalizeText
52
+ });
53
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/turn_detector/index.ts","../../../../node_modules/.pnpm/tsup@8.4.0_@microsoft+api-extractor@7.43.7_@types+node@22.15.30__postcss@8.4.38_tsx@4.20.4_typescript@5.4.5/node_modules/tsup/assets/cjs_shims.js"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { InferenceRunner } from '@livekit/agents';\nimport { INFERENCE_METHOD_EN } from './english.js';\nimport { INFERENCE_METHOD_MULTILINGUAL } from './multilingual.js';\n\nexport { EOUModel } from './base.js';\nexport { EnglishModel } from './english.js';\nexport { MultilingualModel } from './multilingual.js';\nexport { getUnicodeCategory, normalizeText } from './utils.js';\n\nInferenceRunner.registerRunner(\n INFERENCE_METHOD_EN,\n new URL('./english.js', import.meta.url).toString(),\n);\n\nInferenceRunner.registerRunner(\n INFERENCE_METHOD_MULTILINGUAL,\n new URL('./multilingual.js', import.meta.url).toString(),\n);\n","// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () =>\n typeof document === 'undefined'\n ? new URL(`file:${__filename}`).href\n : (document.currentScript && document.currentScript.src) ||\n new URL('main.js', document.baseURI).href\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACKA,IAAM,mBAAmB,MACvB,OAAO,aAAa,cAChB,IAAI,IAAI,QAAQ,UAAU,EAAE,EAAE,OAC7B,SAAS,iBAAiB,SAAS,cAAc,OAClD,IAAI,IAAI,WAAW,SAAS,OAAO,EAAE;AAEpC,IAAM,gBAAgC,iCAAiB;ADR9D,oBAAgC;AAChC,qBAAoC;AACpC,0BAA8C;AAE9C,kBAAyB;AACzB,IAAAA,kBAA6B;AAC7B,IAAAC,uBAAkC;AAClC,mBAAkD;AAElD,8BAAgB;AAAA,EACd;AAAA,EACA,IAAI,IAAI,gBAAgB,aAAe,EAAE,SAAS;AACpD;AAEA,8BAAgB;AAAA,EACd;AAAA,EACA,IAAI,IAAI,qBAAqB,aAAe,EAAE,SAAS;AACzD;","names":["import_english","import_multilingual"]}
@@ -0,0 +1,5 @@
1
+ export { EOUModel } from './base.js';
2
+ export { EnglishModel } from './english.js';
3
+ export { MultilingualModel } from './multilingual.js';
4
+ export { getUnicodeCategory, normalizeText } from './utils.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,5 @@
1
+ export { EOUModel } from './base.js';
2
+ export { EnglishModel } from './english.js';
3
+ export { MultilingualModel } from './multilingual.js';
4
+ export { getUnicodeCategory, normalizeText } from './utils.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/turn_detector/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { InferenceRunner } from "@livekit/agents";
2
+ import { INFERENCE_METHOD_EN } from "./english.js";
3
+ import { INFERENCE_METHOD_MULTILINGUAL } from "./multilingual.js";
4
+ import { EOUModel } from "./base.js";
5
+ import { EnglishModel } from "./english.js";
6
+ import { MultilingualModel } from "./multilingual.js";
7
+ import { getUnicodeCategory, normalizeText } from "./utils.js";
8
+ InferenceRunner.registerRunner(
9
+ INFERENCE_METHOD_EN,
10
+ new URL("./english.js", import.meta.url).toString()
11
+ );
12
+ InferenceRunner.registerRunner(
13
+ INFERENCE_METHOD_MULTILINGUAL,
14
+ new URL("./multilingual.js", import.meta.url).toString()
15
+ );
16
+ export {
17
+ EOUModel,
18
+ EnglishModel,
19
+ MultilingualModel,
20
+ getUnicodeCategory,
21
+ normalizeText
22
+ };
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/turn_detector/index.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { InferenceRunner } from '@livekit/agents';\nimport { INFERENCE_METHOD_EN } from './english.js';\nimport { INFERENCE_METHOD_MULTILINGUAL } from './multilingual.js';\n\nexport { EOUModel } from './base.js';\nexport { EnglishModel } from './english.js';\nexport { MultilingualModel } from './multilingual.js';\nexport { getUnicodeCategory, normalizeText } from './utils.js';\n\nInferenceRunner.registerRunner(\n INFERENCE_METHOD_EN,\n new URL('./english.js', import.meta.url).toString(),\n);\n\nInferenceRunner.registerRunner(\n INFERENCE_METHOD_MULTILINGUAL,\n new URL('./multilingual.js', import.meta.url).toString(),\n);\n"],"mappings":"AAGA,SAAS,uBAAuB;AAChC,SAAS,2BAA2B;AACpC,SAAS,qCAAqC;AAE9C,SAAS,gBAAgB;AACzB,SAAS,oBAAoB;AAC7B,SAAS,yBAAyB;AAClC,SAAS,oBAAoB,qBAAqB;AAElD,gBAAgB;AAAA,EACd;AAAA,EACA,IAAI,IAAI,gBAAgB,YAAY,GAAG,EAAE,SAAS;AACpD;AAEA,gBAAgB;AAAA,EACd;AAAA,EACA,IAAI,IAAI,qBAAqB,YAAY,GAAG,EAAE,SAAS;AACzD;","names":[]}
@@ -0,0 +1,144 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var multilingual_exports = {};
20
+ __export(multilingual_exports, {
21
+ EUORunnerMultilingual: () => EUORunnerMultilingual,
22
+ INFERENCE_METHOD_MULTILINGUAL: () => INFERENCE_METHOD_MULTILINGUAL,
23
+ MultilingualModel: () => MultilingualModel,
24
+ default: () => multilingual_default
25
+ });
26
+ module.exports = __toCommonJS(multilingual_exports);
27
+ var import_agents = require("@livekit/agents");
28
+ var import_base = require("./base.cjs");
29
+ var import_constants = require("./constants.cjs");
30
+ const REMOTE_INFERENCE_TIMEOUT = 2e3;
31
+ const INFERENCE_METHOD_MULTILINGUAL = "lk_end_of_utterance_multilingual";
32
+ class EUORunnerMultilingual extends import_base.EOURunnerBase {
33
+ constructor() {
34
+ super("multilingual");
35
+ }
36
+ }
37
+ class MultilingualModel extends import_base.EOUModel {
38
+ #logger = (0, import_agents.log)();
39
+ constructor(unlikelyThreshold) {
40
+ super({
41
+ modelType: "multilingual",
42
+ unlikelyThreshold
43
+ });
44
+ }
45
+ inferenceMethod() {
46
+ return INFERENCE_METHOD_MULTILINGUAL;
47
+ }
48
+ async unlikelyThreshold(language) {
49
+ if (!language) {
50
+ return void 0;
51
+ }
52
+ let threshold = await super.unlikelyThreshold(language);
53
+ if (threshold === void 0) {
54
+ const url = remoteInferenceUrl();
55
+ if (!url) return void 0;
56
+ const resp = await fetch(url, {
57
+ method: "POST",
58
+ body: JSON.stringify({
59
+ language
60
+ }),
61
+ headers: {
62
+ "Content-Type": "application/json"
63
+ },
64
+ signal: AbortSignal.timeout(REMOTE_INFERENCE_TIMEOUT)
65
+ });
66
+ if (!resp.ok) {
67
+ throw new Error(`Failed to fetch threshold: ${resp.statusText}`);
68
+ }
69
+ const data = await resp.json();
70
+ threshold = data.threshold;
71
+ if (threshold) {
72
+ const languages = await this.languagesFuture.await;
73
+ languages[language] = { threshold };
74
+ }
75
+ }
76
+ return threshold;
77
+ }
78
+ async predictEndOfTurn(chatCtx, timeout = 3) {
79
+ const url = remoteInferenceUrl();
80
+ if (!url) {
81
+ return await super.predictEndOfTurn(chatCtx, timeout);
82
+ }
83
+ const messages = chatCtx.copy({
84
+ excludeFunctionCall: true,
85
+ excludeInstructions: true,
86
+ excludeEmptyMessage: true
87
+ }).truncate(import_constants.MAX_HISTORY_TURNS);
88
+ const ctx = (0, import_agents.getJobContext)();
89
+ const request = {
90
+ ...messages.toJSON({
91
+ excludeImage: true,
92
+ excludeAudio: true,
93
+ excludeTimestamp: true
94
+ }),
95
+ jobId: ctx.job.id,
96
+ workerId: ctx.workerId
97
+ };
98
+ const agentId = process.env.LIVEKIT_AGENT_ID;
99
+ if (agentId) {
100
+ request.agentId = agentId;
101
+ }
102
+ const startedAt = performance.now();
103
+ this.#logger.debug({ url, request }, "=== remote EOU inference");
104
+ const resp = await fetch(url, {
105
+ method: "POST",
106
+ body: JSON.stringify(request),
107
+ headers: {
108
+ "Content-Type": "application/json"
109
+ },
110
+ signal: AbortSignal.timeout(REMOTE_INFERENCE_TIMEOUT)
111
+ });
112
+ if (!resp.ok) {
113
+ throw new Error(`Failed to predict end of turn: ${resp.statusText}`);
114
+ }
115
+ const data = await resp.json();
116
+ const probability = data.probability;
117
+ if (typeof probability === "number" && probability >= 0) {
118
+ this.#logger.debug(
119
+ {
120
+ eouProbability: probability,
121
+ duration: (performance.now() - startedAt) / 1e3
122
+ },
123
+ "eou prediction"
124
+ );
125
+ return probability;
126
+ }
127
+ return 1;
128
+ }
129
+ }
130
+ function remoteInferenceUrl() {
131
+ const urlBase = process.env.LIVEKIT_REMOTE_EOT_URL;
132
+ if (!urlBase) {
133
+ return void 0;
134
+ }
135
+ return `${urlBase}/eot/multi`;
136
+ }
137
+ var multilingual_default = EUORunnerMultilingual;
138
+ // Annotate the CommonJS export names for ESM import in node:
139
+ 0 && (module.exports = {
140
+ EUORunnerMultilingual,
141
+ INFERENCE_METHOD_MULTILINGUAL,
142
+ MultilingualModel
143
+ });
144
+ //# sourceMappingURL=multilingual.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/turn_detector/multilingual.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { llm } from '@livekit/agents';\nimport { getJobContext, log } from '@livekit/agents';\nimport { EOUModel, EOURunnerBase } from './base.js';\nimport { MAX_HISTORY_TURNS } from './constants.js';\n\nconst REMOTE_INFERENCE_TIMEOUT = 2000;\n\nexport const INFERENCE_METHOD_MULTILINGUAL = 'lk_end_of_utterance_multilingual';\n\nexport class EUORunnerMultilingual extends EOURunnerBase {\n constructor() {\n super('multilingual');\n }\n}\n\nexport class MultilingualModel extends EOUModel {\n #logger = log();\n\n constructor(unlikelyThreshold?: number) {\n super({\n modelType: 'multilingual',\n unlikelyThreshold,\n });\n }\n\n inferenceMethod(): string {\n return INFERENCE_METHOD_MULTILINGUAL;\n }\n\n async unlikelyThreshold(language?: string): Promise<number | undefined> {\n if (!language) {\n return undefined;\n }\n\n let threshold = await super.unlikelyThreshold(language);\n if (threshold === undefined) {\n const url = remoteInferenceUrl();\n if (!url) return undefined;\n\n const resp = await fetch(url, {\n method: 'POST',\n body: JSON.stringify({\n language,\n }),\n headers: {\n 'Content-Type': 'application/json',\n },\n signal: AbortSignal.timeout(REMOTE_INFERENCE_TIMEOUT),\n });\n\n if (!resp.ok) {\n throw new Error(`Failed to fetch threshold: ${resp.statusText}`);\n }\n\n const data = (await resp.json()) as { threshold: number | undefined };\n threshold = data.threshold;\n if (threshold) {\n const languages = await this.languagesFuture.await;\n languages[language] = { threshold };\n }\n }\n\n return threshold;\n }\n\n async predictEndOfTurn(chatCtx: llm.ChatContext, timeout: number = 3): Promise<number> {\n const url = remoteInferenceUrl();\n if (!url) {\n return await super.predictEndOfTurn(chatCtx, timeout);\n }\n\n // Copy and process chat context similar to Python implementation\n const messages = chatCtx\n .copy({\n excludeFunctionCall: true,\n excludeInstructions: true,\n excludeEmptyMessage: true,\n })\n .truncate(MAX_HISTORY_TURNS);\n\n // Get job context and build request\n const ctx = getJobContext();\n const request: any = {\n ...messages.toJSON({\n excludeImage: true,\n excludeAudio: true,\n excludeTimestamp: true,\n }),\n jobId: ctx.job.id,\n workerId: ctx.workerId,\n };\n\n // Add agentId from environment variable if available\n const agentId = process.env.LIVEKIT_AGENT_ID;\n if (agentId) {\n request.agentId = agentId;\n }\n\n const startedAt = performance.now();\n\n this.#logger.debug({ url, request }, '=== remote EOU inference');\n\n const resp = await fetch(url, {\n method: 'POST',\n body: JSON.stringify(request),\n headers: {\n 'Content-Type': 'application/json',\n },\n signal: AbortSignal.timeout(REMOTE_INFERENCE_TIMEOUT),\n });\n\n if (!resp.ok) {\n throw new Error(`Failed to predict end of turn: ${resp.statusText}`);\n }\n\n const data = await resp.json();\n const probability = data.probability;\n if (typeof probability === 'number' && probability >= 0) {\n this.#logger.debug(\n {\n eouProbability: probability,\n duration: (performance.now() - startedAt) / 1000,\n },\n 'eou prediction',\n );\n return probability;\n }\n\n // default to indicate no prediction\n return 1;\n }\n}\n\nfunction remoteInferenceUrl() {\n const urlBase = process.env.LIVEKIT_REMOTE_EOT_URL;\n if (!urlBase) {\n return undefined;\n }\n return `${urlBase}/eot/multi`;\n}\n\nexport default EUORunnerMultilingual;\n"],"mappings":"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","names":[]}
@@ -0,0 +1,15 @@
1
+ import type { llm } from '@livekit/agents';
2
+ import { EOUModel, EOURunnerBase } from './base.js';
3
+ export declare const INFERENCE_METHOD_MULTILINGUAL = "lk_end_of_utterance_multilingual";
4
+ export declare class EUORunnerMultilingual extends EOURunnerBase {
5
+ constructor();
6
+ }
7
+ export declare class MultilingualModel extends EOUModel {
8
+ #private;
9
+ constructor(unlikelyThreshold?: number);
10
+ inferenceMethod(): string;
11
+ unlikelyThreshold(language?: string): Promise<number | undefined>;
12
+ predictEndOfTurn(chatCtx: llm.ChatContext, timeout?: number): Promise<number>;
13
+ }
14
+ export default EUORunnerMultilingual;
15
+ //# sourceMappingURL=multilingual.d.ts.map
@@ -0,0 +1,15 @@
1
+ import type { llm } from '@livekit/agents';
2
+ import { EOUModel, EOURunnerBase } from './base.js';
3
+ export declare const INFERENCE_METHOD_MULTILINGUAL = "lk_end_of_utterance_multilingual";
4
+ export declare class EUORunnerMultilingual extends EOURunnerBase {
5
+ constructor();
6
+ }
7
+ export declare class MultilingualModel extends EOUModel {
8
+ #private;
9
+ constructor(unlikelyThreshold?: number);
10
+ inferenceMethod(): string;
11
+ unlikelyThreshold(language?: string): Promise<number | undefined>;
12
+ predictEndOfTurn(chatCtx: llm.ChatContext, timeout?: number): Promise<number>;
13
+ }
14
+ export default EUORunnerMultilingual;
15
+ //# sourceMappingURL=multilingual.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multilingual.d.ts","sourceRoot":"","sources":["../../src/turn_detector/multilingual.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAE3C,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAKpD,eAAO,MAAM,6BAA6B,qCAAqC,CAAC;AAEhF,qBAAa,qBAAsB,SAAQ,aAAa;;CAIvD;AAED,qBAAa,iBAAkB,SAAQ,QAAQ;;gBAGjC,iBAAiB,CAAC,EAAE,MAAM;IAOtC,eAAe,IAAI,MAAM;IAInB,iBAAiB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAoCjE,gBAAgB,CAAC,OAAO,EAAE,GAAG,CAAC,WAAW,EAAE,OAAO,GAAE,MAAU,GAAG,OAAO,CAAC,MAAM,CAAC;CAkEvF;AAUD,eAAe,qBAAqB,CAAC"}
@@ -0,0 +1,118 @@
1
+ import { getJobContext, log } from "@livekit/agents";
2
+ import { EOUModel, EOURunnerBase } from "./base.js";
3
+ import { MAX_HISTORY_TURNS } from "./constants.js";
4
+ const REMOTE_INFERENCE_TIMEOUT = 2e3;
5
+ const INFERENCE_METHOD_MULTILINGUAL = "lk_end_of_utterance_multilingual";
6
+ class EUORunnerMultilingual extends EOURunnerBase {
7
+ constructor() {
8
+ super("multilingual");
9
+ }
10
+ }
11
+ class MultilingualModel extends EOUModel {
12
+ #logger = log();
13
+ constructor(unlikelyThreshold) {
14
+ super({
15
+ modelType: "multilingual",
16
+ unlikelyThreshold
17
+ });
18
+ }
19
+ inferenceMethod() {
20
+ return INFERENCE_METHOD_MULTILINGUAL;
21
+ }
22
+ async unlikelyThreshold(language) {
23
+ if (!language) {
24
+ return void 0;
25
+ }
26
+ let threshold = await super.unlikelyThreshold(language);
27
+ if (threshold === void 0) {
28
+ const url = remoteInferenceUrl();
29
+ if (!url) return void 0;
30
+ const resp = await fetch(url, {
31
+ method: "POST",
32
+ body: JSON.stringify({
33
+ language
34
+ }),
35
+ headers: {
36
+ "Content-Type": "application/json"
37
+ },
38
+ signal: AbortSignal.timeout(REMOTE_INFERENCE_TIMEOUT)
39
+ });
40
+ if (!resp.ok) {
41
+ throw new Error(`Failed to fetch threshold: ${resp.statusText}`);
42
+ }
43
+ const data = await resp.json();
44
+ threshold = data.threshold;
45
+ if (threshold) {
46
+ const languages = await this.languagesFuture.await;
47
+ languages[language] = { threshold };
48
+ }
49
+ }
50
+ return threshold;
51
+ }
52
+ async predictEndOfTurn(chatCtx, timeout = 3) {
53
+ const url = remoteInferenceUrl();
54
+ if (!url) {
55
+ return await super.predictEndOfTurn(chatCtx, timeout);
56
+ }
57
+ const messages = chatCtx.copy({
58
+ excludeFunctionCall: true,
59
+ excludeInstructions: true,
60
+ excludeEmptyMessage: true
61
+ }).truncate(MAX_HISTORY_TURNS);
62
+ const ctx = getJobContext();
63
+ const request = {
64
+ ...messages.toJSON({
65
+ excludeImage: true,
66
+ excludeAudio: true,
67
+ excludeTimestamp: true
68
+ }),
69
+ jobId: ctx.job.id,
70
+ workerId: ctx.workerId
71
+ };
72
+ const agentId = process.env.LIVEKIT_AGENT_ID;
73
+ if (agentId) {
74
+ request.agentId = agentId;
75
+ }
76
+ const startedAt = performance.now();
77
+ this.#logger.debug({ url, request }, "=== remote EOU inference");
78
+ const resp = await fetch(url, {
79
+ method: "POST",
80
+ body: JSON.stringify(request),
81
+ headers: {
82
+ "Content-Type": "application/json"
83
+ },
84
+ signal: AbortSignal.timeout(REMOTE_INFERENCE_TIMEOUT)
85
+ });
86
+ if (!resp.ok) {
87
+ throw new Error(`Failed to predict end of turn: ${resp.statusText}`);
88
+ }
89
+ const data = await resp.json();
90
+ const probability = data.probability;
91
+ if (typeof probability === "number" && probability >= 0) {
92
+ this.#logger.debug(
93
+ {
94
+ eouProbability: probability,
95
+ duration: (performance.now() - startedAt) / 1e3
96
+ },
97
+ "eou prediction"
98
+ );
99
+ return probability;
100
+ }
101
+ return 1;
102
+ }
103
+ }
104
+ function remoteInferenceUrl() {
105
+ const urlBase = process.env.LIVEKIT_REMOTE_EOT_URL;
106
+ if (!urlBase) {
107
+ return void 0;
108
+ }
109
+ return `${urlBase}/eot/multi`;
110
+ }
111
+ var multilingual_default = EUORunnerMultilingual;
112
+ export {
113
+ EUORunnerMultilingual,
114
+ INFERENCE_METHOD_MULTILINGUAL,
115
+ MultilingualModel,
116
+ multilingual_default as default
117
+ };
118
+ //# sourceMappingURL=multilingual.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/turn_detector/multilingual.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { llm } from '@livekit/agents';\nimport { getJobContext, log } from '@livekit/agents';\nimport { EOUModel, EOURunnerBase } from './base.js';\nimport { MAX_HISTORY_TURNS } from './constants.js';\n\nconst REMOTE_INFERENCE_TIMEOUT = 2000;\n\nexport const INFERENCE_METHOD_MULTILINGUAL = 'lk_end_of_utterance_multilingual';\n\nexport class EUORunnerMultilingual extends EOURunnerBase {\n constructor() {\n super('multilingual');\n }\n}\n\nexport class MultilingualModel extends EOUModel {\n #logger = log();\n\n constructor(unlikelyThreshold?: number) {\n super({\n modelType: 'multilingual',\n unlikelyThreshold,\n });\n }\n\n inferenceMethod(): string {\n return INFERENCE_METHOD_MULTILINGUAL;\n }\n\n async unlikelyThreshold(language?: string): Promise<number | undefined> {\n if (!language) {\n return undefined;\n }\n\n let threshold = await super.unlikelyThreshold(language);\n if (threshold === undefined) {\n const url = remoteInferenceUrl();\n if (!url) return undefined;\n\n const resp = await fetch(url, {\n method: 'POST',\n body: JSON.stringify({\n language,\n }),\n headers: {\n 'Content-Type': 'application/json',\n },\n signal: AbortSignal.timeout(REMOTE_INFERENCE_TIMEOUT),\n });\n\n if (!resp.ok) {\n throw new Error(`Failed to fetch threshold: ${resp.statusText}`);\n }\n\n const data = (await resp.json()) as { threshold: number | undefined };\n threshold = data.threshold;\n if (threshold) {\n const languages = await this.languagesFuture.await;\n languages[language] = { threshold };\n }\n }\n\n return threshold;\n }\n\n async predictEndOfTurn(chatCtx: llm.ChatContext, timeout: number = 3): Promise<number> {\n const url = remoteInferenceUrl();\n if (!url) {\n return await super.predictEndOfTurn(chatCtx, timeout);\n }\n\n // Copy and process chat context similar to Python implementation\n const messages = chatCtx\n .copy({\n excludeFunctionCall: true,\n excludeInstructions: true,\n excludeEmptyMessage: true,\n })\n .truncate(MAX_HISTORY_TURNS);\n\n // Get job context and build request\n const ctx = getJobContext();\n const request: any = {\n ...messages.toJSON({\n excludeImage: true,\n excludeAudio: true,\n excludeTimestamp: true,\n }),\n jobId: ctx.job.id,\n workerId: ctx.workerId,\n };\n\n // Add agentId from environment variable if available\n const agentId = process.env.LIVEKIT_AGENT_ID;\n if (agentId) {\n request.agentId = agentId;\n }\n\n const startedAt = performance.now();\n\n this.#logger.debug({ url, request }, '=== remote EOU inference');\n\n const resp = await fetch(url, {\n method: 'POST',\n body: JSON.stringify(request),\n headers: {\n 'Content-Type': 'application/json',\n },\n signal: AbortSignal.timeout(REMOTE_INFERENCE_TIMEOUT),\n });\n\n if (!resp.ok) {\n throw new Error(`Failed to predict end of turn: ${resp.statusText}`);\n }\n\n const data = await resp.json();\n const probability = data.probability;\n if (typeof probability === 'number' && probability >= 0) {\n this.#logger.debug(\n {\n eouProbability: probability,\n duration: (performance.now() - startedAt) / 1000,\n },\n 'eou prediction',\n );\n return probability;\n }\n\n // default to indicate no prediction\n return 1;\n }\n}\n\nfunction remoteInferenceUrl() {\n const urlBase = process.env.LIVEKIT_REMOTE_EOT_URL;\n if (!urlBase) {\n return undefined;\n }\n return `${urlBase}/eot/multi`;\n}\n\nexport default EUORunnerMultilingual;\n"],"mappings":"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","names":[]}
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var utils_exports = {};
20
+ __export(utils_exports, {
21
+ getUnicodeCategory: () => getUnicodeCategory,
22
+ normalizeText: () => normalizeText
23
+ });
24
+ module.exports = __toCommonJS(utils_exports);
25
+ function getUnicodeCategory(char) {
26
+ const code = char.codePointAt(0);
27
+ if (!code) return "";
28
+ if (code >= 33 && code <= 47 || // !"#$%&'()*+,-./
29
+ code >= 58 && code <= 64 || // :;<=>?@
30
+ code >= 91 && code <= 96 || // [\]^_`
31
+ code >= 123 && code <= 126 || // {|}~
32
+ code >= 160 && code <= 191 || // Latin-1 punctuation
33
+ code >= 8192 && code <= 8303 || // General punctuation
34
+ code >= 12288 && code <= 12351) {
35
+ return "P";
36
+ }
37
+ return "";
38
+ }
39
+ function normalizeText(text) {
40
+ if (!text) return "";
41
+ let normalized = text.toLowerCase().normalize("NFKC");
42
+ normalized = Array.from(normalized).filter((ch) => {
43
+ const category = getUnicodeCategory(ch);
44
+ return !(category.startsWith("P") && ch !== "'" && ch !== "-");
45
+ }).join("");
46
+ normalized = normalized.replace(/\s+/g, " ").trim();
47
+ return normalized;
48
+ }
49
+ // Annotate the CommonJS export names for ESM import in node:
50
+ 0 && (module.exports = {
51
+ getUnicodeCategory,
52
+ normalizeText
53
+ });
54
+ //# sourceMappingURL=utils.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/turn_detector/utils.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Text normalization utilities for EOU turn detector\n */\n\n/**\n * Simple unicode category detection for punctuation\n * Mimics Python's unicodedata.category() for punctuation detection\n */\nexport function getUnicodeCategory(char: string): string {\n const code = char.codePointAt(0);\n if (!code) return '';\n\n // Basic punctuation ranges (simplified version to match Python unicodedata.category)\n if (\n (code >= 0x21 && code <= 0x2f) || // !\"#$%&'()*+,-./\n (code >= 0x3a && code <= 0x40) || // :;<=>?@\n (code >= 0x5b && code <= 0x60) || // [\\]^_`\n (code >= 0x7b && code <= 0x7e) || // {|}~\n (code >= 0xa0 && code <= 0xbf) || // Latin-1 punctuation\n (code >= 0x2000 && code <= 0x206f) || // General punctuation\n (code >= 0x3000 && code <= 0x303f)\n ) {\n // CJK symbols and punctuation\n return 'P';\n }\n return '';\n}\n\n/**\n * Normalizes text to match the training data format used by the EOU model\n *\n * This function applies the following transformations:\n * 1. Converts to lowercase\n * 2. Applies Unicode NFKC normalization\n * 3. Removes all punctuation except apostrophes (') and hyphens (-)\n * 4. Collapses multiple whitespace characters into single spaces\n * 5. Trims leading and trailing whitespace\n *\n * @param text - The input text to normalize\n * @returns The normalized text\n *\n * @example\n * ```typescript\n * normalizeText(\"Hi, how can I help you today?\")\n * // Returns: \"hi how can i help you today\"\n *\n * normalizeText(\"I'm a well-trained assistant!\")\n * // Returns: \"i'm a well-trained assistant\"\n *\n * normalizeText(\"Price: $19.99 (20% off).\")\n * // Returns: \"price 1999 20 off\"\n * ```\n */\nexport function normalizeText(text: string): string {\n if (!text) return '';\n\n let normalized = text.toLowerCase().normalize('NFKC');\n\n // Remove punctuation except apostrophes and hyphens\n // Using character-by-character approach to match Python logic\n normalized = Array.from(normalized)\n .filter((ch) => {\n const category = getUnicodeCategory(ch);\n return !(category.startsWith('P') && ch !== \"'\" && ch !== '-');\n })\n .join('');\n\n // Collapse whitespace and trim\n normalized = normalized.replace(/\\s+/g, ' ').trim();\n\n return normalized;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYO,SAAS,mBAAmB,MAAsB;AACvD,QAAM,OAAO,KAAK,YAAY,CAAC;AAC/B,MAAI,CAAC,KAAM,QAAO;AAGlB,MACG,QAAQ,MAAQ,QAAQ;AAAA,EACxB,QAAQ,MAAQ,QAAQ;AAAA,EACxB,QAAQ,MAAQ,QAAQ;AAAA,EACxB,QAAQ,OAAQ,QAAQ;AAAA,EACxB,QAAQ,OAAQ,QAAQ;AAAA,EACxB,QAAQ,QAAU,QAAQ;AAAA,EAC1B,QAAQ,SAAU,QAAQ,OAC3B;AAEA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AA2BO,SAAS,cAAc,MAAsB;AAClD,MAAI,CAAC,KAAM,QAAO;AAElB,MAAI,aAAa,KAAK,YAAY,EAAE,UAAU,MAAM;AAIpD,eAAa,MAAM,KAAK,UAAU,EAC/B,OAAO,CAAC,OAAO;AACd,UAAM,WAAW,mBAAmB,EAAE;AACtC,WAAO,EAAE,SAAS,WAAW,GAAG,KAAK,OAAO,OAAO,OAAO;AAAA,EAC5D,CAAC,EACA,KAAK,EAAE;AAGV,eAAa,WAAW,QAAQ,QAAQ,GAAG,EAAE,KAAK;AAElD,SAAO;AACT;","names":[]}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Text normalization utilities for EOU turn detector
3
+ */
4
+ /**
5
+ * Simple unicode category detection for punctuation
6
+ * Mimics Python's unicodedata.category() for punctuation detection
7
+ */
8
+ export declare function getUnicodeCategory(char: string): string;
9
+ /**
10
+ * Normalizes text to match the training data format used by the EOU model
11
+ *
12
+ * This function applies the following transformations:
13
+ * 1. Converts to lowercase
14
+ * 2. Applies Unicode NFKC normalization
15
+ * 3. Removes all punctuation except apostrophes (') and hyphens (-)
16
+ * 4. Collapses multiple whitespace characters into single spaces
17
+ * 5. Trims leading and trailing whitespace
18
+ *
19
+ * @param text - The input text to normalize
20
+ * @returns The normalized text
21
+ *
22
+ * @example
23
+ * ```typescript
24
+ * normalizeText("Hi, how can I help you today?")
25
+ * // Returns: "hi how can i help you today"
26
+ *
27
+ * normalizeText("I'm a well-trained assistant!")
28
+ * // Returns: "i'm a well-trained assistant"
29
+ *
30
+ * normalizeText("Price: $19.99 (20% off).")
31
+ * // Returns: "price 1999 20 off"
32
+ * ```
33
+ */
34
+ export declare function normalizeText(text: string): string;
35
+ //# sourceMappingURL=utils.d.ts.map