langwatch 1.19.0 → 2.0.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 (91) hide show
  1. package/README.md +27 -13
  2. package/dist/agent/index.d.mts +122 -79
  3. package/dist/agent/index.d.ts +122 -79
  4. package/dist/agent/index.js +541 -301
  5. package/dist/agent/index.js.map +1 -1
  6. package/dist/agent/index.mjs +540 -302
  7. package/dist/agent/index.mjs.map +1 -1
  8. package/dist/{chunk-NPEK4RSD.mjs → chunk-2GKEMCKT.mjs} +7757 -2409
  9. package/dist/chunk-2GKEMCKT.mjs.map +1 -0
  10. package/dist/chunk-5VYEG3RS.js +117 -0
  11. package/dist/chunk-5VYEG3RS.js.map +1 -0
  12. package/dist/chunk-AYPQNLCC.mjs +852 -0
  13. package/dist/chunk-AYPQNLCC.mjs.map +1 -0
  14. package/dist/chunk-BL3GHEKF.js +59 -0
  15. package/dist/chunk-BL3GHEKF.js.map +1 -0
  16. package/dist/chunk-C7IWJ2GJ.mjs +59 -0
  17. package/dist/chunk-C7IWJ2GJ.mjs.map +1 -0
  18. package/dist/chunk-DLZCOUXC.js +852 -0
  19. package/dist/chunk-DLZCOUXC.js.map +1 -0
  20. package/dist/{chunk-O4J3ZPZY.js → chunk-F7BVJW3S.js} +7912 -2564
  21. package/dist/chunk-F7BVJW3S.js.map +1 -0
  22. package/dist/{chunk-SY5HSL5G.mjs → chunk-M3DSPR5S.mjs} +124 -112
  23. package/dist/chunk-M3DSPR5S.mjs.map +1 -0
  24. package/dist/{chunk-CSV7B7B5.js → chunk-MAO3SIBB.js} +141 -129
  25. package/dist/chunk-MAO3SIBB.js.map +1 -0
  26. package/dist/{chunk-LCG5Y2EG.js → chunk-N76BG37W.js} +15 -101
  27. package/dist/chunk-N76BG37W.js.map +1 -0
  28. package/dist/chunk-SERULD4Z.mjs +117 -0
  29. package/dist/chunk-SERULD4Z.mjs.map +1 -0
  30. package/dist/{chunk-73QOHSHU.js → chunk-WDUUAIG3.js} +2 -2
  31. package/dist/chunk-WDUUAIG3.js.map +1 -0
  32. package/dist/{chunk-WMDQVWA6.mjs → chunk-WSGVZ3J2.mjs} +22 -108
  33. package/dist/chunk-WSGVZ3J2.mjs.map +1 -0
  34. package/dist/{chunk-57L2K66L.mjs → chunk-XQ4CP2JK.mjs} +2 -2
  35. package/dist/chunk-XQ4CP2JK.mjs.map +1 -0
  36. package/dist/cli/bundle.js +853 -552
  37. package/dist/implementation-BXVPzwOt.d.mts +261 -0
  38. package/dist/implementation-DJ-JveZl.d.ts +261 -0
  39. package/dist/index.d.mts +479 -1130
  40. package/dist/index.d.ts +479 -1130
  41. package/dist/index.js +7908 -3525
  42. package/dist/index.js.map +1 -1
  43. package/dist/index.mjs +7883 -3500
  44. package/dist/index.mjs.map +1 -1
  45. package/dist/observability-sdk/index.d.mts +16 -76
  46. package/dist/observability-sdk/index.d.ts +16 -76
  47. package/dist/observability-sdk/index.js +8 -5
  48. package/dist/observability-sdk/index.js.map +1 -1
  49. package/dist/observability-sdk/index.mjs +13 -10
  50. package/dist/observability-sdk/instrumentation/langchain/index.d.mts +3 -5
  51. package/dist/observability-sdk/instrumentation/langchain/index.d.ts +3 -5
  52. package/dist/observability-sdk/instrumentation/langchain/index.js +160 -112
  53. package/dist/observability-sdk/instrumentation/langchain/index.js.map +1 -1
  54. package/dist/observability-sdk/instrumentation/langchain/index.mjs +148 -100
  55. package/dist/observability-sdk/instrumentation/langchain/index.mjs.map +1 -1
  56. package/dist/observability-sdk/semconv/index.d.mts +37 -0
  57. package/dist/observability-sdk/semconv/index.d.ts +37 -0
  58. package/dist/observability-sdk/semconv/index.js +121 -0
  59. package/dist/observability-sdk/semconv/index.js.map +1 -0
  60. package/dist/observability-sdk/semconv/index.mjs +121 -0
  61. package/dist/observability-sdk/semconv/index.mjs.map +1 -0
  62. package/dist/observability-sdk/setup/node/index.d.mts +73 -313
  63. package/dist/observability-sdk/setup/node/index.d.ts +73 -313
  64. package/dist/observability-sdk/setup/node/index.js +6 -4
  65. package/dist/observability-sdk/setup/node/index.js.map +1 -1
  66. package/dist/observability-sdk/setup/node/index.mjs +5 -3
  67. package/dist/types--ExXvd26.d.mts +16583 -0
  68. package/dist/{types-VOZv9LYO.d.ts → types-CoS5PmeU.d.mts} +22 -59
  69. package/dist/{types-VOZv9LYO.d.mts → types-CoS5PmeU.d.ts} +22 -59
  70. package/dist/types-CpT3iEIj.d.ts +16583 -0
  71. package/dist/{types-DLfhJb38.d.mts → types-RkiBQZ9j.d.mts} +1 -6
  72. package/dist/{types-DLfhJb38.d.ts → types-RkiBQZ9j.d.ts} +1 -6
  73. package/dist/values-1yj9l0Sa.d.mts +112 -0
  74. package/dist/values-1yj9l0Sa.d.ts +112 -0
  75. package/package.json +94 -64
  76. package/dist/chunk-57L2K66L.mjs.map +0 -1
  77. package/dist/chunk-73QOHSHU.js.map +0 -1
  78. package/dist/chunk-CSV7B7B5.js.map +0 -1
  79. package/dist/chunk-LCG5Y2EG.js.map +0 -1
  80. package/dist/chunk-NPEK4RSD.mjs.map +0 -1
  81. package/dist/chunk-O4J3ZPZY.js.map +0 -1
  82. package/dist/chunk-PIYOJF6V.mjs +0 -566
  83. package/dist/chunk-PIYOJF6V.mjs.map +0 -1
  84. package/dist/chunk-SY5HSL5G.mjs.map +0 -1
  85. package/dist/chunk-WGLVIV4J.js +0 -566
  86. package/dist/chunk-WGLVIV4J.js.map +0 -1
  87. package/dist/chunk-WMDQVWA6.mjs.map +0 -1
  88. package/dist/implementation-CeTvnq6e.d.mts +0 -716
  89. package/dist/implementation-CsQrexpY.d.ts +0 -716
  90. package/dist/types-ofe1fAYQ.d.mts +0 -38143
  91. package/dist/types-wuYJPoFb.d.ts +0 -38143
@@ -2,13 +2,56 @@
2
2
 
3
3
 
4
4
 
5
- var _chunkLCG5Y2EGjs = require('./chunk-LCG5Y2EG.js');
5
+
6
+
7
+ var _chunkBL3GHEKFjs = require('./chunk-BL3GHEKF.js');
8
+
9
+
10
+ var _chunk5VYEG3RSjs = require('./chunk-5VYEG3RS.js');
11
+
12
+
13
+
14
+ var _chunkN76BG37Wjs = require('./chunk-N76BG37W.js');
6
15
 
7
16
  // src/observability-sdk/exporters/langwatch-trace-exporter.ts
8
- var _exportertraceotlphttp = require('@opentelemetry/exporter-trace-otlp-http');
17
+ var _exportertraceotlpproto = require('@opentelemetry/exporter-trace-otlp-proto');
18
+
19
+ // src/internal/api/auth.ts
20
+ var LEGACY_PAT_PREFIX = "pat-lw-";
21
+ var API_KEY_PREFIX = "sk-lw-";
22
+ var isUserScopedApiKey = (token) => {
23
+ if (token.startsWith(LEGACY_PAT_PREFIX)) return true;
24
+ if (token.startsWith(API_KEY_PREFIX)) {
25
+ const body = token.slice(API_KEY_PREFIX.length);
26
+ return body.includes("_");
27
+ }
28
+ return false;
29
+ };
30
+ var buildAuthHeaders = ({
31
+ apiKey,
32
+ projectId
33
+ }) => {
34
+ var _a;
35
+ if (!apiKey) return {};
36
+ const resolvedProjectId = (_a = projectId != null ? projectId : process.env.LANGWATCH_PROJECT_ID) != null ? _a : void 0;
37
+ if (isUserScopedApiKey(apiKey)) {
38
+ if (resolvedProjectId) {
39
+ const encoded = Buffer.from(`${resolvedProjectId}:${apiKey}`, "utf-8").toString("base64");
40
+ return { authorization: `Basic ${encoded}` };
41
+ }
42
+ return {
43
+ authorization: `Bearer ${apiKey}`,
44
+ "x-auth-token": apiKey
45
+ };
46
+ }
47
+ return {
48
+ authorization: `Bearer ${apiKey}`,
49
+ "x-auth-token": apiKey
50
+ };
51
+ };
9
52
 
