@livekit/agents-plugin-livekit 0.1.3 → 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.
- package/dist/hf_utils.cjs +272 -0
- package/dist/hf_utils.cjs.map +1 -0
- package/dist/hf_utils.d.cts +40 -0
- package/dist/hf_utils.d.ts +40 -0
- package/dist/hf_utils.d.ts.map +1 -0
- package/dist/hf_utils.js +237 -0
- package/dist/hf_utils.js.map +1 -0
- package/dist/hf_utils.test.cjs +330 -0
- package/dist/hf_utils.test.cjs.map +1 -0
- package/dist/hf_utils.test.d.cts +2 -0
- package/dist/hf_utils.test.d.ts +2 -0
- package/dist/hf_utils.test.d.ts.map +1 -0
- package/dist/hf_utils.test.js +307 -0
- package/dist/hf_utils.test.js.map +1 -0
- package/dist/index.cjs +27 -10
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -6
- package/dist/index.js.map +1 -1
- package/dist/turn_detector/base.cjs +202 -0
- package/dist/turn_detector/base.cjs.map +1 -0
- package/dist/turn_detector/base.d.cts +52 -0
- package/dist/turn_detector/base.d.ts +52 -0
- package/dist/turn_detector/base.d.ts.map +1 -0
- package/dist/turn_detector/base.js +172 -0
- package/dist/turn_detector/base.js.map +1 -0
- package/dist/turn_detector/constants.cjs +44 -0
- package/dist/turn_detector/constants.cjs.map +1 -0
- package/dist/turn_detector/constants.d.cts +7 -0
- package/dist/turn_detector/constants.d.ts +7 -0
- package/dist/turn_detector/constants.d.ts.map +1 -0
- package/dist/turn_detector/constants.js +16 -0
- package/dist/turn_detector/constants.js.map +1 -0
- package/dist/turn_detector/english.cjs +52 -0
- package/dist/turn_detector/english.cjs.map +1 -0
- package/dist/turn_detector/english.d.cts +11 -0
- package/dist/turn_detector/english.d.ts +11 -0
- package/dist/turn_detector/english.d.ts.map +1 -0
- package/dist/turn_detector/english.js +26 -0
- package/dist/turn_detector/english.js.map +1 -0
- package/dist/turn_detector/index.cjs +53 -0
- package/dist/turn_detector/index.cjs.map +1 -0
- package/dist/turn_detector/index.d.cts +5 -0
- package/dist/turn_detector/index.d.ts +5 -0
- package/dist/turn_detector/index.d.ts.map +1 -0
- package/dist/turn_detector/index.js +23 -0
- package/dist/turn_detector/index.js.map +1 -0
- package/dist/turn_detector/multilingual.cjs +144 -0
- package/dist/turn_detector/multilingual.cjs.map +1 -0
- package/dist/turn_detector/multilingual.d.cts +15 -0
- package/dist/turn_detector/multilingual.d.ts +15 -0
- package/dist/turn_detector/multilingual.d.ts.map +1 -0
- package/dist/turn_detector/multilingual.js +118 -0
- package/dist/turn_detector/multilingual.js.map +1 -0
- package/dist/turn_detector/utils.cjs +54 -0
- package/dist/turn_detector/utils.cjs.map +1 -0
- package/dist/turn_detector/utils.d.cts +35 -0
- package/dist/turn_detector/utils.d.ts +35 -0
- package/dist/turn_detector/utils.d.ts.map +1 -0
- package/dist/turn_detector/utils.js +29 -0
- package/dist/turn_detector/utils.js.map +1 -0
- package/dist/turn_detector/utils.test.cjs +196 -0
- package/dist/turn_detector/utils.test.cjs.map +1 -0
- package/dist/turn_detector/utils.test.d.cts +2 -0
- package/dist/turn_detector/utils.test.d.ts +2 -0
- package/dist/turn_detector/utils.test.d.ts.map +1 -0
- package/dist/turn_detector/utils.test.js +195 -0
- package/dist/turn_detector/utils.test.js.map +1 -0
- package/package.json +5 -4
- package/src/hf_utils.test.ts +392 -0
- package/src/hf_utils.ts +365 -0
- package/src/index.ts +32 -9
- package/src/turn_detector/base.ts +238 -0
- package/src/turn_detector/constants.ts +16 -0
- package/src/turn_detector/english.ts +27 -0
- package/src/turn_detector/index.ts +21 -0
- package/src/turn_detector/multilingual.ts +145 -0
- package/src/turn_detector/utils.test.ts +231 -0
- package/src/turn_detector/utils.ts +76 -0
- package/dist/turn_detector.cjs +0 -129
- package/dist/turn_detector.cjs.map +0 -1
- package/dist/turn_detector.d.cts +0 -22
- package/dist/turn_detector.d.ts +0 -22
- package/dist/turn_detector.d.ts.map +0 -1
- package/dist/turn_detector.js +0 -102
- package/dist/turn_detector.js.map +0 -1
- package/dist/turn_detector.onnx +0 -0
- package/src/turn_detector.onnx +0 -0
- 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 @@
|
|
|
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":"AAIA,SAAS,eAAe,WAAW;AACnC,SAAS,UAAU,qBAAqB;AACxC,SAAS,yBAAyB;AAElC,MAAM,2BAA2B;AAE1B,MAAM,gCAAgC;AAEtC,MAAM,8BAA8B,cAAc;AAAA,EACvD,cAAc;AACZ,UAAM,cAAc;AAAA,EACtB;AACF;AAEO,MAAM,0BAA0B,SAAS;AAAA,EAC9C,UAAU,IAAI;AAAA,EAEd,YAAY,mBAA4B;AACtC,UAAM;AAAA,MACJ,WAAW;AAAA,MACX;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,kBAA0B;AACxB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,kBAAkB,UAAgD;AACtE,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,IACT;AAEA,QAAI,YAAY,MAAM,MAAM,kBAAkB,QAAQ;AACtD,QAAI,cAAc,QAAW;AAC3B,YAAM,MAAM,mBAAmB;AAC/B,UAAI,CAAC,IAAK,QAAO;AAEjB,YAAM,OAAO,MAAM,MAAM,KAAK;AAAA,QAC5B,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU;AAAA,UACnB;AAAA,QACF,CAAC;AAAA,QACD,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,QACA,QAAQ,YAAY,QAAQ,wBAAwB;AAAA,MACtD,CAAC;AAED,UAAI,CAAC,KAAK,IAAI;AACZ,cAAM,IAAI,MAAM,8BAA8B,KAAK,UAAU,EAAE;AAAA,MACjE;AAEA,YAAM,OAAQ,MAAM,KAAK,KAAK;AAC9B,kBAAY,KAAK;AACjB,UAAI,WAAW;AACb,cAAM,YAAY,MAAM,KAAK,gBAAgB;AAC7C,kBAAU,QAAQ,IAAI,EAAE,UAAU;AAAA,MACpC;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,iBAAiB,SAA0B,UAAkB,GAAoB;AACrF,UAAM,MAAM,mBAAmB;AAC/B,QAAI,CAAC,KAAK;AACR,aAAO,MAAM,MAAM,iBAAiB,SAAS,OAAO;AAAA,IACtD;AAGA,UAAM,WAAW,QACd,KAAK;AAAA,MACJ,qBAAqB;AAAA,MACrB,qBAAqB;AAAA,MACrB,qBAAqB;AAAA,IACvB,CAAC,EACA,SAAS,iBAAiB;AAG7B,UAAM,MAAM,cAAc;AAC1B,UAAM,UAAe;AAAA,MACnB,GAAG,SAAS,OAAO;AAAA,QACjB,cAAc;AAAA,QACd,cAAc;AAAA,QACd,kBAAkB;AAAA,MACpB,CAAC;AAAA,MACD,OAAO,IAAI,IAAI;AAAA,MACf,UAAU,IAAI;AAAA,IAChB;AAGA,UAAM,UAAU,QAAQ,IAAI;AAC5B,QAAI,SAAS;AACX,cAAQ,UAAU;AAAA,IACpB;AAEA,UAAM,YAAY,YAAY,IAAI;AAElC,SAAK,QAAQ,MAAM,EAAE,KAAK,QAAQ,GAAG,0BAA0B;AAE/D,UAAM,OAAO,MAAM,MAAM,KAAK;AAAA,MAC5B,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,OAAO;AAAA,MAC5B,SAAS;AAAA,QACP,gBAAgB;AAAA,MAClB;AAAA,MACA,QAAQ,YAAY,QAAQ,wBAAwB;AAAA,IACtD,CAAC;AAED,QAAI,CAAC,KAAK,IAAI;AACZ,YAAM,IAAI,MAAM,kCAAkC,KAAK,UAAU,EAAE;AAAA,IACrE;AAEA,UAAM,OAAO,MAAM,KAAK,KAAK;AAC7B,UAAM,cAAc,KAAK;AACzB,QAAI,OAAO,gBAAgB,YAAY,eAAe,GAAG;AACvD,WAAK,QAAQ;AAAA,QACX;AAAA,UACE,gBAAgB;AAAA,UAChB,WAAW,YAAY,IAAI,IAAI,aAAa;AAAA,QAC9C;AAAA,QACA;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAGA,WAAO;AAAA,EACT;AACF;AAEA,SAAS,qBAAqB;AAC5B,QAAM,UAAU,QAAQ,IAAI;AAC5B,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,SAAO,GAAG,OAAO;AACnB;AAEA,IAAO,uBAAQ;","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
|