@livekit/agents 1.0.17 → 1.0.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (216) hide show
  1. package/dist/index.cjs +3 -0
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.d.cts +2 -1
  4. package/dist/index.d.ts +2 -1
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +2 -0
  7. package/dist/index.js.map +1 -1
  8. package/dist/inference/api_protos.d.cts +12 -12
  9. package/dist/inference/api_protos.d.ts +12 -12
  10. package/dist/inference/llm.cjs +35 -13
  11. package/dist/inference/llm.cjs.map +1 -1
  12. package/dist/inference/llm.d.cts +10 -5
  13. package/dist/inference/llm.d.ts +10 -5
  14. package/dist/inference/llm.d.ts.map +1 -1
  15. package/dist/inference/llm.js +35 -13
  16. package/dist/inference/llm.js.map +1 -1
  17. package/dist/inference/tts.cjs +1 -1
  18. package/dist/inference/tts.cjs.map +1 -1
  19. package/dist/inference/tts.js +1 -1
  20. package/dist/inference/tts.js.map +1 -1
  21. package/dist/ipc/job_proc_lazy_main.cjs +6 -2
  22. package/dist/ipc/job_proc_lazy_main.cjs.map +1 -1
  23. package/dist/ipc/job_proc_lazy_main.js +6 -2
  24. package/dist/ipc/job_proc_lazy_main.js.map +1 -1
  25. package/dist/job.cjs +31 -0
  26. package/dist/job.cjs.map +1 -1
  27. package/dist/job.d.cts +6 -0
  28. package/dist/job.d.ts +6 -0
  29. package/dist/job.d.ts.map +1 -1
  30. package/dist/job.js +31 -0
  31. package/dist/job.js.map +1 -1
  32. package/dist/llm/chat_context.cjs +33 -0
  33. package/dist/llm/chat_context.cjs.map +1 -1
  34. package/dist/llm/chat_context.d.cts +22 -2
  35. package/dist/llm/chat_context.d.ts +22 -2
  36. package/dist/llm/chat_context.d.ts.map +1 -1
  37. package/dist/llm/chat_context.js +32 -0
  38. package/dist/llm/chat_context.js.map +1 -1
  39. package/dist/llm/index.cjs +2 -0
  40. package/dist/llm/index.cjs.map +1 -1
  41. package/dist/llm/index.d.cts +1 -1
  42. package/dist/llm/index.d.ts +1 -1
  43. package/dist/llm/index.d.ts.map +1 -1
  44. package/dist/llm/index.js +2 -0
  45. package/dist/llm/index.js.map +1 -1
  46. package/dist/llm/llm.cjs.map +1 -1
  47. package/dist/llm/llm.d.cts +1 -1
  48. package/dist/llm/llm.d.ts +1 -1
  49. package/dist/llm/llm.d.ts.map +1 -1
  50. package/dist/llm/llm.js.map +1 -1
  51. package/dist/llm/provider_format/google.cjs.map +1 -1
  52. package/dist/llm/provider_format/google.d.cts +1 -1
  53. package/dist/llm/provider_format/google.d.ts +1 -1
  54. package/dist/llm/provider_format/google.d.ts.map +1 -1
  55. package/dist/llm/provider_format/google.js.map +1 -1
  56. package/dist/llm/provider_format/google.test.cjs +48 -0
  57. package/dist/llm/provider_format/google.test.cjs.map +1 -1
  58. package/dist/llm/provider_format/google.test.js +54 -1
  59. package/dist/llm/provider_format/google.test.js.map +1 -1
  60. package/dist/llm/provider_format/index.d.cts +1 -1
  61. package/dist/llm/provider_format/index.d.ts +1 -1
  62. package/dist/llm/provider_format/index.d.ts.map +1 -1
  63. package/dist/llm/provider_format/openai.cjs +1 -2
  64. package/dist/llm/provider_format/openai.cjs.map +1 -1
  65. package/dist/llm/provider_format/openai.js +1 -2
  66. package/dist/llm/provider_format/openai.js.map +1 -1
  67. package/dist/llm/provider_format/openai.test.cjs +32 -0
  68. package/dist/llm/provider_format/openai.test.cjs.map +1 -1
  69. package/dist/llm/provider_format/openai.test.js +38 -1
  70. package/dist/llm/provider_format/openai.test.js.map +1 -1
  71. package/dist/llm/realtime.cjs.map +1 -1
  72. package/dist/llm/realtime.d.cts +4 -0
  73. package/dist/llm/realtime.d.ts +4 -0
  74. package/dist/llm/realtime.d.ts.map +1 -1
  75. package/dist/llm/realtime.js.map +1 -1
  76. package/dist/llm/utils.cjs +2 -2
  77. package/dist/llm/utils.cjs.map +1 -1
  78. package/dist/llm/utils.d.cts +1 -1
  79. package/dist/llm/utils.d.ts +1 -1
  80. package/dist/llm/utils.d.ts.map +1 -1
  81. package/dist/llm/utils.js +2 -2
  82. package/dist/llm/utils.js.map +1 -1
  83. package/dist/llm/zod-utils.cjs +6 -3
  84. package/dist/llm/zod-utils.cjs.map +1 -1
  85. package/dist/llm/zod-utils.d.cts +1 -1
  86. package/dist/llm/zod-utils.d.ts +1 -1
  87. package/dist/llm/zod-utils.d.ts.map +1 -1
  88. package/dist/llm/zod-utils.js +6 -3
  89. package/dist/llm/zod-utils.js.map +1 -1
  90. package/dist/llm/zod-utils.test.cjs +83 -0
  91. package/dist/llm/zod-utils.test.cjs.map +1 -1
  92. package/dist/llm/zod-utils.test.js +83 -0
  93. package/dist/llm/zod-utils.test.js.map +1 -1
  94. package/dist/log.cjs.map +1 -1
  95. package/dist/log.d.ts.map +1 -1
  96. package/dist/log.js.map +1 -1
  97. package/dist/telemetry/index.cjs +51 -0
  98. package/dist/telemetry/index.cjs.map +1 -0
  99. package/dist/telemetry/index.d.cts +4 -0
  100. package/dist/telemetry/index.d.ts +4 -0
  101. package/dist/telemetry/index.d.ts.map +1 -0
  102. package/dist/telemetry/index.js +12 -0
  103. package/dist/telemetry/index.js.map +1 -0
  104. package/dist/telemetry/trace_types.cjs +191 -0
  105. package/dist/telemetry/trace_types.cjs.map +1 -0
  106. package/dist/telemetry/trace_types.d.cts +56 -0
  107. package/dist/telemetry/trace_types.d.ts +56 -0
  108. package/dist/telemetry/trace_types.d.ts.map +1 -0
  109. package/dist/telemetry/trace_types.js +113 -0
  110. package/dist/telemetry/trace_types.js.map +1 -0
  111. package/dist/telemetry/traces.cjs +196 -0
  112. package/dist/telemetry/traces.cjs.map +1 -0
  113. package/dist/telemetry/traces.d.cts +97 -0
  114. package/dist/telemetry/traces.d.ts +97 -0
  115. package/dist/telemetry/traces.d.ts.map +1 -0
  116. package/dist/telemetry/traces.js +173 -0
  117. package/dist/telemetry/traces.js.map +1 -0
  118. package/dist/telemetry/utils.cjs +86 -0
  119. package/dist/telemetry/utils.cjs.map +1 -0
  120. package/dist/telemetry/utils.d.cts +5 -0
  121. package/dist/telemetry/utils.d.ts +5 -0
  122. package/dist/telemetry/utils.d.ts.map +1 -0
  123. package/dist/telemetry/utils.js +51 -0
  124. package/dist/telemetry/utils.js.map +1 -0
  125. package/dist/tts/tts.cjs.map +1 -1
  126. package/dist/tts/tts.d.ts.map +1 -1
  127. package/dist/tts/tts.js.map +1 -1
  128. package/dist/utils.cjs.map +1 -1
  129. package/dist/utils.d.cts +7 -0
  130. package/dist/utils.d.ts +7 -0
  131. package/dist/utils.d.ts.map +1 -1
  132. package/dist/utils.js.map +1 -1
  133. package/dist/voice/agent.cjs +15 -0
  134. package/dist/voice/agent.cjs.map +1 -1
  135. package/dist/voice/agent.d.cts +4 -1
  136. package/dist/voice/agent.d.ts +4 -1
  137. package/dist/voice/agent.d.ts.map +1 -1
  138. package/dist/voice/agent.js +15 -0
  139. package/dist/voice/agent.js.map +1 -1
  140. package/dist/voice/agent_activity.cjs +71 -20
  141. package/dist/voice/agent_activity.cjs.map +1 -1
  142. package/dist/voice/agent_activity.d.ts.map +1 -1
  143. package/dist/voice/agent_activity.js +71 -20
  144. package/dist/voice/agent_activity.js.map +1 -1
  145. package/dist/voice/agent_session.cjs +69 -2
  146. package/dist/voice/agent_session.cjs.map +1 -1
  147. package/dist/voice/agent_session.d.cts +11 -2
  148. package/dist/voice/agent_session.d.ts +11 -2
  149. package/dist/voice/agent_session.d.ts.map +1 -1
  150. package/dist/voice/agent_session.js +70 -3
  151. package/dist/voice/agent_session.js.map +1 -1
  152. package/dist/voice/audio_recognition.cjs.map +1 -1
  153. package/dist/voice/audio_recognition.d.ts.map +1 -1
  154. package/dist/voice/audio_recognition.js.map +1 -1
  155. package/dist/voice/generation.cjs.map +1 -1
  156. package/dist/voice/generation.d.ts.map +1 -1
  157. package/dist/voice/generation.js.map +1 -1
  158. package/dist/voice/index.cjs +2 -0
  159. package/dist/voice/index.cjs.map +1 -1
  160. package/dist/voice/index.d.cts +1 -0
  161. package/dist/voice/index.d.ts +1 -0
  162. package/dist/voice/index.d.ts.map +1 -1
  163. package/dist/voice/index.js +1 -0
  164. package/dist/voice/index.js.map +1 -1
  165. package/dist/voice/interruption_detection.test.cjs +114 -0
  166. package/dist/voice/interruption_detection.test.cjs.map +1 -0
  167. package/dist/voice/interruption_detection.test.js +113 -0
  168. package/dist/voice/interruption_detection.test.js.map +1 -0
  169. package/dist/voice/report.cjs +69 -0
  170. package/dist/voice/report.cjs.map +1 -0
  171. package/dist/voice/report.d.cts +26 -0
  172. package/dist/voice/report.d.ts +26 -0
  173. package/dist/voice/report.d.ts.map +1 -0
  174. package/dist/voice/report.js +44 -0
  175. package/dist/voice/report.js.map +1 -0
  176. package/dist/voice/room_io/room_io.cjs +3 -0
  177. package/dist/voice/room_io/room_io.cjs.map +1 -1
  178. package/dist/voice/room_io/room_io.d.cts +1 -0
  179. package/dist/voice/room_io/room_io.d.ts +1 -0
  180. package/dist/voice/room_io/room_io.d.ts.map +1 -1
  181. package/dist/voice/room_io/room_io.js +3 -0
  182. package/dist/voice/room_io/room_io.js.map +1 -1
  183. package/package.json +12 -5
  184. package/src/index.ts +2 -1
  185. package/src/inference/llm.ts +53 -21
  186. package/src/inference/tts.ts +1 -1
  187. package/src/ipc/job_proc_lazy_main.ts +10 -2
  188. package/src/job.ts +48 -0
  189. package/src/llm/__snapshots__/zod-utils.test.ts.snap +218 -0
  190. package/src/llm/chat_context.ts +53 -1
  191. package/src/llm/index.ts +1 -0
  192. package/src/llm/llm.ts +3 -1
  193. package/src/llm/provider_format/google.test.ts +72 -1
  194. package/src/llm/provider_format/google.ts +4 -4
  195. package/src/llm/provider_format/openai.test.ts +55 -1
  196. package/src/llm/provider_format/openai.ts +3 -2
  197. package/src/llm/realtime.ts +8 -1
  198. package/src/llm/utils.ts +7 -2
  199. package/src/llm/zod-utils.test.ts +101 -0
  200. package/src/llm/zod-utils.ts +12 -3
  201. package/src/log.ts +1 -0
  202. package/src/telemetry/index.ts +10 -0
  203. package/src/telemetry/trace_types.ts +88 -0
  204. package/src/telemetry/traces.ts +266 -0
  205. package/src/telemetry/utils.ts +61 -0
  206. package/src/tts/tts.ts +4 -0
  207. package/src/utils.ts +17 -0
  208. package/src/voice/agent.ts +22 -0
  209. package/src/voice/agent_activity.ts +102 -24
  210. package/src/voice/agent_session.ts +98 -1
  211. package/src/voice/audio_recognition.ts +2 -0
  212. package/src/voice/generation.ts +3 -0
  213. package/src/voice/index.ts +1 -0
  214. package/src/voice/interruption_detection.test.ts +151 -0
  215. package/src/voice/report.ts +77 -0
  216. package/src/voice/room_io/room_io.ts +4 -0
