@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.
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 +5 -4
  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
@@ -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":[]}
Binary file
Binary file
@@ -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;