@livekit/agents 1.0.21 → 1.0.23

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 (149) hide show
  1. package/dist/inference/api_protos.cjs +2 -2
  2. package/dist/inference/api_protos.cjs.map +1 -1
  3. package/dist/inference/api_protos.d.cts +16 -16
  4. package/dist/inference/api_protos.d.ts +16 -16
  5. package/dist/inference/api_protos.js +2 -2
  6. package/dist/inference/api_protos.js.map +1 -1
  7. package/dist/inference/stt.cjs +42 -30
  8. package/dist/inference/stt.cjs.map +1 -1
  9. package/dist/inference/stt.d.ts.map +1 -1
  10. package/dist/inference/stt.js +42 -30
  11. package/dist/inference/stt.js.map +1 -1
  12. package/dist/inference/tts.cjs +2 -3
  13. package/dist/inference/tts.cjs.map +1 -1
  14. package/dist/inference/tts.d.ts.map +1 -1
  15. package/dist/inference/tts.js +2 -3
  16. package/dist/inference/tts.js.map +1 -1
  17. package/dist/ipc/job_proc_lazy_main.cjs +35 -1
  18. package/dist/ipc/job_proc_lazy_main.cjs.map +1 -1
  19. package/dist/ipc/job_proc_lazy_main.js +13 -1
  20. package/dist/ipc/job_proc_lazy_main.js.map +1 -1
  21. package/dist/job.cjs +52 -6
  22. package/dist/job.cjs.map +1 -1
  23. package/dist/job.d.cts +2 -0
  24. package/dist/job.d.ts +2 -0
  25. package/dist/job.d.ts.map +1 -1
  26. package/dist/job.js +52 -6
  27. package/dist/job.js.map +1 -1
  28. package/dist/llm/llm.cjs +38 -3
  29. package/dist/llm/llm.cjs.map +1 -1
  30. package/dist/llm/llm.d.cts +1 -0
  31. package/dist/llm/llm.d.ts +1 -0
  32. package/dist/llm/llm.d.ts.map +1 -1
  33. package/dist/llm/llm.js +38 -3
  34. package/dist/llm/llm.js.map +1 -1
  35. package/dist/log.cjs +34 -10
  36. package/dist/log.cjs.map +1 -1
  37. package/dist/log.d.cts +7 -0
  38. package/dist/log.d.ts +7 -0
  39. package/dist/log.d.ts.map +1 -1
  40. package/dist/log.js +34 -11
  41. package/dist/log.js.map +1 -1
  42. package/dist/stt/stt.cjs +18 -5
  43. package/dist/stt/stt.cjs.map +1 -1
  44. package/dist/stt/stt.d.ts.map +1 -1
  45. package/dist/stt/stt.js +18 -5
  46. package/dist/stt/stt.js.map +1 -1
  47. package/dist/telemetry/index.cjs +23 -2
  48. package/dist/telemetry/index.cjs.map +1 -1
  49. package/dist/telemetry/index.d.cts +4 -1
  50. package/dist/telemetry/index.d.ts +4 -1
  51. package/dist/telemetry/index.d.ts.map +1 -1
  52. package/dist/telemetry/index.js +27 -2
  53. package/dist/telemetry/index.js.map +1 -1
  54. package/dist/telemetry/logging.cjs +65 -0
  55. package/dist/telemetry/logging.cjs.map +1 -0
  56. package/dist/telemetry/logging.d.cts +21 -0
  57. package/dist/telemetry/logging.d.ts +21 -0
  58. package/dist/telemetry/logging.d.ts.map +1 -0
  59. package/dist/telemetry/logging.js +40 -0
  60. package/dist/telemetry/logging.js.map +1 -0
  61. package/dist/telemetry/otel_http_exporter.cjs +144 -0
  62. package/dist/telemetry/otel_http_exporter.cjs.map +1 -0
  63. package/dist/telemetry/otel_http_exporter.d.cts +62 -0
  64. package/dist/telemetry/otel_http_exporter.d.ts +62 -0
  65. package/dist/telemetry/otel_http_exporter.d.ts.map +1 -0
  66. package/dist/telemetry/otel_http_exporter.js +120 -0
  67. package/dist/telemetry/otel_http_exporter.js.map +1 -0
  68. package/dist/telemetry/pino_otel_transport.cjs +217 -0
  69. package/dist/telemetry/pino_otel_transport.cjs.map +1 -0
  70. package/dist/telemetry/pino_otel_transport.d.cts +58 -0
  71. package/dist/telemetry/pino_otel_transport.d.ts +58 -0
  72. package/dist/telemetry/pino_otel_transport.d.ts.map +1 -0
  73. package/dist/telemetry/pino_otel_transport.js +189 -0
  74. package/dist/telemetry/pino_otel_transport.js.map +1 -0
  75. package/dist/telemetry/traces.cjs +225 -16
  76. package/dist/telemetry/traces.cjs.map +1 -1
  77. package/dist/telemetry/traces.d.cts +17 -0
  78. package/dist/telemetry/traces.d.ts +17 -0
  79. package/dist/telemetry/traces.d.ts.map +1 -1
  80. package/dist/telemetry/traces.js +211 -14
  81. package/dist/telemetry/traces.js.map +1 -1
  82. package/dist/tts/tts.cjs +68 -20
  83. package/dist/tts/tts.cjs.map +1 -1
  84. package/dist/tts/tts.d.cts +2 -0
  85. package/dist/tts/tts.d.ts +2 -0
  86. package/dist/tts/tts.d.ts.map +1 -1
  87. package/dist/tts/tts.js +68 -20
  88. package/dist/tts/tts.js.map +1 -1
  89. package/dist/utils.cjs +6 -0
  90. package/dist/utils.cjs.map +1 -1
  91. package/dist/utils.d.cts +1 -0
  92. package/dist/utils.d.ts +1 -0
  93. package/dist/utils.d.ts.map +1 -1
  94. package/dist/utils.js +5 -0
  95. package/dist/utils.js.map +1 -1
  96. package/dist/voice/agent_activity.cjs +93 -7
  97. package/dist/voice/agent_activity.cjs.map +1 -1
  98. package/dist/voice/agent_activity.d.cts +3 -0
  99. package/dist/voice/agent_activity.d.ts +3 -0
  100. package/dist/voice/agent_activity.d.ts.map +1 -1
  101. package/dist/voice/agent_activity.js +93 -7
  102. package/dist/voice/agent_activity.js.map +1 -1
  103. package/dist/voice/agent_session.cjs +122 -27
  104. package/dist/voice/agent_session.cjs.map +1 -1
  105. package/dist/voice/agent_session.d.cts +15 -0
  106. package/dist/voice/agent_session.d.ts +15 -0
  107. package/dist/voice/agent_session.d.ts.map +1 -1
  108. package/dist/voice/agent_session.js +122 -27
  109. package/dist/voice/agent_session.js.map +1 -1
  110. package/dist/voice/audio_recognition.cjs +69 -22
  111. package/dist/voice/audio_recognition.cjs.map +1 -1
  112. package/dist/voice/audio_recognition.d.cts +5 -0
  113. package/dist/voice/audio_recognition.d.ts +5 -0
  114. package/dist/voice/audio_recognition.d.ts.map +1 -1
  115. package/dist/voice/audio_recognition.js +69 -22
  116. package/dist/voice/audio_recognition.js.map +1 -1
  117. package/dist/voice/generation.cjs +43 -3
  118. package/dist/voice/generation.cjs.map +1 -1
  119. package/dist/voice/generation.d.ts.map +1 -1
  120. package/dist/voice/generation.js +43 -3
  121. package/dist/voice/generation.js.map +1 -1
  122. package/dist/voice/report.cjs +3 -2
  123. package/dist/voice/report.cjs.map +1 -1
  124. package/dist/voice/report.d.cts +7 -1
  125. package/dist/voice/report.d.ts +7 -1
  126. package/dist/voice/report.d.ts.map +1 -1
  127. package/dist/voice/report.js +3 -2
  128. package/dist/voice/report.js.map +1 -1
  129. package/package.json +8 -2
  130. package/src/inference/api_protos.ts +2 -2
  131. package/src/inference/stt.ts +48 -33
  132. package/src/inference/tts.ts +4 -3
  133. package/src/ipc/job_proc_lazy_main.ts +12 -1
  134. package/src/job.ts +59 -10
  135. package/src/llm/llm.ts +48 -5
  136. package/src/log.ts +52 -15
  137. package/src/stt/stt.ts +18 -5
  138. package/src/telemetry/index.ts +22 -4
  139. package/src/telemetry/logging.ts +55 -0
  140. package/src/telemetry/otel_http_exporter.ts +191 -0
  141. package/src/telemetry/pino_otel_transport.ts +265 -0
  142. package/src/telemetry/traces.ts +320 -20
  143. package/src/tts/tts.ts +85 -24
  144. package/src/utils.ts +5 -0
  145. package/src/voice/agent_activity.ts +140 -22
  146. package/src/voice/agent_session.ts +174 -34
  147. package/src/voice/audio_recognition.ts +85 -26
  148. package/src/voice/generation.ts +59 -7
  149. package/src/voice/report.ts +10 -4