@@ -0,0 +1,113 @@
1
+ const ATTR_SPEECH_ID = "lk.speech_id";
2
+ const ATTR_AGENT_LABEL = "lk.agent_label";
3
+ const ATTR_START_TIME = "lk.start_time";
4
+ const ATTR_END_TIME = "lk.end_time";
5
+ const ATTR_RETRY_COUNT = "lk.retry_count";
6
+ const ATTR_PARTICIPANT_ID = "lk.participant_id";
7
+ const ATTR_PARTICIPANT_IDENTITY = "lk.participant_identity";
8
+ const ATTR_PARTICIPANT_KIND = "lk.participant_kind";
9
+ const ATTR_JOB_ID = "lk.job_id";
10
+ const ATTR_AGENT_NAME = "lk.agent_name";
11
+ const ATTR_ROOM_NAME = "lk.room_name";
12
+ const ATTR_SESSION_OPTIONS = "lk.session_options";
13
+ const ATTR_USER_INPUT = "lk.user_input";
14
+ const ATTR_INSTRUCTIONS = "lk.instructions";
15
+ const ATTR_SPEECH_INTERRUPTED = "lk.interrupted";
16
+ const ATTR_CHAT_CTX = "lk.chat_ctx";
17
+ const ATTR_FUNCTION_TOOLS = "lk.function_tools";
18
+ const ATTR_RESPONSE_TEXT = "lk.response.text";
19
+ const ATTR_RESPONSE_FUNCTION_CALLS = "lk.response.function_calls";
20
+ const ATTR_FUNCTION_TOOL_NAME = "lk.function_tool.name";
21
+ const ATTR_FUNCTION_TOOL_ARGS = "lk.function_tool.arguments";
22
+ const ATTR_FUNCTION_TOOL_IS_ERROR = "lk.function_tool.is_error";
23
+ const ATTR_FUNCTION_TOOL_OUTPUT = "lk.function_tool.output";
24
+ const ATTR_TTS_INPUT_TEXT = "lk.input_text";
25
+ const ATTR_TTS_STREAMING = "lk.tts.streaming";
26
+ const ATTR_TTS_LABEL = "lk.tts.label";
27
+ const ATTR_EOU_PROBABILITY = "lk.eou.probability";
28
+ const ATTR_EOU_UNLIKELY_THRESHOLD = "lk.eou.unlikely_threshold";
29
+ const ATTR_EOU_DELAY = "lk.eou.endpointing_delay";
30
+ const ATTR_EOU_LANGUAGE = "lk.eou.language";
31
+ const ATTR_USER_TRANSCRIPT = "lk.user_transcript";
32
+ const ATTR_TRANSCRIPT_CONFIDENCE = "lk.transcript_confidence";
33
+ const ATTR_TRANSCRIPTION_DELAY = "lk.transcription_delay";
34
+ const ATTR_END_OF_TURN_DELAY = "lk.end_of_turn_delay";
35
+ const ATTR_LLM_METRICS = "lk.llm_metrics";
36
+ const ATTR_TTS_METRICS = "lk.tts_metrics";
37
+ const ATTR_REALTIME_MODEL_METRICS = "lk.realtime_model_metrics";
38
+ const ATTR_GEN_AI_OPERATION_NAME = "gen_ai.operation.name";
39
+ const ATTR_GEN_AI_REQUEST_MODEL = "gen_ai.request.model";
40
+ const ATTR_GEN_AI_USAGE_INPUT_TOKENS = "gen_ai.usage.input_tokens";
41
+ const ATTR_GEN_AI_USAGE_OUTPUT_TOKENS = "gen_ai.usage.output_tokens";
42
+ const ATTR_GEN_AI_USAGE_INPUT_TEXT_TOKENS = "gen_ai.usage.input_text_tokens";
43
+ const ATTR_GEN_AI_USAGE_INPUT_AUDIO_TOKENS = "gen_ai.usage.input_audio_tokens";
44
+ const ATTR_GEN_AI_USAGE_INPUT_CACHED_TOKENS = "gen_ai.usage.input_cached_tokens";
45
+ const ATTR_GEN_AI_USAGE_OUTPUT_TEXT_TOKENS = "gen_ai.usage.output_text_tokens";
46
+ const ATTR_GEN_AI_USAGE_OUTPUT_AUDIO_TOKENS = "gen_ai.usage.output_audio_tokens";
47
+ const EVENT_GEN_AI_SYSTEM_MESSAGE = "gen_ai.system.message";
48
+ const EVENT_GEN_AI_USER_MESSAGE = "gen_ai.user.message";
49
+ const EVENT_GEN_AI_ASSISTANT_MESSAGE = "gen_ai.assistant.message";
50
+ const EVENT_GEN_AI_TOOL_MESSAGE = "gen_ai.tool.message";
51
+ const EVENT_GEN_AI_CHOICE = "gen_ai.choice";
52
+ const ATTR_EXCEPTION_TRACE = "exception.stacktrace";
53
+ const ATTR_EXCEPTION_TYPE = "exception.type";
54
+ const ATTR_EXCEPTION_MESSAGE = "exception.message";
55
+ const ATTR_LANGFUSE_COMPLETION_START_TIME = "langfuse.observation.completion_start_time";
56
+ export {
57
+ ATTR_AGENT_LABEL,
58
+ ATTR_AGENT_NAME,
59
+ ATTR_CHAT_CTX,
60
+ ATTR_END_OF_TURN_DELAY,
61
+ ATTR_END_TIME,
62
+ ATTR_EOU_DELAY,
63
+ ATTR_EOU_LANGUAGE,
64
+ ATTR_EOU_PROBABILITY,
65
+ ATTR_EOU_UNLIKELY_THRESHOLD,
66
+ ATTR_EXCEPTION_MESSAGE,
67
+ ATTR_EXCEPTION_TRACE,
68
+ ATTR_EXCEPTION_TYPE,
69
+ ATTR_FUNCTION_TOOLS,
70
+ ATTR_FUNCTION_TOOL_ARGS,
71
+ ATTR_FUNCTION_TOOL_IS_ERROR,
72
+ ATTR_FUNCTION_TOOL_NAME,
73
+ ATTR_FUNCTION_TOOL_OUTPUT,
74
+ ATTR_GEN_AI_OPERATION_NAME,
75
+ ATTR_GEN_AI_REQUEST_MODEL,
76
+ ATTR_GEN_AI_USAGE_INPUT_AUDIO_TOKENS,
77
+ ATTR_GEN_AI_USAGE_INPUT_CACHED_TOKENS,
78
+ ATTR_GEN_AI_USAGE_INPUT_TEXT_TOKENS,
79
+ ATTR_GEN_AI_USAGE_INPUT_TOKENS,
80
+ ATTR_GEN_AI_USAGE_OUTPUT_AUDIO_TOKENS,
81
+ ATTR_GEN_AI_USAGE_OUTPUT_TEXT_TOKENS,
82
+ ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,
83
+ ATTR_INSTRUCTIONS,
84
+ ATTR_JOB_ID,
85
+ ATTR_LANGFUSE_COMPLETION_START_TIME,
86
+ ATTR_LLM_METRICS,
87
+ ATTR_PARTICIPANT_ID,
88
+ ATTR_PARTICIPANT_IDENTITY,
89
+ ATTR_PARTICIPANT_KIND,
90
+ ATTR_REALTIME_MODEL_METRICS,
91
+ ATTR_RESPONSE_FUNCTION_CALLS,
92
+ ATTR_RESPONSE_TEXT,
93
+ ATTR_RETRY_COUNT,
94
+ ATTR_ROOM_NAME,
95
+ ATTR_SESSION_OPTIONS,
96
+ ATTR_SPEECH_ID,
97
+ ATTR_SPEECH_INTERRUPTED,
98
+ ATTR_START_TIME,
99
+ ATTR_TRANSCRIPTION_DELAY,
100
+ ATTR_TRANSCRIPT_CONFIDENCE,
101
+ ATTR_TTS_INPUT_TEXT,
102
+ ATTR_TTS_LABEL,
103
+ ATTR_TTS_METRICS,
104
+ ATTR_TTS_STREAMING,
105
+ ATTR_USER_INPUT,
106
+ ATTR_USER_TRANSCRIPT,
107
+ EVENT_GEN_AI_ASSISTANT_MESSAGE,
108
+ EVENT_GEN_AI_CHOICE,
109
+ EVENT_GEN_AI_SYSTEM_MESSAGE,
110
+ EVENT_GEN_AI_TOOL_MESSAGE,
111
+ EVENT_GEN_AI_USER_MESSAGE
112
+ };
113
+ //# sourceMappingURL=trace_types.js.map
@@ -0,0 +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":"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;AAGrC,MAAM,0BAA0B;AAChC,MAAM,0BAA0B;AAChC,MAAM,8BAA8B;AACpC,MAAM,4BAA4B;AAGlC,MAAM,sBAAsB;AAC5B,MAAM,qBAAqB;AAC3B,MAAM,iBAAiB;AAGvB,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;AAIpC,MAAM,6BAA6B;AACnC,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;","names":[]}
@@ -0,0 +1,196 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var traces_exports = {};
20
+ __export(traces_exports, {
21
+ setTracerProvider: () => setTracerProvider,
22
+ setupCloudTracer: () => setupCloudTracer,
23
+ tracer: () => tracer
24
+ });
25
+ module.exports = __toCommonJS(traces_exports);
26
+ var import_api = require("@opentelemetry/api");
27
+ var import_exporter_trace_otlp_http = require("@opentelemetry/exporter-trace-otlp-http");
28
+ var import_otlp_exporter_base = require("@opentelemetry/otlp-exporter-base");
29
+ var import_resources = require("@opentelemetry/resources");
30
+ var import_sdk_trace_node = require("@opentelemetry/sdk-trace-node");
31
+ var import_semantic_conventions = require("@opentelemetry/semantic-conventions");
32
+ var import_livekit_server_sdk = require("livekit-server-sdk");
33
+ class DynamicTracer {
34
+ tracerProvider;
35
+ tracer;
36
+ instrumentingModuleName;
37
+ constructor(instrumentingModuleName) {
38
+ this.instrumentingModuleName = instrumentingModuleName;
39
+ this.tracerProvider = import_api.trace.getTracerProvider();
40
+ this.tracer = import_api.trace.getTracer(instrumentingModuleName);
41
+ }
42
+ /**
43
+ * Set a new tracer provider. This updates the underlying tracer instance.
44
+ * @param provider - The new tracer provider to use
45
+ */
46
+ setProvider(provider) {
47
+ this.tracerProvider = provider;
48
+ this.tracer = this.tracerProvider.getTracer(this.instrumentingModuleName);
49
+ }
50
+ /**
51
+ * Get the underlying OpenTelemetry tracer.
52
+ * Use this to access the full Tracer API when needed.
53
+ */
54
+ getTracer() {
55
+ return this.tracer;
56
+ }
57
+ /**
58
+ * Start a span manually (without making it active).
59
+ * You must call span.end() when done.
60
+ *
61
+ * @param options - Span configuration including name
62
+ * @returns The created span
63
+ */
64
+ startSpan(options) {
65
+ const ctx = options.context || import_api.context.active();
66
+ const span = this.tracer.startSpan(
67
+ options.name,
68
+ {
69
+ attributes: options.attributes
70
+ },
71
+ ctx
72
+ );
73
+ return span;
74
+ }
75
+ /**
76
+ * Start a new span and make it active in the current context.
77
+ * The span will automatically be ended when the provided function completes (unless endOnExit=false).
78
+ *
79
+ * @param fn - The function to execute within the span context
80
+ * @param options - Span configuration including name
81
+ * @returns The result of the provided function
82
+ */
83
+ async startActiveSpan(fn, options) {
84
+ const ctx = options.context || import_api.context.active();
85
+ const endOnExit = options.endOnExit === void 0 ? true : options.endOnExit;
86
+ const opts = { attributes: options.attributes };
87
+ return new Promise((resolve, reject) => {
88
+ this.tracer.startActiveSpan(options.name, opts, ctx, async (span) => {
89
+ try {
90
+ const result = await fn(span);
91
+ resolve(result);
92
+ } catch (error) {
93
+ reject(error);
94
+ } finally {
95
+ if (endOnExit) {
96
+ span.end();
97
+ }
98
+ }
99
+ });
100
+ });
101
+ }
102
+ /**
103
+ * Synchronous version of startActiveSpan for non-async operations.
104
+ *
105
+ * @param fn - The function to execute within the span context
106
+ * @param options - Span configuration including name
107
+ * @returns The result of the provided function
108
+ */
109
+ startActiveSpanSync(fn, options) {
110
+ const ctx = options.context || import_api.context.active();
111
+ const endOnExit = options.endOnExit === void 0 ? true : options.endOnExit;
112
+ const opts = { attributes: options.attributes };
113
+ return this.tracer.startActiveSpan(options.name, opts, ctx, (span) => {
114
+ try {
115
+ return fn(span);
116
+ } finally {
117
+ if (endOnExit) {
118
+ span.end();
119
+ }
120
+ }
121
+ });
122
+ }
123
+ }
124
+ const tracer = new DynamicTracer("livekit-agents");
125
+ class MetadataSpanProcessor {
126
+ metadata;
127
+ constructor(metadata) {
128
+ this.metadata = metadata;
129
+ }
130
+ onStart(span, _parentContext) {
131
+ span.setAttributes(this.metadata);
132
+ }
133
+ onEnd(_span) {
134
+ }
135
+ shutdown() {
136
+ return Promise.resolve();
137
+ }
138
+ forceFlush() {
139
+ return Promise.resolve();
140
+ }
141
+ }
142
+ function setTracerProvider(provider, options) {
143
+ if (options == null ? void 0 : options.metadata) {
144
+ provider.addSpanProcessor(new MetadataSpanProcessor(options.metadata));
145
+ }
146
+ tracer.setProvider(provider);
147
+ }
148
+ async function setupCloudTracer(options) {
149
+ const { roomId, jobId, cloudHostname } = options;
150
+ const apiKey = process.env.LIVEKIT_API_KEY;
151
+ const apiSecret = process.env.LIVEKIT_API_SECRET;
152
+ if (!apiKey || !apiSecret) {
153
+ throw new Error("LIVEKIT_API_KEY and LIVEKIT_API_SECRET must be set for cloud tracing");
154
+ }
155
+ const token = new import_livekit_server_sdk.AccessToken(apiKey, apiSecret, {
156
+ identity: "livekit-agents-telemetry",
157
+ ttl: "6h"
158
+ });
159
+ token.addObservabilityGrant({ write: true });
160
+ try {
161
+ const jwt = await token.toJwt();
162
+ const headers = {
163
+ Authorization: `Bearer ${jwt}`
164
+ };
165
+ const metadata = {
166
+ room_id: roomId,
167
+ job_id: jobId
168
+ };
169
+ const resource = new import_resources.Resource({
170
+ [import_semantic_conventions.ATTR_SERVICE_NAME]: "livekit-agents",
171
+ room_id: roomId,
172
+ job_id: jobId
173
+ });
174
+ const spanExporter = new import_exporter_trace_otlp_http.OTLPTraceExporter({
175
+ url: `https://${cloudHostname}/observability/traces/otlp/v0`,
176
+ headers,
177
+ compression: import_otlp_exporter_base.CompressionAlgorithm.GZIP
178
+ });
179
+ const tracerProvider = new import_sdk_trace_node.NodeTracerProvider({
180
+ resource,
181
+ spanProcessors: [new MetadataSpanProcessor(metadata), new import_sdk_trace_node.BatchSpanProcessor(spanExporter)]
182
+ });
183
+ tracerProvider.register();
184
+ setTracerProvider(tracerProvider);
185
+ } catch (error) {
186
+ console.error("Failed to setup cloud tracer:", error);
187
+ throw error;
188
+ }
189
+ }
190
+ // Annotate the CommonJS export names for ESM import in node:
191
+ 0 && (module.exports = {
192
+ setTracerProvider,
193
+ setupCloudTracer,
194
+ tracer
195
+ });
196
+ //# sourceMappingURL=traces.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/telemetry/traces.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport {\n type Attributes,\n type Context,\n type Span,\n type SpanOptions,\n type Tracer,\n type TracerProvider,\n context as otelContext,\n trace,\n} from '@opentelemetry/api';\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';\nimport { CompressionAlgorithm } from '@opentelemetry/otlp-exporter-base';\nimport { Resource } from '@opentelemetry/resources';\nimport type { ReadableSpan, SpanProcessor } from '@opentelemetry/sdk-trace-base';\nimport { BatchSpanProcessor, NodeTracerProvider } from '@opentelemetry/sdk-trace-node';\nimport { ATTR_SERVICE_NAME } from '@opentelemetry/semantic-conventions';\nimport { AccessToken } from 'livekit-server-sdk';\n\nexport interface StartSpanOptions {\n /** Name of the span */\n name: string;\n /** Optional parent context to use for this span */\n context?: Context;\n /** Attributes to set on the span when it starts */\n attributes?: Attributes;\n /** Whether to end the span when the function exits (default: true) */\n endOnExit?: boolean;\n}\n\n/**\n * A dynamic tracer that allows the tracer provider to be changed at runtime.\n */\nclass DynamicTracer {\n private tracerProvider: TracerProvider;\n private tracer: Tracer;\n private readonly instrumentingModuleName: string;\n\n constructor(instrumentingModuleName: string) {\n this.instrumentingModuleName = instrumentingModuleName;\n this.tracerProvider = trace.getTracerProvider();\n this.tracer = trace.getTracer(instrumentingModuleName);\n }\n\n /**\n * Set a new tracer provider. This updates the underlying tracer instance.\n * @param provider - The new tracer provider to use\n */\n setProvider(provider: TracerProvider): void {\n this.tracerProvider = provider;\n this.tracer = this.tracerProvider.getTracer(this.instrumentingModuleName);\n }\n\n /**\n * Get the underlying OpenTelemetry tracer.\n * Use this to access the full Tracer API when needed.\n */\n getTracer(): Tracer {\n return this.tracer;\n }\n\n /**\n * Start a span manually (without making it active).\n * You must call span.end() when done.\n *\n * @param options - Span configuration including name\n * @returns The created span\n */\n startSpan(options: StartSpanOptions): Span {\n const ctx = options.context || otelContext.active();\n const span = this.tracer.startSpan(\n options.name,\n {\n attributes: options.attributes,\n },\n ctx,\n );\n\n return span;\n }\n\n /**\n * Start a new span and make it active in the current context.\n * The span will automatically be ended when the provided function completes (unless endOnExit=false).\n *\n * @param fn - The function to execute within the span context\n * @param options - Span configuration including name\n * @returns The result of the provided function\n */\n async startActiveSpan<T>(fn: (span: Span) => Promise<T>, options: StartSpanOptions): Promise<T> {\n const ctx = options.context || otelContext.active();\n const endOnExit = options.endOnExit === undefined ? true : options.endOnExit; // default true\n const opts: SpanOptions = { attributes: options.attributes };\n\n return new Promise((resolve, reject) => {\n this.tracer.startActiveSpan(options.name, opts, ctx, async (span) => {\n try {\n const result = await fn(span);\n resolve(result);\n } catch (error) {\n reject(error);\n } finally {\n if (endOnExit) {\n span.end();\n }\n }\n });\n });\n }\n\n /**\n * Synchronous version of startActiveSpan for non-async operations.\n *\n * @param fn - The function to execute within the span context\n * @param options - Span configuration including name\n * @returns The result of the provided function\n */\n startActiveSpanSync<T>(fn: (span: Span) => T, options: StartSpanOptions): T {\n const ctx = options.context || otelContext.active();\n const endOnExit = options.endOnExit === undefined ? true : options.endOnExit; // default true\n const opts: SpanOptions = { attributes: options.attributes };\n\n return this.tracer.startActiveSpan(options.name, opts, ctx, (span) => {\n try {\n return fn(span);\n } finally {\n if (endOnExit) {\n span.end();\n }\n }\n });\n }\n}\n\n/**\n * The global tracer instance used throughout the agents framework.\n * This tracer can have its provider updated at runtime via setTracerProvider().\n */\nexport const tracer = new DynamicTracer('livekit-agents');\n\nclass MetadataSpanProcessor implements SpanProcessor {\n private metadata: Attributes;\n\n constructor(metadata: Attributes) {\n this.metadata = metadata;\n }\n\n onStart(span: Span, _parentContext: Context): void {\n span.setAttributes(this.metadata);\n }\n\n onEnd(_span: ReadableSpan): void {}\n\n shutdown(): Promise<void> {\n return Promise.resolve();\n }\n\n forceFlush(): Promise<void> {\n return Promise.resolve();\n }\n}\n\n// TODO(brian): PR4 - Add MetadataLogProcessor for structured logging\n\n// TODO(brian): PR4 - Add ExtraDetailsProcessor for structured logging\n\n/**\n * Set the tracer provider for the livekit-agents framework.\n * This should be called before agent session start if using custom tracer providers.\n *\n * @param provider - The tracer provider to use (must be a NodeTracerProvider)\n * @param options - Optional configuration with metadata property to inject into all spans\n *\n * @example\n * ```typescript\n * import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node';\n * import { setTracerProvider } from '@livekit/agents/telemetry';\n *\n * const provider = new NodeTracerProvider();\n * setTracerProvider(provider, {\n * metadata: { room_id: 'room123', job_id: 'job456' }\n * });\n * ```\n */\nexport function setTracerProvider(\n provider: NodeTracerProvider,\n options?: { metadata?: Attributes },\n): void {\n if (options?.metadata) {\n provider.addSpanProcessor(new MetadataSpanProcessor(options.metadata));\n }\n\n tracer.setProvider(provider);\n}\n\n/**\n * Setup OpenTelemetry tracer for LiveKit Cloud observability.\n * This configures OTLP exporters to send traces to LiveKit Cloud.\n *\n * @param options - Configuration for cloud tracer with roomId, jobId, and cloudHostname properties\n *\n * @internal\n */\nexport async function setupCloudTracer(options: {\n roomId: string;\n jobId: string;\n cloudHostname: string;\n}): Promise<void> {\n const { roomId, jobId, cloudHostname } = options;\n\n const apiKey = process.env.LIVEKIT_API_KEY;\n const apiSecret = process.env.LIVEKIT_API_SECRET;\n\n if (!apiKey || !apiSecret) {\n throw new Error('LIVEKIT_API_KEY and LIVEKIT_API_SECRET must be set for cloud tracing');\n }\n\n const token = new AccessToken(apiKey, apiSecret, {\n identity: 'livekit-agents-telemetry',\n ttl: '6h',\n });\n token.addObservabilityGrant({ write: true });\n\n try {\n const jwt = await token.toJwt();\n\n const headers = {\n Authorization: `Bearer ${jwt}`,\n };\n\n const metadata: Attributes = {\n room_id: roomId,\n job_id: jobId,\n };\n\n const resource = new Resource({\n [ATTR_SERVICE_NAME]: 'livekit-agents',\n room_id: roomId,\n job_id: jobId,\n });\n\n // Configure OTLP exporter to send traces to LiveKit Cloud\n const spanExporter = new OTLPTraceExporter({\n url: `https://${cloudHostname}/observability/traces/otlp/v0`,\n headers,\n compression: CompressionAlgorithm.GZIP,\n });\n\n const tracerProvider = new NodeTracerProvider({\n resource,\n spanProcessors: [new MetadataSpanProcessor(metadata), new BatchSpanProcessor(spanExporter)],\n });\n tracerProvider.register();\n\n // Metadata processor is already configured in the constructor above\n setTracerProvider(tracerProvider);\n\n // TODO(brian): PR4 - Add logger provider setup here for structured logging\n // Similar to Python's setup: LoggerProvider, OTLPLogExporter, BatchLogRecordProcessor\n } catch (error) {\n console.error('Failed to setup cloud tracer:', error);\n throw error;\n }\n}\n"],"mappings":"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","names":["otelContext"]}
@@ -0,0 +1,97 @@
1
+ import { type Attributes, type Context, type Span, type Tracer, type TracerProvider } from '@opentelemetry/api';
2
+ import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node';
3
+ export interface StartSpanOptions {
4
+ /** Name of the span */
5
+ name: string;
6
+ /** Optional parent context to use for this span */
7
+ context?: Context;
8
+ /** Attributes to set on the span when it starts */
9
+ attributes?: Attributes;
10
+ /** Whether to end the span when the function exits (default: true) */
11
+ endOnExit?: boolean;
12
+ }
13
+ /**
14
+ * A dynamic tracer that allows the tracer provider to be changed at runtime.
15
+ */
16
+ declare class DynamicTracer {
17
+ private tracerProvider;
18
+ private tracer;
19
+ private readonly instrumentingModuleName;
20
+ constructor(instrumentingModuleName: string);
21
+ /**
22
+ * Set a new tracer provider. This updates the underlying tracer instance.
23
+ * @param provider - The new tracer provider to use
24
+ */
25
+ setProvider(provider: TracerProvider): void;
26
+ /**
27
+ * Get the underlying OpenTelemetry tracer.
28
+ * Use this to access the full Tracer API when needed.
29
+ */
30
+ getTracer(): Tracer;
31
+ /**
32
+ * Start a span manually (without making it active).
33
+ * You must call span.end() when done.
34
+ *
35
+ * @param options - Span configuration including name
36
+ * @returns The created span
37
+ */
38
+ startSpan(options: StartSpanOptions): Span;
39
+ /**
40
+ * Start a new span and make it active in the current context.
41
+ * The span will automatically be ended when the provided function completes (unless endOnExit=false).
42
+ *
43
+ * @param fn - The function to execute within the span context
44
+ * @param options - Span configuration including name
45
+ * @returns The result of the provided function
46
+ */
47
+ startActiveSpan<T>(fn: (span: Span) => Promise<T>, options: StartSpanOptions): Promise<T>;
48
+ /**
49
+ * Synchronous version of startActiveSpan for non-async operations.
50
+ *
51
+ * @param fn - The function to execute within the span context
52
+ * @param options - Span configuration including name
53
+ * @returns The result of the provided function
54
+ */
55
+ startActiveSpanSync<T>(fn: (span: Span) => T, options: StartSpanOptions): T;
56
+ }
57
+ /**
58
+ * The global tracer instance used throughout the agents framework.
59
+ * This tracer can have its provider updated at runtime via setTracerProvider().
60
+ */
61
+ export declare const tracer: DynamicTracer;
62
+ /**
63
+ * Set the tracer provider for the livekit-agents framework.
64
+ * This should be called before agent session start if using custom tracer providers.
65
+ *
66
+ * @param provider - The tracer provider to use (must be a NodeTracerProvider)
67
+ * @param options - Optional configuration with metadata property to inject into all spans
68
+ *
69
+ * @example
70
+ * ```typescript
71
+ * import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node';
72
+ * import { setTracerProvider } from '@livekit/agents/telemetry';
73
+ *
74
+ * const provider = new NodeTracerProvider();
75
+ * setTracerProvider(provider, {
76
+ * metadata: { room_id: 'room123', job_id: 'job456' }
77
+ * });
78
+ * ```
79
+ */
80
+ export declare function setTracerProvider(provider: NodeTracerProvider, options?: {
81
+ metadata?: Attributes;
82
+ }): void;
83
+ /**
84
+ * Setup OpenTelemetry tracer for LiveKit Cloud observability.
85
+ * This configures OTLP exporters to send traces to LiveKit Cloud.
86
+ *
87
+ * @param options - Configuration for cloud tracer with roomId, jobId, and cloudHostname properties
88
+ *
89
+ * @internal
90
+ */
91
+ export declare function setupCloudTracer(options: {
92
+ roomId: string;
93
+ jobId: string;
94
+ cloudHostname: string;
95
+ }): Promise<void>;
96
+ export {};
97
+ //# sourceMappingURL=traces.d.ts.map
@@ -0,0 +1,97 @@
1
+ import { type Attributes, type Context, type Span, type Tracer, type TracerProvider } from '@opentelemetry/api';
2
+ import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node';
3
+ export interface StartSpanOptions {
4
+ /** Name of the span */
5
+ name: string;
6
+ /** Optional parent context to use for this span */
7
+ context?: Context;
8
+ /** Attributes to set on the span when it starts */
9
+ attributes?: Attributes;
10
+ /** Whether to end the span when the function exits (default: true) */
11
+ endOnExit?: boolean;
12
+ }
13
+ /**
14
+ * A dynamic tracer that allows the tracer provider to be changed at runtime.
15
+ */
16
+ declare class DynamicTracer {
17
+ private tracerProvider;
18
+ private tracer;
19
+ private readonly instrumentingModuleName;
20
+ constructor(instrumentingModuleName: string);
21
+ /**
22
+ * Set a new tracer provider. This updates the underlying tracer instance.
23
+ * @param provider - The new tracer provider to use
24
+ */
25
+ setProvider(provider: TracerProvider): void;
26
+ /**
27
+ * Get the underlying OpenTelemetry tracer.
28
+ * Use this to access the full Tracer API when needed.
29
+ */
30
+ getTracer(): Tracer;
31
+ /**
32
+ * Start a span manually (without making it active).
33
+ * You must call span.end() when done.
34
+ *
35
+ * @param options - Span configuration including name
36
+ * @returns The created span
37
+ */
38
+ startSpan(options: StartSpanOptions): Span;
39
+ /**
40
+ * Start a new span and make it active in the current context.
41
+ * The span will automatically be ended when the provided function completes (unless endOnExit=false).
42
+ *
43
+ * @param fn - The function to execute within the span context
44
+ * @param options - Span configuration including name
45
+ * @returns The result of the provided function
46
+ */
47
+ startActiveSpan<T>(fn: (span: Span) => Promise<T>, options: StartSpanOptions): Promise<T>;
48
+ /**
49
+ * Synchronous version of startActiveSpan for non-async operations.
50
+ *
51
+ * @param fn - The function to execute within the span context
52
+ * @param options - Span configuration including name
53
+ * @returns The result of the provided function
54
+ */
55
+ startActiveSpanSync<T>(fn: (span: Span) => T, options: StartSpanOptions): T;
56
+ }
57
+ /**
58
+ * The global tracer instance used throughout the agents framework.
59
+ * This tracer can have its provider updated at runtime via setTracerProvider().
60
+ */
61
+ export declare const tracer: DynamicTracer;
62
+ /**
63
+ * Set the tracer provider for the livekit-agents framework.
64
+ * This should be called before agent session start if using custom tracer providers.
65
+ *
66
+ * @param provider - The tracer provider to use (must be a NodeTracerProvider)
67
+ * @param options - Optional configuration with metadata property to inject into all spans
68
+ *
69
+ * @example
70
+ * ```typescript
71
+ * import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node';
72
+ * import { setTracerProvider } from '@livekit/agents/telemetry';
73
+ *
74
+ * const provider = new NodeTracerProvider();
75
+ * setTracerProvider(provider, {
76
+ * metadata: { room_id: 'room123', job_id: 'job456' }
77
+ * });
78
+ * ```
79
+ */
80
+ export declare function setTracerProvider(provider: NodeTracerProvider, options?: {
81
+ metadata?: Attributes;
82
+ }): void;
83
+ /**
84
+ * Setup OpenTelemetry tracer for LiveKit Cloud observability.
85
+ * This configures OTLP exporters to send traces to LiveKit Cloud.
86
+ *
87
+ * @param options - Configuration for cloud tracer with roomId, jobId, and cloudHostname properties
88
+ *
89
+ * @internal
90
+ */
91
+ export declare function setupCloudTracer(options: {
92
+ roomId: string;
93
+ jobId: string;
94
+ cloudHostname: string;
95
+ }): Promise<void>;
96
+ export {};
97
+ //# sourceMappingURL=traces.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traces.d.ts","sourceRoot":"","sources":["../../src/telemetry/traces.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,UAAU,EACf,KAAK,OAAO,EACZ,KAAK,IAAI,EAET,KAAK,MAAM,EACX,KAAK,cAAc,EAGpB,MAAM,oBAAoB,CAAC;AAK5B,OAAO,EAAsB,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAIvF,MAAM,WAAW,gBAAgB;IAC/B,uBAAuB;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,mDAAmD;IACnD,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,sEAAsE;IACtE,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,cAAM,aAAa;IACjB,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAS;gBAErC,uBAAuB,EAAE,MAAM;IAM3C;;;OAGG;IACH,WAAW,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI;IAK3C;;;OAGG;IACH,SAAS,IAAI,MAAM;IAInB;;;;;;OAMG;IACH,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI;IAa1C;;;;;;;OAOG;IACG,eAAe,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,CAAC,CAAC;IAqB/F;;;;;;OAMG;IACH,mBAAmB,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,OAAO,EAAE,gBAAgB,GAAG,CAAC;CAe5E;AAED;;;GAGG;AACH,eAAO,MAAM,MAAM,eAAsC,CAAC;AA4B1D;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,UAAU,CAAA;CAAE,GAClC,IAAI,CAMN;AAED;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE;IAC9C,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwDhB"}