@livekit/agents 1.0.47 → 1.0.49

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 (151) hide show
  1. package/dist/beta/index.cjs +29 -0
  2. package/dist/beta/index.cjs.map +1 -0
  3. package/dist/beta/index.d.cts +2 -0
  4. package/dist/beta/index.d.ts +2 -0
  5. package/dist/beta/index.d.ts.map +1 -0
  6. package/dist/beta/index.js +7 -0
  7. package/dist/beta/index.js.map +1 -0
  8. package/dist/beta/workflows/index.cjs +29 -0
  9. package/dist/beta/workflows/index.cjs.map +1 -0
  10. package/dist/beta/workflows/index.d.cts +2 -0
  11. package/dist/beta/workflows/index.d.ts +2 -0
  12. package/dist/beta/workflows/index.d.ts.map +1 -0
  13. package/dist/beta/workflows/index.js +7 -0
  14. package/dist/beta/workflows/index.js.map +1 -0
  15. package/dist/beta/workflows/task_group.cjs +162 -0
  16. package/dist/beta/workflows/task_group.cjs.map +1 -0
  17. package/dist/beta/workflows/task_group.d.cts +32 -0
  18. package/dist/beta/workflows/task_group.d.ts +32 -0
  19. package/dist/beta/workflows/task_group.d.ts.map +1 -0
  20. package/dist/beta/workflows/task_group.js +138 -0
  21. package/dist/beta/workflows/task_group.js.map +1 -0
  22. package/dist/cpu.cjs +189 -0
  23. package/dist/cpu.cjs.map +1 -0
  24. package/dist/cpu.d.cts +24 -0
  25. package/dist/cpu.d.ts +24 -0
  26. package/dist/cpu.d.ts.map +1 -0
  27. package/dist/cpu.js +152 -0
  28. package/dist/cpu.js.map +1 -0
  29. package/dist/cpu.test.cjs +227 -0
  30. package/dist/cpu.test.cjs.map +1 -0
  31. package/dist/cpu.test.js +204 -0
  32. package/dist/cpu.test.js.map +1 -0
  33. package/dist/index.cjs +3 -0
  34. package/dist/index.cjs.map +1 -1
  35. package/dist/index.d.cts +2 -1
  36. package/dist/index.d.ts +2 -1
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +2 -0
  39. package/dist/index.js.map +1 -1
  40. package/dist/inference/api_protos.d.cts +59 -59
  41. package/dist/inference/api_protos.d.ts +59 -59
  42. package/dist/inference/llm.cjs.map +1 -1
  43. package/dist/inference/llm.d.cts +1 -1
  44. package/dist/inference/llm.d.ts +1 -1
  45. package/dist/inference/llm.d.ts.map +1 -1
  46. package/dist/inference/llm.js.map +1 -1
  47. package/dist/inference/tts.cjs.map +1 -1
  48. package/dist/inference/tts.d.cts +6 -0
  49. package/dist/inference/tts.d.ts +6 -0
  50. package/dist/inference/tts.d.ts.map +1 -1
  51. package/dist/inference/tts.js.map +1 -1
  52. package/dist/llm/chat_context.cjs +89 -1
  53. package/dist/llm/chat_context.cjs.map +1 -1
  54. package/dist/llm/chat_context.d.cts +10 -1
  55. package/dist/llm/chat_context.d.ts +10 -1
  56. package/dist/llm/chat_context.d.ts.map +1 -1
  57. package/dist/llm/chat_context.js +89 -1
  58. package/dist/llm/chat_context.js.map +1 -1
  59. package/dist/llm/chat_context.test.cjs +43 -0
  60. package/dist/llm/chat_context.test.cjs.map +1 -1
  61. package/dist/llm/chat_context.test.js +43 -0
  62. package/dist/llm/chat_context.test.js.map +1 -1
  63. package/dist/llm/index.cjs +2 -0
  64. package/dist/llm/index.cjs.map +1 -1
  65. package/dist/llm/index.d.cts +1 -1
  66. package/dist/llm/index.d.ts +1 -1
  67. package/dist/llm/index.d.ts.map +1 -1
  68. package/dist/llm/index.js +3 -1
  69. package/dist/llm/index.js.map +1 -1
  70. package/dist/llm/provider_format/index.d.cts +1 -1
  71. package/dist/llm/provider_format/index.d.ts +1 -1
  72. package/dist/llm/tool_context.cjs +7 -0
  73. package/dist/llm/tool_context.cjs.map +1 -1
  74. package/dist/llm/tool_context.d.cts +10 -2
  75. package/dist/llm/tool_context.d.ts +10 -2
  76. package/dist/llm/tool_context.d.ts.map +1 -1
  77. package/dist/llm/tool_context.js +6 -0
  78. package/dist/llm/tool_context.js.map +1 -1
  79. package/dist/utils.cjs +1 -0
  80. package/dist/utils.cjs.map +1 -1
  81. package/dist/utils.d.ts.map +1 -1
  82. package/dist/utils.js +1 -0
  83. package/dist/utils.js.map +1 -1
  84. package/dist/version.cjs +1 -1
  85. package/dist/version.js +1 -1
  86. package/dist/voice/agent.cjs +9 -0
  87. package/dist/voice/agent.cjs.map +1 -1
  88. package/dist/voice/agent.d.cts +1 -0
  89. package/dist/voice/agent.d.ts +1 -0
  90. package/dist/voice/agent.d.ts.map +1 -1
  91. package/dist/voice/agent.js +9 -0
  92. package/dist/voice/agent.js.map +1 -1
  93. package/dist/voice/agent_activity.cjs +67 -16
  94. package/dist/voice/agent_activity.cjs.map +1 -1
  95. package/dist/voice/agent_activity.d.cts +7 -0
  96. package/dist/voice/agent_activity.d.ts +7 -0
  97. package/dist/voice/agent_activity.d.ts.map +1 -1
  98. package/dist/voice/agent_activity.js +68 -17
  99. package/dist/voice/agent_activity.js.map +1 -1
  100. package/dist/voice/agent_session.cjs +27 -1
  101. package/dist/voice/agent_session.cjs.map +1 -1
  102. package/dist/voice/agent_session.d.cts +6 -0
  103. package/dist/voice/agent_session.d.ts +6 -0
  104. package/dist/voice/agent_session.d.ts.map +1 -1
  105. package/dist/voice/agent_session.js +27 -1
  106. package/dist/voice/agent_session.js.map +1 -1
  107. package/dist/voice/room_io/room_io.cjs +11 -2
  108. package/dist/voice/room_io/room_io.cjs.map +1 -1
  109. package/dist/voice/room_io/room_io.d.ts.map +1 -1
  110. package/dist/voice/room_io/room_io.js +12 -3
  111. package/dist/voice/room_io/room_io.js.map +1 -1
  112. package/dist/voice/testing/fake_llm.cjs +127 -0
  113. package/dist/voice/testing/fake_llm.cjs.map +1 -0
  114. package/dist/voice/testing/fake_llm.d.cts +30 -0
  115. package/dist/voice/testing/fake_llm.d.ts +30 -0
  116. package/dist/voice/testing/fake_llm.d.ts.map +1 -0
  117. package/dist/voice/testing/fake_llm.js +103 -0
  118. package/dist/voice/testing/fake_llm.js.map +1 -0
  119. package/dist/voice/testing/index.cjs +3 -0
  120. package/dist/voice/testing/index.cjs.map +1 -1
  121. package/dist/voice/testing/index.d.cts +1 -0
  122. package/dist/voice/testing/index.d.ts +1 -0
  123. package/dist/voice/testing/index.d.ts.map +1 -1
  124. package/dist/voice/testing/index.js +2 -0
  125. package/dist/voice/testing/index.js.map +1 -1
  126. package/dist/worker.cjs +6 -29
  127. package/dist/worker.cjs.map +1 -1
  128. package/dist/worker.d.ts.map +1 -1
  129. package/dist/worker.js +6 -19
  130. package/dist/worker.js.map +1 -1
  131. package/package.json +1 -1
  132. package/src/beta/index.ts +9 -0
  133. package/src/beta/workflows/index.ts +9 -0
  134. package/src/beta/workflows/task_group.ts +194 -0
  135. package/src/cpu.test.ts +239 -0
  136. package/src/cpu.ts +173 -0
  137. package/src/index.ts +2 -1
  138. package/src/inference/llm.ts +2 -0
  139. package/src/inference/tts.ts +8 -1
  140. package/src/llm/chat_context.test.ts +48 -0
  141. package/src/llm/chat_context.ts +123 -0
  142. package/src/llm/index.ts +1 -0
  143. package/src/llm/tool_context.ts +14 -0
  144. package/src/utils.ts +5 -0
  145. package/src/voice/agent.ts +11 -0
  146. package/src/voice/agent_activity.ts +102 -16
  147. package/src/voice/agent_session.ts +33 -2
  148. package/src/voice/room_io/room_io.ts +14 -3
  149. package/src/voice/testing/fake_llm.ts +138 -0
  150. package/src/voice/testing/index.ts +2 -0
  151. package/src/worker.ts +34 -50
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cpu.test.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { existsSync, readFileSync } from 'node:fs';\nimport os from 'node:os';\nimport { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';\nimport { CGroupV1CpuMonitor, CGroupV2CpuMonitor, DefaultCpuMonitor, getCpuMonitor } from './cpu.js';\n\nvi.mock('node:fs', () => ({\n existsSync: vi.fn(() => false),\n readFileSync: vi.fn(() => ''),\n}));\n\nconst mockExistsSync = vi.mocked(existsSync);\nconst mockReadFileSync = vi.mocked(readFileSync);\n\ndescribe('cpu', () => {\n beforeEach(() => {\n vi.clearAllMocks();\n delete process.env.NUM_CPUS;\n });\n\n afterEach(() => {\n delete process.env.NUM_CPUS;\n });\n\n describe('getCpuMonitor', () => {\n it('returns CGroupV2CpuMonitor when /sys/fs/cgroup/cpu.stat exists', () => {\n mockExistsSync.mockImplementation((p) => p === '/sys/fs/cgroup/cpu.stat');\n const monitor = getCpuMonitor();\n expect(monitor).toBeInstanceOf(CGroupV2CpuMonitor);\n });\n\n it('returns CGroupV1CpuMonitor when cgroup v1 paths exist', () => {\n mockExistsSync.mockImplementation((p) => p === '/sys/fs/cgroup/cpuacct/cpuacct.usage');\n const monitor = getCpuMonitor();\n expect(monitor).toBeInstanceOf(CGroupV1CpuMonitor);\n });\n\n it('returns DefaultCpuMonitor when no cgroup paths exist', () => {\n mockExistsSync.mockReturnValue(false);\n const monitor = getCpuMonitor();\n expect(monitor).toBeInstanceOf(DefaultCpuMonitor);\n });\n });\n\n describe('DefaultCpuMonitor', () => {\n it('returns os.cpus().length for cpuCount', () => {\n const monitor = new DefaultCpuMonitor();\n expect(monitor.cpuCount()).toBe(os.cpus().length);\n });\n\n it('respects NUM_CPUS env var', () => {\n process.env.NUM_CPUS = '4.5';\n const monitor = new DefaultCpuMonitor();\n expect(monitor.cpuCount()).toBe(4.5);\n });\n\n it('ignores invalid NUM_CPUS', () => {\n process.env.NUM_CPUS = 'notanumber';\n const monitor = new DefaultCpuMonitor();\n expect(monitor.cpuCount()).toBe(os.cpus().length);\n });\n\n it('cpuPercent returns value in [0, 1]', async () => {\n const monitor = new DefaultCpuMonitor();\n const result = await monitor.cpuPercent(50);\n expect(result).toBeGreaterThanOrEqual(0);\n expect(result).toBeLessThanOrEqual(1);\n }, 10_000);\n });\n\n describe('CGroupV2CpuMonitor', () => {\n it('returns quota/period for cpuCount', () => {\n mockReadFileSync.mockImplementation((p) => {\n if (String(p) === '/sys/fs/cgroup/cpu.max') return '200000 100000';\n return '';\n });\n const monitor = new CGroupV2CpuMonitor();\n expect(monitor.cpuCount()).toBe(2);\n });\n\n it('falls back to os.cpus().length when quota is max', () => {\n mockReadFileSync.mockImplementation((p) => {\n if (String(p) === '/sys/fs/cgroup/cpu.max') return 'max 100000';\n return '';\n });\n const monitor = new CGroupV2CpuMonitor();\n expect(monitor.cpuCount()).toBe(os.cpus().length);\n });\n\n it('handles missing cpu.max gracefully', () => {\n mockReadFileSync.mockImplementation(() => {\n throw new Error('ENOENT');\n });\n const monitor = new CGroupV2CpuMonitor();\n expect(monitor.cpuCount()).toBe(os.cpus().length);\n });\n\n it('respects NUM_CPUS env var', () => {\n process.env.NUM_CPUS = '3';\n const monitor = new CGroupV2CpuMonitor();\n expect(monitor.cpuCount()).toBe(3);\n });\n\n it('cpuPercent computes correct value from usage_usec deltas', async () => {\n let callCount = 0;\n mockReadFileSync.mockImplementation((p) => {\n if (String(p) === '/sys/fs/cgroup/cpu.stat') {\n callCount++;\n // Two reads: 1,000,000 usec apart => 1s of CPU usage over the interval\n return callCount <= 1\n ? 'usage_usec 1000000\\nuser_usec 800000\\nsystem_usec 200000'\n : 'usage_usec 2000000\\nuser_usec 1600000\\nsystem_usec 400000';\n }\n if (String(p) === '/sys/fs/cgroup/cpu.max') return '200000 100000';\n return '';\n });\n const monitor = new CGroupV2CpuMonitor();\n // interval=100ms, 2 cpus, 1s of usage => 1/(0.1*2) = 5, clamped to 1\n const result = await monitor.cpuPercent(100);\n expect(result).toBe(1);\n }, 10_000);\n\n it('cpuPercent returns fractional load', async () => {\n let callCount = 0;\n mockReadFileSync.mockImplementation((p) => {\n if (String(p) === '/sys/fs/cgroup/cpu.stat') {\n callCount++;\n // 50,000 usec delta => 0.05s of CPU over 0.1s on 2 cpus => 0.05/(0.1*2) = 0.25\n return callCount <= 1 ? 'usage_usec 1000000\\n' : 'usage_usec 1050000\\n';\n }\n if (String(p) === '/sys/fs/cgroup/cpu.max') return '200000 100000';\n return '';\n });\n const monitor = new CGroupV2CpuMonitor();\n const result = await monitor.cpuPercent(100);\n expect(result).toBeCloseTo(0.25, 1);\n }, 10_000);\n\n it('throws when usage_usec is missing from cpu.stat', async () => {\n mockReadFileSync.mockImplementation((p) => {\n if (String(p) === '/sys/fs/cgroup/cpu.stat') return 'user_usec 800000\\nsystem_usec 200000';\n return '';\n });\n const monitor = new CGroupV2CpuMonitor();\n await expect(() => monitor.cpuPercent(50)).rejects.toThrow('Failed to read CPU usage');\n });\n });\n\n describe('CGroupV1CpuMonitor', () => {\n it('returns quota/period for cpuCount', () => {\n mockReadFileSync.mockImplementation((p) => {\n if (String(p) === '/sys/fs/cgroup/cpu/cpu.cfs_quota_us') return '200000';\n if (String(p) === '/sys/fs/cgroup/cpu/cpu.cfs_period_us') return '100000';\n return '';\n });\n const monitor = new CGroupV1CpuMonitor();\n expect(monitor.cpuCount()).toBe(2);\n });\n\n it('defaults to 2.0 when quota is -1', () => {\n mockReadFileSync.mockImplementation((p) => {\n if (String(p) === '/sys/fs/cgroup/cpu/cpu.cfs_quota_us') return '-1';\n if (String(p) === '/sys/fs/cgroup/cpu/cpu.cfs_period_us') return '100000';\n return '';\n });\n const monitor = new CGroupV1CpuMonitor();\n expect(monitor.cpuCount()).toBe(2.0);\n });\n\n it('defaults to 2.0 when quota file is unreadable', () => {\n mockReadFileSync.mockImplementation(() => {\n throw new Error('ENOENT');\n });\n const monitor = new CGroupV1CpuMonitor();\n expect(monitor.cpuCount()).toBe(2.0);\n });\n\n it('clamps cpuCount to minimum 1.0', () => {\n mockReadFileSync.mockImplementation((p) => {\n if (String(p) === '/sys/fs/cgroup/cpu/cpu.cfs_quota_us') return '50000';\n if (String(p) === '/sys/fs/cgroup/cpu/cpu.cfs_period_us') return '100000';\n return '';\n });\n const monitor = new CGroupV1CpuMonitor();\n expect(monitor.cpuCount()).toBe(1.0);\n });\n\n it('respects NUM_CPUS env var', () => {\n process.env.NUM_CPUS = '8';\n const monitor = new CGroupV1CpuMonitor();\n expect(monitor.cpuCount()).toBe(8);\n });\n\n it('cpuPercent computes correct value from nanosecond deltas', async () => {\n let callCount = 0;\n mockReadFileSync.mockImplementation((p) => {\n if (String(p) === '/sys/fs/cgroup/cpuacct/cpuacct.usage') {\n callCount++;\n // 100_000_000 ns delta = 0.1s CPU over 0.1s interval on 2 cpus => 0.1/(0.1*2) = 0.5\n return callCount <= 1 ? '1000000000' : '1100000000';\n }\n if (String(p) === '/sys/fs/cgroup/cpu/cpu.cfs_quota_us') return '200000';\n if (String(p) === '/sys/fs/cgroup/cpu/cpu.cfs_period_us') return '100000';\n return '';\n });\n const monitor = new CGroupV1CpuMonitor();\n const result = await monitor.cpuPercent(100);\n expect(result).toBeCloseTo(0.5, 1);\n }, 10_000);\n\n it('clamps cpuPercent output to [0, 1]', async () => {\n let callCount = 0;\n mockReadFileSync.mockImplementation((p) => {\n if (String(p) === '/sys/fs/cgroup/cpuacct/cpuacct.usage') {\n callCount++;\n // Huge delta => would exceed 1.0 without clamping\n return callCount <= 1 ? '0' : '10000000000';\n }\n if (String(p) === '/sys/fs/cgroup/cpu/cpu.cfs_quota_us') return '100000';\n if (String(p) === '/sys/fs/cgroup/cpu/cpu.cfs_period_us') return '100000';\n return '';\n });\n const monitor = new CGroupV1CpuMonitor();\n const result = await monitor.cpuPercent(100);\n expect(result).toBeLessThanOrEqual(1);\n expect(result).toBeGreaterThanOrEqual(0);\n }, 10_000);\n\n it('throws when cpuacct.usage is unreadable', async () => {\n mockReadFileSync.mockImplementation(() => {\n throw new Error('ENOENT');\n });\n const monitor = new CGroupV1CpuMonitor();\n await expect(() => monitor.cpuPercent(50)).rejects.toThrow('Failed to read cpuacct.usage');\n });\n });\n});\n"],"mappings":"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","names":["os"]}
@@ -0,0 +1,204 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import os from "node:os";
3
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
4
+ import { CGroupV1CpuMonitor, CGroupV2CpuMonitor, DefaultCpuMonitor, getCpuMonitor } from "./cpu.js";
5
+ vi.mock("node:fs", () => ({
6
+ existsSync: vi.fn(() => false),
7
+ readFileSync: vi.fn(() => "")
8
+ }));
9
+ const mockExistsSync = vi.mocked(existsSync);
10
+ const mockReadFileSync = vi.mocked(readFileSync);
11
+ describe("cpu", () => {
12
+ beforeEach(() => {
13
+ vi.clearAllMocks();
14
+ delete process.env.NUM_CPUS;
15
+ });
16
+ afterEach(() => {
17
+ delete process.env.NUM_CPUS;
18
+ });
19
+ describe("getCpuMonitor", () => {
20
+ it("returns CGroupV2CpuMonitor when /sys/fs/cgroup/cpu.stat exists", () => {
21
+ mockExistsSync.mockImplementation((p) => p === "/sys/fs/cgroup/cpu.stat");
22
+ const monitor = getCpuMonitor();
23
+ expect(monitor).toBeInstanceOf(CGroupV2CpuMonitor);
24
+ });
25
+ it("returns CGroupV1CpuMonitor when cgroup v1 paths exist", () => {
26
+ mockExistsSync.mockImplementation((p) => p === "/sys/fs/cgroup/cpuacct/cpuacct.usage");
27
+ const monitor = getCpuMonitor();
28
+ expect(monitor).toBeInstanceOf(CGroupV1CpuMonitor);
29
+ });
30
+ it("returns DefaultCpuMonitor when no cgroup paths exist", () => {
31
+ mockExistsSync.mockReturnValue(false);
32
+ const monitor = getCpuMonitor();
33
+ expect(monitor).toBeInstanceOf(DefaultCpuMonitor);
34
+ });
35
+ });
36
+ describe("DefaultCpuMonitor", () => {
37
+ it("returns os.cpus().length for cpuCount", () => {
38
+ const monitor = new DefaultCpuMonitor();
39
+ expect(monitor.cpuCount()).toBe(os.cpus().length);
40
+ });
41
+ it("respects NUM_CPUS env var", () => {
42
+ process.env.NUM_CPUS = "4.5";
43
+ const monitor = new DefaultCpuMonitor();
44
+ expect(monitor.cpuCount()).toBe(4.5);
45
+ });
46
+ it("ignores invalid NUM_CPUS", () => {
47
+ process.env.NUM_CPUS = "notanumber";
48
+ const monitor = new DefaultCpuMonitor();
49
+ expect(monitor.cpuCount()).toBe(os.cpus().length);
50
+ });
51
+ it("cpuPercent returns value in [0, 1]", async () => {
52
+ const monitor = new DefaultCpuMonitor();
53
+ const result = await monitor.cpuPercent(50);
54
+ expect(result).toBeGreaterThanOrEqual(0);
55
+ expect(result).toBeLessThanOrEqual(1);
56
+ }, 1e4);
57
+ });
58
+ describe("CGroupV2CpuMonitor", () => {
59
+ it("returns quota/period for cpuCount", () => {
60
+ mockReadFileSync.mockImplementation((p) => {
61
+ if (String(p) === "/sys/fs/cgroup/cpu.max") return "200000 100000";
62
+ return "";
63
+ });
64
+ const monitor = new CGroupV2CpuMonitor();
65
+ expect(monitor.cpuCount()).toBe(2);
66
+ });
67
+ it("falls back to os.cpus().length when quota is max", () => {
68
+ mockReadFileSync.mockImplementation((p) => {
69
+ if (String(p) === "/sys/fs/cgroup/cpu.max") return "max 100000";
70
+ return "";
71
+ });
72
+ const monitor = new CGroupV2CpuMonitor();
73
+ expect(monitor.cpuCount()).toBe(os.cpus().length);
74
+ });
75
+ it("handles missing cpu.max gracefully", () => {
76
+ mockReadFileSync.mockImplementation(() => {
77
+ throw new Error("ENOENT");
78
+ });
79
+ const monitor = new CGroupV2CpuMonitor();
80
+ expect(monitor.cpuCount()).toBe(os.cpus().length);
81
+ });
82
+ it("respects NUM_CPUS env var", () => {
83
+ process.env.NUM_CPUS = "3";
84
+ const monitor = new CGroupV2CpuMonitor();
85
+ expect(monitor.cpuCount()).toBe(3);
86
+ });
87
+ it("cpuPercent computes correct value from usage_usec deltas", async () => {
88
+ let callCount = 0;
89
+ mockReadFileSync.mockImplementation((p) => {
90
+ if (String(p) === "/sys/fs/cgroup/cpu.stat") {
91
+ callCount++;
92
+ return callCount <= 1 ? "usage_usec 1000000\nuser_usec 800000\nsystem_usec 200000" : "usage_usec 2000000\nuser_usec 1600000\nsystem_usec 400000";
93
+ }
94
+ if (String(p) === "/sys/fs/cgroup/cpu.max") return "200000 100000";
95
+ return "";
96
+ });
97
+ const monitor = new CGroupV2CpuMonitor();
98
+ const result = await monitor.cpuPercent(100);
99
+ expect(result).toBe(1);
100
+ }, 1e4);
101
+ it("cpuPercent returns fractional load", async () => {
102
+ let callCount = 0;
103
+ mockReadFileSync.mockImplementation((p) => {
104
+ if (String(p) === "/sys/fs/cgroup/cpu.stat") {
105
+ callCount++;
106
+ return callCount <= 1 ? "usage_usec 1000000\n" : "usage_usec 1050000\n";
107
+ }
108
+ if (String(p) === "/sys/fs/cgroup/cpu.max") return "200000 100000";
109
+ return "";
110
+ });
111
+ const monitor = new CGroupV2CpuMonitor();
112
+ const result = await monitor.cpuPercent(100);
113
+ expect(result).toBeCloseTo(0.25, 1);
114
+ }, 1e4);
115
+ it("throws when usage_usec is missing from cpu.stat", async () => {
116
+ mockReadFileSync.mockImplementation((p) => {
117
+ if (String(p) === "/sys/fs/cgroup/cpu.stat") return "user_usec 800000\nsystem_usec 200000";
118
+ return "";
119
+ });
120
+ const monitor = new CGroupV2CpuMonitor();
121
+ await expect(() => monitor.cpuPercent(50)).rejects.toThrow("Failed to read CPU usage");
122
+ });
123
+ });
124
+ describe("CGroupV1CpuMonitor", () => {
125
+ it("returns quota/period for cpuCount", () => {
126
+ mockReadFileSync.mockImplementation((p) => {
127
+ if (String(p) === "/sys/fs/cgroup/cpu/cpu.cfs_quota_us") return "200000";
128
+ if (String(p) === "/sys/fs/cgroup/cpu/cpu.cfs_period_us") return "100000";
129
+ return "";
130
+ });
131
+ const monitor = new CGroupV1CpuMonitor();
132
+ expect(monitor.cpuCount()).toBe(2);
133
+ });
134
+ it("defaults to 2.0 when quota is -1", () => {
135
+ mockReadFileSync.mockImplementation((p) => {
136
+ if (String(p) === "/sys/fs/cgroup/cpu/cpu.cfs_quota_us") return "-1";
137
+ if (String(p) === "/sys/fs/cgroup/cpu/cpu.cfs_period_us") return "100000";
138
+ return "";
139
+ });
140
+ const monitor = new CGroupV1CpuMonitor();
141
+ expect(monitor.cpuCount()).toBe(2);
142
+ });
143
+ it("defaults to 2.0 when quota file is unreadable", () => {
144
+ mockReadFileSync.mockImplementation(() => {
145
+ throw new Error("ENOENT");
146
+ });
147
+ const monitor = new CGroupV1CpuMonitor();
148
+ expect(monitor.cpuCount()).toBe(2);
149
+ });
150
+ it("clamps cpuCount to minimum 1.0", () => {
151
+ mockReadFileSync.mockImplementation((p) => {
152
+ if (String(p) === "/sys/fs/cgroup/cpu/cpu.cfs_quota_us") return "50000";
153
+ if (String(p) === "/sys/fs/cgroup/cpu/cpu.cfs_period_us") return "100000";
154
+ return "";
155
+ });
156
+ const monitor = new CGroupV1CpuMonitor();
157
+ expect(monitor.cpuCount()).toBe(1);
158
+ });
159
+ it("respects NUM_CPUS env var", () => {
160
+ process.env.NUM_CPUS = "8";
161
+ const monitor = new CGroupV1CpuMonitor();
162
+ expect(monitor.cpuCount()).toBe(8);
163
+ });
164
+ it("cpuPercent computes correct value from nanosecond deltas", async () => {
165
+ let callCount = 0;
166
+ mockReadFileSync.mockImplementation((p) => {
167
+ if (String(p) === "/sys/fs/cgroup/cpuacct/cpuacct.usage") {
168
+ callCount++;
169
+ return callCount <= 1 ? "1000000000" : "1100000000";
170
+ }
171
+ if (String(p) === "/sys/fs/cgroup/cpu/cpu.cfs_quota_us") return "200000";
172
+ if (String(p) === "/sys/fs/cgroup/cpu/cpu.cfs_period_us") return "100000";
173
+ return "";
174
+ });
175
+ const monitor = new CGroupV1CpuMonitor();
176
+ const result = await monitor.cpuPercent(100);
177
+ expect(result).toBeCloseTo(0.5, 1);
178
+ }, 1e4);
179
+ it("clamps cpuPercent output to [0, 1]", async () => {
180
+ let callCount = 0;
181
+ mockReadFileSync.mockImplementation((p) => {
182
+ if (String(p) === "/sys/fs/cgroup/cpuacct/cpuacct.usage") {
183
+ callCount++;
184
+ return callCount <= 1 ? "0" : "10000000000";
185
+ }
186
+ if (String(p) === "/sys/fs/cgroup/cpu/cpu.cfs_quota_us") return "100000";
187
+ if (String(p) === "/sys/fs/cgroup/cpu/cpu.cfs_period_us") return "100000";
188
+ return "";
189
+ });
190
+ const monitor = new CGroupV1CpuMonitor();
191
+ const result = await monitor.cpuPercent(100);
192
+ expect(result).toBeLessThanOrEqual(1);
193
+ expect(result).toBeGreaterThanOrEqual(0);
194
+ }, 1e4);
195
+ it("throws when cpuacct.usage is unreadable", async () => {
196
+ mockReadFileSync.mockImplementation(() => {
197
+ throw new Error("ENOENT");
198
+ });
199
+ const monitor = new CGroupV1CpuMonitor();
200
+ await expect(() => monitor.cpuPercent(50)).rejects.toThrow("Failed to read cpuacct.usage");
201
+ });
202
+ });
203
+ });
204
+ //# sourceMappingURL=cpu.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cpu.test.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { existsSync, readFileSync } from 'node:fs';\nimport os from 'node:os';\nimport { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';\nimport { CGroupV1CpuMonitor, CGroupV2CpuMonitor, DefaultCpuMonitor, getCpuMonitor } from './cpu.js';\n\nvi.mock('node:fs', () => ({\n existsSync: vi.fn(() => false),\n readFileSync: vi.fn(() => ''),\n}));\n\nconst mockExistsSync = vi.mocked(existsSync);\nconst mockReadFileSync = vi.mocked(readFileSync);\n\ndescribe('cpu', () => {\n beforeEach(() => {\n vi.clearAllMocks();\n delete process.env.NUM_CPUS;\n });\n\n afterEach(() => {\n delete process.env.NUM_CPUS;\n });\n\n describe('getCpuMonitor', () => {\n it('returns CGroupV2CpuMonitor when /sys/fs/cgroup/cpu.stat exists', () => {\n mockExistsSync.mockImplementation((p) => p === '/sys/fs/cgroup/cpu.stat');\n const monitor = getCpuMonitor();\n expect(monitor).toBeInstanceOf(CGroupV2CpuMonitor);\n });\n\n it('returns CGroupV1CpuMonitor when cgroup v1 paths exist', () => {\n mockExistsSync.mockImplementation((p) => p === '/sys/fs/cgroup/cpuacct/cpuacct.usage');\n const monitor = getCpuMonitor();\n expect(monitor).toBeInstanceOf(CGroupV1CpuMonitor);\n });\n\n it('returns DefaultCpuMonitor when no cgroup paths exist', () => {\n mockExistsSync.mockReturnValue(false);\n const monitor = getCpuMonitor();\n expect(monitor).toBeInstanceOf(DefaultCpuMonitor);\n });\n });\n\n describe('DefaultCpuMonitor', () => {\n it('returns os.cpus().length for cpuCount', () => {\n const monitor = new DefaultCpuMonitor();\n expect(monitor.cpuCount()).toBe(os.cpus().length);\n });\n\n it('respects NUM_CPUS env var', () => {\n process.env.NUM_CPUS = '4.5';\n const monitor = new DefaultCpuMonitor();\n expect(monitor.cpuCount()).toBe(4.5);\n });\n\n it('ignores invalid NUM_CPUS', () => {\n process.env.NUM_CPUS = 'notanumber';\n const monitor = new DefaultCpuMonitor();\n expect(monitor.cpuCount()).toBe(os.cpus().length);\n });\n\n it('cpuPercent returns value in [0, 1]', async () => {\n const monitor = new DefaultCpuMonitor();\n const result = await monitor.cpuPercent(50);\n expect(result).toBeGreaterThanOrEqual(0);\n expect(result).toBeLessThanOrEqual(1);\n }, 10_000);\n });\n\n describe('CGroupV2CpuMonitor', () => {\n it('returns quota/period for cpuCount', () => {\n mockReadFileSync.mockImplementation((p) => {\n if (String(p) === '/sys/fs/cgroup/cpu.max') return '200000 100000';\n return '';\n });\n const monitor = new CGroupV2CpuMonitor();\n expect(monitor.cpuCount()).toBe(2);\n });\n\n it('falls back to os.cpus().length when quota is max', () => {\n mockReadFileSync.mockImplementation((p) => {\n if (String(p) === '/sys/fs/cgroup/cpu.max') return 'max 100000';\n return '';\n });\n const monitor = new CGroupV2CpuMonitor();\n expect(monitor.cpuCount()).toBe(os.cpus().length);\n });\n\n it('handles missing cpu.max gracefully', () => {\n mockReadFileSync.mockImplementation(() => {\n throw new Error('ENOENT');\n });\n const monitor = new CGroupV2CpuMonitor();\n expect(monitor.cpuCount()).toBe(os.cpus().length);\n });\n\n it('respects NUM_CPUS env var', () => {\n process.env.NUM_CPUS = '3';\n const monitor = new CGroupV2CpuMonitor();\n expect(monitor.cpuCount()).toBe(3);\n });\n\n it('cpuPercent computes correct value from usage_usec deltas', async () => {\n let callCount = 0;\n mockReadFileSync.mockImplementation((p) => {\n if (String(p) === '/sys/fs/cgroup/cpu.stat') {\n callCount++;\n // Two reads: 1,000,000 usec apart => 1s of CPU usage over the interval\n return callCount <= 1\n ? 'usage_usec 1000000\\nuser_usec 800000\\nsystem_usec 200000'\n : 'usage_usec 2000000\\nuser_usec 1600000\\nsystem_usec 400000';\n }\n if (String(p) === '/sys/fs/cgroup/cpu.max') return '200000 100000';\n return '';\n });\n const monitor = new CGroupV2CpuMonitor();\n // interval=100ms, 2 cpus, 1s of usage => 1/(0.1*2) = 5, clamped to 1\n const result = await monitor.cpuPercent(100);\n expect(result).toBe(1);\n }, 10_000);\n\n it('cpuPercent returns fractional load', async () => {\n let callCount = 0;\n mockReadFileSync.mockImplementation((p) => {\n if (String(p) === '/sys/fs/cgroup/cpu.stat') {\n callCount++;\n // 50,000 usec delta => 0.05s of CPU over 0.1s on 2 cpus => 0.05/(0.1*2) = 0.25\n return callCount <= 1 ? 'usage_usec 1000000\\n' : 'usage_usec 1050000\\n';\n }\n if (String(p) === '/sys/fs/cgroup/cpu.max') return '200000 100000';\n return '';\n });\n const monitor = new CGroupV2CpuMonitor();\n const result = await monitor.cpuPercent(100);\n expect(result).toBeCloseTo(0.25, 1);\n }, 10_000);\n\n it('throws when usage_usec is missing from cpu.stat', async () => {\n mockReadFileSync.mockImplementation((p) => {\n if (String(p) === '/sys/fs/cgroup/cpu.stat') return 'user_usec 800000\\nsystem_usec 200000';\n return '';\n });\n const monitor = new CGroupV2CpuMonitor();\n await expect(() => monitor.cpuPercent(50)).rejects.toThrow('Failed to read CPU usage');\n });\n });\n\n describe('CGroupV1CpuMonitor', () => {\n it('returns quota/period for cpuCount', () => {\n mockReadFileSync.mockImplementation((p) => {\n if (String(p) === '/sys/fs/cgroup/cpu/cpu.cfs_quota_us') return '200000';\n if (String(p) === '/sys/fs/cgroup/cpu/cpu.cfs_period_us') return '100000';\n return '';\n });\n const monitor = new CGroupV1CpuMonitor();\n expect(monitor.cpuCount()).toBe(2);\n });\n\n it('defaults to 2.0 when quota is -1', () => {\n mockReadFileSync.mockImplementation((p) => {\n if (String(p) === '/sys/fs/cgroup/cpu/cpu.cfs_quota_us') return '-1';\n if (String(p) === '/sys/fs/cgroup/cpu/cpu.cfs_period_us') return '100000';\n return '';\n });\n const monitor = new CGroupV1CpuMonitor();\n expect(monitor.cpuCount()).toBe(2.0);\n });\n\n it('defaults to 2.0 when quota file is unreadable', () => {\n mockReadFileSync.mockImplementation(() => {\n throw new Error('ENOENT');\n });\n const monitor = new CGroupV1CpuMonitor();\n expect(monitor.cpuCount()).toBe(2.0);\n });\n\n it('clamps cpuCount to minimum 1.0', () => {\n mockReadFileSync.mockImplementation((p) => {\n if (String(p) === '/sys/fs/cgroup/cpu/cpu.cfs_quota_us') return '50000';\n if (String(p) === '/sys/fs/cgroup/cpu/cpu.cfs_period_us') return '100000';\n return '';\n });\n const monitor = new CGroupV1CpuMonitor();\n expect(monitor.cpuCount()).toBe(1.0);\n });\n\n it('respects NUM_CPUS env var', () => {\n process.env.NUM_CPUS = '8';\n const monitor = new CGroupV1CpuMonitor();\n expect(monitor.cpuCount()).toBe(8);\n });\n\n it('cpuPercent computes correct value from nanosecond deltas', async () => {\n let callCount = 0;\n mockReadFileSync.mockImplementation((p) => {\n if (String(p) === '/sys/fs/cgroup/cpuacct/cpuacct.usage') {\n callCount++;\n // 100_000_000 ns delta = 0.1s CPU over 0.1s interval on 2 cpus => 0.1/(0.1*2) = 0.5\n return callCount <= 1 ? '1000000000' : '1100000000';\n }\n if (String(p) === '/sys/fs/cgroup/cpu/cpu.cfs_quota_us') return '200000';\n if (String(p) === '/sys/fs/cgroup/cpu/cpu.cfs_period_us') return '100000';\n return '';\n });\n const monitor = new CGroupV1CpuMonitor();\n const result = await monitor.cpuPercent(100);\n expect(result).toBeCloseTo(0.5, 1);\n }, 10_000);\n\n it('clamps cpuPercent output to [0, 1]', async () => {\n let callCount = 0;\n mockReadFileSync.mockImplementation((p) => {\n if (String(p) === '/sys/fs/cgroup/cpuacct/cpuacct.usage') {\n callCount++;\n // Huge delta => would exceed 1.0 without clamping\n return callCount <= 1 ? '0' : '10000000000';\n }\n if (String(p) === '/sys/fs/cgroup/cpu/cpu.cfs_quota_us') return '100000';\n if (String(p) === '/sys/fs/cgroup/cpu/cpu.cfs_period_us') return '100000';\n return '';\n });\n const monitor = new CGroupV1CpuMonitor();\n const result = await monitor.cpuPercent(100);\n expect(result).toBeLessThanOrEqual(1);\n expect(result).toBeGreaterThanOrEqual(0);\n }, 10_000);\n\n it('throws when cpuacct.usage is unreadable', async () => {\n mockReadFileSync.mockImplementation(() => {\n throw new Error('ENOENT');\n });\n const monitor = new CGroupV1CpuMonitor();\n await expect(() => monitor.cpuPercent(50)).rejects.toThrow('Failed to read cpuacct.usage');\n });\n });\n});\n"],"mappings":"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","names":[]}
package/dist/index.cjs CHANGED
@@ -29,6 +29,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
29
29
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
30
30
  var index_exports = {};
31
31
  __export(index_exports, {
32
+ beta: () => beta,
32
33
  cli: () => cli,
33
34
  createTimedString: () => import_io.createTimedString,
34
35
  inference: () => inference,
@@ -44,6 +45,7 @@ __export(index_exports, {
44
45
  voice: () => voice
45
46
  });
46
47
  module.exports = __toCommonJS(index_exports);
48
+ var beta = __toESM(require("./beta/index.cjs"), 1);
47
49
  var cli = __toESM(require("./cli.cjs"), 1);
48
50
  var inference = __toESM(require("./inference/index.cjs"), 1);
49
51
  var ipc = __toESM(require("./ipc/index.cjs"), 1);
@@ -72,6 +74,7 @@ var import_io = require("./voice/io.cjs");
72
74
  __reExport(index_exports, require("./worker.cjs"), module.exports);
73
75
  // Annotate the CommonJS export names for ESM import in node:
74
76
  0 && (module.exports = {
77
+ beta,
75
78
  cli,
76
79
  createTimedString,
77
80
  inference,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * LiveKit Agents is a framework for building realtime programmable participants that run on\n * servers.\n *\n * @see {@link https://docs.livekit.io/agents/overview | LiveKit Agents documentation}\n * @packageDocumentation\n */\nimport * as cli from './cli.js';\nimport * as inference from './inference/index.js';\nimport * as ipc from './ipc/index.js';\nimport * as llm from './llm/index.js';\nimport * as metrics from './metrics/index.js';\nimport * as stream from './stream/index.js';\nimport * as stt from './stt/index.js';\nimport * as telemetry from './telemetry/index.js';\nimport * as tokenize from './tokenize/index.js';\nimport * as tts from './tts/index.js';\nimport * as voice from './voice/index.js';\n\nexport * from './_exceptions.js';\nexport * from './audio.js';\nexport * from './connection_pool.js';\nexport * from './generator.js';\nexport * from './inference_runner.js';\nexport * from './job.js';\nexport * from './log.js';\nexport * from './plugin.js';\nexport * from './transcription.js';\nexport * from './types.js';\nexport * from './utils.js';\nexport * from './vad.js';\nexport * from './version.js';\nexport { createTimedString, isTimedString, type TimedString } from './voice/io.js';\nexport * from './worker.js';\n\nexport { cli, inference, ipc, llm, metrics, stream, stt, telemetry, tokenize, tts, voice };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWA,UAAqB;AACrB,gBAA2B;AAC3B,UAAqB;AACrB,UAAqB;AACrB,cAAyB;AACzB,aAAwB;AACxB,UAAqB;AACrB,gBAA2B;AAC3B,eAA0B;AAC1B,UAAqB;AACrB,YAAuB;AAEvB,0BAAc,6BAvBd;AAwBA,0BAAc,uBAxBd;AAyBA,0BAAc,iCAzBd;AA0BA,0BAAc,2BA1Bd;AA2BA,0BAAc,kCA3Bd;AA4BA,0BAAc,qBA5Bd;AA6BA,0BAAc,qBA7Bd;AA8BA,0BAAc,wBA9Bd;AA+BA,0BAAc,+BA/Bd;AAgCA,0BAAc,uBAhCd;AAiCA,0BAAc,uBAjCd;AAkCA,0BAAc,qBAlCd;AAmCA,0BAAc,yBAnCd;AAoCA,gBAAmE;AACnE,0BAAc,wBArCd;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * LiveKit Agents is a framework for building realtime programmable participants that run on\n * servers.\n *\n * @see {@link https://docs.livekit.io/agents/overview | LiveKit Agents documentation}\n * @packageDocumentation\n */\nimport * as beta from './beta/index.js';\nimport * as cli from './cli.js';\nimport * as inference from './inference/index.js';\nimport * as ipc from './ipc/index.js';\nimport * as llm from './llm/index.js';\nimport * as metrics from './metrics/index.js';\nimport * as stream from './stream/index.js';\nimport * as stt from './stt/index.js';\nimport * as telemetry from './telemetry/index.js';\nimport * as tokenize from './tokenize/index.js';\nimport * as tts from './tts/index.js';\nimport * as voice from './voice/index.js';\n\nexport * from './_exceptions.js';\nexport * from './audio.js';\nexport * from './connection_pool.js';\nexport * from './generator.js';\nexport * from './inference_runner.js';\nexport * from './job.js';\nexport * from './log.js';\nexport * from './plugin.js';\nexport * from './transcription.js';\nexport * from './types.js';\nexport * from './utils.js';\nexport * from './vad.js';\nexport * from './version.js';\nexport { createTimedString, isTimedString, type TimedString } from './voice/io.js';\nexport * from './worker.js';\n\nexport { beta, cli, inference, ipc, llm, metrics, stream, stt, telemetry, tokenize, tts, voice };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWA,WAAsB;AACtB,UAAqB;AACrB,gBAA2B;AAC3B,UAAqB;AACrB,UAAqB;AACrB,cAAyB;AACzB,aAAwB;AACxB,UAAqB;AACrB,gBAA2B;AAC3B,eAA0B;AAC1B,UAAqB;AACrB,YAAuB;AAEvB,0BAAc,6BAxBd;AAyBA,0BAAc,uBAzBd;AA0BA,0BAAc,iCA1Bd;AA2BA,0BAAc,2BA3Bd;AA4BA,0BAAc,kCA5Bd;AA6BA,0BAAc,qBA7Bd;AA8BA,0BAAc,qBA9Bd;AA+BA,0BAAc,wBA/Bd;AAgCA,0BAAc,+BAhCd;AAiCA,0BAAc,uBAjCd;AAkCA,0BAAc,uBAlCd;AAmCA,0BAAc,qBAnCd;AAoCA,0BAAc,yBApCd;AAqCA,gBAAmE;AACnE,0BAAc,wBAtCd;","names":[]}
package/dist/index.d.cts CHANGED
@@ -5,6 +5,7 @@
5
5
  * @see {@link https://docs.livekit.io/agents/overview | LiveKit Agents documentation}
6
6
  * @packageDocumentation
7
7
  */
8
+ import * as beta from './beta/index.js';
8
9
  import * as cli from './cli.js';
9
10
  import * as inference from './inference/index.js';
10
11
  import * as ipc from './ipc/index.js';
@@ -31,5 +32,5 @@ export * from './vad.js';
31
32
  export * from './version.js';
32
33
  export { createTimedString, isTimedString, type TimedString } from './voice/io.js';
33
34
  export * from './worker.js';
34
- export { cli, inference, ipc, llm, metrics, stream, stt, telemetry, tokenize, tts, voice };
35
+ export { beta, cli, inference, ipc, llm, metrics, stream, stt, telemetry, tokenize, tts, voice };
35
36
  //# sourceMappingURL=index.d.ts.map
package/dist/index.d.ts CHANGED
@@ -5,6 +5,7 @@
5
5
  * @see {@link https://docs.livekit.io/agents/overview | LiveKit Agents documentation}
6
6
  * @packageDocumentation
7
7
  */
8
+ import * as beta from './beta/index.js';
8
9
  import * as cli from './cli.js';
9
10
  import * as inference from './inference/index.js';
10
11
  import * as ipc from './ipc/index.js';
@@ -31,5 +32,5 @@ export * from './vad.js';
31
32
  export * from './version.js';
32
33
  export { createTimedString, isTimedString, type TimedString } from './voice/io.js';
33
34
  export * from './worker.js';
34
- export { cli, inference, ipc, llm, metrics, stream, stt, telemetry, tokenize, tts, voice };
35
+ export { beta, cli, inference, ipc, llm, metrics, stream, stt, telemetry, tokenize, tts, voice };
35
36
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA;;;;;;GAMG;AACH,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,GAAG,MAAM,gBAAgB,CAAC;AACtC,OAAO,KAAK,GAAG,MAAM,gBAAgB,CAAC;AACtC,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAC5C,OAAO,KAAK,GAAG,MAAM,gBAAgB,CAAC;AACtC,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAC;AAChD,OAAO,KAAK,GAAG,MAAM,gBAAgB,CAAC;AACtC,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAE1C,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,sBAAsB,CAAC;AACrC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AACnF,cAAc,aAAa,CAAC;AAE5B,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA;;;;;;GAMG;AACH,OAAO,KAAK,IAAI,MAAM,iBAAiB,CAAC;AACxC,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,GAAG,MAAM,gBAAgB,CAAC;AACtC,OAAO,KAAK,GAAG,MAAM,gBAAgB,CAAC;AACtC,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAC5C,OAAO,KAAK,GAAG,MAAM,gBAAgB,CAAC;AACtC,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAC;AAChD,OAAO,KAAK,GAAG,MAAM,gBAAgB,CAAC;AACtC,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAE1C,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,sBAAsB,CAAC;AACrC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AACnF,cAAc,aAAa,CAAC;AAE5B,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC"}
package/dist/index.js CHANGED
@@ -1,3 +1,4 @@
1
+ import * as beta from "./beta/index.js";
1
2
  import * as cli from "./cli.js";
2
3
  import * as inference from "./inference/index.js";
3
4
  import * as ipc from "./ipc/index.js";
@@ -25,6 +26,7 @@ export * from "./version.js";
25
26
  import { createTimedString, isTimedString } from "./voice/io.js";
26
27
  export * from "./worker.js";
27
28
  export {
29
+ beta,
28
30
  cli,
29
31
  createTimedString,
30
32
  inference,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * LiveKit Agents is a framework for building realtime programmable participants that run on\n * servers.\n *\n * @see {@link https://docs.livekit.io/agents/overview | LiveKit Agents documentation}\n * @packageDocumentation\n */\nimport * as cli from './cli.js';\nimport * as inference from './inference/index.js';\nimport * as ipc from './ipc/index.js';\nimport * as llm from './llm/index.js';\nimport * as metrics from './metrics/index.js';\nimport * as stream from './stream/index.js';\nimport * as stt from './stt/index.js';\nimport * as telemetry from './telemetry/index.js';\nimport * as tokenize from './tokenize/index.js';\nimport * as tts from './tts/index.js';\nimport * as voice from './voice/index.js';\n\nexport * from './_exceptions.js';\nexport * from './audio.js';\nexport * from './connection_pool.js';\nexport * from './generator.js';\nexport * from './inference_runner.js';\nexport * from './job.js';\nexport * from './log.js';\nexport * from './plugin.js';\nexport * from './transcription.js';\nexport * from './types.js';\nexport * from './utils.js';\nexport * from './vad.js';\nexport * from './version.js';\nexport { createTimedString, isTimedString, type TimedString } from './voice/io.js';\nexport * from './worker.js';\n\nexport { cli, inference, ipc, llm, metrics, stream, stt, telemetry, tokenize, tts, voice };\n"],"mappings":"AAWA,YAAY,SAAS;AACrB,YAAY,eAAe;AAC3B,YAAY,SAAS;AACrB,YAAY,SAAS;AACrB,YAAY,aAAa;AACzB,YAAY,YAAY;AACxB,YAAY,SAAS;AACrB,YAAY,eAAe;AAC3B,YAAY,cAAc;AAC1B,YAAY,SAAS;AACrB,YAAY,WAAW;AAEvB,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,SAAS,mBAAmB,qBAAuC;AACnE,cAAc;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * LiveKit Agents is a framework for building realtime programmable participants that run on\n * servers.\n *\n * @see {@link https://docs.livekit.io/agents/overview | LiveKit Agents documentation}\n * @packageDocumentation\n */\nimport * as beta from './beta/index.js';\nimport * as cli from './cli.js';\nimport * as inference from './inference/index.js';\nimport * as ipc from './ipc/index.js';\nimport * as llm from './llm/index.js';\nimport * as metrics from './metrics/index.js';\nimport * as stream from './stream/index.js';\nimport * as stt from './stt/index.js';\nimport * as telemetry from './telemetry/index.js';\nimport * as tokenize from './tokenize/index.js';\nimport * as tts from './tts/index.js';\nimport * as voice from './voice/index.js';\n\nexport * from './_exceptions.js';\nexport * from './audio.js';\nexport * from './connection_pool.js';\nexport * from './generator.js';\nexport * from './inference_runner.js';\nexport * from './job.js';\nexport * from './log.js';\nexport * from './plugin.js';\nexport * from './transcription.js';\nexport * from './types.js';\nexport * from './utils.js';\nexport * from './vad.js';\nexport * from './version.js';\nexport { createTimedString, isTimedString, type TimedString } from './voice/io.js';\nexport * from './worker.js';\n\nexport { beta, cli, inference, ipc, llm, metrics, stream, stt, telemetry, tokenize, tts, voice };\n"],"mappings":"AAWA,YAAY,UAAU;AACtB,YAAY,SAAS;AACrB,YAAY,eAAe;AAC3B,YAAY,SAAS;AACrB,YAAY,SAAS;AACrB,YAAY,aAAa;AACzB,YAAY,YAAY;AACxB,YAAY,SAAS;AACrB,YAAY,eAAe;AAC3B,YAAY,cAAc;AAC1B,YAAY,SAAS;AACrB,YAAY,WAAW;AAEvB,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,SAAS,mBAAmB,qBAAuC;AACnE,cAAc;","names":[]}