@@ -28,24 +28,45 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
29
  var telemetry_exports = {};
30
30
  __export(telemetry_exports, {
31
+ ExtraDetailsProcessor: () => import_logging.ExtraDetailsProcessor,
32
+ MetadataLogProcessor: () => import_logging.MetadataLogProcessor,
33
+ PinoCloudExporter: () => import_pino_otel_transport.PinoCloudExporter,
34
+ SimpleOTLPHttpLogExporter: () => import_otel_http_exporter.SimpleOTLPHttpLogExporter,
35
+ emitToOtel: () => import_pino_otel_transport.emitToOtel,
36
+ flushOtelLogs: () => import_traces.flushOtelLogs,
37
+ flushPinoLogs: () => import_pino_otel_transport.flushPinoLogs,
38
+ initPinoCloudExporter: () => import_pino_otel_transport.initPinoCloudExporter,
31
39
  recordException: () => import_utils.recordException,
32
40
  recordRealtimeMetrics: () => import_utils.recordRealtimeMetrics,
33
41
  setTracerProvider: () => import_traces.setTracerProvider,
34
42
  setupCloudTracer: () => import_traces.setupCloudTracer,
35
43
  traceTypes: () => traceTypes,
36
- tracer: () => import_traces.tracer
44
+ tracer: () => import_traces.tracer,
45
+ uploadSessionReport: () => import_traces.uploadSessionReport
37
46
  });
38
47
  module.exports = __toCommonJS(telemetry_exports);
48
+ var import_logging = require("./logging.cjs");
49
+ var import_otel_http_exporter = require("./otel_http_exporter.cjs");
50
+ var import_pino_otel_transport = require("./pino_otel_transport.cjs");
39
51
  var traceTypes = __toESM(require("./trace_types.cjs"), 1);
40
52
  var import_traces = require("./traces.cjs");
41
53
  var import_utils = require("./utils.cjs");
42
54
  // Annotate the CommonJS export names for ESM import in node:
43
55
  0 && (module.exports = {
56
+ ExtraDetailsProcessor,
57
+ MetadataLogProcessor,
58
+ PinoCloudExporter,
59
+ SimpleOTLPHttpLogExporter,
60
+ emitToOtel,
61
+ flushOtelLogs,
62
+ flushPinoLogs,
63
+ initPinoCloudExporter,
44
64
  recordException,
45
65
  recordRealtimeMetrics,
46
66
  setTracerProvider,
47
67
  setupCloudTracer,
48
68
  traceTypes,
49
- tracer
69
+ tracer,
70
+ uploadSessionReport
50
71
  });
