@livekit/agents 1.0.35 → 1.0.36-dev.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/dist/index.cjs +3 -1
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.d.cts +1 -0
  4. package/dist/index.d.ts +1 -0
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +1 -0
  7. package/dist/index.js.map +1 -1
  8. package/dist/inference/interruption/AdaptiveInterruptionDetector.cjs +152 -0
  9. package/dist/inference/interruption/AdaptiveInterruptionDetector.cjs.map +1 -0
  10. package/dist/inference/interruption/AdaptiveInterruptionDetector.d.cts +50 -0
  11. package/dist/inference/interruption/AdaptiveInterruptionDetector.d.ts +50 -0
  12. package/dist/inference/interruption/AdaptiveInterruptionDetector.d.ts.map +1 -0
  13. package/dist/inference/interruption/AdaptiveInterruptionDetector.js +125 -0
  14. package/dist/inference/interruption/AdaptiveInterruptionDetector.js.map +1 -0
  15. package/dist/inference/interruption/InterruptionStream.cjs +310 -0
  16. package/dist/inference/interruption/InterruptionStream.cjs.map +1 -0
  17. package/dist/inference/interruption/InterruptionStream.d.cts +57 -0
  18. package/dist/inference/interruption/InterruptionStream.d.ts +57 -0
  19. package/dist/inference/interruption/InterruptionStream.d.ts.map +1 -0
  20. package/dist/inference/interruption/InterruptionStream.js +288 -0
  21. package/dist/inference/interruption/InterruptionStream.js.map +1 -0
  22. package/dist/inference/interruption/defaults.cjs +76 -0
  23. package/dist/inference/interruption/defaults.cjs.map +1 -0
  24. package/dist/inference/interruption/defaults.d.cts +14 -0
  25. package/dist/inference/interruption/defaults.d.ts +14 -0
  26. package/dist/inference/interruption/defaults.d.ts.map +1 -0
  27. package/dist/inference/interruption/defaults.js +42 -0
  28. package/dist/inference/interruption/defaults.js.map +1 -0
  29. package/dist/inference/interruption/errors.cjs +2 -0
  30. package/dist/inference/interruption/errors.cjs.map +1 -0
  31. package/dist/inference/interruption/errors.d.cts +2 -0
  32. package/dist/inference/interruption/errors.d.ts +2 -0
  33. package/dist/inference/interruption/errors.d.ts.map +1 -0
  34. package/dist/inference/interruption/errors.js +1 -0
  35. package/dist/inference/interruption/errors.js.map +1 -0
  36. package/dist/inference/interruption/http_transport.cjs +57 -0
  37. package/dist/inference/interruption/http_transport.cjs.map +1 -0
  38. package/dist/inference/interruption/http_transport.d.cts +23 -0
  39. package/dist/inference/interruption/http_transport.d.ts +23 -0
  40. package/dist/inference/interruption/http_transport.d.ts.map +1 -0
  41. package/dist/inference/interruption/http_transport.js +33 -0
  42. package/dist/inference/interruption/http_transport.js.map +1 -0
  43. package/dist/inference/interruption/index.cjs +34 -0
  44. package/dist/inference/interruption/index.cjs.map +1 -0
  45. package/dist/inference/interruption/index.d.cts +5 -0
  46. package/dist/inference/interruption/index.d.ts +5 -0
  47. package/dist/inference/interruption/index.d.ts.map +1 -0
  48. package/dist/inference/interruption/index.js +7 -0
  49. package/dist/inference/interruption/index.js.map +1 -0
  50. package/dist/inference/interruption/interruption.cjs +85 -0
  51. package/dist/inference/interruption/interruption.cjs.map +1 -0
  52. package/dist/inference/interruption/interruption.d.cts +48 -0
  53. package/dist/inference/interruption/interruption.d.ts +48 -0
  54. package/dist/inference/interruption/interruption.d.ts.map +1 -0
  55. package/dist/inference/interruption/interruption.js +59 -0
  56. package/dist/inference/interruption/interruption.js.map +1 -0
  57. package/dist/inference/utils.cjs +15 -2
  58. package/dist/inference/utils.cjs.map +1 -1
  59. package/dist/inference/utils.d.cts +1 -0
  60. package/dist/inference/utils.d.ts +1 -0
  61. package/dist/inference/utils.d.ts.map +1 -1
  62. package/dist/inference/utils.js +13 -1
  63. package/dist/inference/utils.js.map +1 -1
  64. package/dist/inference/utils.test.cjs +20 -0
  65. package/dist/inference/utils.test.cjs.map +1 -0
  66. package/dist/inference/utils.test.js +19 -0
  67. package/dist/inference/utils.test.js.map +1 -0
  68. package/dist/stream/stream_channel.cjs +3 -0
  69. package/dist/stream/stream_channel.cjs.map +1 -1
  70. package/dist/stream/stream_channel.d.cts +3 -2
  71. package/dist/stream/stream_channel.d.ts +3 -2
  72. package/dist/stream/stream_channel.d.ts.map +1 -1
  73. package/dist/stream/stream_channel.js +3 -0
  74. package/dist/stream/stream_channel.js.map +1 -1
  75. package/dist/telemetry/trace_types.cjs +15 -0
  76. package/dist/telemetry/trace_types.cjs.map +1 -1
  77. package/dist/telemetry/trace_types.d.cts +5 -0
  78. package/dist/telemetry/trace_types.d.ts +5 -0
  79. package/dist/telemetry/trace_types.d.ts.map +1 -1
  80. package/dist/telemetry/trace_types.js +10 -0
  81. package/dist/telemetry/trace_types.js.map +1 -1
  82. package/dist/utils/ws_transport.cjs +51 -0
  83. package/dist/utils/ws_transport.cjs.map +1 -0
  84. package/dist/utils/ws_transport.d.cts +9 -0
  85. package/dist/utils/ws_transport.d.ts +9 -0
  86. package/dist/utils/ws_transport.d.ts.map +1 -0
  87. package/dist/utils/ws_transport.js +17 -0
  88. package/dist/utils/ws_transport.js.map +1 -0
  89. package/dist/utils/ws_transport.test.cjs +212 -0
  90. package/dist/utils/ws_transport.test.cjs.map +1 -0
  91. package/dist/utils/ws_transport.test.js +211 -0
  92. package/dist/utils/ws_transport.test.js.map +1 -0
  93. package/dist/voice/agent_activity.cjs +49 -0
  94. package/dist/voice/agent_activity.cjs.map +1 -1
  95. package/dist/voice/agent_activity.d.cts +14 -0
  96. package/dist/voice/agent_activity.d.ts +14 -0
  97. package/dist/voice/agent_activity.d.ts.map +1 -1
  98. package/dist/voice/agent_activity.js +49 -0
  99. package/dist/voice/agent_activity.js.map +1 -1
  100. package/dist/voice/agent_session.cjs +12 -1
  101. package/dist/voice/agent_session.cjs.map +1 -1
  102. package/dist/voice/agent_session.d.cts +3 -0
  103. package/dist/voice/agent_session.d.ts +3 -0
  104. package/dist/voice/agent_session.d.ts.map +1 -1
  105. package/dist/voice/agent_session.js +12 -1
  106. package/dist/voice/agent_session.js.map +1 -1
  107. package/dist/voice/audio_recognition.cjs +124 -2
  108. package/dist/voice/audio_recognition.cjs.map +1 -1
  109. package/dist/voice/audio_recognition.d.cts +32 -1
  110. package/dist/voice/audio_recognition.d.ts +32 -1
  111. package/dist/voice/audio_recognition.d.ts.map +1 -1
  112. package/dist/voice/audio_recognition.js +127 -2
  113. package/dist/voice/audio_recognition.js.map +1 -1
  114. package/package.json +2 -1
  115. package/src/index.ts +2 -0
  116. package/src/inference/interruption/AdaptiveInterruptionDetector.ts +166 -0
  117. package/src/inference/interruption/InterruptionStream.ts +397 -0
  118. package/src/inference/interruption/defaults.ts +33 -0
  119. package/src/inference/interruption/errors.ts +0 -0
  120. package/src/inference/interruption/http_transport.ts +61 -0
  121. package/src/inference/interruption/index.ts +4 -0
  122. package/src/inference/interruption/interruption.ts +88 -0
  123. package/src/inference/utils.test.ts +31 -0
  124. package/src/inference/utils.ts +15 -0
  125. package/src/stream/stream_channel.ts +6 -2
  126. package/src/telemetry/trace_types.ts +7 -0
  127. package/src/utils/ws_transport.test.ts +282 -0
  128. package/src/utils/ws_transport.ts +22 -0
  129. package/src/voice/agent_activity.ts +61 -0
  130. package/src/voice/agent_session.ts +22 -2
  131. package/src/voice/audio_recognition.ts +161 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/stream/stream_channel.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { ReadableStream } from 'node:stream/web';\nimport { IdentityTransform } from './identity_transform.js';\n\nexport interface StreamChannel<T> {\n write(chunk: T): Promise<void>;\n close(): Promise<void>;\n stream(): ReadableStream<T>;\n readonly closed: boolean;\n}\n\nexport function createStreamChannel<T>(): StreamChannel<T> {\n const transform = new IdentityTransform<T>();\n const writer = transform.writable.getWriter();\n let isClosed = false;\n\n return {\n write: (chunk: T) => writer.write(chunk),\n stream: () => transform.readable,\n close: async () => {\n try {\n const result = await writer.close();\n isClosed = true;\n return result;\n } catch (e) {\n if (e instanceof Error && e.name === 'TypeError') {\n // Ignore error if the stream is already closed\n isClosed = true;\n return;\n }\n throw e;\n }\n },\n get closed() {\n return isClosed;\n },\n };\n}\n"],"mappings":"AAIA,SAAS,yBAAyB;AAS3B,SAAS,sBAA2C;AACzD,QAAM,YAAY,IAAI,kBAAqB;AAC3C,QAAM,SAAS,UAAU,SAAS,UAAU;AAC5C,MAAI,WAAW;AAEf,SAAO;AAAA,IACL,OAAO,CAAC,UAAa,OAAO,MAAM,KAAK;AAAA,IACvC,QAAQ,MAAM,UAAU;AAAA,IACxB,OAAO,YAAY;AACjB,UAAI;AACF,cAAM,SAAS,MAAM,OAAO,MAAM;AAClC,mBAAW;AACX,eAAO;AAAA,MACT,SAAS,GAAG;AACV,YAAI,aAAa,SAAS,EAAE,SAAS,aAAa;AAEhD,qBAAW;AACX;AAAA,QACF;AACA,cAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,IAAI,SAAS;AACX,aAAO;AAAA,IACT;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/stream/stream_channel.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { ReadableStream } from 'node:stream/web';\nimport { IdentityTransform } from './identity_transform.js';\n\nexport interface StreamChannel<T, E extends Error = Error> {\n write(chunk: T): Promise<void>;\n close(): Promise<void>;\n stream(): ReadableStream<T>;\n abort(error: E): Promise<void>;\n readonly closed: boolean;\n}\n\nexport function createStreamChannel<T, E extends Error = Error>(): StreamChannel<T, E> {\n const transform = new IdentityTransform<T>();\n const writer = transform.writable.getWriter();\n let isClosed = false;\n\n return {\n write: (chunk: T) => writer.write(chunk),\n stream: () => transform.readable,\n abort: (error: E) => {\n return writer.abort(error);\n },\n close: async () => {\n try {\n const result = await writer.close();\n isClosed = true;\n return result;\n } catch (e) {\n if (e instanceof Error && e.name === 'TypeError') {\n // Ignore error if the stream is already closed\n isClosed = true;\n return;\n }\n throw e;\n }\n },\n get closed() {\n return isClosed;\n },\n };\n}\n"],"mappings":"AAIA,SAAS,yBAAyB;AAU3B,SAAS,sBAAuE;AACrF,QAAM,YAAY,IAAI,kBAAqB;AAC3C,QAAM,SAAS,UAAU,SAAS,UAAU;AAC5C,MAAI,WAAW;AAEf,SAAO;AAAA,IACL,OAAO,CAAC,UAAa,OAAO,MAAM,KAAK;AAAA,IACvC,QAAQ,MAAM,UAAU;AAAA,IACxB,OAAO,CAAC,UAAa;AACnB,aAAO,OAAO,MAAM,KAAK;AAAA,IAC3B;AAAA,IACA,OAAO,YAAY;AACjB,UAAI;AACF,cAAM,SAAS,MAAM,OAAO,MAAM;AAClC,mBAAW;AACX,eAAO;AAAA,MACT,SAAS,GAAG;AACV,YAAI,aAAa,SAAS,EAAE,SAAS,aAAa;AAEhD,qBAAW;AACX;AAAA,QACF;AACA,cAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,IAAI,SAAS;AACX,aAAO;AAAA,IACT;AAAA,EACF;AACF;","names":[]}
@@ -45,6 +45,11 @@ __export(trace_types_exports, {
45
45
  ATTR_GEN_AI_USAGE_OUTPUT_TEXT_TOKENS: () => ATTR_GEN_AI_USAGE_OUTPUT_TEXT_TOKENS,
46
46
  ATTR_GEN_AI_USAGE_OUTPUT_TOKENS: () => ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,
47
47
  ATTR_INSTRUCTIONS: () => ATTR_INSTRUCTIONS,
48
+ ATTR_INTERRUPTION_DETECTION_DELAY: () => ATTR_INTERRUPTION_DETECTION_DELAY,
49
+ ATTR_INTERRUPTION_PREDICTION_DURATION: () => ATTR_INTERRUPTION_PREDICTION_DURATION,
50
+ ATTR_INTERRUPTION_PROBABILITY: () => ATTR_INTERRUPTION_PROBABILITY,
51
+ ATTR_INTERRUPTION_TOTAL_DURATION: () => ATTR_INTERRUPTION_TOTAL_DURATION,
52
+ ATTR_IS_INTERRUPTION: () => ATTR_IS_INTERRUPTION,
48
53
  ATTR_JOB_ID: () => ATTR_JOB_ID,
49
54
  ATTR_LANGFUSE_COMPLETION_START_TIME: () => ATTR_LANGFUSE_COMPLETION_START_TIME,
50
55
  ATTR_LLM_METRICS: () => ATTR_LLM_METRICS,
@@ -109,6 +114,11 @@ const ATTR_USER_TRANSCRIPT = "lk.user_transcript";
109
114
  const ATTR_TRANSCRIPT_CONFIDENCE = "lk.transcript_confidence";
110
115
  const ATTR_TRANSCRIPTION_DELAY = "lk.transcription_delay";
111
116
  const ATTR_END_OF_TURN_DELAY = "lk.end_of_turn_delay";
117
+ const ATTR_IS_INTERRUPTION = "lk.is_interruption";
118
+ const ATTR_INTERRUPTION_PROBABILITY = "lk.interruption.probability";
119
+ const ATTR_INTERRUPTION_TOTAL_DURATION = "lk.interruption.total_duration";
120
+ const ATTR_INTERRUPTION_PREDICTION_DURATION = "lk.interruption.prediction_duration";
121
+ const ATTR_INTERRUPTION_DETECTION_DELAY = "lk.interruption.detection_delay";
112
122
  const ATTR_LLM_METRICS = "lk.llm_metrics";
113
123
  const ATTR_TTS_METRICS = "lk.tts_metrics";
114
124
  const ATTR_REALTIME_MODEL_METRICS = "lk.realtime_model_metrics";
@@ -159,6 +169,11 @@ const ATTR_LANGFUSE_COMPLETION_START_TIME = "langfuse.observation.completion_sta
159
169
  ATTR_GEN_AI_USAGE_OUTPUT_TEXT_TOKENS,
160
170
  ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,
161
171
  ATTR_INSTRUCTIONS,
172
+ ATTR_INTERRUPTION_DETECTION_DELAY,
173
+ ATTR_INTERRUPTION_PREDICTION_DURATION,
174
+ ATTR_INTERRUPTION_PROBABILITY,
175
+ ATTR_INTERRUPTION_TOTAL_DURATION,
176
+ ATTR_IS_INTERRUPTION,
162
177
  ATTR_JOB_ID,
163
178
  ATTR_LANGFUSE_COMPLETION_START_TIME,
164
179
  ATTR_LLM_METRICS,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/telemetry/trace_types.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\n\n// LiveKit custom attributes\nexport const ATTR_SPEECH_ID = 'lk.speech_id';\nexport const ATTR_AGENT_LABEL = 'lk.agent_label';\nexport const ATTR_START_TIME = 'lk.start_time';\nexport const ATTR_END_TIME = 'lk.end_time';\nexport const ATTR_RETRY_COUNT = 'lk.retry_count';\n\nexport const ATTR_PARTICIPANT_ID = 'lk.participant_id';\nexport const ATTR_PARTICIPANT_IDENTITY = 'lk.participant_identity';\nexport const ATTR_PARTICIPANT_KIND = 'lk.participant_kind';\n\n// session start\nexport const ATTR_JOB_ID = 'lk.job_id';\nexport const ATTR_AGENT_NAME = 'lk.agent_name';\nexport const ATTR_ROOM_NAME = 'lk.room_name';\nexport const ATTR_SESSION_OPTIONS = 'lk.session_options';\n\n// assistant turn\nexport const ATTR_USER_INPUT = 'lk.user_input';\nexport const ATTR_INSTRUCTIONS = 'lk.instructions';\nexport const ATTR_SPEECH_INTERRUPTED = 'lk.interrupted';\n\n// llm node\nexport const ATTR_CHAT_CTX = 'lk.chat_ctx';\nexport const ATTR_FUNCTION_TOOLS = 'lk.function_tools';\nexport const ATTR_RESPONSE_TEXT = 'lk.response.text';\nexport const ATTR_RESPONSE_FUNCTION_CALLS = 'lk.response.function_calls';\n\n// function tool\nexport const ATTR_FUNCTION_TOOL_NAME = 'lk.function_tool.name';\nexport const ATTR_FUNCTION_TOOL_ARGS = 'lk.function_tool.arguments';\nexport const ATTR_FUNCTION_TOOL_IS_ERROR = 'lk.function_tool.is_error';\nexport const ATTR_FUNCTION_TOOL_OUTPUT = 'lk.function_tool.output';\n\n// tts node\nexport const ATTR_TTS_INPUT_TEXT = 'lk.input_text';\nexport const ATTR_TTS_STREAMING = 'lk.tts.streaming';\nexport const ATTR_TTS_LABEL = 'lk.tts.label';\n\n// eou detection\nexport const ATTR_EOU_PROBABILITY = 'lk.eou.probability';\nexport const ATTR_EOU_UNLIKELY_THRESHOLD = 'lk.eou.unlikely_threshold';\nexport const ATTR_EOU_DELAY = 'lk.eou.endpointing_delay';\nexport const ATTR_EOU_LANGUAGE = 'lk.eou.language';\nexport const ATTR_USER_TRANSCRIPT = 'lk.user_transcript';\nexport const ATTR_TRANSCRIPT_CONFIDENCE = 'lk.transcript_confidence';\nexport const ATTR_TRANSCRIPTION_DELAY = 'lk.transcription_delay';\nexport const ATTR_END_OF_TURN_DELAY = 'lk.end_of_turn_delay';\n\n// metrics\nexport const ATTR_LLM_METRICS = 'lk.llm_metrics';\nexport const ATTR_TTS_METRICS = 'lk.tts_metrics';\nexport const ATTR_REALTIME_MODEL_METRICS = 'lk.realtime_model_metrics';\n\n// OpenTelemetry GenAI attributes\n// OpenTelemetry specification: https://opentelemetry.io/docs/specs/semconv/registry/attributes/gen-ai/\nexport const ATTR_GEN_AI_OPERATION_NAME = 'gen_ai.operation.name';\nexport const ATTR_GEN_AI_REQUEST_MODEL = 'gen_ai.request.model';\nexport const ATTR_GEN_AI_USAGE_INPUT_TOKENS = 'gen_ai.usage.input_tokens';\nexport const ATTR_GEN_AI_USAGE_OUTPUT_TOKENS = 'gen_ai.usage.output_tokens';\n\n// Unofficial OpenTelemetry GenAI attributes, recognized by LangFuse\n// https://langfuse.com/integrations/native/opentelemetry#usage\n// but not yet in the official OpenTelemetry specification.\nexport const ATTR_GEN_AI_USAGE_INPUT_TEXT_TOKENS = 'gen_ai.usage.input_text_tokens';\nexport const ATTR_GEN_AI_USAGE_INPUT_AUDIO_TOKENS = 'gen_ai.usage.input_audio_tokens';\nexport const ATTR_GEN_AI_USAGE_INPUT_CACHED_TOKENS = 'gen_ai.usage.input_cached_tokens';\nexport const ATTR_GEN_AI_USAGE_OUTPUT_TEXT_TOKENS = 'gen_ai.usage.output_text_tokens';\nexport const ATTR_GEN_AI_USAGE_OUTPUT_AUDIO_TOKENS = 'gen_ai.usage.output_audio_tokens';\n\n// OpenTelemetry GenAI event names (for structured logging)\nexport const EVENT_GEN_AI_SYSTEM_MESSAGE = 'gen_ai.system.message';\nexport const EVENT_GEN_AI_USER_MESSAGE = 'gen_ai.user.message';\nexport const EVENT_GEN_AI_ASSISTANT_MESSAGE = 'gen_ai.assistant.message';\nexport const EVENT_GEN_AI_TOOL_MESSAGE = 'gen_ai.tool.message';\nexport const EVENT_GEN_AI_CHOICE = 'gen_ai.choice';\n\n// Exception attributes\nexport const ATTR_EXCEPTION_TRACE = 'exception.stacktrace';\nexport const ATTR_EXCEPTION_TYPE = 'exception.type';\nexport const ATTR_EXCEPTION_MESSAGE = 'exception.message';\n\n// Platform-specific attributes\nexport const ATTR_LANGFUSE_COMPLETION_START_TIME = 'langfuse.observation.completion_start_time';\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAKO,MAAM,iBAAiB;AACvB,MAAM,mBAAmB;AACzB,MAAM,kBAAkB;AACxB,MAAM,gBAAgB;AACtB,MAAM,mBAAmB;AAEzB,MAAM,sBAAsB;AAC5B,MAAM,4BAA4B;AAClC,MAAM,wBAAwB;AAG9B,MAAM,cAAc;AACpB,MAAM,kBAAkB;AACxB,MAAM,iBAAiB;AACvB,MAAM,uBAAuB;AAG7B,MAAM,kBAAkB;AACxB,MAAM,oBAAoB;AAC1B,MAAM,0BAA0B;AAGhC,MAAM,gBAAgB;AACtB,MAAM,sBAAsB;AAC5B,MAAM,qBAAqB;AAC3B,MAAM,+BAA+B;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":[]}
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// Adaptive Interruption attributes\nexport const ATTR_IS_INTERRUPTION = 'lk.is_interruption';\nexport const ATTR_INTERRUPTION_PROBABILITY = 'lk.interruption.probability';\nexport const ATTR_INTERRUPTION_TOTAL_DURATION = 'lk.interruption.total_duration';\nexport const ATTR_INTERRUPTION_PREDICTION_DURATION = 'lk.interruption.prediction_duration';\nexport const ATTR_INTERRUPTION_DETECTION_DELAY = 'lk.interruption.detection_delay';\n\n// metrics\nexport const ATTR_LLM_METRICS = 'lk.llm_metrics';\nexport const ATTR_TTS_METRICS = 'lk.tts_metrics';\nexport const ATTR_REALTIME_MODEL_METRICS = 'lk.realtime_model_metrics';\n\n// OpenTelemetry GenAI attributes\n// OpenTelemetry specification: https://opentelemetry.io/docs/specs/semconv/registry/attributes/gen-ai/\nexport const ATTR_GEN_AI_OPERATION_NAME = 'gen_ai.operation.name';\nexport const ATTR_GEN_AI_REQUEST_MODEL = 'gen_ai.request.model';\nexport const ATTR_GEN_AI_USAGE_INPUT_TOKENS = 'gen_ai.usage.input_tokens';\nexport const ATTR_GEN_AI_USAGE_OUTPUT_TOKENS = 'gen_ai.usage.output_tokens';\n\n// Unofficial OpenTelemetry GenAI attributes, recognized by LangFuse\n// https://langfuse.com/integrations/native/opentelemetry#usage\n// but not yet in the official OpenTelemetry specification.\nexport const ATTR_GEN_AI_USAGE_INPUT_TEXT_TOKENS = 'gen_ai.usage.input_text_tokens';\nexport const ATTR_GEN_AI_USAGE_INPUT_AUDIO_TOKENS = 'gen_ai.usage.input_audio_tokens';\nexport const ATTR_GEN_AI_USAGE_INPUT_CACHED_TOKENS = 'gen_ai.usage.input_cached_tokens';\nexport const ATTR_GEN_AI_USAGE_OUTPUT_TEXT_TOKENS = 'gen_ai.usage.output_text_tokens';\nexport const ATTR_GEN_AI_USAGE_OUTPUT_AUDIO_TOKENS = 'gen_ai.usage.output_audio_tokens';\n\n// OpenTelemetry GenAI event names (for structured logging)\nexport const EVENT_GEN_AI_SYSTEM_MESSAGE = 'gen_ai.system.message';\nexport const EVENT_GEN_AI_USER_MESSAGE = 'gen_ai.user.message';\nexport const EVENT_GEN_AI_ASSISTANT_MESSAGE = 'gen_ai.assistant.message';\nexport const EVENT_GEN_AI_TOOL_MESSAGE = 'gen_ai.tool.message';\nexport const EVENT_GEN_AI_CHOICE = 'gen_ai.choice';\n\n// Exception attributes\nexport const ATTR_EXCEPTION_TRACE = 'exception.stacktrace';\nexport const ATTR_EXCEPTION_TYPE = 'exception.type';\nexport const ATTR_EXCEPTION_MESSAGE = 'exception.message';\n\n// Platform-specific attributes\nexport const ATTR_LANGFUSE_COMPLETION_START_TIME = 'langfuse.observation.completion_start_time';\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAKO,MAAM,iBAAiB;AACvB,MAAM,mBAAmB;AACzB,MAAM,kBAAkB;AACxB,MAAM,gBAAgB;AACtB,MAAM,mBAAmB;AAEzB,MAAM,sBAAsB;AAC5B,MAAM,4BAA4B;AAClC,MAAM,wBAAwB;AAG9B,MAAM,cAAc;AACpB,MAAM,kBAAkB;AACxB,MAAM,iBAAiB;AACvB,MAAM,uBAAuB;AAG7B,MAAM,kBAAkB;AACxB,MAAM,oBAAoB;AAC1B,MAAM,0BAA0B;AAGhC,MAAM,gBAAgB;AACtB,MAAM,sBAAsB;AAC5B,MAAM,qBAAqB;AAC3B,MAAM,+BAA+B;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,uBAAuB;AAC7B,MAAM,gCAAgC;AACtC,MAAM,mCAAmC;AACzC,MAAM,wCAAwC;AAC9C,MAAM,oCAAoC;AAG1C,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":[]}
@@ -32,6 +32,11 @@ export declare const ATTR_USER_TRANSCRIPT = "lk.user_transcript";
32
32
  export declare const ATTR_TRANSCRIPT_CONFIDENCE = "lk.transcript_confidence";
33
33
  export declare const ATTR_TRANSCRIPTION_DELAY = "lk.transcription_delay";
34
34
  export declare const ATTR_END_OF_TURN_DELAY = "lk.end_of_turn_delay";
35
+ export declare const ATTR_IS_INTERRUPTION = "lk.is_interruption";
36
+ export declare const ATTR_INTERRUPTION_PROBABILITY = "lk.interruption.probability";
37
+ export declare const ATTR_INTERRUPTION_TOTAL_DURATION = "lk.interruption.total_duration";
38
+ export declare const ATTR_INTERRUPTION_PREDICTION_DURATION = "lk.interruption.prediction_duration";
39
+ export declare const ATTR_INTERRUPTION_DETECTION_DELAY = "lk.interruption.detection_delay";
35
40
  export declare const ATTR_LLM_METRICS = "lk.llm_metrics";
36
41
  export declare const ATTR_TTS_METRICS = "lk.tts_metrics";
37
42
  export declare const ATTR_REALTIME_MODEL_METRICS = "lk.realtime_model_metrics";
@@ -32,6 +32,11 @@ export declare const ATTR_USER_TRANSCRIPT = "lk.user_transcript";
32
32
  export declare const ATTR_TRANSCRIPT_CONFIDENCE = "lk.transcript_confidence";
33
33
  export declare const ATTR_TRANSCRIPTION_DELAY = "lk.transcription_delay";
34
34
  export declare const ATTR_END_OF_TURN_DELAY = "lk.end_of_turn_delay";
35
+ export declare const ATTR_IS_INTERRUPTION = "lk.is_interruption";
36
+ export declare const ATTR_INTERRUPTION_PROBABILITY = "lk.interruption.probability";
37
+ export declare const ATTR_INTERRUPTION_TOTAL_DURATION = "lk.interruption.total_duration";
38
+ export declare const ATTR_INTERRUPTION_PREDICTION_DURATION = "lk.interruption.prediction_duration";
39
+ export declare const ATTR_INTERRUPTION_DETECTION_DELAY = "lk.interruption.detection_delay";
35
40
  export declare const ATTR_LLM_METRICS = "lk.llm_metrics";
36
41
  export declare const ATTR_TTS_METRICS = "lk.tts_metrics";
37
42
  export declare const ATTR_REALTIME_MODEL_METRICS = "lk.realtime_model_metrics";
@@ -1 +1 @@
1
- {"version":3,"file":"trace_types.d.ts","sourceRoot":"","sources":["../../src/telemetry/trace_types.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,cAAc,iBAAiB,CAAC;AAC7C,eAAO,MAAM,gBAAgB,mBAAmB,CAAC;AACjD,eAAO,MAAM,eAAe,kBAAkB,CAAC;AAC/C,eAAO,MAAM,aAAa,gBAAgB,CAAC;AAC3C,eAAO,MAAM,gBAAgB,mBAAmB,CAAC;AAEjD,eAAO,MAAM,mBAAmB,sBAAsB,CAAC;AACvD,eAAO,MAAM,yBAAyB,4BAA4B,CAAC;AACnE,eAAO,MAAM,qBAAqB,wBAAwB,CAAC;AAG3D,eAAO,MAAM,WAAW,cAAc,CAAC;AACvC,eAAO,MAAM,eAAe,kBAAkB,CAAC;AAC/C,eAAO,MAAM,cAAc,iBAAiB,CAAC;AAC7C,eAAO,MAAM,oBAAoB,uBAAuB,CAAC;AAGzD,eAAO,MAAM,eAAe,kBAAkB,CAAC;AAC/C,eAAO,MAAM,iBAAiB,oBAAoB,CAAC;AACnD,eAAO,MAAM,uBAAuB,mBAAmB,CAAC;AAGxD,eAAO,MAAM,aAAa,gBAAgB,CAAC;AAC3C,eAAO,MAAM,mBAAmB,sBAAsB,CAAC;AACvD,eAAO,MAAM,kBAAkB,qBAAqB,CAAC;AACrD,eAAO,MAAM,4BAA4B,+BAA+B,CAAC;AAGzE,eAAO,MAAM,uBAAuB,0BAA0B,CAAC;AAC/D,eAAO,MAAM,uBAAuB,+BAA+B,CAAC;AACpE,eAAO,MAAM,2BAA2B,8BAA8B,CAAC;AACvE,eAAO,MAAM,yBAAyB,4BAA4B,CAAC;AAGnE,eAAO,MAAM,mBAAmB,kBAAkB,CAAC;AACnD,eAAO,MAAM,kBAAkB,qBAAqB,CAAC;AACrD,eAAO,MAAM,cAAc,iBAAiB,CAAC;AAG7C,eAAO,MAAM,oBAAoB,uBAAuB,CAAC;AACzD,eAAO,MAAM,2BAA2B,8BAA8B,CAAC;AACvE,eAAO,MAAM,cAAc,6BAA6B,CAAC;AACzD,eAAO,MAAM,iBAAiB,oBAAoB,CAAC;AACnD,eAAO,MAAM,oBAAoB,uBAAuB,CAAC;AACzD,eAAO,MAAM,0BAA0B,6BAA6B,CAAC;AACrE,eAAO,MAAM,wBAAwB,2BAA2B,CAAC;AACjE,eAAO,MAAM,sBAAsB,yBAAyB,CAAC;AAG7D,eAAO,MAAM,gBAAgB,mBAAmB,CAAC;AACjD,eAAO,MAAM,gBAAgB,mBAAmB,CAAC;AACjD,eAAO,MAAM,2BAA2B,8BAA8B,CAAC;AAIvE,eAAO,MAAM,0BAA0B,0BAA0B,CAAC;AAClE,eAAO,MAAM,yBAAyB,yBAAyB,CAAC;AAChE,eAAO,MAAM,8BAA8B,8BAA8B,CAAC;AAC1E,eAAO,MAAM,+BAA+B,+BAA+B,CAAC;AAK5E,eAAO,MAAM,mCAAmC,mCAAmC,CAAC;AACpF,eAAO,MAAM,oCAAoC,oCAAoC,CAAC;AACtF,eAAO,MAAM,qCAAqC,qCAAqC,CAAC;AACxF,eAAO,MAAM,oCAAoC,oCAAoC,CAAC;AACtF,eAAO,MAAM,qCAAqC,qCAAqC,CAAC;AAGxF,eAAO,MAAM,2BAA2B,0BAA0B,CAAC;AACnE,eAAO,MAAM,yBAAyB,wBAAwB,CAAC;AAC/D,eAAO,MAAM,8BAA8B,6BAA6B,CAAC;AACzE,eAAO,MAAM,yBAAyB,wBAAwB,CAAC;AAC/D,eAAO,MAAM,mBAAmB,kBAAkB,CAAC;AAGnD,eAAO,MAAM,oBAAoB,yBAAyB,CAAC;AAC3D,eAAO,MAAM,mBAAmB,mBAAmB,CAAC;AACpD,eAAO,MAAM,sBAAsB,sBAAsB,CAAC;AAG1D,eAAO,MAAM,mCAAmC,+CAA+C,CAAC"}
1
+ {"version":3,"file":"trace_types.d.ts","sourceRoot":"","sources":["../../src/telemetry/trace_types.ts"],"names":[],"mappings":"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"}
@@ -32,6 +32,11 @@ const ATTR_USER_TRANSCRIPT = "lk.user_transcript";
32
32
  const ATTR_TRANSCRIPT_CONFIDENCE = "lk.transcript_confidence";
33
33
  const ATTR_TRANSCRIPTION_DELAY = "lk.transcription_delay";
34
34
  const ATTR_END_OF_TURN_DELAY = "lk.end_of_turn_delay";
35
+ const ATTR_IS_INTERRUPTION = "lk.is_interruption";
36
+ const ATTR_INTERRUPTION_PROBABILITY = "lk.interruption.probability";
37
+ const ATTR_INTERRUPTION_TOTAL_DURATION = "lk.interruption.total_duration";
38
+ const ATTR_INTERRUPTION_PREDICTION_DURATION = "lk.interruption.prediction_duration";
39
+ const ATTR_INTERRUPTION_DETECTION_DELAY = "lk.interruption.detection_delay";
35
40
  const ATTR_LLM_METRICS = "lk.llm_metrics";
36
41
  const ATTR_TTS_METRICS = "lk.tts_metrics";
37
42
  const ATTR_REALTIME_MODEL_METRICS = "lk.realtime_model_metrics";
@@ -81,6 +86,11 @@ export {
81
86
  ATTR_GEN_AI_USAGE_OUTPUT_TEXT_TOKENS,
82
87
  ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,
83
88
  ATTR_INSTRUCTIONS,
89
+ ATTR_INTERRUPTION_DETECTION_DELAY,
90
+ ATTR_INTERRUPTION_PREDICTION_DURATION,
91
+ ATTR_INTERRUPTION_PROBABILITY,
92
+ ATTR_INTERRUPTION_TOTAL_DURATION,
93
+ ATTR_IS_INTERRUPTION,
84
94
  ATTR_JOB_ID,
85
95
  ATTR_LANGFUSE_COMPLETION_START_TIME,
86
96
  ATTR_LLM_METRICS,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/telemetry/trace_types.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\n\n// LiveKit custom attributes\nexport const ATTR_SPEECH_ID = 'lk.speech_id';\nexport const ATTR_AGENT_LABEL = 'lk.agent_label';\nexport const ATTR_START_TIME = 'lk.start_time';\nexport const ATTR_END_TIME = 'lk.end_time';\nexport const ATTR_RETRY_COUNT = 'lk.retry_count';\n\nexport const ATTR_PARTICIPANT_ID = 'lk.participant_id';\nexport const ATTR_PARTICIPANT_IDENTITY = 'lk.participant_identity';\nexport const ATTR_PARTICIPANT_KIND = 'lk.participant_kind';\n\n// session start\nexport const ATTR_JOB_ID = 'lk.job_id';\nexport const ATTR_AGENT_NAME = 'lk.agent_name';\nexport const ATTR_ROOM_NAME = 'lk.room_name';\nexport const ATTR_SESSION_OPTIONS = 'lk.session_options';\n\n// assistant turn\nexport const ATTR_USER_INPUT = 'lk.user_input';\nexport const ATTR_INSTRUCTIONS = 'lk.instructions';\nexport const ATTR_SPEECH_INTERRUPTED = 'lk.interrupted';\n\n// llm node\nexport const ATTR_CHAT_CTX = 'lk.chat_ctx';\nexport const ATTR_FUNCTION_TOOLS = 'lk.function_tools';\nexport const ATTR_RESPONSE_TEXT = 'lk.response.text';\nexport const ATTR_RESPONSE_FUNCTION_CALLS = 'lk.response.function_calls';\n\n// function tool\nexport const ATTR_FUNCTION_TOOL_NAME = 'lk.function_tool.name';\nexport const ATTR_FUNCTION_TOOL_ARGS = 'lk.function_tool.arguments';\nexport const ATTR_FUNCTION_TOOL_IS_ERROR = 'lk.function_tool.is_error';\nexport const ATTR_FUNCTION_TOOL_OUTPUT = 'lk.function_tool.output';\n\n// tts node\nexport const ATTR_TTS_INPUT_TEXT = 'lk.input_text';\nexport const ATTR_TTS_STREAMING = 'lk.tts.streaming';\nexport const ATTR_TTS_LABEL = 'lk.tts.label';\n\n// eou detection\nexport const ATTR_EOU_PROBABILITY = 'lk.eou.probability';\nexport const ATTR_EOU_UNLIKELY_THRESHOLD = 'lk.eou.unlikely_threshold';\nexport const ATTR_EOU_DELAY = 'lk.eou.endpointing_delay';\nexport const ATTR_EOU_LANGUAGE = 'lk.eou.language';\nexport const ATTR_USER_TRANSCRIPT = 'lk.user_transcript';\nexport const ATTR_TRANSCRIPT_CONFIDENCE = 'lk.transcript_confidence';\nexport const ATTR_TRANSCRIPTION_DELAY = 'lk.transcription_delay';\nexport const ATTR_END_OF_TURN_DELAY = 'lk.end_of_turn_delay';\n\n// metrics\nexport const ATTR_LLM_METRICS = 'lk.llm_metrics';\nexport const ATTR_TTS_METRICS = 'lk.tts_metrics';\nexport const ATTR_REALTIME_MODEL_METRICS = 'lk.realtime_model_metrics';\n\n// OpenTelemetry GenAI attributes\n// OpenTelemetry specification: https://opentelemetry.io/docs/specs/semconv/registry/attributes/gen-ai/\nexport const ATTR_GEN_AI_OPERATION_NAME = 'gen_ai.operation.name';\nexport const ATTR_GEN_AI_REQUEST_MODEL = 'gen_ai.request.model';\nexport const ATTR_GEN_AI_USAGE_INPUT_TOKENS = 'gen_ai.usage.input_tokens';\nexport const ATTR_GEN_AI_USAGE_OUTPUT_TOKENS = 'gen_ai.usage.output_tokens';\n\n// Unofficial OpenTelemetry GenAI attributes, recognized by LangFuse\n// https://langfuse.com/integrations/native/opentelemetry#usage\n// but not yet in the official OpenTelemetry specification.\nexport const ATTR_GEN_AI_USAGE_INPUT_TEXT_TOKENS = 'gen_ai.usage.input_text_tokens';\nexport const ATTR_GEN_AI_USAGE_INPUT_AUDIO_TOKENS = 'gen_ai.usage.input_audio_tokens';\nexport const ATTR_GEN_AI_USAGE_INPUT_CACHED_TOKENS = 'gen_ai.usage.input_cached_tokens';\nexport const ATTR_GEN_AI_USAGE_OUTPUT_TEXT_TOKENS = 'gen_ai.usage.output_text_tokens';\nexport const ATTR_GEN_AI_USAGE_OUTPUT_AUDIO_TOKENS = 'gen_ai.usage.output_audio_tokens';\n\n// OpenTelemetry GenAI event names (for structured logging)\nexport const EVENT_GEN_AI_SYSTEM_MESSAGE = 'gen_ai.system.message';\nexport const EVENT_GEN_AI_USER_MESSAGE = 'gen_ai.user.message';\nexport const EVENT_GEN_AI_ASSISTANT_MESSAGE = 'gen_ai.assistant.message';\nexport const EVENT_GEN_AI_TOOL_MESSAGE = 'gen_ai.tool.message';\nexport const EVENT_GEN_AI_CHOICE = 'gen_ai.choice';\n\n// Exception attributes\nexport const ATTR_EXCEPTION_TRACE = 'exception.stacktrace';\nexport const ATTR_EXCEPTION_TYPE = 'exception.type';\nexport const ATTR_EXCEPTION_MESSAGE = 'exception.message';\n\n// Platform-specific attributes\nexport const ATTR_LANGFUSE_COMPLETION_START_TIME = 'langfuse.observation.completion_start_time';\n"],"mappings":"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":[]}
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// Adaptive Interruption attributes\nexport const ATTR_IS_INTERRUPTION = 'lk.is_interruption';\nexport const ATTR_INTERRUPTION_PROBABILITY = 'lk.interruption.probability';\nexport const ATTR_INTERRUPTION_TOTAL_DURATION = 'lk.interruption.total_duration';\nexport const ATTR_INTERRUPTION_PREDICTION_DURATION = 'lk.interruption.prediction_duration';\nexport const ATTR_INTERRUPTION_DETECTION_DELAY = 'lk.interruption.detection_delay';\n\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,uBAAuB;AAC7B,MAAM,gCAAgC;AACtC,MAAM,mCAAmC;AACzC,MAAM,wCAAwC;AAC9C,MAAM,oCAAoC;AAG1C,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,51 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var ws_transport_exports = {};
30
+ __export(ws_transport_exports, {
31
+ webSocketStream: () => webSocketStream
32
+ });
33
+ module.exports = __toCommonJS(ws_transport_exports);
34
+ var import_node_stream = require("node:stream");
35
+ var import_ws = __toESM(require("ws"), 1);
36
+ function webSocketStream(wsUrl) {
37
+ const ws = new import_ws.default(wsUrl);
38
+ const duplex = (0, import_ws.createWebSocketStream)(ws);
39
+ duplex.on("error", console.error);
40
+ duplex.on("end", () => {
41
+ duplex.end();
42
+ });
43
+ const writable = import_node_stream.Writable.toWeb(duplex);
44
+ const readable = import_node_stream.Readable.toWeb(duplex);
45
+ return { readable, writable, close: ws.close };
46
+ }
47
+ // Annotate the CommonJS export names for ESM import in node:
48
+ 0 && (module.exports = {
49
+ webSocketStream
50
+ });
51
+ //# sourceMappingURL=ws_transport.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/ws_transport.ts"],"sourcesContent":["import { Readable, Writable } from 'node:stream';\nimport WebSocket, { createWebSocketStream } from 'ws';\n\nexport function webSocketStream(wsUrl: string) {\n const ws = new WebSocket(wsUrl);\n const duplex = createWebSocketStream(ws);\n duplex.on('error', console.error);\n\n // End the write side when the read side ends to properly close the stream.\n // This is needed because Readable.toWeb() waits for both sides of the duplex\n // to close before signaling done on the ReadableStream.\n duplex.on('end', () => {\n duplex.end();\n });\n\n // Convert the writable side\n const writable = Writable.toWeb(duplex);\n // Convert the readable side\n const readable = Readable.toWeb(duplex);\n\n return { readable, writable, close: ws.close };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAAmC;AACnC,gBAAiD;AAE1C,SAAS,gBAAgB,OAAe;AAC7C,QAAM,KAAK,IAAI,UAAAA,QAAU,KAAK;AAC9B,QAAM,aAAS,iCAAsB,EAAE;AACvC,SAAO,GAAG,SAAS,QAAQ,KAAK;AAKhC,SAAO,GAAG,OAAO,MAAM;AACrB,WAAO,IAAI;AAAA,EACb,CAAC;AAGD,QAAM,WAAW,4BAAS,MAAM,MAAM;AAEtC,QAAM,WAAW,4BAAS,MAAM,MAAM;AAEtC,SAAO,EAAE,UAAU,UAAU,OAAO,GAAG,MAAM;AAC/C;","names":["WebSocket"]}
@@ -0,0 +1,9 @@
1
+ /// <reference types="node" resolution-mode="require"/>
2
+ /// <reference types="node" resolution-mode="require"/>
3
+ /// <reference types="node" resolution-mode="require"/>
4
+ export declare function webSocketStream(wsUrl: string): {
5
+ readable: import("stream/web").ReadableStream<any>;
6
+ writable: import("stream/web").WritableStream<any>;
7
+ close: (code?: number | undefined, data?: string | Buffer | undefined) => void;
8
+ };
9
+ //# sourceMappingURL=ws_transport.d.ts.map
@@ -0,0 +1,9 @@
1
+ /// <reference types="node" resolution-mode="require"/>
2
+ /// <reference types="node" resolution-mode="require"/>
3
+ /// <reference types="node" resolution-mode="require"/>
4
+ export declare function webSocketStream(wsUrl: string): {
5
+ readable: import("stream/web").ReadableStream<any>;
6
+ writable: import("stream/web").WritableStream<any>;
7
+ close: (code?: number | undefined, data?: string | Buffer | undefined) => void;
8
+ };
9
+ //# sourceMappingURL=ws_transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws_transport.d.ts","sourceRoot":"","sources":["../../src/utils/ws_transport.ts"],"names":[],"mappings":";;;AAGA,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM;;;;EAkB5C"}
@@ -0,0 +1,17 @@
1
+ import { Readable, Writable } from "node:stream";
2
+ import WebSocket, { createWebSocketStream } from "ws";
3
+ function webSocketStream(wsUrl) {
4
+ const ws = new WebSocket(wsUrl);
5
+ const duplex = createWebSocketStream(ws);
6
+ duplex.on("error", console.error);
7
+ duplex.on("end", () => {
8
+ duplex.end();
9
+ });
10
+ const writable = Writable.toWeb(duplex);
11
+ const readable = Readable.toWeb(duplex);
12
+ return { readable, writable, close: ws.close };
13
+ }
14
+ export {
15
+ webSocketStream
16
+ };
17
+ //# sourceMappingURL=ws_transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/ws_transport.ts"],"sourcesContent":["import { Readable, Writable } from 'node:stream';\nimport WebSocket, { createWebSocketStream } from 'ws';\n\nexport function webSocketStream(wsUrl: string) {\n const ws = new WebSocket(wsUrl);\n const duplex = createWebSocketStream(ws);\n duplex.on('error', console.error);\n\n // End the write side when the read side ends to properly close the stream.\n // This is needed because Readable.toWeb() waits for both sides of the duplex\n // to close before signaling done on the ReadableStream.\n duplex.on('end', () => {\n duplex.end();\n });\n\n // Convert the writable side\n const writable = Writable.toWeb(duplex);\n // Convert the readable side\n const readable = Readable.toWeb(duplex);\n\n return { readable, writable, close: ws.close };\n}\n"],"mappings":"AAAA,SAAS,UAAU,gBAAgB;AACnC,OAAO,aAAa,6BAA6B;AAE1C,SAAS,gBAAgB,OAAe;AAC7C,QAAM,KAAK,IAAI,UAAU,KAAK;AAC9B,QAAM,SAAS,sBAAsB,EAAE;AACvC,SAAO,GAAG,SAAS,QAAQ,KAAK;AAKhC,SAAO,GAAG,OAAO,MAAM;AACrB,WAAO,IAAI;AAAA,EACb,CAAC;AAGD,QAAM,WAAW,SAAS,MAAM,MAAM;AAEtC,QAAM,WAAW,SAAS,MAAM,MAAM;AAEtC,SAAO,EAAE,UAAU,UAAU,OAAO,GAAG,MAAM;AAC/C;","names":[]}
@@ -0,0 +1,212 @@
1
+ "use strict";
2
+ var import_vitest = require("vitest");
3
+ var import_ws = require("ws");
4
+ var import_ws_transport = require("./ws_transport.cjs");
5
+ (0, import_vitest.describe)("webSocketStream", () => {
6
+ (0, import_vitest.describe)("readable stream", () => {
7
+ (0, import_vitest.it)("receives messages from the WebSocket", async () => {
8
+ const wss = await new Promise((resolve) => {
9
+ const server = new import_ws.WebSocketServer({ port: 0 }, () => resolve(server));
10
+ });
11
+ const port = wss.address().port;
12
+ wss.on("connection", (serverWs) => {
13
+ serverWs.send("hello");
14
+ serverWs.send("world");
15
+ serverWs.close();
16
+ });
17
+ const { readable } = (0, import_ws_transport.webSocketStream)(`ws://localhost:${port}`);
18
+ const reader = readable.getReader();
19
+ const messages = [];
20
+ try {
21
+ while (true) {
22
+ const { done, value } = await reader.read();
23
+ if (done) break;
24
+ messages.push(Buffer.from(value).toString());
25
+ }
26
+ } finally {
27
+ reader.releaseLock();
28
+ }
29
+ (0, import_vitest.expect)(messages).toEqual(["hello", "world"]);
30
+ wss.close();
31
+ });
32
+ (0, import_vitest.it)("handles binary messages", async () => {
33
+ const wss = await new Promise((resolve) => {
34
+ const server = new import_ws.WebSocketServer({ port: 0 }, () => resolve(server));
35
+ });
36
+ const port = wss.address().port;
37
+ const binaryData = new Uint8Array([1, 2, 3, 4, 5]);
38
+ wss.on("connection", (serverWs) => {
39
+ serverWs.send(binaryData);
40
+ serverWs.close();
41
+ });
42
+ const { readable } = (0, import_ws_transport.webSocketStream)(`ws://localhost:${port}`);
43
+ const reader = readable.getReader();
44
+ const chunks = [];
45
+ try {
46
+ while (true) {
47
+ const { done, value } = await reader.read();
48
+ if (done) break;
49
+ chunks.push(new Uint8Array(value));
50
+ }
51
+ } finally {
52
+ reader.releaseLock();
53
+ }
54
+ (0, import_vitest.expect)(chunks).toHaveLength(1);
55
+ (0, import_vitest.expect)(Array.from(chunks[0])).toEqual([1, 2, 3, 4, 5]);
56
+ wss.close();
57
+ });
58
+ (0, import_vitest.it)("handles empty stream when connection closes immediately", async () => {
59
+ const wss = await new Promise((resolve) => {
60
+ const server = new import_ws.WebSocketServer({ port: 0 }, () => resolve(server));
61
+ });
62
+ const port = wss.address().port;
63
+ wss.on("connection", (serverWs) => {
64
+ serverWs.close();
65
+ });
66
+ const { readable } = (0, import_ws_transport.webSocketStream)(`ws://localhost:${port}`);
67
+ const reader = readable.getReader();
68
+ const chunks = [];
69
+ try {
70
+ while (true) {
71
+ const { done, value } = await reader.read();
72
+ if (done) break;
73
+ chunks.push(value);
74
+ }
75
+ } finally {
76
+ reader.releaseLock();
77
+ }
78
+ (0, import_vitest.expect)(chunks).toEqual([]);
79
+ wss.close();
80
+ });
81
+ });
82
+ (0, import_vitest.describe)("writable stream", () => {
83
+ (0, import_vitest.it)("sends messages through the WebSocket", async () => {
84
+ const wss = await new Promise((resolve) => {
85
+ const server = new import_ws.WebSocketServer({ port: 0 }, () => resolve(server));
86
+ });
87
+ const port = wss.address().port;
88
+ const ws = new import_ws.WebSocket(`ws://localhost:${port}`);
89
+ const connected = new Promise((resolve) => {
90
+ ws.on("open", resolve);
91
+ });
92
+ const messagesReceived = [];
93
+ const serverClosed = new Promise((resolve) => {
94
+ wss.on("connection", (serverWs) => {
95
+ serverWs.on("message", (data) => {
96
+ messagesReceived.push(data.toString());
97
+ });
98
+ serverWs.on("close", resolve);
99
+ });
100
+ });
101
+ await connected;
102
+ const { writable } = (0, import_ws_transport.webSocketStream)(`ws://localhost:${port}`);
103
+ const writer = writable.getWriter();
104
+ await writer.write(new TextEncoder().encode("hello"));
105
+ await writer.write(new TextEncoder().encode("world"));
106
+ await writer.close();
107
+ await serverClosed;
108
+ (0, import_vitest.expect)(messagesReceived).toEqual(["hello", "world"]);
109
+ wss.close();
110
+ });
111
+ (0, import_vitest.it)("sends binary data through the WebSocket", async () => {
112
+ const wss = await new Promise((resolve) => {
113
+ const server = new import_ws.WebSocketServer({ port: 0 }, () => resolve(server));
114
+ });
115
+ const port = wss.address().port;
116
+ const chunksReceived = [];
117
+ const serverClosed = new Promise((resolve) => {
118
+ wss.on("connection", (serverWs) => {
119
+ serverWs.on("message", (data) => {
120
+ chunksReceived.push(Buffer.from(data));
121
+ });
122
+ serverWs.on("close", resolve);
123
+ });
124
+ });
125
+ const { writable } = (0, import_ws_transport.webSocketStream)(`ws://localhost:${port}`);
126
+ const writer = writable.getWriter();
127
+ const binaryData = new Uint8Array([10, 20, 30, 40, 50]);
128
+ await writer.write(binaryData);
129
+ await writer.close();
130
+ await serverClosed;
131
+ (0, import_vitest.expect)(chunksReceived).toHaveLength(1);
132
+ (0, import_vitest.expect)(Array.from(chunksReceived[0])).toEqual([10, 20, 30, 40, 50]);
133
+ wss.close();
134
+ });
135
+ (0, import_vitest.it)("buffers writes if readyState is CONNECTING", async () => {
136
+ const wss = await new Promise((resolve) => {
137
+ const server = new import_ws.WebSocketServer({ port: 0 }, () => resolve(server));
138
+ });
139
+ const port = wss.address().port;
140
+ const { writable } = (0, import_ws_transport.webSocketStream)(`ws://localhost:${port}`);
141
+ const writer = writable.getWriter();
142
+ const messagesReceived = [];
143
+ const serverClosed = new Promise((resolve) => {
144
+ wss.on("connection", (serverWs) => {
145
+ serverWs.on("message", (data) => {
146
+ messagesReceived.push(data.toString());
147
+ });
148
+ serverWs.on("close", resolve);
149
+ });
150
+ });
151
+ await writer.write(new TextEncoder().encode("buffered message"));
152
+ await writer.close();
153
+ await serverClosed;
154
+ (0, import_vitest.expect)(messagesReceived).toEqual(["buffered message"]);
155
+ wss.close();
156
+ });
157
+ });
158
+ (0, import_vitest.describe)("bidirectional communication", () => {
159
+ (0, import_vitest.it)("supports echo pattern with readable and writable", async () => {
160
+ const wss = await new Promise((resolve) => {
161
+ const server = new import_ws.WebSocketServer({ port: 0 }, () => resolve(server));
162
+ });
163
+ const port = wss.address().port;
164
+ wss.on("connection", (serverWs) => {
165
+ serverWs.on("message", (data) => {
166
+ serverWs.send(data);
167
+ });
168
+ });
169
+ const { readable, writable } = (0, import_ws_transport.webSocketStream)(`ws://localhost:${port}`);
170
+ const writer = writable.getWriter();
171
+ const reader = readable.getReader();
172
+ await writer.write(new TextEncoder().encode("ping1"));
173
+ await writer.write(new TextEncoder().encode("ping2"));
174
+ const { value: response1 } = await reader.read();
175
+ const { value: response2 } = await reader.read();
176
+ (0, import_vitest.expect)(Buffer.from(response1).toString()).toBe("ping1");
177
+ (0, import_vitest.expect)(Buffer.from(response2).toString()).toBe("ping2");
178
+ reader.releaseLock();
179
+ await writer.close();
180
+ wss.close();
181
+ });
182
+ });
183
+ (0, import_vitest.describe)("error handling", () => {
184
+ (0, import_vitest.it)("readable stream ends when WebSocket closes unexpectedly", async () => {
185
+ const wss = await new Promise((resolve) => {
186
+ const server = new import_ws.WebSocketServer({ port: 0 }, () => resolve(server));
187
+ });
188
+ const port = wss.address().port;
189
+ wss.on("connection", (serverWs) => {
190
+ serverWs.send("before close");
191
+ serverWs.terminate();
192
+ });
193
+ const { readable } = (0, import_ws_transport.webSocketStream)(`ws://localhost:${port}`);
194
+ const reader = readable.getReader();
195
+ const chunks = [];
196
+ try {
197
+ while (true) {
198
+ const { done, value } = await reader.read();
199
+ if (done) break;
200
+ chunks.push(Buffer.from(value).toString());
201
+ }
202
+ } catch (error) {
203
+ console.error(error);
204
+ } finally {
205
+ reader.releaseLock();
206
+ }
207
+ (0, import_vitest.expect)(chunks).toContain("before close");
208
+ wss.close();
209
+ });
210
+ });
211
+ });
212
+ //# sourceMappingURL=ws_transport.test.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/ws_transport.test.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { describe, expect, it } from 'vitest';\nimport { WebSocket, WebSocketServer } from 'ws';\nimport { webSocketStream } from './ws_transport.js';\n\ndescribe('webSocketStream', () => {\n describe('readable stream', () => {\n it('receives messages from the WebSocket', async () => {\n const wss = await new Promise<WebSocketServer>((resolve) => {\n const server: WebSocketServer = new WebSocketServer({ port: 0 }, () => resolve(server));\n });\n\n const port = (wss.address() as { port: number }).port;\n\n wss.on('connection', (serverWs) => {\n serverWs.send('hello');\n serverWs.send('world');\n serverWs.close();\n });\n\n const { readable } = webSocketStream(`ws://localhost:${port}`);\n const reader = readable.getReader();\n\n const messages: string[] = [];\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n messages.push(Buffer.from(value).toString());\n }\n } finally {\n reader.releaseLock();\n }\n\n expect(messages).toEqual(['hello', 'world']);\n\n wss.close();\n });\n\n it('handles binary messages', async () => {\n const wss = await new Promise<WebSocketServer>((resolve) => {\n const server: WebSocketServer = new WebSocketServer({ port: 0 }, () => resolve(server));\n });\n\n const port = (wss.address() as { port: number }).port;\n\n const binaryData = new Uint8Array([1, 2, 3, 4, 5]);\n\n wss.on('connection', (serverWs) => {\n serverWs.send(binaryData);\n serverWs.close();\n });\n\n const { readable } = webSocketStream(`ws://localhost:${port}`);\n const reader = readable.getReader();\n\n const chunks: Uint8Array[] = [];\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(new Uint8Array(value));\n }\n } finally {\n reader.releaseLock();\n }\n\n expect(chunks).toHaveLength(1);\n expect(Array.from(chunks[0]!)).toEqual([1, 2, 3, 4, 5]);\n\n wss.close();\n });\n\n it('handles empty stream when connection closes immediately', async () => {\n const wss = await new Promise<WebSocketServer>((resolve) => {\n const server: WebSocketServer = new WebSocketServer({ port: 0 }, () => resolve(server));\n });\n\n const port = (wss.address() as { port: number }).port;\n\n wss.on('connection', (serverWs) => {\n serverWs.close();\n });\n const { readable } = webSocketStream(`ws://localhost:${port}`);\n const reader = readable.getReader();\n\n const chunks: Uint8Array[] = [];\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n } finally {\n reader.releaseLock();\n }\n\n expect(chunks).toEqual([]);\n\n wss.close();\n });\n });\n\n describe('writable stream', () => {\n it('sends messages through the WebSocket', async () => {\n const wss = await new Promise<WebSocketServer>((resolve) => {\n const server: WebSocketServer = new WebSocketServer({ port: 0 }, () => resolve(server));\n });\n\n const port = (wss.address() as { port: number }).port;\n const ws = new WebSocket(`ws://localhost:${port}`);\n\n const connected = new Promise<void>((resolve) => {\n ws.on('open', resolve);\n });\n\n const messagesReceived: string[] = [];\n const serverClosed = new Promise<void>((resolve) => {\n wss.on('connection', (serverWs) => {\n serverWs.on('message', (data) => {\n messagesReceived.push(data.toString());\n });\n serverWs.on('close', resolve);\n });\n });\n\n await connected;\n const { writable } = webSocketStream(`ws://localhost:${port}`);\n const writer = writable.getWriter();\n\n await writer.write(new TextEncoder().encode('hello'));\n await writer.write(new TextEncoder().encode('world'));\n await writer.close();\n\n await serverClosed;\n\n expect(messagesReceived).toEqual(['hello', 'world']);\n\n wss.close();\n });\n\n it('sends binary data through the WebSocket', async () => {\n const wss = await new Promise<WebSocketServer>((resolve) => {\n const server: WebSocketServer = new WebSocketServer({ port: 0 }, () => resolve(server));\n });\n\n const port = (wss.address() as { port: number }).port;\n\n const chunksReceived: Buffer[] = [];\n const serverClosed = new Promise<void>((resolve) => {\n wss.on('connection', (serverWs) => {\n serverWs.on('message', (data) => {\n chunksReceived.push(Buffer.from(data as Buffer));\n });\n serverWs.on('close', resolve);\n });\n });\n\n const { writable } = webSocketStream(`ws://localhost:${port}`);\n const writer = writable.getWriter();\n\n const binaryData = new Uint8Array([10, 20, 30, 40, 50]);\n await writer.write(binaryData);\n await writer.close();\n\n await serverClosed;\n\n expect(chunksReceived).toHaveLength(1);\n expect(Array.from(chunksReceived[0]!)).toEqual([10, 20, 30, 40, 50]);\n\n wss.close();\n });\n\n it('buffers writes if readyState is CONNECTING', async () => {\n const wss = await new Promise<WebSocketServer>((resolve) => {\n const server: WebSocketServer = new WebSocketServer({ port: 0 }, () => resolve(server));\n });\n\n const port = (wss.address() as { port: number }).port;\n\n const { writable } = webSocketStream(`ws://localhost:${port}`);\n const writer = writable.getWriter();\n\n const messagesReceived: string[] = [];\n const serverClosed = new Promise<void>((resolve) => {\n wss.on('connection', (serverWs) => {\n serverWs.on('message', (data) => {\n messagesReceived.push(data.toString());\n });\n serverWs.on('close', resolve);\n });\n });\n\n // These writes should be buffered\n await writer.write(new TextEncoder().encode('buffered message'));\n await writer.close();\n\n await serverClosed;\n\n expect(messagesReceived).toEqual(['buffered message']);\n\n wss.close();\n });\n });\n\n describe('bidirectional communication', () => {\n it('supports echo pattern with readable and writable', async () => {\n const wss = await new Promise<WebSocketServer>((resolve) => {\n const server: WebSocketServer = new WebSocketServer({ port: 0 }, () => resolve(server));\n });\n\n const port = (wss.address() as { port: number }).port;\n\n // Server echoes messages back\n wss.on('connection', (serverWs) => {\n serverWs.on('message', (data) => {\n serverWs.send(data);\n });\n });\n\n const { readable, writable } = webSocketStream(`ws://localhost:${port}`);\n const writer = writable.getWriter();\n const reader = readable.getReader();\n\n // Send messages\n await writer.write(new TextEncoder().encode('ping1'));\n await writer.write(new TextEncoder().encode('ping2'));\n\n // Read echoed responses\n const { value: response1 } = await reader.read();\n const { value: response2 } = await reader.read();\n\n expect(Buffer.from(response1!).toString()).toBe('ping1');\n expect(Buffer.from(response2!).toString()).toBe('ping2');\n\n reader.releaseLock();\n await writer.close();\n\n wss.close();\n });\n });\n\n describe('error handling', () => {\n it('readable stream ends when WebSocket closes unexpectedly', async () => {\n const wss = await new Promise<WebSocketServer>((resolve) => {\n const server: WebSocketServer = new WebSocketServer({ port: 0 }, () => resolve(server));\n });\n\n const port = (wss.address() as { port: number }).port;\n\n wss.on('connection', (serverWs) => {\n serverWs.send('before close');\n // Terminate connection abruptly\n serverWs.terminate();\n });\n\n const { readable } = webSocketStream(`ws://localhost:${port}`);\n const reader = readable.getReader();\n\n const chunks: string[] = [];\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(Buffer.from(value).toString());\n }\n } catch (error) {\n console.error(error);\n // Connection terminated, stream may error\n } finally {\n reader.releaseLock();\n }\n\n // Should have received the message sent before termination\n expect(chunks).toContain('before close');\n\n wss.close();\n });\n });\n});\n"],"mappings":"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","names":[]}