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.
- package/README.md +27 -13
- package/dist/agent/index.d.mts +122 -79
- package/dist/agent/index.d.ts +122 -79
- package/dist/agent/index.js +541 -301
- package/dist/agent/index.js.map +1 -1
- package/dist/agent/index.mjs +540 -302
- package/dist/agent/index.mjs.map +1 -1
- package/dist/{chunk-NPEK4RSD.mjs → chunk-2GKEMCKT.mjs} +7757 -2409
- package/dist/chunk-2GKEMCKT.mjs.map +1 -0
- package/dist/chunk-5VYEG3RS.js +117 -0
- package/dist/chunk-5VYEG3RS.js.map +1 -0
- package/dist/chunk-AYPQNLCC.mjs +852 -0
- package/dist/chunk-AYPQNLCC.mjs.map +1 -0
- package/dist/chunk-BL3GHEKF.js +59 -0
- package/dist/chunk-BL3GHEKF.js.map +1 -0
- package/dist/chunk-C7IWJ2GJ.mjs +59 -0
- package/dist/chunk-C7IWJ2GJ.mjs.map +1 -0
- package/dist/chunk-DLZCOUXC.js +852 -0
- package/dist/chunk-DLZCOUXC.js.map +1 -0
- package/dist/{chunk-O4J3ZPZY.js → chunk-F7BVJW3S.js} +7912 -2564
- package/dist/chunk-F7BVJW3S.js.map +1 -0
- package/dist/{chunk-SY5HSL5G.mjs → chunk-M3DSPR5S.mjs} +124 -112
- package/dist/chunk-M3DSPR5S.mjs.map +1 -0
- package/dist/{chunk-CSV7B7B5.js → chunk-MAO3SIBB.js} +141 -129
- package/dist/chunk-MAO3SIBB.js.map +1 -0
- package/dist/{chunk-LCG5Y2EG.js → chunk-N76BG37W.js} +15 -101
- package/dist/chunk-N76BG37W.js.map +1 -0
- package/dist/chunk-SERULD4Z.mjs +117 -0
- package/dist/chunk-SERULD4Z.mjs.map +1 -0
- package/dist/{chunk-73QOHSHU.js → chunk-WDUUAIG3.js} +2 -2
- package/dist/chunk-WDUUAIG3.js.map +1 -0
- package/dist/{chunk-WMDQVWA6.mjs → chunk-WSGVZ3J2.mjs} +22 -108
- package/dist/chunk-WSGVZ3J2.mjs.map +1 -0
- package/dist/{chunk-57L2K66L.mjs → chunk-XQ4CP2JK.mjs} +2 -2
- package/dist/chunk-XQ4CP2JK.mjs.map +1 -0
- package/dist/cli/bundle.js +853 -552
- package/dist/implementation-BXVPzwOt.d.mts +261 -0
- package/dist/implementation-DJ-JveZl.d.ts +261 -0
- package/dist/index.d.mts +479 -1130
- package/dist/index.d.ts +479 -1130
- package/dist/index.js +7908 -3525
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +7883 -3500
- package/dist/index.mjs.map +1 -1
- package/dist/observability-sdk/index.d.mts +16 -76
- package/dist/observability-sdk/index.d.ts +16 -76
- package/dist/observability-sdk/index.js +8 -5
- package/dist/observability-sdk/index.js.map +1 -1
- package/dist/observability-sdk/index.mjs +13 -10
- package/dist/observability-sdk/instrumentation/langchain/index.d.mts +3 -5
- package/dist/observability-sdk/instrumentation/langchain/index.d.ts +3 -5
- package/dist/observability-sdk/instrumentation/langchain/index.js +160 -112
- package/dist/observability-sdk/instrumentation/langchain/index.js.map +1 -1
- package/dist/observability-sdk/instrumentation/langchain/index.mjs +148 -100
- package/dist/observability-sdk/instrumentation/langchain/index.mjs.map +1 -1
- package/dist/observability-sdk/semconv/index.d.mts +37 -0
- package/dist/observability-sdk/semconv/index.d.ts +37 -0
- package/dist/observability-sdk/semconv/index.js +121 -0
- package/dist/observability-sdk/semconv/index.js.map +1 -0
- package/dist/observability-sdk/semconv/index.mjs +121 -0
- package/dist/observability-sdk/semconv/index.mjs.map +1 -0
- package/dist/observability-sdk/setup/node/index.d.mts +73 -313
- package/dist/observability-sdk/setup/node/index.d.ts +73 -313
- package/dist/observability-sdk/setup/node/index.js +6 -4
- package/dist/observability-sdk/setup/node/index.js.map +1 -1
- package/dist/observability-sdk/setup/node/index.mjs +5 -3
- package/dist/types--ExXvd26.d.mts +16583 -0
- package/dist/{types-VOZv9LYO.d.ts → types-CoS5PmeU.d.mts} +22 -59
- package/dist/{types-VOZv9LYO.d.mts → types-CoS5PmeU.d.ts} +22 -59
- package/dist/types-CpT3iEIj.d.ts +16583 -0
- package/dist/{types-DLfhJb38.d.mts → types-RkiBQZ9j.d.mts} +1 -6
- package/dist/{types-DLfhJb38.d.ts → types-RkiBQZ9j.d.ts} +1 -6
- package/dist/values-1yj9l0Sa.d.mts +112 -0
- package/dist/values-1yj9l0Sa.d.ts +112 -0
- package/package.json +94 -64
- package/dist/chunk-57L2K66L.mjs.map +0 -1
- package/dist/chunk-73QOHSHU.js.map +0 -1
- package/dist/chunk-CSV7B7B5.js.map +0 -1
- package/dist/chunk-LCG5Y2EG.js.map +0 -1
- package/dist/chunk-NPEK4RSD.mjs.map +0 -1
- package/dist/chunk-O4J3ZPZY.js.map +0 -1
- package/dist/chunk-PIYOJF6V.mjs +0 -566
- package/dist/chunk-PIYOJF6V.mjs.map +0 -1
- package/dist/chunk-SY5HSL5G.mjs.map +0 -1
- package/dist/chunk-WGLVIV4J.js +0 -566
- package/dist/chunk-WGLVIV4J.js.map +0 -1
- package/dist/chunk-WMDQVWA6.mjs.map +0 -1
- package/dist/implementation-CeTvnq6e.d.mts +0 -716
- package/dist/implementation-CsQrexpY.d.ts +0 -716
- package/dist/types-ofe1fAYQ.d.mts +0 -38143
- package/dist/types-wuYJPoFb.d.ts +0 -38143
|
@@ -1,14 +1,57 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
LOG_EVNT_GEN_AI_ASSISTANT_MESSAGE,
|
|
3
|
+
LOG_EVNT_GEN_AI_CHOICE,
|
|
4
|
+
LOG_EVNT_GEN_AI_SYSTEM_MESSAGE,
|
|
5
|
+
LOG_EVNT_GEN_AI_TOOL_MESSAGE,
|
|
6
|
+
LOG_EVNT_GEN_AI_USER_MESSAGE
|
|
7
|
+
} from "./chunk-C7IWJ2GJ.mjs";
|
|
8
|
+
import {
|
|
4
9
|
shouldCaptureOutput
|
|
5
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-SERULD4Z.mjs";
|
|
11
|
+
import {
|
|
12
|
+
__spreadProps,
|
|
13
|
+
__spreadValues
|
|
14
|
+
} from "./chunk-WSGVZ3J2.mjs";
|
|
6
15
|
|
|
7
16
|
// src/observability-sdk/exporters/langwatch-trace-exporter.ts
|
|
8
|
-
import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-
|
|
17
|
+
import { OTLPTraceExporter } from "@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 = "
|
|
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(
|
|
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 (
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
if (
|
|
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/
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
var
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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
|
+
import { CompressionAlgorithm } from "@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 : 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
|
|
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
223
|
var LangWatchTraceExporter = class extends 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
|
-
*/
|
|
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 : "";
|
|
@@ -218,7 +236,8 @@ var LangWatchTraceExporter = class extends OTLPTraceExporter {
|
|
|
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 OTLPTraceExporter {
|
|
|
235
254
|
};
|
|
236
255
|
|
|
237
256
|
// src/observability-sdk/exporters/langwatch-logs-exporter.ts
|
|
238
|
-
import { OTLPLogExporter } from "@opentelemetry/exporter-logs-otlp-
|
|
257
|
+
import { OTLPLogExporter } from "@opentelemetry/exporter-logs-otlp-proto";
|
|
239
258
|
var LangWatchLogsExporter = class extends 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
|
-
*/
|
|
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 : "";
|
|
@@ -259,18 +270,12 @@ var LangWatchLogsExporter = class extends OTLPLogExporter {
|
|
|
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
|
import {
|
|
276
281
|
createNoopLogger
|
|
@@ -302,7 +307,9 @@ var LangWatchLoggerInternal = class {
|
|
|
302
307
|
var _a;
|
|
303
308
|
this.emitGenAIEvent(
|
|
304
309
|
LOG_EVNT_GEN_AI_SYSTEM_MESSAGE,
|
|
305
|
-
__spreadProps(__spreadValues({}, body), {
|
|
310
|
+
__spreadProps(__spreadValues({}, body), {
|
|
311
|
+
role: (_a = body.role) != null ? _a : "system"
|
|
312
|
+
}),
|
|
306
313
|
__spreadProps(__spreadValues({}, attributes), {
|
|
307
314
|
"gen_ai.system": system
|
|
308
315
|
})
|
|
@@ -312,7 +319,9 @@ var LangWatchLoggerInternal = class {
|
|
|
312
319
|
var _a;
|
|
313
320
|
this.emitGenAIEvent(
|
|
314
321
|
LOG_EVNT_GEN_AI_USER_MESSAGE,
|
|
315
|
-
__spreadProps(__spreadValues({}, body), {
|
|
322
|
+
__spreadProps(__spreadValues({}, body), {
|
|
323
|
+
role: (_a = body.role) != null ? _a : "user"
|
|
324
|
+
}),
|
|
316
325
|
__spreadProps(__spreadValues({}, attributes), {
|
|
317
326
|
"gen_ai.system": system
|
|
318
327
|
})
|
|
@@ -322,7 +331,9 @@ var LangWatchLoggerInternal = class {
|
|
|
322
331
|
var _a;
|
|
323
332
|
this.emitGenAIEvent(
|
|
324
333
|
LOG_EVNT_GEN_AI_ASSISTANT_MESSAGE,
|
|
325
|
-
__spreadProps(__spreadValues({}, body), {
|
|
334
|
+
__spreadProps(__spreadValues({}, body), {
|
|
335
|
+
role: (_a = body.role) != null ? _a : "assistant"
|
|
336
|
+
}),
|
|
326
337
|
__spreadProps(__spreadValues({}, attributes), {
|
|
327
338
|
"gen_ai.system": system
|
|
328
339
|
})
|
|
@@ -385,19 +396,20 @@ function createLangWatchLogger(logger) {
|
|
|
385
396
|
}
|
|
386
397
|
|
|
387
398
|
export {
|
|
388
|
-
|
|
399
|
+
buildAuthHeaders,
|
|
389
400
|
LANGWATCH_SDK_RUNTIME,
|
|
390
401
|
LANGWATCH_SDK_NAME_OBSERVABILITY,
|
|
391
402
|
LANGWATCH_SDK_NAME_CLIENT,
|
|
392
403
|
LANGWATCH_SDK_LANGUAGE,
|
|
393
404
|
LANGWATCH_SDK_VERSION,
|
|
405
|
+
API_VERSION_HEADER,
|
|
406
|
+
LANGWATCH_API_VERSION,
|
|
394
407
|
DEFAULT_ENDPOINT,
|
|
395
408
|
DEFAULT_SERVICE_NAME,
|
|
396
|
-
buildAuthHeaders,
|
|
397
409
|
LangWatchTraceExporter,
|
|
398
410
|
LangWatchLogsExporter,
|
|
399
411
|
setLangWatchLoggerProvider,
|
|
400
412
|
getLangWatchLogger,
|
|
401
413
|
getLangWatchLoggerFromProvider
|
|
402
414
|
};
|
|
403
|
-
//# sourceMappingURL=chunk-
|
|
415
|
+
//# sourceMappingURL=chunk-M3DSPR5S.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../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"],"sourcesContent":["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"],"mappings":"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","names":["_a","version"]}
|