51
72
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/telemetry/index.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\n\n// TODO(brian): PR4 - Add logging integration exports\n// TODO(brian): PR5 - Add uploadSessionReport export\n\nexport * as traceTypes from './trace_types.js';\nexport { setTracerProvider, setupCloudTracer, tracer, type StartSpanOptions } from './traces.js';\nexport { recordException, recordRealtimeMetrics } from './utils.js';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,iBAA4B;AAC5B,oBAAmF;AACnF,mBAAuD;","names":[]}
1
+ {"version":3,"sources":["../../src/telemetry/index.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\n\nexport { ExtraDetailsProcessor, MetadataLogProcessor } from './logging.js';\nexport {\n SimpleOTLPHttpLogExporter,\n type SimpleLogRecord,\n type SimpleOTLPHttpLogExporterConfig,\n} from './otel_http_exporter.js';\nexport {\n emitToOtel,\n flushPinoLogs,\n initPinoCloudExporter,\n PinoCloudExporter,\n type PinoCloudExporterConfig,\n type PinoLogObject,\n} from './pino_otel_transport.js';\nexport * as traceTypes from './trace_types.js';\nexport {\n flushOtelLogs,\n setTracerProvider,\n setupCloudTracer,\n tracer,\n uploadSessionReport,\n type StartSpanOptions,\n} from './traces.js';\nexport { recordException, recordRealtimeMetrics } from './utils.js';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,qBAA4D;AAC5D,gCAIO;AACP,iCAOO;AACP,iBAA4B;AAC5B,oBAOO;AACP,mBAAuD;","names":[]}
@@ -1,4 +1,7 @@
1
+ export { ExtraDetailsProcessor, MetadataLogProcessor } from './logging.js';
2
+ export { SimpleOTLPHttpLogExporter, type SimpleLogRecord, type SimpleOTLPHttpLogExporterConfig, } from './otel_http_exporter.js';
3
+ export { emitToOtel, flushPinoLogs, initPinoCloudExporter, PinoCloudExporter, type PinoCloudExporterConfig, type PinoLogObject, } from './pino_otel_transport.js';
1
4
  export * as traceTypes from './trace_types.js';
2
- export { setTracerProvider, setupCloudTracer, tracer, type StartSpanOptions } from './traces.js';
5
+ export { flushOtelLogs, setTracerProvider, setupCloudTracer, tracer, uploadSessionReport, type StartSpanOptions, } from './traces.js';
3
6
  export { recordException, recordRealtimeMetrics } from './utils.js';
4
7
  //# sourceMappingURL=index.d.ts.map
@@ -1,4 +1,7 @@
1
+ export { ExtraDetailsProcessor, MetadataLogProcessor } from './logging.js';
2
+ export { SimpleOTLPHttpLogExporter, type SimpleLogRecord, type SimpleOTLPHttpLogExporterConfig, } from './otel_http_exporter.js';
3
+ export { emitToOtel, flushPinoLogs, initPinoCloudExporter, PinoCloudExporter, type PinoCloudExporterConfig, type PinoLogObject, } from './pino_otel_transport.js';
1
4
  export * as traceTypes from './trace_types.js';
2
- export { setTracerProvider, setupCloudTracer, tracer, type StartSpanOptions } from './traces.js';
5
+ export { flushOtelLogs, setTracerProvider, setupCloudTracer, tracer, uploadSessionReport, type StartSpanOptions, } from './traces.js';
3
6
  export { recordException, recordRealtimeMetrics } from './utils.js';
4
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/telemetry/index.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACjG,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/telemetry/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAC3E,OAAO,EACL,yBAAyB,EACzB,KAAK,eAAe,EACpB,KAAK,+BAA+B,GACrC,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,UAAU,EACV,aAAa,EACb,qBAAqB,EACrB,iBAAiB,EACjB,KAAK,uBAAuB,EAC5B,KAAK,aAAa,GACnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,MAAM,EACN,mBAAmB,EACnB,KAAK,gBAAgB,GACtB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC"}
@@ -1,12 +1,37 @@
1
+ import { ExtraDetailsProcessor, MetadataLogProcessor } from "./logging.js";
2
+ import {
3
+ SimpleOTLPHttpLogExporter
4
+ } from "./otel_http_exporter.js";
5
+ import {
6
+ emitToOtel,
7
+ flushPinoLogs,
8
+ initPinoCloudExporter,
9
+ PinoCloudExporter
10
+ } from "./pino_otel_transport.js";
1
11
  import * as traceTypes from "./trace_types.js";
2
- import { setTracerProvider, setupCloudTracer, tracer } from "./traces.js";
12
+ import {
13
+ flushOtelLogs,
14
+ setTracerProvider,
15
+ setupCloudTracer,
16
+ tracer,
17
+ uploadSessionReport
18
+ } from "./traces.js";
3
19
  import { recordException, recordRealtimeMetrics } from "./utils.js";
4
20
  export {
21
+ ExtraDetailsProcessor,
22
+ MetadataLogProcessor,
23
+ PinoCloudExporter,
24
+ SimpleOTLPHttpLogExporter,
25
+ emitToOtel,
26
+ flushOtelLogs,
27
+ flushPinoLogs,
28
+ initPinoCloudExporter,
5
29
  recordException,
6
30
  recordRealtimeMetrics,
7
31
  setTracerProvider,
8
32
  setupCloudTracer,
9
33
  traceTypes,
10
- tracer
34
+ tracer,
35
+ uploadSessionReport
11
36
  };
12
37
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/telemetry/index.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\n\n// TODO(brian): PR4 - Add logging integration exports\n// TODO(brian): PR5 - Add uploadSessionReport export\n\nexport * as traceTypes from './trace_types.js';\nexport { setTracerProvider, setupCloudTracer, tracer, type StartSpanOptions } from './traces.js';\nexport { recordException, recordRealtimeMetrics } from './utils.js';\n"],"mappings":"AAOA,YAAY,gBAAgB;AAC5B,SAAS,mBAAmB,kBAAkB,cAAqC;AACnF,SAAS,iBAAiB,6BAA6B;","names":[]}
1
+ {"version":3,"sources":["../../src/telemetry/index.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\n\nexport { ExtraDetailsProcessor, MetadataLogProcessor } from './logging.js';\nexport {\n SimpleOTLPHttpLogExporter,\n type SimpleLogRecord,\n type SimpleOTLPHttpLogExporterConfig,\n} from './otel_http_exporter.js';\nexport {\n emitToOtel,\n flushPinoLogs,\n initPinoCloudExporter,\n PinoCloudExporter,\n type PinoCloudExporterConfig,\n type PinoLogObject,\n} from './pino_otel_transport.js';\nexport * as traceTypes from './trace_types.js';\nexport {\n flushOtelLogs,\n setTracerProvider,\n setupCloudTracer,\n tracer,\n uploadSessionReport,\n type StartSpanOptions,\n} from './traces.js';\nexport { recordException, recordRealtimeMetrics } from './utils.js';\n"],"mappings":"AAIA,SAAS,uBAAuB,4BAA4B;AAC5D;AAAA,EACE;AAAA,OAGK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AACP,YAAY,gBAAgB;AAC5B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP,SAAS,iBAAiB,6BAA6B;","names":[]}
@@ -0,0 +1,65 @@
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 logging_exports = {};
20
+ __export(logging_exports, {
21
+ ExtraDetailsProcessor: () => ExtraDetailsProcessor,
22
+ MetadataLogProcessor: () => MetadataLogProcessor
23
+ });
24
+ module.exports = __toCommonJS(logging_exports);
25
+ class MetadataLogProcessor {
26
+ metadata;
27
+ constructor(metadata) {
28
+ this.metadata = metadata;
29
+ }
30
+ onEmit(logRecord) {
31
+ if (logRecord.attributes) {
32
+ Object.assign(logRecord.attributes, this.metadata);
33
+ } else {
34
+ logRecord.attributes = { ...this.metadata };
35
+ }
36
+ }
37
+ shutdown() {
38
+ return Promise.resolve();
39
+ }
40
+ forceFlush() {
41
+ return Promise.resolve();
42
+ }
43
+ }
44
+ class ExtraDetailsProcessor {
45
+ onEmit(logRecord) {
46
+ const loggerName = logRecord.instrumentationScope.name;
47
+ if (logRecord.attributes) {
48
+ logRecord.attributes["logger.name"] = loggerName;
49
+ } else {
50
+ logRecord.attributes = { "logger.name": loggerName };
51
+ }
52
+ }
53
+ shutdown() {
54
+ return Promise.resolve();
55
+ }
56
+ forceFlush() {
57
+ return Promise.resolve();
58
+ }
59
+ }
60
+ // Annotate the CommonJS export names for ESM import in node:
61
+ 0 && (module.exports = {
62
+ ExtraDetailsProcessor,
63
+ MetadataLogProcessor
64
+ });
65
+ //# sourceMappingURL=logging.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/telemetry/logging.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { Attributes } from '@opentelemetry/api';\nimport type { LogRecord, LogRecordProcessor } from '@opentelemetry/sdk-logs';\n\n/**\n * Metadata log processor that injects metadata (room_id, job_id) into all log records.\n */\nexport class MetadataLogProcessor implements LogRecordProcessor {\n private metadata: Attributes;\n\n constructor(metadata: Attributes) {\n this.metadata = metadata;\n }\n\n onEmit(logRecord: LogRecord): void {\n // Add metadata to log record attributes\n if (logRecord.attributes) {\n Object.assign(logRecord.attributes, this.metadata);\n } else {\n (logRecord as any).attributes = { ...this.metadata };\n }\n }\n\n shutdown(): Promise<void> {\n return Promise.resolve();\n }\n\n forceFlush(): Promise<void> {\n return Promise.resolve();\n }\n}\n\n/**\n * Extra details processor that adds logger name to log records.\n */\nexport class ExtraDetailsProcessor implements LogRecordProcessor {\n onEmit(logRecord: LogRecord): void {\n const loggerName = logRecord.instrumentationScope.name;\n if (logRecord.attributes) {\n (logRecord.attributes as any)['logger.name'] = loggerName;\n } else {\n (logRecord as any).attributes = { 'logger.name': loggerName };\n }\n }\n\n shutdown(): Promise<void> {\n return Promise.resolve();\n }\n\n forceFlush(): Promise<void> {\n return Promise.resolve();\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASO,MAAM,qBAAmD;AAAA,EACtD;AAAA,EAER,YAAY,UAAsB;AAChC,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,OAAO,WAA4B;AAEjC,QAAI,UAAU,YAAY;AACxB,aAAO,OAAO,UAAU,YAAY,KAAK,QAAQ;AAAA,IACnD,OAAO;AACL,MAAC,UAAkB,aAAa,EAAE,GAAG,KAAK,SAAS;AAAA,IACrD;AAAA,EACF;AAAA,EAEA,WAA0B;AACxB,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAAA,EAEA,aAA4B;AAC1B,WAAO,QAAQ,QAAQ;AAAA,EACzB;AACF;AAKO,MAAM,sBAAoD;AAAA,EAC/D,OAAO,WAA4B;AACjC,UAAM,aAAa,UAAU,qBAAqB;AAClD,QAAI,UAAU,YAAY;AACxB,MAAC,UAAU,WAAmB,aAAa,IAAI;AAAA,IACjD,OAAO;AACL,MAAC,UAAkB,aAAa,EAAE,eAAe,WAAW;AAAA,IAC9D;AAAA,EACF;AAAA,EAEA,WAA0B;AACxB,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAAA,EAEA,aAA4B;AAC1B,WAAO,QAAQ,QAAQ;AAAA,EACzB;AACF;","names":[]}
@@ -0,0 +1,21 @@
1
+ import type { Attributes } from '@opentelemetry/api';
2
+ import type { LogRecord, LogRecordProcessor } from '@opentelemetry/sdk-logs';
3
+ /**
4
+ * Metadata log processor that injects metadata (room_id, job_id) into all log records.
5
+ */
6
+ export declare class MetadataLogProcessor implements LogRecordProcessor {
7
+ private metadata;
8
+ constructor(metadata: Attributes);
9
+ onEmit(logRecord: LogRecord): void;
10
+ shutdown(): Promise<void>;
11
+ forceFlush(): Promise<void>;
12
+ }
13
+ /**
14
+ * Extra details processor that adds logger name to log records.
15
+ */
16
+ export declare class ExtraDetailsProcessor implements LogRecordProcessor {
17
+ onEmit(logRecord: LogRecord): void;
18
+ shutdown(): Promise<void>;
19
+ forceFlush(): Promise<void>;
20
+ }
21
+ //# sourceMappingURL=logging.d.ts.map
@@ -0,0 +1,21 @@
1
+ import type { Attributes } from '@opentelemetry/api';
2
+ import type { LogRecord, LogRecordProcessor } from '@opentelemetry/sdk-logs';
3
+ /**
4
+ * Metadata log processor that injects metadata (room_id, job_id) into all log records.
5
+ */
6
+ export declare class MetadataLogProcessor implements LogRecordProcessor {
7
+ private metadata;
8
+ constructor(metadata: Attributes);
9
+ onEmit(logRecord: LogRecord): void;
10
+ shutdown(): Promise<void>;
11
+ forceFlush(): Promise<void>;
12
+ }
13
+ /**
14
+ * Extra details processor that adds logger name to log records.
15
+ */
16
+ export declare class ExtraDetailsProcessor implements LogRecordProcessor {
17
+ onEmit(logRecord: LogRecord): void;
18
+ shutdown(): Promise<void>;
19
+ forceFlush(): Promise<void>;
20
+ }
21
+ //# sourceMappingURL=logging.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../../src/telemetry/logging.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7E;;GAEG;AACH,qBAAa,oBAAqB,YAAW,kBAAkB;IAC7D,OAAO,CAAC,QAAQ,CAAa;gBAEjB,QAAQ,EAAE,UAAU;IAIhC,MAAM,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IASlC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAIzB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAG5B;AAED;;GAEG;AACH,qBAAa,qBAAsB,YAAW,kBAAkB;IAC9D,MAAM,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IASlC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAIzB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAG5B"}
@@ -0,0 +1,40 @@
1
+ class MetadataLogProcessor {
2
+ metadata;
3
+ constructor(metadata) {
4
+ this.metadata = metadata;
5
+ }
6
+ onEmit(logRecord) {
7
+ if (logRecord.attributes) {
8
+ Object.assign(logRecord.attributes, this.metadata);
9
+ } else {
10
+ logRecord.attributes = { ...this.metadata };
11
+ }
12
+ }
13
+ shutdown() {
14
+ return Promise.resolve();
15
+ }
16
+ forceFlush() {
17
+ return Promise.resolve();
18
+ }
19
+ }
20
+ class ExtraDetailsProcessor {
21
+ onEmit(logRecord) {
22
+ const loggerName = logRecord.instrumentationScope.name;
23
+ if (logRecord.attributes) {
24
+ logRecord.attributes["logger.name"] = loggerName;
25
+ } else {
26
+ logRecord.attributes = { "logger.name": loggerName };
27
+ }
28
+ }
29
+ shutdown() {
30
+ return Promise.resolve();
31
+ }
32
+ forceFlush() {
33
+ return Promise.resolve();
34
+ }
35
+ }
36
+ export {
37
+ ExtraDetailsProcessor,
38
+ MetadataLogProcessor
39
+ };
40
+ //# sourceMappingURL=logging.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/telemetry/logging.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { Attributes } from '@opentelemetry/api';\nimport type { LogRecord, LogRecordProcessor } from '@opentelemetry/sdk-logs';\n\n/**\n * Metadata log processor that injects metadata (room_id, job_id) into all log records.\n */\nexport class MetadataLogProcessor implements LogRecordProcessor {\n private metadata: Attributes;\n\n constructor(metadata: Attributes) {\n this.metadata = metadata;\n }\n\n onEmit(logRecord: LogRecord): void {\n // Add metadata to log record attributes\n if (logRecord.attributes) {\n Object.assign(logRecord.attributes, this.metadata);\n } else {\n (logRecord as any).attributes = { ...this.metadata };\n }\n }\n\n shutdown(): Promise<void> {\n return Promise.resolve();\n }\n\n forceFlush(): Promise<void> {\n return Promise.resolve();\n }\n}\n\n/**\n * Extra details processor that adds logger name to log records.\n */\nexport class ExtraDetailsProcessor implements LogRecordProcessor {\n onEmit(logRecord: LogRecord): void {\n const loggerName = logRecord.instrumentationScope.name;\n if (logRecord.attributes) {\n (logRecord.attributes as any)['logger.name'] = loggerName;\n } else {\n (logRecord as any).attributes = { 'logger.name': loggerName };\n }\n }\n\n shutdown(): Promise<void> {\n return Promise.resolve();\n }\n\n forceFlush(): Promise<void> {\n return Promise.resolve();\n }\n}\n"],"mappings":"AASO,MAAM,qBAAmD;AAAA,EACtD;AAAA,EAER,YAAY,UAAsB;AAChC,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,OAAO,WAA4B;AAEjC,QAAI,UAAU,YAAY;AACxB,aAAO,OAAO,UAAU,YAAY,KAAK,QAAQ;AAAA,IACnD,OAAO;AACL,MAAC,UAAkB,aAAa,EAAE,GAAG,KAAK,SAAS;AAAA,IACrD;AAAA,EACF;AAAA,EAEA,WAA0B;AACxB,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAAA,EAEA,aAA4B;AAC1B,WAAO,QAAQ,QAAQ;AAAA,EACzB;AACF;AAKO,MAAM,sBAAoD;AAAA,EAC/D,OAAO,WAA4B;AACjC,UAAM,aAAa,UAAU,qBAAqB;AAClD,QAAI,UAAU,YAAY;AACxB,MAAC,UAAU,WAAmB,aAAa,IAAI;AAAA,IACjD,OAAO;AACL,MAAC,UAAkB,aAAa,EAAE,eAAe,WAAW;AAAA,IAC9D;AAAA,EACF;AAAA,EAEA,WAA0B;AACxB,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAAA,EAEA,aAA4B;AAC1B,WAAO,QAAQ,QAAQ;AAAA,EACzB;AACF;","names":[]}
@@ -0,0 +1,144 @@
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 otel_http_exporter_exports = {};
20
+ __export(otel_http_exporter_exports, {
21
+ SimpleOTLPHttpLogExporter: () => SimpleOTLPHttpLogExporter
22
+ });
23
+ module.exports = __toCommonJS(otel_http_exporter_exports);
24
+ var import_api_logs = require("@opentelemetry/api-logs");
25
+ var import_livekit_server_sdk = require("livekit-server-sdk");
26
+ class SimpleOTLPHttpLogExporter {
27
+ config;
28
+ jwt = null;
29
+ constructor(config) {
30
+ this.config = config;
31
+ }
32
+ /**
33
+ * Export simple log records
34
+ */
35
+ async export(records) {
36
+ if (records.length === 0) return;
37
+ await this.ensureJwt();
38
+ const endpoint = `https://${this.config.cloudHostname}/observability/logs/otlp/v0`;
39
+ const payload = this.buildPayload(records);
40
+ const response = await fetch(endpoint, {
41
+ method: "POST",
42
+ headers: {
43
+ Authorization: `Bearer ${this.jwt}`,
44
+ "Content-Type": "application/json"
45
+ },
46
+ body: JSON.stringify(payload)
47
+ });
48
+ if (!response.ok) {
49
+ const text = await response.text();
50
+ throw new Error(
51
+ `OTLP log export failed: ${response.status} ${response.statusText} - ${text}`
52
+ );
53
+ }
54
+ }
55
+ async ensureJwt() {
56
+ if (this.jwt) return;
57
+ const apiKey = process.env.LIVEKIT_API_KEY;
58
+ const apiSecret = process.env.LIVEKIT_API_SECRET;
59
+ if (!apiKey || !apiSecret) {
60
+ throw new Error("LIVEKIT_API_KEY and LIVEKIT_API_SECRET must be set");
61
+ }
62
+ const token = new import_livekit_server_sdk.AccessToken(apiKey, apiSecret, { ttl: "6h" });
63
+ token.addObservabilityGrant({ write: true });
64
+ this.jwt = await token.toJwt();
65
+ }
66
+ buildPayload(records) {
67
+ const resourceAttrs = Object.entries(this.config.resourceAttributes).map(([key, value]) => ({
68
+ key,
69
+ value: { stringValue: value }
70
+ }));
71
+ if (!this.config.resourceAttributes["service.name"]) {
72
+ resourceAttrs.push({ key: "service.name", value: { stringValue: "livekit-agents" } });
73
+ }
74
+ const scopeAttrs = this.config.scopeAttributes ? Object.entries(this.config.scopeAttributes).map(([key, value]) => ({
75
+ key,
76
+ value: { stringValue: value }
77
+ })) : [];
78
+ const logRecords = records.map((record) => ({
79
+ timeUnixNano: String(BigInt(Math.floor(record.timestampMs * 1e6))),
80
+ observedTimeUnixNano: String(BigInt(Date.now()) * BigInt(1e6)),
81
+ severityNumber: record.severityNumber ?? import_api_logs.SeverityNumber.UNSPECIFIED,
82
+ severityText: record.severityText ?? "unspecified",
83
+ body: { stringValue: record.body },
84
+ attributes: this.convertAttributes(record.attributes),
85
+ traceId: "",
86
+ spanId: ""
87
+ }));
88
+ return {
89
+ resourceLogs: [
90
+ {
91
+ resource: { attributes: resourceAttrs },
92
+ scopeLogs: [
93
+ {
94
+ scope: {
95
+ name: this.config.scopeName,
96
+ attributes: scopeAttrs
97
+ },
98
+ logRecords
99
+ }
100
+ ]
101
+ }
102
+ ]
103
+ };
104
+ }
105
+ convertAttributes(attrs) {
106
+ return Object.entries(attrs).map(([key, value]) => ({
107
+ key,
108
+ value: this.convertValue(value)
109
+ }));
110
+ }
111
+ convertValue(value) {
112
+ if (value === null || value === void 0) {
113
+ return { stringValue: "" };
114
+ }
115
+ if (typeof value === "string") {
116
+ return { stringValue: value };
117
+ }
118
+ if (typeof value === "number") {
119
+ return Number.isInteger(value) ? { intValue: String(value) } : { doubleValue: value };
120
+ }
121
+ if (typeof value === "boolean") {
122
+ return { boolValue: value };
123
+ }
124
+ if (Array.isArray(value)) {
125
+ return { arrayValue: { values: value.map((v) => this.convertValue(v)) } };
126
+ }
127
+ if (typeof value === "object") {
128
+ return {
129
+ kvlistValue: {
130
+ values: Object.entries(value).map(([k, v]) => ({
131
+ key: k,
132
+ value: this.convertValue(v)
133
+ }))
134
+ }
135
+ };
136
+ }
137
+ return { stringValue: String(value) };
138
+ }
139
+ }
140
+ // Annotate the CommonJS export names for ESM import in node:
141
+ 0 && (module.exports = {
142
+ SimpleOTLPHttpLogExporter
143
+ });
144
+ //# sourceMappingURL=otel_http_exporter.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/telemetry/otel_http_exporter.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * OTLP HTTP JSON Log Exporter for LiveKit Cloud\n *\n * This module provides a custom OTLP log exporter that uses HTTP with JSON format\n * instead of the default protobuf format.\n */\nimport { SeverityNumber } from '@opentelemetry/api-logs';\nimport { AccessToken } from 'livekit-server-sdk';\n\nexport interface SimpleLogRecord {\n /** Log message body */\n body: string;\n /** Timestamp in milliseconds since epoch */\n timestampMs: number;\n /** Log attributes */\n attributes: Record<string, unknown>;\n /** Severity number (default: UNSPECIFIED) */\n severityNumber?: SeverityNumber;\n /** Severity text (default: 'unspecified') */\n severityText?: string;\n}\n\nexport interface SimpleOTLPHttpLogExporterConfig {\n /** LiveKit Cloud hostname */\n cloudHostname: string;\n /** Resource attributes (e.g., room_id, job_id) */\n resourceAttributes: Record<string, string>;\n /** Scope name for the logger */\n scopeName: string;\n /** Scope attributes */\n scopeAttributes?: Record<string, string>;\n}\n\n/**\n * Simple OTLP HTTP Log Exporter for direct log export\n *\n * This is a simplified exporter that doesn't require the full SDK infrastructure.\n * Use this when you need to send logs directly without LoggerProvider.\n *\n * @example\n * ```typescript\n * const exporter = new SimpleOTLPHttpLogExporter({\n * cloudHostname: 'cloud.livekit.io',\n * resourceAttributes: { room_id: 'xxx', job_id: 'yyy' },\n * scopeName: 'chat_history',\n * });\n *\n * await exporter.export([\n * { body: 'Hello', timestampMs: Date.now(), attributes: { test: true } },\n * ]);\n * ```\n */\nexport class SimpleOTLPHttpLogExporter {\n private readonly config: SimpleOTLPHttpLogExporterConfig;\n private jwt: string | null = null;\n\n constructor(config: SimpleOTLPHttpLogExporterConfig) {\n this.config = config;\n }\n\n /**\n * Export simple log records\n */\n async export(records: SimpleLogRecord[]): Promise<void> {\n if (records.length === 0) return;\n\n await this.ensureJwt();\n\n const endpoint = `https://${this.config.cloudHostname}/observability/logs/otlp/v0`;\n const payload = this.buildPayload(records);\n\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this.jwt}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(\n `OTLP log export failed: ${response.status} ${response.statusText} - ${text}`,\n );\n }\n }\n\n private async ensureJwt(): Promise<void> {\n if (this.jwt) return;\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');\n }\n\n const token = new AccessToken(apiKey, apiSecret, { ttl: '6h' });\n token.addObservabilityGrant({ write: true });\n this.jwt = await token.toJwt();\n }\n\n private buildPayload(records: SimpleLogRecord[]): object {\n const resourceAttrs = Object.entries(this.config.resourceAttributes).map(([key, value]) => ({\n key,\n value: { stringValue: value },\n }));\n\n if (!this.config.resourceAttributes['service.name']) {\n resourceAttrs.push({ key: 'service.name', value: { stringValue: 'livekit-agents' } });\n }\n\n const scopeAttrs = this.config.scopeAttributes\n ? Object.entries(this.config.scopeAttributes).map(([key, value]) => ({\n key,\n value: { stringValue: value },\n }))\n : [];\n\n const logRecords = records.map((record) => ({\n timeUnixNano: String(BigInt(Math.floor(record.timestampMs * 1_000_000))),\n observedTimeUnixNano: String(BigInt(Date.now()) * BigInt(1_000_000)),\n severityNumber: record.severityNumber ?? SeverityNumber.UNSPECIFIED,\n severityText: record.severityText ?? 'unspecified',\n body: { stringValue: record.body },\n attributes: this.convertAttributes(record.attributes),\n traceId: '',\n spanId: '',\n }));\n\n return {\n resourceLogs: [\n {\n resource: { attributes: resourceAttrs },\n scopeLogs: [\n {\n scope: {\n name: this.config.scopeName,\n attributes: scopeAttrs,\n },\n logRecords,\n },\n ],\n },\n ],\n };\n }\n\n private convertAttributes(\n attrs: Record<string, unknown>,\n ): Array<{ key: string; value: unknown }> {\n return Object.entries(attrs).map(([key, value]) => ({\n key,\n value: this.convertValue(value),\n }));\n }\n\n private convertValue(value: unknown): unknown {\n if (value === null || value === undefined) {\n return { stringValue: '' };\n }\n if (typeof value === 'string') {\n return { stringValue: value };\n }\n if (typeof value === 'number') {\n return Number.isInteger(value) ? { intValue: String(value) } : { doubleValue: value };\n }\n if (typeof value === 'boolean') {\n return { boolValue: value };\n }\n if (Array.isArray(value)) {\n return { arrayValue: { values: value.map((v) => this.convertValue(v)) } };\n }\n if (typeof value === 'object') {\n return {\n kvlistValue: {\n values: Object.entries(value as Record<string, unknown>).map(([k, v]) => ({\n key: k,\n value: this.convertValue(v),\n })),\n },\n };\n }\n return { stringValue: String(value) };\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * OTLP HTTP JSON Log Exporter for LiveKit Cloud
3
+ *
4
+ * This module provides a custom OTLP log exporter that uses HTTP with JSON format
5
+ * instead of the default protobuf format.
6
+ */
7
+ import { SeverityNumber } from '@opentelemetry/api-logs';
8
+ export interface SimpleLogRecord {
9
+ /** Log message body */
10
+ body: string;
11
+ /** Timestamp in milliseconds since epoch */
12
+ timestampMs: number;
13
+ /** Log attributes */
14
+ attributes: Record<string, unknown>;
15
+ /** Severity number (default: UNSPECIFIED) */
16
+ severityNumber?: SeverityNumber;
17
+ /** Severity text (default: 'unspecified') */
18
+ severityText?: string;
19
+ }
20
+ export interface SimpleOTLPHttpLogExporterConfig {
21
+ /** LiveKit Cloud hostname */
22
+ cloudHostname: string;
23
+ /** Resource attributes (e.g., room_id, job_id) */
24
+ resourceAttributes: Record<string, string>;
25
+ /** Scope name for the logger */
26
+ scopeName: string;
27
+ /** Scope attributes */
28
+ scopeAttributes?: Record<string, string>;
29
+ }
30
+ /**
31
+ * Simple OTLP HTTP Log Exporter for direct log export
32
+ *
33
+ * This is a simplified exporter that doesn't require the full SDK infrastructure.
34
+ * Use this when you need to send logs directly without LoggerProvider.
35
+ *
36
+ * @example
37
+ * ```typescript
38
+ * const exporter = new SimpleOTLPHttpLogExporter({
39
+ * cloudHostname: 'cloud.livekit.io',
40
+ * resourceAttributes: { room_id: 'xxx', job_id: 'yyy' },
41
+ * scopeName: 'chat_history',
42
+ * });
43
+ *
44
+ * await exporter.export([
45
+ * { body: 'Hello', timestampMs: Date.now(), attributes: { test: true } },
46
+ * ]);
47
+ * ```
48
+ */
49
+ export declare class SimpleOTLPHttpLogExporter {
50
+ private readonly config;
51
+ private jwt;
52
+ constructor(config: SimpleOTLPHttpLogExporterConfig);
53
+ /**
54
+ * Export simple log records
55
+ */
56
+ export(records: SimpleLogRecord[]): Promise<void>;
57
+ private ensureJwt;
58
+ private buildPayload;
59
+ private convertAttributes;
60
+ private convertValue;
61
+ }
62
+ //# sourceMappingURL=otel_http_exporter.d.ts.map
@@ -0,0 +1,62 @@
1
+ /**
2
+ * OTLP HTTP JSON Log Exporter for LiveKit Cloud
3
+ *
4
+ * This module provides a custom OTLP log exporter that uses HTTP with JSON format
5
+ * instead of the default protobuf format.
6
+ */
7
+ import { SeverityNumber } from '@opentelemetry/api-logs';
8
+ export interface SimpleLogRecord {
9
+ /** Log message body */
10
+ body: string;
11
+ /** Timestamp in milliseconds since epoch */
12
+ timestampMs: number;
13
+ /** Log attributes */
14
+ attributes: Record<string, unknown>;
15
+ /** Severity number (default: UNSPECIFIED) */
16
+ severityNumber?: SeverityNumber;
17
+ /** Severity text (default: 'unspecified') */
18
+ severityText?: string;
19
+ }
20
+ export interface SimpleOTLPHttpLogExporterConfig {
21
+ /** LiveKit Cloud hostname */
22
+ cloudHostname: string;
23
+ /** Resource attributes (e.g., room_id, job_id) */
24
+ resourceAttributes: Record<string, string>;
25
+ /** Scope name for the logger */
26
+ scopeName: string;
27
+ /** Scope attributes */
28
+ scopeAttributes?: Record<string, string>;
29
+ }
30
+ /**
31
+ * Simple OTLP HTTP Log Exporter for direct log export
32
+ *
33
+ * This is a simplified exporter that doesn't require the full SDK infrastructure.
34
+ * Use this when you need to send logs directly without LoggerProvider.
35
+ *
36
+ * @example
37
+ * ```typescript
38
+ * const exporter = new SimpleOTLPHttpLogExporter({
39
+ * cloudHostname: 'cloud.livekit.io',
40
+ * resourceAttributes: { room_id: 'xxx', job_id: 'yyy' },
41
+ * scopeName: 'chat_history',
42
+ * });
43
+ *
44
+ * await exporter.export([
45
+ * { body: 'Hello', timestampMs: Date.now(), attributes: { test: true } },
46
+ * ]);
47
+ * ```
48
+ */
49
+ export declare class SimpleOTLPHttpLogExporter {
50
+ private readonly config;
51
+ private jwt;
52
+ constructor(config: SimpleOTLPHttpLogExporterConfig);
53
+ /**
54
+ * Export simple log records
55
+ */
56
+ export(records: SimpleLogRecord[]): Promise<void>;
57
+ private ensureJwt;
58
+ private buildPayload;
59
+ private convertAttributes;
60
+ private convertValue;
61
+ }
62
+ //# sourceMappingURL=otel_http_exporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otel_http_exporter.d.ts","sourceRoot":"","sources":["../../src/telemetry/otel_http_exporter.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAGzD,MAAM,WAAW,eAAe;IAC9B,uBAAuB;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,qBAAqB;IACrB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,6CAA6C;IAC7C,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,6CAA6C;IAC7C,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,+BAA+B;IAC9C,6BAA6B;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,kDAAkD;IAClD,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,uBAAuB;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC1C;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,yBAAyB;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkC;IACzD,OAAO,CAAC,GAAG,CAAuB;gBAEtB,MAAM,EAAE,+BAA+B;IAInD;;OAEG;IACG,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;YAyBzC,SAAS;IAevB,OAAO,CAAC,YAAY;IA8CpB,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,YAAY;CA4BrB"}