@respan/instrumentation-livekit 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -0
- package/dist/_constants.d.ts +89 -0
- package/dist/_constants.js +122 -0
- package/dist/_constants.js.map +1 -0
- package/dist/_translator.d.ts +10 -0
- package/dist/_translator.js +445 -0
- package/dist/_translator.js.map +1 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.js +170 -0
- package/dist/index.js.map +1 -0
- package/package.json +50 -0
package/README.md
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# @respan/instrumentation-livekit
|
|
2
|
+
|
|
3
|
+
Respan instrumentation for the LiveKit Agents TypeScript SDK.
|
|
4
|
+
|
|
5
|
+
The instrumentor patches LiveKit's `telemetry.tracer` span creation methods and
|
|
6
|
+
adds canonical Respan attributes before LiveKit spans end. It also points
|
|
7
|
+
LiveKit's dynamic tracer at the active Respan OpenTelemetry provider during
|
|
8
|
+
`activate()`.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
import { Respan } from "@respan/respan";
|
|
12
|
+
import { LiveKitInstrumentor } from "@respan/instrumentation-livekit";
|
|
13
|
+
|
|
14
|
+
const respan = new Respan({
|
|
15
|
+
apiKey: process.env.RESPAN_API_KEY,
|
|
16
|
+
instrumentations: [new LiveKitInstrumentor()],
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
await respan.initialize();
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Captured LiveKit spans include agent sessions, agent turns, LLM nodes, function
|
|
23
|
+
tools, user turns, and TTS spans. LiveKit raw `lk.*` attributes are preserved,
|
|
24
|
+
while Respan canonical fields such as `respan.entity.log_type`,
|
|
25
|
+
`traceloop.entity.input`, `gen_ai.prompt.*`, and
|
|
26
|
+
`gen_ai.completion.0.content` are added for ingestion.
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { RespanLogType } from "@respan/respan-sdk";
|
|
2
|
+
export declare const LIVEKIT_INSTRUMENTATION_NAME = "livekit";
|
|
3
|
+
export declare const LIVEKIT_INSTRUMENTATION_PACKAGE = "@respan/instrumentation-livekit";
|
|
4
|
+
export declare const LIVEKIT_LOG_METHOD_TS_TRACING = "ts_tracing";
|
|
5
|
+
export declare const LIVEKIT_SPAN_NAMES: {
|
|
6
|
+
readonly AGENT_SESSION: "agent_session";
|
|
7
|
+
readonly AGENT_TURN: "agent_turn";
|
|
8
|
+
readonly USER_TURN: "user_turn";
|
|
9
|
+
readonly LLM_NODE: "llm_node";
|
|
10
|
+
readonly LLM_REQUEST: "llm_request";
|
|
11
|
+
readonly LLM_REQUEST_RUN: "llm_request_run";
|
|
12
|
+
readonly FUNCTION_TOOL: "function_tool";
|
|
13
|
+
readonly TTS_NODE: "tts_node";
|
|
14
|
+
readonly TTS_REQUEST: "tts_request";
|
|
15
|
+
readonly TTS_REQUEST_RUN: "tts_request_run";
|
|
16
|
+
readonly AGENT_SPEAKING: "agent_speaking";
|
|
17
|
+
readonly START_AGENT_ACTIVITY: "start_agent_activity";
|
|
18
|
+
readonly RESUME_AGENT_ACTIVITY: "resume_agent_activity";
|
|
19
|
+
readonly PAUSE_AGENT_ACTIVITY: "pause_agent_activity";
|
|
20
|
+
readonly DRAIN_AGENT_ACTIVITY: "drain_agent_activity";
|
|
21
|
+
readonly ON_ENTER: "on_enter";
|
|
22
|
+
readonly ON_EXIT: "on_exit";
|
|
23
|
+
};
|
|
24
|
+
export declare const LIVEKIT_LOG_TYPE_BY_SPAN_NAME: Record<string, RespanLogType>;
|
|
25
|
+
export declare const LIVEKIT_INTERNAL_ACTIVITY_SPAN_NAMES: Set<string>;
|
|
26
|
+
export declare const LIVEKIT_SPAN_NAME_ATTRIBUTE = "livekit.span.name";
|
|
27
|
+
export declare const LK_SPEECH_ID = "lk.speech_id";
|
|
28
|
+
export declare const LK_AGENT_LABEL = "lk.agent_label";
|
|
29
|
+
export declare const LK_START_TIME = "lk.start_time";
|
|
30
|
+
export declare const LK_END_TIME = "lk.end_time";
|
|
31
|
+
export declare const LK_RETRY_COUNT = "lk.retry_count";
|
|
32
|
+
export declare const LK_PROVIDER_REQUEST_IDS = "lk.provider_request_ids";
|
|
33
|
+
export declare const LK_PARTICIPANT_ID = "lk.participant_id";
|
|
34
|
+
export declare const LK_PARTICIPANT_IDENTITY = "lk.participant_identity";
|
|
35
|
+
export declare const LK_PARTICIPANT_KIND = "lk.participant_kind";
|
|
36
|
+
export declare const LK_JOB_ID = "lk.job_id";
|
|
37
|
+
export declare const LK_AGENT_NAME = "lk.agent_name";
|
|
38
|
+
export declare const LK_ROOM_NAME = "lk.room_name";
|
|
39
|
+
export declare const LK_SESSION_OPTIONS = "lk.session_options";
|
|
40
|
+
export declare const LK_AGENT_TURN_ID = "lk.generation_id";
|
|
41
|
+
export declare const LK_AGENT_PARENT_TURN_ID = "lk.parent_generation_id";
|
|
42
|
+
export declare const LK_USER_INPUT = "lk.user_input";
|
|
43
|
+
export declare const LK_INSTRUCTIONS = "lk.instructions";
|
|
44
|
+
export declare const LK_SPEECH_INTERRUPTED = "lk.interrupted";
|
|
45
|
+
export declare const LK_CHAT_CTX = "lk.chat_ctx";
|
|
46
|
+
export declare const LK_FUNCTION_TOOLS = "lk.function_tools";
|
|
47
|
+
export declare const LK_PROVIDER_TOOLS = "lk.provider_tools";
|
|
48
|
+
export declare const LK_TOOL_SETS = "lk.tool_sets";
|
|
49
|
+
export declare const LK_RESPONSE_TEXT = "lk.response.text";
|
|
50
|
+
export declare const LK_RESPONSE_FUNCTION_CALLS = "lk.response.function_calls";
|
|
51
|
+
export declare const LK_RESPONSE_TTFT = "lk.response.ttft";
|
|
52
|
+
export declare const LK_FUNCTION_TOOL_ID = "lk.function_tool.id";
|
|
53
|
+
export declare const LK_FUNCTION_TOOL_NAME = "lk.function_tool.name";
|
|
54
|
+
export declare const LK_FUNCTION_TOOL_ARGS = "lk.function_tool.arguments";
|
|
55
|
+
export declare const LK_FUNCTION_TOOL_IS_ERROR = "lk.function_tool.is_error";
|
|
56
|
+
export declare const LK_FUNCTION_TOOL_OUTPUT = "lk.function_tool.output";
|
|
57
|
+
export declare const LK_TTS_INPUT_TEXT = "lk.input_text";
|
|
58
|
+
export declare const LK_TTS_STREAMING = "lk.tts.streaming";
|
|
59
|
+
export declare const LK_TTS_LABEL = "lk.tts.label";
|
|
60
|
+
export declare const LK_RESPONSE_TTFB = "lk.response.ttfb";
|
|
61
|
+
export declare const LK_EOU_PROBABILITY = "lk.eou.probability";
|
|
62
|
+
export declare const LK_EOU_UNLIKELY_THRESHOLD = "lk.eou.unlikely_threshold";
|
|
63
|
+
export declare const LK_EOU_DELAY = "lk.eou.endpointing_delay";
|
|
64
|
+
export declare const LK_EOU_LANGUAGE = "lk.eou.language";
|
|
65
|
+
export declare const LK_EOU_SOURCE = "lk.eou.source";
|
|
66
|
+
export declare const LK_EOU_FROM_CACHE = "lk.eou.from_cache";
|
|
67
|
+
export declare const LK_EOU_DETECTION_DELAY = "lk.eou.detection_delay";
|
|
68
|
+
export declare const LK_USER_TRANSCRIPT = "lk.user_transcript";
|
|
69
|
+
export declare const LK_TRANSCRIPT_CONFIDENCE = "lk.transcript_confidence";
|
|
70
|
+
export declare const LK_TRANSCRIPTION_DELAY = "lk.transcription_delay";
|
|
71
|
+
export declare const LK_END_OF_TURN_DELAY = "lk.end_of_turn_delay";
|
|
72
|
+
export declare const LK_AMD_CATEGORY = "lk.amd.category";
|
|
73
|
+
export declare const LK_AMD_REASON = "lk.amd.reason";
|
|
74
|
+
export declare const LK_AMD_IS_MACHINE = "lk.amd.is_machine";
|
|
75
|
+
export declare const LK_AMD_INTERRUPT_ON_MACHINE = "lk.amd.interrupt_on_machine";
|
|
76
|
+
export declare const LK_AMD_SPEECH_DURATION = "lk.amd.speech_duration";
|
|
77
|
+
export declare const LK_AMD_DELAY = "lk.amd.delay";
|
|
78
|
+
export declare const LK_AMD_TRANSCRIPT = "lk.amd.transcript";
|
|
79
|
+
export declare const LK_IS_INTERRUPTION = "lk.is_interruption";
|
|
80
|
+
export declare const LK_INTERRUPTION_PROBABILITY = "lk.interruption.probability";
|
|
81
|
+
export declare const LK_INTERRUPTION_TOTAL_DURATION = "lk.interruption.total_duration";
|
|
82
|
+
export declare const LK_INTERRUPTION_PREDICTION_DURATION = "lk.interruption.prediction_duration";
|
|
83
|
+
export declare const LK_INTERRUPTION_DETECTION_DELAY = "lk.interruption.detection_delay";
|
|
84
|
+
export declare const LK_LLM_METRICS = "lk.llm_metrics";
|
|
85
|
+
export declare const LK_TTS_METRICS = "lk.tts_metrics";
|
|
86
|
+
export declare const LK_REALTIME_MODEL_METRICS = "lk.realtime_model_metrics";
|
|
87
|
+
export declare const LK_E2E_LATENCY = "lk.e2e_latency";
|
|
88
|
+
export declare const LIVEKIT_RAW_ATTRIBUTE_PREFIX = "lk.";
|
|
89
|
+
export declare const OFF_CONTRACT_ALIAS_KEYS: readonly ["respan.span.tools", "respan.span.tool_calls", "respan.span.handoffs", "tools", "tool_calls", "model", "prompt_tokens", "completion_tokens", "total_request_tokens", "span_tools", "has_tool_calls", "parallel_tool_calls"];
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { RespanLogType } from "@respan/respan-sdk";
|
|
2
|
+
export const LIVEKIT_INSTRUMENTATION_NAME = "livekit";
|
|
3
|
+
export const LIVEKIT_INSTRUMENTATION_PACKAGE = "@respan/instrumentation-livekit";
|
|
4
|
+
export const LIVEKIT_LOG_METHOD_TS_TRACING = "ts_tracing";
|
|
5
|
+
export const LIVEKIT_SPAN_NAMES = {
|
|
6
|
+
AGENT_SESSION: "agent_session",
|
|
7
|
+
AGENT_TURN: "agent_turn",
|
|
8
|
+
USER_TURN: "user_turn",
|
|
9
|
+
LLM_NODE: "llm_node",
|
|
10
|
+
LLM_REQUEST: "llm_request",
|
|
11
|
+
LLM_REQUEST_RUN: "llm_request_run",
|
|
12
|
+
FUNCTION_TOOL: "function_tool",
|
|
13
|
+
TTS_NODE: "tts_node",
|
|
14
|
+
TTS_REQUEST: "tts_request",
|
|
15
|
+
TTS_REQUEST_RUN: "tts_request_run",
|
|
16
|
+
AGENT_SPEAKING: "agent_speaking",
|
|
17
|
+
START_AGENT_ACTIVITY: "start_agent_activity",
|
|
18
|
+
RESUME_AGENT_ACTIVITY: "resume_agent_activity",
|
|
19
|
+
PAUSE_AGENT_ACTIVITY: "pause_agent_activity",
|
|
20
|
+
DRAIN_AGENT_ACTIVITY: "drain_agent_activity",
|
|
21
|
+
ON_ENTER: "on_enter",
|
|
22
|
+
ON_EXIT: "on_exit",
|
|
23
|
+
};
|
|
24
|
+
export const LIVEKIT_LOG_TYPE_BY_SPAN_NAME = {
|
|
25
|
+
[LIVEKIT_SPAN_NAMES.AGENT_SESSION]: RespanLogType.WORKFLOW,
|
|
26
|
+
[LIVEKIT_SPAN_NAMES.AGENT_TURN]: RespanLogType.AGENT,
|
|
27
|
+
[LIVEKIT_SPAN_NAMES.USER_TURN]: RespanLogType.TASK,
|
|
28
|
+
[LIVEKIT_SPAN_NAMES.LLM_NODE]: RespanLogType.CHAT,
|
|
29
|
+
[LIVEKIT_SPAN_NAMES.LLM_REQUEST]: RespanLogType.CHAT,
|
|
30
|
+
[LIVEKIT_SPAN_NAMES.LLM_REQUEST_RUN]: RespanLogType.TASK,
|
|
31
|
+
[LIVEKIT_SPAN_NAMES.FUNCTION_TOOL]: RespanLogType.TOOL,
|
|
32
|
+
[LIVEKIT_SPAN_NAMES.TTS_NODE]: RespanLogType.TEXT,
|
|
33
|
+
[LIVEKIT_SPAN_NAMES.TTS_REQUEST]: RespanLogType.TEXT,
|
|
34
|
+
[LIVEKIT_SPAN_NAMES.TTS_REQUEST_RUN]: RespanLogType.TASK,
|
|
35
|
+
[LIVEKIT_SPAN_NAMES.AGENT_SPEAKING]: RespanLogType.TASK,
|
|
36
|
+
};
|
|
37
|
+
export const LIVEKIT_INTERNAL_ACTIVITY_SPAN_NAMES = new Set([
|
|
38
|
+
LIVEKIT_SPAN_NAMES.START_AGENT_ACTIVITY,
|
|
39
|
+
LIVEKIT_SPAN_NAMES.RESUME_AGENT_ACTIVITY,
|
|
40
|
+
LIVEKIT_SPAN_NAMES.PAUSE_AGENT_ACTIVITY,
|
|
41
|
+
LIVEKIT_SPAN_NAMES.DRAIN_AGENT_ACTIVITY,
|
|
42
|
+
LIVEKIT_SPAN_NAMES.ON_ENTER,
|
|
43
|
+
LIVEKIT_SPAN_NAMES.ON_EXIT,
|
|
44
|
+
]);
|
|
45
|
+
export const LIVEKIT_SPAN_NAME_ATTRIBUTE = "livekit.span.name";
|
|
46
|
+
export const LK_SPEECH_ID = "lk.speech_id";
|
|
47
|
+
export const LK_AGENT_LABEL = "lk.agent_label";
|
|
48
|
+
export const LK_START_TIME = "lk.start_time";
|
|
49
|
+
export const LK_END_TIME = "lk.end_time";
|
|
50
|
+
export const LK_RETRY_COUNT = "lk.retry_count";
|
|
51
|
+
export const LK_PROVIDER_REQUEST_IDS = "lk.provider_request_ids";
|
|
52
|
+
export const LK_PARTICIPANT_ID = "lk.participant_id";
|
|
53
|
+
export const LK_PARTICIPANT_IDENTITY = "lk.participant_identity";
|
|
54
|
+
export const LK_PARTICIPANT_KIND = "lk.participant_kind";
|
|
55
|
+
export const LK_JOB_ID = "lk.job_id";
|
|
56
|
+
export const LK_AGENT_NAME = "lk.agent_name";
|
|
57
|
+
export const LK_ROOM_NAME = "lk.room_name";
|
|
58
|
+
export const LK_SESSION_OPTIONS = "lk.session_options";
|
|
59
|
+
export const LK_AGENT_TURN_ID = "lk.generation_id";
|
|
60
|
+
export const LK_AGENT_PARENT_TURN_ID = "lk.parent_generation_id";
|
|
61
|
+
export const LK_USER_INPUT = "lk.user_input";
|
|
62
|
+
export const LK_INSTRUCTIONS = "lk.instructions";
|
|
63
|
+
export const LK_SPEECH_INTERRUPTED = "lk.interrupted";
|
|
64
|
+
export const LK_CHAT_CTX = "lk.chat_ctx";
|
|
65
|
+
export const LK_FUNCTION_TOOLS = "lk.function_tools";
|
|
66
|
+
export const LK_PROVIDER_TOOLS = "lk.provider_tools";
|
|
67
|
+
export const LK_TOOL_SETS = "lk.tool_sets";
|
|
68
|
+
export const LK_RESPONSE_TEXT = "lk.response.text";
|
|
69
|
+
export const LK_RESPONSE_FUNCTION_CALLS = "lk.response.function_calls";
|
|
70
|
+
export const LK_RESPONSE_TTFT = "lk.response.ttft";
|
|
71
|
+
export const LK_FUNCTION_TOOL_ID = "lk.function_tool.id";
|
|
72
|
+
export const LK_FUNCTION_TOOL_NAME = "lk.function_tool.name";
|
|
73
|
+
export const LK_FUNCTION_TOOL_ARGS = "lk.function_tool.arguments";
|
|
74
|
+
export const LK_FUNCTION_TOOL_IS_ERROR = "lk.function_tool.is_error";
|
|
75
|
+
export const LK_FUNCTION_TOOL_OUTPUT = "lk.function_tool.output";
|
|
76
|
+
export const LK_TTS_INPUT_TEXT = "lk.input_text";
|
|
77
|
+
export const LK_TTS_STREAMING = "lk.tts.streaming";
|
|
78
|
+
export const LK_TTS_LABEL = "lk.tts.label";
|
|
79
|
+
export const LK_RESPONSE_TTFB = "lk.response.ttfb";
|
|
80
|
+
export const LK_EOU_PROBABILITY = "lk.eou.probability";
|
|
81
|
+
export const LK_EOU_UNLIKELY_THRESHOLD = "lk.eou.unlikely_threshold";
|
|
82
|
+
export const LK_EOU_DELAY = "lk.eou.endpointing_delay";
|
|
83
|
+
export const LK_EOU_LANGUAGE = "lk.eou.language";
|
|
84
|
+
export const LK_EOU_SOURCE = "lk.eou.source";
|
|
85
|
+
export const LK_EOU_FROM_CACHE = "lk.eou.from_cache";
|
|
86
|
+
export const LK_EOU_DETECTION_DELAY = "lk.eou.detection_delay";
|
|
87
|
+
export const LK_USER_TRANSCRIPT = "lk.user_transcript";
|
|
88
|
+
export const LK_TRANSCRIPT_CONFIDENCE = "lk.transcript_confidence";
|
|
89
|
+
export const LK_TRANSCRIPTION_DELAY = "lk.transcription_delay";
|
|
90
|
+
export const LK_END_OF_TURN_DELAY = "lk.end_of_turn_delay";
|
|
91
|
+
export const LK_AMD_CATEGORY = "lk.amd.category";
|
|
92
|
+
export const LK_AMD_REASON = "lk.amd.reason";
|
|
93
|
+
export const LK_AMD_IS_MACHINE = "lk.amd.is_machine";
|
|
94
|
+
export const LK_AMD_INTERRUPT_ON_MACHINE = "lk.amd.interrupt_on_machine";
|
|
95
|
+
export const LK_AMD_SPEECH_DURATION = "lk.amd.speech_duration";
|
|
96
|
+
export const LK_AMD_DELAY = "lk.amd.delay";
|
|
97
|
+
export const LK_AMD_TRANSCRIPT = "lk.amd.transcript";
|
|
98
|
+
export const LK_IS_INTERRUPTION = "lk.is_interruption";
|
|
99
|
+
export const LK_INTERRUPTION_PROBABILITY = "lk.interruption.probability";
|
|
100
|
+
export const LK_INTERRUPTION_TOTAL_DURATION = "lk.interruption.total_duration";
|
|
101
|
+
export const LK_INTERRUPTION_PREDICTION_DURATION = "lk.interruption.prediction_duration";
|
|
102
|
+
export const LK_INTERRUPTION_DETECTION_DELAY = "lk.interruption.detection_delay";
|
|
103
|
+
export const LK_LLM_METRICS = "lk.llm_metrics";
|
|
104
|
+
export const LK_TTS_METRICS = "lk.tts_metrics";
|
|
105
|
+
export const LK_REALTIME_MODEL_METRICS = "lk.realtime_model_metrics";
|
|
106
|
+
export const LK_E2E_LATENCY = "lk.e2e_latency";
|
|
107
|
+
export const LIVEKIT_RAW_ATTRIBUTE_PREFIX = "lk.";
|
|
108
|
+
export const OFF_CONTRACT_ALIAS_KEYS = [
|
|
109
|
+
"respan.span.tools",
|
|
110
|
+
"respan.span.tool_calls",
|
|
111
|
+
"respan.span.handoffs",
|
|
112
|
+
"tools",
|
|
113
|
+
"tool_calls",
|
|
114
|
+
"model",
|
|
115
|
+
"prompt_tokens",
|
|
116
|
+
"completion_tokens",
|
|
117
|
+
"total_request_tokens",
|
|
118
|
+
"span_tools",
|
|
119
|
+
"has_tool_calls",
|
|
120
|
+
"parallel_tool_calls",
|
|
121
|
+
];
|
|
122
|
+
//# sourceMappingURL=_constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_constants.js","sourceRoot":"","sources":["../src/_constants.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Span } from "@opentelemetry/api";
|
|
2
|
+
export type MutableAttributes = Record<string, unknown>;
|
|
3
|
+
export interface TranslateLiveKitSpanOptions {
|
|
4
|
+
attributes?: MutableAttributes;
|
|
5
|
+
spanName?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function translateLiveKitSpan(span: Span, options?: TranslateLiveKitSpanOptions): void;
|
|
8
|
+
export declare function isLiveKitSpan(spanName: string, attrs: MutableAttributes): boolean;
|
|
9
|
+
export declare function getSpanAttributes(span: Span): MutableAttributes;
|
|
10
|
+
export declare function safeJson(value: unknown): string;
|
|
@@ -0,0 +1,445 @@
|
|
|
1
|
+
import { ATTR_GEN_AI_COMPLETION, ATTR_GEN_AI_PROMPT, ATTR_GEN_AI_PROVIDER_NAME, ATTR_GEN_AI_REQUEST_MODEL, ATTR_GEN_AI_SYSTEM, ATTR_GEN_AI_USAGE_COMPLETION_TOKENS, ATTR_GEN_AI_USAGE_INPUT_TOKENS, ATTR_GEN_AI_USAGE_OUTPUT_TOKENS, ATTR_GEN_AI_USAGE_PROMPT_TOKENS, } from "@opentelemetry/semantic-conventions/incubating";
|
|
2
|
+
import { RespanLogType, RespanSpanAttributes } from "@respan/respan-sdk";
|
|
3
|
+
import { SpanAttributes } from "@traceloop/ai-semantic-conventions";
|
|
4
|
+
import { LIVEKIT_LOG_METHOD_TS_TRACING, LIVEKIT_LOG_TYPE_BY_SPAN_NAME, LIVEKIT_INTERNAL_ACTIVITY_SPAN_NAMES, LIVEKIT_RAW_ATTRIBUTE_PREFIX, LIVEKIT_SPAN_NAME_ATTRIBUTE, LIVEKIT_SPAN_NAMES, LK_AGENT_LABEL, LK_AGENT_NAME, LK_AGENT_PARENT_TURN_ID, LK_AGENT_TURN_ID, LK_AMD_CATEGORY, LK_AMD_DELAY, LK_AMD_INTERRUPT_ON_MACHINE, LK_AMD_IS_MACHINE, LK_AMD_REASON, LK_AMD_SPEECH_DURATION, LK_AMD_TRANSCRIPT, LK_CHAT_CTX, LK_END_OF_TURN_DELAY, LK_E2E_LATENCY, LK_EOU_DELAY, LK_EOU_DETECTION_DELAY, LK_EOU_FROM_CACHE, LK_EOU_LANGUAGE, LK_EOU_PROBABILITY, LK_EOU_SOURCE, LK_EOU_UNLIKELY_THRESHOLD, LK_FUNCTION_TOOL_ARGS, LK_FUNCTION_TOOL_ID, LK_FUNCTION_TOOL_IS_ERROR, LK_FUNCTION_TOOL_NAME, LK_FUNCTION_TOOL_OUTPUT, LK_FUNCTION_TOOLS, LK_INSTRUCTIONS, LK_INTERRUPTION_DETECTION_DELAY, LK_INTERRUPTION_PREDICTION_DURATION, LK_INTERRUPTION_PROBABILITY, LK_INTERRUPTION_TOTAL_DURATION, LK_IS_INTERRUPTION, LK_JOB_ID, LK_LLM_METRICS, LK_PARTICIPANT_ID, LK_PARTICIPANT_IDENTITY, LK_PARTICIPANT_KIND, LK_PROVIDER_REQUEST_IDS, LK_PROVIDER_TOOLS, LK_REALTIME_MODEL_METRICS, LK_RESPONSE_FUNCTION_CALLS, LK_RESPONSE_TEXT, LK_RESPONSE_TTFB, LK_RESPONSE_TTFT, LK_RETRY_COUNT, LK_ROOM_NAME, LK_SESSION_OPTIONS, LK_SPEECH_ID, LK_SPEECH_INTERRUPTED, LK_TOOL_SETS, LK_TRANSCRIPT_CONFIDENCE, LK_TRANSCRIPTION_DELAY, LK_TTS_INPUT_TEXT, LK_TTS_LABEL, LK_TTS_METRICS, LK_TTS_STREAMING, LK_USER_INPUT, LK_USER_TRANSCRIPT, OFF_CONTRACT_ALIAS_KEYS, } from "./_constants.js";
|
|
5
|
+
const GEN_AI_COMPLETION_PREFIX = `${ATTR_GEN_AI_COMPLETION}.0`;
|
|
6
|
+
const GEN_AI_COMPLETION_ROLE = `${GEN_AI_COMPLETION_PREFIX}.role`;
|
|
7
|
+
const GEN_AI_COMPLETION_CONTENT = `${GEN_AI_COMPLETION_PREFIX}.content`;
|
|
8
|
+
const GEN_AI_COMPLETION_TOOL_CALLS = `${GEN_AI_COMPLETION_PREFIX}.tool_calls`;
|
|
9
|
+
const LLM_USAGE_CACHE_READ_INPUT_TOKENS = "llm.usage.cache_read_input_tokens";
|
|
10
|
+
export function translateLiveKitSpan(span, options = {}) {
|
|
11
|
+
const attrs = options.attributes ?? getSpanAttributes(span);
|
|
12
|
+
const spanName = options.spanName ?? getSpanName(span, attrs);
|
|
13
|
+
if (LIVEKIT_INTERNAL_ACTIVITY_SPAN_NAMES.has(spanName)) {
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
if (!isLiveKitSpan(spanName, attrs)) {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
const logType = resolveLogType(spanName, attrs);
|
|
20
|
+
setAttr(span, attrs, LIVEKIT_SPAN_NAME_ATTRIBUTE, spanName);
|
|
21
|
+
setAttr(span, attrs, RespanSpanAttributes.RESPAN_LOG_METHOD, LIVEKIT_LOG_METHOD_TS_TRACING);
|
|
22
|
+
setAttr(span, attrs, RespanSpanAttributes.RESPAN_LOG_TYPE, logType);
|
|
23
|
+
const entityName = resolveEntityName(spanName, attrs);
|
|
24
|
+
setAttr(span, attrs, SpanAttributes.TRACELOOP_ENTITY_NAME, entityName);
|
|
25
|
+
setAttr(span, attrs, SpanAttributes.TRACELOOP_ENTITY_PATH, spanName || entityName);
|
|
26
|
+
setAttr(span, attrs, SpanAttributes.TRACELOOP_ENTITY_INPUT, safeJson(buildEntityInput(spanName, attrs)));
|
|
27
|
+
setAttr(span, attrs, SpanAttributes.TRACELOOP_ENTITY_OUTPUT, safeJson(buildEntityOutput(spanName, attrs)));
|
|
28
|
+
if (logType === RespanLogType.WORKFLOW) {
|
|
29
|
+
setAttr(span, attrs, SpanAttributes.TRACELOOP_WORKFLOW_NAME, entityName);
|
|
30
|
+
}
|
|
31
|
+
if (logType === RespanLogType.CHAT) {
|
|
32
|
+
addChatAttributes(span, attrs, spanName);
|
|
33
|
+
}
|
|
34
|
+
else if (logType === RespanLogType.TEXT) {
|
|
35
|
+
addTextModelAttributes(span, attrs);
|
|
36
|
+
}
|
|
37
|
+
for (const key of OFF_CONTRACT_ALIAS_KEYS) {
|
|
38
|
+
delete attrs[key];
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export function isLiveKitSpan(spanName, attrs) {
|
|
42
|
+
if (spanName in LIVEKIT_LOG_TYPE_BY_SPAN_NAME) {
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
return Object.keys(attrs).some((key) => key.startsWith(LIVEKIT_RAW_ATTRIBUTE_PREFIX));
|
|
46
|
+
}
|
|
47
|
+
export function getSpanAttributes(span) {
|
|
48
|
+
const maybeAttrs = span.attributes;
|
|
49
|
+
if (maybeAttrs && typeof maybeAttrs === "object") {
|
|
50
|
+
return maybeAttrs;
|
|
51
|
+
}
|
|
52
|
+
return {};
|
|
53
|
+
}
|
|
54
|
+
function getSpanName(span, attrs) {
|
|
55
|
+
const explicit = attrs[LIVEKIT_SPAN_NAME_ATTRIBUTE];
|
|
56
|
+
if (typeof explicit === "string" && explicit) {
|
|
57
|
+
return explicit;
|
|
58
|
+
}
|
|
59
|
+
return String(span.name ?? "livekit.span");
|
|
60
|
+
}
|
|
61
|
+
function resolveLogType(spanName, attrs) {
|
|
62
|
+
if (spanName in LIVEKIT_LOG_TYPE_BY_SPAN_NAME) {
|
|
63
|
+
return LIVEKIT_LOG_TYPE_BY_SPAN_NAME[spanName];
|
|
64
|
+
}
|
|
65
|
+
if (attrs[LK_FUNCTION_TOOL_NAME] !== undefined) {
|
|
66
|
+
return RespanLogType.TOOL;
|
|
67
|
+
}
|
|
68
|
+
if (attrs[LK_CHAT_CTX] !== undefined || attrs[LK_LLM_METRICS] !== undefined) {
|
|
69
|
+
return RespanLogType.CHAT;
|
|
70
|
+
}
|
|
71
|
+
if (attrs[LK_TTS_METRICS] !== undefined || attrs[LK_TTS_INPUT_TEXT] !== undefined) {
|
|
72
|
+
return RespanLogType.TEXT;
|
|
73
|
+
}
|
|
74
|
+
return RespanLogType.TASK;
|
|
75
|
+
}
|
|
76
|
+
function resolveEntityName(spanName, attrs) {
|
|
77
|
+
const agentLabel = stringAttr(attrs, LK_AGENT_LABEL) ?? stringAttr(attrs, LK_AGENT_NAME);
|
|
78
|
+
if (spanName === LIVEKIT_SPAN_NAMES.AGENT_SESSION) {
|
|
79
|
+
return agentLabel ? `${agentLabel}.session` : "livekit.agent_session";
|
|
80
|
+
}
|
|
81
|
+
if (spanName === LIVEKIT_SPAN_NAMES.AGENT_TURN) {
|
|
82
|
+
return agentLabel ? `${agentLabel}.turn` : "livekit.agent_turn";
|
|
83
|
+
}
|
|
84
|
+
if (spanName === LIVEKIT_SPAN_NAMES.FUNCTION_TOOL) {
|
|
85
|
+
return stringAttr(attrs, LK_FUNCTION_TOOL_NAME) ?? "livekit.function_tool";
|
|
86
|
+
}
|
|
87
|
+
if (spanName === LIVEKIT_SPAN_NAMES.LLM_NODE || spanName === LIVEKIT_SPAN_NAMES.LLM_REQUEST) {
|
|
88
|
+
const provider = providerName(attrs);
|
|
89
|
+
const model = stringAttr(attrs, ATTR_GEN_AI_REQUEST_MODEL);
|
|
90
|
+
if (provider && model) {
|
|
91
|
+
return `${provider}.${model}`;
|
|
92
|
+
}
|
|
93
|
+
return "livekit.llm";
|
|
94
|
+
}
|
|
95
|
+
if (spanName === LIVEKIT_SPAN_NAMES.TTS_NODE || spanName === LIVEKIT_SPAN_NAMES.TTS_REQUEST) {
|
|
96
|
+
return stringAttr(attrs, LK_TTS_LABEL) ?? "livekit.tts";
|
|
97
|
+
}
|
|
98
|
+
if (spanName === LIVEKIT_SPAN_NAMES.USER_TURN) {
|
|
99
|
+
return stringAttr(attrs, LK_PARTICIPANT_IDENTITY) ?? "livekit.user_turn";
|
|
100
|
+
}
|
|
101
|
+
return agentLabel ? `${agentLabel}.${spanName}` : `livekit.${spanName || "span"}`;
|
|
102
|
+
}
|
|
103
|
+
function buildEntityInput(spanName, attrs) {
|
|
104
|
+
if (spanName === LIVEKIT_SPAN_NAMES.FUNCTION_TOOL) {
|
|
105
|
+
return {
|
|
106
|
+
name: stringAttr(attrs, LK_FUNCTION_TOOL_NAME),
|
|
107
|
+
arguments: parseMaybeJson(attrs[LK_FUNCTION_TOOL_ARGS]),
|
|
108
|
+
id: stringAttr(attrs, LK_FUNCTION_TOOL_ID),
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
if (spanName === LIVEKIT_SPAN_NAMES.LLM_NODE || spanName === LIVEKIT_SPAN_NAMES.LLM_REQUEST) {
|
|
112
|
+
return {
|
|
113
|
+
chat_ctx: parseMaybeJson(attrs[LK_CHAT_CTX]),
|
|
114
|
+
function_tools: parseMaybeJson(attrs[LK_FUNCTION_TOOLS]),
|
|
115
|
+
provider_tools: parseMaybeJson(attrs[LK_PROVIDER_TOOLS]),
|
|
116
|
+
tool_sets: parseMaybeJson(attrs[LK_TOOL_SETS]),
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
if (spanName === LIVEKIT_SPAN_NAMES.TTS_NODE || spanName === LIVEKIT_SPAN_NAMES.TTS_REQUEST) {
|
|
120
|
+
return {
|
|
121
|
+
text: stringAttr(attrs, LK_TTS_INPUT_TEXT),
|
|
122
|
+
streaming: attrs[LK_TTS_STREAMING],
|
|
123
|
+
label: stringAttr(attrs, LK_TTS_LABEL),
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
if (spanName === LIVEKIT_SPAN_NAMES.AGENT_TURN) {
|
|
127
|
+
return compactRecord({
|
|
128
|
+
speech_id: attrs[LK_SPEECH_ID],
|
|
129
|
+
user_input: attrs[LK_USER_INPUT],
|
|
130
|
+
instructions: attrs[LK_INSTRUCTIONS],
|
|
131
|
+
generation_id: attrs[LK_AGENT_TURN_ID],
|
|
132
|
+
parent_generation_id: attrs[LK_AGENT_PARENT_TURN_ID],
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
return compactRecord({
|
|
136
|
+
agent_label: attrs[LK_AGENT_LABEL],
|
|
137
|
+
job_id: attrs[LK_JOB_ID],
|
|
138
|
+
room_name: attrs[LK_ROOM_NAME],
|
|
139
|
+
session_options: parseMaybeJson(attrs[LK_SESSION_OPTIONS]),
|
|
140
|
+
participant_id: attrs[LK_PARTICIPANT_ID],
|
|
141
|
+
participant_identity: attrs[LK_PARTICIPANT_IDENTITY],
|
|
142
|
+
participant_kind: attrs[LK_PARTICIPANT_KIND],
|
|
143
|
+
retry_count: attrs[LK_RETRY_COUNT],
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
function buildEntityOutput(spanName, attrs) {
|
|
147
|
+
if (spanName === LIVEKIT_SPAN_NAMES.FUNCTION_TOOL) {
|
|
148
|
+
return compactRecord({
|
|
149
|
+
output: parseMaybeJson(attrs[LK_FUNCTION_TOOL_OUTPUT]),
|
|
150
|
+
is_error: attrs[LK_FUNCTION_TOOL_IS_ERROR],
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
if (spanName === LIVEKIT_SPAN_NAMES.LLM_NODE || spanName === LIVEKIT_SPAN_NAMES.LLM_REQUEST) {
|
|
154
|
+
return compactRecord({
|
|
155
|
+
text: attrs[LK_RESPONSE_TEXT],
|
|
156
|
+
function_calls: parseMaybeJson(attrs[LK_RESPONSE_FUNCTION_CALLS]),
|
|
157
|
+
ttft: attrs[LK_RESPONSE_TTFT],
|
|
158
|
+
metrics: parseMaybeJson(attrs[LK_LLM_METRICS]),
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
if (spanName === LIVEKIT_SPAN_NAMES.TTS_NODE || spanName === LIVEKIT_SPAN_NAMES.TTS_REQUEST) {
|
|
162
|
+
return compactRecord({
|
|
163
|
+
metrics: parseMaybeJson(attrs[LK_TTS_METRICS]),
|
|
164
|
+
ttfb: attrs[LK_RESPONSE_TTFB],
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
if (spanName === LIVEKIT_SPAN_NAMES.USER_TURN) {
|
|
168
|
+
return compactRecord({
|
|
169
|
+
transcript: attrs[LK_USER_TRANSCRIPT],
|
|
170
|
+
confidence: attrs[LK_TRANSCRIPT_CONFIDENCE],
|
|
171
|
+
transcription_delay: attrs[LK_TRANSCRIPTION_DELAY],
|
|
172
|
+
end_of_turn_delay: attrs[LK_END_OF_TURN_DELAY],
|
|
173
|
+
provider_request_ids: attrs[LK_PROVIDER_REQUEST_IDS],
|
|
174
|
+
eou: compactRecord({
|
|
175
|
+
probability: attrs[LK_EOU_PROBABILITY],
|
|
176
|
+
unlikely_threshold: attrs[LK_EOU_UNLIKELY_THRESHOLD],
|
|
177
|
+
delay: attrs[LK_EOU_DELAY],
|
|
178
|
+
language: attrs[LK_EOU_LANGUAGE],
|
|
179
|
+
source: attrs[LK_EOU_SOURCE],
|
|
180
|
+
from_cache: attrs[LK_EOU_FROM_CACHE],
|
|
181
|
+
detection_delay: attrs[LK_EOU_DETECTION_DELAY],
|
|
182
|
+
}),
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
return compactRecord({
|
|
186
|
+
response_text: attrs[LK_RESPONSE_TEXT],
|
|
187
|
+
interrupted: attrs[LK_SPEECH_INTERRUPTED],
|
|
188
|
+
e2e_latency: attrs[LK_E2E_LATENCY],
|
|
189
|
+
amd: compactRecord({
|
|
190
|
+
category: attrs[LK_AMD_CATEGORY],
|
|
191
|
+
reason: attrs[LK_AMD_REASON],
|
|
192
|
+
is_machine: attrs[LK_AMD_IS_MACHINE],
|
|
193
|
+
interrupt_on_machine: attrs[LK_AMD_INTERRUPT_ON_MACHINE],
|
|
194
|
+
speech_duration: attrs[LK_AMD_SPEECH_DURATION],
|
|
195
|
+
delay: attrs[LK_AMD_DELAY],
|
|
196
|
+
transcript: attrs[LK_AMD_TRANSCRIPT],
|
|
197
|
+
}),
|
|
198
|
+
interruption: compactRecord({
|
|
199
|
+
is_interruption: attrs[LK_IS_INTERRUPTION],
|
|
200
|
+
probability: attrs[LK_INTERRUPTION_PROBABILITY],
|
|
201
|
+
total_duration: attrs[LK_INTERRUPTION_TOTAL_DURATION],
|
|
202
|
+
prediction_duration: attrs[LK_INTERRUPTION_PREDICTION_DURATION],
|
|
203
|
+
detection_delay: attrs[LK_INTERRUPTION_DETECTION_DELAY],
|
|
204
|
+
}),
|
|
205
|
+
realtime_model_metrics: parseMaybeJson(attrs[LK_REALTIME_MODEL_METRICS]),
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
function addChatAttributes(span, attrs, spanName) {
|
|
209
|
+
const provider = providerName(attrs);
|
|
210
|
+
const model = stringAttr(attrs, ATTR_GEN_AI_REQUEST_MODEL);
|
|
211
|
+
if (provider) {
|
|
212
|
+
setAttr(span, attrs, ATTR_GEN_AI_PROVIDER_NAME, provider);
|
|
213
|
+
setAttr(span, attrs, ATTR_GEN_AI_SYSTEM, normalizeProvider(provider));
|
|
214
|
+
}
|
|
215
|
+
if (model) {
|
|
216
|
+
setAttr(span, attrs, ATTR_GEN_AI_REQUEST_MODEL, model);
|
|
217
|
+
}
|
|
218
|
+
setAttr(span, attrs, SpanAttributes.LLM_REQUEST_TYPE, "chat");
|
|
219
|
+
const inputTokens = numberAttr(attrs, ATTR_GEN_AI_USAGE_INPUT_TOKENS);
|
|
220
|
+
const outputTokens = numberAttr(attrs, ATTR_GEN_AI_USAGE_OUTPUT_TOKENS);
|
|
221
|
+
if (inputTokens !== undefined) {
|
|
222
|
+
setAttr(span, attrs, ATTR_GEN_AI_USAGE_PROMPT_TOKENS, inputTokens);
|
|
223
|
+
setAttr(span, attrs, SpanAttributes.LLM_USAGE_PROMPT_TOKENS, inputTokens);
|
|
224
|
+
}
|
|
225
|
+
if (outputTokens !== undefined) {
|
|
226
|
+
setAttr(span, attrs, ATTR_GEN_AI_USAGE_COMPLETION_TOKENS, outputTokens);
|
|
227
|
+
setAttr(span, attrs, SpanAttributes.LLM_USAGE_COMPLETION_TOKENS, outputTokens);
|
|
228
|
+
}
|
|
229
|
+
const metrics = parseMaybeJson(attrs[LK_LLM_METRICS]);
|
|
230
|
+
const totalTokens = numberAttr(attrs, SpanAttributes.LLM_USAGE_TOTAL_TOKENS)
|
|
231
|
+
?? asNumber(metrics?.totalTokens)
|
|
232
|
+
?? (inputTokens !== undefined || outputTokens !== undefined
|
|
233
|
+
? (inputTokens ?? 0) + (outputTokens ?? 0)
|
|
234
|
+
: undefined);
|
|
235
|
+
if (totalTokens !== undefined) {
|
|
236
|
+
setAttr(span, attrs, SpanAttributes.LLM_USAGE_TOTAL_TOKENS, totalTokens);
|
|
237
|
+
}
|
|
238
|
+
const cachedTokens = asNumber(metrics?.promptCachedTokens);
|
|
239
|
+
if (cachedTokens !== undefined) {
|
|
240
|
+
setAttr(span, attrs, LLM_USAGE_CACHE_READ_INPUT_TOKENS, cachedTokens);
|
|
241
|
+
}
|
|
242
|
+
const chatCtx = parseMaybeJson(attrs[LK_CHAT_CTX]);
|
|
243
|
+
addPromptAttributes(span, attrs, chatCtx);
|
|
244
|
+
addToolDefinitionAttributes(span, attrs);
|
|
245
|
+
addCompletionAttributes(span, attrs, spanName);
|
|
246
|
+
}
|
|
247
|
+
function addTextModelAttributes(span, attrs) {
|
|
248
|
+
const provider = providerName(attrs);
|
|
249
|
+
const model = stringAttr(attrs, ATTR_GEN_AI_REQUEST_MODEL);
|
|
250
|
+
if (provider) {
|
|
251
|
+
setAttr(span, attrs, ATTR_GEN_AI_PROVIDER_NAME, provider);
|
|
252
|
+
setAttr(span, attrs, ATTR_GEN_AI_SYSTEM, normalizeProvider(provider));
|
|
253
|
+
}
|
|
254
|
+
if (model) {
|
|
255
|
+
setAttr(span, attrs, ATTR_GEN_AI_REQUEST_MODEL, model);
|
|
256
|
+
}
|
|
257
|
+
const metrics = parseMaybeJson(attrs[LK_TTS_METRICS]);
|
|
258
|
+
const inputTokens = asNumber(metrics?.inputTokens);
|
|
259
|
+
const outputTokens = asNumber(metrics?.outputTokens);
|
|
260
|
+
if (inputTokens !== undefined) {
|
|
261
|
+
setAttr(span, attrs, ATTR_GEN_AI_USAGE_INPUT_TOKENS, inputTokens);
|
|
262
|
+
setAttr(span, attrs, ATTR_GEN_AI_USAGE_PROMPT_TOKENS, inputTokens);
|
|
263
|
+
}
|
|
264
|
+
if (outputTokens !== undefined) {
|
|
265
|
+
setAttr(span, attrs, ATTR_GEN_AI_USAGE_OUTPUT_TOKENS, outputTokens);
|
|
266
|
+
setAttr(span, attrs, ATTR_GEN_AI_USAGE_COMPLETION_TOKENS, outputTokens);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
function addPromptAttributes(span, attrs, chatCtx) {
|
|
270
|
+
const items = Array.isArray(chatCtx?.items) ? chatCtx.items : [];
|
|
271
|
+
let promptIndex = 0;
|
|
272
|
+
for (const item of items) {
|
|
273
|
+
const normalized = normalizePromptItem(item);
|
|
274
|
+
if (!normalized) {
|
|
275
|
+
continue;
|
|
276
|
+
}
|
|
277
|
+
const prefix = `${ATTR_GEN_AI_PROMPT}.${promptIndex}`;
|
|
278
|
+
setAttr(span, attrs, `${prefix}.role`, normalized.role);
|
|
279
|
+
setAttr(span, attrs, `${prefix}.content`, normalized.content);
|
|
280
|
+
if (normalized.tool_calls !== undefined) {
|
|
281
|
+
setAttr(span, attrs, `${prefix}.tool_calls`, safeJson(normalized.tool_calls));
|
|
282
|
+
}
|
|
283
|
+
promptIndex += 1;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
function addToolDefinitionAttributes(span, attrs) {
|
|
287
|
+
const toolNames = parseMaybeJson(attrs[LK_FUNCTION_TOOLS]);
|
|
288
|
+
if (!Array.isArray(toolNames) || toolNames.length === 0) {
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
const toolDefinitions = toolNames.map((toolName) => ({
|
|
292
|
+
type: "function",
|
|
293
|
+
function: {
|
|
294
|
+
name: String(toolName),
|
|
295
|
+
},
|
|
296
|
+
}));
|
|
297
|
+
setAttr(span, attrs, SpanAttributes.LLM_REQUEST_FUNCTIONS, safeJson(toolDefinitions));
|
|
298
|
+
}
|
|
299
|
+
function addCompletionAttributes(span, attrs, spanName) {
|
|
300
|
+
const responseText = stringAttr(attrs, LK_RESPONSE_TEXT);
|
|
301
|
+
const rawCalls = parseMaybeJson(attrs[LK_RESPONSE_FUNCTION_CALLS]);
|
|
302
|
+
const toolCalls = normalizeToolCalls(rawCalls);
|
|
303
|
+
if (responseText === undefined && toolCalls.length === 0 && spanName !== LIVEKIT_SPAN_NAMES.LLM_NODE) {
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
setAttr(span, attrs, GEN_AI_COMPLETION_ROLE, "assistant");
|
|
307
|
+
setAttr(span, attrs, GEN_AI_COMPLETION_CONTENT, responseText ?? "");
|
|
308
|
+
if (toolCalls.length > 0) {
|
|
309
|
+
setAttr(span, attrs, GEN_AI_COMPLETION_TOOL_CALLS, safeJson(toolCalls));
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
function normalizePromptItem(item) {
|
|
313
|
+
if (item.type === "message") {
|
|
314
|
+
return {
|
|
315
|
+
role: item.role ?? "user",
|
|
316
|
+
content: contentToText(item.content ?? item.text ?? ""),
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
if (item.type === "function_call") {
|
|
320
|
+
return {
|
|
321
|
+
role: "assistant",
|
|
322
|
+
content: "",
|
|
323
|
+
tool_calls: normalizeToolCalls([item]),
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
if (item.type === "function_call_output") {
|
|
327
|
+
return {
|
|
328
|
+
role: "tool",
|
|
329
|
+
content: contentToText(item.output ?? ""),
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
return undefined;
|
|
333
|
+
}
|
|
334
|
+
function normalizeToolCalls(value) {
|
|
335
|
+
const calls = Array.isArray(value) ? value : value === undefined || value === null ? [] : [value];
|
|
336
|
+
return calls.map((call, index) => {
|
|
337
|
+
const record = typeof call === "object" && call !== null ? call : {};
|
|
338
|
+
const name = stringValue(record.name) ?? stringValue(record.toolName) ?? "tool";
|
|
339
|
+
const args = record.args ?? record.arguments ?? {};
|
|
340
|
+
return {
|
|
341
|
+
id: stringValue(record.callId) ?? stringValue(record.id) ?? `call_${index}`,
|
|
342
|
+
type: "function",
|
|
343
|
+
function: {
|
|
344
|
+
name,
|
|
345
|
+
arguments: typeof args === "string" ? args : safeJson(args),
|
|
346
|
+
},
|
|
347
|
+
};
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
function providerName(attrs) {
|
|
351
|
+
const direct = stringAttr(attrs, ATTR_GEN_AI_PROVIDER_NAME);
|
|
352
|
+
if (direct) {
|
|
353
|
+
return direct;
|
|
354
|
+
}
|
|
355
|
+
const llmMetrics = parseMaybeJson(attrs[LK_LLM_METRICS]);
|
|
356
|
+
const ttsMetrics = parseMaybeJson(attrs[LK_TTS_METRICS]);
|
|
357
|
+
return stringValue(llmMetrics?.metadata?.modelProvider)
|
|
358
|
+
?? stringValue(ttsMetrics?.metadata?.modelProvider);
|
|
359
|
+
}
|
|
360
|
+
function normalizeProvider(provider) {
|
|
361
|
+
return provider.toLowerCase().replace(/\s+/g, "_");
|
|
362
|
+
}
|
|
363
|
+
function setAttr(span, attrs, key, value) {
|
|
364
|
+
if (value === undefined || value === null) {
|
|
365
|
+
return;
|
|
366
|
+
}
|
|
367
|
+
attrs[key] = value;
|
|
368
|
+
span.setAttribute(key, value);
|
|
369
|
+
}
|
|
370
|
+
function stringAttr(attrs, key) {
|
|
371
|
+
return stringValue(attrs[key]);
|
|
372
|
+
}
|
|
373
|
+
function stringValue(value) {
|
|
374
|
+
if (typeof value === "string" && value.length > 0) {
|
|
375
|
+
return value;
|
|
376
|
+
}
|
|
377
|
+
if (typeof value === "number" || typeof value === "boolean") {
|
|
378
|
+
return String(value);
|
|
379
|
+
}
|
|
380
|
+
return undefined;
|
|
381
|
+
}
|
|
382
|
+
function numberAttr(attrs, key) {
|
|
383
|
+
return asNumber(attrs[key]);
|
|
384
|
+
}
|
|
385
|
+
function asNumber(value) {
|
|
386
|
+
if (typeof value === "number" && Number.isFinite(value)) {
|
|
387
|
+
return value;
|
|
388
|
+
}
|
|
389
|
+
if (typeof value === "string" && value.trim() !== "") {
|
|
390
|
+
const parsed = Number(value);
|
|
391
|
+
return Number.isFinite(parsed) ? parsed : undefined;
|
|
392
|
+
}
|
|
393
|
+
return undefined;
|
|
394
|
+
}
|
|
395
|
+
function parseMaybeJson(value) {
|
|
396
|
+
if (typeof value !== "string") {
|
|
397
|
+
return value;
|
|
398
|
+
}
|
|
399
|
+
try {
|
|
400
|
+
return JSON.parse(value);
|
|
401
|
+
}
|
|
402
|
+
catch {
|
|
403
|
+
return value;
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
function contentToText(value) {
|
|
407
|
+
if (typeof value === "string") {
|
|
408
|
+
return value;
|
|
409
|
+
}
|
|
410
|
+
if (Array.isArray(value)) {
|
|
411
|
+
return value.map((part) => contentToText(part)).filter(Boolean).join("");
|
|
412
|
+
}
|
|
413
|
+
if (value && typeof value === "object") {
|
|
414
|
+
const record = value;
|
|
415
|
+
if (typeof record.text === "string") {
|
|
416
|
+
return record.text;
|
|
417
|
+
}
|
|
418
|
+
if (typeof record.transcript === "string") {
|
|
419
|
+
return record.transcript;
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
return value === undefined || value === null ? "" : safeJson(value);
|
|
423
|
+
}
|
|
424
|
+
function compactRecord(record) {
|
|
425
|
+
const compacted = {};
|
|
426
|
+
for (const [key, value] of Object.entries(record)) {
|
|
427
|
+
if (value === undefined || value === null) {
|
|
428
|
+
continue;
|
|
429
|
+
}
|
|
430
|
+
if (typeof value === "object" && !Array.isArray(value) && Object.keys(value).length === 0) {
|
|
431
|
+
continue;
|
|
432
|
+
}
|
|
433
|
+
compacted[key] = value;
|
|
434
|
+
}
|
|
435
|
+
return compacted;
|
|
436
|
+
}
|
|
437
|
+
export function safeJson(value) {
|
|
438
|
+
try {
|
|
439
|
+
return JSON.stringify(value ?? null);
|
|
440
|
+
}
|
|
441
|
+
catch {
|
|
442
|
+
return JSON.stringify(String(value));
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
//# sourceMappingURL=_translator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_translator.js","sourceRoot":"","sources":["../src/_translator.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { type TracerProvider } from "@opentelemetry/api";
|
|
2
|
+
import { translateLiveKitSpan } from "./_translator.js";
|
|
3
|
+
type AnyFunction = (...args: any[]) => any;
|
|
4
|
+
export interface LiveKitTelemetryModule {
|
|
5
|
+
tracer?: {
|
|
6
|
+
startSpan?: AnyFunction;
|
|
7
|
+
startActiveSpan?: AnyFunction;
|
|
8
|
+
startActiveSpanSync?: AnyFunction;
|
|
9
|
+
setProvider?: (provider: TracerProvider) => void;
|
|
10
|
+
};
|
|
11
|
+
setTracerProvider?: (...args: any[]) => void;
|
|
12
|
+
}
|
|
13
|
+
export interface LiveKitAgentsModule {
|
|
14
|
+
telemetry?: LiveKitTelemetryModule;
|
|
15
|
+
}
|
|
16
|
+
export interface LiveKitInstrumentorOptions {
|
|
17
|
+
livekitModule?: LiveKitAgentsModule;
|
|
18
|
+
telemetryModule?: LiveKitTelemetryModule;
|
|
19
|
+
syncTracerProvider?: boolean;
|
|
20
|
+
}
|
|
21
|
+
export declare class LiveKitInstrumentor {
|
|
22
|
+
readonly name = "livekit";
|
|
23
|
+
private static _originals;
|
|
24
|
+
private static _patchCount;
|
|
25
|
+
private static _patchedTracer?;
|
|
26
|
+
private readonly _livekitModule?;
|
|
27
|
+
private readonly _telemetryModule?;
|
|
28
|
+
private readonly _syncTracerProvider;
|
|
29
|
+
private _isInstrumented;
|
|
30
|
+
constructor(options?: LiveKitInstrumentorOptions);
|
|
31
|
+
activate(): Promise<void>;
|
|
32
|
+
deactivate(): void;
|
|
33
|
+
isActive(): boolean;
|
|
34
|
+
private _resolveTelemetryModule;
|
|
35
|
+
private _patchTracer;
|
|
36
|
+
}
|
|
37
|
+
export { translateLiveKitSpan };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { trace } from "@opentelemetry/api";
|
|
2
|
+
import { LIVEKIT_INSTRUMENTATION_NAME } from "./_constants.js";
|
|
3
|
+
import { getSpanAttributes, translateLiveKitSpan, } from "./_translator.js";
|
|
4
|
+
const PATCHED_SPAN = Symbol.for("respan.instrumentation.livekit.patchedSpan");
|
|
5
|
+
const TRANSLATED_SPAN = Symbol.for("respan.instrumentation.livekit.translatedSpan");
|
|
6
|
+
export class LiveKitInstrumentor {
|
|
7
|
+
name = LIVEKIT_INSTRUMENTATION_NAME;
|
|
8
|
+
static _originals = new Map();
|
|
9
|
+
static _patchCount = 0;
|
|
10
|
+
static _patchedTracer;
|
|
11
|
+
_livekitModule;
|
|
12
|
+
_telemetryModule;
|
|
13
|
+
_syncTracerProvider;
|
|
14
|
+
_isInstrumented = false;
|
|
15
|
+
constructor(options = {}) {
|
|
16
|
+
this._livekitModule = options.livekitModule;
|
|
17
|
+
this._telemetryModule = options.telemetryModule;
|
|
18
|
+
this._syncTracerProvider = options.syncTracerProvider ?? true;
|
|
19
|
+
}
|
|
20
|
+
async activate() {
|
|
21
|
+
if (this._isInstrumented) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const telemetryModule = await this._resolveTelemetryModule();
|
|
25
|
+
if (!telemetryModule?.tracer) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
if (this._syncTracerProvider) {
|
|
29
|
+
syncLiveKitTracerProvider(telemetryModule);
|
|
30
|
+
}
|
|
31
|
+
this._patchTracer(telemetryModule.tracer);
|
|
32
|
+
this._isInstrumented = true;
|
|
33
|
+
}
|
|
34
|
+
deactivate() {
|
|
35
|
+
if (!this._isInstrumented) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
LiveKitInstrumentor._patchCount = Math.max(0, LiveKitInstrumentor._patchCount - 1);
|
|
39
|
+
if (LiveKitInstrumentor._patchCount === 0 && LiveKitInstrumentor._patchedTracer) {
|
|
40
|
+
for (const [methodName, original] of LiveKitInstrumentor._originals) {
|
|
41
|
+
LiveKitInstrumentor._patchedTracer[methodName] = original;
|
|
42
|
+
}
|
|
43
|
+
LiveKitInstrumentor._originals.clear();
|
|
44
|
+
LiveKitInstrumentor._patchedTracer = undefined;
|
|
45
|
+
}
|
|
46
|
+
this._isInstrumented = false;
|
|
47
|
+
}
|
|
48
|
+
isActive() {
|
|
49
|
+
return this._isInstrumented;
|
|
50
|
+
}
|
|
51
|
+
async _resolveTelemetryModule() {
|
|
52
|
+
if (this._telemetryModule) {
|
|
53
|
+
return this._telemetryModule;
|
|
54
|
+
}
|
|
55
|
+
if (this._livekitModule?.telemetry) {
|
|
56
|
+
return this._livekitModule.telemetry;
|
|
57
|
+
}
|
|
58
|
+
try {
|
|
59
|
+
const livekit = await import("@livekit/agents");
|
|
60
|
+
return livekit.telemetry;
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return undefined;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
_patchTracer(tracer) {
|
|
67
|
+
if (LiveKitInstrumentor._patchCount === 0) {
|
|
68
|
+
LiveKitInstrumentor._patchedTracer = tracer;
|
|
69
|
+
const startSpan = tracer.startSpan;
|
|
70
|
+
if (typeof startSpan === "function") {
|
|
71
|
+
LiveKitInstrumentor._originals.set("startSpan", startSpan);
|
|
72
|
+
tracer.startSpan = function instrumentedLiveKitStartSpan(options = {}) {
|
|
73
|
+
const span = startSpan.call(this, options);
|
|
74
|
+
return patchSpan(span, options?.name, options?.attributes);
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
const startActiveSpan = tracer.startActiveSpan;
|
|
78
|
+
if (typeof startActiveSpan === "function") {
|
|
79
|
+
LiveKitInstrumentor._originals.set("startActiveSpan", startActiveSpan);
|
|
80
|
+
tracer.startActiveSpan = function instrumentedLiveKitStartActiveSpan(fn, options = {}) {
|
|
81
|
+
return startActiveSpan.call(this, async (span) => await fn(patchSpan(span, options?.name, options?.attributes)), options);
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
const startActiveSpanSync = tracer.startActiveSpanSync;
|
|
85
|
+
if (typeof startActiveSpanSync === "function") {
|
|
86
|
+
LiveKitInstrumentor._originals.set("startActiveSpanSync", startActiveSpanSync);
|
|
87
|
+
tracer.startActiveSpanSync = function instrumentedLiveKitStartActiveSpanSync(fn, options = {}) {
|
|
88
|
+
return startActiveSpanSync.call(this, (span) => fn(patchSpan(span, options?.name, options?.attributes)), options);
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
if (LiveKitInstrumentor._originals.size > 0) {
|
|
93
|
+
LiveKitInstrumentor._patchCount += 1;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
function syncLiveKitTracerProvider(telemetryModule) {
|
|
98
|
+
const provider = resolveActiveTracerProvider();
|
|
99
|
+
if (!provider) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
if (typeof telemetryModule.setTracerProvider === "function") {
|
|
103
|
+
try {
|
|
104
|
+
telemetryModule.setTracerProvider(provider);
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
// Fall back to the tracer-level setter below.
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
if (typeof telemetryModule.tracer?.setProvider === "function") {
|
|
112
|
+
try {
|
|
113
|
+
telemetryModule.tracer.setProvider(provider);
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
// Non-fatal: the method patch still works if LiveKit already uses the global provider.
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
function resolveActiveTracerProvider() {
|
|
121
|
+
const provider = trace.getTracerProvider();
|
|
122
|
+
return provider?._delegate ?? provider;
|
|
123
|
+
}
|
|
124
|
+
function patchSpan(span, spanName, initialAttributes) {
|
|
125
|
+
const patchableSpan = span;
|
|
126
|
+
if (patchableSpan[PATCHED_SPAN]) {
|
|
127
|
+
return span;
|
|
128
|
+
}
|
|
129
|
+
const attrs = getSpanAttributes(span);
|
|
130
|
+
if (initialAttributes) {
|
|
131
|
+
for (const [key, value] of Object.entries(initialAttributes)) {
|
|
132
|
+
attrs[key] = value;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
const originalSetAttribute = span.setAttribute.bind(span);
|
|
136
|
+
patchableSpan.setAttribute = (key, value) => {
|
|
137
|
+
attrs[key] = value;
|
|
138
|
+
return originalSetAttribute(key, value);
|
|
139
|
+
};
|
|
140
|
+
const originalSetAttributes = span.setAttributes.bind(span);
|
|
141
|
+
patchableSpan.setAttributes = (attributes) => {
|
|
142
|
+
for (const [key, value] of Object.entries(attributes)) {
|
|
143
|
+
attrs[key] = value;
|
|
144
|
+
}
|
|
145
|
+
return originalSetAttributes(attributes);
|
|
146
|
+
};
|
|
147
|
+
const originalEnd = span.end.bind(span);
|
|
148
|
+
patchableSpan.end = (...args) => {
|
|
149
|
+
translateOnce(span, attrs, spanName);
|
|
150
|
+
originalEnd(...args);
|
|
151
|
+
};
|
|
152
|
+
Object.defineProperty(patchableSpan, PATCHED_SPAN, {
|
|
153
|
+
enumerable: false,
|
|
154
|
+
value: true,
|
|
155
|
+
});
|
|
156
|
+
return span;
|
|
157
|
+
}
|
|
158
|
+
function translateOnce(span, attrs, spanName) {
|
|
159
|
+
const patchableSpan = span;
|
|
160
|
+
if (patchableSpan[TRANSLATED_SPAN]) {
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
Object.defineProperty(patchableSpan, TRANSLATED_SPAN, {
|
|
164
|
+
enumerable: false,
|
|
165
|
+
value: true,
|
|
166
|
+
});
|
|
167
|
+
translateLiveKitSpan(span, { attributes: attrs, spanName });
|
|
168
|
+
}
|
|
169
|
+
export { translateLiveKitSpan };
|
|
170
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@respan/instrumentation-livekit",
|
|
3
|
+
"type": "module",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"description": "Respan instrumentation plugin for LiveKit Agents TypeScript",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"author": "Respan <team@respan.ai>",
|
|
9
|
+
"license": "Apache-2.0",
|
|
10
|
+
"repository": {
|
|
11
|
+
"type": "git",
|
|
12
|
+
"url": "https://github.com/respanai/respan",
|
|
13
|
+
"directory": "javascript-sdks/instrumentations/respan-instrumentation-livekit"
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist",
|
|
17
|
+
"README.md",
|
|
18
|
+
"LICENSE"
|
|
19
|
+
],
|
|
20
|
+
"publishConfig": {
|
|
21
|
+
"access": "public"
|
|
22
|
+
},
|
|
23
|
+
"scripts": {
|
|
24
|
+
"build": "tsc",
|
|
25
|
+
"test": "yarn build && node --test tests/*.test.mjs",
|
|
26
|
+
"publish:package": "yarn npm publish",
|
|
27
|
+
"release": "yarn build && yarn version patch && yarn publish:package"
|
|
28
|
+
},
|
|
29
|
+
"dependencies": {
|
|
30
|
+
"@opentelemetry/api": "^1.9.0",
|
|
31
|
+
"@opentelemetry/semantic-conventions": "^1.40.0",
|
|
32
|
+
"@respan/respan-sdk": "^1.1.7",
|
|
33
|
+
"@traceloop/ai-semantic-conventions": "^0.13.0"
|
|
34
|
+
},
|
|
35
|
+
"peerDependencies": {
|
|
36
|
+
"@livekit/agents": ">=1.4.0"
|
|
37
|
+
},
|
|
38
|
+
"peerDependenciesMeta": {
|
|
39
|
+
"@livekit/agents": {
|
|
40
|
+
"optional": false
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
"devDependencies": {
|
|
44
|
+
"@livekit/agents": "^1.4.8",
|
|
45
|
+
"@livekit/rtc-node": "^0.13.29",
|
|
46
|
+
"@types/node": "^22.15.29",
|
|
47
|
+
"typescript": "^5.7.3",
|
|
48
|
+
"zod": "^4.1.12"
|
|
49
|
+
}
|
|
50
|
+
}
|