langwatch 0.4.2 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -0
- package/dist/{add-SV662KZU.js → add-CGTO6GC2.js} +65 -40
- package/dist/add-CGTO6GC2.js.map +1 -0
- package/dist/{add-SMYALCQG.mjs → add-XCI65PVN.mjs} +53 -28
- package/dist/add-XCI65PVN.mjs.map +1 -0
- package/dist/{chunk-NVKMXXNP.js → chunk-2GYC6KEA.js} +32 -32
- package/dist/{chunk-NVKMXXNP.js.map → chunk-2GYC6KEA.js.map} +1 -1
- package/dist/{chunk-P5F63PAW.js → chunk-36XAYVMC.js} +186 -76
- package/dist/chunk-36XAYVMC.js.map +1 -0
- package/dist/{chunk-ENSRDEDA.mjs → chunk-3P4ROGZJ.mjs} +4 -4
- package/dist/{chunk-K4ICRI7W.mjs → chunk-AD7QRYIJ.mjs} +2 -2
- package/dist/{chunk-I5NDMIK5.js → chunk-AZHZ4NB4.js} +1 -1
- package/dist/{chunk-I5NDMIK5.js.map → chunk-AZHZ4NB4.js.map} +1 -1
- package/dist/{chunk-YQVVPMKH.mjs → chunk-BTBSMJTY.mjs} +1 -1
- package/dist/chunk-BTBSMJTY.mjs.map +1 -0
- package/dist/{chunk-DISMHYXC.js → chunk-CKIZDPIJ.js} +24 -22
- package/dist/chunk-CKIZDPIJ.js.map +1 -0
- package/dist/{chunk-ZZLIF3DE.js → chunk-DZH6SY3Z.js} +10 -10
- package/dist/{chunk-ZZLIF3DE.js.map → chunk-DZH6SY3Z.js.map} +1 -1
- package/dist/{chunk-N2V6J3U2.mjs → chunk-FEL5FLHA.mjs} +2 -2
- package/dist/{chunk-5ZKAT4KI.mjs → chunk-GAFUPYJ3.mjs} +336 -162
- package/dist/chunk-GAFUPYJ3.mjs.map +1 -0
- package/dist/{chunk-NFM6RB4R.js → chunk-HVW45GST.js} +347 -173
- package/dist/chunk-HVW45GST.js.map +1 -0
- package/dist/{chunk-YNQ44U6D.mjs → chunk-I2SOBPAF.mjs} +23 -21
- package/dist/chunk-I2SOBPAF.mjs.map +1 -0
- package/dist/{chunk-ILTCLEIF.js → chunk-J7B7BNDN.js} +17 -17
- package/dist/chunk-J7B7BNDN.js.map +1 -0
- package/dist/{chunk-VILW5FYO.mjs → chunk-JPWKINZP.mjs} +8 -8
- package/dist/{chunk-VILW5FYO.mjs.map → chunk-JPWKINZP.mjs.map} +1 -1
- package/dist/{chunk-OXBO24RB.js → chunk-OHM7JUMR.js} +15 -2
- package/dist/chunk-OHM7JUMR.js.map +1 -0
- package/dist/chunk-PYVDTUA6.mjs +352 -0
- package/dist/chunk-PYVDTUA6.mjs.map +1 -0
- package/dist/{chunk-YH5TIVK2.js → chunk-SNDTNU3T.js} +2 -2
- package/dist/{chunk-YH5TIVK2.js.map → chunk-SNDTNU3T.js.map} +1 -1
- package/dist/{chunk-CU3443HD.mjs → chunk-URTD2WOC.mjs} +14 -1
- package/dist/{chunk-CAVBDSBT.mjs → chunk-WOBPYIKO.mjs} +2 -2
- package/dist/chunk-WOBPYIKO.mjs.map +1 -0
- package/dist/{chunk-VI5NJ53L.js → chunk-Z3NTWVVA.js} +2 -2
- package/dist/chunk-Z3NTWVVA.js.map +1 -0
- package/dist/cli/index.js +10 -10
- package/dist/cli/index.mjs +9 -9
- package/dist/{create-BHWZP6YD.mjs → create-LXQB4EFB.mjs} +22 -12
- package/dist/create-LXQB4EFB.mjs.map +1 -0
- package/dist/{create-GUY3HZM2.js → create-S5RDGF3H.js} +27 -17
- package/dist/create-S5RDGF3H.js.map +1 -0
- package/dist/{implementation--7B7PUww.d.ts → implementation-DsHp9FYU.d.ts} +1 -1
- package/dist/{implementation-D7LzdQop.d.mts → implementation-nE9dgTwc.d.mts} +1 -1
- package/dist/{index-DTEZr0Jn.d.mts → index-D7rKIGrO.d.mts} +12 -12
- package/dist/{index-DTEZr0Jn.d.ts → index-D7rKIGrO.d.ts} +12 -12
- package/dist/index.d.mts +256 -11
- package/dist/index.d.ts +256 -11
- package/dist/index.js +135 -12
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +133 -10
- package/dist/index.mjs.map +1 -1
- package/dist/init-T4YDPHBA.mjs +15 -0
- package/dist/{init-RDW2F4G3.mjs.map → init-T4YDPHBA.mjs.map} +1 -1
- package/dist/init-UADBKUJU.js +15 -0
- package/dist/init-UADBKUJU.js.map +1 -0
- package/dist/{list-GZGLSJ52.js → list-GRKVAGJS.js} +14 -15
- package/dist/list-GRKVAGJS.js.map +1 -0
- package/dist/{list-32BRZ6RS.mjs → list-XHXVFN24.mjs} +13 -14
- package/dist/list-XHXVFN24.mjs.map +1 -0
- package/dist/{login-IAP4RFUM.js → login-4GWM5I6F.js} +4 -4
- package/dist/{login-IAP4RFUM.js.map → login-4GWM5I6F.js.map} +1 -1
- package/dist/{login-VXLW2OXR.mjs → login-EKE7SFN3.mjs} +3 -3
- package/dist/observability-sdk/index.d.mts +4 -3
- package/dist/observability-sdk/index.d.ts +4 -3
- package/dist/observability-sdk/index.js +7 -7
- package/dist/observability-sdk/index.mjs +6 -6
- package/dist/observability-sdk/instrumentation/langchain/index.d.mts +2 -1
- package/dist/observability-sdk/instrumentation/langchain/index.d.ts +2 -1
- package/dist/observability-sdk/instrumentation/langchain/index.js +19 -19
- package/dist/observability-sdk/instrumentation/langchain/index.mjs +3 -3
- package/dist/observability-sdk/setup/node/index.d.mts +2 -2
- package/dist/observability-sdk/setup/node/index.d.ts +2 -2
- package/dist/observability-sdk/setup/node/index.js +15 -15
- package/dist/observability-sdk/setup/node/index.mjs +4 -4
- package/dist/{remove-N3324KHS.js → remove-7EXB2Z6R.js} +18 -19
- package/dist/remove-7EXB2Z6R.js.map +1 -0
- package/dist/{remove-JUVM6M7G.mjs → remove-W44FQ5MF.mjs} +10 -11
- package/dist/{remove-JUVM6M7G.mjs.map → remove-W44FQ5MF.mjs.map} +1 -1
- package/dist/{sync-E32H3H52.js → sync-V7WRMNJV.js} +41 -40
- package/dist/sync-V7WRMNJV.js.map +1 -0
- package/dist/{sync-B4YK6QYX.mjs → sync-XGFABFAW.mjs} +28 -27
- package/dist/sync-XGFABFAW.mjs.map +1 -0
- package/dist/{types-D6Cs1385.d.ts → types-B9772cUR.d.ts} +146 -27
- package/dist/{types-D61S7yPU.d.mts → types-DbPAi4US.d.mts} +146 -27
- package/package.json +9 -7
- package/dist/add-SMYALCQG.mjs.map +0 -1
- package/dist/add-SV662KZU.js.map +0 -1
- package/dist/chunk-5ZKAT4KI.mjs.map +0 -1
- package/dist/chunk-7ZRAJ52N.mjs +0 -242
- package/dist/chunk-7ZRAJ52N.mjs.map +0 -1
- package/dist/chunk-CAVBDSBT.mjs.map +0 -1
- package/dist/chunk-DISMHYXC.js.map +0 -1
- package/dist/chunk-ILTCLEIF.js.map +0 -1
- package/dist/chunk-LXVDGQA4.mjs +0 -101
- package/dist/chunk-LXVDGQA4.mjs.map +0 -1
- package/dist/chunk-NFM6RB4R.js.map +0 -1
- package/dist/chunk-OXBO24RB.js.map +0 -1
- package/dist/chunk-P5F63PAW.js.map +0 -1
- package/dist/chunk-PUHM465C.js +0 -101
- package/dist/chunk-PUHM465C.js.map +0 -1
- package/dist/chunk-RBZNMZTF.mjs +0 -155
- package/dist/chunk-RBZNMZTF.mjs.map +0 -1
- package/dist/chunk-T7FQHOLK.js +0 -155
- package/dist/chunk-T7FQHOLK.js.map +0 -1
- package/dist/chunk-VI5NJ53L.js.map +0 -1
- package/dist/chunk-YNQ44U6D.mjs.map +0 -1
- package/dist/chunk-YQVVPMKH.mjs.map +0 -1
- package/dist/create-BHWZP6YD.mjs.map +0 -1
- package/dist/create-GUY3HZM2.js.map +0 -1
- package/dist/init-OO2BUJ6V.js +0 -16
- package/dist/init-OO2BUJ6V.js.map +0 -1
- package/dist/init-RDW2F4G3.mjs +0 -16
- package/dist/list-32BRZ6RS.mjs.map +0 -1
- package/dist/list-GZGLSJ52.js.map +0 -1
- package/dist/remove-N3324KHS.js.map +0 -1
- package/dist/sync-B4YK6QYX.mjs.map +0 -1
- package/dist/sync-E32H3H52.js.map +0 -1
- /package/dist/{chunk-ENSRDEDA.mjs.map → chunk-3P4ROGZJ.mjs.map} +0 -0
- /package/dist/{chunk-K4ICRI7W.mjs.map → chunk-AD7QRYIJ.mjs.map} +0 -0
- /package/dist/{chunk-N2V6J3U2.mjs.map → chunk-FEL5FLHA.mjs.map} +0 -0
- /package/dist/{chunk-CU3443HD.mjs.map → chunk-URTD2WOC.mjs.map} +0 -0
- /package/dist/{login-VXLW2OXR.mjs.map → login-EKE7SFN3.mjs.map} +0 -0
package/README.md
CHANGED
|
@@ -257,6 +257,25 @@ span.setAttributes({
|
|
|
257
257
|
});
|
|
258
258
|
```
|
|
259
259
|
|
|
260
|
+
## Testing
|
|
261
|
+
|
|
262
|
+
## Unit and Integration Testing
|
|
263
|
+
|
|
264
|
+
This will run the unit and integration tests. You will need to make sure the values in the `.env` file are set correctly, but you can omit the `E2E_` prefixed variables for these tests.
|
|
265
|
+
|
|
266
|
+
```bash
|
|
267
|
+
pnpm test
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
## E2E Testing
|
|
271
|
+
|
|
272
|
+
For E2E tests, you will need to set the `E2E_` prefixed variables in the `.env` file. You will also need to have run build before.
|
|
273
|
+
|
|
274
|
+
```bash
|
|
275
|
+
pnpm build
|
|
276
|
+
pnpm test:e2e
|
|
277
|
+
```
|
|
278
|
+
|
|
260
279
|
---
|
|
261
280
|
|
|
262
281
|
## Community & Support
|
|
@@ -3,26 +3,22 @@
|
|
|
3
3
|
var _chunkF6E4XQQUjs = require('./chunk-F6E4XQQU.js');
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
var _chunkT7FQHOLKjs = require('./chunk-T7FQHOLK.js');
|
|
7
6
|
|
|
7
|
+
var _chunkHVW45GSTjs = require('./chunk-HVW45GST.js');
|
|
8
|
+
require('./chunk-SNDTNU3T.js');
|
|
9
|
+
require('./chunk-J7B7BNDN.js');
|
|
10
|
+
require('./chunk-2GYC6KEA.js');
|
|
11
|
+
require('./chunk-Z3NTWVVA.js');
|
|
12
|
+
require('./chunk-CKIZDPIJ.js');
|
|
8
13
|
|
|
9
|
-
var _chunkNFM6RB4Rjs = require('./chunk-NFM6RB4R.js');
|
|
10
|
-
require('./chunk-YH5TIVK2.js');
|
|
11
|
-
require('./chunk-ILTCLEIF.js');
|
|
12
|
-
require('./chunk-NVKMXXNP.js');
|
|
13
|
-
require('./chunk-VI5NJ53L.js');
|
|
14
|
-
require('./chunk-DISMHYXC.js');
|
|
15
14
|
|
|
15
|
+
var _chunkDZH6SY3Zjs = require('./chunk-DZH6SY3Z.js');
|
|
16
16
|
|
|
17
|
-
var _chunkZZLIF3DEjs = require('./chunk-ZZLIF3DE.js');
|
|
18
17
|
|
|
19
18
|
|
|
20
|
-
var
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
var _chunkPUHM465Cjs = require('./chunk-PUHM465C.js');
|
|
24
|
-
require('./chunk-I5NDMIK5.js');
|
|
25
|
-
require('./chunk-OXBO24RB.js');
|
|
19
|
+
var _chunk36XAYVMCjs = require('./chunk-36XAYVMC.js');
|
|
20
|
+
require('./chunk-AZHZ4NB4.js');
|
|
21
|
+
require('./chunk-OHM7JUMR.js');
|
|
26
22
|
|
|
27
23
|
// src/cli/commands/add.ts
|
|
28
24
|
var _fs = require('fs'); var fs = _interopRequireWildcard(_fs);
|
|
@@ -35,16 +31,18 @@ var addLocalFile = async (name, localFilePath) => {
|
|
|
35
31
|
process.exit(1);
|
|
36
32
|
}
|
|
37
33
|
if (!localFilePath.endsWith(".prompt.yaml")) {
|
|
38
|
-
console.error(
|
|
34
|
+
console.error(
|
|
35
|
+
_chalk2.default.red(`Error: Local file must have .prompt.yaml extension`)
|
|
36
|
+
);
|
|
39
37
|
process.exit(1);
|
|
40
38
|
}
|
|
41
39
|
try {
|
|
42
|
-
|
|
43
|
-
await
|
|
44
|
-
const promptsConfig =
|
|
40
|
+
_chunk36XAYVMCjs.FileManager.loadLocalPrompt(localFilePath);
|
|
41
|
+
await _chunkDZH6SY3Zjs.ensureProjectInitialized.call(void 0, );
|
|
42
|
+
const promptsConfig = _chunk36XAYVMCjs.FileManager.loadPromptsConfig();
|
|
45
43
|
promptsConfig.prompts[name] = `file:${localFilePath}`;
|
|
46
|
-
|
|
47
|
-
const lock =
|
|
44
|
+
_chunk36XAYVMCjs.FileManager.savePromptsConfig(promptsConfig);
|
|
45
|
+
const lock = _chunk36XAYVMCjs.FileManager.loadPromptsLock();
|
|
48
46
|
lock.prompts[name] = {
|
|
49
47
|
version: 0,
|
|
50
48
|
// Local files start at version 0
|
|
@@ -52,11 +50,19 @@ var addLocalFile = async (name, localFilePath) => {
|
|
|
52
50
|
materialized: localFilePath
|
|
53
51
|
// Store the original file path
|
|
54
52
|
};
|
|
55
|
-
|
|
56
|
-
console.log(
|
|
53
|
+
_chunk36XAYVMCjs.FileManager.savePromptsLock(lock);
|
|
54
|
+
console.log(
|
|
55
|
+
_chalk2.default.green(
|
|
56
|
+
`\u2713 Added local prompt: ${_chalk2.default.cyan(name)} \u2192 ${_chalk2.default.gray(
|
|
57
|
+
localFilePath
|
|
58
|
+
)}`
|
|
59
|
+
)
|
|
60
|
+
);
|
|
57
61
|
} catch (error) {
|
|
58
62
|
console.error(_chalk2.default.red("Error loading local prompt file:"));
|
|
59
|
-
console.error(
|
|
63
|
+
console.error(
|
|
64
|
+
_chalk2.default.red(error instanceof Error ? error.message : String(error))
|
|
65
|
+
);
|
|
60
66
|
process.exit(1);
|
|
61
67
|
}
|
|
62
68
|
};
|
|
@@ -72,45 +78,64 @@ var addCommand = async (name, options) => {
|
|
|
72
78
|
return;
|
|
73
79
|
}
|
|
74
80
|
_chunkF6E4XQQUjs.checkApiKey.call(void 0, );
|
|
75
|
-
const
|
|
81
|
+
const promptsApiService = new (0, _chunkHVW45GSTjs.PromptsApiService)();
|
|
76
82
|
const version = (_a = options.version) != null ? _a : "latest";
|
|
77
|
-
const spinner = _ora2.default.call(void 0,
|
|
83
|
+
const spinner = _ora2.default.call(void 0,
|
|
84
|
+
`Adding ${_chalk2.default.cyan(`${name}@${version}`)}...`
|
|
85
|
+
).start();
|
|
78
86
|
try {
|
|
79
|
-
const prompt = await
|
|
87
|
+
const prompt = await promptsApiService.get(name);
|
|
80
88
|
if (!prompt) {
|
|
81
89
|
spinner.fail();
|
|
82
90
|
console.error(_chalk2.default.red(`Error: Prompt "${name}" not found`));
|
|
83
91
|
process.exit(1);
|
|
84
92
|
}
|
|
85
93
|
spinner.stop();
|
|
86
|
-
await
|
|
94
|
+
await _chunkDZH6SY3Zjs.ensureProjectInitialized.call(void 0, );
|
|
87
95
|
spinner.start(`Adding ${_chalk2.default.cyan(`${name}@${version}`)}...`);
|
|
88
|
-
const materializedPrompt =
|
|
89
|
-
const savedPath =
|
|
96
|
+
const materializedPrompt = _chunk36XAYVMCjs.PromptConverter.fromApiToMaterialized(prompt);
|
|
97
|
+
const savedPath = _chunk36XAYVMCjs.FileManager.saveMaterializedPrompt(
|
|
98
|
+
name,
|
|
99
|
+
materializedPrompt
|
|
100
|
+
);
|
|
90
101
|
const relativePath = path.relative(process.cwd(), savedPath);
|
|
91
|
-
const config =
|
|
92
|
-
const lock =
|
|
102
|
+
const config = _chunk36XAYVMCjs.FileManager.loadPromptsConfig();
|
|
103
|
+
const lock = _chunk36XAYVMCjs.FileManager.loadPromptsLock();
|
|
93
104
|
config.prompts[name] = version;
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
105
|
+
_chunk36XAYVMCjs.FileManager.updateLockEntry(lock, name, materializedPrompt, savedPath);
|
|
106
|
+
_chunk36XAYVMCjs.FileManager.savePromptsConfig(config);
|
|
107
|
+
_chunk36XAYVMCjs.FileManager.savePromptsLock(lock);
|
|
97
108
|
spinner.succeed();
|
|
98
109
|
const displayPath = relativePath.startsWith("./") ? relativePath : `./${relativePath}`;
|
|
99
|
-
console.log(
|
|
110
|
+
console.log(
|
|
111
|
+
_chalk2.default.green(
|
|
112
|
+
`\u2713 Pulled ${_chalk2.default.cyan(`${name}@${version}`)} ${_chalk2.default.gray(
|
|
113
|
+
`(version ${prompt.version})`
|
|
114
|
+
)} \u2192 ${_chalk2.default.gray(displayPath)}`
|
|
115
|
+
)
|
|
116
|
+
);
|
|
100
117
|
} catch (error) {
|
|
101
118
|
spinner.fail();
|
|
102
|
-
if (error instanceof
|
|
119
|
+
if (error instanceof _chunkHVW45GSTjs.PromptsError) {
|
|
103
120
|
console.error(_chalk2.default.red(`Error: ${error.message}`));
|
|
104
121
|
} else {
|
|
105
|
-
console.error(
|
|
122
|
+
console.error(
|
|
123
|
+
_chalk2.default.red(
|
|
124
|
+
`Error adding prompt: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
125
|
+
)
|
|
126
|
+
);
|
|
106
127
|
}
|
|
107
128
|
process.exit(1);
|
|
108
129
|
}
|
|
109
130
|
} catch (error) {
|
|
110
|
-
if (error instanceof
|
|
131
|
+
if (error instanceof _chunkHVW45GSTjs.PromptsError) {
|
|
111
132
|
console.error(_chalk2.default.red(`Error: ${error.message}`));
|
|
112
133
|
} else {
|
|
113
|
-
console.error(
|
|
134
|
+
console.error(
|
|
135
|
+
_chalk2.default.red(
|
|
136
|
+
`Unexpected error: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
137
|
+
)
|
|
138
|
+
);
|
|
114
139
|
}
|
|
115
140
|
process.exit(1);
|
|
116
141
|
}
|
|
@@ -118,4 +143,4 @@ var addCommand = async (name, options) => {
|
|
|
118
143
|
|
|
119
144
|
|
|
120
145
|
exports.addCommand = addCommand;
|
|
121
|
-
//# sourceMappingURL=add-
|
|
146
|
+
//# sourceMappingURL=add-CGTO6GC2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/langwatch/langwatch/typescript-sdk/dist/add-CGTO6GC2.js","../src/cli/commands/add.ts"],"names":[],"mappings":"AAAA;AACE;AACF,sDAA4B;AAC5B;AACE;AACA;AACF,sDAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACE;AACA;AACF,sDAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B;AACA;ACtBA,+DAAoB;AACpB,uEAAsB;AACtB,4EAAkB;AAClB,oEAAgB;AAahB,IAAM,aAAA,EAAe,MAAA,CACnB,IAAA,EACA,aAAA,EAAA,GACkB;AAElB,EAAA,GAAA,CAAI,CAAI,EAAA,CAAA,UAAA,CAAW,aAAa,CAAA,EAAG;AACjC,IAAA,OAAA,CAAQ,KAAA,CAAM,eAAA,CAAM,GAAA,CAAI,CAAA,6BAAA,EAAgC,aAAa,CAAA,CAAA;AACvD,IAAA;AAChB,EAAA;AAE6C,EAAA;AACnC,IAAA;AACwD,MAAA;AAChE,IAAA;AACc,IAAA;AAChB,EAAA;AAGI,EAAA;AACuC,IAAA;AAGV,IAAA;AAGqB,IAAA;AACD,IAAA;AACR,IAAA;AAGF,IAAA;AACpB,IAAA;AACV,MAAA;AAAA;AACE,MAAA;AACG,MAAA;AAAA;AAChB,IAAA;AACgC,IAAA;AAExB,IAAA;AACA,MAAA;AACiD,QAAA;AACnD,UAAA;AACD,QAAA;AACH,MAAA;AACF,IAAA;AACc,EAAA;AAC6C,IAAA;AACnD,IAAA;AAC0D,MAAA;AAClE,IAAA;AACc,IAAA;AAChB,EAAA;AACF;AAKoB;AAzEpB,EAAA;AA0EM,EAAA;AAE+B,IAAA;AAC8B,MAAA;AAC/C,MAAA;AAChB,IAAA;AAGuB,IAAA;AACqB,MAAA;AAC1C,MAAA;AACF,IAAA;AAGY,IAAA;AAEoC,IAAA;AACb,IAAA;AAGnB,IAAA;AAC4B,MAAA;AACpC,IAAA;AAEJ,IAAA;AAE6C,MAAA;AAElC,MAAA;AACE,QAAA;AAC+C,QAAA;AAC9C,QAAA;AAChB,MAAA;AAGa,MAAA;AAGkB,MAAA;AAG8B,MAAA;AAGI,MAAA;AACnC,MAAA;AAC5B,QAAA;AACA,QAAA;AACF,MAAA;AAC2D,MAAA;AAGd,MAAA;AACJ,MAAA;AAElB,MAAA;AACqC,MAAA;AAGxB,MAAA;AACJ,MAAA;AAEhB,MAAA;AAKZ,MAAA;AACI,MAAA;AACA,QAAA;AACkD,UAAA;AAC1B,YAAA;AACE,UAAA;AAChC,QAAA;AACF,MAAA;AACc,IAAA;AACD,MAAA;AACsB,MAAA;AACiB,QAAA;AAC7C,MAAA;AACG,QAAA;AACA,UAAA;AAE6B,YAAA;AAEnC,UAAA;AACF,QAAA;AACF,MAAA;AACc,MAAA;AAChB,IAAA;AACc,EAAA;AACqB,IAAA;AACiB,MAAA;AAC7C,IAAA;AACG,MAAA;AACA,QAAA;AAEuC,UAAA;AAE7C,QAAA;AACF,MAAA;AACF,IAAA;AACc,IAAA;AAChB,EAAA;AACF;ADpC0E;AACA;AACA","file":"/home/runner/work/langwatch/langwatch/typescript-sdk/dist/add-CGTO6GC2.js","sourcesContent":[null,"import * as fs from \"fs\";\nimport * as path from \"path\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { FileManager } from \"../utils/fileManager\";\nimport { PromptsApiService, PromptsError } from \"@/client-sdk/services/prompts\";\nimport { PromptConverter } from \"../utils/promptConverter\";\nimport { ensureProjectInitialized } from \"../utils/init\";\nimport { checkApiKey } from \"../utils/apiKey\";\nimport { LangWatch } from \"@/client-sdk\";\n\ninterface AddOptions {\n version?: string;\n localFile?: string;\n}\n\nconst addLocalFile = async (\n name: string,\n localFilePath: string,\n): Promise<void> => {\n // Validate that the file exists and has the right extension\n if (!fs.existsSync(localFilePath)) {\n console.error(chalk.red(`Error: Local file not found: ${localFilePath}`));\n process.exit(1);\n }\n\n if (!localFilePath.endsWith(\".prompt.yaml\")) {\n console.error(\n chalk.red(`Error: Local file must have .prompt.yaml extension`),\n );\n process.exit(1);\n }\n\n // Load and validate the YAML file\n try {\n FileManager.loadLocalPrompt(localFilePath);\n\n // Ensure project is initialized\n await ensureProjectInitialized();\n\n // Add to prompts.json as a file: dependency\n const promptsConfig = FileManager.loadPromptsConfig();\n promptsConfig.prompts[name] = `file:${localFilePath}`;\n FileManager.savePromptsConfig(promptsConfig);\n\n // Update lock file\n const lock = FileManager.loadPromptsLock();\n lock.prompts[name] = {\n version: 0, // Local files start at version 0\n versionId: \"local\",\n materialized: localFilePath, // Store the original file path\n };\n FileManager.savePromptsLock(lock);\n\n console.log(\n chalk.green(\n `✓ Added local prompt: ${chalk.cyan(name)} → ${chalk.gray(\n localFilePath,\n )}`,\n ),\n );\n } catch (error) {\n console.error(chalk.red(\"Error loading local prompt file:\"));\n console.error(\n chalk.red(error instanceof Error ? error.message : String(error)),\n );\n process.exit(1);\n }\n};\n\nexport const addCommand = async (\n name: string,\n options: AddOptions,\n): Promise<void> => {\n try {\n // Validate prompt name\n if (!name || name.trim() === \"\") {\n console.error(chalk.red(\"Error: Prompt name cannot be empty\"));\n process.exit(1);\n }\n\n // Handle local file addition\n if (options.localFile) {\n await addLocalFile(name, options.localFile);\n return;\n }\n\n // Check API key before doing anything else\n checkApiKey();\n\n const promptsApiService = new PromptsApiService();\n const version = options.version ?? \"latest\";\n\n // Fetch and materialize the prompt (like sync does for individual prompts)\n const spinner = ora(\n `Adding ${chalk.cyan(`${name}@${version}`)}...`,\n ).start();\n\n try {\n // Fetch the prompt from the API\n const prompt = await promptsApiService.get(name);\n\n if (!prompt) {\n spinner.fail();\n console.error(chalk.red(`Error: Prompt \"${name}\" not found`));\n process.exit(1);\n }\n\n // Stop spinner before any user input prompts\n spinner.stop();\n\n // Ensure project is initialized (prompts.json, lock file, directories)\n await ensureProjectInitialized();\n\n // Restart spinner for the actual work\n spinner.start(`Adding ${chalk.cyan(`${name}@${version}`)}...`);\n\n // Convert to MaterializedPrompt format and save\n const materializedPrompt = PromptConverter.fromApiToMaterialized(prompt);\n const savedPath = FileManager.saveMaterializedPrompt(\n name,\n materializedPrompt,\n );\n const relativePath = path.relative(process.cwd(), savedPath);\n\n // Load existing config and lock, add the new dependency\n const config = FileManager.loadPromptsConfig();\n const lock = FileManager.loadPromptsLock();\n\n config.prompts[name] = version;\n FileManager.updateLockEntry(lock, name, materializedPrompt, savedPath);\n\n // Save the updated config and lock\n FileManager.savePromptsConfig(config);\n FileManager.savePromptsLock(lock);\n\n spinner.succeed();\n\n // Show what was done (add ./ prefix for consistency)\n const displayPath = relativePath.startsWith(\"./\")\n ? relativePath\n : `./${relativePath}`;\n console.log(\n chalk.green(\n `✓ Pulled ${chalk.cyan(`${name}@${version}`)} ${chalk.gray(\n `(version ${prompt.version})`,\n )} → ${chalk.gray(displayPath)}`,\n ),\n );\n } catch (error) {\n spinner.fail();\n if (error instanceof PromptsError) {\n console.error(chalk.red(`Error: ${error.message}`));\n } else {\n console.error(\n chalk.red(\n `Error adding prompt: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`,\n ),\n );\n }\n process.exit(1);\n }\n } catch (error) {\n if (error instanceof PromptsError) {\n console.error(chalk.red(`Error: ${error.message}`));\n } else {\n console.error(\n chalk.red(\n `Unexpected error: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`,\n ),\n );\n }\n process.exit(1);\n }\n};\n"]}
|
|
@@ -2,27 +2,23 @@ import {
|
|
|
2
2
|
checkApiKey
|
|
3
3
|
} from "./chunk-DHJKJVY7.mjs";
|
|
4
4
|
import {
|
|
5
|
-
|
|
6
|
-
} from "./chunk-RBZNMZTF.mjs";
|
|
7
|
-
import {
|
|
5
|
+
PromptsApiService,
|
|
8
6
|
PromptsError
|
|
9
|
-
} from "./chunk-
|
|
10
|
-
import "./chunk-
|
|
11
|
-
import "./chunk-
|
|
12
|
-
import "./chunk-
|
|
13
|
-
import "./chunk-
|
|
14
|
-
import "./chunk-
|
|
7
|
+
} from "./chunk-GAFUPYJ3.mjs";
|
|
8
|
+
import "./chunk-FEL5FLHA.mjs";
|
|
9
|
+
import "./chunk-JPWKINZP.mjs";
|
|
10
|
+
import "./chunk-3P4ROGZJ.mjs";
|
|
11
|
+
import "./chunk-WOBPYIKO.mjs";
|
|
12
|
+
import "./chunk-I2SOBPAF.mjs";
|
|
15
13
|
import {
|
|
16
14
|
ensureProjectInitialized
|
|
17
|
-
} from "./chunk-
|
|
18
|
-
import {
|
|
19
|
-
FileManager
|
|
20
|
-
} from "./chunk-7ZRAJ52N.mjs";
|
|
15
|
+
} from "./chunk-AD7QRYIJ.mjs";
|
|
21
16
|
import {
|
|
17
|
+
FileManager,
|
|
22
18
|
PromptConverter
|
|
23
|
-
} from "./chunk-
|
|
24
|
-
import "./chunk-
|
|
25
|
-
import "./chunk-
|
|
19
|
+
} from "./chunk-PYVDTUA6.mjs";
|
|
20
|
+
import "./chunk-BTBSMJTY.mjs";
|
|
21
|
+
import "./chunk-URTD2WOC.mjs";
|
|
26
22
|
|
|
27
23
|
// src/cli/commands/add.ts
|
|
28
24
|
import * as fs from "fs";
|
|
@@ -35,11 +31,13 @@ var addLocalFile = async (name, localFilePath) => {
|
|
|
35
31
|
process.exit(1);
|
|
36
32
|
}
|
|
37
33
|
if (!localFilePath.endsWith(".prompt.yaml")) {
|
|
38
|
-
console.error(
|
|
34
|
+
console.error(
|
|
35
|
+
chalk.red(`Error: Local file must have .prompt.yaml extension`)
|
|
36
|
+
);
|
|
39
37
|
process.exit(1);
|
|
40
38
|
}
|
|
41
39
|
try {
|
|
42
|
-
|
|
40
|
+
FileManager.loadLocalPrompt(localFilePath);
|
|
43
41
|
await ensureProjectInitialized();
|
|
44
42
|
const promptsConfig = FileManager.loadPromptsConfig();
|
|
45
43
|
promptsConfig.prompts[name] = `file:${localFilePath}`;
|
|
@@ -53,10 +51,18 @@ var addLocalFile = async (name, localFilePath) => {
|
|
|
53
51
|
// Store the original file path
|
|
54
52
|
};
|
|
55
53
|
FileManager.savePromptsLock(lock);
|
|
56
|
-
console.log(
|
|
54
|
+
console.log(
|
|
55
|
+
chalk.green(
|
|
56
|
+
`\u2713 Added local prompt: ${chalk.cyan(name)} \u2192 ${chalk.gray(
|
|
57
|
+
localFilePath
|
|
58
|
+
)}`
|
|
59
|
+
)
|
|
60
|
+
);
|
|
57
61
|
} catch (error) {
|
|
58
62
|
console.error(chalk.red("Error loading local prompt file:"));
|
|
59
|
-
console.error(
|
|
63
|
+
console.error(
|
|
64
|
+
chalk.red(error instanceof Error ? error.message : String(error))
|
|
65
|
+
);
|
|
60
66
|
process.exit(1);
|
|
61
67
|
}
|
|
62
68
|
};
|
|
@@ -72,11 +78,13 @@ var addCommand = async (name, options) => {
|
|
|
72
78
|
return;
|
|
73
79
|
}
|
|
74
80
|
checkApiKey();
|
|
75
|
-
const
|
|
81
|
+
const promptsApiService = new PromptsApiService();
|
|
76
82
|
const version = (_a = options.version) != null ? _a : "latest";
|
|
77
|
-
const spinner = ora(
|
|
83
|
+
const spinner = ora(
|
|
84
|
+
`Adding ${chalk.cyan(`${name}@${version}`)}...`
|
|
85
|
+
).start();
|
|
78
86
|
try {
|
|
79
|
-
const prompt = await
|
|
87
|
+
const prompt = await promptsApiService.get(name);
|
|
80
88
|
if (!prompt) {
|
|
81
89
|
spinner.fail();
|
|
82
90
|
console.error(chalk.red(`Error: Prompt "${name}" not found`));
|
|
@@ -86,7 +94,10 @@ var addCommand = async (name, options) => {
|
|
|
86
94
|
await ensureProjectInitialized();
|
|
87
95
|
spinner.start(`Adding ${chalk.cyan(`${name}@${version}`)}...`);
|
|
88
96
|
const materializedPrompt = PromptConverter.fromApiToMaterialized(prompt);
|
|
89
|
-
const savedPath = FileManager.saveMaterializedPrompt(
|
|
97
|
+
const savedPath = FileManager.saveMaterializedPrompt(
|
|
98
|
+
name,
|
|
99
|
+
materializedPrompt
|
|
100
|
+
);
|
|
90
101
|
const relativePath = path.relative(process.cwd(), savedPath);
|
|
91
102
|
const config = FileManager.loadPromptsConfig();
|
|
92
103
|
const lock = FileManager.loadPromptsLock();
|
|
@@ -96,13 +107,23 @@ var addCommand = async (name, options) => {
|
|
|
96
107
|
FileManager.savePromptsLock(lock);
|
|
97
108
|
spinner.succeed();
|
|
98
109
|
const displayPath = relativePath.startsWith("./") ? relativePath : `./${relativePath}`;
|
|
99
|
-
console.log(
|
|
110
|
+
console.log(
|
|
111
|
+
chalk.green(
|
|
112
|
+
`\u2713 Pulled ${chalk.cyan(`${name}@${version}`)} ${chalk.gray(
|
|
113
|
+
`(version ${prompt.version})`
|
|
114
|
+
)} \u2192 ${chalk.gray(displayPath)}`
|
|
115
|
+
)
|
|
116
|
+
);
|
|
100
117
|
} catch (error) {
|
|
101
118
|
spinner.fail();
|
|
102
119
|
if (error instanceof PromptsError) {
|
|
103
120
|
console.error(chalk.red(`Error: ${error.message}`));
|
|
104
121
|
} else {
|
|
105
|
-
console.error(
|
|
122
|
+
console.error(
|
|
123
|
+
chalk.red(
|
|
124
|
+
`Error adding prompt: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
125
|
+
)
|
|
126
|
+
);
|
|
106
127
|
}
|
|
107
128
|
process.exit(1);
|
|
108
129
|
}
|
|
@@ -110,7 +131,11 @@ var addCommand = async (name, options) => {
|
|
|
110
131
|
if (error instanceof PromptsError) {
|
|
111
132
|
console.error(chalk.red(`Error: ${error.message}`));
|
|
112
133
|
} else {
|
|
113
|
-
console.error(
|
|
134
|
+
console.error(
|
|
135
|
+
chalk.red(
|
|
136
|
+
`Unexpected error: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
137
|
+
)
|
|
138
|
+
);
|
|
114
139
|
}
|
|
115
140
|
process.exit(1);
|
|
116
141
|
}
|
|
@@ -118,4 +143,4 @@ var addCommand = async (name, options) => {
|
|
|
118
143
|
export {
|
|
119
144
|
addCommand
|
|
120
145
|
};
|
|
121
|
-
//# sourceMappingURL=add-
|
|
146
|
+
//# sourceMappingURL=add-XCI65PVN.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/commands/add.ts"],"sourcesContent":["import * as fs from \"fs\";\nimport * as path from \"path\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { FileManager } from \"../utils/fileManager\";\nimport { PromptsApiService, PromptsError } from \"@/client-sdk/services/prompts\";\nimport { PromptConverter } from \"../utils/promptConverter\";\nimport { ensureProjectInitialized } from \"../utils/init\";\nimport { checkApiKey } from \"../utils/apiKey\";\nimport { LangWatch } from \"@/client-sdk\";\n\ninterface AddOptions {\n version?: string;\n localFile?: string;\n}\n\nconst addLocalFile = async (\n name: string,\n localFilePath: string,\n): Promise<void> => {\n // Validate that the file exists and has the right extension\n if (!fs.existsSync(localFilePath)) {\n console.error(chalk.red(`Error: Local file not found: ${localFilePath}`));\n process.exit(1);\n }\n\n if (!localFilePath.endsWith(\".prompt.yaml\")) {\n console.error(\n chalk.red(`Error: Local file must have .prompt.yaml extension`),\n );\n process.exit(1);\n }\n\n // Load and validate the YAML file\n try {\n FileManager.loadLocalPrompt(localFilePath);\n\n // Ensure project is initialized\n await ensureProjectInitialized();\n\n // Add to prompts.json as a file: dependency\n const promptsConfig = FileManager.loadPromptsConfig();\n promptsConfig.prompts[name] = `file:${localFilePath}`;\n FileManager.savePromptsConfig(promptsConfig);\n\n // Update lock file\n const lock = FileManager.loadPromptsLock();\n lock.prompts[name] = {\n version: 0, // Local files start at version 0\n versionId: \"local\",\n materialized: localFilePath, // Store the original file path\n };\n FileManager.savePromptsLock(lock);\n\n console.log(\n chalk.green(\n `✓ Added local prompt: ${chalk.cyan(name)} → ${chalk.gray(\n localFilePath,\n )}`,\n ),\n );\n } catch (error) {\n console.error(chalk.red(\"Error loading local prompt file:\"));\n console.error(\n chalk.red(error instanceof Error ? error.message : String(error)),\n );\n process.exit(1);\n }\n};\n\nexport const addCommand = async (\n name: string,\n options: AddOptions,\n): Promise<void> => {\n try {\n // Validate prompt name\n if (!name || name.trim() === \"\") {\n console.error(chalk.red(\"Error: Prompt name cannot be empty\"));\n process.exit(1);\n }\n\n // Handle local file addition\n if (options.localFile) {\n await addLocalFile(name, options.localFile);\n return;\n }\n\n // Check API key before doing anything else\n checkApiKey();\n\n const promptsApiService = new PromptsApiService();\n const version = options.version ?? \"latest\";\n\n // Fetch and materialize the prompt (like sync does for individual prompts)\n const spinner = ora(\n `Adding ${chalk.cyan(`${name}@${version}`)}...`,\n ).start();\n\n try {\n // Fetch the prompt from the API\n const prompt = await promptsApiService.get(name);\n\n if (!prompt) {\n spinner.fail();\n console.error(chalk.red(`Error: Prompt \"${name}\" not found`));\n process.exit(1);\n }\n\n // Stop spinner before any user input prompts\n spinner.stop();\n\n // Ensure project is initialized (prompts.json, lock file, directories)\n await ensureProjectInitialized();\n\n // Restart spinner for the actual work\n spinner.start(`Adding ${chalk.cyan(`${name}@${version}`)}...`);\n\n // Convert to MaterializedPrompt format and save\n const materializedPrompt = PromptConverter.fromApiToMaterialized(prompt);\n const savedPath = FileManager.saveMaterializedPrompt(\n name,\n materializedPrompt,\n );\n const relativePath = path.relative(process.cwd(), savedPath);\n\n // Load existing config and lock, add the new dependency\n const config = FileManager.loadPromptsConfig();\n const lock = FileManager.loadPromptsLock();\n\n config.prompts[name] = version;\n FileManager.updateLockEntry(lock, name, materializedPrompt, savedPath);\n\n // Save the updated config and lock\n FileManager.savePromptsConfig(config);\n FileManager.savePromptsLock(lock);\n\n spinner.succeed();\n\n // Show what was done (add ./ prefix for consistency)\n const displayPath = relativePath.startsWith(\"./\")\n ? relativePath\n : `./${relativePath}`;\n console.log(\n chalk.green(\n `✓ Pulled ${chalk.cyan(`${name}@${version}`)} ${chalk.gray(\n `(version ${prompt.version})`,\n )} → ${chalk.gray(displayPath)}`,\n ),\n );\n } catch (error) {\n spinner.fail();\n if (error instanceof PromptsError) {\n console.error(chalk.red(`Error: ${error.message}`));\n } else {\n console.error(\n chalk.red(\n `Error adding prompt: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`,\n ),\n );\n }\n process.exit(1);\n }\n } catch (error) {\n if (error instanceof PromptsError) {\n console.error(chalk.red(`Error: ${error.message}`));\n } else {\n console.error(\n chalk.red(\n `Unexpected error: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`,\n ),\n );\n }\n process.exit(1);\n }\n};\n"],"mappings":"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","names":[]}
|
|
@@ -6,14 +6,14 @@
|
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
var
|
|
9
|
+
var _chunkZ3NTWVVAjs = require('./chunk-Z3NTWVVA.js');
|
|
10
10
|
|
|
11
11
|
|
|
12
|
-
var
|
|
12
|
+
var _chunkCKIZDPIJjs = require('./chunk-CKIZDPIJ.js');
|
|
13
13
|
|
|
14
14
|
|
|
15
15
|
|
|
16
|
-
var
|
|
16
|
+
var _chunkOHM7JUMRjs = require('./chunk-OHM7JUMR.js');
|
|
17
17
|
|
|
18
18
|
// src/observability-sdk/exporters/langwatch-trace-exporter.ts
|
|
19
19
|
var _exportertraceotlphttp = require('@opentelemetry/exporter-trace-otlp-http');
|
|
@@ -32,7 +32,7 @@ var LangWatchTraceExporter = class extends _exportertraceotlphttp.OTLPTraceExpor
|
|
|
32
32
|
constructor(opts) {
|
|
33
33
|
var _a, _b, _c, _d;
|
|
34
34
|
const apiKey = (_b = (_a = opts == null ? void 0 : opts.apiKey) != null ? _a : process.env.LANGWATCH_API_KEY) != null ? _b : "";
|
|
35
|
-
const endpoint = (_d = (_c = opts == null ? void 0 : opts.endpoint) != null ? _c : process.env.LANGWATCH_ENDPOINT) != null ? _d :
|
|
35
|
+
const endpoint = (_d = (_c = opts == null ? void 0 : opts.endpoint) != null ? _c : process.env.LANGWATCH_ENDPOINT) != null ? _d : _chunkZ3NTWVVAjs.DEFAULT_ENDPOINT;
|
|
36
36
|
if (opts && opts.includeAllSpans !== void 0) {
|
|
37
37
|
console.warn(
|
|
38
38
|
"[LangWatchExporter] The behavior of `includeAllSpans` is deprecated and will be removed in a future version"
|
|
@@ -43,14 +43,14 @@ var LangWatchTraceExporter = class extends _exportertraceotlphttp.OTLPTraceExpor
|
|
|
43
43
|
"[LangWatchExporter] The behavior of `debug` is deprecated and will be removed in a future version"
|
|
44
44
|
);
|
|
45
45
|
}
|
|
46
|
-
const url = new URL(
|
|
46
|
+
const url = new URL(_chunkZ3NTWVVAjs.TRACES_PATH, endpoint);
|
|
47
47
|
const otelEndpoint = url.toString();
|
|
48
48
|
super({
|
|
49
|
-
headers:
|
|
50
|
-
"x-langwatch-sdk-name":
|
|
51
|
-
"x-langwatch-sdk-language":
|
|
52
|
-
"x-langwatch-sdk-version":
|
|
53
|
-
"x-langwatch-sdk-runtime":
|
|
49
|
+
headers: _chunkOHM7JUMRjs.__spreadValues.call(void 0, {
|
|
50
|
+
"x-langwatch-sdk-name": _chunkZ3NTWVVAjs.LANGWATCH_SDK_NAME_OBSERVABILITY,
|
|
51
|
+
"x-langwatch-sdk-language": _chunkZ3NTWVVAjs.LANGWATCH_SDK_LANGUAGE,
|
|
52
|
+
"x-langwatch-sdk-version": _chunkZ3NTWVVAjs.LANGWATCH_SDK_VERSION,
|
|
53
|
+
"x-langwatch-sdk-runtime": _chunkZ3NTWVVAjs.LANGWATCH_SDK_RUNTIME.call(void 0, )
|
|
54
54
|
}, apiKey ? { authorization: `Bearer ${apiKey}` } : {}),
|
|
55
55
|
url: otelEndpoint.toString()
|
|
56
56
|
});
|
|
@@ -72,15 +72,15 @@ var LangWatchLogsExporter = class extends _exporterlogsotlphttp.OTLPLogExporter
|
|
|
72
72
|
constructor(opts) {
|
|
73
73
|
var _a, _b, _c, _d;
|
|
74
74
|
const apiKey = (_b = (_a = opts == null ? void 0 : opts.apiKey) != null ? _a : process.env.LANGWATCH_API_KEY) != null ? _b : "";
|
|
75
|
-
const endpoint = (_d = (_c = opts == null ? void 0 : opts.endpoint) != null ? _c : process.env.LANGWATCH_ENDPOINT) != null ? _d :
|
|
76
|
-
const url = new URL(
|
|
75
|
+
const endpoint = (_d = (_c = opts == null ? void 0 : opts.endpoint) != null ? _c : process.env.LANGWATCH_ENDPOINT) != null ? _d : _chunkZ3NTWVVAjs.DEFAULT_ENDPOINT;
|
|
76
|
+
const url = new URL(_chunkZ3NTWVVAjs.LOGS_PATH, endpoint);
|
|
77
77
|
const otelEndpoint = url.toString();
|
|
78
78
|
super({
|
|
79
|
-
headers:
|
|
80
|
-
"x-langwatch-sdk-name":
|
|
81
|
-
"x-langwatch-sdk-language":
|
|
82
|
-
"x-langwatch-sdk-version":
|
|
83
|
-
"x-langwatch-sdk-runtime":
|
|
79
|
+
headers: _chunkOHM7JUMRjs.__spreadValues.call(void 0, {
|
|
80
|
+
"x-langwatch-sdk-name": _chunkZ3NTWVVAjs.LANGWATCH_SDK_NAME_OBSERVABILITY,
|
|
81
|
+
"x-langwatch-sdk-language": _chunkZ3NTWVVAjs.LANGWATCH_SDK_LANGUAGE,
|
|
82
|
+
"x-langwatch-sdk-version": _chunkZ3NTWVVAjs.LANGWATCH_SDK_VERSION,
|
|
83
|
+
"x-langwatch-sdk-runtime": _chunkZ3NTWVVAjs.LANGWATCH_SDK_RUNTIME.call(void 0, )
|
|
84
84
|
}, apiKey ? { authorization: `Bearer ${apiKey}` } : {}),
|
|
85
85
|
url: otelEndpoint.toString()
|
|
86
86
|
});
|
|
@@ -106,7 +106,7 @@ var LangWatchLoggerInternal = class {
|
|
|
106
106
|
this.logger = logger;
|
|
107
107
|
}
|
|
108
108
|
emit(logRecord, options) {
|
|
109
|
-
if (!
|
|
109
|
+
if (!_chunkCKIZDPIJjs.shouldCaptureOutput.call(void 0, )) {
|
|
110
110
|
logRecord.body = void 0;
|
|
111
111
|
}
|
|
112
112
|
if (!logRecord.context && !(options == null ? void 0 : options.excludeContext)) {
|
|
@@ -118,8 +118,8 @@ var LangWatchLoggerInternal = class {
|
|
|
118
118
|
var _a;
|
|
119
119
|
this.emitGenAIEvent(
|
|
120
120
|
LOG_EVNT_GEN_AI_SYSTEM_MESSAGE,
|
|
121
|
-
|
|
122
|
-
|
|
121
|
+
_chunkOHM7JUMRjs.__spreadProps.call(void 0, _chunkOHM7JUMRjs.__spreadValues.call(void 0, {}, body), { role: (_a = body.role) != null ? _a : "system" }),
|
|
122
|
+
_chunkOHM7JUMRjs.__spreadProps.call(void 0, _chunkOHM7JUMRjs.__spreadValues.call(void 0, {}, attributes), {
|
|
123
123
|
"gen_ai.system": system
|
|
124
124
|
})
|
|
125
125
|
);
|
|
@@ -128,8 +128,8 @@ var LangWatchLoggerInternal = class {
|
|
|
128
128
|
var _a;
|
|
129
129
|
this.emitGenAIEvent(
|
|
130
130
|
LOG_EVNT_GEN_AI_USER_MESSAGE,
|
|
131
|
-
|
|
132
|
-
|
|
131
|
+
_chunkOHM7JUMRjs.__spreadProps.call(void 0, _chunkOHM7JUMRjs.__spreadValues.call(void 0, {}, body), { role: (_a = body.role) != null ? _a : "user" }),
|
|
132
|
+
_chunkOHM7JUMRjs.__spreadProps.call(void 0, _chunkOHM7JUMRjs.__spreadValues.call(void 0, {}, attributes), {
|
|
133
133
|
"gen_ai.system": system
|
|
134
134
|
})
|
|
135
135
|
);
|
|
@@ -138,8 +138,8 @@ var LangWatchLoggerInternal = class {
|
|
|
138
138
|
var _a;
|
|
139
139
|
this.emitGenAIEvent(
|
|
140
140
|
LOG_EVNT_GEN_AI_ASSISTANT_MESSAGE,
|
|
141
|
-
|
|
142
|
-
|
|
141
|
+
_chunkOHM7JUMRjs.__spreadProps.call(void 0, _chunkOHM7JUMRjs.__spreadValues.call(void 0, {}, body), { role: (_a = body.role) != null ? _a : "assistant" }),
|
|
142
|
+
_chunkOHM7JUMRjs.__spreadProps.call(void 0, _chunkOHM7JUMRjs.__spreadValues.call(void 0, {}, attributes), {
|
|
143
143
|
"gen_ai.system": system
|
|
144
144
|
})
|
|
145
145
|
);
|
|
@@ -150,8 +150,8 @@ var LangWatchLoggerInternal = class {
|
|
|
150
150
|
}
|
|
151
151
|
this.emitGenAIEvent(
|
|
152
152
|
LOG_EVNT_GEN_AI_TOOL_MESSAGE,
|
|
153
|
-
|
|
154
|
-
|
|
153
|
+
_chunkOHM7JUMRjs.__spreadValues.call(void 0, {}, body),
|
|
154
|
+
_chunkOHM7JUMRjs.__spreadProps.call(void 0, _chunkOHM7JUMRjs.__spreadValues.call(void 0, {}, attributes), {
|
|
155
155
|
"gen_ai.system": system
|
|
156
156
|
})
|
|
157
157
|
);
|
|
@@ -163,10 +163,10 @@ var LangWatchLoggerInternal = class {
|
|
|
163
163
|
}
|
|
164
164
|
this.emitGenAIEvent(
|
|
165
165
|
LOG_EVNT_GEN_AI_CHOICE,
|
|
166
|
-
|
|
167
|
-
message:
|
|
166
|
+
_chunkOHM7JUMRjs.__spreadProps.call(void 0, _chunkOHM7JUMRjs.__spreadValues.call(void 0, {}, body), {
|
|
167
|
+
message: _chunkOHM7JUMRjs.__spreadProps.call(void 0, _chunkOHM7JUMRjs.__spreadValues.call(void 0, {}, body.message), { role: (_b = (_a = body.message) == null ? void 0 : _a.role) != null ? _b : "assistant" })
|
|
168
168
|
}),
|
|
169
|
-
|
|
169
|
+
_chunkOHM7JUMRjs.__spreadProps.call(void 0, _chunkOHM7JUMRjs.__spreadValues.call(void 0, {}, attributes), {
|
|
170
170
|
"gen_ai.system": system
|
|
171
171
|
})
|
|
172
172
|
);
|
|
@@ -175,8 +175,8 @@ var LangWatchLoggerInternal = class {
|
|
|
175
175
|
this.emit({
|
|
176
176
|
eventName,
|
|
177
177
|
context: _api.context.active(),
|
|
178
|
-
attributes:
|
|
179
|
-
body:
|
|
178
|
+
attributes: _chunkOHM7JUMRjs.__spreadValues.call(void 0, {}, attributes),
|
|
179
|
+
body: _chunkCKIZDPIJjs.shouldCaptureOutput.call(void 0, ) ? body : void 0,
|
|
180
180
|
observedTimestamp: (/* @__PURE__ */ new Date()).getTime()
|
|
181
181
|
});
|
|
182
182
|
}
|
|
@@ -204,4 +204,4 @@ function createLangWatchLogger(logger) {
|
|
|
204
204
|
|
|
205
205
|
|
|
206
206
|
exports.LangWatchTraceExporter = LangWatchTraceExporter; exports.LangWatchLogsExporter = LangWatchLogsExporter; exports.setLangWatchLoggerProvider = setLangWatchLoggerProvider; exports.getLangWatchLogger = getLangWatchLogger; exports.getLangWatchLoggerFromProvider = getLangWatchLoggerFromProvider;
|
|
207
|
-
//# sourceMappingURL=chunk-
|
|
207
|
+
//# sourceMappingURL=chunk-2GYC6KEA.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/langwatch/langwatch/typescript-sdk/dist/chunk-NVKMXXNP.js","../src/observability-sdk/exporters/langwatch-trace-exporter.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/typescript-sdk/dist/chunk-NVKMXXNP.js","sourcesContent":[null,"import { OTLPTraceExporter } from \"@opentelemetry/exporter-trace-otlp-http\";\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\";\n\nexport interface LangWatchTraceExporterOptions {\n endpoint?: string;\n apiKey?: string;\n includeAllSpans?: boolean;\n debug?: boolean;\n}\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 * 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 { LangWatchTraceExporter } from '@langwatch/observability';\n *\n * // Using environment variables/fallback configuration\n * const exporter = new LangWatchTraceExporter();\n *\n * // Using custom options\n * const exporter = new LangWatchTraceExporter({\n * apiKey: 'your-api-key',\n * endpoint: 'https://custom.langwatch.com'\n * });\n * ```\n */\nexport class LangWatchTraceExporter extends OTLPTraceExporter {\n /**\n * Creates a new LangWatchExporter 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 * @param opts.includeAllSpans - Deprecated: This option is deprecated and will be removed in a future version\n * @param opts.debug - Deprecated: This option is deprecated and will be removed in a future version\n */\n constructor(opts?: LangWatchTraceExporterOptions) {\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 if (opts && opts.includeAllSpans !== void 0) {\n console.warn(\n \"[LangWatchExporter] The behavior of `includeAllSpans` is deprecated and will be removed in a future version\",\n );\n }\n if (opts && opts.debug !== void 0) {\n console.warn(\n \"[LangWatchExporter] The behavior of `debug` is deprecated and will be removed in a future version\",\n );\n }\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 ...(apiKey ? { authorization: `Bearer ${apiKey}` } : {}),\n },\n url: otelEndpoint.toString(),\n });\n }\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 LoggerProvider,\n NoopLoggerProvider,\n} from \"@opentelemetry/api-logs\";\nimport {\n type LangWatchLogger,\n} from \"./types\";\nimport { LangWatchLoggerInternal } from \"./implementation\";\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 = new NoopLoggerProvider();\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 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"]}
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/langwatch/langwatch/typescript-sdk/dist/chunk-2GYC6KEA.js","../src/observability-sdk/exporters/langwatch-trace-exporter.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":"AAAA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACE;AACA;AACF,sDAA4B;AAC5B;AACA;ACjBA,gFAAkC;AAwC3B,IAAM,uBAAA,EAAN,MAAA,QAAqC,yCAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAY5D,WAAA,CAAY,IAAA,EAAsC;AApDpD,IAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAqDI,IAAA,MAAM,OAAA,EAAA,CAAS,GAAA,EAAA,CAAA,GAAA,EAAA,KAAA,GAAA,KAAA,EAAA,KAAA,EAAA,EAAA,IAAA,CAAM,MAAA,EAAA,GAAN,KAAA,EAAA,GAAA,EAAgB,OAAA,CAAQ,GAAA,CAAI,iBAAA,EAAA,GAA5B,KAAA,EAAA,GAAA,EAAiD,EAAA;AAChE,IAAA,MAAM,SAAA,EAAA,CACJ,GAAA,EAAA,CAAA,GAAA,EAAA,KAAA,GAAA,KAAA,EAAA,KAAA,EAAA,EAAA,IAAA,CAAM,QAAA,EAAA,GAAN,KAAA,EAAA,GAAA,EACA,OAAA,CAAQ,GAAA,CAAI,kBAAA,EAAA,GADZ,KAAA,EAAA,GAAA,EAEA,iCAAA;AAEF,IAAA,GAAA,CAAI,KAAA,GAAQ,IAAA,CAAK,gBAAA,IAAoB,KAAA,CAAA,EAAQ;AAC3C,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN;AAAA,MACF,CAAA;AAAA,IACF;AACA,IAAA,GAAA,CAAI,KAAA,GAAQ,IAAA,CAAK,MAAA,IAAU,KAAA,CAAA,EAAQ;AACjC,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN;AAAA,MACF,CAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,EAAM,IAAI,GAAA,CAAI,4BAAA,EAAa,QAAQ,CAAA;AACzC,IAAA,MAAM,aAAA,EAAe,GAAA,CAAI,QAAA,CAAS,CAAA;AAElC,IAAA,KAAA,CAAM;AAAA,MACJ,OAAA,EAAS,6CAAA;AAAA,QACP,sBAAA,EAAwB,iDAAA;AAAA,QACxB,0BAAA,EAA4B,uCAAA;AAAA,QAC5B,yBAAA,EAA2B,sCAAA;AAAA,QAC3B,yBAAA,EAA2B,oDAAA;AAAsB,MAAA,CAAA,EAC7C,OAAA,EAAS,EAAE,aAAA,EAAe,CAAA,OAAA,EAAU,MAAM,CAAA,EAAA;AAErB,MAAA;AAC5B,IAAA;AACH,EAAA;AACF;AD1BoD;AACA;AE3DpB;AAsCW;AAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUR,EAAA;AAhDnD,IAAA;AAiDmB,IAAA;AAEb,IAAA;AAIqC,IAAA;AACL,IAAA;AAE5B,IAAA;AACK,MAAA;AACiB,QAAA;AACI,QAAA;AACD,QAAA;AACA,QAAA;AACmB,MAAA;AAErB,MAAA;AAC5B,IAAA;AACH,EAAA;AACF;AFmBoD;AACA;AG9EN;AAMF;AAMK;AAML;AAMN;AH4Dc;AACA;AIhGpD;AAGE;AACK;AJgG6C;AACA;AKpF5B;AAWwC;AAC1B,EAAA;AAAhB,IAAA;AAAiB,EAAA;AAE4B,EAAA;AAEnC,IAAA;AACT,MAAA;AACnB,IAAA;AAG2B,IAAA;AACU,MAAA;AACrC,IAAA;AAG0B,IAAA;AAC5B,EAAA;AAKE,EAAA;AAjDJ,IAAA;AAmDS,IAAA;AACQ,MAAA;AACA,MAAA;AACX,MAAA;AAEmB,QAAA;AACnB,MAAA;AACF,IAAA;AACF,EAAA;AAKE,EAAA;AAhEJ,IAAA;AAkES,IAAA;AACQ,MAAA;AACA,MAAA;AACX,MAAA;AAEmB,QAAA;AACnB,MAAA;AACF,IAAA;AACF,EAAA;AAKE,EAAA;AA/EJ,IAAA;AAiFS,IAAA;AACQ,MAAA;AACA,MAAA;AACX,MAAA;AAEmB,QAAA;AACnB,MAAA;AACF,IAAA;AACF,EAAA;AAKE,EAAA;AAE0B,IAAA;AACZ,MAAA;AACd,IAAA;AAEK,IAAA;AACQ,MAAA;AACN,MAAA;AACL,MAAA;AAEmB,QAAA;AACnB,MAAA;AACF,IAAA;AACF,EAAA;AAME,EAAA;AAlHJ,IAAA;AAmH8C,IAAA;AACpB,MAAA;AACtB,IAAA;AAEK,IAAA;AACQ,MAAA;AACX,MAAA;AAEgB,QAAA;AAChB,MAAA;AACA,MAAA;AAEmB,QAAA;AACnB,MAAA;AACF,IAAA;AACF,EAAA;AAMQ,EAAA;AACI,IAAA;AACR,MAAA;AACwB,MAAA;AACP,MAAA;AACoB,MAAA;AACT,MAAA;AAC7B,IAAA;AACH,EAAA;AACF;ALsCoD;AACA;AIxKe;AAmB3D;AACkB,EAAA;AAC1B;AAwBmB;AACqB,EAAA;AACxC;AAoBE;AAI4C,EAAA;AAC9C;AAgBuE;AAC5B,EAAA;AAC3C;AJ4FoD;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/home/runner/work/langwatch/langwatch/typescript-sdk/dist/chunk-2GYC6KEA.js","sourcesContent":[null,"import { OTLPTraceExporter } from \"@opentelemetry/exporter-trace-otlp-http\";\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\";\n\nexport interface LangWatchTraceExporterOptions {\n endpoint?: string;\n apiKey?: string;\n includeAllSpans?: boolean;\n debug?: boolean;\n}\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 * 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 { LangWatchTraceExporter } from '@langwatch/observability';\n *\n * // Using environment variables/fallback configuration\n * const exporter = new LangWatchTraceExporter();\n *\n * // Using custom options\n * const exporter = new LangWatchTraceExporter({\n * apiKey: 'your-api-key',\n * endpoint: 'https://custom.langwatch.com'\n * });\n * ```\n */\nexport class LangWatchTraceExporter extends OTLPTraceExporter {\n /**\n * Creates a new LangWatchExporter 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 * @param opts.includeAllSpans - Deprecated: This option is deprecated and will be removed in a future version\n * @param opts.debug - Deprecated: This option is deprecated and will be removed in a future version\n */\n constructor(opts?: LangWatchTraceExporterOptions) {\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 if (opts && opts.includeAllSpans !== void 0) {\n console.warn(\n \"[LangWatchExporter] The behavior of `includeAllSpans` is deprecated and will be removed in a future version\",\n );\n }\n if (opts && opts.debug !== void 0) {\n console.warn(\n \"[LangWatchExporter] The behavior of `debug` is deprecated and will be removed in a future version\",\n );\n }\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 ...(apiKey ? { authorization: `Bearer ${apiKey}` } : {}),\n },\n url: otelEndpoint.toString(),\n });\n }\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 LoggerProvider,\n NoopLoggerProvider,\n} from \"@opentelemetry/api-logs\";\nimport {\n type LangWatchLogger,\n} from \"./types\";\nimport { LangWatchLoggerInternal } from \"./implementation\";\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 = new NoopLoggerProvider();\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 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"]}
|