@livekit/agents 1.0.45 → 1.0.47
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/cli.cjs +14 -20
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +14 -20
- package/dist/cli.js.map +1 -1
- package/dist/ipc/job_proc_lazy_main.cjs +14 -5
- package/dist/ipc/job_proc_lazy_main.cjs.map +1 -1
- package/dist/ipc/job_proc_lazy_main.js +14 -5
- package/dist/ipc/job_proc_lazy_main.js.map +1 -1
- package/dist/llm/chat_context.cjs +19 -0
- package/dist/llm/chat_context.cjs.map +1 -1
- package/dist/llm/chat_context.d.cts +4 -0
- package/dist/llm/chat_context.d.ts +4 -0
- package/dist/llm/chat_context.d.ts.map +1 -1
- package/dist/llm/chat_context.js +19 -0
- package/dist/llm/chat_context.js.map +1 -1
- package/dist/llm/provider_format/index.cjs +2 -0
- package/dist/llm/provider_format/index.cjs.map +1 -1
- package/dist/llm/provider_format/index.d.cts +1 -1
- package/dist/llm/provider_format/index.d.ts +1 -1
- package/dist/llm/provider_format/index.d.ts.map +1 -1
- package/dist/llm/provider_format/index.js +6 -1
- package/dist/llm/provider_format/index.js.map +1 -1
- package/dist/llm/provider_format/openai.cjs +82 -2
- package/dist/llm/provider_format/openai.cjs.map +1 -1
- package/dist/llm/provider_format/openai.d.cts +1 -0
- package/dist/llm/provider_format/openai.d.ts +1 -0
- package/dist/llm/provider_format/openai.d.ts.map +1 -1
- package/dist/llm/provider_format/openai.js +80 -1
- package/dist/llm/provider_format/openai.js.map +1 -1
- package/dist/llm/provider_format/openai.test.cjs +326 -0
- package/dist/llm/provider_format/openai.test.cjs.map +1 -1
- package/dist/llm/provider_format/openai.test.js +327 -1
- package/dist/llm/provider_format/openai.test.js.map +1 -1
- package/dist/llm/provider_format/utils.cjs +4 -3
- package/dist/llm/provider_format/utils.cjs.map +1 -1
- package/dist/llm/provider_format/utils.d.ts.map +1 -1
- package/dist/llm/provider_format/utils.js +4 -3
- package/dist/llm/provider_format/utils.js.map +1 -1
- package/dist/llm/realtime.cjs.map +1 -1
- package/dist/llm/realtime.d.cts +1 -0
- package/dist/llm/realtime.d.ts +1 -0
- package/dist/llm/realtime.d.ts.map +1 -1
- package/dist/llm/realtime.js.map +1 -1
- package/dist/log.cjs +5 -2
- package/dist/log.cjs.map +1 -1
- package/dist/log.d.ts.map +1 -1
- package/dist/log.js +5 -2
- package/dist/log.js.map +1 -1
- package/dist/stream/deferred_stream.cjs +15 -6
- package/dist/stream/deferred_stream.cjs.map +1 -1
- package/dist/stream/deferred_stream.d.ts.map +1 -1
- package/dist/stream/deferred_stream.js +15 -6
- package/dist/stream/deferred_stream.js.map +1 -1
- package/dist/stream/index.cjs +3 -0
- package/dist/stream/index.cjs.map +1 -1
- package/dist/stream/index.d.cts +1 -0
- package/dist/stream/index.d.ts +1 -0
- package/dist/stream/index.d.ts.map +1 -1
- package/dist/stream/index.js +2 -0
- package/dist/stream/index.js.map +1 -1
- package/dist/stream/multi_input_stream.cjs +139 -0
- package/dist/stream/multi_input_stream.cjs.map +1 -0
- package/dist/stream/multi_input_stream.d.cts +55 -0
- package/dist/stream/multi_input_stream.d.ts +55 -0
- package/dist/stream/multi_input_stream.d.ts.map +1 -0
- package/dist/stream/multi_input_stream.js +115 -0
- package/dist/stream/multi_input_stream.js.map +1 -0
- package/dist/stream/multi_input_stream.test.cjs +340 -0
- package/dist/stream/multi_input_stream.test.cjs.map +1 -0
- package/dist/stream/multi_input_stream.test.js +339 -0
- package/dist/stream/multi_input_stream.test.js.map +1 -0
- package/dist/telemetry/trace_types.cjs +42 -0
- package/dist/telemetry/trace_types.cjs.map +1 -1
- package/dist/telemetry/trace_types.d.cts +14 -0
- package/dist/telemetry/trace_types.d.ts +14 -0
- package/dist/telemetry/trace_types.d.ts.map +1 -1
- package/dist/telemetry/trace_types.js +28 -0
- package/dist/telemetry/trace_types.js.map +1 -1
- package/dist/utils.cjs +44 -2
- package/dist/utils.cjs.map +1 -1
- package/dist/utils.d.cts +8 -0
- package/dist/utils.d.ts +8 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +44 -2
- package/dist/utils.js.map +1 -1
- package/dist/utils.test.cjs +71 -0
- package/dist/utils.test.cjs.map +1 -1
- package/dist/utils.test.js +71 -0
- package/dist/utils.test.js.map +1 -1
- package/dist/version.cjs +1 -1
- package/dist/version.cjs.map +1 -1
- package/dist/version.d.cts +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/dist/voice/agent.cjs +144 -12
- package/dist/voice/agent.cjs.map +1 -1
- package/dist/voice/agent.d.cts +29 -4
- package/dist/voice/agent.d.ts +29 -4
- package/dist/voice/agent.d.ts.map +1 -1
- package/dist/voice/agent.js +140 -11
- package/dist/voice/agent.js.map +1 -1
- package/dist/voice/agent.test.cjs +120 -0
- package/dist/voice/agent.test.cjs.map +1 -1
- package/dist/voice/agent.test.js +122 -2
- package/dist/voice/agent.test.js.map +1 -1
- package/dist/voice/agent_activity.cjs +402 -292
- package/dist/voice/agent_activity.cjs.map +1 -1
- package/dist/voice/agent_activity.d.cts +35 -7
- package/dist/voice/agent_activity.d.ts +35 -7
- package/dist/voice/agent_activity.d.ts.map +1 -1
- package/dist/voice/agent_activity.js +402 -287
- package/dist/voice/agent_activity.js.map +1 -1
- package/dist/voice/agent_session.cjs +156 -44
- package/dist/voice/agent_session.cjs.map +1 -1
- package/dist/voice/agent_session.d.cts +22 -9
- package/dist/voice/agent_session.d.ts +22 -9
- package/dist/voice/agent_session.d.ts.map +1 -1
- package/dist/voice/agent_session.js +156 -44
- package/dist/voice/agent_session.js.map +1 -1
- package/dist/voice/audio_recognition.cjs +89 -36
- package/dist/voice/audio_recognition.cjs.map +1 -1
- package/dist/voice/audio_recognition.d.cts +22 -1
- package/dist/voice/audio_recognition.d.ts +22 -1
- package/dist/voice/audio_recognition.d.ts.map +1 -1
- package/dist/voice/audio_recognition.js +93 -36
- package/dist/voice/audio_recognition.js.map +1 -1
- package/dist/voice/audio_recognition_span.test.cjs +233 -0
- package/dist/voice/audio_recognition_span.test.cjs.map +1 -0
- package/dist/voice/audio_recognition_span.test.js +232 -0
- package/dist/voice/audio_recognition_span.test.js.map +1 -0
- package/dist/voice/generation.cjs +39 -19
- package/dist/voice/generation.cjs.map +1 -1
- package/dist/voice/generation.d.ts.map +1 -1
- package/dist/voice/generation.js +44 -20
- package/dist/voice/generation.js.map +1 -1
- package/dist/voice/index.cjs +2 -0
- package/dist/voice/index.cjs.map +1 -1
- package/dist/voice/index.d.cts +1 -1
- package/dist/voice/index.d.ts +1 -1
- package/dist/voice/index.d.ts.map +1 -1
- package/dist/voice/index.js +2 -1
- package/dist/voice/index.js.map +1 -1
- package/dist/voice/io.cjs +6 -3
- package/dist/voice/io.cjs.map +1 -1
- package/dist/voice/io.d.cts +3 -2
- package/dist/voice/io.d.ts +3 -2
- package/dist/voice/io.d.ts.map +1 -1
- package/dist/voice/io.js +6 -3
- package/dist/voice/io.js.map +1 -1
- package/dist/voice/recorder_io/recorder_io.cjs +3 -1
- package/dist/voice/recorder_io/recorder_io.cjs.map +1 -1
- package/dist/voice/recorder_io/recorder_io.d.ts.map +1 -1
- package/dist/voice/recorder_io/recorder_io.js +3 -1
- package/dist/voice/recorder_io/recorder_io.js.map +1 -1
- package/dist/voice/room_io/_input.cjs +17 -17
- package/dist/voice/room_io/_input.cjs.map +1 -1
- package/dist/voice/room_io/_input.d.cts +2 -2
- package/dist/voice/room_io/_input.d.ts +2 -2
- package/dist/voice/room_io/_input.d.ts.map +1 -1
- package/dist/voice/room_io/_input.js +7 -6
- package/dist/voice/room_io/_input.js.map +1 -1
- package/dist/voice/room_io/room_io.cjs +9 -0
- package/dist/voice/room_io/room_io.cjs.map +1 -1
- package/dist/voice/room_io/room_io.d.cts +3 -1
- package/dist/voice/room_io/room_io.d.ts +3 -1
- package/dist/voice/room_io/room_io.d.ts.map +1 -1
- package/dist/voice/room_io/room_io.js +9 -0
- package/dist/voice/room_io/room_io.js.map +1 -1
- package/dist/voice/speech_handle.cjs +7 -1
- package/dist/voice/speech_handle.cjs.map +1 -1
- package/dist/voice/speech_handle.d.cts +2 -0
- package/dist/voice/speech_handle.d.ts +2 -0
- package/dist/voice/speech_handle.d.ts.map +1 -1
- package/dist/voice/speech_handle.js +8 -2
- package/dist/voice/speech_handle.js.map +1 -1
- package/dist/voice/testing/run_result.cjs +66 -15
- package/dist/voice/testing/run_result.cjs.map +1 -1
- package/dist/voice/testing/run_result.d.cts +14 -3
- package/dist/voice/testing/run_result.d.ts +14 -3
- package/dist/voice/testing/run_result.d.ts.map +1 -1
- package/dist/voice/testing/run_result.js +66 -15
- package/dist/voice/testing/run_result.js.map +1 -1
- package/dist/voice/utils.cjs +47 -0
- package/dist/voice/utils.cjs.map +1 -0
- package/dist/voice/utils.d.cts +4 -0
- package/dist/voice/utils.d.ts +4 -0
- package/dist/voice/utils.d.ts.map +1 -0
- package/dist/voice/utils.js +23 -0
- package/dist/voice/utils.js.map +1 -0
- package/package.json +1 -1
- package/src/cli.ts +20 -33
- package/src/ipc/job_proc_lazy_main.ts +16 -5
- package/src/llm/chat_context.ts +35 -0
- package/src/llm/provider_format/index.ts +7 -2
- package/src/llm/provider_format/openai.test.ts +385 -1
- package/src/llm/provider_format/openai.ts +103 -0
- package/src/llm/provider_format/utils.ts +6 -4
- package/src/llm/realtime.ts +1 -0
- package/src/log.ts +5 -2
- package/src/stream/deferred_stream.ts +17 -6
- package/src/stream/index.ts +1 -0
- package/src/stream/multi_input_stream.test.ts +540 -0
- package/src/stream/multi_input_stream.ts +172 -0
- package/src/telemetry/trace_types.ts +18 -0
- package/src/utils.test.ts +87 -0
- package/src/utils.ts +52 -2
- package/src/version.ts +1 -1
- package/src/voice/agent.test.ts +140 -2
- package/src/voice/agent.ts +189 -10
- package/src/voice/agent_activity.ts +449 -286
- package/src/voice/agent_session.ts +195 -51
- package/src/voice/audio_recognition.ts +118 -38
- package/src/voice/audio_recognition_span.test.ts +261 -0
- package/src/voice/generation.ts +52 -23
- package/src/voice/index.ts +1 -1
- package/src/voice/io.ts +7 -4
- package/src/voice/recorder_io/recorder_io.ts +2 -1
- package/src/voice/room_io/_input.ts +11 -7
- package/src/voice/room_io/room_io.ts +12 -0
- package/src/voice/speech_handle.ts +9 -2
- package/src/voice/testing/run_result.ts +81 -23
- package/src/voice/utils.ts +29 -0
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
import { ReadableStream } from "node:stream/web";
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
import { delay } from "../utils.js";
|
|
4
|
+
import { MultiInputStream } from "./multi_input_stream.js";
|
|
5
|
+
function streamFrom(values) {
|
|
6
|
+
return new ReadableStream({
|
|
7
|
+
start(controller) {
|
|
8
|
+
for (const v of values) controller.enqueue(v);
|
|
9
|
+
controller.close();
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
describe("MultiInputStream", () => {
|
|
14
|
+
it("should create a readable output stream", () => {
|
|
15
|
+
const multi = new MultiInputStream();
|
|
16
|
+
expect(multi.stream).toBeInstanceOf(ReadableStream);
|
|
17
|
+
expect(multi.inputCount).toBe(0);
|
|
18
|
+
expect(multi.isClosed).toBe(false);
|
|
19
|
+
});
|
|
20
|
+
it("should read data from a single input stream", async () => {
|
|
21
|
+
const multi = new MultiInputStream();
|
|
22
|
+
const reader = multi.stream.getReader();
|
|
23
|
+
multi.addInputStream(streamFrom(["a", "b", "c"]));
|
|
24
|
+
const results = [];
|
|
25
|
+
for (let i = 0; i < 3; i++) {
|
|
26
|
+
const { value } = await reader.read();
|
|
27
|
+
results.push(value);
|
|
28
|
+
}
|
|
29
|
+
expect(results).toEqual(["a", "b", "c"]);
|
|
30
|
+
reader.releaseLock();
|
|
31
|
+
await multi.close();
|
|
32
|
+
});
|
|
33
|
+
it("should merge data from multiple input streams", async () => {
|
|
34
|
+
const multi = new MultiInputStream();
|
|
35
|
+
const reader = multi.stream.getReader();
|
|
36
|
+
multi.addInputStream(streamFrom([1, 2]));
|
|
37
|
+
multi.addInputStream(streamFrom([3, 4]));
|
|
38
|
+
const results = [];
|
|
39
|
+
for (let i = 0; i < 4; i++) {
|
|
40
|
+
const { value } = await reader.read();
|
|
41
|
+
results.push(value);
|
|
42
|
+
}
|
|
43
|
+
expect(results.sort()).toEqual([1, 2, 3, 4]);
|
|
44
|
+
reader.releaseLock();
|
|
45
|
+
await multi.close();
|
|
46
|
+
});
|
|
47
|
+
it("should allow adding inputs dynamically while reading", async () => {
|
|
48
|
+
const multi = new MultiInputStream();
|
|
49
|
+
const reader = multi.stream.getReader();
|
|
50
|
+
multi.addInputStream(streamFrom(["first"]));
|
|
51
|
+
const r1 = await reader.read();
|
|
52
|
+
expect(r1.value).toBe("first");
|
|
53
|
+
multi.addInputStream(streamFrom(["second"]));
|
|
54
|
+
const r2 = await reader.read();
|
|
55
|
+
expect(r2.value).toBe("second");
|
|
56
|
+
reader.releaseLock();
|
|
57
|
+
await multi.close();
|
|
58
|
+
});
|
|
59
|
+
it("should continue reading from remaining inputs after removing one", async () => {
|
|
60
|
+
const multi = new MultiInputStream();
|
|
61
|
+
const reader = multi.stream.getReader();
|
|
62
|
+
const slowSource = new ReadableStream({
|
|
63
|
+
async start(controller) {
|
|
64
|
+
controller.enqueue("slow-1");
|
|
65
|
+
await delay(50);
|
|
66
|
+
controller.enqueue("slow-2");
|
|
67
|
+
await delay(50);
|
|
68
|
+
controller.enqueue("slow-3");
|
|
69
|
+
controller.close();
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
const slowId = multi.addInputStream(slowSource);
|
|
73
|
+
const r1 = await reader.read();
|
|
74
|
+
expect(r1.value).toBe("slow-1");
|
|
75
|
+
await multi.removeInputStream(slowId);
|
|
76
|
+
multi.addInputStream(streamFrom(["fast-1", "fast-2"]));
|
|
77
|
+
const r2 = await reader.read();
|
|
78
|
+
expect(r2.value).toBe("fast-1");
|
|
79
|
+
const r3 = await reader.read();
|
|
80
|
+
expect(r3.value).toBe("fast-2");
|
|
81
|
+
reader.releaseLock();
|
|
82
|
+
await multi.close();
|
|
83
|
+
});
|
|
84
|
+
it("should handle swapping inputs (remove then add)", async () => {
|
|
85
|
+
const multi = new MultiInputStream();
|
|
86
|
+
const reader = multi.stream.getReader();
|
|
87
|
+
const id1 = multi.addInputStream(streamFrom(["from-A"]));
|
|
88
|
+
const r1 = await reader.read();
|
|
89
|
+
expect(r1.value).toBe("from-A");
|
|
90
|
+
await multi.removeInputStream(id1);
|
|
91
|
+
const id2 = multi.addInputStream(streamFrom(["from-B"]));
|
|
92
|
+
const r2 = await reader.read();
|
|
93
|
+
expect(r2.value).toBe("from-B");
|
|
94
|
+
await multi.removeInputStream(id2);
|
|
95
|
+
reader.releaseLock();
|
|
96
|
+
await multi.close();
|
|
97
|
+
});
|
|
98
|
+
it("should keep reader awaiting until an input is added", async () => {
|
|
99
|
+
const multi = new MultiInputStream();
|
|
100
|
+
const reader = multi.stream.getReader();
|
|
101
|
+
let readCompleted = false;
|
|
102
|
+
const readPromise = reader.read().then((result2) => {
|
|
103
|
+
readCompleted = true;
|
|
104
|
+
return result2;
|
|
105
|
+
});
|
|
106
|
+
await delay(50);
|
|
107
|
+
expect(readCompleted).toBe(false);
|
|
108
|
+
multi.addInputStream(streamFrom(["hello"]));
|
|
109
|
+
const result = await readPromise;
|
|
110
|
+
expect(readCompleted).toBe(true);
|
|
111
|
+
expect(result.value).toBe("hello");
|
|
112
|
+
reader.releaseLock();
|
|
113
|
+
await multi.close();
|
|
114
|
+
});
|
|
115
|
+
it("should handle empty input streams without closing the output", async () => {
|
|
116
|
+
const multi = new MultiInputStream();
|
|
117
|
+
const reader = multi.stream.getReader();
|
|
118
|
+
multi.addInputStream(streamFrom([]));
|
|
119
|
+
await delay(20);
|
|
120
|
+
multi.addInputStream(streamFrom(["data"]));
|
|
121
|
+
const result = await reader.read();
|
|
122
|
+
expect(result.value).toBe("data");
|
|
123
|
+
reader.releaseLock();
|
|
124
|
+
await multi.close();
|
|
125
|
+
});
|
|
126
|
+
it("should remove errored input without killing the output", async () => {
|
|
127
|
+
const multi = new MultiInputStream();
|
|
128
|
+
const reader = multi.stream.getReader();
|
|
129
|
+
const errorSource = new ReadableStream({
|
|
130
|
+
async start(controller) {
|
|
131
|
+
controller.enqueue("before-error");
|
|
132
|
+
await delay(20);
|
|
133
|
+
controller.error(new Error("boom"));
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
multi.addInputStream(errorSource);
|
|
137
|
+
const r1 = await reader.read();
|
|
138
|
+
expect(r1.value).toBe("before-error");
|
|
139
|
+
await delay(50);
|
|
140
|
+
expect(multi.inputCount).toBe(0);
|
|
141
|
+
multi.addInputStream(streamFrom(["after-error"]));
|
|
142
|
+
const r2 = await reader.read();
|
|
143
|
+
expect(r2.value).toBe("after-error");
|
|
144
|
+
reader.releaseLock();
|
|
145
|
+
await multi.close();
|
|
146
|
+
});
|
|
147
|
+
it("should keep other inputs alive when one errors", async () => {
|
|
148
|
+
const multi = new MultiInputStream();
|
|
149
|
+
const reader = multi.stream.getReader();
|
|
150
|
+
const goodSource = new ReadableStream({
|
|
151
|
+
async start(controller) {
|
|
152
|
+
await delay(60);
|
|
153
|
+
controller.enqueue("good");
|
|
154
|
+
controller.close();
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
const badSource = new ReadableStream({
|
|
158
|
+
async start(controller) {
|
|
159
|
+
controller.error(new Error("bad"));
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
multi.addInputStream(goodSource);
|
|
163
|
+
multi.addInputStream(badSource);
|
|
164
|
+
await delay(10);
|
|
165
|
+
const result = await reader.read();
|
|
166
|
+
expect(result.value).toBe("good");
|
|
167
|
+
reader.releaseLock();
|
|
168
|
+
await multi.close();
|
|
169
|
+
});
|
|
170
|
+
it("should end the output stream with done:true when close is called", async () => {
|
|
171
|
+
const multi = new MultiInputStream();
|
|
172
|
+
const reader = multi.stream.getReader();
|
|
173
|
+
multi.addInputStream(streamFrom(["data"]));
|
|
174
|
+
const r1 = await reader.read();
|
|
175
|
+
expect(r1.value).toBe("data");
|
|
176
|
+
await multi.close();
|
|
177
|
+
const r2 = await reader.read();
|
|
178
|
+
expect(r2.done).toBe(true);
|
|
179
|
+
expect(r2.value).toBeUndefined();
|
|
180
|
+
reader.releaseLock();
|
|
181
|
+
});
|
|
182
|
+
it("should resolve pending reads as done when close is called", async () => {
|
|
183
|
+
const multi = new MultiInputStream();
|
|
184
|
+
const reader = multi.stream.getReader();
|
|
185
|
+
const readPromise = reader.read();
|
|
186
|
+
await delay(10);
|
|
187
|
+
await multi.close();
|
|
188
|
+
const result = await readPromise;
|
|
189
|
+
expect(result.done).toBe(true);
|
|
190
|
+
expect(result.value).toBeUndefined();
|
|
191
|
+
reader.releaseLock();
|
|
192
|
+
});
|
|
193
|
+
it("should be idempotent for multiple close calls", async () => {
|
|
194
|
+
const multi = new MultiInputStream();
|
|
195
|
+
await multi.close();
|
|
196
|
+
await multi.close();
|
|
197
|
+
expect(multi.isClosed).toBe(true);
|
|
198
|
+
});
|
|
199
|
+
it("should throw when adding input after close", async () => {
|
|
200
|
+
const multi = new MultiInputStream();
|
|
201
|
+
await multi.close();
|
|
202
|
+
expect(() => multi.addInputStream(streamFrom(["x"]))).toThrow("MultiInputStream is closed");
|
|
203
|
+
});
|
|
204
|
+
it("should no-op when removing a non-existent input", async () => {
|
|
205
|
+
const multi = new MultiInputStream();
|
|
206
|
+
await multi.removeInputStream("does-not-exist");
|
|
207
|
+
await multi.close();
|
|
208
|
+
});
|
|
209
|
+
it("should release the source reader lock so the source can be reused", async () => {
|
|
210
|
+
const multi = new MultiInputStream();
|
|
211
|
+
const reader = multi.stream.getReader();
|
|
212
|
+
const source = new ReadableStream({
|
|
213
|
+
async start(controller) {
|
|
214
|
+
controller.enqueue("chunk-0");
|
|
215
|
+
await delay(30);
|
|
216
|
+
controller.enqueue("chunk-1");
|
|
217
|
+
controller.close();
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
const id = multi.addInputStream(source);
|
|
221
|
+
const r1 = await reader.read();
|
|
222
|
+
expect(r1.value).toBe("chunk-0");
|
|
223
|
+
await multi.removeInputStream(id);
|
|
224
|
+
const sourceReader = source.getReader();
|
|
225
|
+
const sr = await sourceReader.read();
|
|
226
|
+
expect(sr.value).toBe("chunk-1");
|
|
227
|
+
sourceReader.releaseLock();
|
|
228
|
+
reader.releaseLock();
|
|
229
|
+
await multi.close();
|
|
230
|
+
});
|
|
231
|
+
it("should track inputCount correctly through add / remove / natural end", async () => {
|
|
232
|
+
const multi = new MultiInputStream();
|
|
233
|
+
expect(multi.inputCount).toBe(0);
|
|
234
|
+
const id1 = multi.addInputStream(streamFrom(["a"]));
|
|
235
|
+
const id2 = multi.addInputStream(streamFrom(["b"]));
|
|
236
|
+
expect(multi.inputCount).toBe(2);
|
|
237
|
+
await multi.removeInputStream(id1);
|
|
238
|
+
expect(multi.inputCount).toBeLessThanOrEqual(1);
|
|
239
|
+
await delay(20);
|
|
240
|
+
expect(multi.inputCount).toBe(0);
|
|
241
|
+
await multi.removeInputStream(id2);
|
|
242
|
+
expect(multi.inputCount).toBe(0);
|
|
243
|
+
await multi.close();
|
|
244
|
+
});
|
|
245
|
+
it("should handle concurrent reads and slow writes", async () => {
|
|
246
|
+
const multi = new MultiInputStream();
|
|
247
|
+
const reader = multi.stream.getReader();
|
|
248
|
+
const chunks = ["a", "b", "c", "d", "e"];
|
|
249
|
+
let idx = 0;
|
|
250
|
+
const source = new ReadableStream({
|
|
251
|
+
start(controller) {
|
|
252
|
+
const writeNext = () => {
|
|
253
|
+
if (idx < chunks.length) {
|
|
254
|
+
controller.enqueue(chunks[idx++]);
|
|
255
|
+
setTimeout(writeNext, 5);
|
|
256
|
+
} else {
|
|
257
|
+
controller.close();
|
|
258
|
+
}
|
|
259
|
+
};
|
|
260
|
+
writeNext();
|
|
261
|
+
}
|
|
262
|
+
});
|
|
263
|
+
multi.addInputStream(source);
|
|
264
|
+
const results = [];
|
|
265
|
+
for (let i = 0; i < chunks.length; i++) {
|
|
266
|
+
const { value } = await reader.read();
|
|
267
|
+
results.push(value);
|
|
268
|
+
}
|
|
269
|
+
expect(results).toEqual(chunks);
|
|
270
|
+
reader.releaseLock();
|
|
271
|
+
await multi.close();
|
|
272
|
+
});
|
|
273
|
+
it("should handle backpressure with large data", async () => {
|
|
274
|
+
const multi = new MultiInputStream();
|
|
275
|
+
const largeChunks = Array.from({ length: 1e3 }, (_, i) => `chunk-${i}`);
|
|
276
|
+
multi.addInputStream(streamFrom(largeChunks));
|
|
277
|
+
const reader = multi.stream.getReader();
|
|
278
|
+
const results = [];
|
|
279
|
+
let result = await reader.read();
|
|
280
|
+
while (!result.done) {
|
|
281
|
+
results.push(result.value);
|
|
282
|
+
if (results.length === largeChunks.length) break;
|
|
283
|
+
result = await reader.read();
|
|
284
|
+
}
|
|
285
|
+
expect(results).toEqual(largeChunks);
|
|
286
|
+
reader.releaseLock();
|
|
287
|
+
await multi.close();
|
|
288
|
+
});
|
|
289
|
+
it("should support tee on the output stream", async () => {
|
|
290
|
+
const multi = new MultiInputStream();
|
|
291
|
+
const [s1, s2] = multi.stream.tee();
|
|
292
|
+
const r1 = s1.getReader();
|
|
293
|
+
const r2 = s2.getReader();
|
|
294
|
+
multi.addInputStream(streamFrom([10, 20]));
|
|
295
|
+
const [a1, a2] = await Promise.all([r1.read(), r2.read()]);
|
|
296
|
+
expect(a1.value).toBe(10);
|
|
297
|
+
expect(a2.value).toBe(10);
|
|
298
|
+
const [b1, b2] = await Promise.all([r1.read(), r2.read()]);
|
|
299
|
+
expect(b1.value).toBe(20);
|
|
300
|
+
expect(b2.value).toBe(20);
|
|
301
|
+
r1.releaseLock();
|
|
302
|
+
r2.releaseLock();
|
|
303
|
+
await multi.close();
|
|
304
|
+
});
|
|
305
|
+
it("should return unique IDs from addInputStream", () => {
|
|
306
|
+
const multi = new MultiInputStream();
|
|
307
|
+
const id1 = multi.addInputStream(streamFrom(["a"]));
|
|
308
|
+
const id2 = multi.addInputStream(streamFrom(["b"]));
|
|
309
|
+
const id3 = multi.addInputStream(streamFrom(["c"]));
|
|
310
|
+
expect(id1).not.toBe(id2);
|
|
311
|
+
expect(id2).not.toBe(id3);
|
|
312
|
+
expect(id1).not.toBe(id3);
|
|
313
|
+
});
|
|
314
|
+
it("should cleanly close while pumps are actively writing", async () => {
|
|
315
|
+
const multi = new MultiInputStream();
|
|
316
|
+
const reader = multi.stream.getReader();
|
|
317
|
+
const infiniteSource = new ReadableStream({
|
|
318
|
+
async start(controller) {
|
|
319
|
+
let i = 0;
|
|
320
|
+
while (true) {
|
|
321
|
+
try {
|
|
322
|
+
controller.enqueue(`tick-${i++}`);
|
|
323
|
+
} catch {
|
|
324
|
+
break;
|
|
325
|
+
}
|
|
326
|
+
await delay(5);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
});
|
|
330
|
+
multi.addInputStream(infiniteSource);
|
|
331
|
+
const r1 = await reader.read();
|
|
332
|
+
expect(r1.done).toBe(false);
|
|
333
|
+
await multi.close();
|
|
334
|
+
const r2 = await reader.read();
|
|
335
|
+
expect(r2.done).toBe(true);
|
|
336
|
+
reader.releaseLock();
|
|
337
|
+
});
|
|
338
|
+
});
|
|
339
|
+
//# sourceMappingURL=multi_input_stream.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/stream/multi_input_stream.test.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { ReadableStream } from 'node:stream/web';\nimport { describe, expect, it } from 'vitest';\nimport { delay } from '../utils.js';\nimport { MultiInputStream } from './multi_input_stream.js';\n\nfunction streamFrom<T>(values: T[]): ReadableStream<T> {\n return new ReadableStream<T>({\n start(controller) {\n for (const v of values) controller.enqueue(v);\n controller.close();\n },\n });\n}\n\ndescribe('MultiInputStream', () => {\n // ---------------------------------------------------------------------------\n // Basic functionality\n // ---------------------------------------------------------------------------\n\n it('should create a readable output stream', () => {\n const multi = new MultiInputStream<string>();\n expect(multi.stream).toBeInstanceOf(ReadableStream);\n expect(multi.inputCount).toBe(0);\n expect(multi.isClosed).toBe(false);\n });\n\n it('should read data from a single input stream', async () => {\n const multi = new MultiInputStream<string>();\n const reader = multi.stream.getReader();\n\n multi.addInputStream(streamFrom(['a', 'b', 'c']));\n\n const results: string[] = [];\n // Read three values then close manually (output stays open after input ends).\n for (let i = 0; i < 3; i++) {\n const { value } = await reader.read();\n results.push(value!);\n }\n\n expect(results).toEqual(['a', 'b', 'c']);\n reader.releaseLock();\n await multi.close();\n });\n\n it('should merge data from multiple input streams', async () => {\n const multi = new MultiInputStream<number>();\n const reader = multi.stream.getReader();\n\n multi.addInputStream(streamFrom([1, 2]));\n multi.addInputStream(streamFrom([3, 4]));\n\n const results: number[] = [];\n for (let i = 0; i < 4; i++) {\n const { value } = await reader.read();\n results.push(value!);\n }\n\n // Order is non-deterministic but all values must arrive.\n expect(results.sort()).toEqual([1, 2, 3, 4]);\n reader.releaseLock();\n await multi.close();\n });\n\n // ---------------------------------------------------------------------------\n // Dynamic add / remove\n // ---------------------------------------------------------------------------\n\n it('should allow adding inputs dynamically while reading', async () => {\n const multi = new MultiInputStream<string>();\n const reader = multi.stream.getReader();\n\n multi.addInputStream(streamFrom(['first']));\n\n const r1 = await reader.read();\n expect(r1.value).toBe('first');\n\n // Add a second input after reading from the first.\n multi.addInputStream(streamFrom(['second']));\n\n const r2 = await reader.read();\n expect(r2.value).toBe('second');\n\n reader.releaseLock();\n await multi.close();\n });\n\n it('should continue reading from remaining inputs after removing one', async () => {\n const multi = new MultiInputStream<string>();\n const reader = multi.stream.getReader();\n\n // A slow stream that emits over time.\n const slowSource = new ReadableStream<string>({\n async start(controller) {\n controller.enqueue('slow-1');\n await delay(50);\n controller.enqueue('slow-2');\n await delay(50);\n controller.enqueue('slow-3');\n controller.close();\n },\n });\n\n const slowId = multi.addInputStream(slowSource);\n\n // Read first value from slow source.\n const r1 = await reader.read();\n expect(r1.value).toBe('slow-1');\n\n // Remove the slow source and add a fast one.\n await multi.removeInputStream(slowId);\n\n multi.addInputStream(streamFrom(['fast-1', 'fast-2']));\n\n const r2 = await reader.read();\n expect(r2.value).toBe('fast-1');\n\n const r3 = await reader.read();\n expect(r3.value).toBe('fast-2');\n\n reader.releaseLock();\n await multi.close();\n });\n\n it('should handle swapping inputs (remove then add)', async () => {\n const multi = new MultiInputStream<string>();\n const reader = multi.stream.getReader();\n\n const id1 = multi.addInputStream(streamFrom(['from-A']));\n\n const r1 = await reader.read();\n expect(r1.value).toBe('from-A');\n\n await multi.removeInputStream(id1);\n\n const id2 = multi.addInputStream(streamFrom(['from-B']));\n\n const r2 = await reader.read();\n expect(r2.value).toBe('from-B');\n\n await multi.removeInputStream(id2);\n reader.releaseLock();\n await multi.close();\n });\n\n // ---------------------------------------------------------------------------\n // Reading before any input is added\n // ---------------------------------------------------------------------------\n\n it('should keep reader awaiting until an input is added', async () => {\n const multi = new MultiInputStream<string>();\n const reader = multi.stream.getReader();\n\n let readCompleted = false;\n const readPromise = reader.read().then((result) => {\n readCompleted = true;\n return result;\n });\n\n await delay(50);\n expect(readCompleted).toBe(false);\n\n // Now add an input to unblock the read.\n multi.addInputStream(streamFrom(['hello']));\n\n const result = await readPromise;\n expect(readCompleted).toBe(true);\n expect(result.value).toBe('hello');\n\n reader.releaseLock();\n await multi.close();\n });\n\n // ---------------------------------------------------------------------------\n // Empty input streams\n // ---------------------------------------------------------------------------\n\n it('should handle empty input streams without closing the output', async () => {\n const multi = new MultiInputStream<string>();\n const reader = multi.stream.getReader();\n\n // Add an empty stream — it should end immediately without affecting the output.\n multi.addInputStream(streamFrom([]));\n\n await delay(20);\n\n // The output should still be open. Adding a real input should work.\n multi.addInputStream(streamFrom(['data']));\n\n const result = await reader.read();\n expect(result.value).toBe('data');\n\n reader.releaseLock();\n await multi.close();\n });\n\n // ---------------------------------------------------------------------------\n // Error handling\n // ---------------------------------------------------------------------------\n\n it('should remove errored input without killing the output', async () => {\n const multi = new MultiInputStream<string>();\n const reader = multi.stream.getReader();\n\n // An input that errors after emitting one value.\n const errorSource = new ReadableStream<string>({\n async start(controller) {\n controller.enqueue('before-error');\n await delay(20);\n controller.error(new Error('boom'));\n },\n });\n\n multi.addInputStream(errorSource);\n\n const r1 = await reader.read();\n expect(r1.value).toBe('before-error');\n\n // Wait for the error to propagate and the input to be removed.\n await delay(50);\n\n expect(multi.inputCount).toBe(0);\n\n // The output is still alive — we can add another input.\n multi.addInputStream(streamFrom(['after-error']));\n\n const r2 = await reader.read();\n expect(r2.value).toBe('after-error');\n\n reader.releaseLock();\n await multi.close();\n });\n\n it('should keep other inputs alive when one errors', async () => {\n const multi = new MultiInputStream<string>();\n const reader = multi.stream.getReader();\n\n const goodSource = new ReadableStream<string>({\n async start(controller) {\n await delay(60);\n controller.enqueue('good');\n controller.close();\n },\n });\n\n const badSource = new ReadableStream<string>({\n async start(controller) {\n controller.error(new Error('bad'));\n },\n });\n\n multi.addInputStream(goodSource);\n multi.addInputStream(badSource);\n\n // Wait a bit for the bad source to error and be removed.\n await delay(10);\n\n // The good source should still be pumping.\n const result = await reader.read();\n expect(result.value).toBe('good');\n\n reader.releaseLock();\n await multi.close();\n });\n\n // ---------------------------------------------------------------------------\n // Close semantics\n // ---------------------------------------------------------------------------\n\n it('should end the output stream with done:true when close is called', async () => {\n const multi = new MultiInputStream<string>();\n const reader = multi.stream.getReader();\n\n multi.addInputStream(streamFrom(['data']));\n\n const r1 = await reader.read();\n expect(r1.value).toBe('data');\n\n await multi.close();\n\n const r2 = await reader.read();\n expect(r2.done).toBe(true);\n expect(r2.value).toBeUndefined();\n\n reader.releaseLock();\n });\n\n it('should resolve pending reads as done when close is called', async () => {\n const multi = new MultiInputStream<string>();\n const reader = multi.stream.getReader();\n\n // No inputs — read will be pending.\n const readPromise = reader.read();\n\n await delay(10);\n await multi.close();\n\n const result = await readPromise;\n expect(result.done).toBe(true);\n expect(result.value).toBeUndefined();\n\n reader.releaseLock();\n });\n\n it('should be idempotent for multiple close calls', async () => {\n const multi = new MultiInputStream<string>();\n\n await multi.close();\n await multi.close();\n\n expect(multi.isClosed).toBe(true);\n });\n\n it('should throw when adding input after close', async () => {\n const multi = new MultiInputStream<string>();\n await multi.close();\n\n expect(() => multi.addInputStream(streamFrom(['x']))).toThrow('MultiInputStream is closed');\n });\n\n // ---------------------------------------------------------------------------\n // removeInputStream edge cases\n // ---------------------------------------------------------------------------\n\n it('should no-op when removing a non-existent input', async () => {\n const multi = new MultiInputStream<string>();\n\n // Should not throw.\n await multi.removeInputStream('does-not-exist');\n\n await multi.close();\n });\n\n it('should release the source reader lock so the source can be reused', async () => {\n const multi = new MultiInputStream<string>();\n const reader = multi.stream.getReader();\n\n const source = new ReadableStream<string>({\n async start(controller) {\n controller.enqueue('chunk-0');\n await delay(30);\n controller.enqueue('chunk-1');\n controller.close();\n },\n });\n\n const id = multi.addInputStream(source);\n\n const r1 = await reader.read();\n expect(r1.value).toBe('chunk-0');\n\n await multi.removeInputStream(id);\n\n // The source's reader lock should be released — we can get a new reader.\n const sourceReader = source.getReader();\n const sr = await sourceReader.read();\n expect(sr.value).toBe('chunk-1');\n sourceReader.releaseLock();\n\n reader.releaseLock();\n await multi.close();\n });\n\n // ---------------------------------------------------------------------------\n // Input count tracking\n // ---------------------------------------------------------------------------\n\n it('should track inputCount correctly through add / remove / natural end', async () => {\n const multi = new MultiInputStream<string>();\n\n expect(multi.inputCount).toBe(0);\n\n const id1 = multi.addInputStream(streamFrom(['a']));\n const id2 = multi.addInputStream(streamFrom(['b']));\n\n expect(multi.inputCount).toBe(2);\n\n await multi.removeInputStream(id1);\n expect(multi.inputCount).toBeLessThanOrEqual(1);\n\n // Let the remaining stream finish.\n await delay(20);\n expect(multi.inputCount).toBe(0);\n\n await multi.removeInputStream(id2); // already gone, no-op\n expect(multi.inputCount).toBe(0);\n\n await multi.close();\n });\n\n // ---------------------------------------------------------------------------\n // Concurrent reads and writes\n // ---------------------------------------------------------------------------\n\n it('should handle concurrent reads and slow writes', async () => {\n const multi = new MultiInputStream<string>();\n const reader = multi.stream.getReader();\n\n const chunks = ['a', 'b', 'c', 'd', 'e'];\n let idx = 0;\n\n const source = new ReadableStream<string>({\n start(controller) {\n const writeNext = () => {\n if (idx < chunks.length) {\n controller.enqueue(chunks[idx++]);\n setTimeout(writeNext, 5);\n } else {\n controller.close();\n }\n };\n writeNext();\n },\n });\n\n multi.addInputStream(source);\n\n const results: string[] = [];\n for (let i = 0; i < chunks.length; i++) {\n const { value } = await reader.read();\n results.push(value!);\n }\n\n expect(results).toEqual(chunks);\n\n reader.releaseLock();\n await multi.close();\n });\n\n // ---------------------------------------------------------------------------\n // Backpressure\n // ---------------------------------------------------------------------------\n\n it('should handle backpressure with large data', async () => {\n const multi = new MultiInputStream<string>();\n\n const largeChunks = Array.from({ length: 1000 }, (_, i) => `chunk-${i}`);\n multi.addInputStream(streamFrom(largeChunks));\n\n const reader = multi.stream.getReader();\n const results: string[] = [];\n\n let result = await reader.read();\n while (!result.done) {\n results.push(result.value);\n // Check if we've collected all expected values before reading again,\n // to avoid hanging on the output which stays open after input ends.\n if (results.length === largeChunks.length) break;\n result = await reader.read();\n }\n\n expect(results).toEqual(largeChunks);\n\n reader.releaseLock();\n await multi.close();\n });\n\n // ---------------------------------------------------------------------------\n // Multiple tee / concurrent consumers\n // ---------------------------------------------------------------------------\n\n it('should support tee on the output stream', async () => {\n const multi = new MultiInputStream<number>();\n\n const [s1, s2] = multi.stream.tee();\n const r1 = s1.getReader();\n const r2 = s2.getReader();\n\n multi.addInputStream(streamFrom([10, 20]));\n\n const [a1, a2] = await Promise.all([r1.read(), r2.read()]);\n expect(a1.value).toBe(10);\n expect(a2.value).toBe(10);\n\n const [b1, b2] = await Promise.all([r1.read(), r2.read()]);\n expect(b1.value).toBe(20);\n expect(b2.value).toBe(20);\n\n r1.releaseLock();\n r2.releaseLock();\n await multi.close();\n });\n\n // ---------------------------------------------------------------------------\n // Return value of addInputStream\n // ---------------------------------------------------------------------------\n\n it('should return unique IDs from addInputStream', () => {\n const multi = new MultiInputStream<string>();\n\n const id1 = multi.addInputStream(streamFrom(['a']));\n const id2 = multi.addInputStream(streamFrom(['b']));\n const id3 = multi.addInputStream(streamFrom(['c']));\n\n expect(id1).not.toBe(id2);\n expect(id2).not.toBe(id3);\n expect(id1).not.toBe(id3);\n });\n\n // ---------------------------------------------------------------------------\n // close() while pumps are actively writing\n // ---------------------------------------------------------------------------\n\n it('should cleanly close while pumps are actively writing', async () => {\n const multi = new MultiInputStream<string>();\n const reader = multi.stream.getReader();\n\n // A source that never stops on its own.\n const infiniteSource = new ReadableStream<string>({\n async start(controller) {\n let i = 0;\n while (true) {\n try {\n controller.enqueue(`tick-${i++}`);\n } catch {\n // controller.enqueue throws after stream is canceled\n break;\n }\n await delay(5);\n }\n },\n });\n\n multi.addInputStream(infiniteSource);\n\n // Read a couple of values.\n const r1 = await reader.read();\n expect(r1.done).toBe(false);\n\n // Close while the infinite source is still pumping.\n await multi.close();\n\n const r2 = await reader.read();\n expect(r2.done).toBe(true);\n\n reader.releaseLock();\n });\n});\n"],"mappings":"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","names":["result"]}
|
|
@@ -20,7 +20,10 @@ var trace_types_exports = {};
|
|
|
20
20
|
__export(trace_types_exports, {
|
|
21
21
|
ATTR_AGENT_LABEL: () => ATTR_AGENT_LABEL,
|
|
22
22
|
ATTR_AGENT_NAME: () => ATTR_AGENT_NAME,
|
|
23
|
+
ATTR_AGENT_PARENT_TURN_ID: () => ATTR_AGENT_PARENT_TURN_ID,
|
|
24
|
+
ATTR_AGENT_TURN_ID: () => ATTR_AGENT_TURN_ID,
|
|
23
25
|
ATTR_CHAT_CTX: () => ATTR_CHAT_CTX,
|
|
26
|
+
ATTR_E2E_LATENCY: () => ATTR_E2E_LATENCY,
|
|
24
27
|
ATTR_END_OF_TURN_DELAY: () => ATTR_END_OF_TURN_DELAY,
|
|
25
28
|
ATTR_END_TIME: () => ATTR_END_TIME,
|
|
26
29
|
ATTR_EOU_DELAY: () => ATTR_EOU_DELAY,
|
|
@@ -32,10 +35,12 @@ __export(trace_types_exports, {
|
|
|
32
35
|
ATTR_EXCEPTION_TYPE: () => ATTR_EXCEPTION_TYPE,
|
|
33
36
|
ATTR_FUNCTION_TOOLS: () => ATTR_FUNCTION_TOOLS,
|
|
34
37
|
ATTR_FUNCTION_TOOL_ARGS: () => ATTR_FUNCTION_TOOL_ARGS,
|
|
38
|
+
ATTR_FUNCTION_TOOL_ID: () => ATTR_FUNCTION_TOOL_ID,
|
|
35
39
|
ATTR_FUNCTION_TOOL_IS_ERROR: () => ATTR_FUNCTION_TOOL_IS_ERROR,
|
|
36
40
|
ATTR_FUNCTION_TOOL_NAME: () => ATTR_FUNCTION_TOOL_NAME,
|
|
37
41
|
ATTR_FUNCTION_TOOL_OUTPUT: () => ATTR_FUNCTION_TOOL_OUTPUT,
|
|
38
42
|
ATTR_GEN_AI_OPERATION_NAME: () => ATTR_GEN_AI_OPERATION_NAME,
|
|
43
|
+
ATTR_GEN_AI_PROVIDER_NAME: () => ATTR_GEN_AI_PROVIDER_NAME,
|
|
39
44
|
ATTR_GEN_AI_REQUEST_MODEL: () => ATTR_GEN_AI_REQUEST_MODEL,
|
|
40
45
|
ATTR_GEN_AI_USAGE_INPUT_AUDIO_TOKENS: () => ATTR_GEN_AI_USAGE_INPUT_AUDIO_TOKENS,
|
|
41
46
|
ATTR_GEN_AI_USAGE_INPUT_CACHED_TOKENS: () => ATTR_GEN_AI_USAGE_INPUT_CACHED_TOKENS,
|
|
@@ -45,21 +50,30 @@ __export(trace_types_exports, {
|
|
|
45
50
|
ATTR_GEN_AI_USAGE_OUTPUT_TEXT_TOKENS: () => ATTR_GEN_AI_USAGE_OUTPUT_TEXT_TOKENS,
|
|
46
51
|
ATTR_GEN_AI_USAGE_OUTPUT_TOKENS: () => ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,
|
|
47
52
|
ATTR_INSTRUCTIONS: () => ATTR_INSTRUCTIONS,
|
|
53
|
+
ATTR_INTERRUPTION_DETECTION_DELAY: () => ATTR_INTERRUPTION_DETECTION_DELAY,
|
|
54
|
+
ATTR_INTERRUPTION_PREDICTION_DURATION: () => ATTR_INTERRUPTION_PREDICTION_DURATION,
|
|
55
|
+
ATTR_INTERRUPTION_PROBABILITY: () => ATTR_INTERRUPTION_PROBABILITY,
|
|
56
|
+
ATTR_INTERRUPTION_TOTAL_DURATION: () => ATTR_INTERRUPTION_TOTAL_DURATION,
|
|
57
|
+
ATTR_IS_INTERRUPTION: () => ATTR_IS_INTERRUPTION,
|
|
48
58
|
ATTR_JOB_ID: () => ATTR_JOB_ID,
|
|
49
59
|
ATTR_LANGFUSE_COMPLETION_START_TIME: () => ATTR_LANGFUSE_COMPLETION_START_TIME,
|
|
50
60
|
ATTR_LLM_METRICS: () => ATTR_LLM_METRICS,
|
|
51
61
|
ATTR_PARTICIPANT_ID: () => ATTR_PARTICIPANT_ID,
|
|
52
62
|
ATTR_PARTICIPANT_IDENTITY: () => ATTR_PARTICIPANT_IDENTITY,
|
|
53
63
|
ATTR_PARTICIPANT_KIND: () => ATTR_PARTICIPANT_KIND,
|
|
64
|
+
ATTR_PROVIDER_TOOLS: () => ATTR_PROVIDER_TOOLS,
|
|
54
65
|
ATTR_REALTIME_MODEL_METRICS: () => ATTR_REALTIME_MODEL_METRICS,
|
|
55
66
|
ATTR_RESPONSE_FUNCTION_CALLS: () => ATTR_RESPONSE_FUNCTION_CALLS,
|
|
56
67
|
ATTR_RESPONSE_TEXT: () => ATTR_RESPONSE_TEXT,
|
|
68
|
+
ATTR_RESPONSE_TTFB: () => ATTR_RESPONSE_TTFB,
|
|
69
|
+
ATTR_RESPONSE_TTFT: () => ATTR_RESPONSE_TTFT,
|
|
57
70
|
ATTR_RETRY_COUNT: () => ATTR_RETRY_COUNT,
|
|
58
71
|
ATTR_ROOM_NAME: () => ATTR_ROOM_NAME,
|
|
59
72
|
ATTR_SESSION_OPTIONS: () => ATTR_SESSION_OPTIONS,
|
|
60
73
|
ATTR_SPEECH_ID: () => ATTR_SPEECH_ID,
|
|
61
74
|
ATTR_SPEECH_INTERRUPTED: () => ATTR_SPEECH_INTERRUPTED,
|
|
62
75
|
ATTR_START_TIME: () => ATTR_START_TIME,
|
|
76
|
+
ATTR_TOOL_SETS: () => ATTR_TOOL_SETS,
|
|
63
77
|
ATTR_TRANSCRIPTION_DELAY: () => ATTR_TRANSCRIPTION_DELAY,
|
|
64
78
|
ATTR_TRANSCRIPT_CONFIDENCE: () => ATTR_TRANSCRIPT_CONFIDENCE,
|
|
65
79
|
ATTR_TTS_INPUT_TEXT: () => ATTR_TTS_INPUT_TEXT,
|
|
@@ -87,13 +101,19 @@ const ATTR_JOB_ID = "lk.job_id";
|
|
|
87
101
|
const ATTR_AGENT_NAME = "lk.agent_name";
|
|
88
102
|
const ATTR_ROOM_NAME = "lk.room_name";
|
|
89
103
|
const ATTR_SESSION_OPTIONS = "lk.session_options";
|
|
104
|
+
const ATTR_AGENT_TURN_ID = "lk.generation_id";
|
|
105
|
+
const ATTR_AGENT_PARENT_TURN_ID = "lk.parent_generation_id";
|
|
90
106
|
const ATTR_USER_INPUT = "lk.user_input";
|
|
91
107
|
const ATTR_INSTRUCTIONS = "lk.instructions";
|
|
92
108
|
const ATTR_SPEECH_INTERRUPTED = "lk.interrupted";
|
|
93
109
|
const ATTR_CHAT_CTX = "lk.chat_ctx";
|
|
94
110
|
const ATTR_FUNCTION_TOOLS = "lk.function_tools";
|
|
111
|
+
const ATTR_PROVIDER_TOOLS = "lk.provider_tools";
|
|
112
|
+
const ATTR_TOOL_SETS = "lk.tool_sets";
|
|
95
113
|
const ATTR_RESPONSE_TEXT = "lk.response.text";
|
|
96
114
|
const ATTR_RESPONSE_FUNCTION_CALLS = "lk.response.function_calls";
|
|
115
|
+
const ATTR_RESPONSE_TTFT = "lk.response.ttft";
|
|
116
|
+
const ATTR_FUNCTION_TOOL_ID = "lk.function_tool.id";
|
|
97
117
|
const ATTR_FUNCTION_TOOL_NAME = "lk.function_tool.name";
|
|
98
118
|
const ATTR_FUNCTION_TOOL_ARGS = "lk.function_tool.arguments";
|
|
99
119
|
const ATTR_FUNCTION_TOOL_IS_ERROR = "lk.function_tool.is_error";
|
|
@@ -101,6 +121,7 @@ const ATTR_FUNCTION_TOOL_OUTPUT = "lk.function_tool.output";
|
|
|
101
121
|
const ATTR_TTS_INPUT_TEXT = "lk.input_text";
|
|
102
122
|
const ATTR_TTS_STREAMING = "lk.tts.streaming";
|
|
103
123
|
const ATTR_TTS_LABEL = "lk.tts.label";
|
|
124
|
+
const ATTR_RESPONSE_TTFB = "lk.response.ttfb";
|
|
104
125
|
const ATTR_EOU_PROBABILITY = "lk.eou.probability";
|
|
105
126
|
const ATTR_EOU_UNLIKELY_THRESHOLD = "lk.eou.unlikely_threshold";
|
|
106
127
|
const ATTR_EOU_DELAY = "lk.eou.endpointing_delay";
|
|
@@ -112,8 +133,10 @@ const ATTR_END_OF_TURN_DELAY = "lk.end_of_turn_delay";
|
|
|
112
133
|
const ATTR_LLM_METRICS = "lk.llm_metrics";
|
|
113
134
|
const ATTR_TTS_METRICS = "lk.tts_metrics";
|
|
114
135
|
const ATTR_REALTIME_MODEL_METRICS = "lk.realtime_model_metrics";
|
|
136
|
+
const ATTR_E2E_LATENCY = "lk.e2e_latency";
|
|
115
137
|
const ATTR_GEN_AI_OPERATION_NAME = "gen_ai.operation.name";
|
|
116
138
|
const ATTR_GEN_AI_REQUEST_MODEL = "gen_ai.request.model";
|
|
139
|
+
const ATTR_GEN_AI_PROVIDER_NAME = "gen_ai.provider.name";
|
|
117
140
|
const ATTR_GEN_AI_USAGE_INPUT_TOKENS = "gen_ai.usage.input_tokens";
|
|
118
141
|
const ATTR_GEN_AI_USAGE_OUTPUT_TOKENS = "gen_ai.usage.output_tokens";
|
|
119
142
|
const ATTR_GEN_AI_USAGE_INPUT_TEXT_TOKENS = "gen_ai.usage.input_text_tokens";
|
|
@@ -130,11 +153,19 @@ const ATTR_EXCEPTION_TRACE = "exception.stacktrace";
|
|
|
130
153
|
const ATTR_EXCEPTION_TYPE = "exception.type";
|
|
131
154
|
const ATTR_EXCEPTION_MESSAGE = "exception.message";
|
|
132
155
|
const ATTR_LANGFUSE_COMPLETION_START_TIME = "langfuse.observation.completion_start_time";
|
|
156
|
+
const ATTR_IS_INTERRUPTION = "lk.is_interruption";
|
|
157
|
+
const ATTR_INTERRUPTION_PROBABILITY = "lk.interruption.probability";
|
|
158
|
+
const ATTR_INTERRUPTION_TOTAL_DURATION = "lk.interruption.total_duration";
|
|
159
|
+
const ATTR_INTERRUPTION_PREDICTION_DURATION = "lk.interruption.prediction_duration";
|
|
160
|
+
const ATTR_INTERRUPTION_DETECTION_DELAY = "lk.interruption.detection_delay";
|
|
133
161
|
// Annotate the CommonJS export names for ESM import in node:
|
|
134
162
|
0 && (module.exports = {
|
|
135
163
|
ATTR_AGENT_LABEL,
|
|
136
164
|
ATTR_AGENT_NAME,
|
|
165
|
+
ATTR_AGENT_PARENT_TURN_ID,
|
|
166
|
+
ATTR_AGENT_TURN_ID,
|
|
137
167
|
ATTR_CHAT_CTX,
|
|
168
|
+
ATTR_E2E_LATENCY,
|
|
138
169
|
ATTR_END_OF_TURN_DELAY,
|
|
139
170
|
ATTR_END_TIME,
|
|
140
171
|
ATTR_EOU_DELAY,
|
|
@@ -146,10 +177,12 @@ const ATTR_LANGFUSE_COMPLETION_START_TIME = "langfuse.observation.completion_sta
|
|
|
146
177
|
ATTR_EXCEPTION_TYPE,
|
|
147
178
|
ATTR_FUNCTION_TOOLS,
|
|
148
179
|
ATTR_FUNCTION_TOOL_ARGS,
|
|
180
|
+
ATTR_FUNCTION_TOOL_ID,
|
|
149
181
|
ATTR_FUNCTION_TOOL_IS_ERROR,
|
|
150
182
|
ATTR_FUNCTION_TOOL_NAME,
|
|
151
183
|
ATTR_FUNCTION_TOOL_OUTPUT,
|
|
152
184
|
ATTR_GEN_AI_OPERATION_NAME,
|
|
185
|
+
ATTR_GEN_AI_PROVIDER_NAME,
|
|
153
186
|
ATTR_GEN_AI_REQUEST_MODEL,
|
|
154
187
|
ATTR_GEN_AI_USAGE_INPUT_AUDIO_TOKENS,
|
|
155
188
|
ATTR_GEN_AI_USAGE_INPUT_CACHED_TOKENS,
|
|
@@ -159,21 +192,30 @@ const ATTR_LANGFUSE_COMPLETION_START_TIME = "langfuse.observation.completion_sta
|
|
|
159
192
|
ATTR_GEN_AI_USAGE_OUTPUT_TEXT_TOKENS,
|
|
160
193
|
ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,
|
|
161
194
|
ATTR_INSTRUCTIONS,
|
|
195
|
+
ATTR_INTERRUPTION_DETECTION_DELAY,
|
|
196
|
+
ATTR_INTERRUPTION_PREDICTION_DURATION,
|
|
197
|
+
ATTR_INTERRUPTION_PROBABILITY,
|
|
198
|
+
ATTR_INTERRUPTION_TOTAL_DURATION,
|
|
199
|
+
ATTR_IS_INTERRUPTION,
|
|
162
200
|
ATTR_JOB_ID,
|
|
163
201
|
ATTR_LANGFUSE_COMPLETION_START_TIME,
|
|
164
202
|
ATTR_LLM_METRICS,
|
|
165
203
|
ATTR_PARTICIPANT_ID,
|
|
166
204
|
ATTR_PARTICIPANT_IDENTITY,
|
|
167
205
|
ATTR_PARTICIPANT_KIND,
|
|
206
|
+
ATTR_PROVIDER_TOOLS,
|
|
168
207
|
ATTR_REALTIME_MODEL_METRICS,
|
|
169
208
|
ATTR_RESPONSE_FUNCTION_CALLS,
|
|
170
209
|
ATTR_RESPONSE_TEXT,
|
|
210
|
+
ATTR_RESPONSE_TTFB,
|
|
211
|
+
ATTR_RESPONSE_TTFT,
|
|
171
212
|
ATTR_RETRY_COUNT,
|
|
172
213
|
ATTR_ROOM_NAME,
|
|
173
214
|
ATTR_SESSION_OPTIONS,
|
|
174
215
|
ATTR_SPEECH_ID,
|
|
175
216
|
ATTR_SPEECH_INTERRUPTED,
|
|
176
217
|
ATTR_START_TIME,
|
|
218
|
+
ATTR_TOOL_SETS,
|
|
177
219
|
ATTR_TRANSCRIPTION_DELAY,
|
|
178
220
|
ATTR_TRANSCRIPT_CONFIDENCE,
|
|
179
221
|
ATTR_TTS_INPUT_TEXT,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/telemetry/trace_types.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\n\n// LiveKit custom attributes\nexport const ATTR_SPEECH_ID = 'lk.speech_id';\nexport const ATTR_AGENT_LABEL = 'lk.agent_label';\nexport const ATTR_START_TIME = 'lk.start_time';\nexport const ATTR_END_TIME = 'lk.end_time';\nexport const ATTR_RETRY_COUNT = 'lk.retry_count';\n\nexport const ATTR_PARTICIPANT_ID = 'lk.participant_id';\nexport const ATTR_PARTICIPANT_IDENTITY = 'lk.participant_identity';\nexport const ATTR_PARTICIPANT_KIND = 'lk.participant_kind';\n\n// session start\nexport const ATTR_JOB_ID = 'lk.job_id';\nexport const ATTR_AGENT_NAME = 'lk.agent_name';\nexport const ATTR_ROOM_NAME = 'lk.room_name';\nexport const ATTR_SESSION_OPTIONS = 'lk.session_options';\n\n// assistant turn\nexport const ATTR_USER_INPUT = 'lk.user_input';\nexport const ATTR_INSTRUCTIONS = 'lk.instructions';\nexport const ATTR_SPEECH_INTERRUPTED = 'lk.interrupted';\n\n// llm node\nexport const ATTR_CHAT_CTX = 'lk.chat_ctx';\nexport const ATTR_FUNCTION_TOOLS = 'lk.function_tools';\nexport const ATTR_RESPONSE_TEXT = 'lk.response.text';\nexport const ATTR_RESPONSE_FUNCTION_CALLS = 'lk.response.function_calls';\n\n// function tool\nexport const ATTR_FUNCTION_TOOL_NAME = 'lk.function_tool.name';\nexport const ATTR_FUNCTION_TOOL_ARGS = 'lk.function_tool.arguments';\nexport const ATTR_FUNCTION_TOOL_IS_ERROR = 'lk.function_tool.is_error';\nexport const ATTR_FUNCTION_TOOL_OUTPUT = 'lk.function_tool.output';\n\n// tts node\nexport const ATTR_TTS_INPUT_TEXT = 'lk.input_text';\nexport const ATTR_TTS_STREAMING = 'lk.tts.streaming';\nexport const ATTR_TTS_LABEL = 'lk.tts.label';\n\n// eou detection\nexport const ATTR_EOU_PROBABILITY = 'lk.eou.probability';\nexport const ATTR_EOU_UNLIKELY_THRESHOLD = 'lk.eou.unlikely_threshold';\nexport const ATTR_EOU_DELAY = 'lk.eou.endpointing_delay';\nexport const ATTR_EOU_LANGUAGE = 'lk.eou.language';\nexport const ATTR_USER_TRANSCRIPT = 'lk.user_transcript';\nexport const ATTR_TRANSCRIPT_CONFIDENCE = 'lk.transcript_confidence';\nexport const ATTR_TRANSCRIPTION_DELAY = 'lk.transcription_delay';\nexport const ATTR_END_OF_TURN_DELAY = 'lk.end_of_turn_delay';\n\n// metrics\nexport const ATTR_LLM_METRICS = 'lk.llm_metrics';\nexport const ATTR_TTS_METRICS = 'lk.tts_metrics';\nexport const ATTR_REALTIME_MODEL_METRICS = 'lk.realtime_model_metrics';\n\n// OpenTelemetry GenAI attributes\n// OpenTelemetry specification: https://opentelemetry.io/docs/specs/semconv/registry/attributes/gen-ai/\nexport const ATTR_GEN_AI_OPERATION_NAME = 'gen_ai.operation.name';\nexport const ATTR_GEN_AI_REQUEST_MODEL = 'gen_ai.request.model';\nexport const ATTR_GEN_AI_USAGE_INPUT_TOKENS = 'gen_ai.usage.input_tokens';\nexport const ATTR_GEN_AI_USAGE_OUTPUT_TOKENS = 'gen_ai.usage.output_tokens';\n\n// Unofficial OpenTelemetry GenAI attributes, recognized by LangFuse\n// https://langfuse.com/integrations/native/opentelemetry#usage\n// but not yet in the official OpenTelemetry specification.\nexport const ATTR_GEN_AI_USAGE_INPUT_TEXT_TOKENS = 'gen_ai.usage.input_text_tokens';\nexport const ATTR_GEN_AI_USAGE_INPUT_AUDIO_TOKENS = 'gen_ai.usage.input_audio_tokens';\nexport const ATTR_GEN_AI_USAGE_INPUT_CACHED_TOKENS = 'gen_ai.usage.input_cached_tokens';\nexport const ATTR_GEN_AI_USAGE_OUTPUT_TEXT_TOKENS = 'gen_ai.usage.output_text_tokens';\nexport const ATTR_GEN_AI_USAGE_OUTPUT_AUDIO_TOKENS = 'gen_ai.usage.output_audio_tokens';\n\n// OpenTelemetry GenAI event names (for structured logging)\nexport const EVENT_GEN_AI_SYSTEM_MESSAGE = 'gen_ai.system.message';\nexport const EVENT_GEN_AI_USER_MESSAGE = 'gen_ai.user.message';\nexport const EVENT_GEN_AI_ASSISTANT_MESSAGE = 'gen_ai.assistant.message';\nexport const EVENT_GEN_AI_TOOL_MESSAGE = 'gen_ai.tool.message';\nexport const EVENT_GEN_AI_CHOICE = 'gen_ai.choice';\n\n// Exception attributes\nexport const ATTR_EXCEPTION_TRACE = 'exception.stacktrace';\nexport const ATTR_EXCEPTION_TYPE = 'exception.type';\nexport const ATTR_EXCEPTION_MESSAGE = 'exception.message';\n\n// Platform-specific attributes\nexport const ATTR_LANGFUSE_COMPLETION_START_TIME = 'langfuse.observation.completion_start_time';\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAKO,MAAM,iBAAiB;AACvB,MAAM,mBAAmB;AACzB,MAAM,kBAAkB;AACxB,MAAM,gBAAgB;AACtB,MAAM,mBAAmB;AAEzB,MAAM,sBAAsB;AAC5B,MAAM,4BAA4B;AAClC,MAAM,wBAAwB;AAG9B,MAAM,cAAc;AACpB,MAAM,kBAAkB;AACxB,MAAM,iBAAiB;AACvB,MAAM,uBAAuB;AAG7B,MAAM,kBAAkB;AACxB,MAAM,oBAAoB;AAC1B,MAAM,0BAA0B;AAGhC,MAAM,gBAAgB;AACtB,MAAM,sBAAsB;AAC5B,MAAM,qBAAqB;AAC3B,MAAM,+BAA+B;
|
|
1
|
+
{"version":3,"sources":["../../src/telemetry/trace_types.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\n\n// LiveKit custom attributes\nexport const ATTR_SPEECH_ID = 'lk.speech_id';\nexport const ATTR_AGENT_LABEL = 'lk.agent_label';\nexport const ATTR_START_TIME = 'lk.start_time';\nexport const ATTR_END_TIME = 'lk.end_time';\nexport const ATTR_RETRY_COUNT = 'lk.retry_count';\n\nexport const ATTR_PARTICIPANT_ID = 'lk.participant_id';\nexport const ATTR_PARTICIPANT_IDENTITY = 'lk.participant_identity';\nexport const ATTR_PARTICIPANT_KIND = 'lk.participant_kind';\n\n// session start\nexport const ATTR_JOB_ID = 'lk.job_id';\nexport const ATTR_AGENT_NAME = 'lk.agent_name';\nexport const ATTR_ROOM_NAME = 'lk.room_name';\nexport const ATTR_SESSION_OPTIONS = 'lk.session_options';\n\n// assistant turn\nexport const ATTR_AGENT_TURN_ID = 'lk.generation_id';\nexport const ATTR_AGENT_PARENT_TURN_ID = 'lk.parent_generation_id';\nexport const ATTR_USER_INPUT = 'lk.user_input';\nexport const ATTR_INSTRUCTIONS = 'lk.instructions';\nexport const ATTR_SPEECH_INTERRUPTED = 'lk.interrupted';\n\n// llm node\nexport const ATTR_CHAT_CTX = 'lk.chat_ctx';\nexport const ATTR_FUNCTION_TOOLS = 'lk.function_tools';\nexport const ATTR_PROVIDER_TOOLS = 'lk.provider_tools';\nexport const ATTR_TOOL_SETS = 'lk.tool_sets';\nexport const ATTR_RESPONSE_TEXT = 'lk.response.text';\nexport const ATTR_RESPONSE_FUNCTION_CALLS = 'lk.response.function_calls';\nexport const ATTR_RESPONSE_TTFT = 'lk.response.ttft';\n\n// function tool\nexport const ATTR_FUNCTION_TOOL_ID = 'lk.function_tool.id';\nexport const ATTR_FUNCTION_TOOL_NAME = 'lk.function_tool.name';\nexport const ATTR_FUNCTION_TOOL_ARGS = 'lk.function_tool.arguments';\nexport const ATTR_FUNCTION_TOOL_IS_ERROR = 'lk.function_tool.is_error';\nexport const ATTR_FUNCTION_TOOL_OUTPUT = 'lk.function_tool.output';\n\n// tts node\nexport const ATTR_TTS_INPUT_TEXT = 'lk.input_text';\nexport const ATTR_TTS_STREAMING = 'lk.tts.streaming';\nexport const ATTR_TTS_LABEL = 'lk.tts.label';\nexport const ATTR_RESPONSE_TTFB = 'lk.response.ttfb';\n\n// eou detection\nexport const ATTR_EOU_PROBABILITY = 'lk.eou.probability';\nexport const ATTR_EOU_UNLIKELY_THRESHOLD = 'lk.eou.unlikely_threshold';\nexport const ATTR_EOU_DELAY = 'lk.eou.endpointing_delay';\nexport const ATTR_EOU_LANGUAGE = 'lk.eou.language';\nexport const ATTR_USER_TRANSCRIPT = 'lk.user_transcript';\nexport const ATTR_TRANSCRIPT_CONFIDENCE = 'lk.transcript_confidence';\nexport const ATTR_TRANSCRIPTION_DELAY = 'lk.transcription_delay';\nexport const ATTR_END_OF_TURN_DELAY = 'lk.end_of_turn_delay';\n\n// metrics\nexport const ATTR_LLM_METRICS = 'lk.llm_metrics';\nexport const ATTR_TTS_METRICS = 'lk.tts_metrics';\nexport const ATTR_REALTIME_MODEL_METRICS = 'lk.realtime_model_metrics';\n\n// latency span attributes\nexport const ATTR_E2E_LATENCY = 'lk.e2e_latency';\n\n// OpenTelemetry GenAI attributes\n// OpenTelemetry specification: https://opentelemetry.io/docs/specs/semconv/registry/attributes/gen-ai/\nexport const ATTR_GEN_AI_OPERATION_NAME = 'gen_ai.operation.name';\nexport const ATTR_GEN_AI_REQUEST_MODEL = 'gen_ai.request.model';\nexport const ATTR_GEN_AI_PROVIDER_NAME = 'gen_ai.provider.name';\nexport const ATTR_GEN_AI_USAGE_INPUT_TOKENS = 'gen_ai.usage.input_tokens';\nexport const ATTR_GEN_AI_USAGE_OUTPUT_TOKENS = 'gen_ai.usage.output_tokens';\n\n// Unofficial OpenTelemetry GenAI attributes, recognized by LangFuse\n// https://langfuse.com/integrations/native/opentelemetry#usage\n// but not yet in the official OpenTelemetry specification.\nexport const ATTR_GEN_AI_USAGE_INPUT_TEXT_TOKENS = 'gen_ai.usage.input_text_tokens';\nexport const ATTR_GEN_AI_USAGE_INPUT_AUDIO_TOKENS = 'gen_ai.usage.input_audio_tokens';\nexport const ATTR_GEN_AI_USAGE_INPUT_CACHED_TOKENS = 'gen_ai.usage.input_cached_tokens';\nexport const ATTR_GEN_AI_USAGE_OUTPUT_TEXT_TOKENS = 'gen_ai.usage.output_text_tokens';\nexport const ATTR_GEN_AI_USAGE_OUTPUT_AUDIO_TOKENS = 'gen_ai.usage.output_audio_tokens';\n\n// OpenTelemetry GenAI event names (for structured logging)\nexport const EVENT_GEN_AI_SYSTEM_MESSAGE = 'gen_ai.system.message';\nexport const EVENT_GEN_AI_USER_MESSAGE = 'gen_ai.user.message';\nexport const EVENT_GEN_AI_ASSISTANT_MESSAGE = 'gen_ai.assistant.message';\nexport const EVENT_GEN_AI_TOOL_MESSAGE = 'gen_ai.tool.message';\nexport const EVENT_GEN_AI_CHOICE = 'gen_ai.choice';\n\n// Exception attributes\nexport const ATTR_EXCEPTION_TRACE = 'exception.stacktrace';\nexport const ATTR_EXCEPTION_TYPE = 'exception.type';\nexport const ATTR_EXCEPTION_MESSAGE = 'exception.message';\n\n// Platform-specific attributes\nexport const ATTR_LANGFUSE_COMPLETION_START_TIME = 'langfuse.observation.completion_start_time';\n\n// Adaptive Interruption attributes\nexport const ATTR_IS_INTERRUPTION = 'lk.is_interruption';\nexport const ATTR_INTERRUPTION_PROBABILITY = 'lk.interruption.probability';\nexport const ATTR_INTERRUPTION_TOTAL_DURATION = 'lk.interruption.total_duration';\nexport const ATTR_INTERRUPTION_PREDICTION_DURATION = 'lk.interruption.prediction_duration';\nexport const ATTR_INTERRUPTION_DETECTION_DELAY = 'lk.interruption.detection_delay';\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAKO,MAAM,iBAAiB;AACvB,MAAM,mBAAmB;AACzB,MAAM,kBAAkB;AACxB,MAAM,gBAAgB;AACtB,MAAM,mBAAmB;AAEzB,MAAM,sBAAsB;AAC5B,MAAM,4BAA4B;AAClC,MAAM,wBAAwB;AAG9B,MAAM,cAAc;AACpB,MAAM,kBAAkB;AACxB,MAAM,iBAAiB;AACvB,MAAM,uBAAuB;AAG7B,MAAM,qBAAqB;AAC3B,MAAM,4BAA4B;AAClC,MAAM,kBAAkB;AACxB,MAAM,oBAAoB;AAC1B,MAAM,0BAA0B;AAGhC,MAAM,gBAAgB;AACtB,MAAM,sBAAsB;AAC5B,MAAM,sBAAsB;AAC5B,MAAM,iBAAiB;AACvB,MAAM,qBAAqB;AAC3B,MAAM,+BAA+B;AACrC,MAAM,qBAAqB;AAG3B,MAAM,wBAAwB;AAC9B,MAAM,0BAA0B;AAChC,MAAM,0BAA0B;AAChC,MAAM,8BAA8B;AACpC,MAAM,4BAA4B;AAGlC,MAAM,sBAAsB;AAC5B,MAAM,qBAAqB;AAC3B,MAAM,iBAAiB;AACvB,MAAM,qBAAqB;AAG3B,MAAM,uBAAuB;AAC7B,MAAM,8BAA8B;AACpC,MAAM,iBAAiB;AACvB,MAAM,oBAAoB;AAC1B,MAAM,uBAAuB;AAC7B,MAAM,6BAA6B;AACnC,MAAM,2BAA2B;AACjC,MAAM,yBAAyB;AAG/B,MAAM,mBAAmB;AACzB,MAAM,mBAAmB;AACzB,MAAM,8BAA8B;AAGpC,MAAM,mBAAmB;AAIzB,MAAM,6BAA6B;AACnC,MAAM,4BAA4B;AAClC,MAAM,4BAA4B;AAClC,MAAM,iCAAiC;AACvC,MAAM,kCAAkC;AAKxC,MAAM,sCAAsC;AAC5C,MAAM,uCAAuC;AAC7C,MAAM,wCAAwC;AAC9C,MAAM,uCAAuC;AAC7C,MAAM,wCAAwC;AAG9C,MAAM,8BAA8B;AACpC,MAAM,4BAA4B;AAClC,MAAM,iCAAiC;AACvC,MAAM,4BAA4B;AAClC,MAAM,sBAAsB;AAG5B,MAAM,uBAAuB;AAC7B,MAAM,sBAAsB;AAC5B,MAAM,yBAAyB;AAG/B,MAAM,sCAAsC;AAG5C,MAAM,uBAAuB;AAC7B,MAAM,gCAAgC;AACtC,MAAM,mCAAmC;AACzC,MAAM,wCAAwC;AAC9C,MAAM,oCAAoC;","names":[]}
|
|
@@ -10,13 +10,19 @@ export declare const ATTR_JOB_ID = "lk.job_id";
|
|
|
10
10
|
export declare const ATTR_AGENT_NAME = "lk.agent_name";
|
|
11
11
|
export declare const ATTR_ROOM_NAME = "lk.room_name";
|
|
12
12
|
export declare const ATTR_SESSION_OPTIONS = "lk.session_options";
|
|
13
|
+
export declare const ATTR_AGENT_TURN_ID = "lk.generation_id";
|
|
14
|
+
export declare const ATTR_AGENT_PARENT_TURN_ID = "lk.parent_generation_id";
|
|
13
15
|
export declare const ATTR_USER_INPUT = "lk.user_input";
|
|
14
16
|
export declare const ATTR_INSTRUCTIONS = "lk.instructions";
|
|
15
17
|
export declare const ATTR_SPEECH_INTERRUPTED = "lk.interrupted";
|
|
16
18
|
export declare const ATTR_CHAT_CTX = "lk.chat_ctx";
|
|
17
19
|
export declare const ATTR_FUNCTION_TOOLS = "lk.function_tools";
|
|
20
|
+
export declare const ATTR_PROVIDER_TOOLS = "lk.provider_tools";
|
|
21
|
+
export declare const ATTR_TOOL_SETS = "lk.tool_sets";
|
|
18
22
|
export declare const ATTR_RESPONSE_TEXT = "lk.response.text";
|
|
19
23
|
export declare const ATTR_RESPONSE_FUNCTION_CALLS = "lk.response.function_calls";
|
|
24
|
+
export declare const ATTR_RESPONSE_TTFT = "lk.response.ttft";
|
|
25
|
+
export declare const ATTR_FUNCTION_TOOL_ID = "lk.function_tool.id";
|
|
20
26
|
export declare const ATTR_FUNCTION_TOOL_NAME = "lk.function_tool.name";
|
|
21
27
|
export declare const ATTR_FUNCTION_TOOL_ARGS = "lk.function_tool.arguments";
|
|
22
28
|
export declare const ATTR_FUNCTION_TOOL_IS_ERROR = "lk.function_tool.is_error";
|
|
@@ -24,6 +30,7 @@ export declare const ATTR_FUNCTION_TOOL_OUTPUT = "lk.function_tool.output";
|
|
|
24
30
|
export declare const ATTR_TTS_INPUT_TEXT = "lk.input_text";
|
|
25
31
|
export declare const ATTR_TTS_STREAMING = "lk.tts.streaming";
|
|
26
32
|
export declare const ATTR_TTS_LABEL = "lk.tts.label";
|
|
33
|
+
export declare const ATTR_RESPONSE_TTFB = "lk.response.ttfb";
|
|
27
34
|
export declare const ATTR_EOU_PROBABILITY = "lk.eou.probability";
|
|
28
35
|
export declare const ATTR_EOU_UNLIKELY_THRESHOLD = "lk.eou.unlikely_threshold";
|
|
29
36
|
export declare const ATTR_EOU_DELAY = "lk.eou.endpointing_delay";
|
|
@@ -35,8 +42,10 @@ export declare const ATTR_END_OF_TURN_DELAY = "lk.end_of_turn_delay";
|
|
|
35
42
|
export declare const ATTR_LLM_METRICS = "lk.llm_metrics";
|
|
36
43
|
export declare const ATTR_TTS_METRICS = "lk.tts_metrics";
|
|
37
44
|
export declare const ATTR_REALTIME_MODEL_METRICS = "lk.realtime_model_metrics";
|
|
45
|
+
export declare const ATTR_E2E_LATENCY = "lk.e2e_latency";
|
|
38
46
|
export declare const ATTR_GEN_AI_OPERATION_NAME = "gen_ai.operation.name";
|
|
39
47
|
export declare const ATTR_GEN_AI_REQUEST_MODEL = "gen_ai.request.model";
|
|
48
|
+
export declare const ATTR_GEN_AI_PROVIDER_NAME = "gen_ai.provider.name";
|
|
40
49
|
export declare const ATTR_GEN_AI_USAGE_INPUT_TOKENS = "gen_ai.usage.input_tokens";
|
|
41
50
|
export declare const ATTR_GEN_AI_USAGE_OUTPUT_TOKENS = "gen_ai.usage.output_tokens";
|
|
42
51
|
export declare const ATTR_GEN_AI_USAGE_INPUT_TEXT_TOKENS = "gen_ai.usage.input_text_tokens";
|
|
@@ -53,4 +62,9 @@ export declare const ATTR_EXCEPTION_TRACE = "exception.stacktrace";
|
|
|
53
62
|
export declare const ATTR_EXCEPTION_TYPE = "exception.type";
|
|
54
63
|
export declare const ATTR_EXCEPTION_MESSAGE = "exception.message";
|
|
55
64
|
export declare const ATTR_LANGFUSE_COMPLETION_START_TIME = "langfuse.observation.completion_start_time";
|
|
65
|
+
export declare const ATTR_IS_INTERRUPTION = "lk.is_interruption";
|
|
66
|
+
export declare const ATTR_INTERRUPTION_PROBABILITY = "lk.interruption.probability";
|
|
67
|
+
export declare const ATTR_INTERRUPTION_TOTAL_DURATION = "lk.interruption.total_duration";
|
|
68
|
+
export declare const ATTR_INTERRUPTION_PREDICTION_DURATION = "lk.interruption.prediction_duration";
|
|
69
|
+
export declare const ATTR_INTERRUPTION_DETECTION_DELAY = "lk.interruption.detection_delay";
|
|
56
70
|
//# sourceMappingURL=trace_types.d.ts.map
|