10
53
  // package.json
11
- var version = "1.19.0";
54
+ var version = "2.0.0";
12
55
 
13
56
  // src/internal/runtime.ts
14
57
  var _runtime;
@@ -17,26 +60,21 @@ var getRuntime = () => {
17
60
  return _runtime;
18
61
  };
19
62
  function detectRuntime(globals) {
20
- var _a;
21
63
  let g = globalThis;
22
64
  if (globals) {
23
65
  if (process.env.NODE_ENV === "test") {
24
66
  g = globals;
25
67
  } else {
26
- console.warn("[LangWatch Observability] overriding detectRuntime is only supported when running in NODE_ENV=test");
68
+ console.warn(
69
+ "[LangWatch Observability] overriding detectRuntime is only supported when running in NODE_ENV=test"
70
+ );
27
71
  }
28
72
  }
29
73
  try {
30
- if ("Deno" in g && typeof g.Deno === "object" && g.Deno && "version" in g.Deno && typeof g.Deno.version === "object") {
31
- return "deno";
32
- }
33
- if ("Bun" in g && typeof g.Bun === "object" && g.Bun && "version" in g.Bun && typeof g.Bun.version === "string") {
34
- return "bun";
35
- }
36
- if ("process" in g && typeof g.process === "object" && g.process && typeof g.process.versions === "object" && typeof g.process.versions.node === "string") {
37
- return "node";
38
- }
39
- if (typeof ((_a = g.window) == null ? void 0 : _a.document) !== "undefined" && g === g.window) {
74
+ if (isDenoRuntime(g)) return "deno";
75
+ if (isBunRuntime(g)) return "bun";
76
+ if (isNodeRuntime(g)) return "node";
77
+ if (isWebRuntime(g)) {
40
78
  return "web";
41
79
  }
42
80
  return "unknown";
@@ -45,6 +83,33 @@ function detectRuntime(globals) {
45
83
  return "unknown";
46
84
  }
47
85
  }
86
+ function isWebRuntime(g) {
87
+ if (!("window" in g) || typeof g.window !== "object" || !g.window) {
88
+ return false;
89
+ }
90
+ const win = g.window;
91
+ if (g !== win) return false;
92
+ return "document" in win && typeof win.document !== "undefined";
93
+ }
94
+ function isDenoRuntime(g) {
95
+ if (!("Deno" in g) || typeof g.Deno !== "object" || !g.Deno) {
96
+ return false;
97
+ }
98
+ return "version" in g.Deno && typeof g.Deno.version === "object";
99
+ }
100
+ function isBunRuntime(g) {
101
+ if (!("Bun" in g) || typeof g.Bun !== "object" || !g.Bun) {
102
+ return false;
103
+ }
104
+ return "version" in g.Bun && typeof g.Bun.version === "string";
105
+ }
106
+ function isNodeRuntime(g) {
107
+ if (!("process" in g) || typeof g.process !== "object" || !g.process) {
108
+ return false;
109
+ }
110
+ const versions = "versions" in g.process ? g.process.versions : void 0;
111
+ return typeof versions === "object" && versions !== null && "node" in versions && typeof versions.node === "string";
112
+ }
48
113
 
49
114
  // src/internal/constants.ts
50
115
  var LANGWATCH_SDK_RUNTIME = getRuntime;
@@ -52,47 +117,29 @@ var LANGWATCH_SDK_NAME_OBSERVABILITY = "langwatch-observability-sdk";
52
117
  var LANGWATCH_SDK_NAME_CLIENT = "langwatch-client-sdk";
53
118
  var LANGWATCH_SDK_LANGUAGE = "typescript";
54
119
  var LANGWATCH_SDK_VERSION = version;
120
+ var API_VERSION_HEADER = "X-API-Version";
121
+ var LANGWATCH_API_VERSION = "2026-10-26";
55
122
  var DEFAULT_ENDPOINT = "https://app.langwatch.ai";
56
123
  var DEFAULT_SERVICE_NAME = "unknown-service.langwatch";
57
124
  var TRACES_PATH = "/api/otel/v1/traces";
58
125
  var LOGS_PATH = "/api/otel/v1/logs";
59
126
 
60
- // src/internal/api/auth.ts
61
- var LEGACY_PAT_PREFIX = "pat-lw-";
62
- var API_KEY_PREFIX = "sk-lw-";
63
- var isUserScopedApiKey = (token) => {
64
- if (token.startsWith(LEGACY_PAT_PREFIX)) return true;
65
- if (token.startsWith(API_KEY_PREFIX)) {
66
- const body = token.slice(API_KEY_PREFIX.length);
67
- return body.includes("_");
68
- }
69
- return false;
70
- };
71
- var buildAuthHeaders = ({
72
- apiKey,
73
- projectId
74
- }) => {
75
- var _a;
76
- if (!apiKey) return {};
77
- const resolvedProjectId = (_a = projectId != null ? projectId : process.env.LANGWATCH_PROJECT_ID) != null ? _a : void 0;
78
- if (isUserScopedApiKey(apiKey)) {
79
- if (resolvedProjectId) {
80
- const encoded = Buffer.from(
81
- `${resolvedProjectId}:${apiKey}`,
82
- "utf-8"
83
- ).toString("base64");
84
- return { authorization: `Basic ${encoded}` };
85
- }
86
- return {
87
- authorization: `Bearer ${apiKey}`,
88
- "x-auth-token": apiKey
89
- };
90
- }
91
- return {
92
- authorization: `Bearer ${apiKey}`,
93
- "x-auth-token": apiKey
94
- };
95
- };
127
+ // src/internal/otlp-compression.ts
128
+ var _otlpexporterbase = require('@opentelemetry/otlp-exporter-base');
129
+ function resolveOtlpCompression({
130
+ compression,
131
+ signal
132
+ }) {
133
+ if (compression !== void 0) return compression;
134
+ const isSetInEnv = [
135
+ "OTEL_EXPORTER_OTLP_COMPRESSION",
136
+ `OTEL_EXPORTER_OTLP_${signal}_COMPRESSION`
137
+ ].some((name) => {
138
+ var _a;
139
+ return (_a = process.env[name]) == null ? void 0 : _a.trim();
140
+ });
141
+ return isSetInEnv ? void 0 : _otlpexporterbase.CompressionAlgorithm.GZIP;
142
+ }
96
143
 
97
144
  // src/observability-sdk/exporters/trace-filters.ts
98
145
  function applyFilters(filters, spans) {
@@ -101,10 +148,7 @@ function applyFilters(filters, spans) {
101
148
  }
102
149
  function applyFilterRule(rule, spans) {
103
150
  if ("preset" in rule && rule.preset) {
104
- return applyPreset(
105
- rule.preset,
106
- spans
107
- );
151
+ return applyPreset(rule.preset, spans);
108
152
  }
109
153
  if ("include" in rule && rule.include) {
110
154
  const criteria = rule.include;
@@ -148,7 +192,8 @@ function valueMatches(value, rule) {
148
192
  return ignoreCase ? raw.toLowerCase().startsWith(rule.startsWith.toLowerCase()) : raw.startsWith(rule.startsWith);
149
193
  }
150
194
  if (rule.matches instanceof RegExp) {
151
- const re = ignoreCase && !rule.matches.flags.includes("i") ? new RegExp(rule.matches.source, (rule.matches.flags || "") + "i") : rule.matches;
195
+ const flags = rule.matches.flags;
196
+ const re = ignoreCase && !flags.includes("i") ? new RegExp(rule.matches.source, (flags || "") + "i") : rule.matches;
152
197
  return re.test(raw);
153
198
  }
154
199
  return false;
@@ -171,39 +216,12 @@ function isHttpRequestSpan(span) {
171
216
  if (attributes["http.request.method"] !== void 0 || attributes["http.method"] !== void 0) {
172
217
  return true;
173
218
  }
174
- return /^(GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD|CONNECT|TRACE)( |$)/.test(
175
- (_d = span.name) != null ? _d : ""
176
- );
219
+ return /^(GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD|CONNECT|TRACE)( |$)/.test((_d = span.name) != null ? _d : "");
177
220
  }
178
221
 
179
222
  // src/observability-sdk/exporters/langwatch-trace-exporter.ts
180
- var LangWatchTraceExporter = class extends _exportertraceotlphttp.OTLPTraceExporter {
181
- /**
182
- * Creates a new LangWatchTraceExporter instance.
183
- *
184
- * @param opts - Configuration options for the exporter
185
- * @param opts.apiKey - API key for LangWatch authentication.
186
- * Falls back to `LANGWATCH_API_KEY` environment variable, then empty string.
187
- * @param opts.endpoint - Custom endpoint URL for LangWatch ingestion.
188
- * Falls back to `LANGWATCH_ENDPOINT` environment variable, then default endpoint.
189
- * @param opts.filters - Array of filters applied sequentially to spans before export (AND semantics).
190
- * When omitted, defaults to `[{ preset: "excludeHttpRequests" }]`.
191
- * Pass `null` or `[]` to disable all filtering and send all spans.
192
- *
193
- * @example
194
- * ```typescript
195
- * // With API key and default filtering
196
- * const exporter = new LangWatchTraceExporter({
197
- * apiKey: 'your-api-key'
198
- * });
199
- *
200
- * // With custom endpoint and no filtering
201
- * const exporter = new LangWatchTraceExporter({
202
- * endpoint: 'https://custom.langwatch.ai',
203
- * filters: null
204
- * });
205
- * ```
206
- */
223
+ var LangWatchTraceExporter = class extends _exportertraceotlpproto.OTLPTraceExporter {
224
+ /** Configures auth from opts or environment; applies filters to span stream. */
207
225
  constructor(opts) {
208
226
  var _a, _b, _c, _d, _e;
209
227
  const apiKey = (_b = (_a = opts == null ? void 0 : opts.apiKey) != null ? _a : process.env.LANGWATCH_API_KEY) != null ? _b : "";
@@ -212,13 +230,14 @@ var LangWatchTraceExporter = class extends _exportertraceotlphttp.OTLPTraceExpor
212
230
  const url = new URL(TRACES_PATH, endpoint);
213
231
  const otelEndpoint = url.toString();
214
232
  super({
215
- headers: _chunkLCG5Y2EGjs.__spreadValues.call(void 0, {
233
+ headers: _chunkN76BG37Wjs.__spreadValues.call(void 0, {
216
234
  "x-langwatch-sdk-name": LANGWATCH_SDK_NAME_OBSERVABILITY,
217
235
  "x-langwatch-sdk-language": LANGWATCH_SDK_LANGUAGE,
218
236
  "x-langwatch-sdk-version": LANGWATCH_SDK_VERSION,
219
237
  "x-langwatch-sdk-runtime": LANGWATCH_SDK_RUNTIME()
220
238
  }, buildAuthHeaders({ apiKey, projectId })),
221
- url: otelEndpoint.toString()
239
+ url: otelEndpoint.toString(),
240
+ compression: resolveOtlpCompression({ compression: opts == null ? void 0 : opts.compression, signal: "TRACES" })
222
241
  });
223
242
  if ((opts == null ? void 0 : opts.filters) === null || Array.isArray(opts == null ? void 0 : opts.filters) && opts.filters.length === 0) {
224
243
  this.filters = [];
@@ -235,17 +254,9 @@ var LangWatchTraceExporter = class extends _exportertraceotlphttp.OTLPTraceExpor
235
254
  };
236
255
 
237
256
  // src/observability-sdk/exporters/langwatch-logs-exporter.ts
238
- var _exporterlogsotlphttp = require('@opentelemetry/exporter-logs-otlp-http');
239
- var LangWatchLogsExporter = class extends _exporterlogsotlphttp.OTLPLogExporter {
240
- /**
241
- * Creates a new LangWatchLogsExporter instance.
242
- *
243
- * @param opts - Optional configuration options for the exporter.
244
- * @param opts.apiKey - Optional API key for LangWatch authentication. If not provided,
245
- * will use environment variables or fallback configuration.
246
- * @param opts.endpoint - Optional custom endpoint URL for LangWatch ingestion.
247
- * If not provided, will use environment variables or fallback configuration.
248
- */
257
+ var _exporterlogsotlpproto = require('@opentelemetry/exporter-logs-otlp-proto');
258
+ var LangWatchLogsExporter = class extends _exporterlogsotlpproto.OTLPLogExporter {
259
+ /** Configures auth headers and endpoint; reads defaults from environment if needed. */
249
260
  constructor(opts) {
250
261
  var _a, _b, _c, _d;
251
262
  const apiKey = (_b = (_a = opts == null ? void 0 : opts.apiKey) != null ? _a : process.env.LANGWATCH_API_KEY) != null ? _b : "";
@@ -253,24 +264,18 @@ var LangWatchLogsExporter = class extends _exporterlogsotlphttp.OTLPLogExporter
253
264
  const url = new URL(LOGS_PATH, endpoint);
254
265
  const otelEndpoint = url.toString();
255
266
  super({
256
- headers: _chunkLCG5Y2EGjs.__spreadValues.call(void 0, {
267
+ headers: _chunkN76BG37Wjs.__spreadValues.call(void 0, {
257
268
  "x-langwatch-sdk-name": LANGWATCH_SDK_NAME_OBSERVABILITY,
258
269
  "x-langwatch-sdk-language": LANGWATCH_SDK_LANGUAGE,
259
270
  "x-langwatch-sdk-version": LANGWATCH_SDK_VERSION,
260
271
  "x-langwatch-sdk-runtime": LANGWATCH_SDK_RUNTIME()
261
272
  }, apiKey ? { authorization: `Bearer ${apiKey}` } : {}),
262
- url: otelEndpoint.toString()
273
+ url: otelEndpoint.toString(),
274
+ compression: resolveOtlpCompression({ compression: opts == null ? void 0 : opts.compression, signal: "LOGS" })
263
275
  });
264
276
  }
265
277
  };
266
278
 
267
- // src/observability-sdk/semconv/events.ts
268
- var LOG_EVNT_GEN_AI_SYSTEM_MESSAGE = "gen.ai.system_message";
269
- var LOG_EVNT_GEN_AI_USER_MESSAGE = "gen.ai.user_message";
270
- var LOG_EVNT_GEN_AI_ASSISTANT_MESSAGE = "gen.ai.assistant_message";
271
- var LOG_EVNT_GEN_AI_TOOL_MESSAGE = "gen.ai.tool_message";
272
- var LOG_EVNT_GEN_AI_CHOICE = "gen.ai.choice";
273
-
274
279
  // src/observability-sdk/logger/index.ts
275
280
 
276
281
 
@@ -290,7 +295,7 @@ var LangWatchLoggerInternal = class {
290
295
  return this.logger.enabled(options);
291
296
  }
292
297
  emit(logRecord, options) {
293
- if (!_chunkLCG5Y2EGjs.shouldCaptureOutput.call(void 0, )) {
298
+ if (!_chunk5VYEG3RSjs.shouldCaptureOutput.call(void 0, )) {
294
299
  logRecord.body = void 0;
295
300
  }
296
301
  if (!logRecord.context && !(options == null ? void 0 : options.excludeContext)) {
@@ -301,9 +306,11 @@ var LangWatchLoggerInternal = class {
301
306
  emitGenAISystemMessageEvent(body, system, attributes) {
302
307
  var _a;
303
308
  this.emitGenAIEvent(
304
- LOG_EVNT_GEN_AI_SYSTEM_MESSAGE,
305
- _chunkLCG5Y2EGjs.__spreadProps.call(void 0, _chunkLCG5Y2EGjs.__spreadValues.call(void 0, {}, body), { role: (_a = body.role) != null ? _a : "system" }),
306
- _chunkLCG5Y2EGjs.__spreadProps.call(void 0, _chunkLCG5Y2EGjs.__spreadValues.call(void 0, {}, attributes), {
309
+ _chunkBL3GHEKFjs.LOG_EVNT_GEN_AI_SYSTEM_MESSAGE,
310
+ _chunkN76BG37Wjs.__spreadProps.call(void 0, _chunkN76BG37Wjs.__spreadValues.call(void 0, {}, body), {
311
+ role: (_a = body.role) != null ? _a : "system"
312
+ }),
313
+ _chunkN76BG37Wjs.__spreadProps.call(void 0, _chunkN76BG37Wjs.__spreadValues.call(void 0, {}, attributes), {
307
314
  "gen_ai.system": system
308
315
  })
309
316
  );
@@ -311,9 +318,11 @@ var LangWatchLoggerInternal = class {
311
318
  emitGenAIUserMessageEvent(body, system, attributes) {
312
319
  var _a;
313
320
  this.emitGenAIEvent(
314
- LOG_EVNT_GEN_AI_USER_MESSAGE,
315
- _chunkLCG5Y2EGjs.__spreadProps.call(void 0, _chunkLCG5Y2EGjs.__spreadValues.call(void 0, {}, body), { role: (_a = body.role) != null ? _a : "user" }),
316
- _chunkLCG5Y2EGjs.__spreadProps.call(void 0, _chunkLCG5Y2EGjs.__spreadValues.call(void 0, {}, attributes), {
321
+ _chunkBL3GHEKFjs.LOG_EVNT_GEN_AI_USER_MESSAGE,
322
+ _chunkN76BG37Wjs.__spreadProps.call(void 0, _chunkN76BG37Wjs.__spreadValues.call(void 0, {}, body), {
323
+ role: (_a = body.role) != null ? _a : "user"
324
+ }),
325
+ _chunkN76BG37Wjs.__spreadProps.call(void 0, _chunkN76BG37Wjs.__spreadValues.call(void 0, {}, attributes), {
317
326
  "gen_ai.system": system
318
327
  })
319
328
  );
@@ -321,9 +330,11 @@ var LangWatchLoggerInternal = class {
321
330
  emitGenAIAssistantMessageEvent(body, system, attributes) {
322
331
  var _a;
323
332
  this.emitGenAIEvent(
324
- LOG_EVNT_GEN_AI_ASSISTANT_MESSAGE,
325
- _chunkLCG5Y2EGjs.__spreadProps.call(void 0, _chunkLCG5Y2EGjs.__spreadValues.call(void 0, {}, body), { role: (_a = body.role) != null ? _a : "assistant" }),
326
- _chunkLCG5Y2EGjs.__spreadProps.call(void 0, _chunkLCG5Y2EGjs.__spreadValues.call(void 0, {}, attributes), {
333
+ _chunkBL3GHEKFjs.LOG_EVNT_GEN_AI_ASSISTANT_MESSAGE,
334
+ _chunkN76BG37Wjs.__spreadProps.call(void 0, _chunkN76BG37Wjs.__spreadValues.call(void 0, {}, body), {
335
+ role: (_a = body.role) != null ? _a : "assistant"
336
+ }),
337
+ _chunkN76BG37Wjs.__spreadProps.call(void 0, _chunkN76BG37Wjs.__spreadValues.call(void 0, {}, attributes), {
327
338
  "gen_ai.system": system
328
339
  })
329
340
  );
@@ -333,9 +344,9 @@ var LangWatchLoggerInternal = class {
333
344
  body.role = "tool";
334
345
  }
335
346
  this.emitGenAIEvent(
336
- LOG_EVNT_GEN_AI_TOOL_MESSAGE,
337
- _chunkLCG5Y2EGjs.__spreadValues.call(void 0, {}, body),
338
- _chunkLCG5Y2EGjs.__spreadProps.call(void 0, _chunkLCG5Y2EGjs.__spreadValues.call(void 0, {}, attributes), {
347
+ _chunkBL3GHEKFjs.LOG_EVNT_GEN_AI_TOOL_MESSAGE,
348
+ _chunkN76BG37Wjs.__spreadValues.call(void 0, {}, body),
349
+ _chunkN76BG37Wjs.__spreadProps.call(void 0, _chunkN76BG37Wjs.__spreadValues.call(void 0, {}, attributes), {
339
350
  "gen_ai.system": system
340
351
  })
341
352
  );
@@ -346,11 +357,11 @@ var LangWatchLoggerInternal = class {
346
357
  body.message.role = "assistant";
347
358
  }
348
359
  this.emitGenAIEvent(
349
- LOG_EVNT_GEN_AI_CHOICE,
350
- _chunkLCG5Y2EGjs.__spreadProps.call(void 0, _chunkLCG5Y2EGjs.__spreadValues.call(void 0, {}, body), {
351
- message: _chunkLCG5Y2EGjs.__spreadProps.call(void 0, _chunkLCG5Y2EGjs.__spreadValues.call(void 0, {}, body.message), { role: (_b = (_a = body.message) == null ? void 0 : _a.role) != null ? _b : "assistant" })
360
+ _chunkBL3GHEKFjs.LOG_EVNT_GEN_AI_CHOICE,
361
+ _chunkN76BG37Wjs.__spreadProps.call(void 0, _chunkN76BG37Wjs.__spreadValues.call(void 0, {}, body), {
362
+ message: _chunkN76BG37Wjs.__spreadProps.call(void 0, _chunkN76BG37Wjs.__spreadValues.call(void 0, {}, body.message), { role: (_b = (_a = body.message) == null ? void 0 : _a.role) != null ? _b : "assistant" })
352
363
  }),
353
- _chunkLCG5Y2EGjs.__spreadProps.call(void 0, _chunkLCG5Y2EGjs.__spreadValues.call(void 0, {}, attributes), {
364
+ _chunkN76BG37Wjs.__spreadProps.call(void 0, _chunkN76BG37Wjs.__spreadValues.call(void 0, {}, attributes), {
354
365
  "gen_ai.system": system
355
366
  })
356
367
  );
@@ -359,8 +370,8 @@ var LangWatchLoggerInternal = class {
359
370
  this.emit({
360
371
  eventName,
361
372
  context: _api.context.active(),
362
- attributes: _chunkLCG5Y2EGjs.__spreadValues.call(void 0, {}, attributes),
363
- body: _chunkLCG5Y2EGjs.shouldCaptureOutput.call(void 0, ) ? body : void 0,
373
+ attributes: _chunkN76BG37Wjs.__spreadValues.call(void 0, {}, attributes),
374
+ body: _chunk5VYEG3RSjs.shouldCaptureOutput.call(void 0, ) ? body : void 0,
364
375
  observedTimestamp: (/* @__PURE__ */ new Date()).getTime()
365
376
  });
366
377
  }
@@ -399,5 +410,6 @@ function createLangWatchLogger(logger) {
399
410
 
400
411
 
401
412
 
402
- exports.version = version; exports.LANGWATCH_SDK_RUNTIME = LANGWATCH_SDK_RUNTIME; exports.LANGWATCH_SDK_NAME_OBSERVABILITY = LANGWATCH_SDK_NAME_OBSERVABILITY; exports.LANGWATCH_SDK_NAME_CLIENT = LANGWATCH_SDK_NAME_CLIENT; exports.LANGWATCH_SDK_LANGUAGE = LANGWATCH_SDK_LANGUAGE; exports.LANGWATCH_SDK_VERSION = LANGWATCH_SDK_VERSION; exports.DEFAULT_ENDPOINT = DEFAULT_ENDPOINT; exports.DEFAULT_SERVICE_NAME = DEFAULT_SERVICE_NAME; exports.buildAuthHeaders = buildAuthHeaders; exports.LangWatchTraceExporter = LangWatchTraceExporter; exports.LangWatchLogsExporter = LangWatchLogsExporter; exports.setLangWatchLoggerProvider = setLangWatchLoggerProvider; exports.getLangWatchLogger = getLangWatchLogger; exports.getLangWatchLoggerFromProvider = getLangWatchLoggerFromProvider;
403
- //# sourceMappingURL=chunk-CSV7B7B5.js.map
413
+
414
+ exports.buildAuthHeaders = buildAuthHeaders; exports.LANGWATCH_SDK_RUNTIME = LANGWATCH_SDK_RUNTIME; exports.LANGWATCH_SDK_NAME_OBSERVABILITY = LANGWATCH_SDK_NAME_OBSERVABILITY; exports.LANGWATCH_SDK_NAME_CLIENT = LANGWATCH_SDK_NAME_CLIENT; exports.LANGWATCH_SDK_LANGUAGE = LANGWATCH_SDK_LANGUAGE; exports.LANGWATCH_SDK_VERSION = LANGWATCH_SDK_VERSION; exports.API_VERSION_HEADER = API_VERSION_HEADER; exports.LANGWATCH_API_VERSION = LANGWATCH_API_VERSION; exports.DEFAULT_ENDPOINT = DEFAULT_ENDPOINT; exports.DEFAULT_SERVICE_NAME = DEFAULT_SERVICE_NAME; exports.LangWatchTraceExporter = LangWatchTraceExporter; exports.LangWatchLogsExporter = LangWatchLogsExporter; exports.setLangWatchLoggerProvider = setLangWatchLoggerProvider; exports.getLangWatchLogger = getLangWatchLogger; exports.getLangWatchLoggerFromProvider = getLangWatchLoggerFromProvider;
415
+ //# sourceMappingURL=chunk-MAO3SIBB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/langwatch/langwatch/sdks/typescript/dist/chunk-MAO3SIBB.js","../src/observability-sdk/exporters/langwatch-trace-exporter.ts","../src/internal/api/auth.ts","../package.json","../src/internal/runtime.ts","../src/internal/constants.ts","../src/internal/otlp-compression.ts","../src/observability-sdk/exporters/trace-filters.ts","../src/observability-sdk/exporters/langwatch-logs-exporter.ts","../src/observability-sdk/logger/index.ts","../src/observability-sdk/logger/implementation.ts"],"names":["_a","version"],"mappings":"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","file":"/home/runner/work/langwatch/langwatch/sdks/typescript/dist/chunk-MAO3SIBB.js","sourcesContent":[null,"import { type ExportResult } from \"@opentelemetry/core\";\nimport { OTLPTraceExporter } from \"@opentelemetry/exporter-trace-otlp-proto\";\nimport { type CompressionAlgorithm } from \"@opentelemetry/otlp-exporter-base\";\nimport { type ReadableSpan } from \"@opentelemetry/sdk-trace-base\";\n\nimport { buildAuthHeaders } from \"../../internal/api/auth\";\nimport {\n DEFAULT_ENDPOINT,\n LANGWATCH_SDK_LANGUAGE,\n LANGWATCH_SDK_NAME_OBSERVABILITY,\n LANGWATCH_SDK_RUNTIME,\n LANGWATCH_SDK_VERSION,\n TRACES_PATH,\n} from \"../../internal/constants\";\nimport { resolveOtlpCompression } from \"../../internal/otlp-compression\";\nimport { type TraceFilter, type Criteria, type Match, applyFilters } from \"./trace-filters\";\n\n/** Options: endpoint URL, API key for auth, and optional span filters (default excludes HTTP). */\nexport interface LangWatchTraceExporterOptions {\n endpoint?: string;\n apiKey?: string;\n /**\n * Project identifier. Required when `apiKey` is a Personal Access Token\n * (`pat-lw-*`); ignored for legacy `sk-lw-*` keys. Falls back to\n * `LANGWATCH_PROJECT_ID`.\n */\n projectId?: string;\n filters?: TraceFilter[] | null;\n /** Request compression: gzip unless an OTEL_EXPORTER_OTLP_*COMPRESSION env var is set. */\n compression?: CompressionAlgorithm;\n}\n\nexport type { TraceFilter, Criteria, Match };\n\n/** Sends traces to LangWatch with auth; applies span filters (default excludes HTTP). */\nexport class LangWatchTraceExporter extends OTLPTraceExporter {\n private readonly filters: TraceFilter[];\n /** Configures auth from opts or environment; applies filters to span stream. */\n constructor(opts?: LangWatchTraceExporterOptions) {\n const apiKey = opts?.apiKey ?? process.env.LANGWATCH_API_KEY ?? \"\";\n const projectId = opts?.projectId ?? process.env.LANGWATCH_PROJECT_ID;\n const endpoint = opts?.endpoint ?? process.env.LANGWATCH_ENDPOINT ?? DEFAULT_ENDPOINT;\n\n const url = new URL(TRACES_PATH, endpoint);\n const otelEndpoint = url.toString();\n\n super({\n headers: {\n \"x-langwatch-sdk-name\": LANGWATCH_SDK_NAME_OBSERVABILITY,\n \"x-langwatch-sdk-language\": LANGWATCH_SDK_LANGUAGE,\n \"x-langwatch-sdk-version\": LANGWATCH_SDK_VERSION,\n \"x-langwatch-sdk-runtime\": LANGWATCH_SDK_RUNTIME(),\n ...buildAuthHeaders({ apiKey, projectId }),\n },\n url: otelEndpoint.toString(),\n compression: resolveOtlpCompression({ compression: opts?.compression, signal: \"TRACES\" }),\n });\n\n // Handle filters: null or [] = no filtering, undefined = default, array = use provided\n if (opts?.filters === null || (Array.isArray(opts?.filters) && opts.filters.length === 0)) {\n this.filters = [];\n } else if (Array.isArray(opts?.filters)) {\n this.filters = opts.filters;\n } else {\n this.filters = [{ preset: \"excludeHttpRequests\" }];\n }\n }\n\n export(spans: ReadableSpan[], resultCallback: (result: ExportResult) => void): void {\n const filtered = applyFilters(this.filters, spans);\n super.export(filtered, resultCallback);\n }\n}\n","/**\n * Authentication header assembly, two token families: legacy `sk-lw-`\n * project keys send `Bearer` + `X-Auth-Token`; user-scoped keys send\n * `Basic base64(projectId:token)` so the server can resolve the role binding.\n */\n\n/** Old PAT prefix — still accepted by the server for backward compat. */\nconst LEGACY_PAT_PREFIX = \"pat-lw-\";\n\n/** Unified API key prefix — also used by legacy project keys. */\nconst API_KEY_PREFIX = \"sk-lw-\";\n\nexport interface LangWatchAuthHeadersInput {\n /** API key token. May be empty; in that case no auth headers are emitted. */\n apiKey: string;\n /**\n * Project identifier. Required for user-scoped API keys to resolve scope;\n * optional for legacy project keys (the token already encodes project identity).\n * Falls back to `LANGWATCH_PROJECT_ID` when omitted.\n */\n projectId?: string;\n}\n\nexport type LangWatchAuthHeaders = Record<string, string>;\n\n/**\n * Whether the credential is a user-scoped API key (as opposed to a legacy project key): a\n * `pat-lw-` prefix, or a `sk-lw-` prefix with an underscore in the body (the new format).\n */\nexport const isUserScopedApiKey = (token: string): boolean => {\n if (token.startsWith(LEGACY_PAT_PREFIX)) return true;\n if (token.startsWith(API_KEY_PREFIX)) {\n const body = token.slice(API_KEY_PREFIX.length);\n return body.includes(\"_\");\n }\n return false;\n};\n\n/**\n * Builds the HTTP headers required to authenticate against the LangWatch\n * API using either a legacy project key or a user-scoped API key.\n */\nexport const buildAuthHeaders = ({\n apiKey,\n projectId,\n}: LangWatchAuthHeadersInput): LangWatchAuthHeaders => {\n if (!apiKey) return {};\n\n const resolvedProjectId = projectId ?? process.env.LANGWATCH_PROJECT_ID ?? undefined;\n\n if (isUserScopedApiKey(apiKey)) {\n if (resolvedProjectId) {\n // Basic Auth is the canonical carrier — the server extracts both\n // the project and the token from one header.\n const encoded = Buffer.from(`${resolvedProjectId}:${apiKey}`, \"utf-8\").toString(\"base64\");\n return { authorization: `Basic ${encoded}` };\n }\n\n // API key without a projectId: use Bearer and let the server reject\n // unresolvable requests.\n return {\n authorization: `Bearer ${apiKey}`,\n \"x-auth-token\": apiKey,\n };\n }\n\n // Legacy sk-lw-* project key: preserve the dual-header shape.\n return {\n authorization: `Bearer ${apiKey}`,\n \"x-auth-token\": apiKey,\n };\n};\n","{\n \"name\": \"langwatch\",\n \"version\": \"2.0.0\",\n \"description\": \"LangWatch TypeScript/JavaScript SDK. Interact with the full LangWatch API and use the LangWatch OpenTelemetry SDK to instrument your application. For more information, see https://docs.langwatch.ai/integration/typescript/guide\",\n \"license\": \"MIT\",\n \"author\": \"LangWatch\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/langwatch/langwatch.git\",\n \"directory\": \"typescript-sdk\"\n },\n \"bin\": {\n \"langwatch\": \"./dist/cli/index.js\",\n \"lw\": \"./dist/cli/index.js\"\n },\n \"files\": [\n \"dist\",\n \"!dist/bin\",\n \"!dist/cli/*.map\",\n \"README.md\",\n \"LICENSE\"\n ],\n \"main\": \"dist/index.js\",\n \"module\": \"dist/index.mjs\",\n \"types\": \"dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.js\"\n },\n \"./observability\": {\n \"types\": \"./dist/observability-sdk/index.d.ts\",\n \"require\": \"./dist/observability-sdk/index.js\",\n \"import\": \"./dist/observability-sdk/index.mjs\"\n },\n \"./observability/semconv\": {\n \"types\": \"./dist/observability-sdk/semconv/index.d.ts\",\n \"require\": \"./dist/observability-sdk/semconv/index.js\",\n \"import\": \"./dist/observability-sdk/semconv/index.mjs\"\n },\n \"./observability/node\": {\n \"types\": \"./dist/observability-sdk/setup/node/index.d.ts\",\n \"require\": \"./dist/observability-sdk/setup/node/index.js\",\n \"import\": \"./dist/observability-sdk/setup/node/index.mjs\"\n },\n \"./observability/instrumentation/langchain\": {\n \"types\": \"./dist/observability-sdk/instrumentation/langchain/index.d.ts\",\n \"require\": \"./dist/observability-sdk/instrumentation/langchain/index.js\",\n \"import\": \"./dist/observability-sdk/instrumentation/langchain/index.mjs\"\n },\n \"./agent\": {\n \"types\": \"./dist/agent/index.d.ts\",\n \"require\": \"./dist/agent/index.js\",\n \"import\": \"./dist/agent/index.mjs\"\n }\n },\n \"scripts\": {\n \"generate\": \"pnpm run generate:server-types\",\n \"cli\": \"node dist/cli/index.js\",\n \"prelint\": \"pnpm run generate\",\n \"lint\": \"eslint .\",\n \"pretest\": \"pnpm run generate\",\n \"test\": \"vitest run --exclude '**/*.integration.test.ts'\",\n \"test:e2e\": \"dotenv -- vitest run -c ./vitest.e2e.config.mts\",\n \"test:governance-e2e\": \"vitest run -c ./vitest.governance-e2e.config.mts\",\n \"test:seed\": \"dotenv -e .env.test -- pnpm -w run prisma:seed\",\n \"prebuild\": \"pnpm run generate\",\n \"build\": \"rm -rf dist && tsup\",\n \"postbuild\": \"node -e \\\"const{statSync}=require('node:fs'),{execFileSync}=require('node:child_process');const f='dist/cli/index.js',want=require('./package.json').version;const s=statSync(f);if(process.platform!=='win32'&&!(s.mode&0o111))throw new Error(f+' is not executable');const got=execFileSync(process.execPath,[f,'--version'],{encoding:'utf8',env:{...process.env,LANGWATCH_NO_DAEMON:'1'}}).trim();if(got!==want)throw new Error('version mismatch: '+f+' reports '+got+', package.json says '+want);console.log('postbuild: '+f+' ok ('+got+')')\\\"\",\n \"build:binary\": \"bun run scripts/build-cli-binary.ts\",\n \"tarball\": \"pnpm build && pnpm pack\",\n \"typecheck\": \"GOMAXPROCS=2 GOMEMLIMIT=2GiB pnpm -w exec tsc -b sdks/typescript\",\n \"prepublish\": \"pnpm run build\",\n \"generate:openapi-types\": \"node scripts/generate-openapi-types.mjs\",\n \"generate:server-types\": \"./copy-types.sh\"\n },\n \"dependencies\": {\n \"@opentelemetry/api-logs\": \"catalog:\",\n \"@opentelemetry/context-async-hooks\": \"catalog:\",\n \"@opentelemetry/core\": \"catalog:\",\n \"@opentelemetry/exporter-logs-otlp-proto\": \"catalog:\",\n \"@opentelemetry/exporter-trace-otlp-proto\": \"catalog:\",\n \"@opentelemetry/otlp-exporter-base\": \"catalog:\",\n \"@opentelemetry/resources\": \"catalog:\",\n \"@opentelemetry/sdk-logs\": \"catalog:\",\n \"@opentelemetry/sdk-trace-base\": \"catalog:\",\n \"@opentelemetry/sdk-trace-node\": \"catalog:\",\n \"liquidjs\": \"catalog:\",\n \"open\": \"^11.0.0\",\n \"openapi-fetch\": \"^0.17.0\",\n \"ws\": \"catalog:\",\n \"xksuid\": \"^0.0.4\",\n \"zod\": \"catalog:\"\n },\n \"devDependencies\": {\n \"@eslint/js\": \"^9.32.0\",\n \"@langchain/core\": \">=0.3.68 <0.4.0\",\n \"@langchain/langgraph\": \">=0.4.0 <1.0.0\",\n \"@langchain/openai\": \">=0.6.0 <1.0.0\",\n \"@langwatch/e2e-stack\": \"workspace:*\",\n \"@langwatch/handled-error\": \"workspace:*\",\n \"@opentelemetry/api\": \"catalog:\",\n \"@opentelemetry/instrumentation\": \"catalog:\",\n \"@opentelemetry/sdk-metrics\": \"catalog:\",\n \"@opentelemetry/sdk-trace-web\": \"catalog:\",\n \"@types/debug\": \"catalog:\",\n \"@types/js-yaml\": \"catalog:\",\n \"@types/node\": \"catalog:\",\n \"@types/prompts\": \"catalog:\",\n \"@types/ws\": \"catalog:\",\n \"@typescript-eslint/parser\": \"^8.58.1\",\n \"@vercel/otel\": \"^1.13.0\",\n \"@vitest/coverage-v8\": \"^5.0.1\",\n \"chalk\": \"catalog:\",\n \"commander\": \"catalog:\",\n \"dotenv\": \"catalog:\",\n \"dotenv-cli\": \"^11.0.0\",\n \"esbuild\": \"catalog:\",\n \"eslint\": \"^9.32.0\",\n \"fets\": \"^0.8.5\",\n \"fishery\": \"^2.3.1\",\n \"js-yaml\": \"catalog:\",\n \"jsonc-parser\": \"^3.3.1\",\n \"langchain\": \">=0.3.0 <2.0.0\",\n \"msw\": \"^2.10.4\",\n \"nock\": \"^14.0.8\",\n \"openapi-msw\": \"^1.2.0\",\n \"openapi-typescript\": \"7.13.0\",\n \"ora\": \"catalog:\",\n \"prompts\": \"catalog:\",\n \"tsup\": \"catalog:\",\n \"typescript\": \"catalog:sdk-toolchain\",\n \"typescript-eslint\": \"catalog:\",\n \"vitest\": \"catalog:\",\n \"vitest-mock-extended\": \"^5.1.1\",\n \"yaml\": \"^2.8.1\"\n },\n \"peerDependencies\": {\n \"@ai-sdk/openai\": \">=2.0.0 <5.0.0\",\n \"@langchain/core\": \">=0.3.0 <2.0.0\",\n \"@langchain/langgraph\": \">=0.4.0 <2.0.0\",\n \"@langchain/openai\": \">=0.6.0 <2.0.0\",\n \"@opentelemetry/api\": \"^1.9.0\",\n \"@opentelemetry/context-zone\": \">=1.19.0 <3.0.0\",\n \"@opentelemetry/exporter-trace-otlp-grpc\": \">=0.221.0 <1.0.0\",\n \"@opentelemetry/instrumentation\": \">=0.200.0 <1.0.0\",\n \"@opentelemetry/sdk-metrics\": \">=2.0.0 <3.0.0\",\n \"@opentelemetry/sdk-trace-web\": \">=1.19.0 <3.0.0\",\n \"langchain\": \">=0.3.0 <2.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"@ai-sdk/openai\": {\n \"optional\": true\n },\n \"@langchain/core\": {\n \"optional\": true\n },\n \"@langchain/langgraph\": {\n \"optional\": true\n },\n \"@langchain/openai\": {\n \"optional\": true\n },\n \"@opentelemetry/context-zone\": {\n \"optional\": true\n },\n \"@opentelemetry/exporter-trace-otlp-grpc\": {\n \"optional\": true\n },\n \"@opentelemetry/instrumentation\": {\n \"optional\": true\n },\n \"@opentelemetry/sdk-metrics\": {\n \"optional\": true\n },\n \"@opentelemetry/sdk-trace-web\": {\n \"optional\": true\n },\n \"langchain\": {\n \"optional\": true\n }\n },\n \"engines\": {\n \"node\": \"^22.23.4 || ^24.22.1 || >=26.12.1\",\n \"pnpm\": \">=8\"\n },\n \"nx\": {\n \"namedInputs\": {\n \"sdkBuild\": [\n \"default\",\n \"!{projectRoot}/**/*.test.ts\",\n \"!{projectRoot}/**/*.test.tsx\",\n \"!{projectRoot}/**/*.test.mts\",\n \"!{projectRoot}/vitest.config.*\",\n \"!{projectRoot}/vitest.integration.config.*\",\n \"!{projectRoot}/__tests__/**/*\"\n ],\n \"production\": [\n \"sdkBuild\",\n \"!{projectRoot}/src/cli/**/*\"\n ]\n }\n }\n}\n","export type JsRuntime = \"node\" | \"deno\" | \"bun\" | \"web\" | \"unknown\";\n\nlet _runtime: JsRuntime | undefined;\n\n/**\n * Gets the cached JavaScript runtime environment.\n * @returns The detected runtime environment\n */\nexport const getRuntime = (): JsRuntime => {\n _runtime ??= detectRuntime();\n return _runtime;\n};\n\n/**\n * Resets the cached runtime. Only used for testing.\n * @internal\n */\nexport const resetRuntimeCache = (): void => {\n _runtime = undefined;\n};\n\n/**\n * Detects the JavaScript runtime environment.\n * @param globals - (Test only) Override the global object for environment simulation;\n * only used if NODE_ENV === 'test'.\n */\nexport function detectRuntime(globals?: object): JsRuntime {\n let g: object = globalThis;\n if (globals) {\n if (process.env.NODE_ENV === \"test\") {\n g = globals;\n } else {\n console.warn(\n \"[LangWatch Observability] overriding detectRuntime is only supported when running in NODE_ENV=test\",\n );\n }\n }\n\n try {\n if (isDenoRuntime(g)) return \"deno\";\n if (isBunRuntime(g)) return \"bun\";\n if (isNodeRuntime(g)) return \"node\";\n if (isWebRuntime(g)) {\n return \"web\";\n }\n return \"unknown\";\n } catch (error) {\n console.warn(\"[LangWatch Observability] Failed to detect runtime\", error);\n return \"unknown\";\n }\n}\n\nfunction isWebRuntime(g: object): boolean {\n if (!(\"window\" in g) || typeof g.window !== \"object\" || !g.window) {\n return false;\n }\n const win: object = g.window;\n if (g !== win) return false;\n return \"document\" in win && typeof win.document !== \"undefined\";\n}\n\nfunction isDenoRuntime(g: object): boolean {\n if (!(\"Deno\" in g) || typeof g.Deno !== \"object\" || !g.Deno) {\n return false;\n }\n return \"version\" in g.Deno && typeof g.Deno.version === \"object\";\n}\n\nfunction isBunRuntime(g: object): boolean {\n if (!(\"Bun\" in g) || typeof g.Bun !== \"object\" || !g.Bun) {\n return false;\n }\n return \"version\" in g.Bun && typeof g.Bun.version === \"string\";\n}\n\nfunction isNodeRuntime(g: object): boolean {\n if (!(\"process\" in g) || typeof g.process !== \"object\" || !g.process) {\n return false;\n }\n const versions: unknown = \"versions\" in g.process ? g.process.versions : undefined;\n return (\n typeof versions === \"object\" &&\n versions !== null &&\n \"node\" in versions &&\n typeof versions.node === \"string\"\n );\n}\n","import { version } from \"../../package.json\";\nimport { getRuntime } from \"./runtime\";\n\nexport const LANGWATCH_SDK_RUNTIME = getRuntime;\n\nexport const LANGWATCH_SDK_NAME_OBSERVABILITY = \"langwatch-observability-sdk\";\nexport const LANGWATCH_SDK_NAME_CLIENT = \"langwatch-client-sdk\";\nexport const LANGWATCH_SDK_LANGUAGE = \"typescript\";\nexport const LANGWATCH_SDK_VERSION = version;\n\n/**\n * Every API request names the dated version this client is written against\n * (specs/api-reference/client-api-version.feature).\n */\nexport const API_VERSION_HEADER = \"X-API-Version\";\nexport const LANGWATCH_API_VERSION = \"2026-10-26\";\n\nexport const DEFAULT_ENDPOINT = \"https://app.langwatch.ai\";\nexport const DEFAULT_SERVICE_NAME = \"unknown-service.langwatch\";\n\nexport const TRACES_PATH = \"/api/otel/v1/traces\";\nexport const LOGS_PATH = \"/api/otel/v1/logs\";\nexport const METRICS_PATH = \"/api/otel/v1/metrics\";\n","import { CompressionAlgorithm } from \"@opentelemetry/otlp-exporter-base\";\n\n/**\n * The compression an OTLP exporter is built with: the caller's choice, else\n * the standard OTel env vars (left to the exporter), else gzip. Explicit\n * config beats env in OTel JS, so gzip is only set when neither is given.\n */\nexport function resolveOtlpCompression({\n compression,\n signal,\n}: {\n compression?: CompressionAlgorithm;\n signal: \"TRACES\" | \"LOGS\" | \"METRICS\";\n}): CompressionAlgorithm | undefined {\n if (compression !== undefined) return compression;\n const isSetInEnv = [\n \"OTEL_EXPORTER_OTLP_COMPRESSION\",\n `OTEL_EXPORTER_OTLP_${signal}_COMPRESSION`,\n ].some((name) => process.env[name]?.trim());\n return isSetInEnv ? undefined : CompressionAlgorithm.GZIP;\n}\n","import { type ReadableSpan } from \"@opentelemetry/sdk-trace-base\";\n\nexport interface Criteria {\n instrumentationScopeName?: Match[];\n name?: Match[];\n}\n\nexport interface Match {\n equals?: string;\n startsWith?: string;\n matches?: RegExp;\n ignoreCase?: boolean;\n}\n\nexport type TraceFilter =\n | { preset: \"vercelAIOnly\" | \"excludeHttpRequests\" }\n | { include: Criteria }\n | { exclude: Criteria };\n\n/**\n * Applies filters to spans sequentially (AND semantics).\n * @param filters - Filter rules to apply in sequence\n * @param spans - Array of spans to filter\n */\nexport function applyFilters(\n filters: TraceFilter[] | undefined,\n spans: ReadableSpan[],\n): ReadableSpan[] {\n if (!filters || filters.length === 0) return spans;\n return filters.reduce((current, rule) => applyFilterRule(rule, current), spans);\n}\n\n/**\n * Applies a single filter rule (preset, include, or exclude).\n * @param rule - Filter rule to apply\n * @param spans - Array of spans to filter\n */\nexport function applyFilterRule(rule: TraceFilter, spans: ReadableSpan[]): ReadableSpan[] {\n if (\"preset\" in rule && rule.preset) {\n return applyPreset(rule.preset, spans);\n }\n\n if (\"include\" in rule && rule.include) {\n const criteria = (rule as { include: Criteria }).include;\n return spans.filter((s) => matchesCriteria(s, criteria));\n }\n\n if (\"exclude\" in rule && rule.exclude) {\n const criteria = (rule as { exclude: Criteria }).exclude;\n return spans.filter((s) => !matchesCriteria(s, criteria));\n }\n\n return spans;\n}\n\n/**\n * Applies a preset filter: vercelAIOnly or excludeHttpRequests.\n * @param preset - Preset filter name\n * @param spans - Array of spans to filter\n */\nexport function applyPreset(\n preset: \"vercelAIOnly\" | \"excludeHttpRequests\",\n spans: ReadableSpan[],\n): ReadableSpan[] {\n if (preset === \"vercelAIOnly\") return spans.filter((s) => isVercelAiSpan(s));\n if (preset === \"excludeHttpRequests\") return spans.filter((s) => !isHttpRequestSpan(s));\n\n return spans;\n}\n\n/**\n * Checks if a span matches criteria (AND within fields, OR within each field).\n * @param span - Span to evaluate\n * @param criteria - Criteria to match against\n */\nexport function matchesCriteria(span: ReadableSpan, criteria: Criteria): boolean {\n if (criteria.instrumentationScopeName !== void 0) {\n const scopeName = span.instrumentationScope?.name ?? \"\";\n const ok = criteria.instrumentationScopeName.some((m) => valueMatches(scopeName, m));\n if (!ok) return false;\n }\n\n if (criteria.name !== void 0) {\n const ok = criteria.name.some((m) => valueMatches(span.name ?? \"\", m));\n if (!ok) return false;\n }\n\n return true;\n}\n\n/**\n * Evaluates if a string matches a rule (equals, startsWith, or regex).\n * Case-sensitive by default unless ignoreCase is true.\n * @param value - String to evaluate\n * @param rule - Match rule\n */\nexport function valueMatches(value: string, rule: Match): boolean {\n const raw = value ?? \"\";\n const ignoreCase = rule.ignoreCase ?? false;\n\n if (rule.equals !== void 0) {\n return ignoreCase\n ? raw.localeCompare(rule.equals, void 0, { sensitivity: \"base\" }) === 0\n : raw === rule.equals;\n }\n\n if (rule.startsWith !== void 0) {\n return ignoreCase\n ? raw.toLowerCase().startsWith(rule.startsWith.toLowerCase())\n : raw.startsWith(rule.startsWith);\n }\n\n if (rule.matches instanceof RegExp) {\n const flags = rule.matches.flags;\n const re =\n ignoreCase && !flags.includes(\"i\")\n ? new RegExp(rule.matches.source, (flags || \"\") + \"i\")\n : rule.matches;\n return re.test(raw);\n }\n\n return false;\n}\n\n/**\n * Checks if a span is from the Vercel AI SDK (scope name === 'ai', case-insensitive).\n * @param span - Span to check\n */\nexport function isVercelAiSpan(span: ReadableSpan): boolean {\n const scope = span.instrumentationScope?.name?.toLowerCase?.() ?? \"\";\n return scope === \"ai\";\n}\n\n/**\n * Instrumentation scopes that emit HTTP client/server request spans. Only\n * fully qualified package scopes count: an application is free to name its\n * own instrumentation \"fetch\" or \"undici\", and such spans are user data.\n */\nconst HTTP_INSTRUMENTATION_SCOPES = new Set([\n \"@opentelemetry/instrumentation-http\",\n \"@opentelemetry/instrumentation-undici\",\n \"@opentelemetry/instrumentation-fetch\",\n]);\n\n/**\n * Checks if a span is an HTTP instrumentation span.\n * Checks scope, then http.request.method attribute, then name heuristic.\n * @param span - Span to check\n */\nexport function isHttpRequestSpan(span: ReadableSpan): boolean {\n const scopeName = span.instrumentationScope?.name ?? \"\";\n if (HTTP_INSTRUMENTATION_SCOPES.has(scopeName)) return true;\n\n const attributes = (span.attributes ?? {}) as Record<string, unknown>;\n if (attributes[\"http.request.method\"] !== undefined || attributes[\"http.method\"] !== undefined) {\n return true;\n }\n\n return /^(GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD|CONNECT|TRACE)( |$)/.test(span.name ?? \"\");\n}\n","import { OTLPLogExporter } from \"@opentelemetry/exporter-logs-otlp-proto\";\nimport { type CompressionAlgorithm } from \"@opentelemetry/otlp-exporter-base\";\n\nimport {\n DEFAULT_ENDPOINT,\n LANGWATCH_SDK_LANGUAGE,\n LANGWATCH_SDK_NAME_OBSERVABILITY,\n LANGWATCH_SDK_RUNTIME,\n LANGWATCH_SDK_VERSION,\n LOGS_PATH,\n} from \"../../internal/constants\";\nimport { resolveOtlpCompression } from \"../../internal/otlp-compression\";\n\nexport interface LangWatchLogsExporterOptions {\n endpoint?: string;\n apiKey?: string;\n /** Request compression: gzip unless an OTEL_EXPORTER_OTLP_*COMPRESSION env var is set. */\n compression?: CompressionAlgorithm;\n}\n\n/** Extends OpenTelemetry OTLP HTTP logs exporter to send logs to LangWatch with authentication. */\nexport class LangWatchLogsExporter extends OTLPLogExporter {\n /** Configures auth headers and endpoint; reads defaults from environment if needed. */\n constructor(opts?: LangWatchLogsExporterOptions) {\n const apiKey = opts?.apiKey ?? process.env.LANGWATCH_API_KEY ?? \"\";\n const endpoint = opts?.endpoint ?? process.env.LANGWATCH_ENDPOINT ?? DEFAULT_ENDPOINT;\n\n const url = new URL(LOGS_PATH, endpoint);\n const otelEndpoint = url.toString();\n\n super({\n headers: {\n \"x-langwatch-sdk-name\": LANGWATCH_SDK_NAME_OBSERVABILITY,\n \"x-langwatch-sdk-language\": LANGWATCH_SDK_LANGUAGE,\n \"x-langwatch-sdk-version\": LANGWATCH_SDK_VERSION,\n \"x-langwatch-sdk-runtime\": LANGWATCH_SDK_RUNTIME(),\n ...(apiKey ? { authorization: `Bearer ${apiKey}` } : {}),\n },\n url: otelEndpoint.toString(),\n compression: resolveOtlpCompression({ compression: opts?.compression, signal: \"LOGS\" }),\n });\n }\n}\n","import {\n type Logger,\n type LoggerOptions,\n type LoggerProvider,\n createNoopLogger,\n} from \"@opentelemetry/api-logs\";\n\nimport { LangWatchLoggerInternal } from \"./implementation\";\nimport { type LangWatchLogger } from \"./types\";\n\n/**\n * `NoopLoggerProvider` was dropped from @opentelemetry/api-logs' public exports\n * (0.221) in favour of the still-exported `createNoopLogger`, so this is its\n * replacement: a provider whose loggers are always the shared no-op logger.\n */\nconst NOOP_LOGGER_PROVIDER: LoggerProvider = {\n getLogger: (_name: string, _version?: string, _options?: LoggerOptions) => createNoopLogger(),\n};\n\n/**\n * The LangWatch-specific global logger provider -- may differ from the\n * current OTel one; the last one `setupObservability` knows about.\n * @internal\n */\nlet currentLoggerProvider: LoggerProvider = NOOP_LOGGER_PROVIDER;\n\n/** Sets the global logger provider that {@link getLangWatchLogger} will use. */\nexport function setLangWatchLoggerProvider(loggerProvider: LoggerProvider): void {\n currentLoggerProvider = loggerProvider;\n}\n\n/**\n * @param name - The logger name (typically your service or module name).\n * @param version - Optional logger version.\n * @returns A {@link LangWatchLogger} instance, or a no-op logger if no provider was set.\n */\nexport function getLangWatchLogger(name: string, version?: string): LangWatchLogger {\n return getLangWatchLoggerFromProvider(currentLoggerProvider, name, version);\n}\n\n/**\n * @param loggerProvider - The OpenTelemetry logger provider to use.\n * @param name - The name of the logger.\n * @param version - Optional logger version.\n * @returns A {@link LangWatchLogger} instance.\n */\nexport function getLangWatchLoggerFromProvider(\n loggerProvider: LoggerProvider,\n name: string,\n version?: string,\n): LangWatchLogger {\n return createLangWatchLogger(loggerProvider.getLogger(name, version));\n}\n\n/**\n * Wraps an OpenTelemetry logger as a LangWatch logger.\n * @param logger - The OpenTelemetry logger to wrap.\n * @returns A {@link LangWatchLogger} instance.\n */\nexport function createLangWatchLogger(logger: Logger): LangWatchLogger {\n return new LangWatchLoggerInternal(logger);\n}\n\n// Export types and implementation\nexport * from \"./types\";\nexport * from \"./implementation\";\n","import { context } from \"@opentelemetry/api\";\nimport { type AnyValue, type Logger } from \"@opentelemetry/api-logs\";\n\nimport { shouldCaptureOutput } from \"../config\";\nimport * as intSemconv from \"../semconv\";\nimport { type SemConvLogRecordAttributes } from \"../semconv\";\nimport {\n type EmitOptions,\n type LangWatchLogger,\n type LangWatchLogRecord,\n type LangWatchSpanGenAIAssistantMessageEventBody,\n type LangWatchSpanGenAIChoiceEventBody,\n type LangWatchSpanGenAISystemMessageEventBody,\n type LangWatchSpanGenAIToolMessageEventBody,\n type LangWatchSpanGenAIUserMessageEventBody,\n} from \"./types\";\n\n/** Internal implementation of {@link LangWatchLogger}. Wraps OpenTelemetry\n * logger with LangWatch functionality. Use {@link getLangWatchLogger} instead. */\nexport class LangWatchLoggerInternal implements LangWatchLogger {\n constructor(private logger: Logger) {}\n\n // Delegates to the wrapped OTel logger rather than always returning `true`:\n // the underlying logger is what actually knows whether a processor is\n // registered, so this is what keeps `enabled()` truthful for a caller that\n // wraps a no-op provider (e.g. `getLangWatchLogger` before setup runs).\n enabled(options?: Parameters<Logger[\"enabled\"]>[0]): boolean {\n return this.logger.enabled(options);\n }\n\n emit(logRecord: LangWatchLogRecord, options?: EmitOptions): void {\n // Handle output capture configuration\n if (!shouldCaptureOutput()) {\n logRecord.body = void 0;\n }\n\n // Set context if not provided and not explicitly excluded\n if (!logRecord.context && !options?.excludeContext) {\n logRecord.context = context.active();\n }\n\n // Emit the log record through the underlying OpenTelemetry logger\n this.logger.emit(logRecord);\n }\n\n emitGenAISystemMessageEvent(\n body: LangWatchSpanGenAISystemMessageEventBody,\n system?: intSemconv.VAL_GEN_AI_SYSTEMS | (string & {}),\n attributes?: SemConvLogRecordAttributes,\n ): void {\n this.emitGenAIEvent(\n intSemconv.LOG_EVNT_GEN_AI_SYSTEM_MESSAGE,\n {\n ...body,\n role: body.role ?? \"system\",\n } satisfies LangWatchSpanGenAISystemMessageEventBody,\n {\n ...attributes,\n \"gen_ai.system\": system,\n },\n );\n }\n\n emitGenAIUserMessageEvent(\n body: LangWatchSpanGenAIUserMessageEventBody,\n system?: intSemconv.VAL_GEN_AI_SYSTEMS | (string & {}),\n attributes?: SemConvLogRecordAttributes,\n ) {\n this.emitGenAIEvent(\n intSemconv.LOG_EVNT_GEN_AI_USER_MESSAGE,\n {\n ...body,\n role: body.role ?? \"user\",\n } satisfies LangWatchSpanGenAIUserMessageEventBody,\n {\n ...attributes,\n \"gen_ai.system\": system,\n },\n );\n }\n\n emitGenAIAssistantMessageEvent(\n body: LangWatchSpanGenAIAssistantMessageEventBody,\n system?: intSemconv.VAL_GEN_AI_SYSTEMS | (string & {}),\n attributes?: SemConvLogRecordAttributes,\n ) {\n this.emitGenAIEvent(\n intSemconv.LOG_EVNT_GEN_AI_ASSISTANT_MESSAGE,\n {\n ...body,\n role: body.role ?? \"assistant\",\n } satisfies LangWatchSpanGenAIAssistantMessageEventBody,\n {\n ...attributes,\n \"gen_ai.system\": system,\n },\n );\n }\n\n emitGenAIToolMessageEvent(\n body: LangWatchSpanGenAIToolMessageEventBody,\n system?: intSemconv.VAL_GEN_AI_SYSTEMS | (string & {}),\n attributes?: SemConvLogRecordAttributes,\n ) {\n if (body.role === void 0) {\n body.role = \"tool\";\n }\n\n this.emitGenAIEvent(\n intSemconv.LOG_EVNT_GEN_AI_TOOL_MESSAGE,\n { ...body },\n {\n ...attributes,\n \"gen_ai.system\": system,\n },\n );\n }\n\n emitGenAIChoiceEvent(\n body: LangWatchSpanGenAIChoiceEventBody,\n system?: intSemconv.VAL_GEN_AI_SYSTEMS | (string & {}),\n attributes?: SemConvLogRecordAttributes,\n ) {\n if (body.message && body.message.role === void 0) {\n body.message.role = \"assistant\";\n }\n\n this.emitGenAIEvent(\n intSemconv.LOG_EVNT_GEN_AI_CHOICE,\n {\n ...body,\n message: { ...body.message, role: body.message?.role ?? \"assistant\" },\n } satisfies LangWatchSpanGenAIChoiceEventBody,\n {\n ...attributes,\n \"gen_ai.system\": system,\n },\n );\n }\n\n private emitGenAIEvent(\n eventName: string,\n body: AnyValue,\n attributes?: SemConvLogRecordAttributes,\n ): void {\n this.emit({\n eventName,\n context: context.active(),\n attributes: { ...attributes },\n body: shouldCaptureOutput() ? body : void 0,\n observedTimestamp: new Date().getTime(),\n });\n }\n}\n"]}