@livekit/agents-plugin-livekit 0.1.3 → 1.0.0-next.1
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
package/dist/turn_detector.js
DELETED
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
import { AutoTokenizer } from "@huggingface/transformers";
|
|
2
|
-
import { CurrentJobContext, InferenceRunner, llm, log } from "@livekit/agents";
|
|
3
|
-
import { fileURLToPath } from "node:url";
|
|
4
|
-
import { InferenceSession, Tensor } from "onnxruntime-node";
|
|
5
|
-
const MAX_HISTORY = 4;
|
|
6
|
-
class EOURunner extends InferenceRunner {
|
|
7
|
-
static INFERENCE_METHOD = "lk_end_of_utterance";
|
|
8
|
-
#tokenizerPromise;
|
|
9
|
-
#session;
|
|
10
|
-
#tokenizer;
|
|
11
|
-
#logger = log();
|
|
12
|
-
constructor() {
|
|
13
|
-
super();
|
|
14
|
-
this.#tokenizerPromise = AutoTokenizer.from_pretrained("livekit/turn-detector", {
|
|
15
|
-
revision: "v1.2.0"
|
|
16
|
-
// local_files_only: true, // TODO(nbsp): can't find it
|
|
17
|
-
});
|
|
18
|
-
this.#session = InferenceSession.create(
|
|
19
|
-
fileURLToPath(new URL("turn_detector.onnx", import.meta.url).href),
|
|
20
|
-
{
|
|
21
|
-
executionProviders: [{ name: "cpu" }]
|
|
22
|
-
}
|
|
23
|
-
);
|
|
24
|
-
}
|
|
25
|
-
async initialize() {
|
|
26
|
-
this.#tokenizer = await this.#tokenizerPromise;
|
|
27
|
-
}
|
|
28
|
-
async run(data) {
|
|
29
|
-
const text = this.#formatChatContext(data);
|
|
30
|
-
const startTime = Date.now();
|
|
31
|
-
const inputs = this.#tokenizer.encode(text, { add_special_tokens: false });
|
|
32
|
-
const outputs = await this.#session.then(
|
|
33
|
-
(session) => session.run({ input_ids: new Tensor("int64", inputs, [1, inputs.length]) }, ["prob"])
|
|
34
|
-
);
|
|
35
|
-
const endTime = Date.now();
|
|
36
|
-
const logits = outputs.prob;
|
|
37
|
-
const eouProbability = logits.data[0];
|
|
38
|
-
this.#logger.child({ eouProbability, input: text, duration: endTime - startTime }).debug("eou prediction");
|
|
39
|
-
return eouProbability;
|
|
40
|
-
}
|
|
41
|
-
#formatChatContext(ctx) {
|
|
42
|
-
const newCtx = [];
|
|
43
|
-
for (const msg of ctx) {
|
|
44
|
-
if (!msg.content) continue;
|
|
45
|
-
newCtx.push(msg);
|
|
46
|
-
}
|
|
47
|
-
const convoText = this.#tokenizer.apply_chat_template(newCtx, {
|
|
48
|
-
add_generation_prompt: false,
|
|
49
|
-
tokenize: false
|
|
50
|
-
});
|
|
51
|
-
return convoText.slice(0, convoText.lastIndexOf("<|im_end|>"));
|
|
52
|
-
}
|
|
53
|
-
async close() {
|
|
54
|
-
await this.#session.then((session) => session.release());
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
class EOUModel {
|
|
58
|
-
unlikelyThreshold;
|
|
59
|
-
#executor;
|
|
60
|
-
constructor(unlikelyThreshold = 0.15) {
|
|
61
|
-
this.unlikelyThreshold = unlikelyThreshold;
|
|
62
|
-
this.#executor = CurrentJobContext.getCurrent().inferenceExecutor;
|
|
63
|
-
}
|
|
64
|
-
supportsLanguage(language) {
|
|
65
|
-
if (!language) return false;
|
|
66
|
-
const parts = language.toLowerCase().split("-");
|
|
67
|
-
return parts[0] === "en" || parts[0] === "english";
|
|
68
|
-
}
|
|
69
|
-
async predictEndOfTurn(chatCtx) {
|
|
70
|
-
let messages = [];
|
|
71
|
-
for (const msg of chatCtx.messages) {
|
|
72
|
-
if (msg.role !== llm.ChatRole.ASSISTANT && msg.role !== llm.ChatRole.USER) {
|
|
73
|
-
continue;
|
|
74
|
-
}
|
|
75
|
-
if (typeof msg.content === "string") {
|
|
76
|
-
messages.push({
|
|
77
|
-
role: msg.role === llm.ChatRole.ASSISTANT ? "assistant" : "user",
|
|
78
|
-
content: msg.content
|
|
79
|
-
});
|
|
80
|
-
} else if (Array.isArray(msg.content)) {
|
|
81
|
-
for (const content of msg.content) {
|
|
82
|
-
if (typeof content === "string") {
|
|
83
|
-
messages.push({
|
|
84
|
-
role: msg.role === llm.ChatRole.ASSISTANT ? "assistant" : "user",
|
|
85
|
-
content
|
|
86
|
-
});
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
messages = messages.slice(-MAX_HISTORY);
|
|
92
|
-
const result = await this.#executor.doInference(EOURunner.INFERENCE_METHOD, messages);
|
|
93
|
-
return result;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
var turn_detector_default = EOURunner;
|
|
97
|
-
export {
|
|
98
|
-
EOUModel,
|
|
99
|
-
EOURunner,
|
|
100
|
-
turn_detector_default as default
|
|
101
|
-
};
|
|
102
|
-
//# sourceMappingURL=turn_detector.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/turn_detector.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { PreTrainedTokenizer } from '@huggingface/transformers';\nimport { AutoTokenizer } from '@huggingface/transformers';\nimport type { ipc } from '@livekit/agents';\nimport { CurrentJobContext, InferenceRunner, llm, log } from '@livekit/agents';\nimport { fileURLToPath } from 'node:url';\nimport { InferenceSession, Tensor } from 'onnxruntime-node';\n\nconst MAX_HISTORY = 4;\n\ntype RawChatContext = { role: string; content: string }[];\n\nexport class EOURunner extends InferenceRunner {\n static INFERENCE_METHOD = 'lk_end_of_utterance';\n #tokenizerPromise: Promise<PreTrainedTokenizer>;\n #session: Promise<InferenceSession>;\n #tokenizer?: PreTrainedTokenizer;\n #logger = log();\n\n constructor() {\n super();\n this.#tokenizerPromise = AutoTokenizer.from_pretrained('livekit/turn-detector', {\n revision: 'v1.2.0',\n // local_files_only: true, // TODO(nbsp): can't find it\n });\n this.#session = InferenceSession.create(\n fileURLToPath(new URL('turn_detector.onnx', import.meta.url).href),\n {\n executionProviders: [{ name: 'cpu' }],\n },\n );\n }\n\n async initialize() {\n this.#tokenizer = await this.#tokenizerPromise;\n }\n\n async run(data: RawChatContext): Promise<number | undefined> {\n const text = this.#formatChatContext(data);\n const startTime = Date.now();\n const inputs = this.#tokenizer!.encode(text, { add_special_tokens: false });\n const outputs = await this.#session.then((session) =>\n session.run({ input_ids: new Tensor('int64', inputs, [1, inputs.length]) }, ['prob']),\n );\n const endTime = Date.now();\n const logits = outputs.prob!;\n const eouProbability = logits.data[0] as number;\n this.#logger\n .child({ eouProbability, input: text, duration: endTime - startTime })\n .debug('eou prediction');\n return eouProbability;\n }\n\n #formatChatContext(ctx: RawChatContext): string {\n const newCtx: RawChatContext = [];\n for (const msg of ctx) {\n if (!msg.content) continue;\n newCtx.push(msg);\n }\n\n const convoText = this.#tokenizer!.apply_chat_template(newCtx, {\n add_generation_prompt: false,\n tokenize: false,\n }) as string;\n // remove EOU token from current utterance\n return convoText.slice(0, convoText.lastIndexOf('<|im_end|>'));\n }\n\n async close() {\n await this.#session.then((session) => session.release());\n }\n}\n\nexport class EOUModel {\n readonly unlikelyThreshold: number;\n #executor: ipc.InferenceExecutor;\n\n constructor(unlikelyThreshold = 0.15) {\n this.unlikelyThreshold = unlikelyThreshold;\n this.#executor = CurrentJobContext.getCurrent().inferenceExecutor;\n }\n\n supportsLanguage(language?: string) {\n if (!language) return false;\n const parts = language.toLowerCase().split('-');\n return parts[0] === 'en' || parts[0] === 'english';\n }\n\n async predictEndOfTurn(chatCtx: llm.ChatContext): Promise<number> {\n let messages: RawChatContext = [];\n\n for (const msg of chatCtx.messages) {\n if (msg.role !== llm.ChatRole.ASSISTANT && msg.role !== llm.ChatRole.USER) {\n continue;\n }\n\n if (typeof msg.content === 'string') {\n messages.push({\n role: msg.role === llm.ChatRole.ASSISTANT ? 'assistant' : 'user',\n content: msg.content,\n });\n } else if (Array.isArray(msg.content)) {\n for (const content of msg.content) {\n if (typeof content === 'string') {\n messages.push({\n role: msg.role === llm.ChatRole.ASSISTANT ? 'assistant' : 'user',\n content: content,\n });\n }\n }\n }\n }\n messages = messages.slice(-MAX_HISTORY);\n const result = await this.#executor.doInference(EOURunner.INFERENCE_METHOD, messages);\n return result as any;\n }\n}\n\nexport default EOURunner;\n"],"mappings":"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","names":[]}
|
package/dist/turn_detector.onnx
DELETED
|
Binary file
|
package/src/turn_detector.onnx
DELETED
|
Binary file
|
package/src/turn_detector.ts
DELETED
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
// SPDX-FileCopyrightText: 2024 LiveKit, Inc.
|
|
2
|
-
//
|
|
3
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
-
import type { PreTrainedTokenizer } from '@huggingface/transformers';
|
|
5
|
-
import { AutoTokenizer } from '@huggingface/transformers';
|
|
6
|
-
import type { ipc } from '@livekit/agents';
|
|
7
|
-
import { CurrentJobContext, InferenceRunner, llm, log } from '@livekit/agents';
|
|
8
|
-
import { fileURLToPath } from 'node:url';
|
|
9
|
-
import { InferenceSession, Tensor } from 'onnxruntime-node';
|
|
10
|
-
|
|
11
|
-
const MAX_HISTORY = 4;
|
|
12
|
-
|
|
13
|
-
type RawChatContext = { role: string; content: string }[];
|
|
14
|
-
|
|
15
|
-
export class EOURunner extends InferenceRunner {
|
|
16
|
-
static INFERENCE_METHOD = 'lk_end_of_utterance';
|
|
17
|
-
#tokenizerPromise: Promise<PreTrainedTokenizer>;
|
|
18
|
-
#session: Promise<InferenceSession>;
|
|
19
|
-
#tokenizer?: PreTrainedTokenizer;
|
|
20
|
-
#logger = log();
|
|
21
|
-
|
|
22
|
-
constructor() {
|
|
23
|
-
super();
|
|
24
|
-
this.#tokenizerPromise = AutoTokenizer.from_pretrained('livekit/turn-detector', {
|
|
25
|
-
revision: 'v1.2.0',
|
|
26
|
-
// local_files_only: true, // TODO(nbsp): can't find it
|
|
27
|
-
});
|
|
28
|
-
this.#session = InferenceSession.create(
|
|
29
|
-
fileURLToPath(new URL('turn_detector.onnx', import.meta.url).href),
|
|
30
|
-
{
|
|
31
|
-
executionProviders: [{ name: 'cpu' }],
|
|
32
|
-
},
|
|
33
|
-
);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
async initialize() {
|
|
37
|
-
this.#tokenizer = await this.#tokenizerPromise;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
async run(data: RawChatContext): Promise<number | undefined> {
|
|
41
|
-
const text = this.#formatChatContext(data);
|
|
42
|
-
const startTime = Date.now();
|
|
43
|
-
const inputs = this.#tokenizer!.encode(text, { add_special_tokens: false });
|
|
44
|
-
const outputs = await this.#session.then((session) =>
|
|
45
|
-
session.run({ input_ids: new Tensor('int64', inputs, [1, inputs.length]) }, ['prob']),
|
|
46
|
-
);
|
|
47
|
-
const endTime = Date.now();
|
|
48
|
-
const logits = outputs.prob!;
|
|
49
|
-
const eouProbability = logits.data[0] as number;
|
|
50
|
-
this.#logger
|
|
51
|
-
.child({ eouProbability, input: text, duration: endTime - startTime })
|
|
52
|
-
.debug('eou prediction');
|
|
53
|
-
return eouProbability;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
#formatChatContext(ctx: RawChatContext): string {
|
|
57
|
-
const newCtx: RawChatContext = [];
|
|
58
|
-
for (const msg of ctx) {
|
|
59
|
-
if (!msg.content) continue;
|
|
60
|
-
newCtx.push(msg);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
const convoText = this.#tokenizer!.apply_chat_template(newCtx, {
|
|
64
|
-
add_generation_prompt: false,
|
|
65
|
-
tokenize: false,
|
|
66
|
-
}) as string;
|
|
67
|
-
// remove EOU token from current utterance
|
|
68
|
-
return convoText.slice(0, convoText.lastIndexOf('<|im_end|>'));
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
async close() {
|
|
72
|
-
await this.#session.then((session) => session.release());
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
export class EOUModel {
|
|
77
|
-
readonly unlikelyThreshold: number;
|
|
78
|
-
#executor: ipc.InferenceExecutor;
|
|
79
|
-
|
|
80
|
-
constructor(unlikelyThreshold = 0.15) {
|
|
81
|
-
this.unlikelyThreshold = unlikelyThreshold;
|
|
82
|
-
this.#executor = CurrentJobContext.getCurrent().inferenceExecutor;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
supportsLanguage(language?: string) {
|
|
86
|
-
if (!language) return false;
|
|
87
|
-
const parts = language.toLowerCase().split('-');
|
|
88
|
-
return parts[0] === 'en' || parts[0] === 'english';
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
async predictEndOfTurn(chatCtx: llm.ChatContext): Promise<number> {
|
|
92
|
-
let messages: RawChatContext = [];
|
|
93
|
-
|
|
94
|
-
for (const msg of chatCtx.messages) {
|
|
95
|
-
if (msg.role !== llm.ChatRole.ASSISTANT && msg.role !== llm.ChatRole.USER) {
|
|
96
|
-
continue;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
if (typeof msg.content === 'string') {
|
|
100
|
-
messages.push({
|
|
101
|
-
role: msg.role === llm.ChatRole.ASSISTANT ? 'assistant' : 'user',
|
|
102
|
-
content: msg.content,
|
|
103
|
-
});
|
|
104
|
-
} else if (Array.isArray(msg.content)) {
|
|
105
|
-
for (const content of msg.content) {
|
|
106
|
-
if (typeof content === 'string') {
|
|
107
|
-
messages.push({
|
|
108
|
-
role: msg.role === llm.ChatRole.ASSISTANT ? 'assistant' : 'user',
|
|
109
|
-
content: content,
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
messages = messages.slice(-MAX_HISTORY);
|
|
116
|
-
const result = await this.#executor.doInference(EOURunner.INFERENCE_METHOD, messages);
|
|
117
|
-
return result as any;
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
export default EOURunner;
|