langwatch 1.9.0 → 1.10.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/dist/{chunk-A52LX4C4.mjs → chunk-6QIASJKJ.mjs} +2 -2
- package/dist/{chunk-4XQHESU7.mjs → chunk-LFUK5LSB.mjs} +2 -2
- package/dist/chunk-LFUK5LSB.mjs.map +1 -0
- package/dist/{chunk-HUMHSRVP.js → chunk-ODURZH6D.js} +12 -12
- package/dist/{chunk-HUMHSRVP.js.map → chunk-ODURZH6D.js.map} +1 -1
- package/dist/{chunk-NFFB3DWW.js → chunk-ZG2F6QBC.js} +2 -2
- package/dist/chunk-ZG2F6QBC.js.map +1 -0
- package/dist/cli/bundle.js +217 -212
- package/dist/index.js +33 -33
- package/dist/index.mjs +2 -2
- package/dist/observability-sdk/index.js +2 -2
- package/dist/observability-sdk/index.mjs +1 -1
- package/dist/observability-sdk/setup/node/index.js +3 -3
- package/dist/observability-sdk/setup/node/index.mjs +2 -2
- package/package.json +1 -1
- package/dist/chunk-4XQHESU7.mjs.map +0 -1
- package/dist/chunk-NFFB3DWW.js.map +0 -1
- /package/dist/{chunk-A52LX4C4.mjs.map → chunk-6QIASJKJ.mjs.map} +0 -0
package/dist/index.js
CHANGED
|
@@ -9,7 +9,7 @@ var _chunk4ERRCKOHjs = require('./chunk-4ERRCKOH.js');
|
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
|
|
12
|
-
var
|
|
12
|
+
var _chunkODURZH6Djs = require('./chunk-ODURZH6D.js');
|
|
13
13
|
|
|
14
14
|
|
|
15
15
|
|
|
@@ -20,7 +20,7 @@ var _chunkHUMHSRVPjs = require('./chunk-HUMHSRVP.js');
|
|
|
20
20
|
|
|
21
21
|
|
|
22
22
|
|
|
23
|
-
var
|
|
23
|
+
var _chunkZG2F6QBCjs = require('./chunk-ZG2F6QBC.js');
|
|
24
24
|
|
|
25
25
|
|
|
26
26
|
|
|
@@ -329,7 +329,7 @@ var PromptServiceTracingDecorator = class {
|
|
|
329
329
|
};
|
|
330
330
|
|
|
331
331
|
// src/client-sdk/services/prompts/tracing/tracer.ts
|
|
332
|
-
var tracer = _chunk4ERRCKOHjs.getLangWatchTracer.call(void 0, `${
|
|
332
|
+
var tracer = _chunk4ERRCKOHjs.getLangWatchTracer.call(void 0, `${_chunkZG2F6QBCjs.LANGWATCH_SDK_NAME_CLIENT}.prompts`, _chunkZG2F6QBCjs.LANGWATCH_SDK_VERSION);
|
|
333
333
|
|
|
334
334
|
// src/client-sdk/tracing/create-tracing-proxy.ts
|
|
335
335
|
var _api = require('@opentelemetry/api');
|
|
@@ -676,14 +676,14 @@ var handledErrorMiddleware = {
|
|
|
676
676
|
};
|
|
677
677
|
var createLangWatchApiClient = (apiKey = ((_b) => (_b = ((_a) => (_a = scopedApiKey()) != null ? _a : process.env.LANGWATCH_API_KEY)()) != null ? _b : "")(), endpoint, projectId = ((_c) => (_c = scopedProjectId()) != null ? _c : process.env.LANGWATCH_PROJECT_ID)()) => {
|
|
678
678
|
const client = _openapifetch2.default.call(void 0, {
|
|
679
|
-
baseUrl:
|
|
680
|
-
headers: _chunkLCG5Y2EGjs.__spreadProps.call(void 0, _chunkLCG5Y2EGjs.__spreadValues.call(void 0, {},
|
|
679
|
+
baseUrl: _chunkODURZH6Djs.resolveEndpoint.call(void 0, endpoint),
|
|
680
|
+
headers: _chunkLCG5Y2EGjs.__spreadProps.call(void 0, _chunkLCG5Y2EGjs.__spreadValues.call(void 0, {}, _chunkZG2F6QBCjs.buildAuthHeaders.call(void 0, { apiKey, projectId })), {
|
|
681
681
|
"content-type": "application/json",
|
|
682
|
-
"user-agent": `langwatch-sdk-node/${
|
|
683
|
-
"x-langwatch-sdk-name":
|
|
684
|
-
"x-langwatch-sdk-language":
|
|
685
|
-
"x-langwatch-sdk-version":
|
|
686
|
-
"x-langwatch-sdk-platform":
|
|
682
|
+
"user-agent": `langwatch-sdk-node/${_chunkZG2F6QBCjs.version}`,
|
|
683
|
+
"x-langwatch-sdk-name": _chunkZG2F6QBCjs.LANGWATCH_SDK_NAME_OBSERVABILITY,
|
|
684
|
+
"x-langwatch-sdk-language": _chunkZG2F6QBCjs.LANGWATCH_SDK_LANGUAGE,
|
|
685
|
+
"x-langwatch-sdk-version": _chunkZG2F6QBCjs.LANGWATCH_SDK_VERSION,
|
|
686
|
+
"x-langwatch-sdk-platform": _chunkZG2F6QBCjs.LANGWATCH_SDK_RUNTIME.call(void 0, )
|
|
687
687
|
})
|
|
688
688
|
});
|
|
689
689
|
client.use(handledErrorMiddleware);
|
|
@@ -1960,12 +1960,12 @@ var DatasetPlanLimitError = class extends DatasetError {
|
|
|
1960
1960
|
};
|
|
1961
1961
|
|
|
1962
1962
|
// src/client-sdk/services/datasets/tracing/tracer.ts
|
|
1963
|
-
var tracer2 = _chunk4ERRCKOHjs.getLangWatchTracer.call(void 0, `${
|
|
1963
|
+
var tracer2 = _chunk4ERRCKOHjs.getLangWatchTracer.call(void 0, `${_chunkZG2F6QBCjs.LANGWATCH_SDK_NAME_CLIENT}.datasets`, _chunkZG2F6QBCjs.LANGWATCH_SDK_VERSION);
|
|
1964
1964
|
|
|
1965
1965
|
// src/client-sdk/services/datasets/dataset.service.ts
|
|
1966
1966
|
var DatasetService = class {
|
|
1967
1967
|
constructor(config) {
|
|
1968
|
-
this.config = _chunkLCG5Y2EGjs.__spreadProps.call(void 0, _chunkLCG5Y2EGjs.__spreadValues.call(void 0, {}, config), { endpoint:
|
|
1968
|
+
this.config = _chunkLCG5Y2EGjs.__spreadProps.call(void 0, _chunkLCG5Y2EGjs.__spreadValues.call(void 0, {}, config), { endpoint: _chunkODURZH6Djs.resolveEndpoint.call(void 0, config.endpoint) });
|
|
1969
1969
|
return createTracingProxy(this, tracer2);
|
|
1970
1970
|
}
|
|
1971
1971
|
/**
|
|
@@ -2246,7 +2246,7 @@ var DatasetService = class {
|
|
|
2246
2246
|
const url = `${endpoint}${path2}`;
|
|
2247
2247
|
const response = await fetch(url, {
|
|
2248
2248
|
method: "POST",
|
|
2249
|
-
headers:
|
|
2249
|
+
headers: _chunkZG2F6QBCjs.buildAuthHeaders.call(void 0, { apiKey }),
|
|
2250
2250
|
body: formData
|
|
2251
2251
|
});
|
|
2252
2252
|
if (!response.ok) {
|
|
@@ -2945,7 +2945,7 @@ var Experiment = class _Experiment {
|
|
|
2945
2945
|
this.experimentSlug = name;
|
|
2946
2946
|
this.runId = (_a = options.runId) != null ? _a : generateHumanReadableId();
|
|
2947
2947
|
this.apiClient = options.apiClient;
|
|
2948
|
-
this.endpoint =
|
|
2948
|
+
this.endpoint = _chunkODURZH6Djs.resolveEndpoint.call(void 0, options.endpoint);
|
|
2949
2949
|
this.apiKey = options.apiKey;
|
|
2950
2950
|
this.logger = options.logger;
|
|
2951
2951
|
this.concurrency = (_b = options.concurrency) != null ? _b : DEFAULT_CONCURRENCY;
|
|
@@ -2955,7 +2955,7 @@ var Experiment = class _Experiment {
|
|
|
2955
2955
|
* Initialize an evaluation session
|
|
2956
2956
|
*/
|
|
2957
2957
|
static async init(name, options) {
|
|
2958
|
-
|
|
2958
|
+
_chunkODURZH6Djs.ensureSetup.call(void 0, );
|
|
2959
2959
|
const experiment = new _Experiment(name, options);
|
|
2960
2960
|
await experiment.initialize();
|
|
2961
2961
|
return experiment;
|
|
@@ -2974,7 +2974,7 @@ var Experiment = class _Experiment {
|
|
|
2974
2974
|
method: "POST",
|
|
2975
2975
|
headers: _chunkLCG5Y2EGjs.__spreadValues.call(void 0, {
|
|
2976
2976
|
"Content-Type": "application/json"
|
|
2977
|
-
},
|
|
2977
|
+
}, _chunkZG2F6QBCjs.buildAuthHeaders.call(void 0, { apiKey: this.apiKey })),
|
|
2978
2978
|
body: JSON.stringify({
|
|
2979
2979
|
experiment_name: this.name,
|
|
2980
2980
|
experiment_slug: this.experimentSlug,
|
|
@@ -3330,7 +3330,7 @@ var Experiment = class _Experiment {
|
|
|
3330
3330
|
method: "POST",
|
|
3331
3331
|
headers: _chunkLCG5Y2EGjs.__spreadValues.call(void 0, {
|
|
3332
3332
|
"Content-Type": "application/json"
|
|
3333
|
-
},
|
|
3333
|
+
}, _chunkZG2F6QBCjs.buildAuthHeaders.call(void 0, { apiKey: this.apiKey })),
|
|
3334
3334
|
body: JSON.stringify({
|
|
3335
3335
|
trace_id: traceId != null ? traceId : null,
|
|
3336
3336
|
span_id: spanId != null ? spanId : null,
|
|
@@ -3867,7 +3867,7 @@ var Experiment = class _Experiment {
|
|
|
3867
3867
|
method: "POST",
|
|
3868
3868
|
headers: _chunkLCG5Y2EGjs.__spreadValues.call(void 0, {
|
|
3869
3869
|
"Content-Type": "application/json"
|
|
3870
|
-
},
|
|
3870
|
+
}, _chunkZG2F6QBCjs.buildAuthHeaders.call(void 0, { apiKey: this.apiKey })),
|
|
3871
3871
|
body: JSON.stringify(body)
|
|
3872
3872
|
}).then((response) => {
|
|
3873
3873
|
if (!response.ok) {
|
|
@@ -4855,7 +4855,7 @@ var EvaluationsFacade = class {
|
|
|
4855
4855
|
method: "POST",
|
|
4856
4856
|
headers: _chunkLCG5Y2EGjs.__spreadValues.call(void 0, {
|
|
4857
4857
|
"Content-Type": "application/json"
|
|
4858
|
-
},
|
|
4858
|
+
}, _chunkZG2F6QBCjs.buildAuthHeaders.call(void 0, { apiKey: _chunkLCG5Y2EGjs.__privateGet.call(void 0, this, _apiKey) })),
|
|
4859
4859
|
body: JSON.stringify(requestBody)
|
|
4860
4860
|
});
|
|
4861
4861
|
if (!response.ok) {
|
|
@@ -5165,7 +5165,7 @@ var WorkflowsApiError = class extends Error {
|
|
|
5165
5165
|
var WorkflowsApiService = class {
|
|
5166
5166
|
constructor(config) {
|
|
5167
5167
|
var _a;
|
|
5168
|
-
this.endpoint =
|
|
5168
|
+
this.endpoint = _chunkODURZH6Djs.resolveEndpoint.call(void 0, config == null ? void 0 : config.endpoint);
|
|
5169
5169
|
this.apiClient = (_a = config == null ? void 0 : config.langwatchApiClient) != null ? _a : createLangWatchApiClient(void 0, this.endpoint);
|
|
5170
5170
|
this.experimentsApiService = new ExperimentsApiService({
|
|
5171
5171
|
langwatchApiClient: this.apiClient
|
|
@@ -5725,12 +5725,12 @@ var MonitorsApiService = class {
|
|
|
5725
5725
|
constructor(config) {
|
|
5726
5726
|
var _a, _b, _c;
|
|
5727
5727
|
this.apiKey = (_c = (_b = (_a = config == null ? void 0 : config.apiKey) != null ? _a : scopedApiKey()) != null ? _b : process.env.LANGWATCH_API_KEY) != null ? _c : "";
|
|
5728
|
-
this.endpoint =
|
|
5728
|
+
this.endpoint = _chunkODURZH6Djs.resolveEndpoint.call(void 0, config == null ? void 0 : config.endpoint);
|
|
5729
5729
|
}
|
|
5730
5730
|
async request(path2, options) {
|
|
5731
5731
|
var _a, _b;
|
|
5732
5732
|
const response = await fetch(`${this.endpoint}${path2}`, _chunkLCG5Y2EGjs.__spreadProps.call(void 0, _chunkLCG5Y2EGjs.__spreadValues.call(void 0, {}, options), {
|
|
5733
|
-
headers: _chunkLCG5Y2EGjs.__spreadValues.call(void 0, _chunkLCG5Y2EGjs.__spreadProps.call(void 0, _chunkLCG5Y2EGjs.__spreadValues.call(void 0, {},
|
|
5733
|
+
headers: _chunkLCG5Y2EGjs.__spreadValues.call(void 0, _chunkLCG5Y2EGjs.__spreadProps.call(void 0, _chunkLCG5Y2EGjs.__spreadValues.call(void 0, {}, _chunkZG2F6QBCjs.buildAuthHeaders.call(void 0, { apiKey: this.apiKey })), {
|
|
5734
5734
|
"Content-Type": "application/json"
|
|
5735
5735
|
}), options == null ? void 0 : options.headers)
|
|
5736
5736
|
}));
|
|
@@ -5800,12 +5800,12 @@ var SecretsApiService = class {
|
|
|
5800
5800
|
constructor(config) {
|
|
5801
5801
|
var _a, _b, _c;
|
|
5802
5802
|
this.apiKey = (_c = (_b = (_a = config == null ? void 0 : config.apiKey) != null ? _a : scopedApiKey()) != null ? _b : process.env.LANGWATCH_API_KEY) != null ? _c : "";
|
|
5803
|
-
this.endpoint =
|
|
5803
|
+
this.endpoint = _chunkODURZH6Djs.resolveEndpoint.call(void 0, config == null ? void 0 : config.endpoint);
|
|
5804
5804
|
}
|
|
5805
5805
|
async request(path2, options) {
|
|
5806
5806
|
var _a, _b;
|
|
5807
5807
|
const response = await fetch(`${this.endpoint}${path2}`, _chunkLCG5Y2EGjs.__spreadProps.call(void 0, _chunkLCG5Y2EGjs.__spreadValues.call(void 0, {}, options), {
|
|
5808
|
-
headers: _chunkLCG5Y2EGjs.__spreadValues.call(void 0, _chunkLCG5Y2EGjs.__spreadProps.call(void 0, _chunkLCG5Y2EGjs.__spreadValues.call(void 0, {},
|
|
5808
|
+
headers: _chunkLCG5Y2EGjs.__spreadValues.call(void 0, _chunkLCG5Y2EGjs.__spreadProps.call(void 0, _chunkLCG5Y2EGjs.__spreadValues.call(void 0, {}, _chunkZG2F6QBCjs.buildAuthHeaders.call(void 0, { apiKey: this.apiKey })), {
|
|
5809
5809
|
"Content-Type": "application/json"
|
|
5810
5810
|
}), options == null ? void 0 : options.headers)
|
|
5811
5811
|
}));
|
|
@@ -5935,7 +5935,7 @@ var VirtualKeysApiError = class extends Error {
|
|
|
5935
5935
|
var VirtualKeysApiService = class {
|
|
5936
5936
|
constructor(config) {
|
|
5937
5937
|
var _a, _b, _c, _d;
|
|
5938
|
-
this.endpoint =
|
|
5938
|
+
this.endpoint = _chunkODURZH6Djs.resolveEndpoint.call(void 0, config == null ? void 0 : config.endpoint);
|
|
5939
5939
|
this.apiKey = (_c = (_b = (_a = config == null ? void 0 : config.apiKey) != null ? _a : scopedApiKey()) != null ? _b : process.env.LANGWATCH_API_KEY) != null ? _c : "";
|
|
5940
5940
|
this.projectId = (_d = config == null ? void 0 : config.projectId) != null ? _d : process.env.LANGWATCH_PROJECT_ID;
|
|
5941
5941
|
}
|
|
@@ -6163,7 +6163,7 @@ var GatewayBudgetsApiError = class extends Error {
|
|
|
6163
6163
|
var GatewayBudgetsApiService = class {
|
|
6164
6164
|
constructor(config) {
|
|
6165
6165
|
var _a, _b, _c, _d;
|
|
6166
|
-
this.endpoint =
|
|
6166
|
+
this.endpoint = _chunkODURZH6Djs.resolveEndpoint.call(void 0, config == null ? void 0 : config.endpoint);
|
|
6167
6167
|
this.apiKey = (_c = (_b = (_a = config == null ? void 0 : config.apiKey) != null ? _a : scopedApiKey()) != null ? _b : process.env.LANGWATCH_API_KEY) != null ? _c : "";
|
|
6168
6168
|
this.projectId = (_d = config == null ? void 0 : config.projectId) != null ? _d : process.env.LANGWATCH_PROJECT_ID;
|
|
6169
6169
|
}
|
|
@@ -6422,7 +6422,7 @@ var SpendEventsApiError = class extends Error {
|
|
|
6422
6422
|
var SpendEventsApiService = class {
|
|
6423
6423
|
constructor(config) {
|
|
6424
6424
|
var _a, _b, _c;
|
|
6425
|
-
this.endpoint =
|
|
6425
|
+
this.endpoint = _chunkODURZH6Djs.resolveEndpoint.call(void 0, config == null ? void 0 : config.endpoint);
|
|
6426
6426
|
this.apiKey = (_c = (_b = (_a = config == null ? void 0 : config.apiKey) != null ? _a : scopedApiKey()) != null ? _b : process.env.LANGWATCH_API_KEY) != null ? _c : "";
|
|
6427
6427
|
}
|
|
6428
6428
|
async request(operation, path2, init) {
|
|
@@ -6639,7 +6639,7 @@ var WebhooksApiError = class extends Error {
|
|
|
6639
6639
|
var WebhooksApiService = class {
|
|
6640
6640
|
constructor(config) {
|
|
6641
6641
|
var _a, _b, _c;
|
|
6642
|
-
this.endpoint =
|
|
6642
|
+
this.endpoint = _chunkODURZH6Djs.resolveEndpoint.call(void 0, config == null ? void 0 : config.endpoint);
|
|
6643
6643
|
this.apiKey = (_c = (_b = (_a = config == null ? void 0 : config.apiKey) != null ? _a : scopedApiKey()) != null ? _b : process.env.LANGWATCH_API_KEY) != null ? _c : "";
|
|
6644
6644
|
}
|
|
6645
6645
|
async request(operation, path2, init) {
|
|
@@ -6976,7 +6976,7 @@ var TeamsApiService = class {
|
|
|
6976
6976
|
constructor(config) {
|
|
6977
6977
|
_chunkLCG5Y2EGjs.__privateAdd.call(void 0, this, _request);
|
|
6978
6978
|
_chunkLCG5Y2EGjs.__privateSet.call(void 0, this, _request, createManagementRequest({
|
|
6979
|
-
endpoint:
|
|
6979
|
+
endpoint: _chunkODURZH6Djs.resolveEndpoint.call(void 0, config == null ? void 0 : config.endpoint),
|
|
6980
6980
|
token: resolveManagementToken({ apiKey: config == null ? void 0 : config.apiKey }),
|
|
6981
6981
|
errorFactory: ({ message, operation, body }) => new TeamsApiError(message, operation, body)
|
|
6982
6982
|
}));
|
|
@@ -7063,7 +7063,7 @@ var ProjectsApiError = class extends Error {
|
|
|
7063
7063
|
var ProjectsApiService = class {
|
|
7064
7064
|
constructor(config) {
|
|
7065
7065
|
var _a, _b, _c;
|
|
7066
|
-
this.endpoint =
|
|
7066
|
+
this.endpoint = _chunkODURZH6Djs.resolveEndpoint.call(void 0, config == null ? void 0 : config.endpoint);
|
|
7067
7067
|
this.apiKey = (_c = (_b = (_a = config == null ? void 0 : config.apiKey) != null ? _a : scopedApiKey()) != null ? _b : process.env.LANGWATCH_API_KEY) != null ? _c : "";
|
|
7068
7068
|
}
|
|
7069
7069
|
/**
|
|
@@ -7161,7 +7161,7 @@ var TracesError = class extends Error {
|
|
|
7161
7161
|
};
|
|
7162
7162
|
|
|
7163
7163
|
// src/client-sdk/services/traces/tracing/tracer.ts
|
|
7164
|
-
var tracer3 = _chunk4ERRCKOHjs.getLangWatchTracer.call(void 0, `${
|
|
7164
|
+
var tracer3 = _chunk4ERRCKOHjs.getLangWatchTracer.call(void 0, `${_chunkZG2F6QBCjs.LANGWATCH_SDK_NAME_CLIENT}.traces`, _chunkZG2F6QBCjs.LANGWATCH_SDK_VERSION);
|
|
7165
7165
|
|
|
7166
7166
|
// src/client-sdk/services/traces/service.ts
|
|
7167
7167
|
var TracesService = class {
|
|
@@ -7233,7 +7233,7 @@ var LangWatch = class {
|
|
|
7233
7233
|
_chunkLCG5Y2EGjs.__privateAdd.call(void 0, this, _projects);
|
|
7234
7234
|
var _a, _b, _c;
|
|
7235
7235
|
const apiKey = (_c = (_b = (_a = options.apiKey) != null ? _a : scopedApiKey()) != null ? _b : process.env.LANGWATCH_API_KEY) != null ? _c : "";
|
|
7236
|
-
const endpoint =
|
|
7236
|
+
const endpoint = _chunkODURZH6Djs.resolveEndpoint.call(void 0, options.endpoint);
|
|
7237
7237
|
this.config = _chunkLCG5Y2EGjs.__privateMethod.call(void 0, this, _LangWatch_instances, createInternalConfig_fn).call(this, {
|
|
7238
7238
|
apiKey,
|
|
7239
7239
|
endpoint,
|
|
@@ -7473,5 +7473,5 @@ var logger = {
|
|
|
7473
7473
|
|
|
7474
7474
|
|
|
7475
7475
|
|
|
7476
|
-
exports.ComparisonError = ComparisonError; exports.DatasetApiError = DatasetApiError; exports.DatasetError = DatasetError; exports.DatasetNotFoundError = DatasetNotFoundError; exports.DatasetPlanLimitError = DatasetPlanLimitError; exports.DatasetValidationError = DatasetValidationError; exports.DatasetsFacade = DatasetsFacade; exports.EvaluationError = EvaluationError; exports.EvaluationsApiError = EvaluationsApiError; exports.EvaluationsFacade = EvaluationsFacade; exports.EvaluatorCallError = EvaluatorCallError; exports.EvaluatorError = EvaluatorError; exports.EvaluatorNotFoundError = EvaluatorNotFoundError; exports.EvaluatorsApiError = EvaluatorsApiError; exports.EvaluatorsApiService = EvaluatorsApiService; exports.Experiment = Experiment; exports.ExperimentApiError = ExperimentApiError; exports.ExperimentError = ExperimentError; exports.ExperimentInitError = ExperimentInitError; exports.ExperimentsFacade = ExperimentsFacade; exports.FetchPolicy = FetchPolicy; exports.FilterableBatchSpanProcessor = _chunk73QOHSHUjs.FilterableBatchSpanProcessor; exports.GatewayBudgetsApiError = GatewayBudgetsApiError; exports.GatewayBudgetsApiService = GatewayBudgetsApiService; exports.IDEMPOTENCY_KEY_HEADER = IDEMPOTENCY_KEY_HEADER; exports.IDEMPOTENT_REPLAY_HEADER = IDEMPOTENT_REPLAY_HEADER; exports.LangWatch = LangWatch; exports.LangWatchApiError = LangWatchApiError; exports.LangWatchExporter =
|
|
7476
|
+
exports.ComparisonError = ComparisonError; exports.DatasetApiError = DatasetApiError; exports.DatasetError = DatasetError; exports.DatasetNotFoundError = DatasetNotFoundError; exports.DatasetPlanLimitError = DatasetPlanLimitError; exports.DatasetValidationError = DatasetValidationError; exports.DatasetsFacade = DatasetsFacade; exports.EvaluationError = EvaluationError; exports.EvaluationsApiError = EvaluationsApiError; exports.EvaluationsFacade = EvaluationsFacade; exports.EvaluatorCallError = EvaluatorCallError; exports.EvaluatorError = EvaluatorError; exports.EvaluatorNotFoundError = EvaluatorNotFoundError; exports.EvaluatorsApiError = EvaluatorsApiError; exports.EvaluatorsApiService = EvaluatorsApiService; exports.Experiment = Experiment; exports.ExperimentApiError = ExperimentApiError; exports.ExperimentError = ExperimentError; exports.ExperimentInitError = ExperimentInitError; exports.ExperimentsFacade = ExperimentsFacade; exports.FetchPolicy = FetchPolicy; exports.FilterableBatchSpanProcessor = _chunk73QOHSHUjs.FilterableBatchSpanProcessor; exports.GatewayBudgetsApiError = GatewayBudgetsApiError; exports.GatewayBudgetsApiService = GatewayBudgetsApiService; exports.IDEMPOTENCY_KEY_HEADER = IDEMPOTENCY_KEY_HEADER; exports.IDEMPOTENT_REPLAY_HEADER = IDEMPOTENT_REPLAY_HEADER; exports.LangWatch = LangWatch; exports.LangWatchApiError = LangWatchApiError; exports.LangWatchExporter = _chunkZG2F6QBCjs.LangWatchTraceExporter; exports.LangWatchHandledError = LangWatchHandledError; exports.ProjectsApiError = ProjectsApiError; exports.ProjectsApiService = ProjectsApiService; exports.SpendEventsApiError = SpendEventsApiError; exports.SpendEventsApiService = SpendEventsApiService; exports.TargetMetadataConflictError = TargetMetadataConflictError; exports.TeamsApiError = TeamsApiError; exports.TeamsApiService = TeamsApiService; exports.VirtualKeysApiError = VirtualKeysApiError; exports.VirtualKeysApiService = VirtualKeysApiService; exports.WEBHOOK_DELIVERY_ID_HEADER = WEBHOOK_DELIVERY_ID_HEADER; exports.WEBHOOK_EVENT_ID_HEADER = WEBHOOK_EVENT_ID_HEADER; exports.WEBHOOK_SIGNATURE_DEFAULT_TOLERANCE_SECONDS = WEBHOOK_SIGNATURE_DEFAULT_TOLERANCE_SECONDS; exports.WEBHOOK_SIGNATURE_HEADER = WEBHOOK_SIGNATURE_HEADER; exports.WebhookSignatureVerificationError = WebhookSignatureVerificationError; exports.WebhooksApiError = WebhooksApiError; exports.WebhooksApiService = WebhooksApiService; exports.attributes = _chunkLCG5Y2EGjs.attributes_exports; exports.getLangWatchLogger = _chunkZG2F6QBCjs.getLangWatchLogger; exports.getLangWatchTracer = _chunk4ERRCKOHjs.getLangWatchTracer; exports.isLangWatchHandledError = isLangWatchHandledError; exports.logger = logger; exports.verifyWebhookSignature = verifyWebhookSignature;
|
|
7477
7477
|
//# sourceMappingURL=index.js.map
|
package/dist/index.mjs
CHANGED
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
import {
|
|
10
10
|
ensureSetup,
|
|
11
11
|
resolveEndpoint
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-6QIASJKJ.mjs";
|
|
13
13
|
import {
|
|
14
14
|
LANGWATCH_SDK_LANGUAGE,
|
|
15
15
|
LANGWATCH_SDK_NAME_CLIENT,
|
|
@@ -20,7 +20,7 @@ import {
|
|
|
20
20
|
buildAuthHeaders,
|
|
21
21
|
getLangWatchLogger,
|
|
22
22
|
version
|
|
23
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-LFUK5LSB.mjs";
|
|
24
24
|
import {
|
|
25
25
|
ConsoleLogger,
|
|
26
26
|
NoOpLogger,
|
|
@@ -14,7 +14,7 @@ var _chunk4ERRCKOHjs = require('../chunk-4ERRCKOH.js');
|
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
|
|
17
|
-
var
|
|
17
|
+
var _chunkZG2F6QBCjs = require('../chunk-ZG2F6QBC.js');
|
|
18
18
|
|
|
19
19
|
|
|
20
20
|
|
|
@@ -38,5 +38,5 @@ var _chunkLCG5Y2EGjs = require('../chunk-LCG5Y2EG.js');
|
|
|
38
38
|
|
|
39
39
|
|
|
40
40
|
|
|
41
|
-
exports.DataCapturePresets = _chunk73QOHSHUjs.DataCapturePresets; exports.FilterableBatchSpanProcessor = _chunk73QOHSHUjs.FilterableBatchSpanProcessor; exports.LangWatchExporter =
|
|
41
|
+
exports.DataCapturePresets = _chunk73QOHSHUjs.DataCapturePresets; exports.FilterableBatchSpanProcessor = _chunk73QOHSHUjs.FilterableBatchSpanProcessor; exports.LangWatchExporter = _chunkZG2F6QBCjs.LangWatchTraceExporter; exports.LangWatchLogsExporter = _chunkZG2F6QBCjs.LangWatchLogsExporter; exports.LangWatchTraceExporter = _chunkZG2F6QBCjs.LangWatchTraceExporter; exports.attributes = _chunkLCG5Y2EGjs.attributes_exports; exports.createLangWatchSpan = _chunk4ERRCKOHjs.createLangWatchSpan; exports.emitEvaluationEvent = _chunk4ERRCKOHjs.emitEvaluationEvent; exports.getDataCaptureMode = _chunkLCG5Y2EGjs.getDataCaptureMode; exports.getLangWatchLogger = _chunkZG2F6QBCjs.getLangWatchLogger; exports.getLangWatchLoggerFromProvider = _chunkZG2F6QBCjs.getLangWatchLoggerFromProvider; exports.getLangWatchTracer = _chunk4ERRCKOHjs.getLangWatchTracer; exports.getLangWatchTracerFromProvider = _chunk4ERRCKOHjs.getLangWatchTracerFromProvider; exports.shouldCaptureInput = _chunkLCG5Y2EGjs.shouldCaptureInput; exports.shouldCaptureOutput = _chunkLCG5Y2EGjs.shouldCaptureOutput; exports.spanTypes = _chunk4ERRCKOHjs.spanTypes;
|
|
42
42
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
var
|
|
5
|
-
require('../../../chunk-
|
|
4
|
+
var _chunkODURZH6Djs = require('../../../chunk-ODURZH6D.js');
|
|
5
|
+
require('../../../chunk-ZG2F6QBC.js');
|
|
6
6
|
require('../../../chunk-LCG5Y2EG.js');
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
|
|
10
|
-
exports.ensureSetup =
|
|
10
|
+
exports.ensureSetup = _chunkODURZH6Djs.ensureSetup; exports.setupObservability = _chunkODURZH6Djs.setupObservability;
|
|
11
11
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ensureSetup,
|
|
3
3
|
setupObservability
|
|
4
|
-
} from "../../../chunk-
|
|
5
|
-
import "../../../chunk-
|
|
4
|
+
} from "../../../chunk-6QIASJKJ.mjs";
|
|
5
|
+
import "../../../chunk-LFUK5LSB.mjs";
|
|
6
6
|
import "../../../chunk-WMDQVWA6.mjs";
|
|
7
7
|
export {
|
|
8
8
|
ensureSetup,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "langwatch",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.10.0",
|
|
4
4
|
"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",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/observability-sdk/exporters/langwatch-trace-exporter.ts","../package.json","../src/internal/runtime.ts","../src/internal/constants.ts","../src/internal/api/auth.ts","../src/observability-sdk/exporters/trace-filters.ts","../src/observability-sdk/exporters/langwatch-logs-exporter.ts","../src/observability-sdk/semconv/events.ts","../src/observability-sdk/logger/index.ts","../src/observability-sdk/logger/implementation.ts"],"sourcesContent":["import { OTLPTraceExporter } from \"@opentelemetry/exporter-trace-otlp-http\";\nimport { type ReadableSpan } from \"@opentelemetry/sdk-trace-base\";\nimport { type ExportResult } from '@opentelemetry/core';\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 { buildAuthHeaders } from \"../../internal/api/auth\";\nimport {\n type TraceFilter,\n type Criteria,\n type Match,\n applyFilters,\n} from \"./trace-filters\";\n\n/**\n * Configuration options for the LangWatchTraceExporter.\n *\n * @property endpoint - Custom LangWatch endpoint URL. Falls back to LANGWATCH_ENDPOINT env var or default.\n * @property apiKey - API key for authentication. Falls back to LANGWATCH_API_KEY env var.\n * @property filters - Array of filters applied sequentially to spans before export.\n * Default: `[{ preset: \"excludeHttpRequests\" }]` to reduce framework noise.\n * Pass `null` or `[]` to disable all filtering.\n */\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}\n\nexport type { TraceFilter, Criteria, Match };\n\n/**\n * LangWatchTraceExporter extends the OpenTelemetry OTLP HTTP trace exporter\n * to send trace data to LangWatch with proper authentication and metadata headers.\n *\n * ## Features\n * - Automatic authorization header configuration via API key\n * - SDK version and runtime identification headers\n * - Proper endpoint URL construction for LangWatch ingestion\n * - Intent-based span filtering with presets and custom criteria\n *\n * ## Filtering Behavior\n * - **Default**: HTTP request spans are excluded to reduce framework noise\n * - **Pipeline**: Filters are applied sequentially with AND semantics\n * - **Matching**: All string comparisons are case-sensitive by default\n * - **Array Syntax**: All criteria require arrays of Match objects for explicit filtering\n *\n * ## Filter Types\n * - **Presets**: Pre-configured common filters (`vercelAIOnly`, `excludeHttpRequests`)\n * - **Include**: Keep only spans matching criteria (OR within field, AND across fields)\n * - **Exclude**: Remove spans matching criteria (OR within field, AND across fields)\n *\n * @example Basic usage with default filtering\n * ```typescript\n * import { LangWatchTraceExporter } from '@langwatch/observability';\n *\n * // Default: excludes HTTP request spans\n * const exporter = new LangWatchTraceExporter();\n * ```\n *\n * @example Using presets\n * ```typescript\n * // Keep only Vercel AI SDK spans\n * const exporterAI = new LangWatchTraceExporter({\n * filters: [{ preset: 'vercelAIOnly' }],\n * });\n *\n * // Explicitly exclude HTTP requests (same as default)\n * const exporterNoHttp = new LangWatchTraceExporter({\n * filters: [{ preset: 'excludeHttpRequests' }],\n * });\n *\n * // No filtering at all (send all spans)\n * const exporterAll = new LangWatchTraceExporter({\n * filters: null, // or filters: []\n * });\n * ```\n *\n * @example Custom filtering with criteria\n * ```typescript\n * // Include only spans with specific scope\n * const exporter1 = new LangWatchTraceExporter({\n * filters: [\n * { include: { instrumentationScopeName: [{ equals: 'ai' }] } }\n * ],\n * });\n *\n * // Exclude spans by name pattern\n * const exporter2 = new LangWatchTraceExporter({\n * filters: [\n * { exclude: { name: [{ startsWith: 'internal.' }] } }\n * ],\n * });\n *\n * // Case-insensitive matching\n * const exporter3 = new LangWatchTraceExporter({\n * filters: [\n * { include: { name: [{ equals: 'chat.completion', ignoreCase: true }] } }\n * ],\n * });\n * ```\n *\n * @example Filter pipelines (AND semantics)\n * ```typescript\n * // Keep AI spans, then remove HTTP requests\n * const exporter = new LangWatchTraceExporter({\n * filters: [\n * { include: { instrumentationScopeName: [{ equals: 'ai' }] } },\n * { preset: 'excludeHttpRequests' },\n * ],\n * });\n * ```\n *\n * @example OR semantics within a field\n * ```typescript\n * // Include spans with name starting with 'chat.' OR 'llm.'\n * const exporter = new LangWatchTraceExporter({\n * filters: [\n * {\n * include: {\n * name: [\n * { startsWith: 'chat.' },\n * { startsWith: 'llm.' }\n * ]\n * }\n * }\n * ],\n * });\n * ```\n *\n * @example Using regex patterns\n * ```typescript\n * const exporter = new LangWatchTraceExporter({\n * filters: [\n * {\n * include: {\n * name: [{ matches: /^(chat|llm)\\./i }]\n * }\n * }\n * ],\n * });\n * ```\n */\nexport class LangWatchTraceExporter extends OTLPTraceExporter {\n private readonly filters: TraceFilter[];\n /**\n * Creates a new LangWatchTraceExporter instance.\n *\n * @param opts - Configuration options for the exporter\n * @param opts.apiKey - API key for LangWatch authentication.\n * Falls back to `LANGWATCH_API_KEY` environment variable, then empty string.\n * @param opts.endpoint - Custom endpoint URL for LangWatch ingestion.\n * Falls back to `LANGWATCH_ENDPOINT` environment variable, then default endpoint.\n * @param opts.filters - Array of filters applied sequentially to spans before export (AND semantics).\n * When omitted, defaults to `[{ preset: \"excludeHttpRequests\" }]`.\n * Pass `null` or `[]` to disable all filtering and send all spans.\n *\n * @example\n * ```typescript\n * // With API key and default filtering\n * const exporter = new LangWatchTraceExporter({\n * apiKey: 'your-api-key'\n * });\n *\n * // With custom endpoint and no filtering\n * const exporter = new LangWatchTraceExporter({\n * endpoint: 'https://custom.langwatch.ai',\n * filters: null\n * });\n * ```\n */\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 =\n opts?.endpoint ??\n process.env.LANGWATCH_ENDPOINT ??\n 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 });\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 \"name\": \"langwatch\",\n \"version\": \"1.9.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 \"main\": \"dist/index.js\",\n \"module\": \"dist/index.mjs\",\n \"types\": \"dist/index.d.ts\",\n \"author\": \"LangWatch\",\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=20\",\n \"pnpm\": \">=8\"\n },\n \"files\": [\n \"dist\",\n \"!dist/bin\",\n \"!dist/cli/*.map\",\n \"!dist/plugin\",\n \"README.md\",\n \"LICENSE\"\n ],\n \"bin\": {\n \"lw\": \"./dist/cli/index.js\",\n \"langwatch\": \"./dist/cli/index.js\"\n },\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/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 },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/langwatch/langwatch.git\",\n \"directory\": \"typescript-sdk\"\n },\n \"scripts\": {\n \"generate\": \"pnpm run generate:server-types && pnpm run generate:openapi-types\",\n \"cli\": \"node dist/cli/index.js\",\n \"prelint\": \"pnpm run generate\",\n \"lint\": \"eslint .\",\n \"pretest\": \"pnpm run generate\",\n \"test\": \"vitest\",\n \"test:unit\": \"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 -- bash -c 'cd ../../platform/app && pnpm prisma:seed'\",\n \"prebuild\": \"pnpm run generate\",\n \"build\": \"tsc --noEmit && 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 \"build:plugin-hook\": \"tsup --config tsup.plugin-hook.config.ts\",\n \"tarball\": \"pnpm build && pnpm pack\",\n \"typecheck\": \"tsc --noEmit\",\n \"prepublish\": \"pnpm run build\",\n \"generate:openapi-types\": \"pnpm exec openapi-typescript ../../platform/app/src/app/api/openapiLangWatch.json -o ./src/internal/generated/openapi/api-client.ts && node scripts/patch-generated-openapi.mjs\",\n \"generate:server-types\": \"./copy-types.sh\"\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/langy\": \"workspace:*\",\n \"@opentelemetry/sdk-node\": \"0.221.0\",\n \"@opentelemetry/sdk-trace-node\": \"^2.0.1\",\n \"@opentelemetry/sdk-trace-web\": \">=2.0.1\",\n \"@types/debug\": \"^4.1.12\",\n \"@types/js-yaml\": \"^4.0.9\",\n \"@types/node\": \"^26.2.0\",\n \"@types/prompts\": \"^2.4.9\",\n \"@vercel/otel\": \"^1.13.0\",\n \"@vitest/coverage-v8\": \"^4.1.0\",\n \"dotenv-cli\": \"^11.0.0\",\n \"esbuild\": \"^0.28.1\",\n \"eslint\": \"^9.32.0\",\n \"fets\": \"^0.8.5\",\n \"fishery\": \"^2.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 \"tsup\": \"^8.5.0\",\n \"typescript\": \"^6.0.3\",\n \"typescript-eslint\": \"^8.38.0\",\n \"vitest\": \"^4.1.0\",\n \"vitest-mock-extended\": \"^5.1.1\",\n \"yaml\": \"^2.8.1\"\n },\n \"dependencies\": {\n \"@opentelemetry/api\": \"^1.9.0\",\n \"@opentelemetry/api-logs\": \"0.221.0\",\n \"@opentelemetry/core\": \"^2.0.1\",\n \"@opentelemetry/exporter-logs-otlp-http\": \"0.221.0\",\n \"@opentelemetry/exporter-trace-otlp-http\": \"0.221.0\",\n \"@opentelemetry/instrumentation\": \"0.221.0\",\n \"@opentelemetry/resources\": \"^2.0.1\",\n \"@opentelemetry/sdk-logs\": \"0.221.0\",\n \"@opentelemetry/sdk-metrics\": \"^2.0.1\",\n \"@opentelemetry/sdk-node\": \"^0.221.0\",\n \"@opentelemetry/sdk-trace-base\": \"^2.0.1\",\n \"@opentelemetry/semantic-conventions\": \"^1.36.0\",\n \"chalk\": \"^6.0.0\",\n \"cloudflared\": \"0.7.1\",\n \"commander\": \"^15.0.0\",\n \"dotenv\": \"^17.3.1\",\n \"js-yaml\": \"^5.2.0\",\n \"jsonc-parser\": \"^3.3.1\",\n \"liquidjs\": \"^10.27.0\",\n \"open\": \"^11.0.0\",\n \"openapi-fetch\": \"^0.17.0\",\n \"ora\": \"^9.3.0\",\n \"prompts\": \"^2.4.2\",\n \"xksuid\": \"^0.0.4\",\n \"zod\": \"^4.0.14\"\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/context-async-hooks\": \"^2.1.0\",\n \"@opentelemetry/context-zone\": \">=1.19.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-async-hooks\": {\n \"optional\": true\n },\n \"@opentelemetry/context-zone\": {\n \"optional\": true\n },\n \"@opentelemetry/sdk-trace-web\": {\n \"optional\": true\n },\n \"langchain\": {\n \"optional\": true\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) Optionally override the global object for environment simulation. Only used if NODE_ENV === 'test'.\n */\nexport function detectRuntime(globals?: any): JsRuntime {\n let g = globalThis;\n if (globals) {\n if (process.env.NODE_ENV === \"test\") {\n g = globals;\n } else {\n console.warn(\"[LangWatch Observability] overriding detectRuntime is only supported when running in NODE_ENV=test\");\n }\n }\n\n try {\n if (\n \"Deno\" in g &&\n typeof g.Deno === \"object\" &&\n g.Deno &&\n 'version' in g.Deno &&\n typeof g.Deno.version === \"object\"\n ) {\n return \"deno\";\n }\n if (\n \"Bun\" in g &&\n typeof g.Bun === \"object\" &&\n g.Bun &&\n 'version' in g.Bun &&\n typeof g.Bun.version === \"string\"\n ) {\n return \"bun\";\n }\n if (\n \"process\" in g &&\n typeof g.process === \"object\" &&\n g.process &&\n typeof g.process.versions === \"object\" &&\n typeof g.process.versions.node === \"string\"\n ) {\n return \"node\";\n }\n if (\n typeof g.window?.document !== \"undefined\" &&\n g === g.window\n ) {\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","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\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","/**\n * Authentication header assembly for LangWatch SDK clients.\n *\n * Supports two token families that share the same HTTP surface:\n *\n * 1. `sk-lw-{random}` — legacy project API keys. The token itself carries\n * the project identity, so we emit both `Authorization: Bearer <token>`\n * and `X-Auth-Token: <token>` for backwards compatibility.\n *\n * 2. `sk-lw-{lookupId}_{secret}` or `pat-lw-{lookupId}_{secret}` — API\n * keys (user-scoped). Must be paired with a `projectId` so the server\n * can resolve the correct role binding. When a `projectId` is available\n * we encode both into `Authorization: Basic base64(projectId:token)`.\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 * Returns `true` when the supplied credential is a user-scoped API key\n * (as opposed to a legacy project key).\n *\n * Detection heuristics:\n * - `pat-lw-*` → always a user-scoped key (old format)\n * - `sk-lw-{chars}_{chars}` → user-scoped key (new format, has underscore)\n * - `sk-lw-{chars}` (no underscore) → legacy project key\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/** @deprecated Use `isUserScopedApiKey` instead. Kept for backward compat. */\nexport const isPersonalAccessToken = isUserScopedApiKey;\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 =\n 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(\n `${resolvedProjectId}:${apiKey}`,\n \"utf-8\",\n ).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","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 a sequence of filters to an array of spans using AND semantics.\n * Each filter in the sequence is applied to the result of the previous filter,\n * progressively narrowing down the set of spans.\n *\n * @param filters - Array of filter rules to apply sequentially\n * @param spans - Array of spans to filter\n * @returns Filtered array of spans that match all filter criteria\n *\n * @example\n * ```typescript\n * const filters: TraceFilter[] = [\n * { include: { instrumentationScopeName: [{ equals: 'ai' }] } },\n * { preset: 'excludeHttpRequests' }\n * ];\n * const filtered = applyFilters(filters, spans);\n * // Returns only AI spans that are not HTTP requests\n * ```\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 to an array of spans.\n * Handles three types of filters: presets, include rules, and exclude rules.\n *\n * @param rule - Single filter rule (preset, include, or exclude)\n * @param spans - Array of spans to filter\n * @returns Filtered array of spans based on the rule\n *\n * @example\n * ```typescript\n * // Using preset\n * const filtered1 = applyFilterRule({ preset: 'vercelAIOnly' }, spans);\n *\n * // Using include\n * const filtered2 = applyFilterRule(\n * { include: { name: [{ startsWith: 'llm.' }] } },\n * spans\n * );\n *\n * // Using exclude\n * const filtered3 = applyFilterRule(\n * { exclude: { instrumentationScopeName: [{ equals: 'http' }] } },\n * spans\n * );\n * ```\n */\nexport function applyFilterRule(rule: TraceFilter, spans: ReadableSpan[]): ReadableSpan[] {\n if (\"preset\" in rule && rule.preset) {\n return applyPreset(\n (rule as { preset: TraceFilter extends { preset: infer P } ? P : never }).preset as any,\n spans\n );\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 to an array of spans.\n * Presets are predefined common filtering patterns.\n *\n * Available presets:\n * - `vercelAIOnly`: Keeps only spans from the Vercel AI SDK (instrumentationScope.name === 'ai')\n * - `excludeHttpRequests`: Removes spans that appear to be HTTP requests (span name starts with HTTP verb)\n *\n * @param preset - Name of the preset filter to apply\n * @param spans - Array of spans to filter\n * @returns Filtered array of spans based on the preset\n *\n * @example\n * ```typescript\n * // Keep only Vercel AI spans\n * const aiSpans = applyPreset('vercelAIOnly', spans);\n *\n * // Remove HTTP request spans\n * const noHttpSpans = applyPreset('excludeHttpRequests', spans);\n * ```\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 the given criteria.\n * All specified criteria fields must match (AND semantics within a criteria object).\n * Within each field, matchers are evaluated with OR semantics (any matcher can match).\n *\n * @param span - Span to evaluate\n * @param criteria - Criteria to match against (instrumentationScopeName and/or name)\n * @returns True if the span matches all specified criteria, false otherwise\n *\n * @example\n * ```typescript\n * const criteria: Criteria = {\n * instrumentationScopeName: [{ equals: 'ai' }],\n * name: [{ startsWith: 'llm.' }, { startsWith: 'chat.' }]\n * };\n * const matches = matchesCriteria(span, criteria);\n * // Returns true if scope is 'ai' AND name starts with 'llm.' OR 'chat.'\n * ```\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 value matches a given match rule.\n * Supports three types of matching: exact equality, prefix matching, and regex matching.\n * All matching is case-sensitive by default unless `ignoreCase` is explicitly set to true.\n *\n * @param value - String value to evaluate\n * @param rule - Match rule specifying the matching criteria\n * @returns True if the value matches the rule, false otherwise\n *\n * @example\n * ```typescript\n * // Exact match (case-sensitive by default)\n * valueMatches('GET /api/users', { equals: 'GET /api/users' }); // true\n * valueMatches('get /api/users', { equals: 'GET /api/users' }); // false\n *\n * // Case-insensitive exact match\n * valueMatches('get /api/users', { equals: 'GET /api/users', ignoreCase: true }); // true\n *\n * // Prefix match\n * valueMatches('GET /api/users', { startsWith: 'GET' }); // true\n * valueMatches('POST /api/users', { startsWith: 'GET' }); // false\n *\n * // Regex match\n * valueMatches('GET /api/users', { matches: /^(GET|POST)\\b/ }); // true\n *\n * // Case-insensitive regex\n * valueMatches('get /api/users', { matches: /^GET\\b/, ignoreCase: true }); // true\n * ```\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 re =\n ignoreCase && !rule.matches.flags.includes(\"i\")\n ? new RegExp(rule.matches.source, (rule.matches.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.\n * A span is considered a Vercel AI span if its instrumentation scope name is 'ai' (case-insensitive).\n *\n * @param span - Span to check\n * @returns True if the span is from the Vercel AI SDK, false otherwise\n *\n * @example\n * ```typescript\n * if (isVercelAiSpan(span)) {\n * console.log('This is a Vercel AI operation');\n * }\n * ```\n */\nexport function isVercelAiSpan(span: ReadableSpan): boolean {\n const scope = span.instrumentationScope?.name?.toLowerCase?.() ?? \"\";\n return scope === \"ai\";\n}\n\n/**\n * Checks if a span appears to be an HTTP request based on its name.\n * A span is considered an HTTP request if its name starts with a common HTTP verb\n * (GET, POST, PUT, DELETE, PATCH, OPTIONS, HEAD) followed by a word boundary.\n *\n * @param span - Span to check\n * @returns True if the span appears to be an HTTP request, false otherwise\n *\n * @example\n * ```typescript\n * // These would return true:\n * // span.name = \"GET /api/users\"\n * // span.name = \"POST /api/data\"\n * // span.name = \"DELETE /resource/123\"\n *\n * if (isHttpRequestSpan(span)) {\n * console.log('This is an HTTP request span');\n * }\n * ```\n */\nexport function isHttpRequestSpan(span: ReadableSpan): boolean {\n const name = span.name ?? \"\";\n const verbMatch = /^(GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD)\\b/i.test(name);\n return verbMatch;\n}\n","import { OTLPLogExporter } from \"@opentelemetry/exporter-logs-otlp-http\";\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\";\n\nexport interface LangWatchLogsExporterOptions {\n endpoint?: string;\n apiKey?: string;\n}\n\n/**\n * LangWatchLogsExporter extends the OpenTelemetry OTLP HTTP logs exporter\n * to send logs to LangWatch with proper authentication and metadata headers.\n *\n * This exporter automatically configures:\n * - Authorization headers using the provided API key or environment variables/fallback\n * - SDK version and language identification headers\n * - Proper endpoint configuration for LangWatch ingestion using provided URL or environment variables/fallback\n *\n * @example\n * ```typescript\n * import { LangWatchLogsExporter } from '@langwatch/observability';\n *\n * // Using environment variables/fallback configuration\n * const exporter = new LangWatchLogsExporter();\n *\n * // Using custom options\n * const exporter = new LangWatchLogsExporter({\n * apiKey: 'your-api-key',\n * endpoint: 'https://custom.langwatch.com'\n * });\n * ```\n */\nexport class LangWatchLogsExporter extends OTLPLogExporter {\n /**\n * Creates a new LangWatchLogsExporter instance.\n *\n * @param opts - Optional configuration options for the exporter.\n * @param opts.apiKey - Optional API key for LangWatch authentication. If not provided,\n * will use environment variables or fallback configuration.\n * @param opts.endpoint - Optional custom endpoint URL for LangWatch ingestion.\n * If not provided, will use environment variables or fallback configuration.\n */\n constructor(opts?: LangWatchLogsExporterOptions) {\n const apiKey = opts?.apiKey ?? process.env.LANGWATCH_API_KEY ?? \"\";\n const endpoint =\n opts?.endpoint ??\n process.env.LANGWATCH_ENDPOINT ??\n 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 });\n }\n}\n","/*\n This file contains the values for the OpenTelemetry semantic conventions for GenAI log\n record event names.\n\n 👉 https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-events/\n*/\n\n/**\n * GenAI system message event name\n * Used for log records representing system messages in AI conversations\n */\nexport const LOG_EVNT_GEN_AI_SYSTEM_MESSAGE = \"gen.ai.system_message\";\n\n/**\n * GenAI user message event name\n * Used for log records representing user messages in AI conversations\n */\nexport const LOG_EVNT_GEN_AI_USER_MESSAGE = \"gen.ai.user_message\";\n\n/**\n * GenAI assistant message event name\n * Used for log records representing assistant responses in AI conversations\n */\nexport const LOG_EVNT_GEN_AI_ASSISTANT_MESSAGE = \"gen.ai.assistant_message\";\n\n/**\n * GenAI tool message event name\n * Used for log records representing tool calls or responses in AI conversations\n */\nexport const LOG_EVNT_GEN_AI_TOOL_MESSAGE = \"gen.ai.tool_message\";\n\n/**\n * GenAI choice event name\n * Used for log records representing choices made by AI models\n */\nexport const LOG_EVNT_GEN_AI_CHOICE = \"gen.ai.choice\";\n\n/**\n * LangWatch LangChain callback event name\n * Used for log records representing LangChain callback events\n */\nexport const EVNT_LANGWATCH_LANGCHAIN_CALLBACK = \"langwatch.langchain.callback\";\n","import {\n type Logger,\n type LoggerOptions,\n type LoggerProvider,\n createNoopLogger,\n} from \"@opentelemetry/api-logs\";\nimport {\n type LangWatchLogger,\n} from \"./types\";\nimport { LangWatchLoggerInternal } from \"./implementation\";\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) =>\n createNoopLogger(),\n};\n\n/**\n * The LangWatch-specific global logger provider. It may not be the same as the current\n * OpenTelemetry global logger provider, but it's the last one the `setupObservability`\n * knows about.\n * @internal\n */\nlet currentLoggerProvider: LoggerProvider = NOOP_LOGGER_PROVIDER;\n\n/**\n * @module observability/logger\n * @description\n * Provides LangWatch logger integration with OpenTelemetry, including logger provider\n * management and logger creation utilities.\n *\n * @remarks\n * This module allows you to set a global logger provider, retrieve LangWatch loggers,\n * and wrap OpenTelemetry loggers with LangWatch-specific functionality.\n *\n * @see {@link setLangWatchLoggerProvider}\n * @see {@link getLangWatchLogger}\n * @see {@link getLangWatchLoggerFromProvider}\n * @see {@link createLangWatchLogger}\n */\nexport function setLangWatchLoggerProvider(\n loggerProvider: LoggerProvider,\n): void {\n currentLoggerProvider = loggerProvider;\n}\n\n/**\n * Retrieves a LangWatch logger with the specified name and optional version.\n *\n * @param name - The name of the logger (typically your service or module name).\n * @param version - (Optional) The version of the logger.\n * @returns A {@link LangWatchLogger} instance.\n *\n * @remarks\n * Uses the logger provider set during observability setup. If no provider is set, returns\n * a NoOp logger.\n *\n * @example\n * ```ts\n * const logger = getLangWatchLogger(\"my-service\");\n * logger.info(\"Service started\");\n * ```\n *\n * @see {@link setLangWatchLoggerProvider}\n */\nexport function getLangWatchLogger(\n name: string,\n version?: string,\n): LangWatchLogger {\n return getLangWatchLoggerFromProvider(currentLoggerProvider, name, version);\n}\n\n/**\n * Retrieves a LangWatch logger from a specific OpenTelemetry logger provider.\n *\n * @param loggerProvider - The OpenTelemetry logger provider to use.\n * @param name - The name of the logger.\n * @param version - (Optional) The version of the logger.\n * @returns A {@link LangWatchLogger} instance.\n *\n * @remarks\n * Use this function if you want to use a custom logger provider instead of the global one.\n *\n * @example\n * ```ts\n * const customProvider = new LoggerProvider();\n * const logger = getLangWatchLoggerFromProvider(customProvider, \"custom-service\");\n * ```\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 *\n * @param logger - The OpenTelemetry logger to wrap.\n * @returns A {@link LangWatchLogger} instance.\n *\n * @example\n * ```ts\n * import { Logger } from \"@opentelemetry/api-logs\";\n * const otelLogger = new Logger();\n * const lwLogger = createLangWatchLogger(otelLogger);\n * lwLogger.info(\"Wrapped logger\");\n * ```\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 {\n type AnyValue,\n type Logger,\n} from \"@opentelemetry/api-logs\";\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\";\nimport { shouldCaptureOutput } from \"../config\";\nimport * as intSemconv from \"../semconv\";\nimport { type SemConvLogRecordAttributes } from \"../semconv\";\nimport { context } from \"@opentelemetry/api\";\n\n/**\n * Internal implementation of {@link LangWatchLogger}.\n *\n * @remarks\n * This class wraps an OpenTelemetry logger and adds LangWatch-specific functionality for\n * structured logging and event emission.\n * Not intended for direct use; use {@link getLangWatchLogger} or\n * {@link createLangWatchLogger} instead.\n */\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 { ...body, role: body.role ?? \"system\" } 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 { ...body, role: body.role ?? \"user\" } 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 { ...body, role: body.role ?? \"assistant\" } 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":";;;;;;;AAAA,SAAS,yBAAyB;;;ACEhC,cAAW;;;ACAb,IAAI;AAMG,IAAM,aAAa,MAAiB;AACzC,2CAAa,cAAc;AAC3B,SAAO;AACT;AAcO,SAAS,cAAc,SAA0B;AAzBxD;AA0BE,MAAI,IAAI;AACR,MAAI,SAAS;AACX,QAAI,QAAQ,IAAI,aAAa,QAAQ;AACnC,UAAI;AAAA,IACN,OAAO;AACL,cAAQ,KAAK,oGAAoG;AAAA,IACnH;AAAA,EACF;AAEA,MAAI;AACF,QACE,UAAU,KACV,OAAO,EAAE,SAAS,YAClB,EAAE,QACF,aAAa,EAAE,QACf,OAAO,EAAE,KAAK,YAAY,UAC1B;AACA,aAAO;AAAA,IACT;AACA,QACE,SAAS,KACT,OAAO,EAAE,QAAQ,YACjB,EAAE,OACF,aAAa,EAAE,OACf,OAAO,EAAE,IAAI,YAAY,UACzB;AACA,aAAO;AAAA,IACT;AACA,QACE,aAAa,KACb,OAAO,EAAE,YAAY,YACrB,EAAE,WACF,OAAO,EAAE,QAAQ,aAAa,YAC9B,OAAO,EAAE,QAAQ,SAAS,SAAS,UACnC;AACA,aAAO;AAAA,IACT;AACA,QACE,SAAO,OAAE,WAAF,mBAAU,cAAa,eAC9B,MAAM,EAAE,QACR;AACA,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,YAAQ,KAAK,sDAAsD,KAAK;AACxE,WAAO;AAAA,EACT;AACF;;;ACvEO,IAAM,wBAAwB;AAE9B,IAAM,mCAAmC;AACzC,IAAM,4BAA4B;AAClC,IAAM,yBAAyB;AAC/B,IAAM,wBAAwB;AAE9B,IAAM,mBAAmB;AACzB,IAAM,uBAAuB;AAE7B,IAAM,cAAc;AACpB,IAAM,YAAY;;;ACEzB,IAAM,oBAAoB;AAG1B,IAAM,iBAAiB;AAwBhB,IAAM,qBAAqB,CAAC,UAA2B;AAC5D,MAAI,MAAM,WAAW,iBAAiB,EAAG,QAAO;AAChD,MAAI,MAAM,WAAW,cAAc,GAAG;AACpC,UAAM,OAAO,MAAM,MAAM,eAAe,MAAM;AAC9C,WAAO,KAAK,SAAS,GAAG;AAAA,EAC1B;AACA,SAAO;AACT;AASO,IAAM,mBAAmB,CAAC;AAAA,EAC/B;AAAA,EACA;AACF,MAAuD;AA9DvD;AA+DE,MAAI,CAAC,OAAQ,QAAO,CAAC;AAErB,QAAM,qBACJ,qCAAa,QAAQ,IAAI,yBAAzB,YAAiD;AAEnD,MAAI,mBAAmB,MAAM,GAAG;AAC9B,QAAI,mBAAmB;AAGrB,YAAM,UAAU,OAAO;AAAA,QACrB,GAAG,iBAAiB,IAAI,MAAM;AAAA,QAC9B;AAAA,MACF,EAAE,SAAS,QAAQ;AACnB,aAAO,EAAE,eAAe,SAAS,OAAO,GAAG;AAAA,IAC7C;AAIA,WAAO;AAAA,MACL,eAAe,UAAU,MAAM;AAAA,MAC/B,gBAAgB;AAAA,IAClB;AAAA,EACF;AAGA,SAAO;AAAA,IACL,eAAe,UAAU,MAAM;AAAA,IAC/B,gBAAgB;AAAA,EAClB;AACF;;;ACtDO,SAAS,aACd,SACA,OACgB;AAChB,MAAI,CAAC,WAAW,QAAQ,WAAW,EAAG,QAAO;AAC7C,SAAO,QAAQ,OAAO,CAAC,SAAS,SAAS,gBAAgB,MAAM,OAAO,GAAG,KAAK;AAChF;AA4BO,SAAS,gBAAgB,MAAmB,OAAuC;AACxF,MAAI,YAAY,QAAQ,KAAK,QAAQ;AACnC,WAAO;AAAA,MACJ,KAAyE;AAAA,MAC1E;AAAA,IACF;AAAA,EACF;AAEA,MAAI,aAAa,QAAQ,KAAK,SAAS;AACrC,UAAM,WAAY,KAA+B;AACjD,WAAO,MAAM,OAAO,CAAC,MAAM,gBAAgB,GAAG,QAAQ,CAAC;AAAA,EACzD;AAEA,MAAI,aAAa,QAAQ,KAAK,SAAS;AACrC,UAAM,WAAY,KAA+B;AACjD,WAAO,MAAM,OAAO,CAAC,MAAM,CAAC,gBAAgB,GAAG,QAAQ,CAAC;AAAA,EAC1D;AAEA,SAAO;AACT;AAuBO,SAAS,YACd,QACA,OACgB;AAChB,MAAI,WAAW,eAAgB,QAAO,MAAM,OAAO,CAAC,MAAM,eAAe,CAAC,CAAC;AAC3E,MAAI,WAAW,sBAAuB,QAAO,MAAM,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;AAEtF,SAAO;AACT;AAqBO,SAAS,gBAAgB,MAAoB,UAA6B;AA/IjF;AAgJE,MAAI,SAAS,6BAA6B,QAAQ;AAChD,UAAM,aAAY,gBAAK,yBAAL,mBAA2B,SAA3B,YAAmC;AACrD,UAAM,KAAK,SAAS,yBAAyB,KAAK,CAAC,MAAM,aAAa,WAAW,CAAC,CAAC;AACnF,QAAI,CAAC,GAAI,QAAO;AAAA,EAClB;AAEA,MAAI,SAAS,SAAS,QAAQ;AAC5B,UAAM,KAAK,SAAS,KAAK,KAAK,CAAC,MAAG;AAvJtC,UAAAA;AAuJyC,2BAAaA,MAAA,KAAK,SAAL,OAAAA,MAAa,IAAI,CAAC;AAAA,KAAC;AACrE,QAAI,CAAC,GAAI,QAAO;AAAA,EAClB;AAEA,SAAO;AACT;AA+BO,SAAS,aAAa,OAAe,MAAsB;AA3LlE;AA4LE,QAAM,MAAM,wBAAS;AACrB,QAAM,cAAa,UAAK,eAAL,YAAmB;AAEtC,MAAI,KAAK,WAAW,QAAQ;AAC1B,WAAO,aACH,IAAI,cAAc,KAAK,QAAQ,QAAQ,EAAE,aAAa,OAAO,CAAC,MAAM,IACpE,QAAQ,KAAK;AAAA,EACnB;AAEA,MAAI,KAAK,eAAe,QAAQ;AAC9B,WAAO,aACH,IAAI,YAAY,EAAE,WAAW,KAAK,WAAW,YAAY,CAAC,IAC1D,IAAI,WAAW,KAAK,UAAU;AAAA,EACpC;AAEA,MAAI,KAAK,mBAAmB,QAAQ;AAClC,UAAM,KACJ,cAAc,CAAC,KAAK,QAAQ,MAAM,SAAS,GAAG,IAC1C,IAAI,OAAO,KAAK,QAAQ,SAAS,KAAK,QAAQ,SAAS,MAAM,GAAG,IAChE,KAAK;AACX,WAAO,GAAG,KAAK,GAAG;AAAA,EACpB;AAEA,SAAO;AACT;AAgBO,SAAS,eAAe,MAA6B;AApO5D;AAqOE,QAAM,SAAQ,4BAAK,yBAAL,mBAA2B,SAA3B,mBAAiC,gBAAjC,4CAAoD;AAClE,SAAO,UAAU;AACnB;AAsBO,SAAS,kBAAkB,MAA6B;AA7P/D;AA8PE,QAAM,QAAO,UAAK,SAAL,YAAa;AAC1B,QAAM,YAAY,+CAA+C,KAAK,IAAI;AAC1E,SAAO;AACT;;;ALvGO,IAAM,yBAAN,cAAqC,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA4B5D,YAAY,MAAsC;AAtLpD;AAuLI,UAAM,UAAS,wCAAM,WAAN,YAAgB,QAAQ,IAAI,sBAA5B,YAAiD;AAChE,UAAM,aAAY,kCAAM,cAAN,YAAmB,QAAQ,IAAI;AACjD,UAAM,YACJ,wCAAM,aAAN,YACA,QAAQ,IAAI,uBADZ,YAEA;AAEF,UAAM,MAAM,IAAI,IAAI,aAAa,QAAQ;AACzC,UAAM,eAAe,IAAI,SAAS;AAElC,UAAM;AAAA,MACJ,SAAS;AAAA,QACP,wBAAwB;AAAA,QACxB,4BAA4B;AAAA,QAC5B,2BAA2B;AAAA,QAC3B,2BAA2B,sBAAsB;AAAA,SAC9C,iBAAiB,EAAE,QAAQ,UAAU,CAAC;AAAA,MAE3C,KAAK,aAAa,SAAS;AAAA,IAC7B,CAAC;AAGD,SAAI,6BAAM,aAAY,QAAS,MAAM,QAAQ,6BAAM,OAAO,KAAK,KAAK,QAAQ,WAAW,GAAI;AACzF,WAAK,UAAU,CAAC;AAAA,IAClB,WAAW,MAAM,QAAQ,6BAAM,OAAO,GAAG;AACvC,WAAK,UAAU,KAAK;AAAA,IACtB,OAAO;AACL,WAAK,UAAU,CAAC,EAAE,QAAQ,sBAAsB,CAAC;AAAA,IACnD;AAAA,EACF;AAAA,EAEA,OAAO,OAAuB,gBAAsD;AAClF,UAAM,WAAW,aAAa,KAAK,SAAS,KAAK;AACjD,UAAM,OAAO,UAAU,cAAc;AAAA,EACvC;AACF;;;AM1NA,SAAS,uBAAuB;AAsCzB,IAAM,wBAAN,cAAoC,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUzD,YAAY,MAAqC;AAhDnD;AAiDI,UAAM,UAAS,wCAAM,WAAN,YAAgB,QAAQ,IAAI,sBAA5B,YAAiD;AAChE,UAAM,YACJ,wCAAM,aAAN,YACA,QAAQ,IAAI,uBADZ,YAEA;AAEF,UAAM,MAAM,IAAI,IAAI,WAAW,QAAQ;AACvC,UAAM,eAAe,IAAI,SAAS;AAElC,UAAM;AAAA,MACJ,SAAS;AAAA,QACP,wBAAwB;AAAA,QACxB,4BAA4B;AAAA,QAC5B,2BAA2B;AAAA,QAC3B,2BAA2B,sBAAsB;AAAA,SAC7C,SAAS,EAAE,eAAe,UAAU,MAAM,GAAG,IAAI,CAAC;AAAA,MAExD,KAAK,aAAa,SAAS;AAAA,IAC7B,CAAC;AAAA,EACH;AACF;;;AC1DO,IAAM,iCAAiC;AAMvC,IAAM,+BAA+B;AAMrC,IAAM,oCAAoC;AAM1C,IAAM,+BAA+B;AAMrC,IAAM,yBAAyB;;;ACnCtC;AAAA,EAIE;AAAA,OACK;;;ACYP,SAAS,eAAe;AAWjB,IAAM,0BAAN,MAAyD;AAAA,EAC9D,YAAoB,QAAgB;AAAhB;AAAA,EAAiB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMrC,QAAQ,SAAqD;AAC3D,WAAO,KAAK,OAAO,QAAQ,OAAO;AAAA,EACpC;AAAA,EAEA,KAAK,WAA+B,SAA6B;AAE/D,QAAI,CAAC,oBAAoB,GAAG;AAC1B,gBAAU,OAAO;AAAA,IACnB;AAGA,QAAI,CAAC,UAAU,WAAW,EAAC,mCAAS,iBAAgB;AAClD,gBAAU,UAAU,QAAQ,OAAO;AAAA,IACrC;AAGA,SAAK,OAAO,KAAK,SAAS;AAAA,EAC5B;AAAA,EAEA,4BACE,MACA,QACA,YACM;AA1DV;AA2DI,SAAK;AAAA,MACQ;AAAA,MACX,iCAAK,OAAL,EAAW,OAAM,UAAK,SAAL,YAAa,SAAS;AAAA,MACvC,iCACK,aADL;AAAA,QAEE,iBAAiB;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,0BACE,MACA,QACA,YACA;AAzEJ;AA0EI,SAAK;AAAA,MACQ;AAAA,MACX,iCAAK,OAAL,EAAW,OAAM,UAAK,SAAL,YAAa,OAAO;AAAA,MACrC,iCACK,aADL;AAAA,QAEE,iBAAiB;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,+BACE,MACA,QACA,YACA;AAxFJ;AAyFI,SAAK;AAAA,MACQ;AAAA,MACX,iCAAK,OAAL,EAAW,OAAM,UAAK,SAAL,YAAa,YAAY;AAAA,MAC1C,iCACK,aADL;AAAA,QAEE,iBAAiB;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,0BACE,MACA,QACA,YACA;AACA,QAAI,KAAK,SAAS,QAAQ;AACxB,WAAK,OAAO;AAAA,IACd;AAEA,SAAK;AAAA,MACQ;AAAA,MACX,mBAAK;AAAA,MACL,iCACK,aADL;AAAA,QAEE,iBAAiB;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,qBACE,MACA,QACA,YACA;AA1HJ;AA2HI,QAAI,KAAK,WAAW,KAAK,QAAQ,SAAS,QAAQ;AAChD,WAAK,QAAQ,OAAO;AAAA,IACtB;AAEA,SAAK;AAAA,MACQ;AAAA,MACX,iCACK,OADL;AAAA,QAEE,SAAS,iCAAK,KAAK,UAAV,EAAmB,OAAM,gBAAK,YAAL,mBAAc,SAAd,YAAsB,YAAY;AAAA,MACtE;AAAA,MACA,iCACK,aADL;AAAA,QAEE,iBAAiB;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,eACN,WACA,MACA,YACM;AACN,SAAK,KAAK;AAAA,MACR;AAAA,MACA,SAAS,QAAQ,OAAO;AAAA,MACxB,YAAY,mBAAK;AAAA,MACjB,MAAM,oBAAoB,IAAI,OAAO;AAAA,MACrC,oBAAmB,oBAAI,KAAK,GAAE,QAAQ;AAAA,IACxC,CAAC;AAAA,EACH;AACF;;;ADzIA,IAAM,uBAAuC;AAAA,EAC3C,WAAW,CAAC,OAAe,UAAmB,aAC5C,iBAAiB;AACrB;AAQA,IAAI,wBAAwC;AAiBrC,SAAS,2BACd,gBACM;AACN,0BAAwB;AAC1B;AAqBO,SAAS,mBACd,MACAC,UACiB;AACjB,SAAO,+BAA+B,uBAAuB,MAAMA,QAAO;AAC5E;AAmBO,SAAS,+BACd,gBACA,MACAA,UACiB;AACjB,SAAO,sBAAsB,eAAe,UAAU,MAAMA,QAAO,CAAC;AACtE;AAgBO,SAAS,sBAAsB,QAAiC;AACrE,SAAO,IAAI,wBAAwB,MAAM;AAC3C;","names":["_a","version"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/langwatch/langwatch/sdks/typescript/dist/chunk-NFFB3DWW.js","../src/observability-sdk/exporters/langwatch-trace-exporter.ts","../package.json","../src/internal/runtime.ts","../src/internal/constants.ts","../src/internal/api/auth.ts","../src/observability-sdk/exporters/trace-filters.ts","../src/observability-sdk/exporters/langwatch-logs-exporter.ts","../src/observability-sdk/semconv/events.ts","../src/observability-sdk/logger/index.ts","../src/observability-sdk/logger/implementation.ts"],"names":[],"mappings":"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","file":"/home/runner/work/langwatch/langwatch/sdks/typescript/dist/chunk-NFFB3DWW.js","sourcesContent":[null,"import { OTLPTraceExporter } from \"@opentelemetry/exporter-trace-otlp-http\";\nimport { type ReadableSpan } from \"@opentelemetry/sdk-trace-base\";\nimport { type ExportResult } from '@opentelemetry/core';\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 { buildAuthHeaders } from \"../../internal/api/auth\";\nimport {\n type TraceFilter,\n type Criteria,\n type Match,\n applyFilters,\n} from \"./trace-filters\";\n\n/**\n * Configuration options for the LangWatchTraceExporter.\n *\n * @property endpoint - Custom LangWatch endpoint URL. Falls back to LANGWATCH_ENDPOINT env var or default.\n * @property apiKey - API key for authentication. Falls back to LANGWATCH_API_KEY env var.\n * @property filters - Array of filters applied sequentially to spans before export.\n * Default: `[{ preset: \"excludeHttpRequests\" }]` to reduce framework noise.\n * Pass `null` or `[]` to disable all filtering.\n */\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}\n\nexport type { TraceFilter, Criteria, Match };\n\n/**\n * LangWatchTraceExporter extends the OpenTelemetry OTLP HTTP trace exporter\n * to send trace data to LangWatch with proper authentication and metadata headers.\n *\n * ## Features\n * - Automatic authorization header configuration via API key\n * - SDK version and runtime identification headers\n * - Proper endpoint URL construction for LangWatch ingestion\n * - Intent-based span filtering with presets and custom criteria\n *\n * ## Filtering Behavior\n * - **Default**: HTTP request spans are excluded to reduce framework noise\n * - **Pipeline**: Filters are applied sequentially with AND semantics\n * - **Matching**: All string comparisons are case-sensitive by default\n * - **Array Syntax**: All criteria require arrays of Match objects for explicit filtering\n *\n * ## Filter Types\n * - **Presets**: Pre-configured common filters (`vercelAIOnly`, `excludeHttpRequests`)\n * - **Include**: Keep only spans matching criteria (OR within field, AND across fields)\n * - **Exclude**: Remove spans matching criteria (OR within field, AND across fields)\n *\n * @example Basic usage with default filtering\n * ```typescript\n * import { LangWatchTraceExporter } from '@langwatch/observability';\n *\n * // Default: excludes HTTP request spans\n * const exporter = new LangWatchTraceExporter();\n * ```\n *\n * @example Using presets\n * ```typescript\n * // Keep only Vercel AI SDK spans\n * const exporterAI = new LangWatchTraceExporter({\n * filters: [{ preset: 'vercelAIOnly' }],\n * });\n *\n * // Explicitly exclude HTTP requests (same as default)\n * const exporterNoHttp = new LangWatchTraceExporter({\n * filters: [{ preset: 'excludeHttpRequests' }],\n * });\n *\n * // No filtering at all (send all spans)\n * const exporterAll = new LangWatchTraceExporter({\n * filters: null, // or filters: []\n * });\n * ```\n *\n * @example Custom filtering with criteria\n * ```typescript\n * // Include only spans with specific scope\n * const exporter1 = new LangWatchTraceExporter({\n * filters: [\n * { include: { instrumentationScopeName: [{ equals: 'ai' }] } }\n * ],\n * });\n *\n * // Exclude spans by name pattern\n * const exporter2 = new LangWatchTraceExporter({\n * filters: [\n * { exclude: { name: [{ startsWith: 'internal.' }] } }\n * ],\n * });\n *\n * // Case-insensitive matching\n * const exporter3 = new LangWatchTraceExporter({\n * filters: [\n * { include: { name: [{ equals: 'chat.completion', ignoreCase: true }] } }\n * ],\n * });\n * ```\n *\n * @example Filter pipelines (AND semantics)\n * ```typescript\n * // Keep AI spans, then remove HTTP requests\n * const exporter = new LangWatchTraceExporter({\n * filters: [\n * { include: { instrumentationScopeName: [{ equals: 'ai' }] } },\n * { preset: 'excludeHttpRequests' },\n * ],\n * });\n * ```\n *\n * @example OR semantics within a field\n * ```typescript\n * // Include spans with name starting with 'chat.' OR 'llm.'\n * const exporter = new LangWatchTraceExporter({\n * filters: [\n * {\n * include: {\n * name: [\n * { startsWith: 'chat.' },\n * { startsWith: 'llm.' }\n * ]\n * }\n * }\n * ],\n * });\n * ```\n *\n * @example Using regex patterns\n * ```typescript\n * const exporter = new LangWatchTraceExporter({\n * filters: [\n * {\n * include: {\n * name: [{ matches: /^(chat|llm)\\./i }]\n * }\n * }\n * ],\n * });\n * ```\n */\nexport class LangWatchTraceExporter extends OTLPTraceExporter {\n private readonly filters: TraceFilter[];\n /**\n * Creates a new LangWatchTraceExporter instance.\n *\n * @param opts - Configuration options for the exporter\n * @param opts.apiKey - API key for LangWatch authentication.\n * Falls back to `LANGWATCH_API_KEY` environment variable, then empty string.\n * @param opts.endpoint - Custom endpoint URL for LangWatch ingestion.\n * Falls back to `LANGWATCH_ENDPOINT` environment variable, then default endpoint.\n * @param opts.filters - Array of filters applied sequentially to spans before export (AND semantics).\n * When omitted, defaults to `[{ preset: \"excludeHttpRequests\" }]`.\n * Pass `null` or `[]` to disable all filtering and send all spans.\n *\n * @example\n * ```typescript\n * // With API key and default filtering\n * const exporter = new LangWatchTraceExporter({\n * apiKey: 'your-api-key'\n * });\n *\n * // With custom endpoint and no filtering\n * const exporter = new LangWatchTraceExporter({\n * endpoint: 'https://custom.langwatch.ai',\n * filters: null\n * });\n * ```\n */\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 =\n opts?.endpoint ??\n process.env.LANGWATCH_ENDPOINT ??\n 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 });\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 \"name\": \"langwatch\",\n \"version\": \"1.9.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 \"main\": \"dist/index.js\",\n \"module\": \"dist/index.mjs\",\n \"types\": \"dist/index.d.ts\",\n \"author\": \"LangWatch\",\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=20\",\n \"pnpm\": \">=8\"\n },\n \"files\": [\n \"dist\",\n \"!dist/bin\",\n \"!dist/cli/*.map\",\n \"!dist/plugin\",\n \"README.md\",\n \"LICENSE\"\n ],\n \"bin\": {\n \"lw\": \"./dist/cli/index.js\",\n \"langwatch\": \"./dist/cli/index.js\"\n },\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/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 },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/langwatch/langwatch.git\",\n \"directory\": \"typescript-sdk\"\n },\n \"scripts\": {\n \"generate\": \"pnpm run generate:server-types && pnpm run generate:openapi-types\",\n \"cli\": \"node dist/cli/index.js\",\n \"prelint\": \"pnpm run generate\",\n \"lint\": \"eslint .\",\n \"pretest\": \"pnpm run generate\",\n \"test\": \"vitest\",\n \"test:unit\": \"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 -- bash -c 'cd ../../platform/app && pnpm prisma:seed'\",\n \"prebuild\": \"pnpm run generate\",\n \"build\": \"tsc --noEmit && 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 \"build:plugin-hook\": \"tsup --config tsup.plugin-hook.config.ts\",\n \"tarball\": \"pnpm build && pnpm pack\",\n \"typecheck\": \"tsc --noEmit\",\n \"prepublish\": \"pnpm run build\",\n \"generate:openapi-types\": \"pnpm exec openapi-typescript ../../platform/app/src/app/api/openapiLangWatch.json -o ./src/internal/generated/openapi/api-client.ts && node scripts/patch-generated-openapi.mjs\",\n \"generate:server-types\": \"./copy-types.sh\"\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/langy\": \"workspace:*\",\n \"@opentelemetry/sdk-node\": \"0.221.0\",\n \"@opentelemetry/sdk-trace-node\": \"^2.0.1\",\n \"@opentelemetry/sdk-trace-web\": \">=2.0.1\",\n \"@types/debug\": \"^4.1.12\",\n \"@types/js-yaml\": \"^4.0.9\",\n \"@types/node\": \"^26.2.0\",\n \"@types/prompts\": \"^2.4.9\",\n \"@vercel/otel\": \"^1.13.0\",\n \"@vitest/coverage-v8\": \"^4.1.0\",\n \"dotenv-cli\": \"^11.0.0\",\n \"esbuild\": \"^0.28.1\",\n \"eslint\": \"^9.32.0\",\n \"fets\": \"^0.8.5\",\n \"fishery\": \"^2.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 \"tsup\": \"^8.5.0\",\n \"typescript\": \"^6.0.3\",\n \"typescript-eslint\": \"^8.38.0\",\n \"vitest\": \"^4.1.0\",\n \"vitest-mock-extended\": \"^5.1.1\",\n \"yaml\": \"^2.8.1\"\n },\n \"dependencies\": {\n \"@opentelemetry/api\": \"^1.9.0\",\n \"@opentelemetry/api-logs\": \"0.221.0\",\n \"@opentelemetry/core\": \"^2.0.1\",\n \"@opentelemetry/exporter-logs-otlp-http\": \"0.221.0\",\n \"@opentelemetry/exporter-trace-otlp-http\": \"0.221.0\",\n \"@opentelemetry/instrumentation\": \"0.221.0\",\n \"@opentelemetry/resources\": \"^2.0.1\",\n \"@opentelemetry/sdk-logs\": \"0.221.0\",\n \"@opentelemetry/sdk-metrics\": \"^2.0.1\",\n \"@opentelemetry/sdk-node\": \"^0.221.0\",\n \"@opentelemetry/sdk-trace-base\": \"^2.0.1\",\n \"@opentelemetry/semantic-conventions\": \"^1.36.0\",\n \"chalk\": \"^6.0.0\",\n \"cloudflared\": \"0.7.1\",\n \"commander\": \"^15.0.0\",\n \"dotenv\": \"^17.3.1\",\n \"js-yaml\": \"^5.2.0\",\n \"jsonc-parser\": \"^3.3.1\",\n \"liquidjs\": \"^10.27.0\",\n \"open\": \"^11.0.0\",\n \"openapi-fetch\": \"^0.17.0\",\n \"ora\": \"^9.3.0\",\n \"prompts\": \"^2.4.2\",\n \"xksuid\": \"^0.0.4\",\n \"zod\": \"^4.0.14\"\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/context-async-hooks\": \"^2.1.0\",\n \"@opentelemetry/context-zone\": \">=1.19.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-async-hooks\": {\n \"optional\": true\n },\n \"@opentelemetry/context-zone\": {\n \"optional\": true\n },\n \"@opentelemetry/sdk-trace-web\": {\n \"optional\": true\n },\n \"langchain\": {\n \"optional\": true\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) Optionally override the global object for environment simulation. Only used if NODE_ENV === 'test'.\n */\nexport function detectRuntime(globals?: any): JsRuntime {\n let g = globalThis;\n if (globals) {\n if (process.env.NODE_ENV === \"test\") {\n g = globals;\n } else {\n console.warn(\"[LangWatch Observability] overriding detectRuntime is only supported when running in NODE_ENV=test\");\n }\n }\n\n try {\n if (\n \"Deno\" in g &&\n typeof g.Deno === \"object\" &&\n g.Deno &&\n 'version' in g.Deno &&\n typeof g.Deno.version === \"object\"\n ) {\n return \"deno\";\n }\n if (\n \"Bun\" in g &&\n typeof g.Bun === \"object\" &&\n g.Bun &&\n 'version' in g.Bun &&\n typeof g.Bun.version === \"string\"\n ) {\n return \"bun\";\n }\n if (\n \"process\" in g &&\n typeof g.process === \"object\" &&\n g.process &&\n typeof g.process.versions === \"object\" &&\n typeof g.process.versions.node === \"string\"\n ) {\n return \"node\";\n }\n if (\n typeof g.window?.document !== \"undefined\" &&\n g === g.window\n ) {\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","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\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","/**\n * Authentication header assembly for LangWatch SDK clients.\n *\n * Supports two token families that share the same HTTP surface:\n *\n * 1. `sk-lw-{random}` — legacy project API keys. The token itself carries\n * the project identity, so we emit both `Authorization: Bearer <token>`\n * and `X-Auth-Token: <token>` for backwards compatibility.\n *\n * 2. `sk-lw-{lookupId}_{secret}` or `pat-lw-{lookupId}_{secret}` — API\n * keys (user-scoped). Must be paired with a `projectId` so the server\n * can resolve the correct role binding. When a `projectId` is available\n * we encode both into `Authorization: Basic base64(projectId:token)`.\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 * Returns `true` when the supplied credential is a user-scoped API key\n * (as opposed to a legacy project key).\n *\n * Detection heuristics:\n * - `pat-lw-*` → always a user-scoped key (old format)\n * - `sk-lw-{chars}_{chars}` → user-scoped key (new format, has underscore)\n * - `sk-lw-{chars}` (no underscore) → legacy project key\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/** @deprecated Use `isUserScopedApiKey` instead. Kept for backward compat. */\nexport const isPersonalAccessToken = isUserScopedApiKey;\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 =\n 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(\n `${resolvedProjectId}:${apiKey}`,\n \"utf-8\",\n ).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","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 a sequence of filters to an array of spans using AND semantics.\n * Each filter in the sequence is applied to the result of the previous filter,\n * progressively narrowing down the set of spans.\n *\n * @param filters - Array of filter rules to apply sequentially\n * @param spans - Array of spans to filter\n * @returns Filtered array of spans that match all filter criteria\n *\n * @example\n * ```typescript\n * const filters: TraceFilter[] = [\n * { include: { instrumentationScopeName: [{ equals: 'ai' }] } },\n * { preset: 'excludeHttpRequests' }\n * ];\n * const filtered = applyFilters(filters, spans);\n * // Returns only AI spans that are not HTTP requests\n * ```\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 to an array of spans.\n * Handles three types of filters: presets, include rules, and exclude rules.\n *\n * @param rule - Single filter rule (preset, include, or exclude)\n * @param spans - Array of spans to filter\n * @returns Filtered array of spans based on the rule\n *\n * @example\n * ```typescript\n * // Using preset\n * const filtered1 = applyFilterRule({ preset: 'vercelAIOnly' }, spans);\n *\n * // Using include\n * const filtered2 = applyFilterRule(\n * { include: { name: [{ startsWith: 'llm.' }] } },\n * spans\n * );\n *\n * // Using exclude\n * const filtered3 = applyFilterRule(\n * { exclude: { instrumentationScopeName: [{ equals: 'http' }] } },\n * spans\n * );\n * ```\n */\nexport function applyFilterRule(rule: TraceFilter, spans: ReadableSpan[]): ReadableSpan[] {\n if (\"preset\" in rule && rule.preset) {\n return applyPreset(\n (rule as { preset: TraceFilter extends { preset: infer P } ? P : never }).preset as any,\n spans\n );\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 to an array of spans.\n * Presets are predefined common filtering patterns.\n *\n * Available presets:\n * - `vercelAIOnly`: Keeps only spans from the Vercel AI SDK (instrumentationScope.name === 'ai')\n * - `excludeHttpRequests`: Removes spans that appear to be HTTP requests (span name starts with HTTP verb)\n *\n * @param preset - Name of the preset filter to apply\n * @param spans - Array of spans to filter\n * @returns Filtered array of spans based on the preset\n *\n * @example\n * ```typescript\n * // Keep only Vercel AI spans\n * const aiSpans = applyPreset('vercelAIOnly', spans);\n *\n * // Remove HTTP request spans\n * const noHttpSpans = applyPreset('excludeHttpRequests', spans);\n * ```\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 the given criteria.\n * All specified criteria fields must match (AND semantics within a criteria object).\n * Within each field, matchers are evaluated with OR semantics (any matcher can match).\n *\n * @param span - Span to evaluate\n * @param criteria - Criteria to match against (instrumentationScopeName and/or name)\n * @returns True if the span matches all specified criteria, false otherwise\n *\n * @example\n * ```typescript\n * const criteria: Criteria = {\n * instrumentationScopeName: [{ equals: 'ai' }],\n * name: [{ startsWith: 'llm.' }, { startsWith: 'chat.' }]\n * };\n * const matches = matchesCriteria(span, criteria);\n * // Returns true if scope is 'ai' AND name starts with 'llm.' OR 'chat.'\n * ```\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 value matches a given match rule.\n * Supports three types of matching: exact equality, prefix matching, and regex matching.\n * All matching is case-sensitive by default unless `ignoreCase` is explicitly set to true.\n *\n * @param value - String value to evaluate\n * @param rule - Match rule specifying the matching criteria\n * @returns True if the value matches the rule, false otherwise\n *\n * @example\n * ```typescript\n * // Exact match (case-sensitive by default)\n * valueMatches('GET /api/users', { equals: 'GET /api/users' }); // true\n * valueMatches('get /api/users', { equals: 'GET /api/users' }); // false\n *\n * // Case-insensitive exact match\n * valueMatches('get /api/users', { equals: 'GET /api/users', ignoreCase: true }); // true\n *\n * // Prefix match\n * valueMatches('GET /api/users', { startsWith: 'GET' }); // true\n * valueMatches('POST /api/users', { startsWith: 'GET' }); // false\n *\n * // Regex match\n * valueMatches('GET /api/users', { matches: /^(GET|POST)\\b/ }); // true\n *\n * // Case-insensitive regex\n * valueMatches('get /api/users', { matches: /^GET\\b/, ignoreCase: true }); // true\n * ```\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 re =\n ignoreCase && !rule.matches.flags.includes(\"i\")\n ? new RegExp(rule.matches.source, (rule.matches.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.\n * A span is considered a Vercel AI span if its instrumentation scope name is 'ai' (case-insensitive).\n *\n * @param span - Span to check\n * @returns True if the span is from the Vercel AI SDK, false otherwise\n *\n * @example\n * ```typescript\n * if (isVercelAiSpan(span)) {\n * console.log('This is a Vercel AI operation');\n * }\n * ```\n */\nexport function isVercelAiSpan(span: ReadableSpan): boolean {\n const scope = span.instrumentationScope?.name?.toLowerCase?.() ?? \"\";\n return scope === \"ai\";\n}\n\n/**\n * Checks if a span appears to be an HTTP request based on its name.\n * A span is considered an HTTP request if its name starts with a common HTTP verb\n * (GET, POST, PUT, DELETE, PATCH, OPTIONS, HEAD) followed by a word boundary.\n *\n * @param span - Span to check\n * @returns True if the span appears to be an HTTP request, false otherwise\n *\n * @example\n * ```typescript\n * // These would return true:\n * // span.name = \"GET /api/users\"\n * // span.name = \"POST /api/data\"\n * // span.name = \"DELETE /resource/123\"\n *\n * if (isHttpRequestSpan(span)) {\n * console.log('This is an HTTP request span');\n * }\n * ```\n */\nexport function isHttpRequestSpan(span: ReadableSpan): boolean {\n const name = span.name ?? \"\";\n const verbMatch = /^(GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD)\\b/i.test(name);\n return verbMatch;\n}\n","import { OTLPLogExporter } from \"@opentelemetry/exporter-logs-otlp-http\";\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\";\n\nexport interface LangWatchLogsExporterOptions {\n endpoint?: string;\n apiKey?: string;\n}\n\n/**\n * LangWatchLogsExporter extends the OpenTelemetry OTLP HTTP logs exporter\n * to send logs to LangWatch with proper authentication and metadata headers.\n *\n * This exporter automatically configures:\n * - Authorization headers using the provided API key or environment variables/fallback\n * - SDK version and language identification headers\n * - Proper endpoint configuration for LangWatch ingestion using provided URL or environment variables/fallback\n *\n * @example\n * ```typescript\n * import { LangWatchLogsExporter } from '@langwatch/observability';\n *\n * // Using environment variables/fallback configuration\n * const exporter = new LangWatchLogsExporter();\n *\n * // Using custom options\n * const exporter = new LangWatchLogsExporter({\n * apiKey: 'your-api-key',\n * endpoint: 'https://custom.langwatch.com'\n * });\n * ```\n */\nexport class LangWatchLogsExporter extends OTLPLogExporter {\n /**\n * Creates a new LangWatchLogsExporter instance.\n *\n * @param opts - Optional configuration options for the exporter.\n * @param opts.apiKey - Optional API key for LangWatch authentication. If not provided,\n * will use environment variables or fallback configuration.\n * @param opts.endpoint - Optional custom endpoint URL for LangWatch ingestion.\n * If not provided, will use environment variables or fallback configuration.\n */\n constructor(opts?: LangWatchLogsExporterOptions) {\n const apiKey = opts?.apiKey ?? process.env.LANGWATCH_API_KEY ?? \"\";\n const endpoint =\n opts?.endpoint ??\n process.env.LANGWATCH_ENDPOINT ??\n 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 });\n }\n}\n","/*\n This file contains the values for the OpenTelemetry semantic conventions for GenAI log\n record event names.\n\n 👉 https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-events/\n*/\n\n/**\n * GenAI system message event name\n * Used for log records representing system messages in AI conversations\n */\nexport const LOG_EVNT_GEN_AI_SYSTEM_MESSAGE = \"gen.ai.system_message\";\n\n/**\n * GenAI user message event name\n * Used for log records representing user messages in AI conversations\n */\nexport const LOG_EVNT_GEN_AI_USER_MESSAGE = \"gen.ai.user_message\";\n\n/**\n * GenAI assistant message event name\n * Used for log records representing assistant responses in AI conversations\n */\nexport const LOG_EVNT_GEN_AI_ASSISTANT_MESSAGE = \"gen.ai.assistant_message\";\n\n/**\n * GenAI tool message event name\n * Used for log records representing tool calls or responses in AI conversations\n */\nexport const LOG_EVNT_GEN_AI_TOOL_MESSAGE = \"gen.ai.tool_message\";\n\n/**\n * GenAI choice event name\n * Used for log records representing choices made by AI models\n */\nexport const LOG_EVNT_GEN_AI_CHOICE = \"gen.ai.choice\";\n\n/**\n * LangWatch LangChain callback event name\n * Used for log records representing LangChain callback events\n */\nexport const EVNT_LANGWATCH_LANGCHAIN_CALLBACK = \"langwatch.langchain.callback\";\n","import {\n type Logger,\n type LoggerOptions,\n type LoggerProvider,\n createNoopLogger,\n} from \"@opentelemetry/api-logs\";\nimport {\n type LangWatchLogger,\n} from \"./types\";\nimport { LangWatchLoggerInternal } from \"./implementation\";\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) =>\n createNoopLogger(),\n};\n\n/**\n * The LangWatch-specific global logger provider. It may not be the same as the current\n * OpenTelemetry global logger provider, but it's the last one the `setupObservability`\n * knows about.\n * @internal\n */\nlet currentLoggerProvider: LoggerProvider = NOOP_LOGGER_PROVIDER;\n\n/**\n * @module observability/logger\n * @description\n * Provides LangWatch logger integration with OpenTelemetry, including logger provider\n * management and logger creation utilities.\n *\n * @remarks\n * This module allows you to set a global logger provider, retrieve LangWatch loggers,\n * and wrap OpenTelemetry loggers with LangWatch-specific functionality.\n *\n * @see {@link setLangWatchLoggerProvider}\n * @see {@link getLangWatchLogger}\n * @see {@link getLangWatchLoggerFromProvider}\n * @see {@link createLangWatchLogger}\n */\nexport function setLangWatchLoggerProvider(\n loggerProvider: LoggerProvider,\n): void {\n currentLoggerProvider = loggerProvider;\n}\n\n/**\n * Retrieves a LangWatch logger with the specified name and optional version.\n *\n * @param name - The name of the logger (typically your service or module name).\n * @param version - (Optional) The version of the logger.\n * @returns A {@link LangWatchLogger} instance.\n *\n * @remarks\n * Uses the logger provider set during observability setup. If no provider is set, returns\n * a NoOp logger.\n *\n * @example\n * ```ts\n * const logger = getLangWatchLogger(\"my-service\");\n * logger.info(\"Service started\");\n * ```\n *\n * @see {@link setLangWatchLoggerProvider}\n */\nexport function getLangWatchLogger(\n name: string,\n version?: string,\n): LangWatchLogger {\n return getLangWatchLoggerFromProvider(currentLoggerProvider, name, version);\n}\n\n/**\n * Retrieves a LangWatch logger from a specific OpenTelemetry logger provider.\n *\n * @param loggerProvider - The OpenTelemetry logger provider to use.\n * @param name - The name of the logger.\n * @param version - (Optional) The version of the logger.\n * @returns A {@link LangWatchLogger} instance.\n *\n * @remarks\n * Use this function if you want to use a custom logger provider instead of the global one.\n *\n * @example\n * ```ts\n * const customProvider = new LoggerProvider();\n * const logger = getLangWatchLoggerFromProvider(customProvider, \"custom-service\");\n * ```\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 *\n * @param logger - The OpenTelemetry logger to wrap.\n * @returns A {@link LangWatchLogger} instance.\n *\n * @example\n * ```ts\n * import { Logger } from \"@opentelemetry/api-logs\";\n * const otelLogger = new Logger();\n * const lwLogger = createLangWatchLogger(otelLogger);\n * lwLogger.info(\"Wrapped logger\");\n * ```\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 {\n type AnyValue,\n type Logger,\n} from \"@opentelemetry/api-logs\";\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\";\nimport { shouldCaptureOutput } from \"../config\";\nimport * as intSemconv from \"../semconv\";\nimport { type SemConvLogRecordAttributes } from \"../semconv\";\nimport { context } from \"@opentelemetry/api\";\n\n/**\n * Internal implementation of {@link LangWatchLogger}.\n *\n * @remarks\n * This class wraps an OpenTelemetry logger and adds LangWatch-specific functionality for\n * structured logging and event emission.\n * Not intended for direct use; use {@link getLangWatchLogger} or\n * {@link createLangWatchLogger} instead.\n */\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 { ...body, role: body.role ?? \"system\" } 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 { ...body, role: body.role ?? \"user\" } 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 { ...body, role: body.role ?? \"assistant\" } 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"]}
|
|
File without changes
|